From f96d4010b4dba2f27913760a22d5e77d96bb3744 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 12:22:15 -0500 Subject: [PATCH 001/368] update citydao.io to https://citizen.citydao.io/ --- public/content/dao/index.md | 4 ++-- public/content/translations/ar/dao/index.md | 2 +- public/content/translations/az/dao/index.md | 2 +- public/content/translations/bn/dao/index.md | 2 +- public/content/translations/cs/dao/index.md | 2 +- public/content/translations/de/dao/index.md | 2 +- public/content/translations/el/dao/index.md | 2 +- public/content/translations/es/dao/index.md | 2 +- public/content/translations/fa/dao/index.md | 2 +- public/content/translations/fi/dao/index.md | 2 +- public/content/translations/fil/dao/index.md | 2 +- public/content/translations/fr/dao/index.md | 2 +- public/content/translations/ha/dao/index.md | 2 +- public/content/translations/hi/dao/index.md | 2 +- public/content/translations/hu/dao/index.md | 2 +- public/content/translations/id/dao/index.md | 2 +- public/content/translations/ig/dao/index.md | 2 +- public/content/translations/it/dao/index.md | 2 +- public/content/translations/ja/dao/index.md | 2 +- public/content/translations/kn/dao/index.md | 2 +- public/content/translations/ko/dao/index.md | 2 +- public/content/translations/mr/dao/index.md | 2 +- public/content/translations/ms/dao/index.md | 2 +- public/content/translations/nl/dao/index.md | 2 +- public/content/translations/pcm/dao/index.md | 2 +- public/content/translations/pl/dao/index.md | 2 +- public/content/translations/pt-br/dao/index.md | 2 +- public/content/translations/pt/dao/index.md | 2 +- public/content/translations/ru/dao/index.md | 2 +- public/content/translations/sr/dao/index.md | 2 +- public/content/translations/tl/dao/index.md | 2 +- public/content/translations/tr/dao/index.md | 2 +- public/content/translations/uk/dao/index.md | 2 +- public/content/translations/uz/dao/index.md | 2 +- public/content/translations/vi/dao/index.md | 2 +- public/content/translations/yo/dao/index.md | 2 +- public/content/translations/zh-tw/dao/index.md | 2 +- public/content/translations/zh/dao/index.md | 2 +- 38 files changed, 39 insertions(+), 39 deletions(-) diff --git a/public/content/dao/index.md b/public/content/dao/index.md index 5287be1e8fa..6334e5459e4 100644 --- a/public/content/dao/index.md +++ b/public/content/dao/index.md @@ -92,7 +92,7 @@ In 1977, Wyoming invented the LLC, which protects entrepreneurs and limits their ### A famous example {#law-example} -[CityDAO](https://citydao.io) – CityDAO used Wyoming's DAO law to buy 40 acres of land near Yellowstone National Park. +[CityDAO](https://citizen.citydao.io/) – CityDAO used Wyoming's DAO law to buy 40 acres of land near Yellowstone National Park. ## DAO membership {#dao-membership} @@ -126,7 +126,7 @@ _Typically used for decentralized development and governance of protocols and [d #### A famous example {#reputation-example} -[DXdao](https://DXdao.eth.limo) – DXdao was a global sovereign collective building and governing decentralized protocols and applications since 2019. It leveraged reputation-based governance and [holographic consensus](/glossary/#holographic-consensus) to coordinate and manage funds, meaning no one could buy their way into influencing its future or governance. +[DXdao](https://DXdao.eth.limo) – DXdao was a global sovereign collective building and governing decentralized protocols and applications since 2019. It leveraged reputation-based governance and [holographic consensus](/glossary/#holographic-consensus) to coordinate and manage funds, meaning no one could buy their way into influencing its future or governance. ## Join / start a DAO {#join-start-a-dao} diff --git a/public/content/translations/ar/dao/index.md b/public/content/translations/ar/dao/index.md index bf7222be852..0293e0dd16a 100644 --- a/public/content/translations/ar/dao/index.md +++ b/public/content/translations/ar/dao/index.md @@ -93,7 +93,7 @@ summaryPoint3: مكان آمن لتخصيص أموال لسبب محدد. ### مثال شهير {#law-example} -[CityDAO](https://citydao.io) – استخدمت CityDAO قانون المنظمات المستقلة اللامركزية الذي وضعته ولاية وايومنغ لشراء 40 فدانًا من الأراضي بالقرب من متنزه يلوستون الوطني. +[CityDAO](https://citizen.citydao.io/) – استخدمت CityDAO قانون المنظمات المستقلة اللامركزية الذي وضعته ولاية وايومنغ لشراء 40 فدانًا من الأراضي بالقرب من متنزه يلوستون الوطني. ## عضوية المنظمات المستقلة اللامركزية {#dao-membership} diff --git a/public/content/translations/az/dao/index.md b/public/content/translations/az/dao/index.md index 81230291e7f..b514a8b6476 100644 --- a/public/content/translations/az/dao/index.md +++ b/public/content/translations/az/dao/index.md @@ -93,7 +93,7 @@ DAO-ların minlərlə səsvermə üzvü ola bilsə də, fondlar etibar edilən v ### Tanınmış bir nümunə {#law-example} -[CityDAO](https://citydao.io)- CityDAO, Yellowstone Milli Parkının yaxınlığında 40 hektar torpaq almaq üçün Vyoming'in DAO qanunundan istifadə etdi. +[CityDAO](https://citizen.citydao.io/)- CityDAO, Yellowstone Milli Parkının yaxınlığında 40 hektar torpaq almaq üçün Vyoming'in DAO qanunundan istifadə etdi. ## DAO üzvlüyü {#dao-membership} diff --git a/public/content/translations/bn/dao/index.md b/public/content/translations/bn/dao/index.md index 214ee34eb1e..159e4042b44 100644 --- a/public/content/translations/bn/dao/index.md +++ b/public/content/translations/bn/dao/index.md @@ -93,7 +93,7 @@ DAO আমাদের ফান্ড বা ক্রিয়াকলাপ ### একটি বিখ্যাত উদাহরণ {#law-example} -[CityDAO](https://citydao.io) – CityDAO ইয়েলোস্টোন ন্যাশনাল পার্কের কাছে 40 একর জমি কেনার জন্য ওয়াইমিং এর DAO আইন ব্যবহার করেছে। +[CityDAO](https://citizen.citydao.io/) – CityDAO ইয়েলোস্টোন ন্যাশনাল পার্কের কাছে 40 একর জমি কেনার জন্য ওয়াইমিং এর DAO আইন ব্যবহার করেছে। ## DAO সদস্যপদ {#dao-membership} diff --git a/public/content/translations/cs/dao/index.md b/public/content/translations/cs/dao/index.md index 22db98abd91..f9c12d8d587 100644 --- a/public/content/translations/cs/dao/index.md +++ b/public/content/translations/cs/dao/index.md @@ -91,7 +91,7 @@ V roce 1977 představil stát Wyoming LLC, typ společnosti ekvivalentní k čes ### Příklad z praxe {#law-example} -[CityDAO](https://citydao.io) – CityDAO používal zákon DAO státu Wyoming ke koupi 40 akrů půdy poblíž Yellowstonského národního parku. +[CityDAO](https://citizen.citydao.io/) – CityDAO používal zákon DAO státu Wyoming ke koupi 40 akrů půdy poblíž Yellowstonského národního parku. ## Členství v DAO {#dao-membership} diff --git a/public/content/translations/de/dao/index.md b/public/content/translations/de/dao/index.md index beaedddcaa4..f7922d74baf 100644 --- a/public/content/translations/de/dao/index.md +++ b/public/content/translations/de/dao/index.md @@ -91,7 +91,7 @@ Im US-Bundesstaat Wyoming wurde 1977 die LCC eingeführt, die Unternehmer schüt ### Bekanntes Beispiel {#law-example} -[CityDAO](https://citydao.io) – CityDAO hat durch Wyomings DAO-Gesetz rund 16 Hektar Land in der Nähe des Yellowstone-Nationalparks gekauft. +[CityDAO](https://citizen.citydao.io/) – CityDAO hat durch Wyomings DAO-Gesetz rund 16 Hektar Land in der Nähe des Yellowstone-Nationalparks gekauft. ## DAO-Mitgliedschaft {#dao-membership} diff --git a/public/content/translations/el/dao/index.md b/public/content/translations/el/dao/index.md index cd925bff2dc..bd816cba178 100644 --- a/public/content/translations/el/dao/index.md +++ b/public/content/translations/el/dao/index.md @@ -92,7 +92,7 @@ summaryPoint3: Ένα ασφαλές μέρος συγκέντρωσης κεφ ### Ένα δημοφιλές παράδειγμα {#law-example} -[CityDAO](https://citydao.io) – Η CityDAO χρησιμοποίησε το νόμο DAO του Wyoming για να αγοράσει 40 στρέμματα γης κοντά στο Εθνικό Πάρκο Yellowstone. +[CityDAO](https://citizen.citydao.io/) – Η CityDAO χρησιμοποίησε το νόμο DAO του Wyoming για να αγοράσει 40 στρέμματα γης κοντά στο Εθνικό Πάρκο Yellowstone. ## Μέλη DAO {#dao-membership} diff --git a/public/content/translations/es/dao/index.md b/public/content/translations/es/dao/index.md index 0a9f9422dd3..2be558a5f4e 100644 --- a/public/content/translations/es/dao/index.md +++ b/public/content/translations/es/dao/index.md @@ -91,7 +91,7 @@ En 1977, Wyoming inventó la LLC, la cual protege a los empresarios y limita su ### Un conocido ejemplo {#law-example} -[CityDAO:](https://citydao.io) CityDAO utilizó la ley de las DAO de Wyoming para comprar 40 hectáreas de tierra cerca del Parque Nacional de Yellowstone. +[CityDAO:](https://citizen.citydao.io/) CityDAO utilizó la ley de las DAO de Wyoming para comprar 40 hectáreas de tierra cerca del Parque Nacional de Yellowstone. ## Membresía de las DAO {#dao-membership} diff --git a/public/content/translations/fa/dao/index.md b/public/content/translations/fa/dao/index.md index b164a662677..ff7eb97378a 100644 --- a/public/content/translations/fa/dao/index.md +++ b/public/content/translations/fa/dao/index.md @@ -93,7 +93,7 @@ DAOها به ما این امکان را می دهند که بدون اعتما ### یک نمونهٔ معروف {#law-example} -[CityDAO](https://citydao.io) – CityDAO از قانون DAO وایومینگ برای خرید 40 هکتار زمین در نزدیکی پارک ملی یلوستون استفاده کرد. +[CityDAO](https://citizen.citydao.io/) – CityDAO از قانون DAO وایومینگ برای خرید 40 هکتار زمین در نزدیکی پارک ملی یلوستون استفاده کرد. ## عضویت در DAO {#dao-membership} diff --git a/public/content/translations/fi/dao/index.md b/public/content/translations/fi/dao/index.md index 0e0c6e007e9..5e6579959d5 100644 --- a/public/content/translations/fi/dao/index.md +++ b/public/content/translations/fi/dao/index.md @@ -93,7 +93,7 @@ Vuonna 1977 Wyoming keksi LLC:n, joka suojelee yrittäjiä ja rajoittaa heidän ### Tunnettu esimerkki {#law-example} -[CityDAO](https://citydao.io) – CityDAO hyödynsi Wyomingin DAO-lakia 40 hehtaarin maa-alueen ostossa lähellä Yellowstonen kansallispuistoa. +[CityDAO](https://citizen.citydao.io/) – CityDAO hyödynsi Wyomingin DAO-lakia 40 hehtaarin maa-alueen ostossa lähellä Yellowstonen kansallispuistoa. ## DAO-jäsenyys {#dao-membership} diff --git a/public/content/translations/fil/dao/index.md b/public/content/translations/fil/dao/index.md index 5e9c41e45ce..30e0b6c7bc6 100644 --- a/public/content/translations/fil/dao/index.md +++ b/public/content/translations/fil/dao/index.md @@ -93,7 +93,7 @@ Noong 1977, nilikha sa Wyoming ang LLC, na nagpoprotekta sa mga negosyante at na ### Isang kilalang halimbawa {#law-example} -[CityDAO](https://citydao.io) – Ginamit ng CityDAO ang batas sa DAO ng Wyoming para bumili ng 40 acres ng lupa malapit sa Yellowstone National Park. +[CityDAO](https://citizen.citydao.io/) – Ginamit ng CityDAO ang batas sa DAO ng Wyoming para bumili ng 40 acres ng lupa malapit sa Yellowstone National Park. ## Membership sa DAO {#dao-membership} diff --git a/public/content/translations/fr/dao/index.md b/public/content/translations/fr/dao/index.md index fd02b9826c8..b923fe8c296 100644 --- a/public/content/translations/fr/dao/index.md +++ b/public/content/translations/fr/dao/index.md @@ -91,7 +91,7 @@ En 1977, le Wyoming a créé la LLC, qui protège les entrepreneurs et limite le ### Un exemple célèbre {#law-example} -[CityDAO](https://citydao.io) - CityDAO s'est servi de la loi DAO du Wyoming pour acheter 40 acres de terrain près du parc national de Yellowstone. +[CityDAO](https://citizen.citydao.io/) - CityDAO s'est servi de la loi DAO du Wyoming pour acheter 40 acres de terrain près du parc national de Yellowstone. ## Adhésion à la DAO {#dao-membership} diff --git a/public/content/translations/ha/dao/index.md b/public/content/translations/ha/dao/index.md index 549498c0979..e592443bccc 100644 --- a/public/content/translations/ha/dao/index.md +++ b/public/content/translations/ha/dao/index.md @@ -91,7 +91,7 @@ A 1977, Wyoming ya ƙirƙira LLC, wanda ke ba da kariya ga 'yan kasuwa da iyakan ### Misali Shahararren {#law-example} -[CityDAO](https://citydao.io) - CityDAO tayi amfani da dokar Wyoming's DAO wajen siyan eka 40 na fili kusa da wurin shakatawa na Yellowstone. +[CityDAO](https://citizen.citydao.io/) - CityDAO tayi amfani da dokar Wyoming's DAO wajen siyan eka 40 na fili kusa da wurin shakatawa na Yellowstone. ## Membobin hulɗar DAO {#dao-membership} diff --git a/public/content/translations/hi/dao/index.md b/public/content/translations/hi/dao/index.md index 978a9b768f5..7b6344f3c04 100644 --- a/public/content/translations/hi/dao/index.md +++ b/public/content/translations/hi/dao/index.md @@ -93,7 +93,7 @@ DAO को संचालित करते समय कई बातों ### एक प्रसिद्ध उदाहरण {#law-example} -[CityDAO](https://citydao.io) – CityDAO ने येलोस्टोन नेशनल पार्क के पास 40 एकड़ जमीन खरीदने के लिए व्योमिंग के DAO कानून का इस्तेमाल किया। +[CityDAO](https://citizen.citydao.io/) – CityDAO ने येलोस्टोन नेशनल पार्क के पास 40 एकड़ जमीन खरीदने के लिए व्योमिंग के DAO कानून का इस्तेमाल किया। ## DAO की सदस्यता {#dao-membership} diff --git a/public/content/translations/hu/dao/index.md b/public/content/translations/hu/dao/index.md index 24808b91146..291cebd84cb 100644 --- a/public/content/translations/hu/dao/index.md +++ b/public/content/translations/hu/dao/index.md @@ -91,7 +91,7 @@ Míg a DAO-k több ezer szavazati joggal rendelkező taggal rendelkezhetnek, az ### Egy híres példa {#law-example} -[CityDAO](https://citydao.io) – A CityDAO 40 hektár földet vett a Yellowstone Nemzeti Park közelében Wyoming DAO-törvényével élve. +[CityDAO](https://citizen.citydao.io/) – A CityDAO 40 hektár földet vett a Yellowstone Nemzeti Park közelében Wyoming DAO-törvényével élve. ## DAO-tagság {#dao-membership} diff --git a/public/content/translations/id/dao/index.md b/public/content/translations/id/dao/index.md index 8c7a795673e..28262b9bd17 100644 --- a/public/content/translations/id/dao/index.md +++ b/public/content/translations/id/dao/index.md @@ -93,7 +93,7 @@ Pada tahun 1977, negara bagian Wyoming menemukan LLC, bentuk usaha yang melindun ### Contoh yang terkenal {#law-example} -[CityDAO](https://citydao.io) – CityDAO menggunakan hukum DAO Wyoming untuk membeli tanah seluas 40 acre di dekat Taman Nasional Yellowstone. +[CityDAO](https://citizen.citydao.io/) – CityDAO menggunakan hukum DAO Wyoming untuk membeli tanah seluas 40 acre di dekat Taman Nasional Yellowstone. ## Keanggotaan DAO {#dao-membership} diff --git a/public/content/translations/ig/dao/index.md b/public/content/translations/ig/dao/index.md index 9ec80e05c24..410b49dc396 100644 --- a/public/content/translations/ig/dao/index.md +++ b/public/content/translations/ig/dao/index.md @@ -92,7 +92,7 @@ Na 1977, Wyoming chepụtara LLC, nke na-echebe ndị ọchụnta ego ma kpachie ### Ihe atụ ama ama {#law-example} -[CityDAO](https://citydao.io) - CityDAO jiri iwu Wyoming DAO iji zụta ala 40 dị nso na Ogige Mba Yellowstone. +[CityDAO](https://citizen.citydao.io/) - CityDAO jiri iwu Wyoming DAO iji zụta ala 40 dị nso na Ogige Mba Yellowstone. ## Ndị otu DAO {#dao-membership} diff --git a/public/content/translations/it/dao/index.md b/public/content/translations/it/dao/index.md index 767eeabd5eb..14b8af9ebe6 100644 --- a/public/content/translations/it/dao/index.md +++ b/public/content/translations/it/dao/index.md @@ -91,7 +91,7 @@ Nel 1977, il Wyoming inventò la LLC, che protegge gli imprenditori e ne limita ### Un celebre esempio {#law-example} -[CityDAO](https://citydao.io) – CityDao ha utilizzato la legge sulle DAO del Wyoming per acquistare 40 acri di terreno nei pressi del Parco Nazionale di Yellowstone. +[CityDAO](https://citizen.citydao.io/) – CityDao ha utilizzato la legge sulle DAO del Wyoming per acquistare 40 acri di terreno nei pressi del Parco Nazionale di Yellowstone. ## Aderire a una DAO {#dao-membership} diff --git a/public/content/translations/ja/dao/index.md b/public/content/translations/ja/dao/index.md index 284ccc12feb..c8bcea98654 100644 --- a/public/content/translations/ja/dao/index.md +++ b/public/content/translations/ja/dao/index.md @@ -91,7 +91,7 @@ DAOは、共通の目的のために行動する、集団所有された組織 ### 有名な事例 {#law-example} -[CityDAO](https://citydao.io) – CityDAOは、ワイオミング州の分散型自律組織(DAO)法を利用して、イエローストーン国立公園近くの40エーカーの土地を購入しました。 +[CityDAO](https://citizen.citydao.io/) – CityDAOは、ワイオミング州の分散型自律組織(DAO)法を利用して、イエローストーン国立公園近くの40エーカーの土地を購入しました。 ## 分散型自律組織(DAO)のメンバーシップ {#dao-membership} diff --git a/public/content/translations/kn/dao/index.md b/public/content/translations/kn/dao/index.md index 4870c9389d9..9a8c0f4ee78 100644 --- a/public/content/translations/kn/dao/index.md +++ b/public/content/translations/kn/dao/index.md @@ -93,7 +93,7 @@ DAO ಗಳು ಸಾವಿರಾರು ಮತದಾನದ ಸದಸ್ಯರನ ### ಒಂದು ಪ್ರಸಿದ್ಧ ಉದಾಹರಣೆ {#law-example} -[CityDAO](https://citydao.io)- ಯೆಲ್ಲೊಸ್ಟೋನ್ ರಾಷ್ಟ್ರೀಯ ಉದ್ಯಾನವನದ ಬಳಿ 40 ಎಕರೆ ಭೂಮಿಯನ್ನು ಖರೀದಿಸಲು CityDAO ವ್ಯೋಮಿಂಗ್‌ನ DAO ಕಾನೂನನ್ನು ಬಳಸಿಕೊಂಡಿದೆ. +[CityDAO](https://citizen.citydao.io/)- ಯೆಲ್ಲೊಸ್ಟೋನ್ ರಾಷ್ಟ್ರೀಯ ಉದ್ಯಾನವನದ ಬಳಿ 40 ಎಕರೆ ಭೂಮಿಯನ್ನು ಖರೀದಿಸಲು CityDAO ವ್ಯೋಮಿಂಗ್‌ನ DAO ಕಾನೂನನ್ನು ಬಳಸಿಕೊಂಡಿದೆ. ## DAO ಸದಸ್ಯತ್ವ {#dao-membership} diff --git a/public/content/translations/ko/dao/index.md b/public/content/translations/ko/dao/index.md index a1cc7781881..c62a4b51b7c 100644 --- a/public/content/translations/ko/dao/index.md +++ b/public/content/translations/ko/dao/index.md @@ -93,7 +93,7 @@ DAO에는 수천 명의 의결권을 가진 회원이 있을 수 있지만, 자 ### 유명한 예시 {#law-example} -[CityDAO](https://citydao.io) - CityDAO는 와이오밍의 DAO 법을 사용하여 옐로스톤 국립공원 근처의 40에이커의 땅을 구입했습니다. +[CityDAO](https://citizen.citydao.io/) - CityDAO는 와이오밍의 DAO 법을 사용하여 옐로스톤 국립공원 근처의 40에이커의 땅을 구입했습니다. ## DAO 멤버십 {#dao-membership} diff --git a/public/content/translations/mr/dao/index.md b/public/content/translations/mr/dao/index.md index 4dc6aba4c5f..f367a037108 100644 --- a/public/content/translations/mr/dao/index.md +++ b/public/content/translations/mr/dao/index.md @@ -93,7 +93,7 @@ DAO मध्ये हजारो मतदान सदस्य असू ### एक प्रसिद्ध उदाहरण {#law-example} -[CityDAO](https://citydao.io) – CityDAO ने यलोस्टोन नॅशनल पार्कजवळ 40 एकर जमीन खरेदी करण्यासाठी वायोमिंगच्या DAO कायद्याचा वापर केला. +[CityDAO](https://citizen.citydao.io/) – CityDAO ने यलोस्टोन नॅशनल पार्कजवळ 40 एकर जमीन खरेदी करण्यासाठी वायोमिंगच्या DAO कायद्याचा वापर केला. ## DAO सदस्यत्व {#dao-membership} diff --git a/public/content/translations/ms/dao/index.md b/public/content/translations/ms/dao/index.md index 48b4683f095..1fe0bfab0fd 100644 --- a/public/content/translations/ms/dao/index.md +++ b/public/content/translations/ms/dao/index.md @@ -93,7 +93,7 @@ Pada tahun 1977, Wyoming mencipta LLC, yang melindungi usahawan dan mengehadkan ### Contoh yang terkenal {#law-example} -[CityDAO](https://citydao.io) – CityDAO menggunakan undang-undang DAO Wyoming untuk membeli 40 ekar tanah berhampiran Taman Negara Yellowstone. +[CityDAO](https://citizen.citydao.io/) – CityDAO menggunakan undang-undang DAO Wyoming untuk membeli 40 ekar tanah berhampiran Taman Negara Yellowstone. ## Keahlian DAO {#dao-membership} diff --git a/public/content/translations/nl/dao/index.md b/public/content/translations/nl/dao/index.md index 318ceca09d2..eee5bf3189c 100644 --- a/public/content/translations/nl/dao/index.md +++ b/public/content/translations/nl/dao/index.md @@ -91,7 +91,7 @@ In 1977 heeft Wyoming de LLC uitgevonden, die ondernemers beschermt en hun aansp ### Een goed voorbeeld {#law-example} -[CityDAO](https://citydao.io) – CityDAO gebruikte de DAO-wetgeving van Wyoming om 40 hectare land in de buurt van het Yellowstone National Park te kopen. +[CityDAO](https://citizen.citydao.io/) – CityDAO gebruikte de DAO-wetgeving van Wyoming om 40 hectare land in de buurt van het Yellowstone National Park te kopen. ## DAO-lidmaatschap {#dao-membership} diff --git a/public/content/translations/pcm/dao/index.md b/public/content/translations/pcm/dao/index.md index a1226e1f0dd..651a58a252a 100644 --- a/public/content/translations/pcm/dao/index.md +++ b/public/content/translations/pcm/dao/index.md @@ -93,7 +93,7 @@ In 1977, Wyoming na hin invent the LLC wey dey protect entrepreneurs and e dey l ### Popula eksampol {#law-example} -[CityDAO](https://citydao.io) – dem use Wyoming's DAO law take buy 40 acres of land near Yellowstone National Park. +[CityDAO](https://citizen.citydao.io/) – dem use Wyoming's DAO law take buy 40 acres of land near Yellowstone National Park. ## DAO membership {#dao-membership} diff --git a/public/content/translations/pl/dao/index.md b/public/content/translations/pl/dao/index.md index 675b4ff8a01..7948aa0f647 100644 --- a/public/content/translations/pl/dao/index.md +++ b/public/content/translations/pl/dao/index.md @@ -93,7 +93,7 @@ W 1977 r. w Wyoming powstały pierwsze spółki z ograniczoną odpowiedzialnośc ### Znany przykład {#law-example} -[CityDAO](https://citydao.io) – CityDAO użył prawa DAO Wyoming, aby kupić 40 hektarów ziemi w pobliżu Parku Narodowego Yellowstone. +[CityDAO](https://citizen.citydao.io/) – CityDAO użył prawa DAO Wyoming, aby kupić 40 hektarów ziemi w pobliżu Parku Narodowego Yellowstone. ## Członkostwo DAO {#dao-membership} diff --git a/public/content/translations/pt-br/dao/index.md b/public/content/translations/pt-br/dao/index.md index 20521b6ba85..4624fef8cba 100644 --- a/public/content/translations/pt-br/dao/index.md +++ b/public/content/translations/pt-br/dao/index.md @@ -91,7 +91,7 @@ Em 1977, Wyoming inventou a LLC, que protege os empreendedores e limita a respon ### Um exemplo famoso {#law-example} -[CityDAO](https://citydao.io) – CityDAO usou a lei DAO do Wyoming para comprar 40 acres de terra perto do Parque Nacional de Yellowstone. +[CityDAO](https://citizen.citydao.io/) – CityDAO usou a lei DAO do Wyoming para comprar 40 acres de terra perto do Parque Nacional de Yellowstone. ## Adesão à DAO {#dao-membership} diff --git a/public/content/translations/pt/dao/index.md b/public/content/translations/pt/dao/index.md index e69a4afa174..02be6b93904 100644 --- a/public/content/translations/pt/dao/index.md +++ b/public/content/translations/pt/dao/index.md @@ -93,7 +93,7 @@ Em 1977, o estado Americano de Wyoming inventou a LLC, que protege os empresári ### Um exemplo famoso {#law-example} -[CityDAO](https://citydao.io) - A CityDAO utilizou a lei DAO do Wyoming para comprar 40 acres de terreno perto do Parque Nacional de Yellowstone. +[CityDAO](https://citizen.citydao.io/) - A CityDAO utilizou a lei DAO do Wyoming para comprar 40 acres de terreno perto do Parque Nacional de Yellowstone. ## Adesão à DAO {#dao-membership} diff --git a/public/content/translations/ru/dao/index.md b/public/content/translations/ru/dao/index.md index bb183bddff7..b10d399452c 100644 --- a/public/content/translations/ru/dao/index.md +++ b/public/content/translations/ru/dao/index.md @@ -91,7 +91,7 @@ Ethereum — идеальный фундамент для DAO по ряду п ### Известный пример {#law-example} -[CityDAO](https://citydao.io). CityDAO использовал законодательство Вайоминга, касающееся DAO, чтобы приобрести 40 акров земли около Национального парка Йеллоустоун. +[CityDAO](https://citizen.citydao.io/). CityDAO использовал законодательство Вайоминга, касающееся DAO, чтобы приобрести 40 акров земли около Национального парка Йеллоустоун. ## Членство в DAO {#dao-membership} diff --git a/public/content/translations/sr/dao/index.md b/public/content/translations/sr/dao/index.md index 7e3101005b2..33e79491ae5 100644 --- a/public/content/translations/sr/dao/index.md +++ b/public/content/translations/sr/dao/index.md @@ -93,7 +93,7 @@ Godine 1977. američka savezna država Vajoming stvorila je LLC (limited liabili ### Poznat primer {#law-example} -[DAOGrad](https://citydao.io)Kompanija CityDAO je iskoristila zakon o DAO savezne države Vajoming da kupi 40 ari zemljišta u blizini Nacionalnog parka Jeloustoun. +[DAOGrad](https://citizen.citydao.io/)Kompanija CityDAO je iskoristila zakon o DAO savezne države Vajoming da kupi 40 ari zemljišta u blizini Nacionalnog parka Jeloustoun. ## Članstvo u DAO-u {#dao-membership} diff --git a/public/content/translations/tl/dao/index.md b/public/content/translations/tl/dao/index.md index a249c8d62fe..a07ebbf1d44 100644 --- a/public/content/translations/tl/dao/index.md +++ b/public/content/translations/tl/dao/index.md @@ -91,7 +91,7 @@ Noong 1977, nalikha sa Wyoming ang LLC, na nagpoprotekta sa mga negosyante at na ### Isang sikat na halimbawa {#law-example} -[CityDAO](https://citydao.io) – Ginamit ng CityDAO ang batas sa DAO ng Wyoming para bumili ng 40 ektarya ng lupa malapit sa Yellowstone National Park. +[CityDAO](https://citizen.citydao.io/) – Ginamit ng CityDAO ang batas sa DAO ng Wyoming para bumili ng 40 ektarya ng lupa malapit sa Yellowstone National Park. ## Pagiging miyembro ng DAO {#dao-membership} diff --git a/public/content/translations/tr/dao/index.md b/public/content/translations/tr/dao/index.md index 47c619a46ba..b5b791d745f 100644 --- a/public/content/translations/tr/dao/index.md +++ b/public/content/translations/tr/dao/index.md @@ -93,7 +93,7 @@ DAO'ların binlerce oylama üyesi olabilirken, fonlar güvenilir ve genellikle " ### Meşhur bir örnek {#law-example} -[CityDAO](https://citydao.io) – CityDAO, Wyoming'in DAO yasasını kullanarak Yellowstone Milli Parkı yakınında 40 dönümlük arazi satın aldı. +[CityDAO](https://citizen.citydao.io/) – CityDAO, Wyoming'in DAO yasasını kullanarak Yellowstone Milli Parkı yakınında 40 dönümlük arazi satın aldı. ## DAO üyeliği {#dao-membership} diff --git a/public/content/translations/uk/dao/index.md b/public/content/translations/uk/dao/index.md index ba9bc4209dc..b9f537078bd 100644 --- a/public/content/translations/uk/dao/index.md +++ b/public/content/translations/uk/dao/index.md @@ -93,7 +93,7 @@ Ethereum є ідеальним фундаментом для DAO з таких ### Відомий приклад {#law-example} -[CityDAO](https://citydao.io) – CityDAO використовував закон штату Вайомінг DAO, щоб купити 40 акрів землі поблизу національного парку Єллоустоун. +[CityDAO](https://citizen.citydao.io/) – CityDAO використовував закон штату Вайомінг DAO, щоб купити 40 акрів землі поблизу національного парку Єллоустоун. ## Членство в DAO {#dao-membership} diff --git a/public/content/translations/uz/dao/index.md b/public/content/translations/uz/dao/index.md index 1c4866f6791..3bc979986a6 100644 --- a/public/content/translations/uz/dao/index.md +++ b/public/content/translations/uz/dao/index.md @@ -91,7 +91,7 @@ DAOlarda minglab ovoz beruvchi a’zolar bo‘lishi mumkin, lekin mablag‘lar i ### Yorqin namuna {#law-example} -[CityDAO](https://citydao.io) tashkiloti Vayomingning DAO qonunidan foydalanib, Yellowstone milliy bog‘i yaqinidagi 16 gektarlik yerni sotib oldi. +[CityDAO](https://citizen.citydao.io/) tashkiloti Vayomingning DAO qonunidan foydalanib, Yellowstone milliy bog‘i yaqinidagi 16 gektarlik yerni sotib oldi. ## DAO aʼzosi {#dao-membership} diff --git a/public/content/translations/vi/dao/index.md b/public/content/translations/vi/dao/index.md index 09ccfa3c24e..14f90daea66 100644 --- a/public/content/translations/vi/dao/index.md +++ b/public/content/translations/vi/dao/index.md @@ -93,7 +93,7 @@ Vào năm 1977, Wyoming đã phát minh ra LLC để bảo vệ các doanh nhân ### Một ví dụ phổ biến {#law-example} -[CityDAO](https://citydao.io) – CityDAO đã sử dụng luật DAO của Wyoming để mua 40 mẫu đất gần Công viên Quốc gia Yellowstone. +[CityDAO](https://citizen.citydao.io/) – CityDAO đã sử dụng luật DAO của Wyoming để mua 40 mẫu đất gần Công viên Quốc gia Yellowstone. ## Hội viên của tổ chức tự trị phi tập trung (DAO membership) {#dao-membership} diff --git a/public/content/translations/yo/dao/index.md b/public/content/translations/yo/dao/index.md index e94b7ba57ca..736e8e93bb6 100644 --- a/public/content/translations/yo/dao/index.md +++ b/public/content/translations/yo/dao/index.md @@ -91,7 +91,7 @@ Lọ́dún 1977, ìpínlẹ̀ Wyoming dá LLC sílẹ̀, èyí tó ń dáàbò bo ### Àpẹẹrẹ olókìkí kan {#law-example} -[CityDAO](https://citydao.io) – CityDAO lo òfin DAO ti Wyoming láti ra ilẹ̀ 40 acres nítòsí Yellowstone National Park. +[CityDAO](https://citizen.citydao.io/) – CityDAO lo òfin DAO ti Wyoming láti ra ilẹ̀ 40 acres nítòsí Yellowstone National Park. ## Ọmọ ẹgbẹ́ DAO {#dao-membership} diff --git a/public/content/translations/zh-tw/dao/index.md b/public/content/translations/zh-tw/dao/index.md index 718a8a2c57c..2fc117cb05f 100644 --- a/public/content/translations/zh-tw/dao/index.md +++ b/public/content/translations/zh-tw/dao/index.md @@ -91,7 +91,7 @@ summaryPoint3: 一個將資產投入特定事業的安全場所。 ### 知名案例 {#law-example} -[CityDAO](https://citydao.io) – CityDAO 透過懷俄明州去中心化自治組織的相關法律購買了黃石國家公園附近 40 英畝的地。 +[CityDAO](https://citizen.citydao.io/) – CityDAO 透過懷俄明州去中心化自治組織的相關法律購買了黃石國家公園附近 40 英畝的地。 ## 去中心化自治組織成員 {#dao-membership} diff --git a/public/content/translations/zh/dao/index.md b/public/content/translations/zh/dao/index.md index 9245b23a0f2..991891c71b7 100644 --- a/public/content/translations/zh/dao/index.md +++ b/public/content/translations/zh/dao/index.md @@ -91,7 +91,7 @@ summaryPoint3: 一个为特定事业投入资金的安全场所。 ### 知名案例 {#law-example} -[CityDAO](https://citydao.io) — 依照怀俄明州的去中心化自治组织相关法律,CityDAO 购买了黄石国家公园附近的 40 英亩土地。 +[CityDAO](https://citizen.citydao.io/) — 依照怀俄明州的去中心化自治组织相关法律,CityDAO 购买了黄石国家公园附近的 40 英亩土地。 ## 去中心化自治组织的成员资格 {#dao-membership} From 78efc89646a457062be4465915da504a22d6655f Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 12:39:47 -0500 Subject: [PATCH 002/368] removing dead link https://cointool.app/approve/eth --- .../translations/de/guides/how-to-revoke-token-access/index.md | 1 - .../translations/el/guides/how-to-revoke-token-access/index.md | 1 - .../translations/es/guides/how-to-revoke-token-access/index.md | 1 - .../translations/fa/guides/how-to-revoke-token-access/index.md | 1 - .../translations/fil/guides/how-to-revoke-token-access/index.md | 1 - .../translations/fr/guides/how-to-revoke-token-access/index.md | 1 - .../translations/hi/guides/how-to-revoke-token-access/index.md | 1 - .../translations/hu/guides/how-to-revoke-token-access/index.md | 1 - .../translations/id/guides/how-to-revoke-token-access/index.md | 1 - .../translations/ig/guides/how-to-revoke-token-access/index.md | 1 - .../translations/it/guides/how-to-revoke-token-access/index.md | 1 - .../translations/ja/guides/how-to-revoke-token-access/index.md | 1 - .../translations/ms/guides/how-to-revoke-token-access/index.md | 1 - .../translations/nl/guides/how-to-revoke-token-access/index.md | 1 - .../translations/pl/guides/how-to-revoke-token-access/index.md | 1 - .../pt-br/guides/how-to-revoke-token-access/index.md | 1 - .../translations/ru/guides/how-to-revoke-token-access/index.md | 1 - .../translations/tr/guides/how-to-revoke-token-access/index.md | 1 - .../translations/uk/guides/how-to-revoke-token-access/index.md | 1 - .../translations/yo/guides/how-to-revoke-token-access/index.md | 1 - .../zh-tw/guides/how-to-revoke-token-access/index.md | 1 - .../translations/zh/guides/how-to-revoke-token-access/index.md | 1 - 22 files changed, 22 deletions(-) diff --git a/public/content/translations/de/guides/how-to-revoke-token-access/index.md b/public/content/translations/de/guides/how-to-revoke-token-access/index.md index 66eaf0ae554..29ef55b10f6 100644 --- a/public/content/translations/de/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/de/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Auf mehreren Websites können Sie die mit Ihrer Adresse verbundenen intelligente - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (multiple Netzwerke) - [Revoke](https://revoke.cash/) (multiple Netzwerke) - [Unrekt](https://app.unrekt.net/) (multiple Netzwerke) - [EverRevoke](https://everrise.com/everrevoke/) (multiple Netzwerke) diff --git a/public/content/translations/el/guides/how-to-revoke-token-access/index.md b/public/content/translations/el/guides/how-to-revoke-token-access/index.md index b7901e6e48e..5b393d0bc6e 100644 --- a/public/content/translations/el/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/el/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ lang: el - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (πολλαπλά δίκτυα) - [Revoke](https://revoke.cash/) (πολλαπλά δίκτυα) - [Unrekt](https://app.unrekt.net/) (πολλαπλά δίκτυα) - [EverRevoke](https://everrise.com/everrevoke/) (πολλαπλά δίκτυα) diff --git a/public/content/translations/es/guides/how-to-revoke-token-access/index.md b/public/content/translations/es/guides/how-to-revoke-token-access/index.md index 747678f27ad..9076841d742 100644 --- a/public/content/translations/es/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/es/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Existen varios sitios web que le permiten ver y revocar contratos inteligentes c - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (múltiples redes) - [Revoke](https://revoke.cash/) (múltiples redes) - [Unrekt](https://app.unrekt.net/) (múltiples redes) - [EverRevoke](https://everrise.com/everrevoke/) (múltiples redes) diff --git a/public/content/translations/fa/guides/how-to-revoke-token-access/index.md b/public/content/translations/fa/guides/how-to-revoke-token-access/index.md index 92c0f5297bc..b31c43964b6 100644 --- a/public/content/translations/fa/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/fa/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ lang: fa - [Ethallowance](https://ethallowance.com/) (اتریوم) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (اتریوم) -- [Cointool](https://cointool.app/approve/eth) (شبکه های گوناگون) - [Revoke](https://revoke.cash/) (شبکه های گوناگون) - [Unrekt](https://app.unrekt.net/) (شبکه های گوناگون) - [EverRevoke](https://everrise.com/everrevoke/) (شبکه های گوناگون) diff --git a/public/content/translations/fil/guides/how-to-revoke-token-access/index.md b/public/content/translations/fil/guides/how-to-revoke-token-access/index.md index c4f92f2032e..f78bdedc9bd 100644 --- a/public/content/translations/fil/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/fil/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ May ilang website na pinapayagan kang tingnan at bawiin ang mga smart contract n - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (maraming network) - [Revoke](https://revoke.cash/) (maraming network) - [Unrekt](https://app.unrekt.net/) (maraming network) - [EverRevoke](https://everrise.com/everrevoke/) (maraming network) diff --git a/public/content/translations/fr/guides/how-to-revoke-token-access/index.md b/public/content/translations/fr/guides/how-to-revoke-token-access/index.md index 59de4c0f41a..4be1f248c90 100644 --- a/public/content/translations/fr/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/fr/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Plusieurs sites Web vous permettent de visualiser et de révoquer les contrats i - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (plusieurs réseaux) - [Revoke](https://revoke.cash/) (plusieurs réseaux) - [Unrekt](https://app.unrekt.net/) (plusieurs réseaux) - [EverRevoke](https://everrise.com/everrevoke/) (plusieurs réseaux) diff --git a/public/content/translations/hi/guides/how-to-revoke-token-access/index.md b/public/content/translations/hi/guides/how-to-revoke-token-access/index.md index a0e9b2ff671..b8dd9338bcb 100644 --- a/public/content/translations/hi/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/hi/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ lang: hi - [इथअलावेंस](https://ethallowance.com/) (इथेरियम) - [इथरस्कैन](https://etherscan.io/tokenapprovalchecker) (इथेरियम) -- [कॉइनटूल](https://cointool.app/approve/eth) (मल्टीपल नेटवर्क) - [निरस्त करें](https://revoke.cash/) (मल्टीपल नेटवर्क) - [अनरेक्ट](https://app.unrekt.net/) (मल्टीपल नेटवर्क) - [EverRevoke](https://everrise.com/everrevoke/) (मल्टीपल नेटवर्क) diff --git a/public/content/translations/hu/guides/how-to-revoke-token-access/index.md b/public/content/translations/hu/guides/how-to-revoke-token-access/index.md index 01ddb6967b8..fabfc668551 100644 --- a/public/content/translations/hu/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/hu/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Számos weboldal lehetővé teszi, hogy láthassa és visszavonhassa a címéhez - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (több hálózat) - [Revoke](https://revoke.cash/) (több hálózat) - [Unrekt](https://app.unrekt.net/) (több hálózat) - [EverRevoke](https://everrise.com/everrevoke/) (több hálózat) diff --git a/public/content/translations/id/guides/how-to-revoke-token-access/index.md b/public/content/translations/id/guides/how-to-revoke-token-access/index.md index c4549430506..a0b6d174fef 100644 --- a/public/content/translations/id/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/id/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Beberapa situs web memungkinkan Anda untuk melihat dan mencabut kontrak pintar y - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (beberapa jaringan) - [Pencabutan](https://revoke.cash/) (beberapa jaringan) - [Unrekt](https://app.unrekt.net/) (beberapa jaringan) - [EverRevoke](https://everrise.com/everrevoke/) (beberapa jaringan) diff --git a/public/content/translations/ig/guides/how-to-revoke-token-access/index.md b/public/content/translations/ig/guides/how-to-revoke-token-access/index.md index 90065c7d933..7280682892e 100644 --- a/public/content/translations/ig/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/ig/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Naanị ihe nchebe bụ ịghara iji ọrụ ọhụrụ a nwalebeghị, kwadoo - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (ọtụtụ netwọk) - [Kagbuo](https://revoke.cash/) (ọtụtụ netwọk) - [Unrekt](https://app.unrekt.net/) (ọtụtụ netwọk) - [Kagbuo mgbe ọbụla](https://everrise.com/everrevoke/) (ọtụtụ netwọk) diff --git a/public/content/translations/it/guides/how-to-revoke-token-access/index.md b/public/content/translations/it/guides/how-to-revoke-token-access/index.md index 01e773e89ec..877c5c43a10 100644 --- a/public/content/translations/it/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/it/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Svariati siti web ti consentono di visualizzare e revocare i contratti intellige - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (svariate reti) - [Revoke](https://revoke.cash/) (svariate reti) - [Unrekt](https://app.unrekt.net/) (svariate reti) - [EverRevoke](https://everrise.com/everrevoke/) (svariate reti) diff --git a/public/content/translations/ja/guides/how-to-revoke-token-access/index.md b/public/content/translations/ja/guides/how-to-revoke-token-access/index.md index 2f8eb1a773d..216dee34745 100644 --- a/public/content/translations/ja/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/ja/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ lang: ja - [Ethallowance (イーサアラウアンス)](https://ethallowance.com/) (イーサリアム) - [Etherscan (イーサスキャン)](https://etherscan.io/tokenapprovalchecker) (イーサリアム) -- [Cointool (コインツール)](https://cointool.app/approve/eth) (複数のネットワーク) - [Revoke (リボーク)](https://revoke.cash/) (複数のネットワーク) - [Unrekt (アンレクト)](https://app.unrekt.net/) (複数のネットワーク) - [EverRevoke (エバーリボーク)](https://everrise.com/everrevoke/) (複数のネットワーク) diff --git a/public/content/translations/ms/guides/how-to-revoke-token-access/index.md b/public/content/translations/ms/guides/how-to-revoke-token-access/index.md index 4e79b644ebe..5ee5b8b60b8 100644 --- a/public/content/translations/ms/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/ms/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Beberapa laman web membenarkan anda melihat dan membatalkan kontrak pintar yang - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (berbilang rangkaian) - [Revoke](https://revoke.cash/) (berbilang rangkaian) - [Unrekt](https://app.unrekt.net/) (berbilang rangkaian) - [EverRevoke](https://everrise.com/everrevoke/) (berbilang rangkaian) diff --git a/public/content/translations/nl/guides/how-to-revoke-token-access/index.md b/public/content/translations/nl/guides/how-to-revoke-token-access/index.md index d1d7006fb75..e00c71ffe01 100644 --- a/public/content/translations/nl/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/nl/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Verschillende websites laten je slimme contracten die verbonden zijn met je adre - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (verschillende netwerken) - [Revoke](https://revoke.cash/) (verschillende netwerken) - [Unrekt](https://app.unrekt.net/) (verschillende netwerken) - [EverRevoke](https://everrise.com/everrevoke/) (verschillende netwerken) diff --git a/public/content/translations/pl/guides/how-to-revoke-token-access/index.md b/public/content/translations/pl/guides/how-to-revoke-token-access/index.md index f00f45dc9bc..823d2d85878 100644 --- a/public/content/translations/pl/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/pl/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Istnieje kilka stron umożliwiających przeglądanie i unieważnianie inteligent - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (wiele sieci) - [Revoke](https://revoke.cash/) (wiele sieci) - [Unrekt](https://app.unrekt.net/) (wiele sieci) - [EverRevoke](https://everrise.com/everrevoke/) (wiele sieci) diff --git a/public/content/translations/pt-br/guides/how-to-revoke-token-access/index.md b/public/content/translations/pt-br/guides/how-to-revoke-token-access/index.md index ff511bdb697..ad6398e7a45 100644 --- a/public/content/translations/pt-br/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/pt-br/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Vários sites permitem que você veja e revogue os contratos inteligentes conect - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (múltiplas redes) - [Revoke](https://revoke.cash/) (múltiplas redes) - [Unrekt](https://app.unrekt.net/) (múltiplas redes) - [EverRevoke](https://everrise.com/everrevoke/) (múltiplas redes) diff --git a/public/content/translations/ru/guides/how-to-revoke-token-access/index.md b/public/content/translations/ru/guides/how-to-revoke-token-access/index.md index fec4e3acc61..969cbac690f 100644 --- a/public/content/translations/ru/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/ru/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ lang: ru - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (различные сети) - [Revoke](https://revoke.cash/) (различные сети) - [Unrekt](https://app.unrekt.net/) (различные сети) - [EverRevoke](https://everrise.com/everrevoke/) (различные сети) diff --git a/public/content/translations/tr/guides/how-to-revoke-token-access/index.md b/public/content/translations/tr/guides/how-to-revoke-token-access/index.md index e79eadc2d32..6ff2735b5e1 100644 --- a/public/content/translations/tr/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/tr/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Bazı web siteleri adresinize bağlı akıllı sözleşmeleri görmenize ve kald - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (birden fazla ağ) - [Revoke](https://revoke.cash/) (birden fazla ağ) - [Unrekt](https://app.unrekt.net/) (birden fazla ağ) - [EverRevoke](https://everrise.com/everrevoke/) (birden fazla ağ) diff --git a/public/content/translations/uk/guides/how-to-revoke-token-access/index.md b/public/content/translations/uk/guides/how-to-revoke-token-access/index.md index 970376f53eb..72f7ef7df0f 100644 --- a/public/content/translations/uk/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/uk/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ lang: uk - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (різні мережі) - [Revoke](https://revoke.cash/) (різні мережі) - [Unrekt](https://app.unrekt.net/) (різні мережі) - [EverRevoke](https://everrise.com/everrevoke/) (різні мережі) diff --git a/public/content/translations/yo/guides/how-to-revoke-token-access/index.md b/public/content/translations/yo/guides/how-to-revoke-token-access/index.md index 008c3f9fbf0..513c5079bce 100644 --- a/public/content/translations/yo/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/yo/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Lọgan ti pẹpẹ kan ba ni awọn ẹtọ wiwọle ailopin si tọ́kẹ̀n k - [Ethallowance](https://ethallowance.com/)(Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker)(Ethereum) -- [Cointool](https://cointool.app/approve/eth) (onírúurú nẹtiwọki) - [fífagi lée](https://revoke.cash/) (onírúurú nẹtiwọki) - [Unrekt](https://app.unrekt.net/) (onírúurú nẹtiwọki) - [EverRevoke](https://everrise.com/everrevoke/) (onírúurú nẹtiwọki) diff --git a/public/content/translations/zh-tw/guides/how-to-revoke-token-access/index.md b/public/content/translations/zh-tw/guides/how-to-revoke-token-access/index.md index 22ca709d420..78654d2a639 100644 --- a/public/content/translations/zh-tw/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/zh-tw/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ lang: zh-tw - [Ethallowance](https://ethallowance.com/)(以太坊) - [Etherscan](https://etherscan.io/tokenapprovalchecker)(以太坊) -- [Cointool](https://cointool.app/approve/eth)(多種網路) - [Revoke](https://revoke.cash/)(多種網路) - [Unrekt](https://app.unrekt.net/)(多種網路) - [EverRevoke](https://everrise.com/everrevoke/)(多種網路) diff --git a/public/content/translations/zh/guides/how-to-revoke-token-access/index.md b/public/content/translations/zh/guides/how-to-revoke-token-access/index.md index 142d5aeea2a..2d4be057a56 100644 --- a/public/content/translations/zh/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/zh/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ lang: zh - [Ethallowance](https://ethallowance.com/)(以太坊) - [Etherscan](https://etherscan.io/tokenapprovalchecker)(以太坊) -- [Cointool](https://cointool.app/approve/eth)(多个网络) - [Revoke](https://revoke.cash/)(多个网络) - [Unrekt](https://app.unrekt.net/)(多个网络) - [EverRevoke](https://everrise.com/everrevoke/)(多个网络) From 88a6391e96820931ef9aea679bdd6984bdaf20ae Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 12:40:58 -0500 Subject: [PATCH 003/368] replacing https://api.dclimate.net/ with https://www.dclimate.net/ --- public/content/desci/index.md | 2 +- public/content/translations/ar/desci/index.md | 2 +- public/content/translations/az/desci/index.md | 2 +- public/content/translations/bn/desci/index.md | 2 +- public/content/translations/cs/desci/index.md | 2 +- public/content/translations/de/desci/index.md | 2 +- public/content/translations/el/desci/index.md | 2 +- public/content/translations/es/desci/index.md | 2 +- public/content/translations/fa/desci/index.md | 2 +- public/content/translations/fil/desci/index.md | 2 +- public/content/translations/fr/desci/index.md | 2 +- public/content/translations/hi/desci/index.md | 2 +- public/content/translations/hu/desci/index.md | 2 +- public/content/translations/id/desci/index.md | 2 +- public/content/translations/it/desci/index.md | 2 +- public/content/translations/ja/desci/index.md | 2 +- public/content/translations/kn/desci/index.md | 2 +- public/content/translations/ko/desci/index.md | 2 +- public/content/translations/mr/desci/index.md | 2 +- public/content/translations/ms/desci/index.md | 2 +- public/content/translations/nl/desci/index.md | 2 +- public/content/translations/pl/desci/index.md | 2 +- public/content/translations/pt-br/desci/index.md | 2 +- public/content/translations/pt/desci/index.md | 2 +- public/content/translations/ru/desci/index.md | 2 +- public/content/translations/sk/desci/index.md | 2 +- public/content/translations/sr/desci/index.md | 2 +- public/content/translations/tl/desci/index.md | 2 +- public/content/translations/tr/desci/index.md | 2 +- public/content/translations/uk/desci/index.md | 2 +- public/content/translations/yo/desci/index.md | 2 +- public/content/translations/zh-tw/desci/index.md | 2 +- public/content/translations/zh/desci/index.md | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/public/content/desci/index.md b/public/content/desci/index.md index 1abd03ddb7b..5286e291965 100644 --- a/public/content/desci/index.md +++ b/public/content/desci/index.md @@ -97,7 +97,7 @@ Explore projects and join the DeSci community. - [VitaDAO: receive funding through sponsored research agreements for longevity research](https://www.vitadao.com/) - [ResearchHub: post a scientific result and engage in a conversation with peers](https://www.researchhub.com/) - [LabDAO: fold a protein in-silico](https://alphafodl.vercel.app/) -- [dClimate API: query climate data collected by a decentralized community](https://api.dclimate.net/) +- [dClimate API: query climate data collected by a decentralized community](https://www.dclimate.net/) - [DeSci Foundation: DeSci publishing tool builder](https://descifoundation.org/) - [DeSci.World: one-stop shop for users to view, engage with decentralized science](https://desci.world) - [OceanDAO: DAO governed funding for data-related science](https://oceanprotocol.com/) diff --git a/public/content/translations/ar/desci/index.md b/public/content/translations/ar/desci/index.md index 276c6881e16..4a43744e7c3 100644 --- a/public/content/translations/ar/desci/index.md +++ b/public/content/translations/ar/desci/index.md @@ -96,7 +96,7 @@ Web3 لديه القدرة على تعطيل نموذج التمويل المع - [VitaDAO: تلقي التمويل من خلال اتفاقيات البحث المدعومة للأبحاث طويلة العمر](https://www.vitadao.com/) - [ResearchHub: انشر نتيجة علمية وانخرط في محادثة مع نظرائك](https://www.researchhub.com/) - [LabDAO: إدماج البروتين في الحاسوب](https://alphafodl.vercel.app/) -- [dClimate API: الاستعلام عن البيانات المناخية التي تم جمعها من قبل مجتمع لامركزي](https://api.dclimate.net/) +- [dClimate API: الاستعلام عن البيانات المناخية التي تم جمعها من قبل مجتمع لامركزي](https://www.dclimate.net/) - [DeSci Foundation: منشئ أداة نشر العلوم اللامركزية](https://descifoundation.org/) - [DeSci.World: متجر شامل يتيح للمستخدمين عرض العلوم اللامركزية والتفاعل معها](https://desci.world) - [Fleming Protocol: اقتصاد بيانات مفتوحة المصدر يغذي اكتشاف الطب الحيوي التعاوني](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/az/desci/index.md b/public/content/translations/az/desci/index.md index f616a6c8dc7..835577dd845 100644 --- a/public/content/translations/az/desci/index.md +++ b/public/content/translations/az/desci/index.md @@ -96,7 +96,7 @@ Layihələri araşdırın və DeSci cəmiyyətinə qoşulun. - [VitaDAO: uzunömürlülük tədqiqatları üçün sponsorluq edilən tədqiqat müqavilələri vasitəsilə maliyyə əldə edin](https://www.vitadao.com/) - [ResearchHub: elmi nəticəni dərc edin və həmkarlarınız ilə söhbət edin](https://www.researchhub.com/) - [LabDAO: in-silico-da protein qazanın](https://alphafodl.vercel.app/) -- [dClimate API: mərkəzləşdirilməmiş icma tərəfindən toplanan iqlim məlumatlarını sorğulayın](https://api.dclimate.net/) +- [dClimate API: mərkəzləşdirilməmiş icma tərəfindən toplanan iqlim məlumatlarını sorğulayın](https://www.dclimate.net/) - [DeSci Fondu: DeSci nəşriyyat aləti qurucusu](https://descifoundation.org/) - [DeSci.World: istifadəçilər üçün mərkəzləşdirilməmiş elmlə məşğul olmaq üçün bir mağaza](https://desci.world) - [Fleming Protokolu: birgə biotibbi kəşfləri gücləndirən açıq mənbəli məlumat iqtisadiyyatı](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/bn/desci/index.md b/public/content/translations/bn/desci/index.md index 8a912117316..55342bc5352 100644 --- a/public/content/translations/bn/desci/index.md +++ b/public/content/translations/bn/desci/index.md @@ -96,7 +96,7 @@ Web3 প্যাটার্ন ব্যবহার করে বৈজ্ঞ - [VitaDAO: দীর্ঘায়ু গবেষণার জন্য স্পনসরড গবেষণা চুক্তির মাধ্যমে অর্থায়ন পান](https://www.vitadao.com/) - [ResearchHub: একটি বৈজ্ঞানিক ফলাফল পোস্ট করুন এবং সহকর্মীদের সাথে কথোপকথনে নিযুক্ত হন](https://www.researchhub.com/) - [LabDAO: সিলিকোতে একটি প্রোটিন ভাঁজ করুন](https://alphafodl.vercel.app/) -- [dClimate API: একটি বিকেন্দ্রীভূত সম্প্রদায়ের দ্বারা সংগৃহীত জলবায়ু সংক্রান্ত তথ্য অনুসন্ধান করে](https://api.dclimate.net/) +- [dClimate API: একটি বিকেন্দ্রীভূত সম্প্রদায়ের দ্বারা সংগৃহীত জলবায়ু সংক্রান্ত তথ্য অনুসন্ধান করে](https://www.dclimate.net/) - [DeSci ফাউন্ডেশন: DeSci প্রকাশনা টুল নির্মাতা](https://descifoundation.org/) - [DeSci.World: ব্যবহারকারীদের দেখার জন্য, বিকেন্দ্রীভূত বিজ্ঞানের সাথে জড়িত থাকার ওয়ান-স্টপ শপ](https://desci.world) - [ফ্লেমিং প্রোটোকল: ওপেন-সোর্স ডেটা ইকোনমি যা সহযোগিতামূলক বায়োমেডিকাল আবিষ্কারকে জ্বালানী দেয়](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/cs/desci/index.md b/public/content/translations/cs/desci/index.md index abe0906ff70..46a5a48a31c 100644 --- a/public/content/translations/cs/desci/index.md +++ b/public/content/translations/cs/desci/index.md @@ -96,7 +96,7 @@ Podívejte se na níže uvedené projekty a zapojte se do DeSci komunity. - [VitaDAO: Získávejte financování prostřednictvím sponzorovaných smluv o výzkumu pro výzkum dlouhověkosti](https://www.vitadao.com/) - [ResearchHub: Publikujte vědecké výsledky a zapojte se do konverzace s kolegy](https://www.researchhub.com/) - [LabDAO: Skládejte bílkoviny in-silico](https://alphafodl.vercel.app/) -- [dClimate API: Poptávejte klimatická data shromážděná decentralizovanou komunitou](https://api.dclimate.net/) +- [dClimate API: Poptávejte klimatická data shromážděná decentralizovanou komunitou](https://www.dclimate.net/) - [DeSci Foundation: Publikační nástroj v rámci DeSci](https://descifoundation.org/) - [DeSci.World: Jednotné kontaktní místo, kde se uživatelé mohou podívat a zapojovat do DeSci](https://desci.world) - [OceanDAO: Financování řízené DAO pro vědu zabývající se daty](https://oceanprotocol.com/) diff --git a/public/content/translations/de/desci/index.md b/public/content/translations/de/desci/index.md index 11b8332fb93..3dc13aa1a4c 100644 --- a/public/content/translations/de/desci/index.md +++ b/public/content/translations/de/desci/index.md @@ -96,7 +96,7 @@ Erkunden Sie Projekte und werden Sie Teil der DeSci-Gemeinschaft. - [VitaDAO: langfristige Forschung finanziert durch gesponserte Forschungsverträge](https://www.vitadao.com/) - [ResearchHub: wissenschaftliche Ergebnisse veröffentlichen und in Diskurs mit Partnern gehen](https://www.researchhub.com/) - [LabDAO: Falten eines Proteins in Silizium](https://alphafodl.vercel.app/) -- [dClimate API: Klimadaten abfragen, die von einer dezentralen Gemeinschaft erfasst werden](https://api.dclimate.net/) +- [dClimate API: Klimadaten abfragen, die von einer dezentralen Gemeinschaft erfasst werden](https://www.dclimate.net/) - [DeSci Foundation: DeSci Publishing Tool Builder](https://descifoundation.org/) - [DeSci.World: One-Stop-Shop für Benutzer, mit dezentralisierter Wissenschaft](https://desci.world) - [OceanDAO: DAO regelte die Finanzierung der datenbezogenen Wissenschaft](https://oceanprotocol.com/) diff --git a/public/content/translations/el/desci/index.md b/public/content/translations/el/desci/index.md index b002b7957b9..17f506af6f7 100644 --- a/public/content/translations/el/desci/index.md +++ b/public/content/translations/el/desci/index.md @@ -96,7 +96,7 @@ summaryPoint3: Δημιουργία πάνω στο ανοιχτό επιστη - [VitaDAO: Λάβετε χρηματοδότηση μέσω συμφωνιών έρευνας με χορηγία για έρευνα μακροζωίας.](https://www.vitadao.com/) - [ResearchHub: Δημοσιεύστε μια επιστημονική έρευνα και συμμετάσχετε σε μια συζήτηση.](https://www.researchhub.com/) - [LabDAO: fold a protein in-silico](https://alphafodl.vercel.app/) -- [dClimate API: Αναζήτηση δεδομένων για το κλίμα που συλλέγονται από μια αποκεντρωμένη κοινότητα.](https://api.dclimate.net/) +- [dClimate API: Αναζήτηση δεδομένων για το κλίμα που συλλέγονται από μια αποκεντρωμένη κοινότητα.](https://www.dclimate.net/) - [DeSci Foundation: DeSci δημιουργία εργαλείου δημοσίευσης.](https://descifoundation.org/) - [DeSci.World: Σύντομη αγορά για να δουν οι χρήστες και να ασχοληθούν με την αποκεντρωμένη επιστήμη.](https://desci.world) - [OceanDAO: DAO χρηματοδότησης για την επιστήμη που σχετίζεται με δεδομένα.](https://oceanprotocol.com/) diff --git a/public/content/translations/es/desci/index.md b/public/content/translations/es/desci/index.md index 508c74aa260..4800f0c987c 100644 --- a/public/content/translations/es/desci/index.md +++ b/public/content/translations/es/desci/index.md @@ -96,7 +96,7 @@ Explore proyectos y únase a la comunidad DeSci. - [VitaDAO: recibe financiación a través de acuerdos de investigación patrocinados para la investigación de la longevidad](https://www.vitadao.com/) - [ResearchHub: publique un resultado científico y participe en conversaciones con pares](https://www.researchhub.com/) - [LabDAO: pliegue una proteína simulada por ordenador](https://alphafodl.vercel.app/) -- [dClimate API: consulta datos climáticos recopilados por una comunidad descentralizada](https://api.dclimate.net/) +- [dClimate API: consulta datos climáticos recopilados por una comunidad descentralizada](https://www.dclimate.net/) - [DeSci Foundation: creador de herramientas de publicación DeSci](https://descifoundation.org/) - [DeSci.World: ventanilla única para que los usuarios vean e interactúen con la ciencia descentralizada](https://desci.world) - [OceanDAO: financiación regida por una DAO para la ciencia relacionada con datos](https://oceanprotocol.com/) diff --git a/public/content/translations/fa/desci/index.md b/public/content/translations/fa/desci/index.md index 6050be4c140..f3c50e77d65 100644 --- a/public/content/translations/fa/desci/index.md +++ b/public/content/translations/fa/desci/index.md @@ -96,7 +96,7 @@ Web3 این پتانسیل را دارد که با آزمایش مدل‌های - [VitaDAO: دریافت بودجه از طریق توافقنامه های تحقیقاتی حمایت شده برای تحقیقات طول عمر](https://www.vitadao.com/) - [ResearchHub: یک نتیجه علمی را ارسال کنید و با همتایان خود گفتگو کنید](https://www.researchhub.com/) - [LabDAO: یک پروتئین را در سیلیکو تا کنید](https://alphafodl.vercel.app/) -- [dClimate API: داده‌های آب و هوایی را که توسط یک جامعه غیرمتمرکز جمع‌آوری شده است، جستجو کنید](https://api.dclimate.net/) +- [dClimate API: داده‌های آب و هوایی را که توسط یک جامعه غیرمتمرکز جمع‌آوری شده است، جستجو کنید](https://www.dclimate.net/) - [DeSci Foundation: سازنده ابزار انتشارات DeSci](https://descifoundation.org/) - [DeSci.World: فروشگاه تک مرحله ای برای مشاهده کاربران، درگیر شدن با علم غیرمتمرکز](https://desci.world) - [OceanDAO: DAO بر تأمین مالی علوم مرتبط با داده نظارت می کرد](https://oceanprotocol.com/) diff --git a/public/content/translations/fil/desci/index.md b/public/content/translations/fil/desci/index.md index d4b714c4ee5..31969c338a1 100644 --- a/public/content/translations/fil/desci/index.md +++ b/public/content/translations/fil/desci/index.md @@ -96,7 +96,7 @@ Tingnan ang mga proyekto at sumali sa komunidad ng DeSci. - [VitaDAO: makatanggap ng pondo sa pamamagitan ng mga sponsored na research agreement para sa longevity research](https://www.vitadao.com/) - [ResearchHub: mag-post ng resulta ng siyentipikong pag-aaral at makipag-usap sa mga kapwa mananaliksik](https://www.researchhub.com/) - [LabDAO: mag-fold ng protein in-silico](https://alphafodl.vercel.app/) -- [dClimate API: mag-query ng data ng klima na kinolekta ng decentralized community](https://api.dclimate.net/) +- [dClimate API: mag-query ng data ng klima na kinolekta ng decentralized community](https://www.dclimate.net/) - [DeSci Foundation: builder ng tool sa paglalathala ng DeSci](https://descifoundation.org/) - [DeSci.World: one-stop shop para tingnan at mag-engage ang mga user sa decentralized science](https://desci.world) - [Fleming Protocol: open-source data economy na naghihikayat ng collaborative na biomedical discovery](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/fr/desci/index.md b/public/content/translations/fr/desci/index.md index a7a182b8e72..9a4faceda9e 100644 --- a/public/content/translations/fr/desci/index.md +++ b/public/content/translations/fr/desci/index.md @@ -96,7 +96,7 @@ Explorer les projets et rejoindre la communauté DeSci. - [VitaDAO : recevoir des fonds par le biais d'accords de recherche sponsorisés en vue de recherches sur la longévité](https://www.vitadao.com/) - [Research Hub : publier un résultat scientifique et participer à une conversation avec des pairs](https://www.researchhub.com/) - [LabDAO : plier une protéine in-silico](https://alphafodl.vercel.app/) -- [dClimate API : envoyer des requêtes concernant les données climatiques recueillies par une communauté décentralisée](https://api.dclimate.net/) +- [dClimate API : envoyer des requêtes concernant les données climatiques recueillies par une communauté décentralisée](https://www.dclimate.net/) - [DeSci Foundation : fabricant d'outils de publication DeSci](https://descifoundation.org/) - [DeSci.World : guichet unique grâce auquel les utilisateurs peuvent avoir une visibilité, échanger avec la science décentralisée](https://desci.world) - [OceanDAO : source de financement régi par une DAO pour les études scientifiques liées aux données](https://oceanprotocol.com/) diff --git a/public/content/translations/hi/desci/index.md b/public/content/translations/hi/desci/index.md index 6983dc18434..55fde1d8aa6 100644 --- a/public/content/translations/hi/desci/index.md +++ b/public/content/translations/hi/desci/index.md @@ -96,7 +96,7 @@ Web3 डेटा समाधान उपरोक्त परिदृश् - [VitaDAO: दीर्घायु अनुसंधान के लिए प्रायोजित अनुसंधान समझौतों के माध्यम से धन प्राप्त करें](https://www.vitadao.com/) - [ResearchHub: एक वैज्ञानिक परिणाम पोस्ट करें और साथियों के साथ बातचीत में संलग्न हों](https://www.researchhub.com/) - [LabDAO: सिलिको में एक प्रोटीन को मोड़ें](https://alphafodl.vercel.app/) -- [dClimate API: विकेंद्रीकृत समुदाय द्वारा एकत्र किए गए जलवायु डेटा को क्वेरी करें](https://api.dclimate.net/) +- [dClimate API: विकेंद्रीकृत समुदाय द्वारा एकत्र किए गए जलवायु डेटा को क्वेरी करें](https://www.dclimate.net/) - [DeSci Foundation: DeSci प्रकाशन उपकरण बिल्डर](https://descifoundation.org/) - [DeSci.World: उपयोगकर्ताओं को विकेन्द्रीकृत विज्ञान को देखने, संलग्न करने के लिए वन-स्टॉप शॉप](https://desci.world) - [OceanDAO: DAO डेटा से संबंधित विज्ञान के लिए शासित वित्त पोषण](https://oceanprotocol.com/) diff --git a/public/content/translations/hu/desci/index.md b/public/content/translations/hu/desci/index.md index 026acb08c2a..c659604ece4 100644 --- a/public/content/translations/hu/desci/index.md +++ b/public/content/translations/hu/desci/index.md @@ -96,7 +96,7 @@ Fedezze fel a projekteket és csatlakozzon a DeSci közösségéhez. - [VitaDAO: hosszútávú kutatások finanszírozása a szponzorált kutatási megállapodások alapján](https://www.vitadao.com/) - [ResearchHub: tudományos eredmények publikálása és azok megvitatása munkatársaival](https://www.researchhub.com/) - [LabDAO: fehérjék számítógépes szimulációja](https://alphafodl.vercel.app/) -- [dClimate API: keresés a decentralizált közösség által gyűjtött klímaadatokban](https://api.dclimate.net/) +- [dClimate API: keresés a decentralizált közösség által gyűjtött klímaadatokban](https://www.dclimate.net/) - [DeSci Foundation: DeSci publikációs eszközfejlesztés](https://descifoundation.org/) - [DeSci.World: itt minden megtudható a decentralizált tudományról](https://desci.world) - [OceanDAO: az adattal kapcsolatos tudományok DAO által irányított finanszírozása](https://oceanprotocol.com/) diff --git a/public/content/translations/id/desci/index.md b/public/content/translations/id/desci/index.md index e4bd854051f..7943643a926 100644 --- a/public/content/translations/id/desci/index.md +++ b/public/content/translations/id/desci/index.md @@ -96,7 +96,7 @@ Jelajahi proyek-proyek dan bergabunglah dengan komunitas DeSci. - [VitaDAO: Terima pendanaan melalui perjanjian penelitian yang disponsori untuk penelitian kelangsungan hidup](https://www.vitadao.com/) - [ResearchHub: Unggah hasil ilmiah dan terlibat dalam percakapan dengan rekan-rekan sejawat](https://www.researchhub.com/) - [LabDAO: Melipat protein secara in-silico](https://alphafodl.vercel.app/) -- [dClimate API: Permintaan data iklim yang dikumpulkan oleh komunitas terdesentralisasi](https://api.dclimate.net/) +- [dClimate API: Permintaan data iklim yang dikumpulkan oleh komunitas terdesentralisasi](https://www.dclimate.net/) - [DeSci Foundation: Pembangun alat penerbitan DeSci](https://descifoundation.org/) - [DeSci.World: pusat informasi untuk pengguna melihat dan terlibat dengan ilmu pengetahuan terdesentralisasi](https://desci.world) - [OceanDAO: Pendanaan yang diatur oleh DAO untuk ilmu pengetahuan terkait data](https://oceanprotocol.com/) diff --git a/public/content/translations/it/desci/index.md b/public/content/translations/it/desci/index.md index 128a3cefd5d..c0d005e1528 100644 --- a/public/content/translations/it/desci/index.md +++ b/public/content/translations/it/desci/index.md @@ -96,7 +96,7 @@ Esplora i progetti e unisciti alla community della DeSci. - [VitaDAO: ricevi finanziamenti tramite accordi di ricerca sponsorizzati per la ricerca sulla longevità](https://www.vitadao.com/) - [ResearchHub: pubblica un risultato scientifico e conversa con i colleghi](https://www.researchhub.com/) - [LabDAO: piega una proteina in-silico](https://alphafodl.vercel.app/) -- [dClimate API: interroga i dati climatici raccolti da una community decentralizzata](https://api.dclimate.net/) +- [dClimate API: interroga i dati climatici raccolti da una community decentralizzata](https://www.dclimate.net/) - [DeSci Foundation: sviluppatore di strumenti di pubblicazione della DeSci](https://descifoundation.org/) - [DeSci.World: negozio unico per gli utenti per visualizzare e impegnarsi con progetti di scienza decentralizzata](https://desci.world) - [OceanDAO: finanziamenti governati dalla DAO per la scienza relativa ai dati](https://oceanprotocol.com/) diff --git a/public/content/translations/ja/desci/index.md b/public/content/translations/ja/desci/index.md index 8796df426b6..d450f4c070e 100644 --- a/public/content/translations/ja/desci/index.md +++ b/public/content/translations/ja/desci/index.md @@ -96,7 +96,7 @@ Web3の様式を活用することで科学データへのアクセスが大幅 - [VitaDAO: 長寿研究のための研究スポンサー契約を通じた資金獲得](https://www.vitadao.com/) - [ResearchHub: 科学的成果を投稿し、仲間と会話する](https://www.researchhub.com/) - [LabDAO: コンピュータを用いたタンパク質フォールディング](https://alphafodl.vercel.app/) -- [dClimate API: 分散型コミュニティに収集された気候データのクエリ](https://api.dclimate.net/) +- [dClimate API: 分散型コミュニティに収集された気候データのクエリ](https://www.dclimate.net/) - [DeSci財団: DeSci出版ツールビルダー](https://descifoundation.org/) - [DeSci.World: ユーザーが閲覧して参加できる分散型科学のワンストップショップ](https://desci.world) - [OceanDAO: データ関連科学のための、DAOに統制された資金調達](https://oceanprotocol.com/) diff --git a/public/content/translations/kn/desci/index.md b/public/content/translations/kn/desci/index.md index d95265e5a57..ca93fea8c15 100644 --- a/public/content/translations/kn/desci/index.md +++ b/public/content/translations/kn/desci/index.md @@ -96,7 +96,7 @@ NFT ಗಳು ಭವಿಷ್ಯದ ವಹಿವಾಟುಗಳಿಗೆ ಆದ - [VitaDAO: ದೀರ್ಘಾಯುಷ್ಯದ ಸಂಶೋಧನೆಗಾಗಿ ಪ್ರಾಯೋಜಿತ ಸಂಶೋಧನಾ ಒಪ್ಪಂದಗಳ ಮೂಲಕ ಧನಸಹಾಯವನ್ನು ಪಡೆಯುವುದು](https://www.vitadao.com/) - [ResearchHub: ವೈಜ್ಞಾನಿಕ ಫಲಿತಾಂಶವನ್ನು ಪೋಸ್ಟ್ ಮಾಡಿ ಮತ್ತು ಗೆಳೆಯರೊಂದಿಗೆ ಸಂಭಾಷಣೆಯಲ್ಲಿ ತೊಡಗಿಕೊಳ್ಳಿ](https://www.researchhub.com/) - [LabDAO: ಸಿಲಿಕೊದಲ್ಲಿ ಪ್ರೋಟೀನ್ ಅನ್ನು ಮಡಚಿ](https://alphafodl.vercel.app/) -- [dClimate API: ವಿಕೇಂದ್ರೀಕೃತ ಸಮುದಾಯದಿಂದ ಸಂಗ್ರಹಿಸಿದ ಹವಾಮಾನ ದತ್ತಾಂಶವನ್ನು ಪಡೆಯಿರಿ](https://api.dclimate.net/) +- [dClimate API: ವಿಕೇಂದ್ರೀಕೃತ ಸಮುದಾಯದಿಂದ ಸಂಗ್ರಹಿಸಿದ ಹವಾಮಾನ ದತ್ತಾಂಶವನ್ನು ಪಡೆಯಿರಿ](https://www.dclimate.net/) - [DeSci Foundation: DeSci ಪಬ್ಲಿಷಿಂಗ್ ಟೂಲ್ ಬಿಲ್ಡರ್](https://descifoundation.org/) - [DeSci.World: ವಿಕೇಂದ್ರೀಕೃತ ವಿಜ್ಞಾನವನ್ನು ವೀಕ್ಷಿಸಲು, ತೊಡಗಿಸಿಕೊಳ್ಳಲು ಬಳಕೆದಾರರಿಗೆ ಒನ್-ಸ್ಟಾಪ್ ಶಾಪ್](https://desci.world) - [Fleming Protocol: ಸಹಕಾರಿ ಬಯೋಮೆಡಿಕಲ್ ಆವಿಷ್ಕಾರಕ್ಕೆ ಇಂಧನ ನೀಡುವ ಓಪನ್-ಸೋರ್ಸ್ ಡೇಟಾ ಆರ್ಥಿಕತೆ](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/ko/desci/index.md b/public/content/translations/ko/desci/index.md index 2e06c4c5577..62a63718dde 100644 --- a/public/content/translations/ko/desci/index.md +++ b/public/content/translations/ko/desci/index.md @@ -96,7 +96,7 @@ NFT가 향후 거래에 대한 수익을 원래 작성자에게 다시 전달할 - [VitaDAO: 장수 연구를 위한 후원 연구 계약을 통해 자금을 받으세요](https://www.vitadao.com/) - [ResearchHub: 과학적 결과를 게시하고 동료들과 대화에 참여하세요](https://www.researchhub.com/) - [LabDAO: 단백질 인실리코를 접으세요](https://alphafodl.vercel.app/) -- [dClimate API: 분산된 커뮤니티에서 수집한 기후 데이터 쿼리](https://api.dclimate.net/) +- [dClimate API: 분산된 커뮤니티에서 수집한 기후 데이터 쿼리](https://www.dclimate.net/) - [DeFi Foundation: DeFi 게시 도구 빌더](https://descifoundation.org/) - [DeSci.World: 사용자가 보고, 탈중앙화 과학에 참여할 수 있는 원스톱 상점](https://desci.world) - [플레밍 프로토콜: 협업 생물 의학 발견을 촉진하는 오픈 소스 데이터 경제](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/mr/desci/index.md b/public/content/translations/mr/desci/index.md index 56a24ce47c4..9df670204b9 100644 --- a/public/content/translations/mr/desci/index.md +++ b/public/content/translations/mr/desci/index.md @@ -96,7 +96,7 @@ Web3 पॅटर्नचा वापर करून वैज्ञानि - [VitaDAO: दीर्घायुषी संशोधनासाठी प्रायोजित संशोधन कराराद्वारे निधी प्राप्त करा](https://www.vitadao.com/) - [ResearchHub: वैज्ञानिक परिणाम पोस्ट करा आणि समवयस्कांशी संभाषण करा](https://www.researchhub.com/) - [LabDAO: सिलिकोमध्ये प्रोटीन फोल्ड करा](https://alphafodl.vercel.app/) -- [dClimate API: विकेंद्रित समुदायाद्वारे गोळा केलेला हवामान डेटा क्वेरी](https://api.dclimate.net/) +- [dClimate API: विकेंद्रित समुदायाद्वारे गोळा केलेला हवामान डेटा क्वेरी](https://www.dclimate.net/) - [DeSci फाउंडेशन: DeSci प्रकाशन साधन बिल्डर](https://descifoundation.org/) - [DeSci.World: वापरकर्त्यांना विकेंद्रित विज्ञान पाहण्यासाठी, व्यस्त ठेवण्यासाठी वन-स्टॉप शॉप](https://desci.world) - [फ्लेमिंग प्रोटोकॉल: ओपन-सोर्स डेटा इकॉनॉमी जी सहयोगात्मक बायोमेडिकल शोधांना चालना देते](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/ms/desci/index.md b/public/content/translations/ms/desci/index.md index ee196aef8b0..a2cb5dc314d 100644 --- a/public/content/translations/ms/desci/index.md +++ b/public/content/translations/ms/desci/index.md @@ -96,7 +96,7 @@ Terokai projek dan sertai komuni DeSci. - [VitaDAO: menerima pembiayaan melalui perjanjian penyelidikan yang ditaja untuk penyelidikan jangka hayat](https://www.vitadao.com/) - [ResearchHub: siarkan hasil saintifik dan libatkan diri dalam perbualan dengan rakan sebaya](https://www.researchhub.com/) - [LabDAO: lipat protein dalam-siliko](https://alphafodl.vercel.app/) -- [dClimate API: data iklim pertanyaan yang dikumpul oleh komuniti teragih](https://api.dclimate.net/) +- [dClimate API: data iklim pertanyaan yang dikumpul oleh komuniti teragih](https://www.dclimate.net/) - [Yayasan DeSci: pembina alat penerbitan DeSci](https://descifoundation.org/) - [DeSci.World: kedai sehenti untuk pengguna melihat, melibatkan diri dengan sains teragih](https://desci.world) - [OceanDAO: DAO mentadbir pembiayaan untuk sains berkaitan data](https://oceanprotocol.com/) diff --git a/public/content/translations/nl/desci/index.md b/public/content/translations/nl/desci/index.md index 0c0a02694b4..1966b783bcc 100644 --- a/public/content/translations/nl/desci/index.md +++ b/public/content/translations/nl/desci/index.md @@ -96,7 +96,7 @@ Verken projecten en word lid van de DeSci-gemeenschap. - [VitaDAO: krijg financiering via gesponsorde onderzoeksovereenkomsten voor onderzoek naar lange levensduur](https://www.vitadao.com/) - [ResearchHub: publiceer een wetenschappelijk resultaat en neem deel aan een gesprek met collega's](https://www.researchhub.com/) - [LabDAO: vouw een eiwit in-silico](https://alphafodl.vercel.app/) -- [dClimate API: vraag klimaatgegevens op verzameld door een gedecentraliseerde gemeenschap](https://api.dclimate.net/) +- [dClimate API: vraag klimaatgegevens op verzameld door een gedecentraliseerde gemeenschap](https://www.dclimate.net/) - [DeSci Foundation: bouwer van tools voor het publiceren van DeSci](https://descifoundation.org/) - [DeSci.World: one-stop shop voor gebruikers om te kijken naar en deel te nemen aan gedecentraliseerde wetenschap](https://desci.world) - [OceanDAO: door DAO beheerde financiering voor datagerelateerde wetenschap](https://oceanprotocol.com/) diff --git a/public/content/translations/pl/desci/index.md b/public/content/translations/pl/desci/index.md index b119142ee06..89403b7f59a 100644 --- a/public/content/translations/pl/desci/index.md +++ b/public/content/translations/pl/desci/index.md @@ -96,7 +96,7 @@ Przeglądaj projekty i dołącz do społeczności DeSci. - [VitaDAO: uzyskuj środki finansowe w ramach sponsorowanych umów badawczych na długotrwałe badania](https://www.vitadao.com/) - [Research Hub: wysyłaj wyniki naukowe i angażuj się w rozmowy z partnerami](https://www.researchhub.com/) - [LabDAO: projektuj białka in-silico (za pomocą komputera)](https://alphafodl.vercel.app/) -- [dClimate API: przeszukuj dane klimatyczne zebrane przez zdecentralizowaną społeczność](https://api.dclimate.net/) +- [dClimate API: przeszukuj dane klimatyczne zebrane przez zdecentralizowaną społeczność](https://www.dclimate.net/) - [Fundacja DeSci: konstruktor narzędzi do publikowania DeSci](https://descifoundation.org/) - [DeSci.World: jedno miejsce dla użytkowników do przeglądania i angażowania się w zdecentralizowaną naukę](https://desci.world) - [OceanDAO: DAO finansuje naukę związaną z danymi](https://oceanprotocol.com/) diff --git a/public/content/translations/pt-br/desci/index.md b/public/content/translations/pt-br/desci/index.md index 407f18c1291..41e72044ccd 100644 --- a/public/content/translations/pt-br/desci/index.md +++ b/public/content/translations/pt-br/desci/index.md @@ -96,7 +96,7 @@ Explore projetos e junte-se à comunidade DeSci. - [Virotada: receba financiamento por meio de acordos de pesquisa patrocinados para pesquisas sobre longevidade](https://www.vitadao.com/) - [ResearchHub: publique um resultado científico e converse com colegas](https://www.researchhub.com/) - [LabDAO: dobre uma proteína in-silico](https://alphafodl.vercel.app/) -- [dClimate API: consulte dados climáticos coletados por uma comunidade descentralizada](https://api.dclimate.net/) +- [dClimate API: consulte dados climáticos coletados por uma comunidade descentralizada](https://www.dclimate.net/) - [DeSci Foundation: construtor de ferramentas de publicação DeSci](https://descifoundation.org/) - [DeSci.World: balcão único para os usuários visualizarem e interagirem com a ciência descentralizada](https://desci.world) - [OceanDAO: financiamento governado pela DAO para ciência relacionada a dados](https://oceanprotocol.com/) diff --git a/public/content/translations/pt/desci/index.md b/public/content/translations/pt/desci/index.md index 0318a15ad80..041b1b56b45 100644 --- a/public/content/translations/pt/desci/index.md +++ b/public/content/translations/pt/desci/index.md @@ -96,7 +96,7 @@ Explore projetos e junte-se à comunidade DeSci. - [VitaDAO: receba financiamento através de acordos de investigação patrocinados para a investigação sobre a longevidade](https://www.vitadao.com/) - [ResearchHub: publique um resultado científico e participe numa conversa com os seus pares](https://www.researchhub.com/) - [LabDAO: dobre uma proteína in-silico](https://alphafodl.vercel.app/) -- [API dClimate: consulte os dados climáticos recolhidos por uma comunidade descentralizada](https://api.dclimate.net/) +- [API dClimate: consulte os dados climáticos recolhidos por uma comunidade descentralizada](https://www.dclimate.net/) - [Fundação DeSci: Criação de ferramentas de publicação DeSci](https://descifoundation.org/) - [DeSci.World: um balcão único para visualização e envolvimento dos utilizadores com a ciência descentralizada](https://desci.world) - [OceanDAO: financiamento gerido por uma DAO para a ciência relacionada com os dados](https://oceanprotocol.com/) diff --git a/public/content/translations/ru/desci/index.md b/public/content/translations/ru/desci/index.md index 17cf71dcce9..dde6fa57af2 100644 --- a/public/content/translations/ru/desci/index.md +++ b/public/content/translations/ru/desci/index.md @@ -96,7 +96,7 @@ Web3 обладает потенциалом, который позволит р - [VitaDAO: получайте финансирование через спонсорские соглашения на исследования долголетия](https://www.vitadao.com/) - [ResearchHub: публикуйте научные результаты и участвуйте в беседах с коллегами](https://www.researchhub.com/) - [LabDAO: складывание белка in-silico](https://alphafodl.vercel.app/) -- [dClimate API: запрос климатических данных, собранных децентрализованным сообществом](https://api.dclimate.net/) +- [dClimate API: запрос климатических данных, собранных децентрализованным сообществом](https://www.dclimate.net/) - [DeSci Foundation: конструктор инструментов публикации DeSci](https://descifoundation.org/) - [DeSci.World: единая пользовательская площадка для просмотра и взаимодействия с децентрализованной наукой](https://desci.world) - [OceanDAO: финансирование науки, связанной с данными, под управлением DAO](https://oceanprotocol.com/) diff --git a/public/content/translations/sk/desci/index.md b/public/content/translations/sk/desci/index.md index a56b3ab8625..97b81863dc4 100644 --- a/public/content/translations/sk/desci/index.md +++ b/public/content/translations/sk/desci/index.md @@ -96,7 +96,7 @@ Pozrite sa na nižšie uvedené projekty a zapojte sa do DeSci komunity. - [VitaDAO: získavajte financovanie prostredníctvom sponzorovaných zmlúv o výskume pre výskum dlhovekosti](https://www.vitadao.com/) - [ResearchHub: publikujte vedecké výsledky a zapojte sa do konverzácie s kolegami](https://www.researchhub.com/) - [LabDAO: skladajte bielkoviny pomocou simulácie](https://alphafodl.vercel.app/) -- [dClimate API: vyhľadávanie klimatických dáta zhromaždených decentralizovanou komunitou](https://api.dclimate.net/) +- [dClimate API: vyhľadávanie klimatických dáta zhromaždených decentralizovanou komunitou](https://www.dclimate.net/) - [DeSci Foundation: publikačný nástroj v rámci DeSci](https://descifoundation.org/) - [DeSci.World: jednotné kontaktné miesto, kde sa používatelia môžu pozrieť a zapájať do DeSci](https://desci.world) - [OceanDAO: financovanie riadené DAO pre vedu zaoberajúce sa dátami](https://oceanprotocol.com/) diff --git a/public/content/translations/sr/desci/index.md b/public/content/translations/sr/desci/index.md index 6d52fc8a9ce..b16ed7b56ad 100644 --- a/public/content/translations/sr/desci/index.md +++ b/public/content/translations/sr/desci/index.md @@ -96,7 +96,7 @@ Istražite projekte i pridružite se DeSci zajednici. - [VitaDAO: dobijte sredstva finansiranje putem ugovora o sponzorisanju istraživanja za istraživanje dugovečnosti](https://www.vitadao.com/) - [ResearchHub: objavite naučne rezultate i učestvujte u diskusiji sa kolegama](https://www.researchhub.com/) - [LabDAO: Istraživanja proteina u virtuelnom okruženju](https://alphafodl.vercel.app/) -- [dClimate API omogućava upite za klimatske podatke koji su prikupljeni od strane decentralizovane zajednice](https://api.dclimate.net/) +- [dClimate API omogućava upite za klimatske podatke koji su prikupljeni od strane decentralizovane zajednice](https://www.dclimate.net/) - [DeSci fondacija: DeSci alat za izgradnju sistema za objavljivanje](https://descifoundation.org/) - [DeSci.World: jedno mesto za korisnike da vide i učestvuju u decentralizovanoj nauci](https://desci.world) - [OceanDAO: finansiranje kojim upravlja DAO za nauku povezanu sa podacima](https://oceanprotocol.com/) diff --git a/public/content/translations/tl/desci/index.md b/public/content/translations/tl/desci/index.md index e96aac69458..9bbab2696c2 100644 --- a/public/content/translations/tl/desci/index.md +++ b/public/content/translations/tl/desci/index.md @@ -96,7 +96,7 @@ Tingnan ang mga proyekto at sumali sa komunidad ng DeSci. - [VitaDAO: makatanggap ng pondo sa pamamagitan ng mga sponsored na research agreement para sa longevity research](https://www.vitadao.com/) - [ResearchHub: mag-post ng resulta ng siyentipikong pag-aaral at makipag-usap sa mga kapwa mananaliksik](https://www.researchhub.com/) - [LabDAO: mag-fold ng protein in-silico](https://alphafodl.vercel.app/) -- [dClimate API: mag-query ng data ng klima na kinolekta ng desentralisadong komunidad](https://api.dclimate.net/) +- [dClimate API: mag-query ng data ng klima na kinolekta ng desentralisadong komunidad](https://www.dclimate.net/) - [DeSci Foundation: builder ng tool sa paglalathala ng DeSc](https://descifoundation.org/) - [DeSci.World: one-stop shop para tingnan at mag-engage ang mga user sa decentralized science](https://desci.world) - [OceanDAO: pagpopondo na pinapamahalaan ng decentralized autonomous organization (DAO) para sa agham na nauugnay sa data](https://oceanprotocol.com/) diff --git a/public/content/translations/tr/desci/index.md b/public/content/translations/tr/desci/index.md index 4ca4655191f..bb7d0da2a42 100644 --- a/public/content/translations/tr/desci/index.md +++ b/public/content/translations/tr/desci/index.md @@ -96,7 +96,7 @@ DeSci topluluğuna katılın ve gelişmelerden haberdar olun! - [VitaDAO: Uzun ömürlü araştırmalar için sponsorlu araştırma anlaşmalı yoluyla fon alın](https://www.vitadao.com/) - [ResearchHub: Bilimsel bir sonuç yayınlayın ve taraflarla iletişime geçin](https://www.researchhub.com/) - [LabDAO: in-silico proteinini katlayın](https://alphafodl.vercel.app/) -- [dClimate API: Merkeziyetsiz bir topluluk tarafından toplanmış iklim verilerini sorgulayın](https://api.dclimate.net/) +- [dClimate API: Merkeziyetsiz bir topluluk tarafından toplanmış iklim verilerini sorgulayın](https://www.dclimate.net/) - [DeSci Vakfı: DeSci yayınlama aracı oluşturucu](https://descifoundation.org/) - [DeSci.Dünyası: Kullanıcıların merkeziyetsiz bilimi görüntülemesi ve etkileşim kurması için tek adres](https://desci.world) - [OceanDAO: Veri ile ilgili bilimler için DAO tarafından yönetilen fonlama](https://oceanprotocol.com/) diff --git a/public/content/translations/uk/desci/index.md b/public/content/translations/uk/desci/index.md index d66347648d6..1480dbd7453 100644 --- a/public/content/translations/uk/desci/index.md +++ b/public/content/translations/uk/desci/index.md @@ -96,7 +96,7 @@ Web3 має потенціал розірвати цю несправну мод - [VitaDAO: отримуйте фінансування через угоди про спонсорські дослідження в галузі довголіття](https://www.vitadao.com/) - [ResearchHub: публікуйте наукові результати та беріть участь у розмовах із колегами](https://www.researchhub.com/) - [LabDAO: складіть білок in-silico](https://alphafodl.vercel.app/) -- [dClimate API: запитуйте кліматичні дані, зібрані децентралізованою спільнотою](https://api.dclimate.net/) +- [dClimate API: запитуйте кліматичні дані, зібрані децентралізованою спільнотою](https://www.dclimate.net/) - [DeSci Foundation: конструктор інструментів публікації DeSci](https://descifoundation.org/) - [DeSci.World: єдиний майданчик для перегляду та взаємодії з децентралізованою наукою](https://desci.world) - [OceanDAO: фінансування наукових проєктів, що стосуються даних, під управлінням DAO](https://oceanprotocol.com/) diff --git a/public/content/translations/yo/desci/index.md b/public/content/translations/yo/desci/index.md index ccf85f6630d..e35ebf34c9f 100644 --- a/public/content/translations/yo/desci/index.md +++ b/public/content/translations/yo/desci/index.md @@ -96,7 +96,7 @@ Awọn ojutu data Web3 to rorun ṣe atilẹyin awọn oju iṣẹlẹ loke ati - [VitaDAO: gba igbeowosile nipasẹ awọn adehun iwadii onigbọwọ fun iwadii igba pipe](https://www.vitadao.com/) - [ResearchHub: firanṣẹ abajade ijinle sayensi kan ki o ṣe ibaraẹnisọrọ pẹlu awọn ẹlẹgbẹ](https://www.researchhub.com/) - [LabDAO: ka puroteni sinu silico](https://alphafodl.vercel.app/) -- [dClimate API: data ibeere oju-ọjọ ti a gba nipasẹ agbegbe alailakoso](https://api.dclimate.net/) +- [dClimate API: data ibeere oju-ọjọ ti a gba nipasẹ agbegbe alailakoso](https://www.dclimate.net/) - [Ajo DeSci: Ohun elo kiko irinse atejade DeSci](https://descifoundation.org/) - [Aye DeSci: Ile itaja kan fun awon olumulo lati wo, ni ibasepo pelu sayensi alailakoso](https://desci.world) - [OceanDAO: DAO ṣe iṣakoso igbeowosile fun sayensi to ni ibatan pelu data](https://oceanprotocol.com/) diff --git a/public/content/translations/zh-tw/desci/index.md b/public/content/translations/zh-tw/desci/index.md index 64bb98268b8..5193b040481 100644 --- a/public/content/translations/zh-tw/desci/index.md +++ b/public/content/translations/zh-tw/desci/index.md @@ -96,7 +96,7 @@ Web3 廣泛試驗過去中心化自治組織和 Web3 開發的不同激勵模型 - [VitaDAO:藉由受贊助的長壽研究協議獲得資金](https://www.vitadao.com/) - [ResearchHub:發布科學成果並與同行交流](https://www.researchhub.com/) - [LabDAO:在電腦中折疊蛋白質](https://alphafodl.vercel.app/) -- [dClimate API:查詢去中心化社群收集的氣候數據](https://api.dclimate.net/) +- [dClimate API:查詢去中心化社群收集的氣候數據](https://www.dclimate.net/) - [DeSci Foundation:去中心化科研發表工具生成器](https://descifoundation.org/) - [DeSci.World:供使用者查看、參與去中心化科研的單一窗口](https://desci.world) - [OceanDAO:管理資料相關科學資金的去中心化自治組織](https://oceanprotocol.com/) diff --git a/public/content/translations/zh/desci/index.md b/public/content/translations/zh/desci/index.md index dc71bd7c419..0e7f42ffd2f 100644 --- a/public/content/translations/zh/desci/index.md +++ b/public/content/translations/zh/desci/index.md @@ -96,7 +96,7 @@ summaryPoint3: 它以开放科学运动为基础。 - [VitaDAO:通过赞助的研究协议获取资金用于长寿研究](https://www.vitadao.com/) - [ResearchHub:发表科学成果及与同行对话](https://www.researchhub.com/) - [LabDAO:仿真折叠蛋白质](https://alphafodl.vercel.app/) -- [dClimate 应用程序接口:查询由去中心化社区收集的气候数据](https://api.dclimate.net/) +- [dClimate 应用程序接口:查询由去中心化社区收集的气候数据](https://www.dclimate.net/) - [去中心化科学基金:去中心化出版工具构建者](https://descifoundation.org/) - [DeSci.World:用户浏览和参与去中心化科学的一站式商店](https://desci.world) - [OceanDAO:由去中心化自治组织管理的数据相关科学的拨款](https://oceanprotocol.com/) From e4a90600c547a76e3da22794ffa2802042e914ba Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 12:49:59 -0500 Subject: [PATCH 004/368] removing www from https://www.ethereum-magicians.org/, potentially a bad dns config CNAME or A Record for WWW at eth magicians --- public/content/translations/sl/governance/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/sl/governance/index.md b/public/content/translations/sl/governance/index.md index 811e6cb7ab3..a488ac646a1 100644 --- a/public/content/translations/sl/governance/index.md +++ b/public/content/translations/sl/governance/index.md @@ -86,7 +86,7 @@ Ta tok, čeprav zelo poenostavljen, daje pregled nad pomembnimi fazami za aktiva ### Razumevanje predhodnega dela {#prior-work} -EIP predlagatelji se morajo seznaniti z predhodnim delom in predlogi, preden ustvarijo EIP, ki bo lahko resno upoštevan za uvedbo na glavnem Ethereum omrežju. Na ta način upamo, da EIP prinese nekaj novega, kar še ni bilo predhodno zavrnjeno. Tri glavna mesta za raziskovanje tega so [EIP zbornik](https://github.com/ethereum/eips), [Ethereum čarovniki](https://www.ethereum-magicians.org/) in [ ethresear.ch](https://www.ethresear.ch/). +EIP predlagatelji se morajo seznaniti z predhodnim delom in predlogi, preden ustvarijo EIP, ki bo lahko resno upoštevan za uvedbo na glavnem Ethereum omrežju. Na ta način upamo, da EIP prinese nekaj novega, kar še ni bilo predhodno zavrnjeno. Tri glavna mesta za raziskovanje tega so [EIP zbornik](https://github.com/ethereum/eips), [Ethereum čarovniki](https://ethereum-magicians.org/) in [ethresear.ch](https://www.ethresear.ch/). ### Delovne skupine {#working-groups} From 012aea00073b649807bb285535ed59c0081e23c9 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 13:01:48 -0500 Subject: [PATCH 005/368] changing https://www.ethresear.ch/ to https://ethresear.ch/, potentially a bad dns config CNAME or A Record for WWW at https://ethresear.ch/ --- public/content/translations/sl/governance/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/sl/governance/index.md b/public/content/translations/sl/governance/index.md index a488ac646a1..63842758f7d 100644 --- a/public/content/translations/sl/governance/index.md +++ b/public/content/translations/sl/governance/index.md @@ -86,7 +86,7 @@ Ta tok, čeprav zelo poenostavljen, daje pregled nad pomembnimi fazami za aktiva ### Razumevanje predhodnega dela {#prior-work} -EIP predlagatelji se morajo seznaniti z predhodnim delom in predlogi, preden ustvarijo EIP, ki bo lahko resno upoštevan za uvedbo na glavnem Ethereum omrežju. Na ta način upamo, da EIP prinese nekaj novega, kar še ni bilo predhodno zavrnjeno. Tri glavna mesta za raziskovanje tega so [EIP zbornik](https://github.com/ethereum/eips), [Ethereum čarovniki](https://ethereum-magicians.org/) in [ethresear.ch](https://www.ethresear.ch/). +EIP predlagatelji se morajo seznaniti z predhodnim delom in predlogi, preden ustvarijo EIP, ki bo lahko resno upoštevan za uvedbo na glavnem Ethereum omrežju. Na ta način upamo, da EIP prinese nekaj novega, kar še ni bilo predhodno zavrnjeno. Tri glavna mesta za raziskovanje tega so [EIP zbornik](https://github.com/ethereum/eips), [Ethereum čarovniki](https://ethereum-magicians.org/) in [ethresear.ch](https://ethresear.ch/). ### Delovne skupine {#working-groups} From ac3abf043fa641aeb2f080d7cc76e6dd1663e570 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 13:02:20 -0500 Subject: [PATCH 006/368] changing https://www.unigrants.org/ to https://www.uniswapfoundation.org/ --- public/content/translations/ca/community/grants/index.md | 2 +- public/content/translations/id/community/grants/index.md | 2 +- public/content/translations/nl/community/grants/index.md | 2 +- public/content/translations/ro/community/grants/index.md | 2 +- public/content/translations/sl/community/grants/index.md | 2 +- public/content/translations/sw/community/grants/index.md | 2 +- public/content/translations/uk/community/grants/index.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/content/translations/ca/community/grants/index.md b/public/content/translations/ca/community/grants/index.md index 0c59f4dbe23..0844ae707ec 100644 --- a/public/content/translations/ca/community/grants/index.md +++ b/public/content/translations/ca/community/grants/index.md @@ -33,7 +33,7 @@ Aquests projectes han creat les seves pròpies subvencions per projectes enfocad - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ - [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) community_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _Ecosistema [The Graph](https://thegraph.com/)_ -- [Programa de subvencions Uniswap](https://www.unigrants.org/) – _Comunitat [Uniswap](https://uniswap.org/)_ +- [Programa de subvencions Uniswap](https://www.uniswapfoundation.org/) – _Comunitat [Uniswap](https://uniswap.org/)_ ## Finançament quadràtic {#quadratic-funding} diff --git a/public/content/translations/id/community/grants/index.md b/public/content/translations/id/community/grants/index.md index c96b28a81bc..623e02096bc 100644 --- a/public/content/translations/id/community/grants/index.md +++ b/public/content/translations/id/community/grants/index.md @@ -25,7 +25,7 @@ Program-program ini mendukung ekosistem Ethereum yang luas dengan menawarkan hib Proyek-proyek ini telah menciptakan hibah sendiri untuk proyek-proyek yang bertujuan untuk mengembangkan dan bereksperimen dengan teknologi sendiri. - [TheGraph](https://airtable.com/shrdfvnFvVch3IOVm) – _ekosistem [The Graph](https://thegraph.com/)_ -- [Program Hibah Uniswap](https://www.unigrants.org/) – _komunitas [Uniswap](https://uniswap.org/)_ +- [Program Hibah Uniswap](https://www.uniswapfoundation.org/) – _komunitas [Uniswap](https://uniswap.org/)_ - [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _Dana Ekosistem [Balancer](https://balancer.fi/)_ - [mStable](https://docs.mstable.org/advanced/grants-program) - _[komunitas](https://mstable.org/) mStable_ diff --git a/public/content/translations/nl/community/grants/index.md b/public/content/translations/nl/community/grants/index.md index df0c8a5f7b5..5d91c58b66f 100644 --- a/public/content/translations/nl/community/grants/index.md +++ b/public/content/translations/nl/community/grants/index.md @@ -34,7 +34,7 @@ Deze projecten hebben hun eigen beurzen gecreëerd voor projecten die gericht zi - [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/)-gemeenschap_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/)-ecosysteem_ - [UMA Grants Program](https://grants.umaproject.org/) - _[UMA](https://umaproject.org/)-ontwikkelaarsondersteuning_ -- [Uniswap Grants Program](https://www.unigrants.org/) - _[Uniswap](https://uniswap.org/)-gemeenschap_ +- [Uniswap Grants Program](https://www.uniswapfoundation.org/) - _[Uniswap](https://uniswap.org/)-gemeenschap_ ## Kwadratische financiering {#quadratic-funding} diff --git a/public/content/translations/ro/community/grants/index.md b/public/content/translations/ro/community/grants/index.md index 5ebacfbeaaf..eea32a40554 100644 --- a/public/content/translations/ro/community/grants/index.md +++ b/public/content/translations/ro/community/grants/index.md @@ -33,7 +33,7 @@ Aceste proiecte și-au creat propriile granturi pentru proiecte care vizează de - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ - [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) community_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/) ecosystem_ -- [Uniswap Grants Program](https://www.unigrants.org/) – _[Uniswap](https://uniswap.org/) community_ +- [Uniswap Grants Program](https://www.uniswapfoundation.org/) – _[Uniswap](https://uniswap.org/) community_ ## Finanțarea cuadratică {#quadratic-funding} diff --git a/public/content/translations/sl/community/grants/index.md b/public/content/translations/sl/community/grants/index.md index 31d895d2a3e..c1b5c3680f2 100644 --- a/public/content/translations/sl/community/grants/index.md +++ b/public/content/translations/sl/community/grants/index.md @@ -24,7 +24,7 @@ Te programi podpirajo širok Ethereum ekosistem s tem, da ponujajo finančne spo Te projekti so ustvarili svoje finančne spodbude za projekte, ki merijo proti razvoju in eksperimentiranju z lastnimi tehnologijami. - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/) ekosistem_ -- [Uniswap](https://www.unigrants.org/) – _[Uniswap](https://uniswap.org/) skupnost_ +- [Uniswap](https://www.uniswapfoundation.org/) – _[Uniswap](https://uniswap.org/) skupnost_ - [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) sklad ekosistema_ - [mStable](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) skupnost_ diff --git a/public/content/translations/sw/community/grants/index.md b/public/content/translations/sw/community/grants/index.md index be792a76287..1890a99ec46 100644 --- a/public/content/translations/sw/community/grants/index.md +++ b/public/content/translations/sw/community/grants/index.md @@ -31,7 +31,7 @@ Miradi hii imeunda misaada yao kwa miradi inayolenga kukuza na kujaribu teknoloj - [Shirika la Ruzuku ya Ikolojia ya Lido (LEGO)](https://lego.lido.fi/) - _hugharamia ikolojia ya [Lido](https://lido.fi/)_ - [Programu ya Ruzuku ya mStable](https://docs.mstable.org/advanced/grants-program) - _jamii ya [mStablei](https://mstable.org/)_ - [Grafu](https://airtable.com/shrdfvnFvVch3IOVm) - _Ikolojia ya [Grafu](https://thegraph.com/)_ -- [Programu ya Ruzuku za Uniswap](https://www.unigrants.org/) - _Jamii ya [Uniswap](https://uniswap.org/)_ +- [Programu ya Ruzuku za Uniswap](https://www.uniswapfoundation.org/) - _Jamii ya [Uniswap](https://uniswap.org/)_ ## Ufadhili wa Kwadratiki {#quadratic-funding} diff --git a/public/content/translations/uk/community/grants/index.md b/public/content/translations/uk/community/grants/index.md index 6b98a886191..167a50dfe94 100644 --- a/public/content/translations/uk/community/grants/index.md +++ b/public/content/translations/uk/community/grants/index.md @@ -35,7 +35,7 @@ lang: uk - [Програма грантів mStable](https://docs.mstable.org/advanced/grants-program) — _спільнота [mStable](https://mstable.org/)_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) — _екосистема [The Graph](https://thegraph.com/)_ - [Програма грантів UMA](https://grants.umaproject.org/) — _підтримка розробників від [UMA](https://umaproject.org/)_ -- [Програма грантів Uniswap](https://www.unigrants.org/) — _спільнота [Uniswap](https://uniswap.org/)_ +- [Програма грантів Uniswap](https://www.uniswapfoundation.org/) — _спільнота [Uniswap](https://uniswap.org/)_ ## Чотиричне фінансування {#quadratic-funding} From bb61fd2da44f7500ccec45cbed844ed1f013e484 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 13:22:13 -0500 Subject: [PATCH 007/368] removing dead link https://cointool.app/approve/eth --- public/content/guides/how-to-revoke-token-access/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/public/content/guides/how-to-revoke-token-access/index.md b/public/content/guides/how-to-revoke-token-access/index.md index ca5f76ce414..952437c999d 100644 --- a/public/content/guides/how-to-revoke-token-access/index.md +++ b/public/content/guides/how-to-revoke-token-access/index.md @@ -20,7 +20,6 @@ Several websites let you view and revoke smart contracts connected to your addre - [Ethallowance](https://ethallowance.com/) (Ethereum) - [Etherscan](https://etherscan.io/tokenapprovalchecker) (Ethereum) -- [Cointool](https://cointool.app/approve/eth) (multiple networks) - [Revoke](https://revoke.cash/) (multiple networks) - [Unrekt](https://app.unrekt.net/) (multiple networks) - [EverRevoke](https://everrise.com/everrevoke/) (multiple networks) From 052581f0a980f3c0d671e31a2a4780b248494ecf Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 13:36:16 -0500 Subject: [PATCH 008/368] updating https://www.xdaichain.com/ to https://www.gnosis.io/ --- .../translations/de/developers/docs/scaling/sidechains/index.md | 2 +- .../translations/id/developers/docs/scaling/sidechains/index.md | 2 +- .../translations/pl/developers/docs/scaling/sidechains/index.md | 2 +- .../translations/ro/developers/docs/scaling/sidechains/index.md | 2 +- .../translations/sl/developers/docs/scaling/sidechains/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/content/translations/de/developers/docs/scaling/sidechains/index.md b/public/content/translations/de/developers/docs/scaling/sidechains/index.md index f1463b7111c..b898566010c 100644 --- a/public/content/translations/de/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/de/developers/docs/scaling/sidechains/index.md @@ -28,7 +28,7 @@ Mehrere Projekte bieten Implementierungen von Sidechains, die Sie in Ihre dApps - [Polygon PoS](https://polygon.technology/solutions/polygon-pos) - [Skale](https://skale.network/) -- [Gnosis-Chain (ehemals xDai)](https://www.xdaichain.com/) +- [Gnosis-Chain (ehemals xDai)](https://www.gnosis.io/) ## Weiterführende Informationen {#further-reading} diff --git a/public/content/translations/id/developers/docs/scaling/sidechains/index.md b/public/content/translations/id/developers/docs/scaling/sidechains/index.md index c24a063799a..0b3c49ba3b9 100644 --- a/public/content/translations/id/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/id/developers/docs/scaling/sidechains/index.md @@ -28,7 +28,7 @@ Beberapa proyek menyediakan implementasi sidechain yang dapat Anda integrasikan - [Skale](https://skale.network/) - [POA Network](https://www.poa.network/) -- [Gnosis Chain (sebelumnya xDai)](https://www.xdaichain.com/) +- [Gnosis Chain (sebelumnya xDai)](https://www.gnosis.io/) ## Bacaan lebih lanjut {#further-reading} diff --git a/public/content/translations/pl/developers/docs/scaling/sidechains/index.md b/public/content/translations/pl/developers/docs/scaling/sidechains/index.md index 1f6bcf3a390..8d21ea012d4 100644 --- a/public/content/translations/pl/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/pl/developers/docs/scaling/sidechains/index.md @@ -28,7 +28,7 @@ Wiele projektów dostarcza implementacje łańcuchów bocznych, które można zi - [Skale](https://skale.network/) - [Sieć POA](https://www.poa.network/) -- [Gnosis Chain (formerly xDai)](https://www.xdaichain.com/) +- [Gnosis Chain (formerly xDai)](https://www.gnosis.io/) ## Dalsza lektura {#further-reading} diff --git a/public/content/translations/ro/developers/docs/scaling/sidechains/index.md b/public/content/translations/ro/developers/docs/scaling/sidechains/index.md index 7730be0b5de..ad9043889b6 100644 --- a/public/content/translations/ro/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/ro/developers/docs/scaling/sidechains/index.md @@ -28,7 +28,7 @@ Numeroase proiecte oferă implementări de lanțuri paralele pe care le puteți - [Polygon PoS](https://polygon.technology/solutions/polygon-pos) - [Skale](https://skale.network/) -- [Lanțul Gnosis (fost xDai)](https://www.xdaichain.com/) +- [Lanțul Gnosis (fost xDai)](https://www.gnosis.io/) ## Referințe suplimentare {#further-reading} diff --git a/public/content/translations/sl/developers/docs/scaling/sidechains/index.md b/public/content/translations/sl/developers/docs/scaling/sidechains/index.md index 9b820e0eddb..9951c8fed67 100644 --- a/public/content/translations/sl/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/sl/developers/docs/scaling/sidechains/index.md @@ -28,7 +28,7 @@ Več projektov zagotavlja implementacije stranskih verig, ki jih lahko integrira - [Polygon PoS](https://polygon.technology/solutions/polygon-pos) - [Skale](https://skale.network/) -- [Gnosis Chain (prej xDai)](https://www.xdaichain.com/) +- [Gnosis Chain (prej xDai)](https://www.gnosis.io/) ## Nadaljnje branje {#further-reading} From bad64b9d68890d67b0e07ea4d3876118b5a945b1 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 13:42:15 -0500 Subject: [PATCH 009/368] changing https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf to https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf --- public/content/developers/docs/scaling/index.md | 2 +- public/content/translations/cs/developers/docs/scaling/index.md | 2 +- public/content/translations/de/developers/docs/scaling/index.md | 2 +- .../translations/es/developers/docs/layer-2-scaling/index.md | 2 +- public/content/translations/es/developers/docs/scaling/index.md | 2 +- .../translations/fr/developers/docs/layer-2-scaling/index.md | 2 +- public/content/translations/fr/developers/docs/scaling/index.md | 2 +- .../translations/hu/developers/docs/layer-2-scaling/index.md | 2 +- public/content/translations/hu/developers/docs/scaling/index.md | 2 +- .../id/developers/docs/scaling/layer-2-rollups/index.md | 2 +- .../translations/it/developers/docs/layer-2-scaling/index.md | 2 +- public/content/translations/it/developers/docs/scaling/index.md | 2 +- public/content/translations/ja/developers/docs/scaling/index.md | 2 +- .../pl/developers/docs/scaling/layer-2-rollups/index.md | 2 +- .../content/translations/pt-br/developers/docs/scaling/index.md | 2 +- .../translations/ro/developers/docs/layer-2-scaling/index.md | 2 +- public/content/translations/ro/developers/docs/scaling/index.md | 2 +- public/content/translations/sl/developers/docs/scaling/index.md | 2 +- public/content/translations/tr/developers/docs/scaling/index.md | 2 +- .../content/translations/zh-tw/developers/docs/scaling/index.md | 2 +- public/content/translations/zh/developers/docs/scaling/index.md | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/public/content/developers/docs/scaling/index.md b/public/content/developers/docs/scaling/index.md index 748bfd50a22..ac6b08226ba 100644 --- a/public/content/developers/docs/scaling/index.md +++ b/public/content/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Note the explanation in the video uses the term "Layer 2" to refer to all off-c - [An Incomplete Guide to Rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Ethereum-powered ZK-Rollups: World Beaters](https://hackmd.io/@canti/rkUT0BD8K) - [Optimistic Rollups vs ZK Rollups](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-Knowledge Blockchain Scalability](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Why rollups + data shards are the only sustainable solution for high scalability](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [What kind of Layer 3s make sense?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Data Availability Or: How Rollups Learned To Stop Worrying And Love Ethereum](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/cs/developers/docs/scaling/index.md b/public/content/translations/cs/developers/docs/scaling/index.md index 2fa9e995282..f73b841b924 100644 --- a/public/content/translations/cs/developers/docs/scaling/index.md +++ b/public/content/translations/cs/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Upozornění: Ve videu je pojem „Vrstva 2“ používán k označení všech - [Neúplný průvodce rollupy](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Ethereum-powered ZK-Rollups: Světoví šampioni](https://hackmd.io/@canti/rkUT0BD8K) - [Optimistické rollupy vs ZK Rollupy](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-Knowledge Blockchain Scalability](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Proč jsou rollupy + data shards jediným udržitelným řešením vysoké škálovatelnosti](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [Jaké vrstvy 3 dávají smysl?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Dostupnost dat: Jak se rollupy přestaly bát a začaly milovat Ethereum](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/de/developers/docs/scaling/index.md b/public/content/translations/de/developers/docs/scaling/index.md index d695b905290..ea77f5587b6 100644 --- a/public/content/translations/de/developers/docs/scaling/index.md +++ b/public/content/translations/de/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Beachten Sie, dass in der Erklärung im Video der Begriff „Layer 2" für alle - [Ein unvollständiger Leitfaden für Rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Ethereum-betriebene ZK-Rollups: Weltmeister](https://hackmd.io/@canti/rkUT0BD8K) - [Optimistische Rollups ggü. ZK-Rollups](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Zero-Knowledge Blockchain Skalierung](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-Knowledge Blockchain Skalierung](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Warum Rollups + Daten-Shards die einzige nachhaltige Lösung für hohe Skalierbarkeit sind](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) _Kennen Sie eine Community Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/es/developers/docs/layer-2-scaling/index.md b/public/content/translations/es/developers/docs/layer-2-scaling/index.md index 89d641607c4..ca619083a4e 100644 --- a/public/content/translations/es/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/es/developers/docs/layer-2-scaling/index.md @@ -218,7 +218,7 @@ Combinan las mejores partes de las tecnologías múltiples de capa 2 y pueden of - [Validium y la capa 2, número 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) - [Evaluación de soluciones de escala de la capa 2 de Ethereum: Una estructura de comparación](https://blog.matter-labs.io/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) - [Adición del Rollup de la Prueba de participación híbrida a la plataforma de la capa 2 de Celer en Ethereum](https://medium.com/celer-network/adding-hybrid-pos-rollup-sidechain-to-celers-coherent-layer-2-platform-d1d3067fe593) -- [Escalabilidad de la blockchain de conocimiento cero](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Escalabilidad de la blockchain de conocimiento cero](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) **Canales de estado** diff --git a/public/content/translations/es/developers/docs/scaling/index.md b/public/content/translations/es/developers/docs/scaling/index.md index def316ea37c..759b7038070 100644 --- a/public/content/translations/es/developers/docs/scaling/index.md +++ b/public/content/translations/es/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Obsérvese que la explicación del video utiliza el término "Capa 2" para refe - [Guía incompleta sobre los rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Rollups de conocimiento cero (ZK) con tecnología de Ethereum: los mejores del mundo](https://hackmd.io/@canti/rkUT0BD8K) - [Rollups optimistas vs. rollups de conocimiento cero (ZK)](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Escalabilidad de la cadena de bloques de conocimiento cero](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Escalabilidad de la cadena de bloques de conocimiento cero](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Por qué los rollups y los fragmentos de datos son la única solución sustentable para la alta escalabilidad](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [¿Qué tipo de capas 3 tienen sentido?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Disponibilidad de datos o: cómo los rollups aprendieron a dejar de preocuparse y amar a Ethereum](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/fr/developers/docs/layer-2-scaling/index.md b/public/content/translations/fr/developers/docs/layer-2-scaling/index.md index d6cca8c9573..87f9492a049 100644 --- a/public/content/translations/fr/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/fr/developers/docs/layer-2-scaling/index.md @@ -218,7 +218,7 @@ Combine les meilleures parties des multiples technologies de couche 2, et peut o - [Validium et The Layer 2 Two-By-Two - Numéro 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) - [Evaluating Ethereum layer 2 Scaling Solutions: A Comparison Framework](https://blog.matter-labs.io/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) - [Ajout de la chaîne latérale hybride PoS-Rollup à la plateforme Coherent Layer-2 de Celer sur Ethereum](https://medium.com/celer-network/adding-hybrid-pos-rollup-sidechain-to-celers-coherent-layer-2-platform-d1d3067fe593) -- [Évolutivité de la blockchain ZK](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Évolutivité de la blockchain ZK](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) **Canaux d'états** diff --git a/public/content/translations/fr/developers/docs/scaling/index.md b/public/content/translations/fr/developers/docs/scaling/index.md index 059f2b06688..1f5173d04a7 100644 --- a/public/content/translations/fr/developers/docs/scaling/index.md +++ b/public/content/translations/fr/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Notez que l’explication dans la vidéo utilise le terme « Couche 2 » pour - [Un guide incomplet pour les rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Rollups ZK alimentés par Ethereum : Wolrd Beaters](https://hackmd.io/@canti/rkUT0BD8K) - [Rollups optimisés vs Rollups ZK](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Évolutivité de la blockchain ZK](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Évolutivité de la blockchain ZK](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Pourquoi les rollups + les data shards sont les seules solutions durables pour une grande évolutivité](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [Quels types de couches 3 ont un sens ?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Disponibilité des données ou : Comment les Rollups ont appris à ne plus s'inquiéter et à aimer Ethereum](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/hu/developers/docs/layer-2-scaling/index.md b/public/content/translations/hu/developers/docs/layer-2-scaling/index.md index 8b95affd73a..f6370a99cff 100644 --- a/public/content/translations/hu/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/hu/developers/docs/layer-2-scaling/index.md @@ -218,7 +218,7 @@ Kombinálja a többrétegű technológiák legjobb tulajdonságait, és konfigur - [Validium And The Layer 2 Two-By-Two — Issue No. 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) - [Evaluating Ethereum layer 2 Scaling Solutions: A Comparison Framework](https://blog.matter-labs.io/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) - [Adding Hybrid PoS-Rollup Sidechain to Celer’s Coherent Layer-2 Platform on Ethereum](https://medium.com/celer-network/adding-hybrid-pos-rollup-sidechain-to-celers-coherent-layer-2-platform-d1d3067fe593) -- [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-Knowledge Blockchain Scalability](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) **Állapot csatornák** diff --git a/public/content/translations/hu/developers/docs/scaling/index.md b/public/content/translations/hu/developers/docs/scaling/index.md index 0b8d716bf50..5a197f38202 100644 --- a/public/content/translations/hu/developers/docs/scaling/index.md +++ b/public/content/translations/hu/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Vegye figyelembe, hogy a videóban szereplő magyarázat az L2 kifejezést hasz - [Egy nem teljeskörű útmutató az összevont tranzakciókhoz](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Ethereum-alapú ZK összevont tranzakciók: világverők](https://hackmd.io/@canti/rkUT0BD8K) - [Az optimista összevont tranzakciók és a ZK összevont tranzakciók összehasonlítása](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Zero-knowledge blokklánc skálázhatósága](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-knowledge blokklánc skálázhatósága](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Miért az összevont tranzakciók és az adatmegosztások (sharding) adják az egyetlen fenntartható megoldást a nagyfokú skálázhatósághoz](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [Milyen L3 megoldásoknak van értelme?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Adatelérhetőség vagy hogyan tanulták meg az összevont tranzakciók, hogy ne aggódjanak és szeressék az Ethereumot](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md b/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md index b9f546be0c7..a7832cfbfaf 100644 --- a/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md +++ b/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md @@ -131,7 +131,7 @@ Solusi hibrida ada dengan menggabungkan bagian terbaik dari berbagai teknologi l - [Panduan Tidak Lengkap tentang Rollup](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Rollup Optimistic vs Rollup ZK](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Skalabilitas Blockchain Zero-Knowledge](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Skalabilitas Blockchain Zero-Knowledge](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Alasan rollup + shard data merupakan satu-satunya solusi berkelanjutan untuk penskalaan tinggi](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [Rollup ZK yang digerakkan Ethereum: Yang Terbaik di Kelasnya](https://hackmd.io/@canti/rkUT0BD8K) diff --git a/public/content/translations/it/developers/docs/layer-2-scaling/index.md b/public/content/translations/it/developers/docs/layer-2-scaling/index.md index c8282f8d6c6..62d6bf6757b 100644 --- a/public/content/translations/it/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/it/developers/docs/layer-2-scaling/index.md @@ -218,7 +218,7 @@ Combinano le parti migliori di diverse tecnologie di livello 2 e possono offrire - [Validium And The Layer 2 Two-By-Two — Issue No. 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) - [Evaluating Ethereum layer 2 Scaling Solutions: A Comparison Framework](https://blog.matter-labs.io/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) - [Adding Hybrid PoS-Rollup Sidechain to Celer’s Coherent Layer-2 Platform on Ethereum](https://medium.com/celer-network/adding-hybrid-pos-rollup-sidechain-to-celers-coherent-layer-2-platform-d1d3067fe593) -- [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-Knowledge Blockchain Scalability](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) **Canali di stato** diff --git a/public/content/translations/it/developers/docs/scaling/index.md b/public/content/translations/it/developers/docs/scaling/index.md index c8d85afee11..77e273bea8e 100644 --- a/public/content/translations/it/developers/docs/scaling/index.md +++ b/public/content/translations/it/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Si noti che la spiegazione nel video usa il termine "Livello 2" per fare riferi - [Una guida incompleta ai rollup](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Rollup ZK basati su Ethereum: fuoriclasse a livello mondiale](https://hackmd.io/@canti/rkUT0BD8K) - [Rollup ottimistici vs Rollup ZK](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Scalabilità della blockchain a conoscenza zero](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Scalabilità della blockchain a conoscenza zero](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Perché i rollup e i frammenti di dati sono la sola soluzione sostenibile per un'elevata scalabilità](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [Che tipo di Livelli 3 hanno senso?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Disponibilità dei dati, ovvero come i rollup hanno imparato a smettere di preoccuparsi e ad amare Ethereum](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/ja/developers/docs/scaling/index.md b/public/content/translations/ja/developers/docs/scaling/index.md index 112c36d8eb3..9c10ecb7426 100644 --- a/public/content/translations/ja/developers/docs/scaling/index.md +++ b/public/content/translations/ja/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _この動画の説明では、「レイヤー2」という用語をオフチェ - [ロールアップに関する不完全ガイド](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [イーサリアムを活用したゼロ知識ロールアップ:ワールドビーター](https://hackmd.io/@canti/rkUT0BD8K) - [オプティミスティック・ロールアップ とゼロ知識ロールアップの比較](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [ゼロ知識によるブロックチェーンのスケーラビリティ](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [ゼロ知識によるブロックチェーンのスケーラビリティ](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [ロールアップとデータシャードを組み合わせる手段が、高スケーラビリティを実現する唯一のサステナブルなソリューションである理由](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [有意義なレイヤー3とはどのようなものか?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [データ可用性か、あるいは: ロールアップで心配することを止めてイーサリアムを愛するようになった仕組み](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md b/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md index 3061e01915e..b2ac35e140b 100644 --- a/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md +++ b/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md @@ -118,7 +118,7 @@ Istnieją rozwiązania hybrydowe, które łączą w sobie najlepsze elementy wie ## Dalsza lektura {#further-reading} - [Niekompletny przewodnik po pakietach zbiorczych](https://vitalik.eth.limo/general/2021/01/05/rollup.html) -- [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-Knowledge Blockchain Scalability](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) **Pakiety zbiorcze ZK** diff --git a/public/content/translations/pt-br/developers/docs/scaling/index.md b/public/content/translations/pt-br/developers/docs/scaling/index.md index 46333e5567c..d1e3b96c831 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Observe que a explicação no vídeo usa o termo “Camada 2" para se referir a - [Um guia incompleto sobre rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Ethereum com tecnologia de ZK-Rollups: campeões do mundo](https://hackmd.io/@canti/rkUT0BD8K) - [Optimistic Rollups vs ZK Rollups](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Dimensionamento blockchain de conhecimento zero](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Dimensionamento blockchain de conhecimento zero](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Por que os rollups, junto com as fragmentações dos dados, são a única solução sustentável para atingir alto dimensionamento](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [Que tipo de camada 3 faz sentido?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Disponibilidade de dados ou: como os rollups aprenderam a parar de se preocupar e amar o Ethereum](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/ro/developers/docs/layer-2-scaling/index.md b/public/content/translations/ro/developers/docs/layer-2-scaling/index.md index ef91e21e790..226c3efd703 100644 --- a/public/content/translations/ro/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/ro/developers/docs/layer-2-scaling/index.md @@ -218,7 +218,7 @@ Combină cele mai bune părți ale mai multor tehnologii de nivel 2 și pot ofer - [Validium And The Layer 2 Two-By-Two — Issue No. 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) - [Evaluating Ethereum layer 2 Scaling Solutions: A Comparison Framework](https://blog.matter-labs.io/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) - [Adding Hybrid PoS-Rollup Sidechain to Celer’s Coherent Layer-2 Platform on Ethereum](https://medium.com/celer-network/adding-hybrid-pos-rollup-sidechain-to-celers-coherent-layer-2-platform-d1d3067fe593) -- [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-Knowledge Blockchain Scalability](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) **Canale de stare** diff --git a/public/content/translations/ro/developers/docs/scaling/index.md b/public/content/translations/ro/developers/docs/scaling/index.md index c2e7baf5bd8..f2537d5a6f6 100644 --- a/public/content/translations/ro/developers/docs/scaling/index.md +++ b/public/content/translations/ro/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Rețineți că explicația din videoclip folosește termenul "Nivelul 2" pentru - [Un ghid incomplet pentru rollup-uri](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [ZK-rollup-urile acţionate de Ethereum: campionii lumii](https://hackmd.io/@canti/rkUT0BD8K) - [Rollup-urile Optimistic în comparaţie cu ZK Rollup-urile](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Zero-Knowledge Blockchain Scalability](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [De ce rollup-urile + fragmentele de date sunt singura soluție sustenabilă pentru o scalabilitate ridicată](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) _Cunoașteți o resursă a comunității care v-a ajutat? Editaţi această pagină și adăugaţi-o!_ diff --git a/public/content/translations/sl/developers/docs/scaling/index.md b/public/content/translations/sl/developers/docs/scaling/index.md index 59830be24f7..08990f903e4 100644 --- a/public/content/translations/sl/developers/docs/scaling/index.md +++ b/public/content/translations/sl/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Upoštevajte, da razlaga v videu izraz "plast 2" uporablja za naslavljanje vseh - [Nepopoln vodnik po zvitkih](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [ZK-zvitki, ki jih poganja Ethereum: World Beaters](https://hackmd.io/@canti/rkUT0BD8K) - [Optimistični zvitki proti ZK-zvitkom](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Razširljivost blokovne verige brez znanja](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Razširljivost blokovne verige brez znanja](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Zakaj so zvitki + podatkovni drobci edina primerna rešitev za visoko razširljivost](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) _Poznate vir iz skupnosti, ki vam je pomagal? Uredite to stran in ga dodajte!_ diff --git a/public/content/translations/tr/developers/docs/scaling/index.md b/public/content/translations/tr/developers/docs/scaling/index.md index 5f4023bcb82..a1dce199fe2 100644 --- a/public/content/translations/tr/developers/docs/scaling/index.md +++ b/public/content/translations/tr/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _Videodaki açıklamanın "Katman 2" terimini tüm zincir dışı ölçeklendirm - [Toplamalar için Tamamlanmamış Bir Kılavuz](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Ethereum destekli ZK-Toplamaları: Dünya Liderleri](https://hackmd.io/@canti/rkUT0BD8K) - [İyimser Toplamalar ile ZK Toplamalarının Karşılaştırması](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Sıfır Bilgi Blok Zinciri Ölçeklendirilebilirliği](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [Sıfır Bilgi Blok Zinciri Ölçeklendirilebilirliği](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Toplamalar + veri parçalarının, yüksek ölçeklenebilirlik için tek sürdürülebilir çözüm olma nedeni](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [Hangi tür Katman 3'ler kulağa mantıklı geliyor?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Veri Kullanılabilirliği veya: Toplamalar Endişelenmeyi Bırakıp Ethereum'u Sevmeyi Nasıl Öğrendi?](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/zh-tw/developers/docs/scaling/index.md b/public/content/translations/zh-tw/developers/docs/scaling/index.md index 9492e146824..ea1de90af60 100644 --- a/public/content/translations/zh-tw/developers/docs/scaling/index.md +++ b/public/content/translations/zh-tw/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _請注意,此影片中的解釋使用「二層網路」指代所有鏈外擴 - [卷軸之不完整指南](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [以太坊驅動的零知識證明卷軸:業界佼佼者](https://hackmd.io/@canti/rkUT0BD8K) - [樂觀卷軸與零知識證明卷軸](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [零知識區塊鏈可擴展性](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [零知識區塊鏈可擴展性](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [爲什麽說卷軸 + 資料分片是提高可擴展性的唯一可持續解決方案](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [什麽類型的三層網路才有意義?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [資料可用性或:卷軸如何學會停止擔憂並熱愛以太坊](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) diff --git a/public/content/translations/zh/developers/docs/scaling/index.md b/public/content/translations/zh/developers/docs/scaling/index.md index b8e1be345e5..7ad29f14029 100644 --- a/public/content/translations/zh/developers/docs/scaling/index.md +++ b/public/content/translations/zh/developers/docs/scaling/index.md @@ -106,7 +106,7 @@ _请注意,视频中的解释使用“二层网络”这一术语指代所有 - [卷叠不完全指南](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [以太坊赋能的零知识卷叠:强者](https://hackmd.io/@canti/rkUT0BD8K) - [“乐观卷叠”对比“零知识卷叠”](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [零知识区块链的可扩展性](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) +- [零知识区块链的可扩展性](https://www.archblock.com/poland/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [为什么卷叠 + 数据分片是高可扩展性的唯一可持续的解决办法](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [什么类型的三层网络有意义?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [数据可用性或:卷叠如何学会停止担忧并爱上以太坊](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) From 91b5cef00e22eef626352c5cc348d7326b739c02 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 13:45:15 -0500 Subject: [PATCH 010/368] changing https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum to https://www.bankless.com/the-essential-guide-to-arbitrum --- .../developers/docs/scaling/optimistic-rollups/index.md | 4 ++-- .../cs/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../de/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../es/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../fr/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../hu/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../id/developers/docs/scaling/layer-2-rollups/index.md | 2 +- .../it/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../ja/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../pt-br/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../ro/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../sl/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../tr/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../zh-tw/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../zh/developers/docs/scaling/optimistic-rollups/index.md | 2 +- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/public/content/developers/docs/scaling/optimistic-rollups/index.md b/public/content/developers/docs/scaling/optimistic-rollups/index.md index 6f63404d13e..1c67359da68 100644 --- a/public/content/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/developers/docs/scaling/optimistic-rollups/index.md @@ -96,7 +96,7 @@ In the context of optimistic rollups, `calldata` is used to send compressed tran Here is [an example](https://etherscan.io/tx/0x9102bfce17c58b5fc1c974c24b6bb7a924fb5fbd7c4cd2f675911c27422a5591) of a rollup batch submission to show how this concept works. The sequencer invoked the `appendSequencerBatch()` method and passed the compressed transaction data as inputs using `calldata`. -Some rollups now use blobs to post batches of transactions to Ethereum. +Some rollups now use blobs to post batches of transactions to Ethereum. Blobs are non-modifiable and non-persistent (just like `calldata`) but are pruned from history after ~18 days. For more information on blobs, see [Danksharding](/roadmap/danksharding). @@ -257,7 +257,7 @@ More of a visual learner? Watch Finematics explain optimistic rollups: - [How do optimistic rollups work (The Complete guide)](https://www.alchemy.com/overviews/optimistic-rollups) - [What is a Blockchain Rollup? A Technical Introduction](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [The Essential Guide to Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [The Essential Guide to Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [How does Optimism's Rollup really work?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [What is the Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/cs/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/cs/developers/docs/scaling/optimistic-rollups/index.md index 1eec9550cb1..7daea8babff 100644 --- a/public/content/translations/cs/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/cs/developers/docs/scaling/optimistic-rollups/index.md @@ -258,7 +258,7 @@ Učíte se spíše vizuálně? Podívejte se na video od Finematics, které vysv - [Jak fungují optimistické rollupy (kompletní průvodce)](https://www.alchemy.com/overviews/optimistic-rollups) - [Co je to Blockchain Rollup? Technický úvod](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Zásadní průvodce pro Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Zásadní průvodce pro Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Jak skutečně funguje rollup od Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [Hloubkový rozbor OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [Co je to Virtuální stroj Optimistic?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md index 188ba708d95..f4cac17ca0d 100644 --- a/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md @@ -45,6 +45,6 @@ Sehen Sie, wie Finematics optimistische Rollups erklärt: **Optimistische Rollups verstehen** -- [Der Leitfaden zu Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Der Leitfaden zu Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Wie funktioniert das Rollup von Optimismus wirklich?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) diff --git a/public/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md index 73b587c69ae..860a6a4a184 100644 --- a/public/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ Se espera que la introducción de la [fragmentación de datos](/roadmap/dankshar - [¿Cómo funcionan los rollups optimistas? (La guía completa)](https://www.alchemy.com/overviews/optimistic-rollups) - [¿Qué es un rollup de cadena de bloques?: introducción técnica](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Guía esencial sobre Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Guía esencial sobre Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [¿Cómo funcionan realmente los rollup optimistas?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [Análisis detallado de OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [¿Qué es la máquina virtual optimista?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md index 83c617fe414..62c55ffb451 100644 --- a/public/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ Davantage qu'un apprenant visuel ? Regardez Finematics expliquer les rollups opt - [Comment fonctionnent les rollups optimistes (Le guide complet)](https://www.alchemy.com/overviews/optimistic-rollups) - [Qu'est-ce qu'un rollup de blockchain ? Une introduction technique](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Le guide essentiel pour Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Le guide essentiel pour Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Comment fonctionne réellement le rollup d'Optimism ?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [Qu’est-ce que la machine virtuelle optimiste ?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/hu/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/hu/developers/docs/scaling/optimistic-rollups/index.md index 441912d26df..18ced537206 100644 --- a/public/content/translations/hu/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/hu/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ Az [adat sharding](/roadmap/danksharding/) bevezetése az Ethereumban várhatóa - [Hogyan működnek az optimista összevont tranzakciók (teljes útmutató)](https://www.alchemy.com/overviews/optimistic-rollups) - [Mi az a blokklánc összevont tranzakció? Technikai bevezetés](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Az alapvető útmutató az Arbitrumhoz](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Az alapvető útmutató az Arbitrumhoz](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Hogyan működik valójában az optimista összevont tranzakció?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [Az OVM részletes bemutatása](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [Mi az az optimista virtuális gép?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md b/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md index a7832cfbfaf..6d3997fab43 100644 --- a/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md +++ b/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md @@ -141,7 +141,7 @@ Solusi hibrida ada dengan menggabungkan bagian terbaik dari berbagai teknologi l **Rollup Optimistic** -- [Panduan Penting untuk Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Panduan Penting untuk Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Bagaimana Rollup Optimism benar-benar berfungsi?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) diff --git a/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md index a1f130cbcc4..6a7e12db336 100644 --- a/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ Preferisci un approccio visivo all'apprendimento? Guarda Finematics spiegare i r - [Come funzionano gli Optimistic Rollup (La guida completa)](https://www.alchemy.com/overviews/optimistic-rollups) - [Cos'è un rollup della blockchain? Un'introduzione tecnica](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Guida essenziale ad Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Guida essenziale ad Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Come funziona davvero il rollup di Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [Approfondimento su OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [What is the Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md index ecce9937e82..e06d4651a23 100644 --- a/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ ii. オプティミスティック・ロールアップを使用するデベロ - [オプティミスティック・ロールアップの仕組み(完全ガイド)](https://www.alchemy.com/overviews/optimistic-rollups) - [ブロックチェーンにおけるロールアップとは何か? 技術ガイド](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Arbitrumの基本ガイド](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Arbitrumの基本ガイド](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Optimismのロールアップはどのように機能するのか?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [OVMの詳細を学ぶ](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [オプティミスティック仮想マシンとは何か?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md index c4f12acb624..ce7f842e8f9 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ Você é o tipo de pessoa que aprende mais com recursos visuais? Assista aos Fin - [Como funcionam os optimistic rollups (o guia completo)](https://www.alchemy.com/overviews/optimistic-rollups) - [O que é uma Blockchain Rollup? Uma introdução técnica](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [O guia essencial do Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [O guia essencial do Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Como o optimistic rollup realmente funciona?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [OVM: aprofundamento](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [O que é a máquina virtual otimista?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md index cdd9c52cfd0..e69000d9410 100644 --- a/public/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md @@ -43,6 +43,6 @@ Urmăriți cum explică Finematics rollup-urile optimistic: **Optimistic rollups reading** -- [Ghidul esențial pentru Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Ghidul esențial pentru Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Cum funcționează cu adevărat Rollup-ul Optimistic?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) diff --git a/public/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md index cee5f52c95d..f535a88fd2d 100644 --- a/public/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md @@ -45,6 +45,6 @@ Oglejte si, kako Finematics razložijo optimistične zvitke: **Gradivo za branje o optimističnih zvitkih** -- [Ključni vodnik za Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Ključni vodnik za Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Kako zares deluje zvitek Optimizma?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [Globoki vpogled v OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) diff --git a/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md index 203414ae18a..65226e5a35e 100644 --- a/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ Görerek öğrenmeyi mi tercih ediyorsunuz? Finematics'in iyimser toplamalar hak - [İyimser toplamalar nasıl çalışır? (Tam klavuz)](https://www.alchemy.com/overviews/optimistic-rollups) - [Blokzincir Toplaması nedir? Teknik Giriş](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Temel Arbitrum Rehberi](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Temel Arbitrum Rehberi](https://www.bankless.com/the-essential-guide-to-arbitrum) - [Optimism'in Toplaması aslında nasıl çalışıyor?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [İyimser Sanal Makine nedir?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/zh-tw/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/zh-tw/developers/docs/scaling/optimistic-rollups/index.md index 7ee79f6b04f..5d5dc18f3ee 100644 --- a/public/content/translations/zh-tw/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/zh-tw/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ ii. 使用樂觀卷軸的開發者和專案團隊可以利用以太坊的基礎 - [樂觀卷軸如何運作(完整指引)](https://www.alchemy.com/overviews/optimistic-rollups) - [什麽是區塊鏈卷軸? (技術介紹)](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Arbitrum 之概要指引](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Arbitrum 之概要指引](https://www.bankless.com/the-essential-guide-to-arbitrum) - [樂觀卷軸究竟如何運作?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [樂觀虛擬機深入探索](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [什麽是樂觀虛擬機?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md index 8647f011d6e..f80c20dbb79 100644 --- a/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md @@ -257,7 +257,7 @@ ii. 使用乐观卷叠的开发者和项目团队可以利用以太坊的基础 - [乐观卷叠如何工作(完整指南)](https://www.alchemy.com/overviews/optimistic-rollups) - [什么是区块链卷叠? 技术介绍](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Arbitrum 基本指南](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Arbitrum 基本指南](https://www.bankless.com/the-essential-guide-to-arbitrum) - [乐观卷叠究竟如何工作?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) - [深入研究乐观虚拟机](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [什么是乐观虚拟机?](https://www.alchemy.com/overviews/optimistic-virtual-machine) From 72edd906d7d94bce4d405549b15684d29886b244 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 14:01:01 -0500 Subject: [PATCH 011/368] change https://treum.io/ to https://consensys.io/blog/consensys-acquires-treum --- public/content/translations/ar/enterprise/index.md | 2 +- public/content/translations/bn/enterprise/index.md | 2 +- public/content/translations/cs/enterprise/index.md | 2 +- public/content/translations/de/enterprise/index.md | 2 +- public/content/translations/fi/enterprise/index.md | 2 +- public/content/translations/id/enterprise/index.md | 2 +- public/content/translations/ko/enterprise/index.md | 2 +- public/content/translations/lt/enterprise/index.md | 2 +- public/content/translations/ml/enterprise/index.md | 2 +- public/content/translations/nb/enterprise/index.md | 2 +- public/content/translations/pl/enterprise/index.md | 2 +- public/content/translations/ro/enterprise/index.md | 2 +- public/content/translations/se/enterprise/index.md | 2 +- public/content/translations/sk/enterprise/index.md | 2 +- public/content/translations/uk/enterprise/index.md | 2 +- public/content/translations/vi/enterprise/index.md | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/public/content/translations/ar/enterprise/index.md b/public/content/translations/ar/enterprise/index.md index aa738ec4be7..50ae7884886 100644 --- a/public/content/translations/ar/enterprise/index.md +++ b/public/content/translations/ar/enterprise/index.md @@ -73,7 +73,7 @@ lang: ar ### الأدوات {#tooling} - [Alethio](https://explorer.aleth.io/) _منصة لتحليل البيانات بواسطة إيثريوم_ -- [Treum](https://treum.io/) _جلب الشفافية وقابلية التتبع وقابلية الإتجار لسلالس الإمداد، باستخدام تقنية سلسلة الكتل_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _جلب الشفافية وقابلية التتبع وقابلية الإتجار لسلالس الإمداد، باستخدام تقنية سلسلة الكتل_ ## المجتمع المؤسسي للمطورين {#enterprise-developer-community} diff --git a/public/content/translations/bn/enterprise/index.md b/public/content/translations/bn/enterprise/index.md index 6871e8aa31c..9c817a14f10 100644 --- a/public/content/translations/bn/enterprise/index.md +++ b/public/content/translations/bn/enterprise/index.md @@ -74,7 +74,7 @@ lang: bn ### টুলিং {#tooling} - [Alethio](https://explorer.aleth.io/) _ইথেরিয়াম ডেটা অ্যানালিটিক্স প্ল্যাটফর্ম_ -- [Treum](https://treum.io/) _ব্লকচেইন প্রযুক্তি ব্যবহার করে সাপ্লাই চেইনের ক্ষেত্রে স্বচ্ছতা, ট্রেসেবিলিটি এবং ব্যবসায়যোগ্যতা নিয়ে আসে_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _ব্লকচেইন প্রযুক্তি ব্যবহার করে সাপ্লাই চেইনের ক্ষেত্রে স্বচ্ছতা, ট্রেসেবিলিটি এবং ব্যবসায়যোগ্যতা নিয়ে আসে_ ## এন্টারপ্রাইজ ডেভেলপার সম্প্রদায় {#enterprise-developer-community} diff --git a/public/content/translations/cs/enterprise/index.md b/public/content/translations/cs/enterprise/index.md index 4d767e5ceaf..63808c7f2a3 100644 --- a/public/content/translations/cs/enterprise/index.md +++ b/public/content/translations/cs/enterprise/index.md @@ -74,7 +74,7 @@ Veřejné a soukromé Ethereum sítě mohou v závislosti na tom, kdo je použí ### Nástroje {#tooling} - [Alethio](https://explorer.aleth.io/) _Datově analytická platforma pro Ethereum_ -- [Treum](https://treum.io/) _pomocí technologie blockchainu přináší transparentnost, dohledatelnost a obchodovatelnost dodavatelským řetězcům_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _pomocí technologie blockchainu přináší transparentnost, dohledatelnost a obchodovatelnost dodavatelským řetězcům_ ## Komunita vývojářů funkcí pro firmy {#enterprise-developer-community} diff --git a/public/content/translations/de/enterprise/index.md b/public/content/translations/de/enterprise/index.md index a111ef40c17..01e88868289 100644 --- a/public/content/translations/de/enterprise/index.md +++ b/public/content/translations/de/enterprise/index.md @@ -141,7 +141,7 @@ Nachfolgend werden einige der Anwendungen für Unternehmen aufgelistet, die bisl - [Minespider](https://www.minespider.com/) _Lieferketten-Tracking_ - [Folge unseren Fasern](https://www.followourfibre.com) _Viskose-Lieferkettenverfolgbarkeit_ - [EY OpsChain Netzwerkbeschaffung](https://blockchain.ey.com/products/contract-manager) _bietet einen Beschaffungsworkflow durch die Ausgabe von RFQs, Verträgen, Bestellungen und Rechnungen in Ihrem Netzwerk vertrauenswürdiger Geschäftspartner_ -- [Treum](https://treum.io/) _bringt Transparenz, Rückverfolgbarkeit und Handelbarkeit in Lieferketten mithilfe der Blockchain-Technologie_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _bringt Transparenz, Rückverfolgbarkeit und Handelbarkeit in Lieferketten mithilfe der Blockchain-Technologie_ - [TradeTrust](https://www.tradetrust.io/) _überprüft elektronische Frachtbriefe (eBLs) für den internationalen Versand_ ### Referenzen und Zertifizierungen {#credentials} diff --git a/public/content/translations/fi/enterprise/index.md b/public/content/translations/fi/enterprise/index.md index e4548446971..79f891d4b18 100644 --- a/public/content/translations/fi/enterprise/index.md +++ b/public/content/translations/fi/enterprise/index.md @@ -74,7 +74,7 @@ Julkiset ja yksityiset Ethereum-verkot saattavat tarvita tiettyjä ominaisuuksia ### Työkalut {#tooling} - [Alethio](https://explorer.aleth.io/) _Ethereumin data-analytiikka-alusta_ -- [Treum](https://treum.io/) _tuo läpinäkyvyyttä, jäljitettävyyttä ja vaihdettavuutta toimitusketjuille lohkoketjuteknologiaa hyödyntäen_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _tuo läpinäkyvyyttä, jäljitettävyyttä ja vaihdettavuutta toimitusketjuille lohkoketjuteknologiaa hyödyntäen_ ## Yrityskehitysyhteisö {#enterprise-developer-community} diff --git a/public/content/translations/id/enterprise/index.md b/public/content/translations/id/enterprise/index.md index 828f37a9197..ec7e81fac16 100644 --- a/public/content/translations/id/enterprise/index.md +++ b/public/content/translations/id/enterprise/index.md @@ -141,7 +141,7 @@ Berikut adalah beberapa aplikasi perusahaan yang telah digunakan pada Jaringan U - [ShipChain](https://shipchain.io) _sidechain Ethereum publik dan sistem perusahaan untuk visibilitas dan kepercayaan rantai pasokan, khususnya untuk logistik multimodal_ - [Follow Our Fibre](https://www.followourfibre.com) _keterlacakan rantai pasokan viscose_ - [Pengadaan Jaringan EY OpsChain](https://blockchain.ey.com/products/contract-manager) _memungkinkan perusahaan terlibat dalam sebuah alur kerja pengadaan dengan menerbitkan RFQ, kontrak, pemesanan pembelian, dan faktur di keseluruhan jaringan dari rekan bisnis terpercaya Anda_ -- [Treum](https://treum.io/) _menghadirkan transparansi, keterlacakan, dan kemampuan untuk diperdagangan pada rantai pasokan, menggunakan teknologi blockchain_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _menghadirkan transparansi, keterlacakan, dan kemampuan untuk diperdagangan pada rantai pasokan, menggunakan teknologi blockchain_ - [TradeTrust](https://www.tradetrust.io/) _memverifikasi electronic Bills of Lading (eBLs) untuk pengiriman internasional_ ### Kredensial dan sertifikasi {#credentials} diff --git a/public/content/translations/ko/enterprise/index.md b/public/content/translations/ko/enterprise/index.md index 7a7833fbde7..c973e0284f1 100644 --- a/public/content/translations/ko/enterprise/index.md +++ b/public/content/translations/ko/enterprise/index.md @@ -74,7 +74,7 @@ sidebarDepth: 1 ### 툴링 {#tooling} - [Alethio](https://explorer.aleth.io/) _이더리움 데이터 분석 플랫폼_ -- [Treum](https://treum.io/) _블록체인 기술을 사용하여 공급망에 투명성, 추적성, 거래성 제공_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _블록체인 기술을 사용하여 공급망에 투명성, 추적성, 거래성 제공_ ## 엔터프라이즈 개발자 커뮤니티 {#enterprise-developer-community} diff --git a/public/content/translations/lt/enterprise/index.md b/public/content/translations/lt/enterprise/index.md index ba69c0b65b2..5be3cacc0fe 100644 --- a/public/content/translations/lt/enterprise/index.md +++ b/public/content/translations/lt/enterprise/index.md @@ -74,7 +74,7 @@ Viešiesiems ir privatiems Ethereum tinklams gali prireikti specifinių savybių ### Įrankinė {#tooling} - [Alethio](https://explorer.aleth.io/) _Ethereum duomenų analizės platforma_ -- [Treum](https://treum.io/) _naudojant blokų grandinės technologiją, tiekimo grandinėms suteikiamas skaidrumas, atsekamumas ir galimybė prekiauti _ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _naudojant blokų grandinės technologiją, tiekimo grandinėms suteikiamas skaidrumas, atsekamumas ir galimybė prekiauti _ ## Verslo kūrėjų bendruomenė {#enterprise-developer-community} diff --git a/public/content/translations/ml/enterprise/index.md b/public/content/translations/ml/enterprise/index.md index d4105992a3e..aee30f93280 100644 --- a/public/content/translations/ml/enterprise/index.md +++ b/public/content/translations/ml/enterprise/index.md @@ -73,7 +73,7 @@ Ethereum എന്റർപ്രൈസ് സൗഹൃദമാക്കുന ### ടൂളിംഗ് {#tooling} - [അലീത്തിയോ](https://explorer.aleth.io/) _Ethereum ഡാറ്റാ അനലിറ്റിക്സ് പ്ലാറ്റ്ഫോം _ -- [ട്രീം](https://treum.io/) _ ബ്ലോക്ക്ചെയിൻ സാങ്കേതികവിദ്യ ഉപയോഗിച്ച് ശൃംഖലകൾ വിതരണം ചെയ്യുന്നതിനുള്ള സുതാര്യത, കണ്ടെത്തൽ, വ്യാപാരം എന്നിവ കൊണ്ടുവരുന്നു _ +- [ട്രീം](https://consensys.io/blog/consensys-acquires-treum) _ ബ്ലോക്ക്ചെയിൻ സാങ്കേതികവിദ്യ ഉപയോഗിച്ച് ശൃംഖലകൾ വിതരണം ചെയ്യുന്നതിനുള്ള സുതാര്യത, കണ്ടെത്തൽ, വ്യാപാരം എന്നിവ കൊണ്ടുവരുന്നു _ ## എന്റർപ്രൈസ് ഡവലപ്പർ കമ്മ്യൂണിറ്റി {#enterprise-developer-community} diff --git a/public/content/translations/nb/enterprise/index.md b/public/content/translations/nb/enterprise/index.md index 7b088abae18..27c2b73dc3a 100644 --- a/public/content/translations/nb/enterprise/index.md +++ b/public/content/translations/nb/enterprise/index.md @@ -73,7 +73,7 @@ Offentlige og private Ethereum-nettverk kan trenge spesifikke funksjoner som kre ### Verktøy {#tooling} - [Alethio](https://explorer.aleth.io/) _Ethereum Data Analyse Platform_ -- [Treum](https://treum.io/) _bringer gjennomsiktighet, sporbarhet og evne til å forsyne kjeder, ved bruk av blokkjedeteknologi_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _bringer gjennomsiktighet, sporbarhet og evne til å forsyne kjeder, ved bruk av blokkjedeteknologi_ ## Fellesskap for bedriftsutviklere {#enterprise-developer-community} diff --git a/public/content/translations/pl/enterprise/index.md b/public/content/translations/pl/enterprise/index.md index 5fcf2c3e11f..7bc51c17afd 100644 --- a/public/content/translations/pl/enterprise/index.md +++ b/public/content/translations/pl/enterprise/index.md @@ -136,7 +136,7 @@ Oto niektóre aplikacje dla przedsiębiorstw, które zostały wdrożone w public - [ShipChain](https://shipchain.io) _publiczny łańcuch boczny Ethereum i system korporacyjny zapewniający widoczność i zaufanie łańcucha dostaw, zwłaszcza w przypadku logistyki multimodalnej_ - [Follow Our Fibre](https://www.followourfibre.com) _monitorowanie łańcucha dostaw wiskozy_ - [EY OpsChain Network Procurement](https://blockchain.ey.com/products/contract-manager) _umożliwia firmom angażowanie się w proces zamówień poprzez wystawianie zapytań ofertowych, umowy, zamówienia i faktury w Twojej sieci zaufanych partnerów biznesowych_ -- [Treum](https://treum.io/) _zapewnia przejrzystość, identyfikowalność i możliwość handlu w łańcuchach dostaw, wykorzystując technologię blockchain_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _zapewnia przejrzystość, identyfikowalność i możliwość handlu w łańcuchach dostaw, wykorzystując technologię blockchain_ ### Poświadczenia i certyfikaty {#credentials} diff --git a/public/content/translations/ro/enterprise/index.md b/public/content/translations/ro/enterprise/index.md index 3489c9b0ddb..9ac24401849 100644 --- a/public/content/translations/ro/enterprise/index.md +++ b/public/content/translations/ro/enterprise/index.md @@ -141,7 +141,7 @@ Iată câteva dintre aplicațiile pentru întreprinderi care au fost implementat - [ShipChain](https://shipchain.io) _lanț paralel public al lui Ethereum și sistem de întreprinderi pentru vizibilitatea și încrederea lanțului de aprovizionare, în special pentru logistica multi-modală_ - [Follow Our Fibre](https://www.followourfibre.com) _trasabilitatea lanțului de aprovizionare cu viscoză_ - [EY OpsChain Network Procurement](https://blockchain.ey.com/products/contract-manager) _permite companiilor să se angajeze într-un flux de lucru de achiziții publice prin emiterea de cereri de ofertă, contracte, ordine de cumpărare și facturi în rețeaua partenerilor dvs. de afaceri de încredere_ -- [Treum](https://treum.io/) _aduce transparență, trasabilitate și capacitate de comercializare în lanțurile de aprovizionare utilizând tehnologia blockchain_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _aduce transparență, trasabilitate și capacitate de comercializare în lanțurile de aprovizionare utilizând tehnologia blockchain_ - [TradeTrust](https://www.tradetrust.io/) _verifies electronic Bills of Lading (eBLs) for international shipping_ ### Acreditări și certificări {#credentials} diff --git a/public/content/translations/se/enterprise/index.md b/public/content/translations/se/enterprise/index.md index 55db98169ec..67301ac9642 100644 --- a/public/content/translations/se/enterprise/index.md +++ b/public/content/translations/se/enterprise/index.md @@ -73,7 +73,7 @@ Offentliga och privata Ethereum-nätverk kan behöva specifika funktioner som kr ### Verktyg {#tooling} - [Alethio](https://explorer.aleth.io/) _Ethereum Data Analytics Platform_ -- [Treum](https://treum.io/) _ger transparens, spårbarhet och handelsförmåga till försörjningskedjor, med hjälp av blockchain-teknik_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _ger transparens, spårbarhet och handelsförmåga till försörjningskedjor, med hjälp av blockchain-teknik_ ## Enterprise utvecklargemenskap {#enterprise-developer-community} diff --git a/public/content/translations/sk/enterprise/index.md b/public/content/translations/sk/enterprise/index.md index 0a7cf2e426f..24cf216a407 100644 --- a/public/content/translations/sk/enterprise/index.md +++ b/public/content/translations/sk/enterprise/index.md @@ -73,7 +73,7 @@ Verejné a súkromné ​​siete Etherea môžu potrebovať špecifické vlastn ### Nástroje {#tooling} - [Alethio](https://explorer.aleth.io/) _platforma na analýzu údajov Etherea_ -- [Treum](https://treum.io/) _prináša transparentnosť, sledovateľnosť a obchodovateľnosť pre dodávateľské reťazce pomocou technológie blockchain_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _prináša transparentnosť, sledovateľnosť a obchodovateľnosť pre dodávateľské reťazce pomocou technológie blockchain_ ## Komunita vývojárov pre podniky {#enterprise-developer-community} diff --git a/public/content/translations/uk/enterprise/index.md b/public/content/translations/uk/enterprise/index.md index 2a5f16adf1d..722910312d6 100644 --- a/public/content/translations/uk/enterprise/index.md +++ b/public/content/translations/uk/enterprise/index.md @@ -74,7 +74,7 @@ sidebarDepth: 1 ### Інструменти {#tooling} - [Alethio](https://explorer.aleth.io/) _— платформа для аналізу даних Ethereum_ -- [Treum](https://treum.io/) _забезпечує прозорість, можливості відстеження та реалізації ланцюгів поставок з використанням технології блокчейну_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _забезпечує прозорість, можливості відстеження та реалізації ланцюгів поставок з використанням технології блокчейну_ ## Спільнота розробників для корпоративного сектора {#enterprise-developer-community} diff --git a/public/content/translations/vi/enterprise/index.md b/public/content/translations/vi/enterprise/index.md index ac654ea89b8..039dd83cbb8 100644 --- a/public/content/translations/vi/enterprise/index.md +++ b/public/content/translations/vi/enterprise/index.md @@ -74,7 +74,7 @@ Mạng Ethereum công cộng và riêng tư có thể cần các tính năng c ### Bộ công cụ {#tooling} - [Alethio -](https://explorer.aleth.io/) _Nền tảng phân tích dữ liệu Ethereum_ -- [Treum](https://treum.io/) _mang lại tính minh bạch, truy xuất nguồn gốc và tính truyền thống cho chuỗi cung ứng, sử dụng công nghệ chuỗi khối_ +- [Treum](https://consensys.io/blog/consensys-acquires-treum) _mang lại tính minh bạch, truy xuất nguồn gốc và tính truyền thống cho chuỗi cung ứng, sử dụng công nghệ chuỗi khối_ ## Cộng đồng nhà phát triển doanh nghiệp {#enterprise-developer-community} From f63ec63d3d6b1c5cd7eab3d0779066f4189a87fe Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 14:06:37 -0500 Subject: [PATCH 012/368] changing https://www.goquorum.com/ to https://docs.goquorum.consensys.io/ - acquired by consensys https://consensys.io/blog/consensys-acquires-jpm-quorum --- public/content/translations/ar/enterprise/index.md | 2 +- public/content/translations/bn/enterprise/index.md | 2 +- public/content/translations/cs/enterprise/index.md | 2 +- public/content/translations/fi/enterprise/index.md | 2 +- public/content/translations/ko/enterprise/index.md | 2 +- public/content/translations/lt/enterprise/index.md | 2 +- public/content/translations/ml/enterprise/index.md | 2 +- public/content/translations/nb/enterprise/index.md | 2 +- public/content/translations/se/enterprise/index.md | 2 +- public/content/translations/sk/enterprise/index.md | 2 +- public/content/translations/uk/enterprise/index.md | 2 +- public/content/translations/vi/enterprise/index.md | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/content/translations/ar/enterprise/index.md b/public/content/translations/ar/enterprise/index.md index 50ae7884886..4ba9fc7155b 100644 --- a/public/content/translations/ar/enterprise/index.md +++ b/public/content/translations/ar/enterprise/index.md @@ -40,7 +40,7 @@ lang: ar - [Blockapps](https://blockapps.net/) _تنفيذ بروتوكول إيثريوم للمؤسسات وأدوات وAPIs من منصة STRATO_ - [Clearmatics](https://www.clearmatics.com/about) _بروتوكولات وبنية منصة نظراء، سلسلة كتل R&D للشركة_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _يوفر نفس ميزات ووظائف HF Besu، بالإضافة إلى فوائد إضافية تركز على المؤسسة_ -- [Quorum](https://www.goquorum.com/) _منصة سلسلة كتل مفتوحة المصدر تجمع بين ابتكار مجتمع إيثريوم العام وتحسينات لدعم احتياجات المؤسسة_ +- [Quorum](https://docs.goquorum.consensys.io/) _منصة سلسلة كتل مفتوحة المصدر تجمع بين ابتكار مجتمع إيثريوم العام وتحسينات لدعم احتياجات المؤسسة_ ## البروتوكول والبنية التحتية {#protocol-and-infrastructure} diff --git a/public/content/translations/bn/enterprise/index.md b/public/content/translations/bn/enterprise/index.md index 9c817a14f10..d3433e8fb07 100644 --- a/public/content/translations/bn/enterprise/index.md +++ b/public/content/translations/bn/enterprise/index.md @@ -40,7 +40,7 @@ lang: bn - [Blockapps](https://blockapps.net/)_এন্টারপ্রাইজ ইথেরিয়াম প্রোটোকলের বাস্তবায়ন, টুলিং এবং APIs যেগুলি STRATO প্ল্যাটফর্ম গঠন করে_ - [Clearmatics](https://www.clearmatics.com/about)_প্রোটোকল এবং পিয়ার-টু-পিয়ার প্ল্যাটফর্ম আর্কিটেকচার, ব্লকচেইন R&D কোম্পানি।_ - [PegaSys Plus](https://pegasys.tech/enterprise/)_ HF বেসু-র মতো একই বৈশিষ্ট্য এবং কার্যকারিতা, অতিরিক্ত এন্টারপ্রাইজ ফোকাসড বেনিফিট প্রদান করে_ -- [Quorum](https://www.goquorum.com/) _একটি ওপেন সোর্স ব্লকচেইন প্ল্যাটফর্ম যা এন্টারপ্রাইজের প্রয়োজনগুলিকে সমর্থন করার জন্য সর্বজনীন ইথেরিয়াম সম্প্রদায়ের উদ্ভাবনকে উন্নয়নের সাথে সংযুক্ত করে।_ +- [Quorum](https://docs.goquorum.consensys.io/) _একটি ওপেন সোর্স ব্লকচেইন প্ল্যাটফর্ম যা এন্টারপ্রাইজের প্রয়োজনগুলিকে সমর্থন করার জন্য সর্বজনীন ইথেরিয়াম সম্প্রদায়ের উদ্ভাবনকে উন্নয়নের সাথে সংযুক্ত করে।_ ## প্রোটোকল এবং পরিকাঠামো {#protocol-and-infrastructure} diff --git a/public/content/translations/cs/enterprise/index.md b/public/content/translations/cs/enterprise/index.md index 63808c7f2a3..c1368998f9e 100644 --- a/public/content/translations/cs/enterprise/index.md +++ b/public/content/translations/cs/enterprise/index.md @@ -41,7 +41,7 @@ Následující projekty poskytují blockchainové služby pro firemní systémy: - [Blockapps](https://blockapps.net/) _implementace Ethereum protokolu pro firmy, nástroje a aplikační rozhraní, která tvoří platformu STRATO_ - [Clearmatics](https://www.clearmatics.com/about) _protokoly a architektura platformy peer-to-peer, společnost zaměřená na výzkum a vývoj blockchainu_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _nabízí stejné funkce a funkce jako HF Besu, a také další výhody zaměřené na firemní sféru_ -- [Quorum](https://www.goquorum.com/) _open source blockchain platforma, která kombinuje inovace veřejné Ethereum komunity s vylepšeními podpory firemních potřeb_ +- [Quorum](https://docs.goquorum.consensys.io/) _open source blockchain platforma, která kombinuje inovace veřejné Ethereum komunity s vylepšeními podpory firemních potřeb_ ## Protokol a infrastruktura {#protocol-and-infrastructure} diff --git a/public/content/translations/fi/enterprise/index.md b/public/content/translations/fi/enterprise/index.md index 79f891d4b18..a622a097689 100644 --- a/public/content/translations/fi/enterprise/index.md +++ b/public/content/translations/fi/enterprise/index.md @@ -41,7 +41,7 @@ Seuraavat projektit tarjoavat lohkoketjupalveluja yritystason järjestelmille: - [Blockapps](https://blockapps.net/) _toteutus Enterprise Ethereum -protokollasta, työkaluista ja API:sta, jotka luovat STRATO-alustan_ - [Clearmatics](https://www.clearmatics.com/about) _protokolla- ja vertaisverkkoalustan arkkitehtuuria sekä lohkoketjuja kehittävä yritys_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _tarjoaa samat ominaisuudet ja toiminnalisuudet kuin HF Besu, sekä muita yrityksille suunnattuja etuja_ -- [Quorum](https://www.goquorum.com/) _avoimen lähdekoodin lohkoketjualusta, joka yhdistää julkisen Ethereum-yhteisön innovaatiot yritysten tarpeisiin suunnattuihin palveluihin_ +- [Quorum](https://docs.goquorum.consensys.io/) _avoimen lähdekoodin lohkoketjualusta, joka yhdistää julkisen Ethereum-yhteisön innovaatiot yritysten tarpeisiin suunnattuihin palveluihin_ ## Protokolla ja Infrastruktuuri {#protocol-and-infrastructure} diff --git a/public/content/translations/ko/enterprise/index.md b/public/content/translations/ko/enterprise/index.md index c973e0284f1..dd7eedcd2ec 100644 --- a/public/content/translations/ko/enterprise/index.md +++ b/public/content/translations/ko/enterprise/index.md @@ -41,7 +41,7 @@ sidebarDepth: 1 - [블록앱스(BlockApps)](https://blockapps.net/) _STRATO 플랫폼을 구성하는 엔터프라이즈 이더리움 프로토콜, 툴링 및 API의 구현체_ - [클리어매틱스(Clearmatics)](https://www.clearmatics.com/about) _프로토콜 및 P2P 플랫폼 아키텍처, 블록체인 R&D 기업_ - [페가시스 플러스(PegaSys Plus)](https://pegasys.tech/enterprise/) _HF Besu와 동일한 기능은 물론 추가적인 엔터프라이즈 중심 서비스 제공_ -- [쿼럼(Quorum)](https://www.goquorum.com/) _공개 이더리움 커뮤니티를 통해 이루어진 혁신과 기업의 요구사항을 지원하면서 이루어진 개선 사항을 결합하는 오픈 소스 블록체인 플랫폼_ +- [쿼럼(Quorum)](https://docs.goquorum.consensys.io/) _공개 이더리움 커뮤니티를 통해 이루어진 혁신과 기업의 요구사항을 지원하면서 이루어진 개선 사항을 결합하는 오픈 소스 블록체인 플랫폼_ ## 프로토콜 및 인프라 {#protocol-and-infrastructure} diff --git a/public/content/translations/lt/enterprise/index.md b/public/content/translations/lt/enterprise/index.md index 5be3cacc0fe..bef015230dc 100644 --- a/public/content/translations/lt/enterprise/index.md +++ b/public/content/translations/lt/enterprise/index.md @@ -41,7 +41,7 @@ Daugiau išsamios informacijos rasite šiuose straipsniuose: - [Blockapps](https://blockapps.net/) _Ethereum įmonėms proyokolo įgyvendinimas, įrankinė ir API, kurie sudaro STRATO platformą_ - [Clearmatics](https://www.clearmatics.com/about) _protokolai ir tarpusavio sąveikos struktūra, blokų grandinė R&D company_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _turi tas pačias savybes ir funkcijas kaip ir HF Besu, o taip pat konkrečiai įmonėms reikalingas savybes_ -- [Quorum](https://www.goquorum.com/) _atviro kodo blokų grandinės platforma, teikianti inovacijas Ethereum bendruomenei ir geriau tenkinanti įmonių interesus_ +- [Quorum](https://docs.goquorum.consensys.io/) _atviro kodo blokų grandinės platforma, teikianti inovacijas Ethereum bendruomenei ir geriau tenkinanti įmonių interesus_ ## Protokolas ir infrastruktūra {#protocol-and-infrastructure} diff --git a/public/content/translations/ml/enterprise/index.md b/public/content/translations/ml/enterprise/index.md index aee30f93280..60c74c7046e 100644 --- a/public/content/translations/ml/enterprise/index.md +++ b/public/content/translations/ml/enterprise/index.md @@ -40,7 +40,7 @@ Ethereum എന്റർപ്രൈസ് സൗഹൃദമാക്കുന - [ബ്ലോക്ക്അപ്പുകൾ](https://blockapps.net/) _ സ്ട്രാറ്റോ പ്ലാറ്റ്ഫോം രൂപീകരിക്കുന്ന എന്റർപ്രൈസ് Ethereum പ്രോട്ടോക്കോൾ, ടൂളിംഗ്, API- കൾ നടപ്പിലാക്കൽ _ - [ക്ലിയർ‌മാറ്റിക്സ്](https://www.clearmatics.com/about) _ പ്രോട്ടോക്കോളുകളും പിയർ-ടു-പിയർ പ്ലാറ്റ്ഫോം ആർക്കിടെക്ചറും, ബ്ലോക്ക്‌ചെയിൻ R&D കമ്പനി _ - [പെഗാസിസ് പ്ലസ്](https://pegasys.tech/enterprise/) _ HF ബെസുവിന്റെ അതേ സവിശേഷതകളും പ്രവർത്തനങ്ങളും വാഗ്ദാനം ചെയ്യുന്നു, കൂടാതെ അധിക എന്റർപ്രൈസ് ഫോക്കസ്ഡ് ആനുകൂല്യങ്ങളും _ -- [കോറം](https://www.goquorum.com/) _ ഓപ്പൺ സോഴ്‌സ് ബ്ലോക്ക്‌ചെയിൻ പ്ലാറ്റ്‌ഫോം, പൊതു Ethereum കമ്മ്യൂണിറ്റിയുടെ പുതുമകളെ വര്‍ദ്ധനവുകളോടെ സംയോജിപ്പിച്ച് എന്റർപ്രൈസിന്‍റെ ആവശ്യങ്ങളെ പിന്തുണയ്‌ക്കുന്നു _ +- [കോറം](https://docs.goquorum.consensys.io/) _ ഓപ്പൺ സോഴ്‌സ് ബ്ലോക്ക്‌ചെയിൻ പ്ലാറ്റ്‌ഫോം, പൊതു Ethereum കമ്മ്യൂണിറ്റിയുടെ പുതുമകളെ വര്‍ദ്ധനവുകളോടെ സംയോജിപ്പിച്ച് എന്റർപ്രൈസിന്‍റെ ആവശ്യങ്ങളെ പിന്തുണയ്‌ക്കുന്നു _ ## പ്രോട്ടോക്കോളും ഇൻഫ്രാസ്ട്രക്ചറും {#protocol-and-infrastructure} diff --git a/public/content/translations/nb/enterprise/index.md b/public/content/translations/nb/enterprise/index.md index 27c2b73dc3a..94df2f34680 100644 --- a/public/content/translations/nb/enterprise/index.md +++ b/public/content/translations/nb/enterprise/index.md @@ -40,7 +40,7 @@ Følgende prosjekter tilbyr blokkjedetjenester for bedrftsklassifiserte systemer - [Blockapps](https://blockapps.net/) _implementeringen av Enterprise Ethereum protocol, verktøy og APIer som utgjør STRATO-plattformen_ - [Clearmatics](https://www.clearmatics.com/about) _protokoller og peer-to-peer plattform arkitektur, blokkjede R&D-selskap_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _tilbyr de samme funksjonene og funksjonalitetene som HF Besu, og ytterligere virksomhetsmålrettede fordeler_ -- [Quorum](https://www.goquorum.com/) _open source blokkjede platform som kombinerer innovasjonen fra det offentliges Ethereum samfunnet med forbedringer for å støtte bedriftens behov_ +- [Quorum](https://docs.goquorum.consensys.io/) _open source blokkjede platform som kombinerer innovasjonen fra det offentliges Ethereum samfunnet med forbedringer for å støtte bedriftens behov_ ## Protokoll og infrastruktur {#protocol-and-infrastructure} diff --git a/public/content/translations/se/enterprise/index.md b/public/content/translations/se/enterprise/index.md index 67301ac9642..a74aca55811 100644 --- a/public/content/translations/se/enterprise/index.md +++ b/public/content/translations/se/enterprise/index.md @@ -40,7 +40,7 @@ Följande projekt tillhandahåller blockchain-tjänster för system för storfö - [Blockapps](https://blockapps.net/) _implementering av Enterprise Ethereum-protokollet, verktyg och API:er som bildar STRATO-plattformen_ - [Clearmatics](https://www.clearmatics.com/about) _protokoll och peer-to-peer-plattformsarkitektur, blockchain R&D företag_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _erbjuder samma funktioner som HF Besu, plus ytterligare företagsfokuserade fördelar_ -- [Quorum](https://www.goquorum.com/) _blockchain-plattform med öppen källkod som kombinerar innovation av den offentliga Ethereum-gemenskapen med förbättringar för att stödja företagens behov_ +- [Quorum](https://docs.goquorum.consensys.io/) _blockchain-plattform med öppen källkod som kombinerar innovation av den offentliga Ethereum-gemenskapen med förbättringar för att stödja företagens behov_ ## Protokoll och infrastruktur {#protocol-and-infrastructure} diff --git a/public/content/translations/sk/enterprise/index.md b/public/content/translations/sk/enterprise/index.md index 24cf216a407..15ec355ee9e 100644 --- a/public/content/translations/sk/enterprise/index.md +++ b/public/content/translations/sk/enterprise/index.md @@ -40,7 +40,7 @@ Nasledujúce projekty poskytujú blockchainové služby pre podnikové systémy: - [Blockapps](https://blockapps.net/) _implementácia protokolu, nástrojov a API rozhraní Enterprise Ethereum, ktoré tvoria platformu STRATO_ - [Clearmatics](https://www.clearmatics.com/about) _protokoly a architektúra peer-to-peer platformy, spoločnosť zameraná na R&D v oblasti blockchainu_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _ponúka rovnaké vlastnosti a funkcie ako HF Besu, plus ďalšie výhody zamerané na podniky_ -- [Quorum](https://www.goquorum.com/) _open source blockchainová platforma ktorá kombinuje inováciu verejnej komunity Etherea s vylepšeniami na podporu podnikových potrieb_ +- [Quorum](https://docs.goquorum.consensys.io/) _open source blockchainová platforma ktorá kombinuje inováciu verejnej komunity Etherea s vylepšeniami na podporu podnikových potrieb_ ## Protokol a infraštruktúra {#protocol-and-infrastructure} diff --git a/public/content/translations/uk/enterprise/index.md b/public/content/translations/uk/enterprise/index.md index 722910312d6..9a2e057c43d 100644 --- a/public/content/translations/uk/enterprise/index.md +++ b/public/content/translations/uk/enterprise/index.md @@ -41,7 +41,7 @@ sidebarDepth: 1 - [Blockapps](https://blockapps.net/) _ — впровадження протоколу, інструментальних засобів та API Ethereum для корпоративного сектора, що формують платформу STRATO_ - [Clearmatics](https://www.clearmatics.com/about) _ — протоколи та архітектура однорангових платформ, науково-розробницька компанія блокчейну_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _пропонує ті самі можливості та функції, що й HF Besu, а також надає додаткові переваги для корпоративного сектора_ -- [Quorum](https://www.goquorum.com/) _— платформа блокчейну з відкритим вихідним кодом, яка поєднує інновації відкритої спільноти Ethereum з удосконаленнями для підтримки потреб корпоративного сектора_ +- [Quorum](https://docs.goquorum.consensys.io/) _— платформа блокчейну з відкритим вихідним кодом, яка поєднує інновації відкритої спільноти Ethereum з удосконаленнями для підтримки потреб корпоративного сектора_ ## Протокол та інфраструктура {#protocol-and-infrastructure} diff --git a/public/content/translations/vi/enterprise/index.md b/public/content/translations/vi/enterprise/index.md index 039dd83cbb8..e6ebd0318a9 100644 --- a/public/content/translations/vi/enterprise/index.md +++ b/public/content/translations/vi/enterprise/index.md @@ -41,7 +41,7 @@ Các dự án sau đây cung cấp dịch vụ chuỗi khối cho các hệ th - [Blockapps](https://blockapps.net/) _triển khai giao thức Enterprise Ethereum, công cụ và API tạo thành nền tảng STRATO_ - [Clearmatics](https://www.clearmatics.com/about) _giao thức và kiến ​​trúc nền tảng ngang hàng, công ty R&D chuỗi khối_ - [PegaSys Plus](https://pegasys.tech/enterprise/) _cung cấp các tính năng và chức năng tương tự như HF Besu, cộng với các lợi ích tập trung vào doanh nghiệp bổ sung_ -- [Quorum](https://www.goquorum.com/) _nền tảng chuỗi khối mã nguồn mở kết hợp sự đổi mới của cộng đồng Ethereum công cộng với các cải tiến để hỗ trợ nhu cầu doanh nghiệp_ +- [Quorum](https://docs.goquorum.consensys.io/) _nền tảng chuỗi khối mã nguồn mở kết hợp sự đổi mới của cộng đồng Ethereum công cộng với các cải tiến để hỗ trợ nhu cầu doanh nghiệp_ ## Giao thức và cơ sở hạ tầng {#protocol-and-infrastructure} From d5ddf71c611282e4ea271f0543f7feee3d30d94c Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 17:15:32 -0500 Subject: [PATCH 013/368] removing https://yeticoineth.com/about.html - dead project as far as i can tell --- public/content/translations/fi/nft/index.md | 1 - public/content/translations/se/nft/index.md | 1 - 2 files changed, 2 deletions(-) diff --git a/public/content/translations/fi/nft/index.md b/public/content/translations/fi/nft/index.md index 3ac026134b9..ec5638852f2 100644 --- a/public/content/translations/fi/nft/index.md +++ b/public/content/translations/fi/nft/index.md @@ -58,7 +58,6 @@ NFT-järjestelmä on suhteellisen uusi. Teoriassa, mikä tahansa uniikki asia, j - [Kiinteistömurto-osakkeet](https://realt.co/) - [Tutkintotodistukset](https://www.degreecert.com/) - [Musiikin rojaltit NFTin kautta](https://opulous.org/) -- [Siirry ansaintaan](https://yeticoineth.com/about.html) - [Digitaalinen identiteetti](https://photochromic.io/) ### ethereum.org sovelluksia {#ethereum-org-examples} diff --git a/public/content/translations/se/nft/index.md b/public/content/translations/se/nft/index.md index b23692a5b11..ce51589e736 100644 --- a/public/content/translations/se/nft/index.md +++ b/public/content/translations/se/nft/index.md @@ -58,7 +58,6 @@ NFT-världen är relativt ny. I teorin omfattar NFT allt som är unikt och där - [Andelar i fastigheter](https://realt.co/) - [Examensbevis](https://www.degreecert.com/) - [Musik royalties via NFTs](https://opulous.org/) -- [Move 2 Earn](https://yeticoineth.com/about.html) - [Digital identitet](https://photochromic.io/) ### exempel på ethereum.org {#ethereum-org-examples} From 2dfc9b78e79ae64bbacd0ca65d740f97aabe1d84 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 17:29:52 -0500 Subject: [PATCH 014/368] changing https://compoundgrants.org/ to https://compoundgrants.questbook.app/, proof https://www.tally.xyz/gov/compound/proposal/326?govId=eip155:1:0xc0Da02939E1441F497fd74F78cE7Decb17B66529 --- public/content/translations/ca/community/grants/index.md | 2 +- public/content/translations/nl/community/grants/index.md | 2 +- public/content/translations/ro/community/grants/index.md | 2 +- public/content/translations/sw/community/grants/index.md | 2 +- public/content/translations/uk/community/grants/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/content/translations/ca/community/grants/index.md b/public/content/translations/ca/community/grants/index.md index 0844ae707ec..8a320f26eec 100644 --- a/public/content/translations/ca/community/grants/index.md +++ b/public/content/translations/ca/community/grants/index.md @@ -28,7 +28,7 @@ Aquests projectes han creat les seves pròpies subvencions per projectes enfocad - [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) grants DAO_ - [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) ecosystem fund_ -- [Compound Grants Program](https://compoundgrants.org/) – _[Compound](https://compound.finance/) finance ecosystem_ +- [Compound Grants Program](https://compoundgrants.questbook.app/) – _[Compound](https://compound.finance/) finance ecosystem_ - [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) finance ecosystem_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ - [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) community_ diff --git a/public/content/translations/nl/community/grants/index.md b/public/content/translations/nl/community/grants/index.md index 5d91c58b66f..4f193839b56 100644 --- a/public/content/translations/nl/community/grants/index.md +++ b/public/content/translations/nl/community/grants/index.md @@ -28,7 +28,7 @@ Deze projecten hebben hun eigen beurzen gecreëerd voor projecten die gericht zi - [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) Grants DAO_ - [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/)-ecosysteemfonds_ - [Chainlink Grants Program](https://chain.link/community/grants) - _[Chainlink](https://chain.link/)-gemeenschapssubsidies_ -- [Compound Grants Program](https://compoundgrants.org/) – _[Compound](https://compound.finance/)-financieringsecosysteem_ +- [Compound Grants Program](https://compoundgrants.questbook.app/) – _[Compound](https://compound.finance/)-financieringsecosysteem_ - [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/)-financieringsecosysteem_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) Grants DAO geleid door werknemers_ - [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/)-gemeenschap_ diff --git a/public/content/translations/ro/community/grants/index.md b/public/content/translations/ro/community/grants/index.md index eea32a40554..9da76f7a7af 100644 --- a/public/content/translations/ro/community/grants/index.md +++ b/public/content/translations/ro/community/grants/index.md @@ -28,7 +28,7 @@ Aceste proiecte și-au creat propriile granturi pentru proiecte care vizează de - [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) grants DAO_ - [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) ecosystem fund_ -- [Compound Grants Program](https://compoundgrants.org/) – _[Compound](https://compound.finance/) finance ecosystem_ +- [Compound Grants Program](https://compoundgrants.questbook.app/) – _[Compound](https://compound.finance/) finance ecosystem_ - [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) finance ecosystem_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ - [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) community_ diff --git a/public/content/translations/sw/community/grants/index.md b/public/content/translations/sw/community/grants/index.md index 1890a99ec46..603333ab80b 100644 --- a/public/content/translations/sw/community/grants/index.md +++ b/public/content/translations/sw/community/grants/index.md @@ -26,7 +26,7 @@ Miradi hii imeunda misaada yao kwa miradi inayolenga kukuza na kujaribu teknoloj - [Mpango wa Ruzuku wa Aave](https://aavegrants.org/) - _[Aave](https://aave.com/) hutoa ruzuku za DAO_ - [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) - _fedha za ikolojia ya [Balancer](https://balancer.fi/)_ -- [Mpango wa Ruzuku za Compound](https://compoundgrants.org/) - _[Compaound](https://compound.finance/) hugharamia ikolojia_ +- [Mpango wa Ruzuku za Compound](https://compoundgrants.questbook.app/) - _[Compaound](https://compound.finance/) hugharamia ikolojia_ - [Mpango wa Ruzuku wa Consensys](https://consensys.net/grants/) - _[Consensys](https://consensys.net/) fedha za minyororo ya blocku & ruzuku za Ethereum_ - [Shirika la Ruzuku ya Ikolojia ya Lido (LEGO)](https://lego.lido.fi/) - _hugharamia ikolojia ya [Lido](https://lido.fi/)_ - [Programu ya Ruzuku ya mStable](https://docs.mstable.org/advanced/grants-program) - _jamii ya [mStablei](https://mstable.org/)_ diff --git a/public/content/translations/uk/community/grants/index.md b/public/content/translations/uk/community/grants/index.md index 167a50dfe94..9e7020ebb93 100644 --- a/public/content/translations/uk/community/grants/index.md +++ b/public/content/translations/uk/community/grants/index.md @@ -28,7 +28,7 @@ lang: uk - [Програма грантів Aave](https://aavegrants.org/) — _гранти DAO від [Aave](https://aave.com/)_ - [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) — _фонд екосистеми [Balancer](https://balancer.fi/)_ - [Програма грантів Chainlink](https://chain.link/community/grants) — _гранти спільноти [Chainlink](https://chain.link/)_ -- [Програма грантів Compound](https://compoundgrants.org/) — _фінансова екосистема [Compound](https://compound.finance/)_ +- [Програма грантів Compound](https://compoundgrants.questbook.app/) — _фінансова екосистема [Compound](https://compound.finance/)_ - [Програма грантів Decentraland](https://governance.decentraland.org/grants/) — _[децентралізація](https://decentraland.org/) DAO Metaverse_ - [Організація грантів Lido Ecosystem (LEGO)](https://lego.lido.fi/) — _фінансова екосистема [Lido](https://lido.fi/)_ - [Програма MetaMask](https://metamaskgrants.org/) — _гранти під керівництвом співробітників DAO від [MetaMask](https://metamask.io/)_ From d1cfc7e860ce36749a2526bd98dc3e7891414955 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 17:30:13 -0500 Subject: [PATCH 015/368] changing https://matic.network/ to https://polygon.technology/ --- public/content/translations/de/enterprise/index.md | 2 +- .../translations/es/developers/docs/layer-2-scaling/index.md | 2 +- .../translations/fr/developers/docs/layer-2-scaling/index.md | 2 +- .../translations/hu/developers/docs/layer-2-scaling/index.md | 2 +- public/content/translations/id/enterprise/index.md | 2 +- .../translations/it/developers/docs/layer-2-scaling/index.md | 2 +- .../translations/pl/developers/docs/scaling/plasma/index.md | 2 +- public/content/translations/pl/enterprise/index.md | 2 +- .../translations/ro/developers/docs/layer-2-scaling/index.md | 2 +- public/content/translations/ro/enterprise/index.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/content/translations/de/enterprise/index.md b/public/content/translations/de/enterprise/index.md index 01e88868289..f8a1d3b7539 100644 --- a/public/content/translations/de/enterprise/index.md +++ b/public/content/translations/de/enterprise/index.md @@ -92,7 +92,7 @@ Beispiele für L2-Lösungen, die produktionsbereit sind oder es bald sein werden - Plasma (Daten off-chain, Betrugsnachweise) - [OMG Network](https://omg.network/) - [Gazelle](https://gzle.io) - - [Matic Network](https://matic.network/) + - [Matic Network](https://polygon.technology/) - [LeapDAO](https://ipfs.leapdao.org/) - State Channels - [Connext](https://connext.network/) diff --git a/public/content/translations/es/developers/docs/layer-2-scaling/index.md b/public/content/translations/es/developers/docs/layer-2-scaling/index.md index ca619083a4e..2d2d8dedffb 100644 --- a/public/content/translations/es/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/es/developers/docs/layer-2-scaling/index.md @@ -170,7 +170,7 @@ Una cadena de plasma es una blockchain independiente que está anclada a la cade ### Usos de Plasma {#use-plasma} - [Red OMG](https://omg.network/) -- [Red Matic](https://matic.network/) +- [Red Matic](https://polygon.technology/) - [Gluon](https://gluon.network/) - [LeapDAO](https://ipfs.leapdao.org/) diff --git a/public/content/translations/fr/developers/docs/layer-2-scaling/index.md b/public/content/translations/fr/developers/docs/layer-2-scaling/index.md index 87f9492a049..8bf6e54fddb 100644 --- a/public/content/translations/fr/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/fr/developers/docs/layer-2-scaling/index.md @@ -170,7 +170,7 @@ Une chaîne plasma est une blockchain séparée qui est ancrée à la chaîne Et ### Chaînes Plasma que vous pouvez utiliser {#use-plasma} - [OMG Network](https://omg.network/) -- [Matic Network](https://matic.network/) +- [Matic Network](https://polygon.technology/) - [Gluon](https://gluon.network/) - [LeapDAO](https://ipfs.leapdao.org/) diff --git a/public/content/translations/hu/developers/docs/layer-2-scaling/index.md b/public/content/translations/hu/developers/docs/layer-2-scaling/index.md index f6370a99cff..925e5eb1a15 100644 --- a/public/content/translations/hu/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/hu/developers/docs/layer-2-scaling/index.md @@ -170,7 +170,7 @@ A plasma lánc olyan különálló blokklánc, mely hozzá van kötve a fő Ethe ### Plasma használata {#use-plasma} - [OMG Network](https://omg.network/) -- [Matic Network](https://matic.network/) +- [Matic Network](https://polygon.technology/) - [Gluon](https://gluon.network/) - [LeapDAO](https://ipfs.leapdao.org/) diff --git a/public/content/translations/id/enterprise/index.md b/public/content/translations/id/enterprise/index.md index ec7e81fac16..e82cf820b5e 100644 --- a/public/content/translations/id/enterprise/index.md +++ b/public/content/translations/id/enterprise/index.md @@ -91,7 +91,7 @@ Contoh solusi L2 yang siap dipakai atau yang akan segera dimasukkan: - Plasma (data off chain, bukti penipuan) - [OMG Network](https://omg.network/) - [Gazelle](https://gzle.io) - - [Matic Network](https://matic.network/) + - [Matic Network](https://polygon.technology/) - [LeapDAO](https://ipfs.leapdao.org/) - Kanal state - [Connext](https://connext.network/) diff --git a/public/content/translations/it/developers/docs/layer-2-scaling/index.md b/public/content/translations/it/developers/docs/layer-2-scaling/index.md index 62d6bf6757b..e0d236e8161 100644 --- a/public/content/translations/it/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/it/developers/docs/layer-2-scaling/index.md @@ -170,7 +170,7 @@ Una catena Plasma è una blockchain separata, collegata alla catena principale E ### Usano Plasma {#use-plasma} - [OMG Network](https://omg.network/) -- [Matic Network](https://matic.network/) +- [Matic Network](https://polygon.technology/) - [Gluon](https://gluon.network/) - [LeapDAO](https://ipfs.leapdao.org/) diff --git a/public/content/translations/pl/developers/docs/scaling/plasma/index.md b/public/content/translations/pl/developers/docs/scaling/plasma/index.md index 25fb39a4f46..a2280033f6d 100644 --- a/public/content/translations/pl/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/pl/developers/docs/scaling/plasma/index.md @@ -26,7 +26,7 @@ Musisz dobrze się orientować we wszystkich podstawowych tematach i mieć zaawa Wiele projektów dostarcza implementacje Plasma, które można zintegrować z własnymi aplikacjami zdecentralizowanymi: - [Sieć OMG](https://omg.network/) -- [Polygon](https://polygon.technology/), [poprzednio Matic Network](https://matic.network/) +- [Polygon](https://polygon.technology/), [poprzednio Matic Network](https://polygon.technology/) - [Gluon](https://gluon.network/) - [LeapDAO](https://ipfs.leapdao.org/) diff --git a/public/content/translations/pl/enterprise/index.md b/public/content/translations/pl/enterprise/index.md index 7bc51c17afd..8fdb5ea4509 100644 --- a/public/content/translations/pl/enterprise/index.md +++ b/public/content/translations/pl/enterprise/index.md @@ -90,7 +90,7 @@ Przykłady rozwiązań L2, które są gotowe do produkcji lub wkrótce będą: - Plazma (dane poza łańcuchem, dowody oszustwa) - [Sieć OMG](https://omg.network/) - [Gazelle](https://gzle.io) - - [Sieć Matic](https://matic.network/) + - [Sieć Matic](https://polygon.technology/) - [LeapDAO](https://ipfs.leapdao.org/) - Kanały uzyskiwania informacji - [Połącz](https://connext.network/) diff --git a/public/content/translations/ro/developers/docs/layer-2-scaling/index.md b/public/content/translations/ro/developers/docs/layer-2-scaling/index.md index 226c3efd703..8a5aad57f8f 100644 --- a/public/content/translations/ro/developers/docs/layer-2-scaling/index.md +++ b/public/content/translations/ro/developers/docs/layer-2-scaling/index.md @@ -170,7 +170,7 @@ Un lanț „plasma” este un blockchain separat care este ancorat pe lanțul pr ### Folosește Plasma {#use-plasma} - [OMG Network](https://omg.network/) -- [Matic Network](https://matic.network/) +- [Matic Network](https://polygon.technology/) - [Gluon](https://gluon.network/) - [LeapDAO](https://ipfs.leapdao.org/) diff --git a/public/content/translations/ro/enterprise/index.md b/public/content/translations/ro/enterprise/index.md index 9ac24401849..f769682fc0d 100644 --- a/public/content/translations/ro/enterprise/index.md +++ b/public/content/translations/ro/enterprise/index.md @@ -91,7 +91,7 @@ Câteva exemple de soluții de Nivelul 2 care sunt pregătite pentru producție - Plasma (date în afara lanțului, dovezi de fraudă) - [OMG Network](https://omg.network/) - [Gazelle](https://gzle.io) - - [Matic Network](https://matic.network/) + - [Matic Network](https://polygon.technology/) - [LeapDAO](https://ipfs.leapdao.org/) - Canale de stare - [Connext](https://connext.network/) From 241c834996e6604da9ee68bd13e827691bbba117 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 5 Feb 2025 17:49:51 -0500 Subject: [PATCH 016/368] replacinghttps://www.ethercluster.com/ with https://etccooperative.github.io/ethercluster-website/ --- .../translations/id/developers/docs/apis/backend/index.md | 2 +- .../translations/pl/developers/docs/apis/backend/index.md | 2 +- .../translations/pt-br/developers/docs/apis/backend/index.md | 2 +- .../translations/ro/developers/docs/apis/backend/index.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/content/translations/id/developers/docs/apis/backend/index.md b/public/content/translations/id/developers/docs/apis/backend/index.md index db3df5a9250..b47a31f4c6f 100644 --- a/public/content/translations/id/developers/docs/apis/backend/index.md +++ b/public/content/translations/id/developers/docs/apis/backend/index.md @@ -54,7 +54,7 @@ Pustaka ini menyederhanakan banyak kerumitan dalam interaksi langsung dengan nod **Ethercluster -** **_Jalankan layanan API Ethereum Anda sendiri yang mendukung baik ETH dan ETC._** -- [ethercluster.com](https://www.ethercluster.com/) +- [ethercluster.com](https://etccooperative.github.io/ethercluster-website/) **Chainstack -** **_Node Ethereum yang dibagikan dan didedikasikan sebagai layanan._** diff --git a/public/content/translations/pl/developers/docs/apis/backend/index.md b/public/content/translations/pl/developers/docs/apis/backend/index.md index 3991479a59e..1b9ce615f6f 100644 --- a/public/content/translations/pl/developers/docs/apis/backend/index.md +++ b/public/content/translations/pl/developers/docs/apis/backend/index.md @@ -49,7 +49,7 @@ Biblioteki te eliminują znaczną złożoność interakcji bezpośrednio z węz **Ethercluster -** **_Uruchom własną usługę API Ethereum wspierającą ETH i ETC._** -- [ethercluster.com](https://www.ethercluster.com/) +- [ethercluster.com](https://etccooperative.github.io/ethercluster-website/) **Chainstack -** **_Udostępnione i dedykowane węzły Ethereum jako usługa._** diff --git a/public/content/translations/pt-br/developers/docs/apis/backend/index.md b/public/content/translations/pt-br/developers/docs/apis/backend/index.md index e497cff3ae9..ac9d4c7ada8 100644 --- a/public/content/translations/pt-br/developers/docs/apis/backend/index.md +++ b/public/content/translations/pt-br/developers/docs/apis/backend/index.md @@ -72,7 +72,7 @@ Essas bibliotecas abstraem muito da complexidade de interagir diretamente com um **Ethercluster -** **_Execute o seu próprio serviço de API da Ethereum que suporta ETH e ETC._** -- [ethercluster.com](https://www.ethercluster.com/) +- [ethercluster.com](https://etccooperative.github.io/ethercluster-website/) **Chainstack -** **_Nós Ethereum compartilhados e dedicados como serviço._** diff --git a/public/content/translations/ro/developers/docs/apis/backend/index.md b/public/content/translations/ro/developers/docs/apis/backend/index.md index 83c038457cd..9e6be7baf17 100644 --- a/public/content/translations/ro/developers/docs/apis/backend/index.md +++ b/public/content/translations/ro/developers/docs/apis/backend/index.md @@ -54,7 +54,7 @@ Aceste biblioteci elimină o mare parte din complexitatea interacțiunii directe **Ethercluster -** **_Rulaţi-vă propriul serviciu API Ethereum, acceptând atât ETH, cât și ETC._** -- [ethercluster.com](https://www.ethercluster.com/) +- [ethercluster.com](https://etccooperative.github.io/ethercluster-website/) **Chainstack -** **_Noduri Ethereum partajate și dedicate ca serviciu._** From 8f5f3bb2ad2b0d46a33b0494dd35e73cf8538022 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 12:23:22 -0500 Subject: [PATCH 017/368] changing https://aave.com/flash-loans/ to https://aave.com/docs/concepts/flash-loans - aave changed their website --- lychee-logs.txt | 7 +++++++ public/content/translations/ar/defi/index.md | 2 +- public/content/translations/az/defi/index.md | 2 +- public/content/translations/be/defi/index.md | 2 +- public/content/translations/bn/defi/index.md | 2 +- public/content/translations/ca/defi/index.md | 2 +- public/content/translations/cs/defi/index.md | 4 ++-- public/content/translations/de/defi/index.md | 4 ++-- public/content/translations/es/defi/index.md | 4 ++-- public/content/translations/fa/defi/index.md | 2 +- public/content/translations/fil/defi/index.md | 2 +- public/content/translations/fr/defi/index.md | 4 ++-- public/content/translations/ha/defi/index.md | 2 +- public/content/translations/hi/defi/index.md | 4 ++-- public/content/translations/hu/defi/index.md | 4 ++-- public/content/translations/id/defi/index.md | 4 ++-- public/content/translations/it/defi/index.md | 4 ++-- public/content/translations/ja/defi/index.md | 4 ++-- public/content/translations/kn/defi/index.md | 2 +- public/content/translations/ko/defi/index.md | 2 +- public/content/translations/mr/defi/index.md | 2 +- public/content/translations/ms/defi/index.md | 2 +- public/content/translations/nl/defi/index.md | 4 ++-- public/content/translations/pcm/defi/index.md | 4 ++-- public/content/translations/pl/defi/index.md | 2 +- public/content/translations/pt-br/defi/index.md | 4 ++-- public/content/translations/pt/defi/index.md | 2 +- public/content/translations/ro/defi/index.md | 2 +- public/content/translations/ru/defi/index.md | 4 ++-- public/content/translations/sk/defi/index.md | 2 +- public/content/translations/sl/defi/index.md | 2 +- public/content/translations/sr/defi/index.md | 2 +- public/content/translations/te/defi/index.md | 2 +- public/content/translations/tl/defi/index.md | 2 +- public/content/translations/tr/defi/index.md | 2 +- public/content/translations/uk/defi/index.md | 2 +- public/content/translations/uz/defi/index.md | 4 ++-- public/content/translations/vi/defi/index.md | 2 +- public/content/translations/yo/defi/index.md | 2 +- public/content/translations/zh-tw/defi/index.md | 4 ++-- 40 files changed, 61 insertions(+), 54 deletions(-) create mode 100644 lychee-logs.txt diff --git a/lychee-logs.txt b/lychee-logs.txt new file mode 100644 index 00000000000..1cc96f50d7a --- /dev/null +++ b/lychee-logs.txt @@ -0,0 +1,7 @@ +Error: Network error + +Caused by: + 0: error sending request for url (http://ethereum-org-website/) + 1: client error (Connect) + 2: dns error: failed to lookup address information: nodename nor servname provided, or not known + 3: failed to lookup address information: nodename nor servname provided, or not known diff --git a/public/content/translations/ar/defi/index.md b/public/content/translations/ar/defi/index.md index 67f1747c7f2..c3d86a8bceb 100644 --- a/public/content/translations/ar/defi/index.md +++ b/public/content/translations/ar/defi/index.md @@ -168,7 +168,7 @@ summaryPoint3: استنادًا إلى التكنولوجيا مفتوحة ال لكن لتتمكن من تنفيذ المثال المذكور أعلاه في عالم التمويل التقليدي، ستحتاج إلى مبلغ هائل من المال. ولا يتاح هذا النوع من إستراتيجيات كسب الأموال إلا لمن لديهم ثروات قائمة. القروض السريعة مثال على مستقبل لا يكون فيه وجود المال شرطًا مسبقًا ضروريًا لكسب المال. - + المزيد عن القروض السريعة diff --git a/public/content/translations/az/defi/index.md b/public/content/translations/az/defi/index.md index c03f9f3d9a7..2676ab60492 100644 --- a/public/content/translations/az/defi/index.md +++ b/public/content/translations/az/defi/index.md @@ -168,7 +168,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/flash-loans/) +[Flaş kreditləri haqqında daha çox](https://aave.com/docs/concepts/flash-loans/) diff --git a/public/content/translations/be/defi/index.md b/public/content/translations/be/defi/index.md index c3f44261b89..6e911e6f708 100644 --- a/public/content/translations/be/defi/index.md +++ b/public/content/translations/be/defi/index.md @@ -168,7 +168,7 @@ Ethereum пабудаваны на гэтым. Як і ў выпадку Біт Каб зрабіць здзейсніць вышэйшы прыклад у свеце традыцыйных фінансаў, вам спатрэбіцца вялікая колькасць грошай. Гэтыя стратэгіі, накіраваныя на тое, каб зарабіць грошы, даступныя толькі тым, у каго ўжо накоплена вялікае багацце. Вокамгненныя пазыкі з'яўляюцца прыкладам будучыні, у якой наяўнасць грошай не з'яўляецца абавязковай умовай для таго, каб зарабіць іх. - + Дакладней пра вокамгненныя пазыкі diff --git a/public/content/translations/bn/defi/index.md b/public/content/translations/bn/defi/index.md index bf76dd4e4fd..723ab7e9f50 100644 --- a/public/content/translations/bn/defi/index.md +++ b/public/content/translations/bn/defi/index.md @@ -168,7 +168,7 @@ Dai বা USDC-এর মতো কয়েনগুলির একটি ম প্রথাগত আর্থিক জগতে উপরের উদাহরণটি করতে সক্ষম হতে, আপনার প্রচুর পরিমাণ অর্থের প্রয়োজন হবে। এই অর্থ উপার্জন কৌশল শুধুমাত্র যাদের বিদ্যমান সম্পদ আছে তাদের অ্যাক্সেসযোগ্য। ফ্ল্যাশ লোন হল একটি ভবিষ্যতের উদাহরণ যেখানে অর্থ উপার্জনের জন্য অর্থ থাকা অপরিহার্য নয়। -[ফ্ল্যাশ লোন সম্পর্কে আরো](https://aave.com/flash-loans/) +[ফ্ল্যাশ লোন সম্পর্কে আরো](https://aave.com/docs/concepts/flash-loans/) diff --git a/public/content/translations/ca/defi/index.md b/public/content/translations/ca/defi/index.md index 3ad797a5dc3..1e0b215daf4 100644 --- a/public/content/translations/ca/defi/index.md +++ b/public/content/translations/ca/defi/index.md @@ -168,7 +168,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/flash-loans/) +[Més sobre préstecs ràpids](https://aave.com/docs/concepts/flash-loans/) diff --git a/public/content/translations/cs/defi/index.md b/public/content/translations/cs/defi/index.md index 373a9d7fb8a..2498d3e9365 100644 --- a/public/content/translations/cs/defi/index.md +++ b/public/content/translations/cs/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ DeFi je open-source hnutí. Všechny protokoly a aplikace DeFi jsou otevřené, - \ No newline at end of file + diff --git a/public/content/translations/de/defi/index.md b/public/content/translations/de/defi/index.md index 404ec495656..9802f9f46e5 100644 --- a/public/content/translations/de/defi/index.md +++ b/public/content/translations/de/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ DeFi ist eine Open-Source-Bewegung. DeFi-Protokolle und -Anwendungen sind für j - \ No newline at end of file + diff --git a/public/content/translations/es/defi/index.md b/public/content/translations/es/defi/index.md index e7f4c4ffd3b..c3d3d0109c8 100644 --- a/public/content/translations/es/defi/index.md +++ b/public/content/translations/es/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ DeFi es un proyecto de código abierto. Puede inspeccionar, copiar e innovar tod - \ No newline at end of file + diff --git a/public/content/translations/fa/defi/index.md b/public/content/translations/fa/defi/index.md index d3e480e6b52..c9a2c99732e 100644 --- a/public/content/translations/fa/defi/index.md +++ b/public/content/translations/fa/defi/index.md @@ -168,7 +168,7 @@ DeFi یک واژه‌ی کلی برای محصولات و خدمات مالی د برای این که بتوانید مثال پیش‌گفته را در نظام مالی سنتی دنیا انجام دهید، به مقدار بسیار زیادی پول نیاز دارید. این راهبردهای پول‌سازی تنها در دسترس افرادی هستند که سرمایه‌ی بسیار زیادی دارند. وام‌های لحظه‌ای نمونه‌ای از آینده‌ای هستند که داشتن پول از ملزومات پول درآوردن نخواهد بود. - + اطلاعات بیشتر درباره‌ی وام‌های لحظه‌ای diff --git a/public/content/translations/fil/defi/index.md b/public/content/translations/fil/defi/index.md index 4d9d744a0c6..c8a10e6ef88 100644 --- a/public/content/translations/fil/defi/index.md +++ b/public/content/translations/fil/defi/index.md @@ -168,7 +168,7 @@ Kung biglang bumaba ang supply ng palitan B at kulang ang binili ng user para sa Upang magawa ang halimbawa sa itaas sa tradisyunal na mundo ng pananalapi, kakailanganin mo ng napakalaking halaga ng pera. Ang mga estratehiya sa paggawa ng pera na ito ay naa-access lamang ng mga may umiiral na kayamanan. Ang mga mabilis na loan ay isang halimbawa ng hinaharap kung saan ang pagkakaroon ng pera ay hindi kinakailangan para kumita ng pera. - + Higit pang detalye tungkol sa mga mabilis na loan diff --git a/public/content/translations/fr/defi/index.md b/public/content/translations/fr/defi/index.md index 78a69fc6524..9e46ff2af9b 100644 --- a/public/content/translations/fr/defi/index.md +++ b/public/content/translations/fr/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ DeFi est un mouvement open source. Les protocoles et applications DeFi sont ouve - \ No newline at end of file + diff --git a/public/content/translations/ha/defi/index.md b/public/content/translations/ha/defi/index.md index 3fe85053fa3..b3f00eb3aec 100644 --- a/public/content/translations/ha/defi/index.md +++ b/public/content/translations/ha/defi/index.md @@ -168,7 +168,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 diff --git a/public/content/translations/hi/defi/index.md b/public/content/translations/hi/defi/index.md index df075a00546..1740e173473 100644 --- a/public/content/translations/hi/defi/index.md +++ b/public/content/translations/hi/defi/index.md @@ -168,7 +168,7 @@ DeFi की क्षमता को देखने का एक सबसे उपरोक्त उदाहरण को पारंपरिक वित्त दुनिया में करने के लिए, आपको बड़ी मात्रा में धन की आवश्यकता होती है। ये पैसे कमाने की रणनीतियाँ केवल उन्हीं तक पहुँचती हैं जिनके पास पहले से ही धन है। फ्लैश ऋण एक ऐसे भविष्य का उदाहरण है जहाँ पैसे कमाने के लिए पैसे होना आवश्यक नहीं है। - + फ़्लैश ऋण पर अधिक जानकारी @@ -358,4 +358,4 @@ DeFi एक ओपन-सोर्स गतिविधि है। DeFi प - \ No newline at end of file + diff --git a/public/content/translations/hu/defi/index.md b/public/content/translations/hu/defi/index.md index c800034cc64..ee869fde72a 100644 --- a/public/content/translations/hu/defi/index.md +++ b/public/content/translations/hu/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ A DeFi egy nyílt forráskódú kezdeményezés. A kapcsolódó protokollok és - \ No newline at end of file + diff --git a/public/content/translations/id/defi/index.md b/public/content/translations/id/defi/index.md index d306df3d8fa..7422f4f0a11 100644 --- a/public/content/translations/id/defi/index.md +++ b/public/content/translations/id/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ DeFi adalah gerakan sumber terbuka. Anda bisa memeriksa, melakukan fork, dan ber - \ No newline at end of file + diff --git a/public/content/translations/it/defi/index.md b/public/content/translations/it/defi/index.md index 8fbd2e9279c..c73cc677964 100644 --- a/public/content/translations/it/defi/index.md +++ b/public/content/translations/it/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ La DeFi è un movimento open source. I protocolli e le applicazioni della DeFi s - \ No newline at end of file + diff --git a/public/content/translations/ja/defi/index.md b/public/content/translations/ja/defi/index.md index 2f843c32aeb..3b7c7100cec 100644 --- a/public/content/translations/ja/defi/index.md +++ b/public/content/translations/ja/defi/index.md @@ -168,7 +168,7 @@ ETHを売却(課税対象)することなく、必要な資金を借り入れる 従来の金融の世界で上記の例を実行するには、莫大な資金が必要になります。 これらのお金儲けの戦略は、既存の富を持っている人にしかアクセスできません。 フラッシュローンは、お金を持っていることが必ずしもお金を稼ぐための前提条件ではないという未来の一例です。 - + フラッシュローンの詳細 @@ -358,4 +358,4 @@ PoolTogetherのような損失のない宝くじは、楽しく革新的な新 - \ No newline at end of file + diff --git a/public/content/translations/kn/defi/index.md b/public/content/translations/kn/defi/index.md index 34cb39b70e1..f1cb31a3bb0 100644 --- a/public/content/translations/kn/defi/index.md +++ b/public/content/translations/kn/defi/index.md @@ -168,7 +168,7 @@ Dai ಅಥವಾ USDCಯಂತಹ ನಾಣ್ಯಗಳು ಡಾಲರ್ನ ಸಾಂಪ್ರದಾಯಿಕ ಹಣಕಾಸು ಜಗತ್ತಿನಲ್ಲಿ ಮೇಲಿನ ಉದಾಹರಣೆಯನ್ನು ಮಾಡಲು, ನಿಮಗೆ ಅಪಾರ ಪ್ರಮಾಣದ ಹಣ ಬೇಕಾಗುತ್ತದೆ. ಈ ಹಣ ಮಾಡುವ ತಂತ್ರಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಸಂಪತ್ತನ್ನು ಹೊಂದಿರುವವರಿಗೆ ಮಾತ್ರ ಪ್ರವೇಶಿಸುತ್ತವೆ. ಫ್ಲ್ಯಾಶ್ ಸಾಲಗಳು ಭವಿಷ್ಯದ ಉದಾಹರಣೆಯಾಗಿದ್ದು, ಅಲ್ಲಿ ಹಣವನ್ನು ಹೊಂದಿರುವುದು ಹಣ ಸಂಪಾದಿಸಲು ಪೂರ್ವಾಪೇಕ್ಷಿತವಲ್ಲ. -[ಫ್ಲ್ಯಾಶ್ ಲೋನ್‍ಗಳ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು](https://aave.com/flash-loans/) +[ಫ್ಲ್ಯಾಶ್ ಲೋನ್‍ಗಳ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು](https://aave.com/docs/concepts/flash-loans/) diff --git a/public/content/translations/ko/defi/index.md b/public/content/translations/ko/defi/index.md index dd80b320d21..14406528c59 100644 --- a/public/content/translations/ko/defi/index.md +++ b/public/content/translations/ko/defi/index.md @@ -168,7 +168,7 @@ summaryPoint3: 누구나 프로그래밍할 수 있는 오픈 소스 기술을 전형적인 금융 세계에서 위의 예시를 가능하게 하려면 엄청난 돈이 필요합니다. 이러한 돈벌이 전략은 기존의 부를 가진 사람들만이 접근할 수 있습니다. 플래시 론은 돈을 버는 것의 전제 조건이 돈을 소유하는 것이 아니라는 미래의 예시입니다. - + 플래시 론에 대해 더 보기 diff --git a/public/content/translations/mr/defi/index.md b/public/content/translations/mr/defi/index.md index b23ec2cac4c..3f0da80d1d4 100644 --- a/public/content/translations/mr/defi/index.md +++ b/public/content/translations/mr/defi/index.md @@ -168,7 +168,7 @@ Dai किंवा USDC सारख्या नाण्यांचे म पारंपारिक वित्त जगात वरील उदाहरण करण्यास सक्षम होण्यासाठी, तुम्हाला खूप मोठ्या रकमेची आवश्यकता असेल. पैसे कमावण्याच्या या रणनीती केवळ विद्यमान संपत्ती असलेल्यांनाच उपलब्ध आहेत. फ्लॅश लोन हे भविष्याचे एक उदाहरण आहे जिथे पैसे कमावण्‍यासाठी पैसे असणे ही एक पूर्व शर्त नाही. -[फ्लॅश कर्जावर अधिक](https://aave.com/flash-loans/) +[फ्लॅश कर्जावर अधिक](https://aave.com/docs/concepts/flash-loans/) diff --git a/public/content/translations/ms/defi/index.md b/public/content/translations/ms/defi/index.md index 91b4a3938a5..e20fa104c9f 100644 --- a/public/content/translations/ms/defi/index.md +++ b/public/content/translations/ms/defi/index.md @@ -168,7 +168,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 diff --git a/public/content/translations/nl/defi/index.md b/public/content/translations/nl/defi/index.md index c3d0412da34..8769b8a9a17 100644 --- a/public/content/translations/nl/defi/index.md +++ b/public/content/translations/nl/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ DeFi is een open-source beweging. De DeFi-protocollen en -applicaties staan alle - \ No newline at end of file + diff --git a/public/content/translations/pcm/defi/index.md b/public/content/translations/pcm/defi/index.md index f90f947a412..5f3910e26db 100644 --- a/public/content/translations/pcm/defi/index.md +++ b/public/content/translations/pcm/defi/index.md @@ -168,7 +168,7 @@ If ekshanj B supply don drop sudenly and di user nor fit buy enuf to kova di ori Tu bi abol to do di above eksampol for di tradishonal finans world, yu go nid plenti amount of monie. Dis strategis wey dey make monie only dey assessibol to doz wit wealth wey dey exist. Flash loans na eksampol of one fushure wia to get monie nor dey necessary make dey make monie. - + More wey dey on flash loans @@ -358,4 +358,4 @@ DeFi na open-source movement. Di DeFi protokols and aplikashons dey open for yu - \ No newline at end of file + diff --git a/public/content/translations/pl/defi/index.md b/public/content/translations/pl/defi/index.md index 914a5c02bb3..441c9aee3e1 100644 --- a/public/content/translations/pl/defi/index.md +++ b/public/content/translations/pl/defi/index.md @@ -168,7 +168,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 diff --git a/public/content/translations/pt-br/defi/index.md b/public/content/translations/pt-br/defi/index.md index 254eb18ba3c..49298454efc 100644 --- a/public/content/translations/pt-br/defi/index.md +++ b/public/content/translations/pt-br/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ DeFi é um movimento de código aberto. Os protocolos e aplicações DeFi são t - \ No newline at end of file + diff --git a/public/content/translations/pt/defi/index.md b/public/content/translations/pt/defi/index.md index 7fbae1c5762..6b7ba057975 100644 --- a/public/content/translations/pt/defi/index.md +++ b/public/content/translations/pt/defi/index.md @@ -168,7 +168,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/flash-loans/) +[Mais informações sobre empréstimos instantâneos](https://aave.com/docs/concepts/flash-loans/) diff --git a/public/content/translations/ro/defi/index.md b/public/content/translations/ro/defi/index.md index 45e15daabec..85ec4d1c171 100644 --- a/public/content/translations/ro/defi/index.md +++ b/public/content/translations/ro/defi/index.md @@ -168,7 +168,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/flash-loans/) +[Mai multe despre împrumuturile flash](https://aave.com/docs/concepts/flash-loans/) diff --git a/public/content/translations/ru/defi/index.md b/public/content/translations/ru/defi/index.md index 533e9bb5480..ad23c412ae5 100644 --- a/public/content/translations/ru/defi/index.md +++ b/public/content/translations/ru/defi/index.md @@ -168,7 +168,7 @@ Ethereum построен на этом. Как и в Bitcoin, правила н Чтобы выполнить приведенный выше пример в мире традиционных финансов, вам потребуется огромная сумма денег. Эти стратегии зарабатывания денег доступны только тем, у кого уже имеется большое благосостояние. Срочные займы являются примером будущего, в котором наличие денег не является обязательным условием для зарабатывания денег. - + Подробнее о срочных займах @@ -358,4 +358,4 @@ DeFi — это движение с открытым исходным кодом - \ No newline at end of file + diff --git a/public/content/translations/sk/defi/index.md b/public/content/translations/sk/defi/index.md index c35fbdc645a..46e26763ab4 100644 --- a/public/content/translations/sk/defi/index.md +++ b/public/content/translations/sk/defi/index.md @@ -168,7 +168,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 diff --git a/public/content/translations/sl/defi/index.md b/public/content/translations/sl/defi/index.md index 5b39281f5b1..7f2d50c94b2 100644 --- a/public/content/translations/sl/defi/index.md +++ b/public/content/translations/sl/defi/index.md @@ -158,7 +158,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/flash-loans/) +[Več o flash posojilih](https://aave.com/docs/concepts/flash-loans/) diff --git a/public/content/translations/sr/defi/index.md b/public/content/translations/sr/defi/index.md index 0fb7875773d..9898ecd0c0b 100644 --- a/public/content/translations/sr/defi/index.md +++ b/public/content/translations/sr/defi/index.md @@ -168,7 +168,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 diff --git a/public/content/translations/te/defi/index.md b/public/content/translations/te/defi/index.md index a55450528d7..2f6ad52e747 100644 --- a/public/content/translations/te/defi/index.md +++ b/public/content/translations/te/defi/index.md @@ -168,7 +168,7 @@ DeFi యొక్క సామర్థ్యాన్ని చూడటాన సాంప్రదాయ ఫైనాన్స్ ప్రపంచంలో పై ఉదాహరణను చేయడానికి, మీకు అపారమైన డబ్బు అవసరం. ఈ డబ్బు సంపాదించే వ్యూహాలు ప్రస్తుత సంపద ఉన్నవారికి మాత్రమే అందుబాటులో ఉంటాయి. ఫ్లాష్ లోన్‌లు భవిష్యత్తుకు ఉదాహరణగా చెప్పవచ్చు, ఇక్కడ డబ్బు సంపాదించడానికి తప్పనిసరిగా డబ్బు అవసరం లేదు. - + ఫ్లాష్ లోన్‌లపై మరిన్ని diff --git a/public/content/translations/tl/defi/index.md b/public/content/translations/tl/defi/index.md index c344c694a82..da0e71c48d4 100644 --- a/public/content/translations/tl/defi/index.md +++ b/public/content/translations/tl/defi/index.md @@ -168,7 +168,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 diff --git a/public/content/translations/tr/defi/index.md b/public/content/translations/tr/defi/index.md index f88cbb322a2..e31945bc4f0 100644 --- a/public/content/translations/tr/defi/index.md +++ b/public/content/translations/tr/defi/index.md @@ -168,7 +168,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 diff --git a/public/content/translations/uk/defi/index.md b/public/content/translations/uk/defi/index.md index 16e6e643a02..8003c4d0b97 100644 --- a/public/content/translations/uk/defi/index.md +++ b/public/content/translations/uk/defi/index.md @@ -168,7 +168,7 @@ Ethereum можна використовувати для потокового Щоб виконати наведений процес у світі традиційних фінансів, вам знадобиться величезна сума грошей. Подібні стратегії заробітку доступні лише заможним людям. Миттєві позики — це приклад того, як у майбутньому наявність коштів не буде обов’язковою умовою для заробітку. - + Докладніше про миттєві позики diff --git a/public/content/translations/uz/defi/index.md b/public/content/translations/uz/defi/index.md index fb4aabc8d41..17243b5bb45 100644 --- a/public/content/translations/uz/defi/index.md +++ b/public/content/translations/uz/defi/index.md @@ -168,7 +168,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 @@ -358,4 +358,4 @@ DeFi — bu ochiq kodli harakat. DeFi protokollari va ilovalarining barchasi siz - \ No newline at end of file + diff --git a/public/content/translations/vi/defi/index.md b/public/content/translations/vi/defi/index.md index 662f6f06ee8..6e287d287f5 100644 --- a/public/content/translations/vi/defi/index.md +++ b/public/content/translations/vi/defi/index.md @@ -168,7 +168,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 diff --git a/public/content/translations/yo/defi/index.md b/public/content/translations/yo/defi/index.md index 4e083c78f71..c643d8cb8fe 100644 --- a/public/content/translations/yo/defi/index.md +++ b/public/content/translations/yo/defi/index.md @@ -168,7 +168,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ẹ̀ diff --git a/public/content/translations/zh-tw/defi/index.md b/public/content/translations/zh-tw/defi/index.md index 53b5ab4ae2b..e2ab11cee56 100644 --- a/public/content/translations/zh-tw/defi/index.md +++ b/public/content/translations/zh-tw/defi/index.md @@ -168,7 +168,7 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 要在傳統金融體系內完成以上操作,你需要鉅額資金。 這種財產創造策略只有已經擁有財富的人才能操作。 閃電貸的例子告訴我們,未來「有錢」不見得是「賺錢」的先決條件。 - + 深入了解閃電貸 @@ -358,4 +358,4 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 - \ No newline at end of file + From 442fc51e425056510be6a96105db5e7cffab9014 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 12:29:44 -0500 Subject: [PATCH 018/368] change https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97 to https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97 --- .../tutorials/reverse-engineering-a-contract/index.md | 2 +- .../tutorials/reverse-engineering-a-contract/index.md | 2 +- .../tutorials/reverse-engineering-a-contract/index.md | 2 +- .../tutorials/reverse-engineering-a-contract/index.md | 2 +- .../tutorials/reverse-engineering-a-contract/index.md | 2 +- .../tutorials/reverse-engineering-a-contract/index.md | 2 +- .../tutorials/reverse-engineering-a-contract/index.md | 2 +- .../tutorials/reverse-engineering-a-contract/index.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/public/content/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/developers/tutorials/reverse-engineering-a-contract/index.md index f1ff9f47fcf..d4975d9425a 100644 --- a/public/content/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/developers/tutorials/reverse-engineering-a-contract/index.md @@ -563,7 +563,7 @@ And that the methods it supports are: | Method | Method signature | Offset to jump into | | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------- | -| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | | [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | | [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | | [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | diff --git a/public/content/translations/es/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/es/developers/tutorials/reverse-engineering-a-contract/index.md index 7ed1f6045b4..49e8245eacd 100644 --- a/public/content/translations/es/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/es/developers/tutorials/reverse-engineering-a-contract/index.md @@ -565,7 +565,7 @@ Y que los métodos que admite son: | Método | Firma del método | Offset para saltar | | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------ | -| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | | [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | | [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | | [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | diff --git a/public/content/translations/fr/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/fr/developers/tutorials/reverse-engineering-a-contract/index.md index 0ebbb431a54..8ff3bbcb96b 100644 --- a/public/content/translations/fr/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/fr/developers/tutorials/reverse-engineering-a-contract/index.md @@ -565,7 +565,7 @@ Et que les méthodes qu'il supporte sont : | Méthode | Signature de la méthode | Décalage vers lequel sauter | | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | --------------------------- | -| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | | [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | | [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | | [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | diff --git a/public/content/translations/it/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/it/developers/tutorials/reverse-engineering-a-contract/index.md index 9cec3174503..573165f42a8 100644 --- a/public/content/translations/it/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/it/developers/tutorials/reverse-engineering-a-contract/index.md @@ -565,7 +565,7 @@ E che i metodi che supporta sono: | Metodo | Firma del metodo | Offset a cui saltare | | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------- | -| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | | [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | | [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | | [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | diff --git a/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md index 66a13e99b02..65be561f7d7 100644 --- a/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md @@ -565,7 +565,7 @@ calldataload(4)がStorage[4]より小さい場合、次のコードになりま | メソッド | メソッドシグネチャ | ジャンプ先のオフセット | | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------- | -| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | | [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | | [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | | [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | diff --git a/public/content/translations/pt-br/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/pt-br/developers/tutorials/reverse-engineering-a-contract/index.md index 7cd8a430e82..e599959d7c7 100644 --- a/public/content/translations/pt-br/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/pt-br/developers/tutorials/reverse-engineering-a-contract/index.md @@ -565,7 +565,7 @@ E os métodos que ele suporta são: | Método | Assinatura do método | Deslocamento por salto | | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---------------------- | -| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | | [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | | [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | | [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | diff --git a/public/content/translations/tr/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/tr/developers/tutorials/reverse-engineering-a-contract/index.md index 8daed3ea1eb..e4eb17d92d2 100644 --- a/public/content/translations/tr/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/tr/developers/tutorials/reverse-engineering-a-contract/index.md @@ -565,7 +565,7 @@ Desteklediği yöntemler: | Metod | Yöntem imzası | Atlamak için ofset | | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------ | -| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | | [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | | [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | | [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | diff --git a/public/content/translations/zh/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/zh/developers/tutorials/reverse-engineering-a-contract/index.md index aaa965a2d4c..bd4d4c25e36 100644 --- a/public/content/translations/zh/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/zh/developers/tutorials/reverse-engineering-a-contract/index.md @@ -567,7 +567,7 @@ Etherscan 指出 `1C` 是一个未知操作码,因为[它是在 Etherscan 编 | 方法 | 方法签名 | 跳转到的偏移量 | | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------- | -| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/x/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | | [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | | [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | | [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | From 161ca6d7bcab99d00cdb27704bbc76d6eda539d5 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 12:46:10 -0500 Subject: [PATCH 019/368] change https://docs.zksync.io/zk-stack/concepts/data-availability to https://docs.zksync.io/zksync-protocol/rollup/data-availability --- public/content/developers/docs/scaling/validium/index.md | 2 +- .../translations/cs/developers/docs/scaling/validium/index.md | 2 +- .../translations/es/developers/docs/scaling/validium/index.md | 2 +- .../translations/fr/developers/docs/scaling/validium/index.md | 2 +- .../translations/hu/developers/docs/scaling/validium/index.md | 2 +- .../translations/it/developers/docs/scaling/validium/index.md | 2 +- .../translations/ja/developers/docs/scaling/validium/index.md | 2 +- .../pt-br/developers/docs/scaling/validium/index.md | 2 +- .../translations/tr/developers/docs/scaling/validium/index.md | 2 +- .../zh-tw/developers/docs/scaling/validium/index.md | 2 +- .../translations/zh/developers/docs/scaling/validium/index.md | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/content/developers/docs/scaling/validium/index.md b/public/content/developers/docs/scaling/validium/index.md index 11d2ec76569..cd650257243 100644 --- a/public/content/developers/docs/scaling/validium/index.md +++ b/public/content/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Multiple projects provide implementations of Validium and volitions that you can **Matter Labs zkPorter**- _zkPorter is a Layer 2 scaling protocol tackling data availability with a hybrid approach that combines the ideas of zkRollup and sharding. It can support arbitrarily many shards, each with its own data availability policy._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [Documentation](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [Documentation](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Website](https://zksync.io/) ## Further reading {#further-reading} diff --git a/public/content/translations/cs/developers/docs/scaling/validium/index.md b/public/content/translations/cs/developers/docs/scaling/validium/index.md index 366164c5765..3ca3b9b0325 100644 --- a/public/content/translations/cs/developers/docs/scaling/validium/index.md +++ b/public/content/translations/cs/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Několik projektů poskytuje implementace validia a volitia, které můžete int **Matter Labs zkPorter** – _zkPorter je škálovací protokol druhé vrstvy, který řeší dostupnost dat hybridním přístupem, který kombinuje myšlenky zkRollupu a shardingu. Může podporovat libovolný počet shardů, každý s vlastní politikou dostupnosti dat._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [Dokumentace](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [Dokumentace](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Web](https://zksync.io/) ## Další informace {#further-reading} diff --git a/public/content/translations/es/developers/docs/scaling/validium/index.md b/public/content/translations/es/developers/docs/scaling/validium/index.md index e22e83ae038..c700e0f8939 100644 --- a/public/content/translations/es/developers/docs/scaling/validium/index.md +++ b/public/content/translations/es/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Múltiples proyectos proporcionan implementaciones de Validium y voliciones que **Matter Labs zkPorter:**_zkPorter es un protocolo de escalado de capa 2 que aborda la disponibilidad de datos con un enfoque híbrido que combina las ideas de zkRollup y el sharding. Puede soportar arbitrariamente muchos fragmentos (shards), cada uno con su propia política de disponibilidad de datos. _ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [Documentación](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [Documentación](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Sitio web](https://zksync.io/) ## Más información {#further-reading} diff --git a/public/content/translations/fr/developers/docs/scaling/validium/index.md b/public/content/translations/fr/developers/docs/scaling/validium/index.md index fa20049b478..f09578e1b4a 100644 --- a/public/content/translations/fr/developers/docs/scaling/validium/index.md +++ b/public/content/translations/fr/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ De multiples projets fournissent des implémentations de Validium et de volition **Matter Labs zkPorter**- _zkPorter est un protocole de mise à l'échelle de couche 2 s'attaquant à la disponibilité des données avec une approche hybride qui combine les idées de rollup ZK et de fragmentation. Il peut prendre en charge un nombre arbitraire de fragments, chacun ayant sa propre politique de disponibilité des données._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [Documentation](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [Documentation](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Site Web](https://zksync.io/) ## Complément d'information {#further-reading} diff --git a/public/content/translations/hu/developers/docs/scaling/validium/index.md b/public/content/translations/hu/developers/docs/scaling/validium/index.md index 696bd6c534c..267adffa313 100644 --- a/public/content/translations/hu/developers/docs/scaling/validium/index.md +++ b/public/content/translations/hu/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Több projekt is kínál olyan validium- és volitionimplementációkat, amelyek **Matter Labs zkPorter** – _A zkPorter egy L2 skálázási protokoll, amely a zkRollup és a sharding ötleteit ötvöző hibrid megközelítéssel kezeli az adatelérhetőséget. Tetszőlegesen sok shardot támogathat, mindegyik saját adatelérhetőségi szabályzattal._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [Dokumentáció](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [Dokumentáció](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Honlap](https://zksync.io/) ## További információ {#further-reading} diff --git a/public/content/translations/it/developers/docs/scaling/validium/index.md b/public/content/translations/it/developers/docs/scaling/validium/index.md index edb6e97a679..ea548046013 100644 --- a/public/content/translations/it/developers/docs/scaling/validium/index.md +++ b/public/content/translations/it/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Diversi progetti forniscono implementazioni di validium e volizioni che puoi int **Matter Labs zkPorter**- _zkPorter è un protocollo di ridimensionamento del Livello 2 che affronta la disponibilità dei dati con un approccio ibrido che combina le idee dei rollup Zk e dello sharding. Può supportare arbitrariamente molti shard, ognuno con la propria politica di disponibilità dei dati._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [Documentazione](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [Documentazione](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Sito web](https://zksync.io/) ## Letture consigliate {#further-reading} diff --git a/public/content/translations/ja/developers/docs/scaling/validium/index.md b/public/content/translations/ja/developers/docs/scaling/validium/index.md index 9063b987952..480f57f9fb5 100644 --- a/public/content/translations/ja/developers/docs/scaling/validium/index.md +++ b/public/content/translations/ja/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Volitionsは、ゼロ知識ロールアップとバリディアムチェーン **Matter Labs zkPorter**- _zkPorterは、ゼロ知識ロールアップとシャーディングを結合したハイブリッド型のアプローチによりデータ化要請を追跡する、レイヤー2のスケーリング・プロトコルです。 任意の数のシャードをサポートしており、シャードごとに異なるデータ可用性ポリシーを定めることができます。_ - [ブログ](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [ドキュメント](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [ドキュメント](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [ウェブサイト](https://zksync.io/) ## 参考文献 {#further-reading} diff --git a/public/content/translations/pt-br/developers/docs/scaling/validium/index.md b/public/content/translations/pt-br/developers/docs/scaling/validium/index.md index 8e3533d6d56..cf29cf30b1e 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/validium/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Vários projetos fornecem implementações de validium e volitions que você pod **Matter Labs zkPorter**: _zkPorter é um protocolo de dimensionamento de camada 2 que aborda a disponibilidade de dados com uma abordagem híbrida que combina os conceitos de zkRollup e sharding. Pode suportar arbitrariamente muitos shards, cada um com sua própria política de disponibilidade de dados._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [Documentação](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [Documentação](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Website](https://zksync.io/) ## Leitura adicional {#further-reading} diff --git a/public/content/translations/tr/developers/docs/scaling/validium/index.md b/public/content/translations/tr/developers/docs/scaling/validium/index.md index 2c4afa76625..ba745c10845 100644 --- a/public/content/translations/tr/developers/docs/scaling/validium/index.md +++ b/public/content/translations/tr/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Merkeziyetsiz uygulamalarınıza entegre edebileceğiniz Validium ve istemlere i **Matter Labs zkPorter** - _zkPorter, zkRollup ve parçalama fikirlerini birleştirerek veri kullanılabilirliğini hibrit bir yaklaşımla ele alan bir Katman 2 ölçeklendirme protokolüdür. Her biri kendi veri kullanılabilirliği politikasına sahip, keyfi çok sayıda parçayı destekleyebilir._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [Belgeler](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [Belgeler](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Web sitesi](https://zksync.io/) ## Daha fazla okuma {#further-reading} diff --git a/public/content/translations/zh-tw/developers/docs/scaling/validium/index.md b/public/content/translations/zh-tw/developers/docs/scaling/validium/index.md index acf85470894..5fedd7d604c 100644 --- a/public/content/translations/zh-tw/developers/docs/scaling/validium/index.md +++ b/public/content/translations/zh-tw/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Validium 透過將所有交易資料保存在鏈外,並在轉送狀態更新 **Matter Labs zkPorter**- _zkPorter 是一個二層網路擴張協定,它使用一種結合了零知識卷軸與分片理念的混合方法來處理資料可用性。 它可支援任意數量的分片,每個分片都有自己的資料可用性原則。_ - [部落格](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [文件](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [文件](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [網站](https://zksync.io/) ## 衍生閱讀 {#further-reading} diff --git a/public/content/translations/zh/developers/docs/scaling/validium/index.md b/public/content/translations/zh/developers/docs/scaling/validium/index.md index b298e4bc24b..eef58dd0131 100644 --- a/public/content/translations/zh/developers/docs/scaling/validium/index.md +++ b/public/content/translations/zh/developers/docs/scaling/validium/index.md @@ -154,7 +154,7 @@ Validium 实现了可扩展性,它将所有交易数据保存在链下并且 **Matter Labs zkPorter**- _zkPorter 是一个二层扩容协议,它用一种结合了零知识卷叠和分片观点的混合方法来处理数据可用性。 它支持任意多个分片,每个分片都有自己的数据可用性策略。_ - [博客](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) -- [相关文档](https://docs.zksync.io/zk-stack/concepts/data-availability) +- [相关文档](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [网站](https://zksync.io/) ## 延伸阅读 {#further-reading} From dcc648332260fe753cb532fcaa2c492073573a77 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 12:51:37 -0500 Subject: [PATCH 020/368] changing https://hudsonjameson.com/202020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/ to https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/ - date was incorrect --- public/content/translations/de/eips/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/de/eips/index.md b/public/content/translations/de/eips/index.md index a8debca131c..79c9270961a 100644 --- a/public/content/translations/de/eips/index.md +++ b/public/content/translations/de/eips/index.md @@ -74,6 +74,6 @@ Jeder kann ein EIP erstellen. Bevor man einen Vorschlag einreicht, muss man [EIP -Seiteninhalte zum Teil von [Governance bei der Ethereum-Protokollentwicklung und Koordinierung von Netzwerk-Upgrades](https://hudsonjameson.com/202020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) Hudson Jameson bereitgestellt +Seiteninhalte zum Teil von [Governance bei der Ethereum-Protokollentwicklung und Koordinierung von Netzwerk-Upgrades](https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) Hudson Jameson bereitgestellt From 797cf2326aa01692b137035e97c9bc5c9ce17ccc Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 13:01:26 -0500 Subject: [PATCH 021/368] changing https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations to https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations --- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- .../tutorials/a-developers-guide-to-ethereum-part-one/index.md | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/content/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 44c29376d1f..4d090ab049b 100644 --- a/public/content/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -139,7 +139,7 @@ A similar pattern is used when handling transactions in ether. However, i -Try converting some values to and from wei. Note that [there are names for many of the denominations](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) in between ether and wei. One of the better known among them is **gwei**, as it’s often how transaction fees are represented. +Try converting some values to and from wei. Note that [there are names for many of the denominations](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) in between ether and wei. One of the better known among them is **gwei**, as it’s often how transaction fees are represented. ```python In [2]: Web3.to_wei(1, 'ether') diff --git a/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 12a90809e15..9d19e536037 100644 --- a/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -140,7 +140,7 @@ Transaktionen in Ether werden in ähnlicher Weise verwaltet. Aber statt z -Versuchen Sie, einige Werte nach und von Wei zu konvertieren. [Beachten Sie](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations), dass es zwischen Ether und Wei noch andere Einheiten gibt. Eine der bekanntesten ist **Gwei**, da Transaktionsgebühren in dieser Einheit angegeben werden. +Versuchen Sie, einige Werte nach und von Wei zu konvertieren. [Beachten Sie](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations), dass es zwischen Ether und Wei noch andere Einheiten gibt. Eine der bekanntesten ist **Gwei**, da Transaktionsgebühren in dieser Einheit angegeben werden. ```python In [2]: Web3.toWei(1, 'ether') diff --git a/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index ccb114f75d0..d2f000e9aeb 100644 --- a/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -136,7 +136,7 @@ Se usa un patrón similar cuando se escriben transacciones en ether. Sin -Pruebe convertir algunos valores a y desde wei. Tenga en cuenta que [hay nombres para muchas de las denominaciones](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) entre ether y wei. Una de las más conocidas es **gwei**, ya que es como suelen representarse las comisiones de las transacciones. +Pruebe convertir algunos valores a y desde wei. Tenga en cuenta que [hay nombres para muchas de las denominaciones](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) entre ether y wei. Una de las más conocidas es **gwei**, ya que es como suelen representarse las comisiones de las transacciones. ```python In [2]: Web3.to_wei(1, 'ether') diff --git a/public/content/translations/fr/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/fr/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 6d403d29821..e8ae60a4b66 100644 --- a/public/content/translations/fr/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/fr/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -140,7 +140,7 @@ Un schéma similaire est utilisé lors de la gestion des transactions en ethe -Essayez de convertir certaines valeurs depuis et vers le wei. Notez qu'il y a [des noms pour un grand nombre de dénominations](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) entre ether et wei. L'une des plus connues est le **gwei**, car c'est souvent la façon dont les frais de transaction sont représentés. +Essayez de convertir certaines valeurs depuis et vers le wei. Notez qu'il y a [des noms pour un grand nombre de dénominations](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) entre ether et wei. L'une des plus connues est le **gwei**, car c'est souvent la façon dont les frais de transaction sont représentés. ```python In [2]: Web3.to_wei(1, 'ether') diff --git a/public/content/translations/id/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/id/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index b430a63f76d..f4149eb7fd8 100644 --- a/public/content/translations/id/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/id/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -140,7 +140,7 @@ Pola yang sama digunakan ketika menangani transaksi dalam ether. Namun, a -Cobalah untuk mengubah beberapa nilai ke dan dari wei. Perhatikan bahwa [ada nama untuk banyak denominasi](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) di antara ether dan wei. Salah satu yang lebih dikenal di antaranya adalah **gwei**, karena sering menjadi cara mewakili biaya transaksi. +Cobalah untuk mengubah beberapa nilai ke dan dari wei. Perhatikan bahwa [ada nama untuk banyak denominasi](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) di antara ether dan wei. Salah satu yang lebih dikenal di antaranya adalah **gwei**, karena sering menjadi cara mewakili biaya transaksi. ```python In [2]: Web3.toWei(1, 'ether') diff --git a/public/content/translations/it/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/it/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 5141e16c50f..ab9970efdcc 100644 --- a/public/content/translations/it/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/it/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -140,7 +140,7 @@ Uno schema simile è usato per gestire le transazioni in ether. Tuttavia, -Prova a convertire dei valori da e verso wei. Nota che [esistono nomi per molte delle denominazioni](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) tra ether e wei. Una delle più note è **gwei**, spesso utilizzata per rappresentare le commissioni di transazione. +Prova a convertire dei valori da e verso wei. Nota che [esistono nomi per molte delle denominazioni](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) tra ether e wei. Una delle più note è **gwei**, spesso utilizzata per rappresentare le commissioni di transazione. ```python In [2]: Web3.to_wei(1, 'ether') diff --git a/public/content/translations/ja/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/ja/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 872577ba549..fc714c9ba56 100644 --- a/public/content/translations/ja/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/ja/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -136,7 +136,7 @@ In [1]: from web3 import Web3 -好きな数字でweiとETH(ether)を変換してみてください。 なお、ETHとweiの間には、[さまざまな単位の名称があります](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations)。 その中でよく使われているのは、**gwei**です。これは基本的に手数料を意味します。 +好きな数字でweiとETH(ether)を変換してみてください。 なお、ETHとweiの間には、[さまざまな単位の名称があります](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations)。 その中でよく使われているのは、**gwei**です。これは基本的に手数料を意味します。 ```python In [2]: Web3.to_wei(1, 'ether') diff --git a/public/content/translations/pt-br/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/pt-br/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 92f81bc759d..7e4e56b22c1 100644 --- a/public/content/translations/pt-br/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/pt-br/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -140,7 +140,7 @@ Um padrão similar é usado ao lidar com transações em ether. No entant -Tente converter alguns valores de e para wei. Note que [existem nomes para muitas das denominações](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) entre ether e wei. Um dos mais conhecidos entre eles é o **gwei**, já que é frequentemente como as taxas de transação são representadas. +Tente converter alguns valores de e para wei. Note que [existem nomes para muitas das denominações](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) entre ether e wei. Um dos mais conhecidos entre eles é o **gwei**, já que é frequentemente como as taxas de transação são representadas. ```python In [2]: Web3.to_wei(1, 'ether') diff --git a/public/content/translations/ro/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/ro/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 5478e60f6ed..b90ca78b5ed 100644 --- a/public/content/translations/ro/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/ro/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -140,7 +140,7 @@ Un model similar este utilizat la gestionarea tranzacțiilor în ether. N -Încercați să convertiți câteva valori în și din wei. Rețineți că [există și alte denumiri pentru numeroasele denominații](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) între ether și wei. Una din cele mai cunoscute dintre ele este **gwei**, deoarece este adesea modalitatea de reprezentare a taxelor de tranzacție. +Încercați să convertiți câteva valori în și din wei. Rețineți că [există și alte denumiri pentru numeroasele denominații](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) între ether și wei. Una din cele mai cunoscute dintre ele este **gwei**, deoarece este adesea modalitatea de reprezentare a taxelor de tranzacție. ```python In [2]: Web3.toWei(1, 'ether') diff --git a/public/content/translations/tr/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/tr/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 0babac49e8e..c347785407d 100644 --- a/public/content/translations/tr/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/tr/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -140,7 +140,7 @@ Not: Bilgisayarlar, ondalık matematiği işlemede çok kötüdür. Bunu aşmak -Bazı değerleri wei'ye ve wei'den dönüştürmeyi deneyin. Ether ve wei [arasındaki çok sayıda birim için isimler olduğunu](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) unutmayın. Bunlar arasında daha iyi bilinenlerden biri **gwei**'dir, çünkü genellikle işlem ücretleri bu şekilde gösterilir. +Bazı değerleri wei'ye ve wei'den dönüştürmeyi deneyin. Ether ve wei [arasındaki çok sayıda birim için isimler olduğunu](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) unutmayın. Bunlar arasında daha iyi bilinenlerden biri **gwei**'dir, çünkü genellikle işlem ücretleri bu şekilde gösterilir. ```python In [2]: Web3.to_wei(1, 'ether') diff --git a/public/content/translations/zh/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/zh/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 738db4c3e02..d92aa5ede8c 100644 --- a/public/content/translations/zh/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/zh/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -140,7 +140,7 @@ In [1]: from web3 import Web3 -试一下将一些数值转换为 wei 或反向转换。 请注意, [ETH 和 wei 之间还有其他面额](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations)名称。 其中比较有名的是 **gwei**,因为它通常用于表示交易费用。 +试一下将一些数值转换为 wei 或反向转换。 请注意, [ETH 和 wei 之间还有其他面额](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations)名称。 其中比较有名的是 **gwei**,因为它通常用于表示交易费用。 ```python In [2]: Web3.toWei(1, 'ether') From 99d18e52de3b25897cb7657b7c48bc294054dc1a Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 13:03:07 -0500 Subject: [PATCH 022/368] changing https://faucet.chainstack.com/sepolia-faucet to https://faucet.chainstack.com/sepolia-testnet-faucet --- public/content/developers/docs/networks/index.md | 2 +- .../content/translations/cs/developers/docs/networks/index.md | 2 +- .../content/translations/de/developers/docs/networks/index.md | 2 +- .../content/translations/el/developers/docs/networks/index.md | 2 +- .../content/translations/es/developers/docs/networks/index.md | 2 +- .../content/translations/fa/developers/docs/networks/index.md | 2 +- .../content/translations/fr/developers/docs/networks/index.md | 2 +- .../content/translations/hu/developers/docs/networks/index.md | 2 +- .../content/translations/it/developers/docs/networks/index.md | 2 +- .../content/translations/ja/developers/docs/networks/index.md | 2 +- .../content/translations/nl/developers/docs/networks/index.md | 2 +- .../content/translations/pl/developers/docs/networks/index.md | 2 +- .../translations/pt-br/developers/docs/networks/index.md | 2 +- .../content/translations/ru/developers/docs/networks/index.md | 2 +- .../content/translations/tr/developers/docs/networks/index.md | 2 +- .../translations/zh-tw/developers/docs/networks/index.md | 2 +- .../content/translations/zh/developers/docs/networks/index.md | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/public/content/developers/docs/networks/index.md b/public/content/developers/docs/networks/index.md index fa0b8ae9bf6..a7dca454f37 100644 --- a/public/content/developers/docs/networks/index.md +++ b/public/content/developers/docs/networks/index.md @@ -61,7 +61,7 @@ The Sepolia network uses a permissioned validator set. It's fairly new, meaning - [Coinbase Wallet Faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia faucet](https://sepoliafaucet.com/) - [Infura Sepolia faucet](https://www.infura.io/faucet) -- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-faucet) +- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Ethereum Ecosystem faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(long-term support)_ {#goerli} diff --git a/public/content/translations/cs/developers/docs/networks/index.md b/public/content/translations/cs/developers/docs/networks/index.md index c2d59f8fa9b..0bc4274dae3 100644 --- a/public/content/translations/cs/developers/docs/networks/index.md +++ b/public/content/translations/cs/developers/docs/networks/index.md @@ -60,7 +60,7 @@ Dvě veřejné testovací sítě, které aktuálně udržují vývojáři klient - [Coinbase Wallet Faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia faucet](https://sepoliafaucet.com/) - [Infura Sepolia faucet](https://www.infura.io/faucet) -- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-faucet) +- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Ethereum Ecosystem faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(dlouhodobá podpora)_ {#goerli} diff --git a/public/content/translations/de/developers/docs/networks/index.md b/public/content/translations/de/developers/docs/networks/index.md index bbf2289c3af..3b1df0fe4ca 100644 --- a/public/content/translations/de/developers/docs/networks/index.md +++ b/public/content/translations/de/developers/docs/networks/index.md @@ -60,7 +60,7 @@ Die beiden öffentlichen Testnets, die die Client-Entwickler derzeit betreiben, - [Faucet für Coinbase-Wallet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Faucet für Alchemy Sepolia](https://sepoliafaucet.com/) - [Faucet für Infura Sepolia](https://www.infura.io/faucet) -- [Faucet für Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Faucet für Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Ethereum-Ökosystem-Faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(Langzeit-Support)_ {#goerli} diff --git a/public/content/translations/el/developers/docs/networks/index.md b/public/content/translations/el/developers/docs/networks/index.md index 69718a5cca4..24a0afe8550 100644 --- a/public/content/translations/el/developers/docs/networks/index.md +++ b/public/content/translations/el/developers/docs/networks/index.md @@ -60,7 +60,7 @@ lang: el - [Coinbase Wallet faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Sepolia faucet στο Alchemy](https://sepoliafaucet.com/) - [Sepolia faucet στο Infura](https://www.infura.io/faucet) -- [Sepolia faucet στο Chainstack](https://faucet.chainstack.com/sepolia-faucet) +- [Sepolia faucet στο Chainstack](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Faucet στο οικοσύστημα Ethereum](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(μακροπρόθεσμη υποστήριξη)_ {#goerli} diff --git a/public/content/translations/es/developers/docs/networks/index.md b/public/content/translations/es/developers/docs/networks/index.md index 5a14095ca46..ca7e5fe9d3a 100644 --- a/public/content/translations/es/developers/docs/networks/index.md +++ b/public/content/translations/es/developers/docs/networks/index.md @@ -60,7 +60,7 @@ Las dos redes públicas de prueba que los desarrolladores de clientes están man - [Faucet de cartera Coinbase | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia faucet](https://sepoliafaucet.com/) - [Faucet Infura Sepolia](https://www.infura.io/faucet) -- [Faucet Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Faucet Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Faucet del ecosistema Ethereum](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(soporte a largo plazo)_ {#goerli} diff --git a/public/content/translations/fa/developers/docs/networks/index.md b/public/content/translations/fa/developers/docs/networks/index.md index 5abbe20c375..9826499ea1f 100644 --- a/public/content/translations/fa/developers/docs/networks/index.md +++ b/public/content/translations/fa/developers/docs/networks/index.md @@ -60,7 +60,7 @@ lang: fa - [فاست کیف پول Coinbase‏ | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [فاست Alchemy Sepolia](https://sepoliafaucet.com/) - [فاست Infura Sepolia](https://www.infura.io/faucet) -- [فاست Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [فاست Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet) - [فاست اتریوم اکوسیستم](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli_(پشتیبانی طولانی مدت)_ {#goerli} diff --git a/public/content/translations/fr/developers/docs/networks/index.md b/public/content/translations/fr/developers/docs/networks/index.md index 8158e945110..67d5cc1f4c0 100644 --- a/public/content/translations/fr/developers/docs/networks/index.md +++ b/public/content/translations/fr/developers/docs/networks/index.md @@ -60,7 +60,7 @@ Les deux réseaux de test publics que les développeurs de clients conservent ac - [Coinbase Wallet Faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia faucet](https://sepoliafaucet.com/) - [Infura Sepolia faucet](https://www.infura.io/faucet) -- [Robinet Sepolia Chainstack](https://faucet.chainstack.com/sepolia-faucet) +- [Robinet Sepolia Chainstack](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Robinet de l'écosystème Ethereum](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(support à long terme)_ {#goerli} diff --git a/public/content/translations/hu/developers/docs/networks/index.md b/public/content/translations/hu/developers/docs/networks/index.md index 7412237f931..7e2c122709f 100644 --- a/public/content/translations/hu/developers/docs/networks/index.md +++ b/public/content/translations/hu/developers/docs/networks/index.md @@ -60,7 +60,7 @@ A két nyilvános teszthálózat, amelyet a kliens fejlesztők jelenleg fenntart - [Coinbase Wallet csap | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia csap](https://sepoliafaucet.com/) - [Infura Sepolia csap](https://www.infura.io/faucet) -- [Chainstack Sepolia csap](https://faucet.chainstack.com/sepolia-faucet) +- [Chainstack Sepolia csap](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Ethereum-ökoszisztéma csap](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(hosszútávú támogatás)_ {#goerli} diff --git a/public/content/translations/it/developers/docs/networks/index.md b/public/content/translations/it/developers/docs/networks/index.md index e5a207d1afb..fc0b910b518 100644 --- a/public/content/translations/it/developers/docs/networks/index.md +++ b/public/content/translations/it/developers/docs/networks/index.md @@ -60,7 +60,7 @@ Le due reti di prova pubbliche che gli sviluppatori di client stanno mantenendo - [Faucet Coinbase Wallet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Faucet Alchemy Sepolia](https://sepoliafaucet.com/) - [Faucet Infura Sepolia](https://www.infura.io/faucet) -- [Faucet Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Faucet Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Faucet dell'ecosistema di Ethereum](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(supporto a lungo termine)_ {#goerli} diff --git a/public/content/translations/ja/developers/docs/networks/index.md b/public/content/translations/ja/developers/docs/networks/index.md index 03d8327b11c..cba91a20a06 100644 --- a/public/content/translations/ja/developers/docs/networks/index.md +++ b/public/content/translations/ja/developers/docs/networks/index.md @@ -60,7 +60,7 @@ lang: ja - [Coinbase Wallet Faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia faucet](https://sepoliafaucet.com/) - [Infura Sepolia faucet](https://www.infura.io/faucet) -- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-faucet) +- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Ethereum Ecosystem faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli(ゴエリ) _(長期サポート)_ {#goerli} diff --git a/public/content/translations/nl/developers/docs/networks/index.md b/public/content/translations/nl/developers/docs/networks/index.md index c700ab9c3ac..28ecc50f7b3 100644 --- a/public/content/translations/nl/developers/docs/networks/index.md +++ b/public/content/translations/nl/developers/docs/networks/index.md @@ -60,7 +60,7 @@ De twee openbare testnetten die clientontwikkelaars op dit moment beheren zijn S - [Coinbase Wallet Faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia faucet](https://sepoliafaucet.com/) - [Infura Sepolia faucet](https://www.infura.io/faucet) -- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-faucet) +- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Ethereum Ecosystem faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(ondersteuning op lange termijn)_ {#goerli} diff --git a/public/content/translations/pl/developers/docs/networks/index.md b/public/content/translations/pl/developers/docs/networks/index.md index c25e25aac2b..c464a9c41b0 100644 --- a/public/content/translations/pl/developers/docs/networks/index.md +++ b/public/content/translations/pl/developers/docs/networks/index.md @@ -60,7 +60,7 @@ Dwie publiczne sieci testowe, które obecnie wykorzystują programiści klientó - [Kran Coinbase Wallet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Kran Alchemy Sepolia](https://sepoliafaucet.com/) - [Kran Infura Sepolia](https://www.infura.io/faucet) -- [Kran Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Kran Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Kran Ethereum Ecosystem](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(wsparcie długoterminowe)_ {#goerli} diff --git a/public/content/translations/pt-br/developers/docs/networks/index.md b/public/content/translations/pt-br/developers/docs/networks/index.md index ab0eb31d598..0a552fa0715 100644 --- a/public/content/translations/pt-br/developers/docs/networks/index.md +++ b/public/content/translations/pt-br/developers/docs/networks/index.md @@ -60,7 +60,7 @@ As duas redes de testes públicas que os desenvolvedores dos clientes estão atu - [Faucet da Carteira Coinbase | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Faucet do Alchemy Sepolia](https://sepoliafaucet.com/) - [Faucet do Infura Sepolia](https://www.infura.io/faucet) -- [Faucet da Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Faucet da Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Faucet do ecossistema Ethereum](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(suporte a longo prazo)_ {#goerli} diff --git a/public/content/translations/ru/developers/docs/networks/index.md b/public/content/translations/ru/developers/docs/networks/index.md index a824127a7ae..3e9bb53c31b 100644 --- a/public/content/translations/ru/developers/docs/networks/index.md +++ b/public/content/translations/ru/developers/docs/networks/index.md @@ -60,7 +60,7 @@ lang: ru - [Кран кошелька Coinbase | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Кран Alchemy Sepolia](https://sepoliafaucet.com/) - [Кран Infura Sepolia](https://www.infura.io/faucet) -- [Кран Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Кран Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Кран Ethereum Ecosystem](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(долгосрочная поддержка)_ {#goerli} diff --git a/public/content/translations/tr/developers/docs/networks/index.md b/public/content/translations/tr/developers/docs/networks/index.md index 465434f2b75..0a1348460b8 100644 --- a/public/content/translations/tr/developers/docs/networks/index.md +++ b/public/content/translations/tr/developers/docs/networks/index.md @@ -60,7 +60,7 @@ Mevcut olarak istemci geliştiricilerin sürdürdüğü iki genel test ağı Sep - [Coinbase Cüzdanı Musluğu | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia musluğu](https://sepoliafaucet.com/) - [Infura Sepolia Musluğu](https://www.infura.io/faucet) -- [Chainstack Sepolia Musluğu](https://faucet.chainstack.com/sepolia-faucet) +- [Chainstack Sepolia Musluğu](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Ethereum Ekosistemi musluğu](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(uzun vadeli destek)_ {#goerli} diff --git a/public/content/translations/zh-tw/developers/docs/networks/index.md b/public/content/translations/zh-tw/developers/docs/networks/index.md index ba1c715a8c8..0159133da6a 100644 --- a/public/content/translations/zh-tw/developers/docs/networks/index.md +++ b/public/content/translations/zh-tw/developers/docs/networks/index.md @@ -60,7 +60,7 @@ lang: zh-tw - [Coinbase 錢包水龍頭 | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia 水龍頭](https://sepoliafaucet.com/) - [Infura Sepolia 水龍頭](https://www.infura.io/faucet) -- [Chainstack Sepolia 水龍頭](https://faucet.chainstack.com/sepolia-faucet) +- [Chainstack Sepolia 水龍頭](https://faucet.chainstack.com/sepolia-testnet-faucet) - [以太坊生態系統水龍頭](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli_(長期支援)_ {#goerli} diff --git a/public/content/translations/zh/developers/docs/networks/index.md b/public/content/translations/zh/developers/docs/networks/index.md index 36728f2174c..2bc40fcb9c4 100644 --- a/public/content/translations/zh/developers/docs/networks/index.md +++ b/public/content/translations/zh/developers/docs/networks/index.md @@ -60,7 +60,7 @@ lang: zh - [Coinbase Wallet 水龙头 | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Alchemy Sepolia 水龙头](https://sepoliafaucet.com/) - [Infura Sepolia 水龙头](https://www.infura.io/faucet) -- [Chainstack Sepolia 水龙头](https://faucet.chainstack.com/sepolia-faucet) +- [Chainstack Sepolia 水龙头](https://faucet.chainstack.com/sepolia-testnet-faucet) - [以太坊生态系统水龙头](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) #### Goerli _(长期支持)_ {#goerli} From a01c822128d79fb27ae622fe886323d9fff340c1 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 16:17:38 -0500 Subject: [PATCH 023/368] remove lychee-logs.txt whoops --- lychee-logs.txt | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 lychee-logs.txt diff --git a/lychee-logs.txt b/lychee-logs.txt deleted file mode 100644 index 1cc96f50d7a..00000000000 --- a/lychee-logs.txt +++ /dev/null @@ -1,7 +0,0 @@ -Error: Network error - -Caused by: - 0: error sending request for url (http://ethereum-org-website/) - 1: client error (Connect) - 2: dns error: failed to lookup address information: nodename nor servname provided, or not known - 3: failed to lookup address information: nodename nor servname provided, or not known From ad37236fd96472a30d1077814b7d53690010ffd4 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 18:36:13 -0500 Subject: [PATCH 024/368] changing https://www.coindesk.com/understanding-dao-hack-journalists to https://www.coindesk.com/learn/understanding-the-dao-attack --- public/content/developers/docs/networks/index.md | 2 +- public/content/governance/index.md | 2 +- public/content/translations/ca/governance/index.md | 2 +- public/content/translations/cs/governance/index.md | 2 +- public/content/translations/de/governance/index.md | 2 +- public/content/translations/el/governance/index.md | 2 +- public/content/translations/es/governance/index.md | 2 +- public/content/translations/fa/governance/index.md | 2 +- public/content/translations/fil/governance/index.md | 2 +- public/content/translations/fr/governance/index.md | 2 +- public/content/translations/hi/governance/index.md | 2 +- public/content/translations/hu/governance/index.md | 2 +- public/content/translations/id/governance/index.md | 2 +- public/content/translations/it/governance/index.md | 2 +- public/content/translations/ja/governance/index.md | 2 +- public/content/translations/ko/governance/index.md | 2 +- public/content/translations/ms/governance/index.md | 2 +- public/content/translations/nl/governance/index.md | 2 +- public/content/translations/pcm/governance/index.md | 2 +- public/content/translations/pl/governance/index.md | 2 +- public/content/translations/pl/history/index.md | 2 +- public/content/translations/pt-br/governance/index.md | 2 +- public/content/translations/ro/governance/index.md | 2 +- public/content/translations/ru/governance/index.md | 2 +- public/content/translations/sk/governance/index.md | 2 +- public/content/translations/sl/governance/index.md | 2 +- public/content/translations/tl/governance/index.md | 2 +- public/content/translations/tr/governance/index.md | 2 +- public/content/translations/uk/governance/index.md | 2 +- public/content/translations/zh-tw/governance/index.md | 2 +- public/content/translations/zh/governance/index.md | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/public/content/developers/docs/networks/index.md b/public/content/developers/docs/networks/index.md index a7dca454f37..43b605a0660 100644 --- a/public/content/developers/docs/networks/index.md +++ b/public/content/developers/docs/networks/index.md @@ -90,7 +90,7 @@ Goerli is a testnet for testing validating and staking. The Goerli network is op - [Alchemy Goerli Faucet](https://goerlifaucet.com/) - [All That Node Goerli Faucet](https://www.allthatnode.com/faucet/ethereum.dsrv) - [Coinbase Wallet Faucet | Goerli](https://coinbase.com/faucets/ethereum-goerli-faucet) -- [Chainstack Goerli faucet](https://faucet.chainstack.com/goerli-faucet) +- [Chainstack faucet](https://faucet.chainstack.com/goerli-faucet) To launch a Validator on Holesky testnet, use ethstaker's ["cheap Holesky validator" launchpad](https://holesky.launchpad.ethstaker.cc/en/). diff --git a/public/content/governance/index.md b/public/content/governance/index.md index e3ff43c529c..40816e682b7 100644 --- a/public/content/governance/index.md +++ b/public/content/governance/index.md @@ -118,7 +118,7 @@ Generally, disagreements are handled with long-form discussion in public forums Forks are when major technical upgrades or changes need to be made to the network and change the "rules" of the protocol. [Ethereum clients](/developers/docs/nodes-and-clients/) must update their software to implement the new fork rules. -The DAO fork was in response to the [2016 DAO attack](https://www.coindesk.com/understanding-dao-hack-journalists) where an insecure [DAO](/glossary/#dao) contract was drained of over 3.6 million ETH in a hack. The fork moved the funds from the faulty contract to a new contract allowing anyone who lost funds in the hack to recover them. +The DAO fork was in response to the [2016 DAO attack](https://www.coindesk.com/learn/understanding-the-dao-attack) where an insecure [DAO](/glossary/#dao) contract was drained of over 3.6 million ETH in a hack. The fork moved the funds from the faulty contract to a new contract allowing anyone who lost funds in the hack to recover them. This course of action was voted on by the Ethereum community. Any ETH holder was able to vote via a transaction on [a voting platform](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). The decision to fork reached over 85% of the votes. diff --git a/public/content/translations/ca/governance/index.md b/public/content/translations/ca/governance/index.md index e021010a327..7341a0f1feb 100644 --- a/public/content/translations/ca/governance/index.md +++ b/public/content/translations/ca/governance/index.md @@ -118,7 +118,7 @@ Per norma general, els desacords s'aborden en llargues discussions en fòrums p Les bifurcacions es donen quan s'han de fer importants millores tècniques o modificacions a la xarxa i canvien les «normes» del protocol. [Els clients Ethereum](/developers/docs/nodes-and-clients/) han d'actualitzar el software per a implementar les noves normes de la bifurcació. -La bifurcació d'una DAO va ser la resposta a [l'atac d'una DAO el 2016](https://www.coindesk.com/understanding-dao-hack-journalists), on un contracte insegur d'una [DAO](/glossary/#dao) va patir un drenatge de més de 3,6 milions d'ETH en un hack. La bifurcació va moure els fons del contracte defectuós al nou contracte i va permetre recuperar els fons a qui n'hagués perdut a causa del pirateig. +La bifurcació d'una DAO va ser la resposta a [l'atac d'una DAO el 2016](https://www.coindesk.com/learn/understanding-the-dao-attack), on un contracte insegur d'una [DAO](/glossary/#dao) va patir un drenatge de més de 3,6 milions d'ETH en un hack. La bifurcació va moure els fons del contracte defectuós al nou contracte i va permetre recuperar els fons a qui n'hagués perdut a causa del pirateig. La comunitat d'Ethereum va votar a favor d'aquest pla d'acció. Qualsevol titular d'ETH va poder votar mitjançant una transacció a [una plataforma de votació](http://v1.carbonvote.com/). La decisió de bifurcar va assolir el 85% dels vots. diff --git a/public/content/translations/cs/governance/index.md b/public/content/translations/cs/governance/index.md index 1a88aca4611..5c0300fbdc0 100644 --- a/public/content/translations/cs/governance/index.md +++ b/public/content/translations/cs/governance/index.md @@ -118,7 +118,7 @@ Obecně se neshody řeší dlouhodobou diskusí na veřejných fórech, aby se p Forky nastávají, když je potřeba provést zásadní technická vylepšení nebo změny v síti a změnit "pravidla“ protokolu. [Klienty na Ethereu](/developers/docs/nodes-and-clients/) musí aktualizovat svůj software, aby implementovali nová pravidla forku. -Fork The DAO byl reakcí na [útok na DAO v roce 2016](https://www.coindesk.com/understanding-dao-hack-journalists), kdy bylo z nezabezpečeného kontraktu [DAO](/glossary/#dao) odčerpáno více než 3,6 milionu ETH. Tento fork přesunul finanční prostředky z chybného smart kontraktu do nového kontraktu, který umožnil získat zpět své finanční prostředky komukoli, kdo o ně přišel během hacku. +Fork The DAO byl reakcí na [útok na DAO v roce 2016](https://www.coindesk.com/learn/understanding-the-dao-attack), kdy bylo z nezabezpečeného kontraktu [DAO](/glossary/#dao) odčerpáno více než 3,6 milionu ETH. Tento fork přesunul finanční prostředky z chybného smart kontraktu do nového kontraktu, který umožnil získat zpět své finanční prostředky komukoli, kdo o ně přišel během hacku. Tento postup byl odhlasován ethereovskou komunitou. Každý držitel ETH mohl hlasovat prostřednictvím transakce na [hlasovací platformě](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Rozhodnutí o forku získalo více než 85 % hlasů. diff --git a/public/content/translations/de/governance/index.md b/public/content/translations/de/governance/index.md index 030407b9525..1ad0aa4be44 100644 --- a/public/content/translations/de/governance/index.md +++ b/public/content/translations/de/governance/index.md @@ -118,7 +118,7 @@ In der Regel werden Meinungsverschiedenheiten durch lange Diskussionen in öffen Von einem Fork spricht man, wenn größere technische Upgrades oder Änderungen am Netzwerk vorgenommen werden müssen und sich die „Regeln“ des Protokolls ändern. [Ethereum-Clients](/developers/docs/nodes-and-clients/) müssen ihre Software aktualisieren, um die neuen Fork-Regeln zu implementieren. -Der DAO-Fork erfolgte als Reaktion auf den [2016 DAO-Angriff](https://www.coindesk.com/understanding-dao-hack-journalists), bei dem einem unsicheren [DAO](/glossary/#dao)-Vertrag über 3,6 Millionen ETH durch einen Hack entzogen wurden. Durch den Fork wurden die Gelder aus dem fehlerhaften Vertrag in einen neuen Vertrag übertragen, so dass jeder, der durch den Hack Geld verloren hatte, dieses zurückerhalten konnte. +Der DAO-Fork erfolgte als Reaktion auf den [2016 DAO-Angriff](https://www.coindesk.com/learn/understanding-the-dao-attack), bei dem einem unsicheren [DAO](/glossary/#dao)-Vertrag über 3,6 Millionen ETH durch einen Hack entzogen wurden. Durch den Fork wurden die Gelder aus dem fehlerhaften Vertrag in einen neuen Vertrag übertragen, so dass jeder, der durch den Hack Geld verloren hatte, dieses zurückerhalten konnte. Die Ethereum-Community hatte über diese Vorgehensweise abgestimmt. Jeder ETH-Inhaber konnte über eine Transaktion auf [, einer Abstimmungsplattform,](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/) abstimmen. Der Fork wurde mit mehr als 85 % der Stimmen beschlossen. diff --git a/public/content/translations/el/governance/index.md b/public/content/translations/el/governance/index.md index 915566cf7dc..469b61dce54 100644 --- a/public/content/translations/el/governance/index.md +++ b/public/content/translations/el/governance/index.md @@ -118,7 +118,7 @@ _Σημείωση: Οποιοσδήποτε μπορεί να ανήκει σε Οι τεχνικές ενσωματώσεις συμβαίνουν όταν χρειάζονται σημαντικές τεχνικές αναβαθμίσεις ή αλλαγές στο δίκτυο και αλλάζουν τους «κανόνες» του πρωτοκόλλου. Οι πελάτες Ethereum πρέπει να ενημερώσουν το λογισμικό τους για να εφαρμόσουν τους νέους κανόνες της διακλάδωσης. Οι [Πελάτες Ethereum](/developers/docs/nodes-and-clients/) πρέπει να ενημερώσουν το λογισμικό τους για να εφαρμόσουν τους νέους κανόνες της αναβάθμισης. -Το ενσωμάτωση DAO ήταν η απάντηση στην [επίθεση DAO το 2016](https://www.coindesk.com/understanding-dao-hack-journalists), όπου ένα επισφαλές συμβόλαιο [DAO](/glossary/#dao) είχε εξαντληθεί σε πάνω από 3.6 εκατομμύρια ETH σε μια επίθεση. Η αναβάθμιση μετέφερε τα χρήματα από το ελαττωματικό συμβόλαιο σε ένα νέο συμβόλαιο, επιτρέποντας σε όποιον έχασε χρήματα στην επίθεση να τα ανακτήσει. +Το ενσωμάτωση DAO ήταν η απάντηση στην [επίθεση DAO το 2016](https://www.coindesk.com/learn/understanding-the-dao-attack), όπου ένα επισφαλές συμβόλαιο [DAO](/glossary/#dao) είχε εξαντληθεί σε πάνω από 3.6 εκατομμύρια ETH σε μια επίθεση. Η αναβάθμιση μετέφερε τα χρήματα από το ελαττωματικό συμβόλαιο σε ένα νέο συμβόλαιο, επιτρέποντας σε όποιον έχασε χρήματα στην επίθεση να τα ανακτήσει. Αυτός ο τρόπος αντιμετώπισης ψηφίστηκε από την κοινότητα του Ethereum. Κάθε κάτοχος ETH ήταν σε θέση να ψηφίσει μέσω μιας συναλλαγής στη [πλατφόρμα ψηφοφορίας](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Η απόφαση για την εφαρμογή της ενσωμάτωσης έφτασε πάνω από το 85% των ψήφων. diff --git a/public/content/translations/es/governance/index.md b/public/content/translations/es/governance/index.md index 8f93cd89ac5..1e75d12792a 100644 --- a/public/content/translations/es/governance/index.md +++ b/public/content/translations/es/governance/index.md @@ -118,7 +118,7 @@ Por lo general, los desacuerdos se tratan en discusiones extensas en foros de ac Las bifurcaciones se dan cuando hay mejoras técnicas o modificaciones que cambian las reglas del juego en el protocolo. Los [clientes de Ethereum](/developers/docs/nodes-and-clients/) deben actualizar su software para implementar las nuevas reglas establecidas en la bifurcación. -La bifurcación de una DAO surgió en respuesta al [ataque de una DAO en 2016](https://www.coindesk.com/understanding-dao-hack-journalists), donde un contrato inseguro de una [DAO](/glossary/#dao) fue drenado por más de 3,6 millones de ETH en un hack. La bifurcación movió los fondos desde el contrato corrompido a un nuevo contrato, permitiendo que las personas que perdieron sus fondos, los recuperaran. +La bifurcación de una DAO surgió en respuesta al [ataque de una DAO en 2016](https://www.coindesk.com/learn/understanding-the-dao-attack), donde un contrato inseguro de una [DAO](/glossary/#dao) fue drenado por más de 3,6 millones de ETH en un hack. La bifurcación movió los fondos desde el contrato corrompido a un nuevo contrato, permitiendo que las personas que perdieron sus fondos, los recuperaran. Esta acción fue votada por la comunidad Ethereum. Cualquier titular de ETH pudo votar a través de una transacción en [una plataforma de votación](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). La decisión de bifurcar obtuvo más del 85 % de los votos. diff --git a/public/content/translations/fa/governance/index.md b/public/content/translations/fa/governance/index.md index 4234ad9c017..121222c0524 100644 --- a/public/content/translations/fa/governance/index.md +++ b/public/content/translations/fa/governance/index.md @@ -118,7 +118,7 @@ _یادداشت: هر فردی می‌تواند عضوی از چند گروه فورک‌ها برای زمانی هستند که لازم است ارتقاهای فنی عمده یا تغییراتی روی شبکه اعمال شوند و این تغییرات به تغییر «قوانین» پروتکل می‌انجامند. [کلاینت‌های اتریوم](/developers/docs/nodes-and-clients/) باید نرم‌افزارشان را به‌روزرسانی کنند تا قوانین فورک جدید را پیاده‌سازی کنند. -فورک DAO در واکنش به [حمله‌ی DAO در سال 2016](https://www.coindesk.com/understanding-dao-hack-journalists) رخ داد که در آن در یک هک، یک قرارداد [DAO](/glossary/#dao) ناامن از بیش از 3.6 میلیون اتر تخلیه شد. این فورک سرمایه‌ها را از قرارداد مشکل‌دار به یک قرارداد جدید منتقل کرد و به همه‌ی کسانی که در هک سرمایه از دست داده بودند اجازه داد که آن را بازگردانند. +فورک DAO در واکنش به [حمله‌ی DAO در سال 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) رخ داد که در آن در یک هک، یک قرارداد [DAO](/glossary/#dao) ناامن از بیش از 3.6 میلیون اتر تخلیه شد. این فورک سرمایه‌ها را از قرارداد مشکل‌دار به یک قرارداد جدید منتقل کرد و به همه‌ی کسانی که در هک سرمایه از دست داده بودند اجازه داد که آن را بازگردانند. این کار توسط جامعه‌ی اتریوم رأی‌گیری شد. هر دارنده‌ی اتر می‌توانست از طریق یک تراکنش در یک [سکوی رأی‌گیری](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/) رأی بدهد. تصمیم انجام فورک بیشتر از 85% از آرا را به خود اختصاص داد. diff --git a/public/content/translations/fil/governance/index.md b/public/content/translations/fil/governance/index.md index bc3c58e8b3a..b34fa893399 100644 --- a/public/content/translations/fil/governance/index.md +++ b/public/content/translations/fil/governance/index.md @@ -118,7 +118,7 @@ Karaniwang inaayos ang mga hindi pagkakaunawaan sa mahabang usapan sa mga pampub Nangyayari ang mga fork kapag may mga pangunahing teknikal na pag-upgrade o pagbabago at babaguhin nito ang "mga panuntunan" ng protocol. Dapat i-update ng [mga Ethereum client](/developers/docs/nodes-and-clients/) ang kanilang software upang ipatupad ang mga panuntunan para sa fork. -Ang DAO fork ay ginawa bilang tugon sa [DAO attack noong 2016](https://www.coindesk.com/understanding-dao-hack-journalists) kung saan nakuha sa isang hindi secure na [DAO](/glossary/#dao) contract ang mahigit 3.6 milyong ETH sa isang hack. Inilipat ng fork ang mga pondo mula sa palyadong contract sa bagong contract, kaya mare-recover ito ng kahit sinong nawalan ng pondo dahil sa pag-hack. +Ang DAO fork ay ginawa bilang tugon sa [DAO attack noong 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) kung saan nakuha sa isang hindi secure na [DAO](/glossary/#dao) contract ang mahigit 3.6 milyong ETH sa isang hack. Inilipat ng fork ang mga pondo mula sa palyadong contract sa bagong contract, kaya mare-recover ito ng kahit sinong nawalan ng pondo dahil sa pag-hack. Pinagbotohan ng komunidad ng Ethereum ang pagkilos na ito. Makakaboto ang sinumang nagmamay-ari ng ETH sa pamamagitan ng isang transaksyon sa [isang voting platform](http://v1.carbonvote.com/). Ang desisyong mag-fork ay umabot ng mahigit 85% ng mga boto. diff --git a/public/content/translations/fr/governance/index.md b/public/content/translations/fr/governance/index.md index 02ea7c7dd8a..a5dd05081f6 100644 --- a/public/content/translations/fr/governance/index.md +++ b/public/content/translations/fr/governance/index.md @@ -118,7 +118,7 @@ Généralement, les désaccords sont traités avec des discussions de longue dur Les fourches sont lorsque des mises à niveau techniques majeures ou des modifications doivent être apportées au réseau et modifier les « règles » du protocole. [Les clients Ethereum](/developers/docs/nodes-and-clients/) doivent mettre à jour leur logiciel pour implémenter les nouvelles règles de la fourche. -La fourche DAO est la réponse à l'attaque [DAO de 2016](https://www.coindesk.com/understanding-dao-hack-journalists) où un contrat non sécurisé d'une [DAO](/glossary/#dao) a été vidé de plus de 3,6 millions d'ETH lors d'un piratage. La fourche a transféré les fonds du contrat défectueux à un nouveau contrat permettant à quiconque a perdu des fonds dans le piratage de les récupérer. +La fourche DAO est la réponse à l'attaque [DAO de 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) où un contrat non sécurisé d'une [DAO](/glossary/#dao) a été vidé de plus de 3,6 millions d'ETH lors d'un piratage. La fourche a transféré les fonds du contrat défectueux à un nouveau contrat permettant à quiconque a perdu des fonds dans le piratage de les récupérer. Ce plan d'action a été voté par la communauté Ethereum. Tout détenteur d'ETH a pu voter via une transaction sur [une plateforme de vote](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Plus de 85 % des votes étaient favorables à la fourche. diff --git a/public/content/translations/hi/governance/index.md b/public/content/translations/hi/governance/index.md index 793b62f0cb7..df8282e7f7a 100644 --- a/public/content/translations/hi/governance/index.md +++ b/public/content/translations/hi/governance/index.md @@ -118,7 +118,7 @@ EIP चैंपियंस से सभी संबंधित हितध फोर्क्स तब होते हैं जब नेटवर्क में प्रमुख तकनीकी उन्नयन या परिवर्तन करने और प्रोटोकॉल के "नियमों" को बदलने की आवश्यकता होती है। [इथेरियम क्लाइंट](/developers/docs/nodes-and-clients/) को नए फोर्क नियमों को लागू करने के लिए अपने सॉफ़्टवेयर को अपडेट करना होगा। -DAO फोर्क [2016 DAO हमले](https://www.coindesk.com/understanding-dao-hack-journalists) के जवाब में था, जहां एक असुरक्षित [DAO](/glossary/#dao) अनुबंध से एक हैक में 3.6 मिलियन से अधिक ETH निकाल दिए गए। फोर्क ने धनराशि को दोषपूर्ण अनुबंध से एक नए अनुबंध में स्थानांतरित कर दिया, जिससे हैक में धनराशि खोने वाले किसी भी व्यक्ति को उसे पुनर्प्राप्त करने की अनुमति मिल सके। +DAO फोर्क [2016 DAO हमले](https://www.coindesk.com/learn/understanding-the-dao-attack) के जवाब में था, जहां एक असुरक्षित [DAO](/glossary/#dao) अनुबंध से एक हैक में 3.6 मिलियन से अधिक ETH निकाल दिए गए। फोर्क ने धनराशि को दोषपूर्ण अनुबंध से एक नए अनुबंध में स्थानांतरित कर दिया, जिससे हैक में धनराशि खोने वाले किसी भी व्यक्ति को उसे पुनर्प्राप्त करने की अनुमति मिल सके। इस कार्यवाही पर इथेरियम समुदाय द्वारा मतदान किया गया था। कोई भी ETH धारक [किसी वोटिंग प्लेटफार्म](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/) पर लेनदेन के माध्यम से वोट करने में सक्षम था। फोर्क का निर्णय 85% से अधिक वोटों तक पहुंच गया। diff --git a/public/content/translations/hu/governance/index.md b/public/content/translations/hu/governance/index.md index dc047fa5bf4..40ed358fefd 100644 --- a/public/content/translations/hu/governance/index.md +++ b/public/content/translations/hu/governance/index.md @@ -118,7 +118,7 @@ Mivel ennyiféle érdekelt van különböző motivációkkal és hitekkel, ezér Az elágazások akkor jönnek létre, amikor komoly technikai változások történnek a hálózaton és megváltoztatják a protokoll szabályait. Az [Ethereum-klienseknek](/developers/docs/nodes-and-clients/) frissíteni kell a szoftverjét, hogy az új elágazási szabályokat életbe léptessék. -A DAO-elágazás volt a válasz egy [2016-os DAO-támadásra](https://www.coindesk.com/understanding-dao-hack-journalists), amikor egy sebezhető [DAO](/glossary/#dao) szerződésből 3,6 millió ETH-t ürítettek le a támadás során. Az elágazás a pénzeszközöket a hibás szerződésből egy újba tette át, hogy a támadás során károsultak kaphassanak belőle. +A DAO-elágazás volt a válasz egy [2016-os DAO-támadásra](https://www.coindesk.com/learn/understanding-the-dao-attack), amikor egy sebezhető [DAO](/glossary/#dao) szerződésből 3,6 millió ETH-t ürítettek le a támadás során. Az elágazás a pénzeszközöket a hibás szerződésből egy újba tette át, hogy a támadás során károsultak kaphassanak belőle. Ennek az akciónak a kezelését megszavazták az Ethereum közösségen belül. Bármely ETH tulajdonos szavazhatott egy tranzakción keresztül [egy szavazási platformon](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Az elágazás mellett több mint a szavazók 85%-a voksolt. diff --git a/public/content/translations/id/governance/index.md b/public/content/translations/id/governance/index.md index ac5d909297e..dbadb038f30 100644 --- a/public/content/translations/id/governance/index.md +++ b/public/content/translations/id/governance/index.md @@ -118,7 +118,7 @@ Umumnya, perselisihan pendapat ditangani melalui bentuk diskusi panjang di forum Fork adalah ketika peningkatan atau perubahan teknis utama harus dibuat dalam jaringan dan mengubah "aturan" protokol. [Klien Ethereum](/developers/docs/nodes-and-clients/) harus memperbarui perangkat lunak mereka untuk mengimplementasikan aturan fork yang baru. -Garpu DAO merupakan respons terhadap [serangan DAO 2016](https://www.coindesk.com/understanding-dao-hack-journalists) di mana kontrak [DAO](/glossary/#dao) yang tidak aman dikuras dananya sebanyak lebih dari 3,6 juta ETH dalam peretasan saat itu. Fork ini memindahkan dana dari kontrak yang bermasalah ke kontrak yang baru yang memungkinkan siapa pun yang kehilangan dananya dalam peretasan dapat memperolehnya kembali. +Garpu DAO merupakan respons terhadap [serangan DAO 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) di mana kontrak [DAO](/glossary/#dao) yang tidak aman dikuras dananya sebanyak lebih dari 3,6 juta ETH dalam peretasan saat itu. Fork ini memindahkan dana dari kontrak yang bermasalah ke kontrak yang baru yang memungkinkan siapa pun yang kehilangan dananya dalam peretasan dapat memperolehnya kembali. Tindakan ini dipilih oleh komunitas Ethereum. Setiap pemegang ETH dapat memilih melalui transaksi di [platform pemilihan](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Keputusan untuk melakukan fork mencapai lebih dari 85% suara. diff --git a/public/content/translations/it/governance/index.md b/public/content/translations/it/governance/index.md index 3963c7b6bcb..76e0811751f 100644 --- a/public/content/translations/it/governance/index.md +++ b/public/content/translations/it/governance/index.md @@ -118,7 +118,7 @@ In genere le controversie sono gestite mediante discussioni approfondite nei for Le diramazioni si verificano quando occorre eseguire aggiornamenti tecnici o modifiche importanti alla rete, tali da cambiare le "regole" del protocollo. I [client di Ethereum](/developers/docs/nodes-and-clients/) devono aggiornare il proprio software e implementare le regole della nuova diramazione. -La diramazione DAO arrivò in risposta all'[attacco alla DAO del 2016](https://www.coindesk.com/understanding-dao-hack-journalists), durante il quale un contratto [DAO](/glossary/#dao) non sicuro fu svuotato di oltre 3,6 milioni di ETH in una sola volta. La diramazione ha spostato i fondi dal contratto lacunoso a uno nuovo, consentendo a chiunque avesse perso i fondi di hackerare per recuperarli. +La diramazione DAO arrivò in risposta all'[attacco alla DAO del 2016](https://www.coindesk.com/learn/understanding-the-dao-attack), durante il quale un contratto [DAO](/glossary/#dao) non sicuro fu svuotato di oltre 3,6 milioni di ETH in una sola volta. La diramazione ha spostato i fondi dal contratto lacunoso a uno nuovo, consentendo a chiunque avesse perso i fondi di hackerare per recuperarli. Questo corso d'azione fu votato dalla community di Ethereum. Ogni titolare di ETH ha potuto votare tramite una transazione su [una piattaforma di voto](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). La decisione di creare la diramazione ottenne oltre l'85% dei voti. diff --git a/public/content/translations/ja/governance/index.md b/public/content/translations/ja/governance/index.md index 41d4bb14ecb..d9b0f596a0a 100644 --- a/public/content/translations/ja/governance/index.md +++ b/public/content/translations/ja/governance/index.md @@ -118,7 +118,7 @@ _注: どの個人もこれらのグループの複数に参加できます(た フォークとは、ネットワークに大きな技術的なアップグレードや変更が必要となり、プロトコルの「ルール」を変更することです。 [イーサリアムクライアント](/developers/docs/nodes-and-clients/)は、新しいフォークルールを実装するためにソフトウェアをアップデートする必要があります。 -The DAOフォークは、周到に脆弱性を突いた[2016年のThe DAO攻撃](https://www.coindesk.com/understanding-dao-hack-journalists)で360万ETH以上の[分散型自律組織(DAO)](/glossary/#dao)コントラクトが流出した事件を受けたものです。 このフォークにより、欠陥をもったコントラクトから新しいコントラクトに資金が転送され、ハッキングでETHを失った人が回収できるようになりました。 +The DAOフォークは、周到に脆弱性を突いた[2016年のThe DAO攻撃](https://www.coindesk.com/learn/understanding-the-dao-attack)で360万ETH以上の[分散型自律組織(DAO)](/glossary/#dao)コントラクトが流出した事件を受けたものです。 このフォークにより、欠陥をもったコントラクトから新しいコントラクトに資金が転送され、ハッキングでETHを失った人が回収できるようになりました。 この行動指針はイーサリアムコミュニティの投票で行われました。 ETH保有者は、 [投票プラットフォーム](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/)でトランザクションを通じて投票することができました。 フォークの実行は、投票の85%以上に支持されました。 diff --git a/public/content/translations/ko/governance/index.md b/public/content/translations/ko/governance/index.md index c35018afb0c..68152b3c03c 100644 --- a/public/content/translations/ko/governance/index.md +++ b/public/content/translations/ko/governance/index.md @@ -118,7 +118,7 @@ EIP 챔피언은 모든 관련 이해 당사자로부터 의견을 수집해야 포크는 네트워크에 주요 기술 업그레이드나 변경 사항이 필요할 때 프로토콜의 "규칙"을 바꿉니다. [이더리움 클라이언트는](/developers/docs/nodes-and-clients/) 새로운 포크 규칙을 구현하기 위해 소프트웨어를 업데이트해야 합니다. -DAO 포크는 안전하지 않은 [DAO 계약](/glossary/#dao)에서 해킹에 의해 360만 ETH가 소실된 [2016년 DAO 공격](https://www.coindesk.com/understanding-dao-hack-journalists)에 대한 대응책이었습니다. 포크는 부실 계약에서 새로운 계약으로 자금을 이동시켜 해킹으로 자금을 잃은 사람 누구나 자금을 회수할 수 있게 했습니다. +DAO 포크는 안전하지 않은 [DAO 계약](/glossary/#dao)에서 해킹에 의해 360만 ETH가 소실된 [2016년 DAO 공격](https://www.coindesk.com/learn/understanding-the-dao-attack)에 대한 대응책이었습니다. 포크는 부실 계약에서 새로운 계약으로 자금을 이동시켜 해킹으로 자금을 잃은 사람 누구나 자금을 회수할 수 있게 했습니다. 이러한 조치는 이더리움 커뮤니티가 투표한 결과입니다. ETH 보유자는 누구든지 [투표 플랫폼](http://v1.carbonvote.com/)에서 트랜잭션을 통해 투표할 수 있었습니다. 포크하기 위한 결정은 85% 이상의 표를 얻었습니다. diff --git a/public/content/translations/ms/governance/index.md b/public/content/translations/ms/governance/index.md index 9ef8264b0bd..4745f5f3512 100644 --- a/public/content/translations/ms/governance/index.md +++ b/public/content/translations/ms/governance/index.md @@ -118,7 +118,7 @@ Secara amnya, perselisihan dikendalikan dengan perbincangan lama dalam forum awa Cabang ialah apabila peningkatan teknikal utama atau perubahan perlu dibuat kepada rangkaian dan menukar "peraturan" protokol. [ Pelanggan Ethereum](/developers/docs/nodes-and-clients/) mesti mengemas kini perisian mereka untuk melaksanakan peraturan cabang baru. -Cabang DAO adalah sebagai tindak balas kepada [serangan DAO tahun 2016](https://www.coindesk.com/understanding-dao-hack-journalists) di mana kontrak [DAO](/glossary/#dao) yang tidak selamat telah disedut lebih daripada 3.6 juta ETH dalam satu serangan penggodaman. Cabang itu memindahkan dana daripada kontrak yang rosak kepada kontrak baru yang membolehkan sesiapa yang kehilangan dana dalam serangan penggodaman untuk mendapatkannya semula. +Cabang DAO adalah sebagai tindak balas kepada [serangan DAO tahun 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) di mana kontrak [DAO](/glossary/#dao) yang tidak selamat telah disedut lebih daripada 3.6 juta ETH dalam satu serangan penggodaman. Cabang itu memindahkan dana daripada kontrak yang rosak kepada kontrak baru yang membolehkan sesiapa yang kehilangan dana dalam serangan penggodaman untuk mendapatkannya semula. Tindakan ini telah diundi oleh masyarakat Ethereum. Mana-mana pemegang ETH boleh mengundi melalui transaksi pada [ platform mengundi](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Keputusan untuk mencabang mencapai lebih 85% undi. diff --git a/public/content/translations/nl/governance/index.md b/public/content/translations/nl/governance/index.md index 6a2a4a339c7..104300848a0 100644 --- a/public/content/translations/nl/governance/index.md +++ b/public/content/translations/nl/governance/index.md @@ -118,7 +118,7 @@ Over het algemeen worden meningsverschillen behandeld met langdurige discussies Forks zijn de momenten waarop grote technische verbeteringen of veranderingen in het netwerk moeten worden aangebracht en de "regels" van het protocol moeten worden gewijzigd. [Ethereum-clients](/developers/docs/nodes-and-clients/) moeten hun software bijwerken om de nieuwe fork-regels te implementeren. -De DAO-fork was een reactie op de [DAO-aanval van 2016](https://www.coindesk.com/understanding-dao-hack-journalists) waarbij een onveilig [DAO](/glossary/#dao)-contract meer dan dan 3,6 miljoen ETH verloor in een hack. De fork verplaatste de fondsen van het foutieve contract naar een nieuw contract, waardoor iedereen die in de hack geld had verloren dit kon terugvorderen. +De DAO-fork was een reactie op de [DAO-aanval van 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) waarbij een onveilig [DAO](/glossary/#dao)-contract meer dan dan 3,6 miljoen ETH verloor in een hack. De fork verplaatste de fondsen van het foutieve contract naar een nieuw contract, waardoor iedereen die in de hack geld had verloren dit kon terugvorderen. Deze handelswijze werd via een stemming door de Ethereum-gemeenschap goedgekeurd. Elke ETH-houder kon stemmen via een transactie op [een stemplatform](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Het besluit om te forken behaalde meer dan 85 procent van de stemmen. diff --git a/public/content/translations/pcm/governance/index.md b/public/content/translations/pcm/governance/index.md index 2ca228e7db8..5a3e3dfa792 100644 --- a/public/content/translations/pcm/governance/index.md +++ b/public/content/translations/pcm/governance/index.md @@ -118,7 +118,7 @@ Generaly, yu fit handol disagriment wit long-form diskushon in publik forum to o Forks na wen major teknika upgrades abi shanjis wi nid to make to netwok and shanj di "rules" of di protokol. [Ethereum klients](/developers/docs/nodes-and-clients/) supose update dem softwia to impliment di new fork rules. -Di DAO fork dey respond to di [2016 DAO attak](https://www.coindesk.com/understanding-dao-hack-journalists) wia insekure [DAO](/glossary/#dao) kontract don drain for ova 3.6 million ETH in di hack. Di fork don muv di funds from di faulty kontract to one new kontract as en dey alow anyone wey lost funds in di hack to rikova dem. +Di DAO fork dey respond to di [2016 DAO attak](https://www.coindesk.com/learn/understanding-the-dao-attack) wia insekure [DAO](/glossary/#dao) kontract don drain for ova 3.6 million ETH in di hack. Di fork don muv di funds from di faulty kontract to one new kontract as en dey alow anyone wey lost funds in di hack to rikova dem. Di Ethereum komunity don vote dis kourse of akshon. Any ETH holder fit vote through transaction for[voting platform](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Di disishon to fork don rish ova 85% of di votes. diff --git a/public/content/translations/pl/governance/index.md b/public/content/translations/pl/governance/index.md index efaf1953d31..9c112d5cfed 100644 --- a/public/content/translations/pl/governance/index.md +++ b/public/content/translations/pl/governance/index.md @@ -118,7 +118,7 @@ Zasadniczo, nieporozumienia są rozwiązywane za pomocą długich dyskusji na fo Forki następują, wtedy kiedy należy dokonać ważnych aktualizacji technicznych lub zmian w sieci i zmienić „zasady” protokołu. [Klienci Ethereum](/developers/docs/nodes-and-clients/) muszą zaktualizować swoje oprogramowanie, aby wdrożyć nowe zasady forków. -Fork DAO był odpowiedzią na [atak DAO z 2016 r.](https://www.coindesk.com/understanding-dao-hack-journalists), w którym niezabezpieczony kontrakt [DAO](/glossary/#dao) został pozbawiony z ponad 3,6 miliona ETH w wyniku włamania. Fork przeniósł środki z wadliwego kontraktu do nowego kontraktu, umożliwiając każdemu, kto stracił środki w wyniku włamania, ich odzyskanie. +Fork DAO był odpowiedzią na [atak DAO z 2016 r.](https://www.coindesk.com/learn/understanding-the-dao-attack), w którym niezabezpieczony kontrakt [DAO](/glossary/#dao) został pozbawiony z ponad 3,6 miliona ETH w wyniku włamania. Fork przeniósł środki z wadliwego kontraktu do nowego kontraktu, umożliwiając każdemu, kto stracił środki w wyniku włamania, ich odzyskanie. Ten kierunek działania został przegłosowany przez społeczność Ethereum. Każdy posiadacz ETH mógł głosować za pośrednictwem transakcji na [platformie do głosowania](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Decyzja o forku osiągnęła ponad 85% głosów. diff --git a/public/content/translations/pl/history/index.md b/public/content/translations/pl/history/index.md index 1012279b0ad..e89696a1cd2 100644 --- a/public/content/translations/pl/history/index.md +++ b/public/content/translations/pl/history/index.md @@ -274,7 +274,7 @@ Fork Tangerine Whistle był pierwszą odpowiedzią na ataki typu „odmowa usłu #### Podsumowanie {#dao-fork-summary} -Fork DAO był odpowiedzią na [atak DAO 2016](https://www.coindesk.com/understanding-dao-hack-journalists), który doprowadził do złamania niezabezpieczonego kontraktu [DAO](/glossary/#dao) i kradzieży ponad 3,6 mln ETH. Fork przeniósł fundusze z błędnego kontraktu do [nowego kontraktu](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754) z jedną funkcją: wypłać. Każdy, kto stracił środki, mógł wypłacić 1 ETH za każde 100 tokenów DAO w swoim portfelu. +Fork DAO był odpowiedzią na [atak DAO 2016](https://www.coindesk.com/learn/understanding-the-dao-attack), który doprowadził do złamania niezabezpieczonego kontraktu [DAO](/glossary/#dao) i kradzieży ponad 3,6 mln ETH. Fork przeniósł fundusze z błędnego kontraktu do [nowego kontraktu](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754) z jedną funkcją: wypłać. Każdy, kto stracił środki, mógł wypłacić 1 ETH za każde 100 tokenów DAO w swoim portfelu. Ten kierunek działania został przegłosowany przez społeczność Ethereum. Każdy posiadacz ETH mógł głosować za pośrednictwem transakcji na [platformie do głosowania](http://v1.carbonvote.com/). Decyzja o forku została poparta ponad 85% głosów. diff --git a/public/content/translations/pt-br/governance/index.md b/public/content/translations/pt-br/governance/index.md index 533184bb41b..6e8167df3e2 100644 --- a/public/content/translations/pt-br/governance/index.md +++ b/public/content/translations/pt-br/governance/index.md @@ -118,7 +118,7 @@ De um modo geral, os desacordos são tratados com discussões de longo prazo em Forks são quando é necessário fazer grandes melhorias técnicas ou alterações na rede e modificar as "regras" do protocolo. [Os clientes da Ethereum](/developers/docs/nodes-and-clients/) devem atualizar seu software para implementar as novas regras do fork. -O fork da DAO foi em resposta ao [ataque da DAO de 2016](https://www.coindesk.com/understanding-dao-hack-journalists) no qual um contrato inseguro de [DAO](/glossary/#dao) foi drenado em mais de 3 milhões de ETH em um hack. O fork transferiu os fundos do contrato falho para um novo contrato, permitindo que qualquer um que perdeu fundos no hack os recuperasse. +O fork da DAO foi em resposta ao [ataque da DAO de 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) no qual um contrato inseguro de [DAO](/glossary/#dao) foi drenado em mais de 3 milhões de ETH em um hack. O fork transferiu os fundos do contrato falho para um novo contrato, permitindo que qualquer um que perdeu fundos no hack os recuperasse. Este curso de ação foi votado pela comunidade Ethereum. Qualquer titular de ETH pôde votar por meio de uma transação em [uma plataforma de votação](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). A decisão de criar fork ultrapassou 85% dos votos. diff --git a/public/content/translations/ro/governance/index.md b/public/content/translations/ro/governance/index.md index 9c62009bf67..3e1285e8e33 100644 --- a/public/content/translations/ro/governance/index.md +++ b/public/content/translations/ro/governance/index.md @@ -118,7 +118,7 @@ Faptul că multe părți interesate au motivații și convingeri diferite însea Un fork sau o bifurcare se produce atunci când trebuie efectuate actualizări sau modificări tehnice majore în rețea și trebuie modificate „regulile" protocolului. [Clienții Ethereum](/developers/docs/nodes-and-clients/) trebuie să-și actualizeze software-ul pentru a implementa noile reguli de forking. -Forkul DAO a fost introdus ca răspuns la [atacul DAO din 2016](https://www.coindesk.com/understanding-dao-hack-journalists) când, din cauza lipsei de protecție, un contract [DAO](/glossary/#dao) a fost golit de peste 3,6 milioane ETH prin piratare. Forkul a mutat fondurile din contractul defectuos într-un nou contract, permițând oricui a pierdut fonduri în urma piratării să le recupereze. +Forkul DAO a fost introdus ca răspuns la [atacul DAO din 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) când, din cauza lipsei de protecție, un contract [DAO](/glossary/#dao) a fost golit de peste 3,6 milioane ETH prin piratare. Forkul a mutat fondurile din contractul defectuos într-un nou contract, permițând oricui a pierdut fonduri în urma piratării să le recupereze. Această măsură a fost votată de comunitatea Ethereum. Orice deținător de ETH a putut vota printr-o tranzacție pe [o platformă de vot](http://v1.carbonvote.com/). Decizia de forking a atins peste 85% din voturi. diff --git a/public/content/translations/ru/governance/index.md b/public/content/translations/ru/governance/index.md index 5fc659775a2..5a70cd34fc9 100644 --- a/public/content/translations/ru/governance/index.md +++ b/public/content/translations/ru/governance/index.md @@ -118,7 +118,7 @@ _Примечание. Любой человек может входить в н Ветвления (форки) — это ситуации, когда необходимо произвести значительные технические обновления или изменения в сети и изменить «правила» протокола. [Клиенты Ethereum](/developers/docs/nodes-and-clients/) должны обновить свое программное обеспечение для реализации новых правил ветвления. -Ветвление DAO было ответом на [атаку на DAO в 2016 году](https://www.coindesk.com/understanding-dao-hack-journalists), когда взлом ненадежного контракта [DAO](/glossary/#dao) привел к потере более чем 3,6 миллиона ETH. Форк переместил средства из неисправного контракта в новый, что позволило всем, кто потерял средства в результате взлома, восстановить их. +Ветвление DAO было ответом на [атаку на DAO в 2016 году](https://www.coindesk.com/learn/understanding-the-dao-attack), когда взлом ненадежного контракта [DAO](/glossary/#dao) привел к потере более чем 3,6 миллиона ETH. Форк переместил средства из неисправного контракта в новый, что позволило всем, кто потерял средства в результате взлома, восстановить их. Этот курс действий был установлен по результатам голосования в сообществе Ethereum. Любой держатель ETH смог проголосовать через транзакцию на [избирательной площадке](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Решение о ветвлении набрало более 85 % голосов. diff --git a/public/content/translations/sk/governance/index.md b/public/content/translations/sk/governance/index.md index 6e67cba6dca..6434216efa8 100644 --- a/public/content/translations/sk/governance/index.md +++ b/public/content/translations/sk/governance/index.md @@ -118,7 +118,7 @@ Vo všeobecnosti sa nezhody riešia dlhou diskusiou na verejných fórach, aby s Rozdelenia nastanú vtedy, keď je potrebné vykonať veľké technické vylepšenia alebo zmeny v sieti a zmeniť „pravidlá“ protokolu. [Klienti Etherea](/developers/docs/nodes-and-clients/) musia aktualizovať svoj softvér, aby implementovali nové pravidlá pre rozdelenie. -DAO fork bol reakciou na [útok na DAO v roku 2016](https://www.coindesk.com/understanding-dao-hack-journalists), pri ktorom sa z nezabezpečeného [DAO](/glossary/#dao) kontraktu pri hackovaní vyčerpalo viac ako 3,6 milióna ETH. Fork presunul prostriedky z nezabezpečeného kontraktu do novej zmluvy, ktorá umožnila komukoľvek, kto stratil prostriedky pri hackovaní, získať ich späť. +DAO fork bol reakciou na [útok na DAO v roku 2016](https://www.coindesk.com/learn/understanding-the-dao-attack), pri ktorom sa z nezabezpečeného [DAO](/glossary/#dao) kontraktu pri hackovaní vyčerpalo viac ako 3,6 milióna ETH. Fork presunul prostriedky z nezabezpečeného kontraktu do novej zmluvy, ktorá umožnila komukoľvek, kto stratil prostriedky pri hackovaní, získať ich späť. O tomto postupe hlasovala komunita Etherea. Any ETH holder was able to vote via a transaction on [a voting platform](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Rozhodnutie o forku (rozdelení) dosiahlo viac ako 85 % hlasov. diff --git a/public/content/translations/sl/governance/index.md b/public/content/translations/sl/governance/index.md index 63842758f7d..f1656106acd 100644 --- a/public/content/translations/sl/governance/index.md +++ b/public/content/translations/sl/governance/index.md @@ -114,7 +114,7 @@ Na splošno se nestrinjanje rešuje z dolgo razpravo na javnih forumih, da bi la Razcepi se zgodijo, ko pride do pomembnejših nadgradenj ali sprememb omrežja in sprememb pravil protokola. [Ethereum stranke](/developers/docs/nodes-and-clients/) morajo nadgraditi svojo programsko opremo, da implementirajo nova pravila razcepa. -DAO razcep se je zgodil kot odziv na [2016 DAO napad](https://www.coindesk.com/understanding-dao-hack-journalists), pri katerem je bilo z napadom iz nezavarovane [DAO](/glossary/#dao) pogodbe izpraznjenih več kot 3,6 milijona ETH. Razcep je prestavil sredstva iz pogodbe z napako v novo pogodbo, kar je vsem, ki so sredstva v napadu izgubili, omogočilo vračilo. +DAO razcep se je zgodil kot odziv na [2016 DAO napad](https://www.coindesk.com/learn/understanding-the-dao-attack), pri katerem je bilo z napadom iz nezavarovane [DAO](/glossary/#dao) pogodbe izpraznjenih več kot 3,6 milijona ETH. Razcep je prestavil sredstva iz pogodbe z napako v novo pogodbo, kar je vsem, ki so sredstva v napadu izgubili, omogočilo vračilo. O tem načinu odziva je glasovala Ethereum skupnost. Katerikoli lastnik ETH je lahko glasoval prek transakcije na [glasovalni platformi](http://v1.carbonvote.com/). Odločitev za razcep je prejela več kot 85 % glasov. diff --git a/public/content/translations/tl/governance/index.md b/public/content/translations/tl/governance/index.md index 8e20141920f..b132f27bb8e 100644 --- a/public/content/translations/tl/governance/index.md +++ b/public/content/translations/tl/governance/index.md @@ -118,7 +118,7 @@ Karaniwang inaayos ang mga hindi pagkakaunawaan sa mahabang usapan sa mga pampub Nangyayari ang mga fork kapag may mga pangunahing teknikal na pag-upgrade o pagbabago at babaguhin nito ang "mga panuntunan" ng protocol. Dapat i-update ng [mga Ethereum client](/developers/docs/nodes-and-clients/) ang kanilang software upang ipatupad ang mga panuntunan para sa fork. -Ang DAO fork ay ginawa bilang tugon sa [DAO attack noong 2016](https://www.coindesk.com/understanding-dao-hack-journalists) kung saan nakuha sa isang hindi secure na [DAO](/glossary/#dao) contract ang mahigit 3.6 milyong ETH sa isang hack. Inilipat ng fork ang mga pondo mula sa palyadong contract sa bagong contract, kaya mare-recover ito ng kahit sinong nawalan ng pondo dahil sa pag-hack. +Ang DAO fork ay ginawa bilang tugon sa [DAO attack noong 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) kung saan nakuha sa isang hindi secure na [DAO](/glossary/#dao) contract ang mahigit 3.6 milyong ETH sa isang hack. Inilipat ng fork ang mga pondo mula sa palyadong contract sa bagong contract, kaya mare-recover ito ng kahit sinong nawalan ng pondo dahil sa pag-hack. Pinagbotohan ng komunidad ng Ethereum ang pagkilos na ito. Any ETH holder was able to vote via a transaction on [a voting platform](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Ang desisyong mag-fork ay umabot ng mahigit 85% ng mga boto. diff --git a/public/content/translations/tr/governance/index.md b/public/content/translations/tr/governance/index.md index cd8438ff8f0..9a844584fbc 100644 --- a/public/content/translations/tr/governance/index.md +++ b/public/content/translations/tr/governance/index.md @@ -118,7 +118,7 @@ Genel olarak anlaşmazlıklar, sorunun kökenini anlamak ve herkesin durumu öl Çatallar, ağda büyük teknik yükseltmeler veya değişiklikler yapılması ve protokolün "kurallarının" değiştirilmesi gerekmesidir. [Ethereum istemcileri](/developers/docs/nodes-and-clients/) yeni çatal kurallarını uygulamak için yazılımlarını güncellemelidir. -DAO çatalı, güvenli olmayan bir [DAO](/glossary/#dao) sözleşmesinin bir hackte 3,6 milyon ETH boşaltıldığı [2016 DAO saldırısına](https://www.coindesk.com/understanding-dao-hack-journalists) yanıt olarak yapıldı. Çatal, fonları hatalı sözleşmeden yeni bir sözleşmeye taşıdı ve hack sırasında fon kaybeden herkesin fonlarını geri almasını sağladı. +DAO çatalı, güvenli olmayan bir [DAO](/glossary/#dao) sözleşmesinin bir hackte 3,6 milyon ETH boşaltıldığı [2016 DAO saldırısına](https://www.coindesk.com/learn/understanding-the-dao-attack) yanıt olarak yapıldı. Çatal, fonları hatalı sözleşmeden yeni bir sözleşmeye taşıdı ve hack sırasında fon kaybeden herkesin fonlarını geri almasını sağladı. Bu eylem planı, Ethereum topluluğu tarafından oylandı. Tüm ETH sahipleri, [bir oylama platformunda](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/) bir işlem aracılığıyla oy kullanabildi. Çatallanma kararı oyların %85'inden fazlasına ulaştı. diff --git a/public/content/translations/uk/governance/index.md b/public/content/translations/uk/governance/index.md index 2d0f1d9363a..eb4de420e0c 100644 --- a/public/content/translations/uk/governance/index.md +++ b/public/content/translations/uk/governance/index.md @@ -118,7 +118,7 @@ _Примітка. Будь-хто може належати до кількох Розгалуження виникають, коли необхідно внести важливі технічні оновлення або зміни в мережу та змінити «правила» протоколу. [Клієнти Ethereum](/developers/docs/nodes-and-clients/) повинні оновити своє програмне забезпечення для впровадження нових правил розгалуження. -Розгалуження DAO з’явилися у відповідь на [атаку на DAO у 2016 році](https://www.coindesk.com/understanding-dao-hack-journalists), коли внаслідок зламу незахищеного контракту [DAO](/glossary/#dao) було втрачено понад 3,6 млн ETH. Завдяки розгалуженню вдалося перенести кошти з пошкодженого контракту до нового, що дало змогу кожному, хто втратив кошти під час зламу, повернути їх. +Розгалуження DAO з’явилися у відповідь на [атаку на DAO у 2016 році](https://www.coindesk.com/learn/understanding-the-dao-attack), коли внаслідок зламу незахищеного контракту [DAO](/glossary/#dao) було втрачено понад 3,6 млн ETH. Завдяки розгалуженню вдалося перенести кошти з пошкодженого контракту до нового, що дало змогу кожному, хто втратив кошти під час зламу, повернути їх. Рішення про впровадження такого заходу було прийнято в результаті голосування, у якому взяла участь спільнота Ethereum. Усі власники ETH могли проголосувати шляхом здійснення транзакції на [платформі для голосування](http://v1.carbonvote.com/). Розгалуження підтримали понад 85 % учасників голосування. diff --git a/public/content/translations/zh-tw/governance/index.md b/public/content/translations/zh-tw/governance/index.md index fd88434d899..d254e0def76 100644 --- a/public/content/translations/zh-tw/governance/index.md +++ b/public/content/translations/zh-tw/governance/index.md @@ -118,7 +118,7 @@ _注意:任何人都能參與多個組別,例如,協定開發者可以支 分叉係指網路必須進行重大的技術升級或變更,且這些升級或變更改變協定的「規則」之時。 [以太坊用戶端](/developers/docs/nodes-and-clients/)必須升級自己的軟體,以實作新分叉規則。 -實行去中心化自治組織分叉是因為 [2016 DAO 攻擊](https://www.coindesk.com/understanding-dao-hack-journalists),[去中心化自治組織](/glossary/#dao)合約不夠安全,被駭客榨取超過 360 萬以太幣。 使用分叉後,資金從這份有缺陷的合約轉移到新的合約,當時因駭客攻擊而損失資金的人,後來都拿回了資金。 +實行去中心化自治組織分叉是因為 [2016 DAO 攻擊](https://www.coindesk.com/learn/understanding-the-dao-attack),[去中心化自治組織](/glossary/#dao)合約不夠安全,被駭客榨取超過 360 萬以太幣。 使用分叉後,資金從這份有缺陷的合約轉移到新的合約,當時因駭客攻擊而損失資金的人,後來都拿回了資金。 這個做法是以太坊社群投票的結果。 所有以太幣持有者都能透過[投票平台](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/)上的交易進行投票。 許多人支持分叉的決定,投票率超過 85%。 diff --git a/public/content/translations/zh/governance/index.md b/public/content/translations/zh/governance/index.md index aee313e8ff1..0df5b53ed8c 100644 --- a/public/content/translations/zh/governance/index.md +++ b/public/content/translations/zh/governance/index.md @@ -118,7 +118,7 @@ _注:任何个人都可以属于多个组(如:协议开发者可以支持 分叉是指需要对网络进行重大技术升级或改变,并改变协议“规则”。 [以太坊客户端](/developers/docs/nodes-and-clients/)必须更新他们的软件以执行新的分叉规则。 -去中心化自治组织分叉是为了回应 [2016 年去中心化自治组织遭受攻击的事件](https://www.coindesk.com/understanding-dao-hack-journalists)。当时,一份不安全的[去中心化自治组织](/glossary/#dao)合约导致黑客盗走了超过 360 万个以太币。 分叉将资金从错误合约转移到新合约,允许在黑客攻击中丢失资金的任何人收回这些资金。 +去中心化自治组织分叉是为了回应 [2016 年去中心化自治组织遭受攻击的事件](https://www.coindesk.com/learn/understanding-the-dao-attack)。当时,一份不安全的[去中心化自治组织](/glossary/#dao)合约导致黑客盗走了超过 360 万个以太币。 分叉将资金从错误合约转移到新合约,允许在黑客攻击中丢失资金的任何人收回这些资金。 这一行为由以太坊社区投票决定。 任何以太币持有人都能够通过在[投票平台](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/)上交易来进行投票。 分叉的决定获得了 85% 以上的票数。 From 0d5040e528bb0994e7f4ee5a33806f8adfb9d5dd Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 18:38:51 -0500 Subject: [PATCH 025/368] changing https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum with https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain --- public/content/enterprise/index.md | 16 ++++++++-------- .../content/translations/de/enterprise/index.md | 2 +- .../content/translations/es/enterprise/index.md | 2 +- .../content/translations/fa/enterprise/index.md | 2 +- .../content/translations/fr/enterprise/index.md | 2 +- .../content/translations/hu/enterprise/index.md | 2 +- .../content/translations/id/enterprise/index.md | 2 +- .../content/translations/it/enterprise/index.md | 2 +- .../content/translations/ja/enterprise/index.md | 2 +- .../content/translations/pl/enterprise/index.md | 2 +- .../translations/pt-br/enterprise/index.md | 2 +- .../content/translations/ro/enterprise/index.md | 2 +- .../content/translations/ru/enterprise/index.md | 2 +- .../content/translations/tr/enterprise/index.md | 2 +- .../translations/zh-tw/enterprise/index.md | 2 +- .../content/translations/zh/enterprise/index.md | 2 +- 16 files changed, 23 insertions(+), 23 deletions(-) diff --git a/public/content/enterprise/index.md b/public/content/enterprise/index.md index 0725819503b..8f01ffc9bb4 100644 --- a/public/content/enterprise/index.md +++ b/public/content/enterprise/index.md @@ -7,7 +7,7 @@ lang: en # Ethereum for enterprise {#ethereum-for-enterprise} Ethereum can help many kinds of businesses, including large companies: - + - Increase trust and reduce the cost of coordination between business parties - Improve business network accountability and operational efficiency - Build new business models and value creation opportunities @@ -75,20 +75,20 @@ Here are some of the enterprise applications that have been built on top of the ### Payments {#payments} - [Brave Browser](https://basicattentiontoken.org/) - _pays users for their attention to advertisements and users can pay publishers to support them, via the Basic Attention Token_ -- [City of Lugano, Switzerland](https://bitcoinsuisse.com/news/city-of-lugano-accepts-crypto-payments) - _payment of taxes and other municipal services_ +- [City of Lugano, Switzerland](https://bitcoinsuisse.com/news/city-of-lugano-accepts-crypto-payments) - _payment of taxes and other municipal services_ - [EthereumAds](https://ethereumads.com/) - _lets web site operators sell advertising space and get paid via Ethereum_ - [hCaptcha](https://www.hcaptcha.com/) - _Bot prevention CAPTCHA system which pays web site operators for the work done by users to label data for machine learning. Now deployed by Cloudflare_ - [Opera MiniPay](https://www.opera.com/products/minipay) - _makes mobile payments more accessible and secure for people in Africa with a non-custodial wallet and leverages phone numbers for easy transactions_ - [Roxpay](https://www.roxpay.ch/) - _automates pay-per-use asset invoicing and payments_ -- [SAP Digital Currency Hub](https://community.sap.com/t5/technology-blogs-by-sap/cross-border-payments-made-easy-with-digital-money-experience-the-future/ba-p/13560384) - _cross border payments with stablecoins_ -- [Toku](https://www.toku.com/) - _payroll, token grant administration, tax compliance, local employment, benefits & distributed HR solutions_ +- [SAP Digital Currency Hub](https://community.sap.com/t5/technology-blogs-by-sap/cross-border-payments-made-easy-with-digital-money-experience-the-future/ba-p/13560384) - _cross border payments with stablecoins_ +- [Toku](https://www.toku.com/) - _payroll, token grant administration, tax compliance, local employment, benefits & distributed HR solutions_ - [Xerof](https://www.xerof.com/) - _facilitates fast and inexpensive international (cross-border) B2B payments_ ### Finance {#finance} - [ABN AMRO](https://tokeny.com/tokeny-fuels-abn-amro-bank-in-tokenizing-green-bonds-on-polygon/) - _with Tokeny, tokenized green bonds_ - [Crowdz](https://crowdz.io/) - _invoice/receivables financing and factoring platform_ -- [Mata Capital](https://consensys.io/blockchain-use-cases/finance/mata-capital) - _real estate investment tokenization_ +- [Mata Capital](https://consensys.io/blockchain-use-cases/finance/mata-capital) - _real estate investment tokenization_ - [Obligate](https://www.obligate.com/) - _regulated and KYC'd on-chain bonds and commercial paper_ - [Siemens](https://press.siemens.com/global/en/pressrelease/siemens-issues-first-digital-bond-blockchain ) - _bond issuance_ - [Sila](https://silamoney.com/) - _banking and ACH payments infrastructure-as-a-service, using a stablecoin_ @@ -98,7 +98,7 @@ Here are some of the enterprise applications that have been built on top of the ### Asset tokenization {#tokenization} - [AgroToken](https://agrotoken.io/en/) - _tokenizing and trading agricultural commodities_ -- [Bitbond](https://www.bitbond.com/) - _improves the issuance, settlement and custody of financial assets with tokenization_ +- [Bitbond](https://www.bitbond.com/) - _improves the issuance, settlement and custody of financial assets with tokenization_ - [Blocksquare](https://blocksquare.io/) - _tokenization infrastructure for real estate_ - [Centrifuge](https://centrifuge.io/) - _tokenized receivables financing, debt, and assets_ - [Clearmatics](https://www.clearmatics.com) - _builds decentralised network platforms for the p2p exchange of tokenised value_ @@ -111,12 +111,12 @@ Here are some of the enterprise applications that have been built on top of the - [Rubey](https://www.rubey.be/) - _a platform that tokenizes high-end art to make it accessible to retail investors_ - [Swarm](https://swarm.com/) - _a platform focused on the digitization and trading of real-world assets in a regulatory compliant manner_ - [Thallo](https://www.thallo.io/) - _a platform to integrate digital carbon credits into business transactions_ -- [Tokenchampions](https://tokenchampions.com/) - _tokenizes European football players' image rights_ +- [Tokenchampions](https://tokenchampions.com/) - _tokenizes European football players' image rights_ ### Notarization of data {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _Italian news agency fights fake news and enables readers to verify the origin of news stories by recording them on Mainnet_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _records provenance and repair history of watches on Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _records provenance and repair history of watches on Ethereum_ - [BRØK](https://www.xn--brk-1na.no/) - _a cap tables platform for unlisted companies on the public, provided by The Norwegian Government_ - [Certifaction](https://certifaction.com/) - _legally valid eSignatures with by privacy-by-design_ - [EthSign](https://ethsign.xyz/) - _records signed electronic documents on the Ethereum blockchain_ diff --git a/public/content/translations/de/enterprise/index.md b/public/content/translations/de/enterprise/index.md index f8a1d3b7539..15531a81f55 100644 --- a/public/content/translations/de/enterprise/index.md +++ b/public/content/translations/de/enterprise/index.md @@ -132,7 +132,7 @@ Nachfolgend werden einige der Anwendungen für Unternehmen aufgelistet, die bisl - [BBVA](https://www.ledgerinsights.com/bbva-blockchain-loan-banking-tech-award/) _Details von finalisierten Darlehen werden gehasht und im Hauptnetz aufgezeichnet_ - [ANSA](https://cointelegraph.com/news/italys-top-news-agency-uses-blockchain-to-fight-fake-coronavirus-news) _Italiens größte Nachrichtenagentur kämpft gegen gefälschte Nachrichten und ermöglicht es Lesern, den Ursprung der Nachrichten zu überprüfen, indem sie im Mainnet aufgezeichnet werden_ - [Verizon](https://decrypt.co/46745/verizon-news-press-releases-ethereum-full-transparency) _protokolliert Pressemitteilungen auf Ethereum, um die Rechenschaftspflicht und das Vertrauen von Unternehmen zu gewährleisten_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) _erfasst den Herkunfts- und Reparaturverlauf von Uhren auf Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) _erfasst den Herkunfts- und Reparaturverlauf von Uhren auf Ethereum_ - [EthSign](https://ethsign.xyz/)_ erfasst signierte elektronische Dokumente in der Ethereum-Blockchain_ ### Lieferkette {#supply-chain} diff --git a/public/content/translations/es/enterprise/index.md b/public/content/translations/es/enterprise/index.md index 49d6a6be5ab..31ee80ebde6 100644 --- a/public/content/translations/es/enterprise/index.md +++ b/public/content/translations/es/enterprise/index.md @@ -116,7 +116,7 @@ Estas son algunas de las aplicaciones empresariales que se han construido sobre ### Notarización de datos {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html)_: Agencia de noticias italiana que lucha contra las noticias falsas y permite a los lectores verificar el origen de las noticias grabándolas en la red principal_. -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum)_: Registra el historial de procedencia y reparación de relojes en Ethereum_. +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain)_: Registra el historial de procedencia y reparación de relojes en Ethereum_. - [BRØK](https://www.xn--brk-1na.no/)_: Plataforma de mesas de capitalización para las compañías no listadas en la red pública de Ethereum, proporcionada por el Gobierno noruego_. - [Certificación](https://certifaction.com/)_: Firmas electrónicas legalmente válidas con privacidad integrada en el diseño (Privacy-by-design)_. - [EthSign](https://ethsign.xyz/)_: Registra documentos electrónicos firmados en la cadena de bloques de Ethereum_. diff --git a/public/content/translations/fa/enterprise/index.md b/public/content/translations/fa/enterprise/index.md index db0e717e0b5..da79c9b9f26 100644 --- a/public/content/translations/fa/enterprise/index.md +++ b/public/content/translations/fa/enterprise/index.md @@ -116,7 +116,7 @@ lang: fa ### ثبت داده‌ها {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _خبرگزاری ایتالیایی با اخبار جعلی مبارزه می‌کند و خوانندگان را قادر می‌سازد تا منشأ اخبار را با ضبط آن‌ها در شبکه اصلی تأیید کنند_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _منشأ و تاریخچه تعمیر را در اتریوم ثبت می‌کند_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _منشأ و تاریخچه تعمیر را در اتریوم ثبت می‌کند_ - [BRØK](https://www.xn--brk-1na.no/) - _پلتفرم جداول کپ برای شرکت‌های ثبت نشده در بورس عمومی توسط دولت نروژ ارائه شده است _ - [گواهی](https://certifaction.com/) - _امضاهای الکترونیکی معتبر قانونی با حریم خصوصی-by-design_ - [EthSign](https://ethsign.xyz/) - _اسناد الکترونیکی امضا شده را در بلاک‌چین اتریوم ثبت می‌کند_ diff --git a/public/content/translations/fr/enterprise/index.md b/public/content/translations/fr/enterprise/index.md index e9c78b25cbf..bedd77eb056 100644 --- a/public/content/translations/fr/enterprise/index.md +++ b/public/content/translations/fr/enterprise/index.md @@ -116,7 +116,7 @@ Voici quelques applications d'entreprises qui ont été construites sur le rése ### Notarisation des données {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _Une agence de presse italienne combat les fausses informations et permet aux lecteurs de vérifier l'origine des informations en les enregistrant sur le réseau principal_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _Enregistre la provenance et l'historique de réparation des montres sur Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _Enregistre la provenance et l'historique de réparation des montres sur Ethereum_ - [BRØK](https://www.xn--brk-1na.no/) - _Une plateforme de tables de capitalisation pour les entreprises non cotées en bourse, fournie par le gouvernement norvégien_ - [Certifaction](https://certifaction.com/) - _eSignatures valides légalement, conçues pour respecter la vie privée_ - [EthSign](https://ethsign.xyz/) - _Enregistre les documents électroniques signés sur la blockchain Ethereum_ diff --git a/public/content/translations/hu/enterprise/index.md b/public/content/translations/hu/enterprise/index.md index 41f49c4ccac..d6a1b0f60d2 100644 --- a/public/content/translations/hu/enterprise/index.md +++ b/public/content/translations/hu/enterprise/index.md @@ -116,7 +116,7 @@ A legtöbb új blokklánc-alkalmazás az [L2](/layer-2) láncokra épül. A más ### Adatok notarizációja {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _Olasz hírügynökség, mely az álhírek ellen küzd, és lehetővé teszi az olvasók számára, hogy a hírek eredetét a főhálózaton történő rögzítéssel ellenőrizzék_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _az órák származását és javítási történetét rögzíti az Ethereumon_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _az órák származását és javítási történetét rögzíti az Ethereumon_ - [BRØK](https://www.xn--brk-1na.no/) - _platform a tőzsdén nem jegyzett társaságoknak, melyet a norvég kormány biztosít_ - [Certifaction](https://certifaction.com/) - _legálisan érvényes elektronikus aláírások, melynek eleve része az adatvédelem_ - [EthSign](https://ethsign.xyz/) - _feljegyezi az Ethereum-blokkláncra az aláírt elektronikus dokumentumokat_ diff --git a/public/content/translations/id/enterprise/index.md b/public/content/translations/id/enterprise/index.md index e82cf820b5e..c4f0dc77e32 100644 --- a/public/content/translations/id/enterprise/index.md +++ b/public/content/translations/id/enterprise/index.md @@ -131,7 +131,7 @@ Berikut adalah beberapa aplikasi perusahaan yang telah digunakan pada Jaringan U - [BBVA](https://www.ledgerinsights.com/bbva-blockchain-loan-banking-tech-award/) _detail pinjaman terakhir di-hash dan dicatat di Jaringan Utama_ - [ANSA](https://cointelegraph.com/news/italys-top-news-agency-uses-blockchain-to-fight-fake-coronavirus-news) _agensi berita terbesar di Italia yang melawan berita palsu dan memungkinkan pembaca memverifikasi sumber berita dengan mencatatnya di Jaringan Utama_ - [Verizon](https://decrypt.co/46745/verizon-news-press-releases-ethereum-full-transparency) _mencatat rilis berita di Ethereum untuk memastikan akuntabilitas dan kepercayaan perusahaan_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) _mencatat sumber dan riwayat perbaikan pengawasan di Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) _mencatat sumber dan riwayat perbaikan pengawasan di Ethereum_ - [EthSign](https://ethsign.xyz/) _mencatat dokumen elektronik yang telah ditandatangani pada blockchain Ethereum_ ### Rantai pasokan {#supply-chain} diff --git a/public/content/translations/it/enterprise/index.md b/public/content/translations/it/enterprise/index.md index 4773237865d..cccb74a83bc 100644 --- a/public/content/translations/it/enterprise/index.md +++ b/public/content/translations/it/enterprise/index.md @@ -116,7 +116,7 @@ Ecco alcune delle applicazioni aziendali sviluppate sulla Rete Principale pubbli ### Notarizzazione dei dati {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html): _agenzia giornalistica italiana che combatte le notizie false e consente ai lettori di verificare l'origine delle notizie registrandole sulla Rete Principale_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum): _registra l'origine e lo storico di riparazioni di orologi su Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain): _registra l'origine e lo storico di riparazioni di orologi su Ethereum_ - [BRØK](https://www.xn--brk-1na.no/): _una piattaforma di tabelle di capitalizzazione per le aziende non quotate al pubblico, fornita dal governo norvegese_ - [Certifaction](https://certifaction.com/): _firme elettroniche legalmente valide con privacy-by-design_ - [EthSign](https://ethsign.xyz/): _registra i documenti elettronici firmati sulla blockchain di Ethereum_ diff --git a/public/content/translations/ja/enterprise/index.md b/public/content/translations/ja/enterprise/index.md index 63602b938eb..10c7f378ba3 100644 --- a/public/content/translations/ja/enterprise/index.md +++ b/public/content/translations/ja/enterprise/index.md @@ -116,7 +116,7 @@ lang: ja ### データの公証化 {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _イタリアの通信社が、フェイクニュースと戦い、ニュースをメインネットに記録することで、読者は出所を確認することが可能_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _イーサリアム上で時計の出所と修理履歴を記録_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _イーサリアム上で時計の出所と修理履歴を記録_ - [BRØK](https://www.xn--brk-1na.no/) - _ノルウェー政府が提供する、非上場企業の公開キャップテーブルプラットフォーム_ - [Certifaction](https://certifaction.com/) - _プライバシーバイデザインによる法的に有効な電子署名_ - [EthSign](https://ethsign.xyz/) - _イーサリアムブロックチェーン上で署名された電子ドキュメントを記録_ diff --git a/public/content/translations/pl/enterprise/index.md b/public/content/translations/pl/enterprise/index.md index 8fdb5ea4509..78c9bac1fc1 100644 --- a/public/content/translations/pl/enterprise/index.md +++ b/public/content/translations/pl/enterprise/index.md @@ -127,7 +127,7 @@ Oto niektóre aplikacje dla przedsiębiorstw, które zostały wdrożone w public - [BBVA](https://www.ledgerinsights.com/bbva-blockchain-loan-banking-tech-award/) _szczegóły sfinalizowanych pożyczek są zhaszowane i zarejestrowane w sieci głównej_ - [ANSA](https://cointelegraph.com/news/italys-top-news-agency-uses-blockchain-to-fight-fake-coronavirus-news) _największa włoska agencja informacyjna walcząca z fałszywymi wiadomościami i umożliwiająca odbiorcom weryfikację pochodzenia wiadomości poprzez rejestrowanie ich w sieci głównej_ - [Verizon](https://decrypt.co/46745/verizon-news-press-releases-ethereum-full-transparency) _rejestruje informacje prasowe dotyczące Ethereum, aby zapewnić odpowiedzialność i zaufanie korporacyjne_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) _rejestruje pochodzenie i historie napraw zegarków w Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) _rejestruje pochodzenie i historie napraw zegarków w Ethereum_ ### Łańcuch dostaw {#supply-chain} diff --git a/public/content/translations/pt-br/enterprise/index.md b/public/content/translations/pt-br/enterprise/index.md index 9874ab1969f..244467beb6c 100644 --- a/public/content/translations/pt-br/enterprise/index.md +++ b/public/content/translations/pt-br/enterprise/index.md @@ -116,7 +116,7 @@ Aqui estão alguns dos aplicativos empresariais criados com base na rede princip ### Autenticação de dados {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _Agência de notícias italiana combate fake news e permite que os leitores verifiquem a origem das notícias registrando-as na rede principal_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _Registra a origem e o histórico de reparos de relógios no Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _Registra a origem e o histórico de reparos de relógios no Ethereum_ - [BRØK](https://www.xn--brk-1na.no/) - _Uma plataforma de cap tables para empresas não listadas ao público, oferecida pelo governo Norueguês_ - [Certifaction](https://certifaction.com/) - _Assinaturas eletrônicas legalmente válidas com funções de privacidade incorporadas ao design_ - [EthSign](https://ethsign.xyz/) - _Registra documentos eletrônicos assinados na blockchain do Ethereum_ diff --git a/public/content/translations/ro/enterprise/index.md b/public/content/translations/ro/enterprise/index.md index f769682fc0d..01b9b26ef18 100644 --- a/public/content/translations/ro/enterprise/index.md +++ b/public/content/translations/ro/enterprise/index.md @@ -131,7 +131,7 @@ Iată câteva dintre aplicațiile pentru întreprinderi care au fost implementat - [BBVA](https://www.ledgerinsights.com/bbva-blockchain-loan-banking-tech-award/) _detaliile împrumuturilor finalizate sunt codificate prin funcții hash și înregistrate pe Mainnet_ - [ANSA](https://cointelegraph.com/news/italys-top-news-agency-uses-blockchain-to-fight-fake-coronavirus-news) _cea mai mare agenție de știri din Italia combate știrile false și le permite cititorilor să verifice originea știrilor înregistrându-le pe Mainnet_ - [Verizon](https://decrypt.co/46745/verizon-news-press-releases-ethereum-full-transparency) _înregistrează comunicate de presă pe Ethereum pentru a asigura responsabilizarea corporativă și încrederea_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) _înregistrează proveniența și istoricul reparațiilor ceasurilor pe Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) _înregistrează proveniența și istoricul reparațiilor ceasurilor pe Ethereum_ - [EthSign](https://ethsign.xyz/) _records signed electronic documents on the Ethereum blockchain_ ### Lanțul de aprovizionare {#supply-chain} diff --git a/public/content/translations/ru/enterprise/index.md b/public/content/translations/ru/enterprise/index.md index 17fa7769dea..29ccc4c5291 100644 --- a/public/content/translations/ru/enterprise/index.md +++ b/public/content/translations/ru/enterprise/index.md @@ -116,7 +116,7 @@ Ethereum может помочь многим видам бизнеса, в то ### Нотариальное заверение данных {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) — _итальянское информационное агентство, которое борется с фейками и позволяет читателям проверять происхождение новостей, записывая их в основную сеть_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) _записывает происхождение и историю ремонта часов в Ethereum_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) _записывает происхождение и историю ремонта часов в Ethereum_ - [BRØK](https://www.xn--brk-1na.no/) — _платформа для таблиц капиталовложений для компаний, не зарегистрированных на бирже, предоставляемая правительством Норвегии._ - [Certifaction](https://certifaction.com/) — _юридически действительные электронные подписи, обеспечивающие конфиденциальность по принципу privacy-by-design_ - [EthSign](https://ethsign.xyz/) _сохраняет подписанные электронные документы в блокчейне Ethereum_ diff --git a/public/content/translations/tr/enterprise/index.md b/public/content/translations/tr/enterprise/index.md index 72904d42099..0c421251767 100644 --- a/public/content/translations/tr/enterprise/index.md +++ b/public/content/translations/tr/enterprise/index.md @@ -116,7 +116,7 @@ Geleneksel, blokzincir tabanlı olmayan şirketlere hitap eden, herkese açık E ### Verilerin noter tasdiki {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _İtalyan haber ajansıdır, sahte haberlerle mücadele eder ve okuyucuların haber makalelerinin kaynağını Ana Ağa kaydederek doğrulamasını sağlar_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _saatlerin kökenini ve onarım geçmişini Ethereum'a kaydeder_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _saatlerin kökenini ve onarım geçmişini Ethereum'a kaydeder_ - [BRØK](https://www.xn--brk-1na.no/) - _Norveç Hükümeti tarafından sağlanan, halka açık olmayan şirketlere yönelik bir sermaye tablosu platformudur_ - [Certifaction](https://certifaction.com/) - _tasarımın parçası olarak gizlilik esasına dayalı, yasal olarak geçerli e-İmzalar_ - [EthSign](https://ethsign.xyz/) - _imzalı elektronik belgeleri Ethereum blok zincirine kaydeder_ diff --git a/public/content/translations/zh-tw/enterprise/index.md b/public/content/translations/zh-tw/enterprise/index.md index 9bd7ebb1dec..7326d85b84a 100644 --- a/public/content/translations/zh-tw/enterprise/index.md +++ b/public/content/translations/zh-tw/enterprise/index.md @@ -116,7 +116,7 @@ lang: zh-tw ### 數據公證 {#notarization-of-data} - [ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _義大利通訊社,它打擊假新聞並使讀者能夠透過將新聞報導記錄在主網上來驗證新聞報導的來源_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _在以太坊上記錄手錶的出處和維修歷史_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _在以太坊上記錄手錶的出處和維修歷史_ - [BRØK](https://www.xn--brk-1na.no/) - _挪威政府為公眾非上市公司提供的股權結構表平台_ - [Certifaction](https://certifaction.com/) - _具有隱私設計的合法有效電子簽名_ - [EthSign](https://ethsign.xyz/) - _在以太坊區塊鏈上記錄簽名的電子文檔_ diff --git a/public/content/translations/zh/enterprise/index.md b/public/content/translations/zh/enterprise/index.md index 1484a2c144d..ba0fa77b9c7 100644 --- a/public/content/translations/zh/enterprise/index.md +++ b/public/content/translations/zh/enterprise/index.md @@ -116,7 +116,7 @@ lang: zh ### 数据公证 {#notarization-of-data} - [ ANSA](https://www.ansa.it/english/news/science_tecnology/2020/04/06/ansa-using-blockchain-to-help-readers_af820b4f-0947-439b-843e-52e114f53318.html) - _意大利通讯社打击假新闻,并通过将新闻报道记录在主网上,让读者能够验证新闻报道的来源_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) - _在以太坊上记录腕表的出处和维修历史_ +- [Breitling](https://www.coindesk.com/business/2020/10/15/breitling-goes-live-with-ethereum-based-system-to-put-all-new-watches-on-the-blockchain) - _在以太坊上记录腕表的出处和维修历史_ - [BRØK](https://www.xn--brk-1na.no/) - _由挪威政府提供的面向非上市公司的股权结构表平台_ - [Certifaction](https://certifaction.com/) - _采用隐私设计的合法有效的电子签名_ - [EthSign](https://ethsign.xyz/) - _在以太坊区块链上记录签名的电子文档_ From 6729ec5c71eff010615ec638f82c052fb25b2745 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 18:42:01 -0500 Subject: [PATCH 026/368] changing https://portal.thirdweb.com/solidity with https://portal.thirdweb.com/contracts/build/overview --- .../developers/docs/smart-contracts/libraries/index.md | 2 +- .../cs/developers/docs/smart-contracts/libraries/index.md | 2 +- .../de/developers/docs/smart-contracts/libraries/index.md | 4 ++-- .../el/developers/docs/smart-contracts/libraries/index.md | 2 +- .../es/developers/docs/smart-contracts/libraries/index.md | 2 +- .../fa/developers/docs/smart-contracts/libraries/index.md | 2 +- .../fr/developers/docs/smart-contracts/libraries/index.md | 2 +- .../hi/developers/docs/smart-contracts/libraries/index.md | 2 +- .../hu/developers/docs/smart-contracts/libraries/index.md | 2 +- .../id/developers/docs/smart-contracts/libraries/index.md | 2 +- .../it/developers/docs/smart-contracts/libraries/index.md | 2 +- .../ja/developers/docs/smart-contracts/libraries/index.md | 2 +- .../nl/developers/docs/smart-contracts/libraries/index.md | 2 +- .../pcm/developers/docs/smart-contracts/libraries/index.md | 2 +- .../pt-br/developers/docs/smart-contracts/libraries/index.md | 2 +- .../tr/developers/docs/smart-contracts/libraries/index.md | 2 +- .../zh-tw/developers/docs/smart-contracts/libraries/index.md | 2 +- .../zh/developers/docs/smart-contracts/libraries/index.md | 2 +- 18 files changed, 19 insertions(+), 19 deletions(-) diff --git a/public/content/developers/docs/smart-contracts/libraries/index.md b/public/content/developers/docs/smart-contracts/libraries/index.md index 37dfd28e5ad..9aeeb996959 100644 --- a/public/content/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Last, when deciding on whether to include a library, consider its overall usage. **thirdweb Solidity SDK -** **_Provides the tools needed to build custom smart contracts efficiently_** -- [Documentation](https://portal.thirdweb.com/solidity/) +- [Documentation](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Related tutorials {#related-tutorials} diff --git a/public/content/translations/cs/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/cs/developers/docs/smart-contracts/libraries/index.md index 11ee048603d..4cb965d2b29 100644 --- a/public/content/translations/cs/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/cs/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Nakonec při rozhodování, zda zahrnout knihovnu, zvažte její celkové použi **thirdweb Solidity SDK –** **_poskytuje nástroje potřebné pro efektivní vytváření vlastních smart kontraktů._** -- [Dokumentace](https://portal.thirdweb.com/solidity/) +- [Dokumentace](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Související návody {#related-tutorials} diff --git a/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md index 46a3bf0a4d4..8e472a2dc3d 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md @@ -65,7 +65,7 @@ Es ist erwähnenswert, dass einige ERCs nicht eigenständig sind, sondern Ergän Beziehen Sie sich immer auf die Dokumentation der Bibliothek, die Sie einbinden, um genaue Anweisungen zur Einbindung in Ihr Projekt zu bekommen. Viele Solidity-Vertragsbibliotheken werden mit `npm` gepackt, sodass Sie sie einfach `npm install` benutzen können. Die meisten Anwendungen zum [Kompilieren](/developers/docs/smart-contracts/compiling/) von Verträgen prüfen Ihre `node_modules` für Smart-Contract-Bibliotheken, sodass Sie Folgendes tun können: ```solidity -// Dadurch wird die @openzeppelin/contracts-Bibliothek von Ihren node_modules geladen +// Dadurch wird die @openzeppelin/contracts-Bibliothek von Ihren node_modules geladen import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract MyNFT is ERC721 { @@ -104,7 +104,7 @@ Schließlich sollten Sie bei der Entscheidung, ob Sie eine Bibliothek integriere **thirdweb Solidity SDK -** **_Bietet die Tools, die zum effizienten Erstellen von benutzerdefinierten Smart Contracts erforderlich sind_** -- [Dokumentation](https://portal.thirdweb.com/solidity/) +- [Dokumentation](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Ähnliche Tutorials {#related-tutorials} diff --git a/public/content/translations/el/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/el/developers/docs/smart-contracts/libraries/index.md index 9e5fe94eab7..7f7b969f47a 100644 --- a/public/content/translations/el/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/el/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ contract MyNFT is ERC721 { **thirdweb Solidity SDK -** **_Παρέχει τα απαραίτητα εργαλεία για την αποτελεσματική κατασκευή προσαρμοσμένων έξυπνων συμβολαίων._** -- [Τεκμηρίωση](https://portal.thirdweb.com/solidity/) +- [Τεκμηρίωση](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Σχετικοί οδηγοί {#related-tutorials} diff --git a/public/content/translations/es/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/es/developers/docs/smart-contracts/libraries/index.md index c7392831018..f1969ca9131 100644 --- a/public/content/translations/es/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/es/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Por último, al decidir si incluir o no una biblioteca, considera su uso general **thirdweb Solidity SDK:****_ Proporciona las herramientas necesarias para crear contratos inteligentes personalizados de forma eficiente_** -- [Documentación](https://portal.thirdweb.com/solidity/) +- [Documentación](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Tutoriales relacionados {#related-tutorials} diff --git a/public/content/translations/fa/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/fa/developers/docs/smart-contracts/libraries/index.md index c8381e55810..10c013deb29 100644 --- a/public/content/translations/fa/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/fa/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ contract MyNFT is ERC721 { **کیت توسعه نرم‌افزار سالیدیتی Thirdweb-****_ ابزار های لازم برای ساخت قراردادهای هوشمند بهینه و مؤثر را در اختیار توسعه دهندگان میگذارد_** -- [اسناد](https://portal.thirdweb.com/solidity/) +- [اسناد](https://portal.thirdweb.com/contracts/build/overview) - [گیت هاب](https://github.com/thirdweb-dev/contracts) ## آموزش های مرتبط {#related-tutorials} diff --git a/public/content/translations/fr/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/fr/developers/docs/smart-contracts/libraries/index.md index 2ac80b7f731..52c9cd3084d 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Enfin, au moment où vous décidez s'inclure une bibliothèque, considérez son **SDK Solidity thirdweb -** **_Fournit les outils nécessaires pour construire efficacement des contrats intelligents personnalisés_** -- [Documentation](https://portal.thirdweb.com/solidity/) +- [Documentation](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Tutoriels connexes {#related-tutorials} diff --git a/public/content/translations/hi/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/hi/developers/docs/smart-contracts/libraries/index.md index f8f1f6e38fd..8b9e45a6598 100644 --- a/public/content/translations/hi/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/hi/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ contract MyNFT is ERC721 { **thirdweb Solidity SDK -** **_कस्टम स्मार्ट अनुबंध को कुशलतापूर्वक बनाने के लिए आवश्यक उपकरण प्रदान करता है_** -- [प्रलेखन](https://portal.thirdweb.com/solidity/) +- [प्रलेखन](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## संबंधित ट्यूटोरियल {#related-tutorials} diff --git a/public/content/translations/hu/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/hu/developers/docs/smart-contracts/libraries/index.md index 49dabb58139..9cae48d70ff 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Végül, amikor eldöntöd, hogy felveszel-e egy könyvtárat, vedd figyelembe a **thirdweb Solidity SDK –** **_Olyan eszközöket biztosít, melyekkel hatékonyan lehet személyre szabott okosszerződéseket létrehozni_** -- [Dokumentáció](https://portal.thirdweb.com/solidity/) +- [Dokumentáció](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Kapcsolódó útmutatók {#related-tutorials} diff --git a/public/content/translations/id/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/id/developers/docs/smart-contracts/libraries/index.md index 54193d7661e..61fe770bb31 100644 --- a/public/content/translations/id/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/id/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Terakhir, saat memutuskan apakah akan memasukkan suatu pustaka, pertimbangkan pe **SDK Solidity thirdweb -** **_Menyediakan alat yang dibutuhkan untuk membuat kontrak pintar khusus dengan efisien_** -- [Dokumentasi](https://portal.thirdweb.com/solidity/) +- [Dokumentasi](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Tutorial terkait {#related-tutorials} diff --git a/public/content/translations/it/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/it/developers/docs/smart-contracts/libraries/index.md index 21f3ff365ea..331d258817f 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Infine, per decidere se includere una libreria, considera l'uso generale che ne **thirdweb Solidity SDK -** **_Fornisce gli strumenti necessari per costruire contratti intelligenti personalizzati in modo efficiente_** -- [Documentazione](https://portal.thirdweb.com/solidity/) +- [Documentazione](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Tutorial correlati {#related-tutorials} diff --git a/public/content/translations/ja/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/ja/developers/docs/smart-contracts/libraries/index.md index 78a10440696..11e2e16fcd6 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ contract MyNFT is ERC721 { **サードウェブSolidity SDK -** **_カスタムスマートコントラクトを効率的に構築するために必要なツールを提供_** -- [ドキュメント](https://portal.thirdweb.com/solidity/) +- [ドキュメント](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## 関連トピック {#related-tutorials} diff --git a/public/content/translations/nl/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/nl/developers/docs/smart-contracts/libraries/index.md index 0f7f89868f7..6c041cc678c 100644 --- a/public/content/translations/nl/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/nl/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Tot slot moet u bij het nemen van een beslissing over het al dan niet gebruiken **thirdweb Solidity SDK -** **_Biedt de tools die nodig zijn om aangepaste smart contracts efficiënt te bouwen_** -- [Documentatie](https://portal.thirdweb.com/solidity/) +- [Documentatie](https://portal.thirdweb.com/contracts/build/overview) - [Github](https://github.com/thirdweb-dev/contracts) ## Gerelateerde tutorials {#related-tutorials} diff --git a/public/content/translations/pcm/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/pcm/developers/docs/smart-contracts/libraries/index.md index 574d6632245..a4c05a54a9c 100644 --- a/public/content/translations/pcm/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/pcm/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Last, wen yu dey diside on weda to inklude one library, make yu konsida hau yu d **thirdweb Solidity SDK -** **_Dey provide di tools wey dey nid to build kustom smart kontracts betta_** -- [Dokumentashon](https://portal.thirdweb.com/solidity/) +- [Dokumentashon](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Related tutorials {#related-tutorials} diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/libraries/index.md index 896fd4ed2ef..b392fff6b0c 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Por último, ao decidir se deve incluir uma biblioteca, considere a sua utiliza **thirdweb Solidity SDK -** **_Fornece as ferramentas necessárias para criar contratos inteligentes e personalizados com eficiência_** -- [Documentação](https://portal.thirdweb.com/solidity/) +- [Documentação](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Tutoriais relacionados {#related-tutorials} diff --git a/public/content/translations/tr/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/tr/developers/docs/smart-contracts/libraries/index.md index 0e06106defb..2f2f7c8021d 100644 --- a/public/content/translations/tr/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/tr/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ Son olarak, bir kütüphaneyi dahil edip etmeyeceğinize karar verirken, onun ge **thirdweb Solidity SDK -** **_Özel akıllı sözleşmeleri verimli bir şekilde oluşturmak için gereken araçları sağlar_** -- [Dokümanlar](https://portal.thirdweb.com/solidity/) +- [Dokümanlar](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## İlgili eğitimler {#related-tutorials} diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/libraries/index.md index ed66fb6aae3..f729e5d06e7 100644 --- a/public/content/translations/zh-tw/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ contract MyNFT is ERC721 { **Web3 Solidity SDK:** **_提供有效率建立自訂智慧型合約所需的工具_** -- [文件](https://portal.thirdweb.com/solidity/) +- [文件](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## 相關教程 {#related-tutorials} diff --git a/public/content/translations/zh/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/zh/developers/docs/smart-contracts/libraries/index.md index 91843449452..cfd3ccea2dd 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/libraries/index.md @@ -104,7 +104,7 @@ contract MyNFT is ERC721 { **thirdweb Solidity SDK - ** **_提供了高效构建自定义智能合约所需的工具_** -- [相关文档](https://portal.thirdweb.com/solidity/) +- [相关文档](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## 相关教程 {#related-tutorials} From 3a56088f745ea56cb465a375bdeb83ca1ad65cf7 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 18:57:43 -0500 Subject: [PATCH 027/368] changing https://www.vincentweisser.com/decentralized-science to https://www.vincentweisser.com/desci --- public/content/desci/index.md | 2 +- public/content/translations/ar/desci/index.md | 2 +- public/content/translations/az/desci/index.md | 2 +- public/content/translations/bn/desci/index.md | 2 +- public/content/translations/cs/desci/index.md | 2 +- public/content/translations/de/desci/index.md | 2 +- public/content/translations/el/desci/index.md | 2 +- public/content/translations/es/desci/index.md | 2 +- public/content/translations/fa/desci/index.md | 2 +- public/content/translations/fil/desci/index.md | 2 +- public/content/translations/fr/desci/index.md | 2 +- public/content/translations/hi/desci/index.md | 2 +- public/content/translations/hu/desci/index.md | 2 +- public/content/translations/id/desci/index.md | 2 +- public/content/translations/it/desci/index.md | 2 +- public/content/translations/ja/desci/index.md | 2 +- public/content/translations/kn/desci/index.md | 2 +- public/content/translations/ko/desci/index.md | 2 +- public/content/translations/mr/desci/index.md | 2 +- public/content/translations/ms/desci/index.md | 2 +- public/content/translations/nl/desci/index.md | 2 +- public/content/translations/pl/desci/index.md | 2 +- public/content/translations/pt-br/desci/index.md | 2 +- public/content/translations/pt/desci/index.md | 2 +- public/content/translations/ru/desci/index.md | 2 +- public/content/translations/sk/desci/index.md | 2 +- public/content/translations/sr/desci/index.md | 2 +- public/content/translations/tl/desci/index.md | 2 +- public/content/translations/tr/desci/index.md | 2 +- public/content/translations/uk/desci/index.md | 2 +- public/content/translations/yo/desci/index.md | 2 +- public/content/translations/zh-tw/desci/index.md | 2 +- public/content/translations/zh/desci/index.md | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/public/content/desci/index.md b/public/content/desci/index.md index 5286e291965..6b87ab22cf0 100644 --- a/public/content/desci/index.md +++ b/public/content/desci/index.md @@ -119,7 +119,7 @@ We welcome suggestions for new projects to list - please look at our [listing po - [A guide to decentralized biotech by Jocelynn Pearl for a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [The case for DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guide to DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Decentralized science resources](https://www.vincentweisser.com/decentralized-science) +- [Decentralized science resources](https://www.vincentweisser.com/desci) - [Molecule’s Biopharma IP-NFTs - A Technical Description](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Building Trustless Systems of Science by Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: The Future of Decentralized Science (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/ar/desci/index.md b/public/content/translations/ar/desci/index.md index 4a43744e7c3..96644927ab6 100644 --- a/public/content/translations/ar/desci/index.md +++ b/public/content/translations/ar/desci/index.md @@ -120,7 +120,7 @@ Web3 لديه القدرة على تعطيل نموذج التمويل المع - [دليل للتكنولوجيا الحيوية اللامركزية بقلم جوسلين بيرل لمستقبل a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [حالة العلوم اللامركزية](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [دليل إلى العلوم اللامركزية](https://future.com/what-is-decentralized-science-aka-desci/) -- [موارد العلوم اللامركزية](https://www.vincentweisser.com/decentralized-science) +- [موارد العلوم اللامركزية](https://www.vincentweisser.com/desci) - [Molecule's Biopharma IP-NFTs - وصف تقني](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) - [بناء أنظمة علمية غير موثوقة بقلم جون ستار](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [ظهور DAOs للتكنولوجيا الحيوية](https://molecule.to/blog/the-emergence-of-biotech-daos) diff --git a/public/content/translations/az/desci/index.md b/public/content/translations/az/desci/index.md index 835577dd845..0c650e0a386 100644 --- a/public/content/translations/az/desci/index.md +++ b/public/content/translations/az/desci/index.md @@ -120,7 +120,7 @@ Siyahıya salınacaq yeni layihələr üçün təklifləri alqışlayırıq - ba - [A16z gələcəyi üçün Jocelynn Pearl tərəfindən mərkəzləşdirilməmiş biotexnologiyaya dair bələdçi](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [DeSci üçün keys](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [DeSci üçün bələdçi](https://future.com/what-is-decentralized-science-aka-desci/) -- [Mərkəzləşdirilməmiş elm resursları](https://www.vincentweisser.com/decentralized-science) +- [Mərkəzləşdirilməmiş elm resursları](https://www.vincentweisser.com/desci) - [Molekulun Biopharma IP-NFTs - Texniki Təsvir](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Jon Starr tərəfindən hazırlanmış Etibar Əsasında Qurulmayan Elmi Sistemlər](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Biotech DAO-ların yaranması](https://molecule.to/blog/the-emergence-of-biotech-daos) diff --git a/public/content/translations/bn/desci/index.md b/public/content/translations/bn/desci/index.md index 55342bc5352..4a229f933dc 100644 --- a/public/content/translations/bn/desci/index.md +++ b/public/content/translations/bn/desci/index.md @@ -120,7 +120,7 @@ Web3 প্যাটার্ন ব্যবহার করে বৈজ্ঞ - [একটি a16z ভবিষ্যতের জন্য Jocelynn Pearl এর বিকেন্দ্রীভূত বায়োটেকের একটি নির্দেশিকা](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [DeSci এর জন্য ক্ষেত্র](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [DeSci-এর নির্দেশিকা](https://future.com/what-is-decentralized-science-aka-desci/) -- [বিকেন্দ্রীকৃত বিজ্ঞান রিসোর্সসমূহ](https://www.vincentweisser.com/decentralized-science) +- [বিকেন্দ্রীকৃত বিজ্ঞান রিসোর্সসমূহ](https://www.vincentweisser.com/desci) - [মলিকিউলের বায়োফার্মা IP-NFT - একটি প্রযুক্তিগত বর্ণনা](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) - [জন স্টারের তৈরি করা বিজ্ঞানের বিশ্বাসহীন সিস্টেম](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [বায়োটেক DAO-এর উত্থান](https://molecule.to/blog/the-emergence-of-biotech-daos) diff --git a/public/content/translations/cs/desci/index.md b/public/content/translations/cs/desci/index.md index 46a5a48a31c..5997e289b8a 100644 --- a/public/content/translations/cs/desci/index.md +++ b/public/content/translations/cs/desci/index.md @@ -118,7 +118,7 @@ Uvítáme návrhy na nové projekty, které je třeba uvést na seznam – pro z - [Průvodce decentralizovanou biotechnologií od Jocelynn Pearl pro budoucnost a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Případ pro DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Průvodce DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Decentralizované vědecké zdroje](https://www.vincentweisser.com/decentralized-science) +- [Decentralizované vědecké zdroje](https://www.vincentweisser.com/desci) - [Molecule's Biopharma IP-NFTs – technický popis](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Budování důvěryhodných systémů vědy od Jona Starra](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas – DeSci: Budoucnost decentralizované vědy (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/de/desci/index.md b/public/content/translations/de/desci/index.md index 3dc13aa1a4c..f5049dafcb1 100644 --- a/public/content/translations/de/desci/index.md +++ b/public/content/translations/de/desci/index.md @@ -118,7 +118,7 @@ Wir freuen uns über Vorschläge für neue Projekte, die in die Liste aufgenomme - [Ein Leitfaden für die dezentrale Biotechnologie von Jocelynn Perl für die Zukunft von a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Die Argumente für DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Anleitung zu DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Dezentralisierte Wissenschaftsressourcen](https://www.vincentweisser.com/decentralized-science) +- [Dezentralisierte Wissenschaftsressourcen](https://www.vincentweisser.com/desci) - [Die Biopharma-IP-NFTs von Molecule – Eine technische Beschreibung](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Aufbau zuverlässiger Wissenschaftssysteme von Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas – DeSci: die Zukunft der dezentralisierten Wissenschaft (Podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/el/desci/index.md b/public/content/translations/el/desci/index.md index 17f506af6f7..45865b413f7 100644 --- a/public/content/translations/el/desci/index.md +++ b/public/content/translations/el/desci/index.md @@ -118,7 +118,7 @@ summaryPoint3: Δημιουργία πάνω στο ανοιχτό επιστη - [Ένας οδηγός για την αποκεντρωμένη βιοτεχνολογία από την Jocelynn Pearl για το μέλλον του a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Η περίπτωση για την DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Οδηγός για DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Πηγές αποκεντρωμένης επιστήμης](https://www.vincentweisser.com/decentralized-science) +- [Πηγές αποκεντρωμένης επιστήμης](https://www.vincentweisser.com/desci) - [Molecule’s Biopharma IP-NFTs - Τεχνική περιγραφή](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Δημιουργώντας έμπιστα συστήματα επιστήμης του Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: Το μέλλον της αποκεντρωμένης επιστήμης (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/es/desci/index.md b/public/content/translations/es/desci/index.md index 4800f0c987c..c225af83dd7 100644 --- a/public/content/translations/es/desci/index.md +++ b/public/content/translations/es/desci/index.md @@ -118,7 +118,7 @@ Estamos abiertos a recibir sugerencias sobre nuevos proyectos por incluir, por f - [Una guía para descentralizar la biotecnología de Jocelynn Pearl para el futuro de 16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [La oportunidad para la DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guía de DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Recursos de ciencia descentralizados](https://www.vincentweisser.com/decentralized-science) +- [Recursos de ciencia descentralizados](https://www.vincentweisser.com/desci) - [Los IP-NFT de la molécula Biopharma: una descripción técnica](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Construyendo sistemas sin confianza de la ciencia por Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: El futuro de la ciencia descentralizada (pódcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/fa/desci/index.md b/public/content/translations/fa/desci/index.md index f3c50e77d65..ab6b43db454 100644 --- a/public/content/translations/fa/desci/index.md +++ b/public/content/translations/fa/desci/index.md @@ -118,7 +118,7 @@ Web3 این پتانسیل را دارد که با آزمایش مدل‌های - [راهنمای بیوتکنولوژی غیرمتمرکز توسط Jocelynn Pearl برای آینده a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [مورد برای DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [راهنمای DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [منابع علمی غیرمتمرکز](https://www.vincentweisser.com/decentralized-science) +- [منابع علمی غیرمتمرکز](https://www.vincentweisser.com/desci) - [Molecule's Biopharma IP-NFTs - توضیحات فنی](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [ساختن سیستم های بی اعتماد علم توسط جان استار](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: The Future of Science Decentralized (پادکست)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/fil/desci/index.md b/public/content/translations/fil/desci/index.md index 31969c338a1..01bafd15026 100644 --- a/public/content/translations/fil/desci/index.md +++ b/public/content/translations/fil/desci/index.md @@ -120,7 +120,7 @@ Tumatanggap kami ng mga mungkahi para sa mga bagong proyekto na ililista - tingn - [Gabay sa decentralized biotech ni Jocelynn Pearl para sa a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Ang sitwasyon para sa DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Gabay sa DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Mga mapagkukunan tungkol sa decentralized science](https://www.vincentweisser.com/decentralized-science) +- [Mga mapagkukunan tungkol sa decentralized science](https://www.vincentweisser.com/desci) - [Biopharma IP-NFTs ng Molecule - Isang Teknikal na Paglalarawan](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Paggawa ng mga Trustless na System of Science ni Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Ang Pag-usbong ng Biotech DAOs](https://molecule.to/blog/the-emergence-of-biotech-daos) diff --git a/public/content/translations/fr/desci/index.md b/public/content/translations/fr/desci/index.md index 9a4faceda9e..c4da62c8f95 100644 --- a/public/content/translations/fr/desci/index.md +++ b/public/content/translations/fr/desci/index.md @@ -118,7 +118,7 @@ Nous accueillons volontiers les suggestions de nouveaux projets à répertorier - [Un guide sur la biotech décentralisée par Jocelynn Pearl pour a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Arguments en faveur de la DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guide relatif à la DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Ressources relatives à la science décentralisée](https://www.vincentweisser.com/decentralized-science) +- [Ressources relatives à la science décentralisée](https://www.vincentweisser.com/desci) - [Les IP-NFT de Molecule dans le domaine biopharmaceutique - Description technique](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Construire des systèmes scientifiques sans tiers de confiance par Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci : L'avenir de la science décentralisée (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/hi/desci/index.md b/public/content/translations/hi/desci/index.md index 55fde1d8aa6..25f63e0d3ff 100644 --- a/public/content/translations/hi/desci/index.md +++ b/public/content/translations/hi/desci/index.md @@ -118,7 +118,7 @@ Web3 डेटा समाधान उपरोक्त परिदृश् - [विकेन्द्रीकृत बायोटेक के लिए एक गाइड, a16z भविष्य के लिए जॉक्लिन पर्ल द्वारा](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [DeSci केस](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [DeSci के लिए गाइड](https://future.com/what-is-decentralized-science-aka-desci/) -- [विकेन्द्रीकृत विज्ञान संसाधन](https://www.vincentweisser.com/decentralized-science) +- [विकेन्द्रीकृत विज्ञान संसाधन](https://www.vincentweisser.com/desci) - [Molecule Biopharma IP-NFT - एक तकनीकी विवरण](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [विज्ञान की विश्वसनीय प्रणालियों का निर्माण, जॉन स्टार द्वारा](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [पॉल कोल्हास - DeSci: विकेंद्रीकृत विज्ञान का भविष्य (पॉडकास्ट)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/hu/desci/index.md b/public/content/translations/hu/desci/index.md index c659604ece4..f765405c42f 100644 --- a/public/content/translations/hu/desci/index.md +++ b/public/content/translations/hu/desci/index.md @@ -118,7 +118,7 @@ Fedezze fel a projekteket és csatlakozzon a DeSci közösségéhez. - [Útmutató a decentralizált biotechnológiához – Jocelynn Pearl (a16z future)](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [A DeSci ügye](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Útmutató a DeSci-hez](https://future.com/what-is-decentralized-science-aka-desci/) -- [A decentralizált tudomány forrásai](https://www.vincentweisser.com/decentralized-science) +- [A decentralizált tudomány forrásai](https://www.vincentweisser.com/desci) - [Molecule Biopharma IP-NFT-k – technikai leírás](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Bizalom nélküli rendszer építése a tudomány számára – Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas – DeSci: a decentralizált tudomány jövője (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/id/desci/index.md b/public/content/translations/id/desci/index.md index 7943643a926..6df0c32fa1f 100644 --- a/public/content/translations/id/desci/index.md +++ b/public/content/translations/id/desci/index.md @@ -118,7 +118,7 @@ Kami menyambut saran untuk proyek-proyek baru yang ingin ditampilkan - silakan l - [Panduan Bioteknologi Terdesentralisasi oleh Jocelynn Pearl untuk a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Argumen untuk DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Panduan untuk DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Sumber daya ilmu pengetahuan terdesentralisasi](https://www.vincentweisser.com/decentralized-science) +- [Sumber daya ilmu pengetahuan terdesentralisasi](https://www.vincentweisser.com/desci) - [IP-NFT Biopharma dari Molecule - Deskripsi Teknis](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Membangun Sistem Ilmu Pengetahuan yang Tidak Memerlukan Kepercayaan oleh Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: Masa Depan Ilmu Pengetahuan Terdesentralisasi (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/it/desci/index.md b/public/content/translations/it/desci/index.md index c0d005e1528..82a15e16e05 100644 --- a/public/content/translations/it/desci/index.md +++ b/public/content/translations/it/desci/index.md @@ -118,7 +118,7 @@ Accogliamo suggerimenti per nuovi progetti da elencare: per iniziare, ti preghia - [Una guida alle biotecnologie decentralizzate di Jocelynn Pearl, per il futuro a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Il caso della DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guida alla DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Risorse scientifiche decentralizzate](https://www.vincentweisser.com/decentralized-science) +- [Risorse scientifiche decentralizzate](https://www.vincentweisser.com/desci) - [IP-NFT nella Biofarmaceutica di Molecule: una descrizione tecnica](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Creare sistemi scientifici attendibili, di Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: Il Futuro della Scienza Decentralizzata (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/ja/desci/index.md b/public/content/translations/ja/desci/index.md index d450f4c070e..96bc43c41e1 100644 --- a/public/content/translations/ja/desci/index.md +++ b/public/content/translations/ja/desci/index.md @@ -118,7 +118,7 @@ Web3の様式を活用することで科学データへのアクセスが大幅 - [Jocelynn Pearlによるa16zの未来のための分散型バイオテックのガイド](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [DeSciのケース](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [DeSciのガイド](https://future.com/what-is-decentralized-science-aka-desci/) -- [分散型科学のリソース](https://www.vincentweisser.com/decentralized-science) +- [分散型科学のリソース](https://www.vincentweisser.com/desci) - [MoleculeのBiopharma IP-NFTs - 技術説明](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Jon Starrによるトラストレスな科学システムの構築](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlaas - DeSci: 分散型科学の未来(ポッドキャスト)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/kn/desci/index.md b/public/content/translations/kn/desci/index.md index ca93fea8c15..decc57f6dac 100644 --- a/public/content/translations/kn/desci/index.md +++ b/public/content/translations/kn/desci/index.md @@ -120,7 +120,7 @@ NFT ಗಳು ಭವಿಷ್ಯದ ವಹಿವಾಟುಗಳಿಗೆ ಆದ - [A 16 ಝಡ್ ಭವಿಷ್ಯಕ್ಕಾಗಿ ಜೋಸೆಲಿನ್ ಪರ್ಲ್ ಅವರಿಂದ ವಿಕೇಂದ್ರೀಕೃತ ಬಯೋಟೆಕ್ ಗೆ ಮಾರ್ಗದರ್ಶಿ](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [DeSci ಪ್ರಕರಣ](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [DeSci ಗೆ ಮಾರ್ಗದರ್ಶಿ](https://future.com/what-is-decentralized-science-aka-desci/) -- [ವಿಕೇಂದ್ರೀಕೃತ ವಿಜ್ಞಾನ ಸಂಪನ್ಮೂಲಗಳು](https://www.vincentweisser.com/decentralized-science) +- [ವಿಕೇಂದ್ರೀಕೃತ ವಿಜ್ಞಾನ ಸಂಪನ್ಮೂಲಗಳು](https://www.vincentweisser.com/desci) - [ಅಣುವಿನ ಬಯೋಫಾರ್ಮಾ IP-NFTs - ತಾಂತ್ರಿಕ ವಿವರಣೆ](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) - [ಜಾನ್ ಸ್ಟಾರ್ ಅವರ ವಿಶ್ವಾಸಾರ್ಹ ವಿಜ್ಞಾನ ವ್ಯವಸ್ಥೆಗಳನ್ನು ನಿರ್ಮಿಸುವುದು](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [ಬಯೋಟೆಕ್ DAO ಗಳ ಹೊರಹೊಮ್ಮುವಿಕೆ](https://molecule.to/blog/the-emergence-of-biotech-daos) diff --git a/public/content/translations/ko/desci/index.md b/public/content/translations/ko/desci/index.md index 62a63718dde..28192e9048e 100644 --- a/public/content/translations/ko/desci/index.md +++ b/public/content/translations/ko/desci/index.md @@ -120,7 +120,7 @@ NFT가 향후 거래에 대한 수익을 원래 작성자에게 다시 전달할 - [A16z 미래를 위한 Jocelynn Pearl의 분산형 생명공학 가이드](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [DeSci의 사례](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [DeSci 가이드](https://future.com/what-is-decentralized-science-aka-desci/) -- [탈중앙화 과학 참고 자료](https://www.vincentweisser.com/decentralized-science) +- [탈중앙화 과학 참고 자료](https://www.vincentweisser.com/desci) - [분자의 바이오제약회사 IP-NFT - 기술 설명](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) - [존 스타의 신뢰할 수 없는 과학 시스템 구축](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [생명공학 DAO의 출현](https://molecule.to/blog/the-emergence-of-biotech-daos) diff --git a/public/content/translations/mr/desci/index.md b/public/content/translations/mr/desci/index.md index 9df670204b9..26dba474fb9 100644 --- a/public/content/translations/mr/desci/index.md +++ b/public/content/translations/mr/desci/index.md @@ -120,7 +120,7 @@ Web3 पॅटर्नचा वापर करून वैज्ञानि - [a16z भविष्यासाठी जोसेलिन पर्लद्वारे विकेंद्रित बायोटेकसाठी मार्गदर्शक](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [DeSci साठी केस](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [DeSci साठी मार्गदर्शक](https://future.com/what-is-decentralized-science-aka-desci/) -- [विकेंद्रित विज्ञान संसाधने](https://www.vincentweisser.com/decentralized-science) +- [विकेंद्रित विज्ञान संसाधने](https://www.vincentweisser.com/desci) - [रेणूचे बायोफार्मा IP-NFT - एक तांत्रिक वर्णन](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) - [जॉन स्टारद्वारे विश्वासार्ह विज्ञान प्रणाली तयार करणे](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [बायोटेक DAO चा उदय](https://molecule.to/blog/the-emergence-of-biotech-daos) diff --git a/public/content/translations/ms/desci/index.md b/public/content/translations/ms/desci/index.md index a2cb5dc314d..18940f0cd62 100644 --- a/public/content/translations/ms/desci/index.md +++ b/public/content/translations/ms/desci/index.md @@ -118,7 +118,7 @@ Kami mengalu-alukan cadangan untuk projek baharu untuk disenaraikan - sila lihat - [Panduan kepada bioteknologi teagih oleh Jocelynn Pearl untuk masa depan a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Kes untuk DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Panduan untuk DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Sumber sains teragih](https://www.vincentweisser.com/decentralized-science) +- [Sumber sains teragih](https://www.vincentweisser.com/desci) - [IP-NFT Biopharma Molecule - Penerangan Teknikal](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Membina Sistem Sains Tanpa Amanah oleh Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: Masa Depan Sains Teragih (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/nl/desci/index.md b/public/content/translations/nl/desci/index.md index 1966b783bcc..73417beb956 100644 --- a/public/content/translations/nl/desci/index.md +++ b/public/content/translations/nl/desci/index.md @@ -118,7 +118,7 @@ We verwelkomen suggesties voor nieuwe projecten om op de lijst te zetten - bekij - ['A guide to decentralized biotech' van Jocelynn Pearl voor a16z Future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Het belang van DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Handleiding voor DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Gedecentraliseerde wetenschapsbronnen](https://www.vincentweisser.com/decentralized-science) +- [Gedecentraliseerde wetenschapsbronnen](https://www.vincentweisser.com/desci) - [Molecule’s Biopharma IP-NFTs - A Technical Description](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - ['Building Trustless Systems of Science' van Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: The Future of Decentralized Science (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/pl/desci/index.md b/public/content/translations/pl/desci/index.md index 89403b7f59a..23a6db109c4 100644 --- a/public/content/translations/pl/desci/index.md +++ b/public/content/translations/pl/desci/index.md @@ -118,7 +118,7 @@ Mile widziane są propozycje nowych projektów do umieszczenia na liście — za - [Przewodnik po zdecentralizowanej biotechnologii autorstwa Jocelynn Pearl dla 16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Problem dla DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Przewodnik po DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Zdecentralizowane zasoby naukowe](https://www.vincentweisser.com/decentralized-science) +- [Zdecentralizowane zasoby naukowe](https://www.vincentweisser.com/desci) - [IP-NFT Biopharma firmy Molecule — opis techniczny](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Budowanie Trustless Systems of Science autorstwa Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas — DeSci: Przyszłość zdecentralizowanej nauki (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/pt-br/desci/index.md b/public/content/translations/pt-br/desci/index.md index 41e72044ccd..678db968668 100644 --- a/public/content/translations/pt-br/desci/index.md +++ b/public/content/translations/pt-br/desci/index.md @@ -118,7 +118,7 @@ Agradecemos o envio de sugestões para novos projetos a serem listados — veja - [Um guia sobre biotecnologia descentralizada por Jocelynn Pearl para o futuro a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [O caso da DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guia para a DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Recursos científicos descentralizados](https://www.vincentweisser.com/decentralized-science) +- [Recursos científicos descentralizados](https://www.vincentweisser.com/desci) - [IP-NFTs Bio-Farmacêuticas da Molecule — Uma descrição técnica](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Construindo sistemas de ciência sem confiança, de Jon Arrastar](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas — DeSci: O Futuro da ciência descentralizada (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/pt/desci/index.md b/public/content/translations/pt/desci/index.md index 041b1b56b45..78f3109c018 100644 --- a/public/content/translations/pt/desci/index.md +++ b/public/content/translations/pt/desci/index.md @@ -118,7 +118,7 @@ Aceitamos sugestões para novos projetos a serem incluídos na lista - consulte - [Um guia para a biotecnologia descentralizada por Jocelynn Pearl para a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [O argumento a favor do DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guia do DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Recursos científicos descentralizados](https://www.vincentweisser.com/decentralized-science) +- [Recursos científicos descentralizados](https://www.vincentweisser.com/desci) - [IP-NFTs biofarmacêuticos da Molecule - Uma descrição técnica](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Construir sistemas de ciência isentos de confiança por Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: O futuro da ciência descentralizada (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/ru/desci/index.md b/public/content/translations/ru/desci/index.md index dde6fa57af2..52aeae8fb4c 100644 --- a/public/content/translations/ru/desci/index.md +++ b/public/content/translations/ru/desci/index.md @@ -118,7 +118,7 @@ Web3 обладает потенциалом, который позволит р - [Руководство по децентрализованной биотехнологии от Джоселин Перл для ресурса Future венчурного фонда a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Аргументы в пользу DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Руководство по DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Децентрализованные научные ресурсы](https://www.vincentweisser.com/decentralized-science) +- [Децентрализованные научные ресурсы](https://www.vincentweisser.com/desci) - [IP-NFT от Molecule’s Biopharma — техническое описание](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Создание систем, не требующих доверия, в науке. Автор: Джон Старр](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Пол Калхас — DeSci: будущее децентрализованной науки (подкаст)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/sk/desci/index.md b/public/content/translations/sk/desci/index.md index 97b81863dc4..bb9edd49dad 100644 --- a/public/content/translations/sk/desci/index.md +++ b/public/content/translations/sk/desci/index.md @@ -118,7 +118,7 @@ Uvítame návrhy nových projektov na zaradenie do zoznamu – pre začiatok si - [Sprievodca decentralizovanou biotechnológiou od Jocelynn Pearl pre budúcnosť a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Prípad pre DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Sprievodca DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Decentralizované vedecké zdroje](https://www.vincentweisser.com/decentralized-science) +- [Decentralizované vedecké zdroje](https://www.vincentweisser.com/desci) - [Molecule's Biopharma IP-NFTs – technický popis](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Budovanie dôveryhodných systémov vedy od Jona Starra](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas – DeSci: budúcnosť decentralizovanej vedy (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/sr/desci/index.md b/public/content/translations/sr/desci/index.md index b16ed7b56ad..94aa956764a 100644 --- a/public/content/translations/sr/desci/index.md +++ b/public/content/translations/sr/desci/index.md @@ -118,7 +118,7 @@ Dobrodošli su predlozi novih projekata za listu — molim vas, pogledajte našu - [Vodič za decentralizovanu biotehnologiju od strane Džoselin Prl za a16z future program](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Argumenti za DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Vodič kroz DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Resursi za decentralizovanu nauku](https://www.vincentweisser.com/decentralized-science) +- [Resursi za decentralizovanu nauku](https://www.vincentweisser.com/desci) - [Molecule-ova Biophrama IP-NFT-jevi — Tehnički opis](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Izgradnja sistema nauke bez potrebe za poverenjem, autor Džon Star](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Pol Kohlas — DeSci: Budućnost decentralizovane nauke (podkast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/tl/desci/index.md b/public/content/translations/tl/desci/index.md index 9bbab2696c2..b52af43ab29 100644 --- a/public/content/translations/tl/desci/index.md +++ b/public/content/translations/tl/desci/index.md @@ -118,7 +118,7 @@ Tumatanggap kami ng mga mungkahi para sa mga bagong proyekto na ililista - tingn - [Gabay sa decentralized biotech ni Jocelynn Pearl para sa a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Ang sitwasyon para sa DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Gabay sa DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Mga mapagkukunan tungkol sa decentralized science](https://www.vincentweisser.com/decentralized-science) +- [Mga mapagkukunan tungkol sa decentralized science](https://www.vincentweisser.com/desci) - [Biopharma IP-NFTs ng Molecule - Isang Teknikal na Paglalarawan](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Paggawa ng mga Trustless na System of Science ni Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: Ang Kinabukasan ng Decentralized Science (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/tr/desci/index.md b/public/content/translations/tr/desci/index.md index bb7d0da2a42..143d4e52b87 100644 --- a/public/content/translations/tr/desci/index.md +++ b/public/content/translations/tr/desci/index.md @@ -118,7 +118,7 @@ Listelenecek yeni proje önerilerine açığız - başlamak için lütfen [liste - [Jocelynn Pearl tarafından a16z geleceği için merkeziyetsiz biyoteknoloji rehberi](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [DeSci için durum](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [DeSci Rehberi](https://future.com/what-is-decentralized-science-aka-desci/) -- [Merkeziyetsiz bilim kaynakları](https://www.vincentweisser.com/decentralized-science) +- [Merkeziyetsiz bilim kaynakları](https://www.vincentweisser.com/desci) - [Molekülün Biyofarması IP-NFT'ler - Teknik Bir Açıklama](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Bilim İçin Güvensiz Sistemler Geliştirmek, Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhass - DeSci: Merkeziyetsiz Bilimin Geleceği (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/uk/desci/index.md b/public/content/translations/uk/desci/index.md index 1480dbd7453..cbc8f3dbc02 100644 --- a/public/content/translations/uk/desci/index.md +++ b/public/content/translations/uk/desci/index.md @@ -118,7 +118,7 @@ Web3 має потенціал розірвати цю несправну мод - [Посібник із децентралізованої біотехнології від Джоселін Перл для ресурсу Future венчурного фонду a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Аргументи на користь DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Посібник із DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Децентралізовані наукові ресурси](https://www.vincentweisser.com/decentralized-science) +- [Децентралізовані наукові ресурси](https://www.vincentweisser.com/desci) - [Biopharma IP-NFTs від Molecule - Технічний опис](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Побудова систем, що не потребують довіри, у науці. Автор: Джон Старр](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Пол Колхаас — DeSci: майбутнє децентралізованої науки (подкаст)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/yo/desci/index.md b/public/content/translations/yo/desci/index.md index e35ebf34c9f..933a75c8dde 100644 --- a/public/content/translations/yo/desci/index.md +++ b/public/content/translations/yo/desci/index.md @@ -118,7 +118,7 @@ A gba awọn abaa fun awọn iṣẹ akanṣe tuntun lati ṣe atokọ - jọw - [A guide to decentralized biotech by Jocelynn Pearl for a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [The case for DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guide to DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Decentralized science resources](https://www.vincentweisser.com/decentralized-science) +- [Decentralized science resources](https://www.vincentweisser.com/desci) - [Molecule’s Biopharma IP-NFTs - A Technical Description](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Building Trustless Systems of Science by Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci: The Future of Decentralized Science (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/zh-tw/desci/index.md b/public/content/translations/zh-tw/desci/index.md index 5193b040481..c23740d75fb 100644 --- a/public/content/translations/zh-tw/desci/index.md +++ b/public/content/translations/zh-tw/desci/index.md @@ -118,7 +118,7 @@ Web3 廣泛試驗過去中心化自治組織和 Web3 開發的不同激勵模型 - [Jocelynn Pearl 為 a16z future 編寫的去中心化生物技術指南](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [去中心化科研的重要性](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [去中心化科研指南](https://future.com/what-is-decentralized-science-aka-desci/) -- [去中心化科研資源](https://www.vincentweisser.com/decentralized-science) +- [去中心化科研資源](https://www.vincentweisser.com/desci) - [Molecule 的生物製藥 IP-NFT - 技術性說明](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [建立無需信任機制的科學系統 作者:Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - DeSci:去中心化科研的未來(播客)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) diff --git a/public/content/translations/zh/desci/index.md b/public/content/translations/zh/desci/index.md index 0e7f42ffd2f..436568e8bdd 100644 --- a/public/content/translations/zh/desci/index.md +++ b/public/content/translations/zh/desci/index.md @@ -118,7 +118,7 @@ summaryPoint3: 它以开放科学运动为基础。 - [由 Jocelynn Pearl 为 a16z 自建媒体网站 Future 写的一份去中心化生物技术指南](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [去中心化科学实例](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [去中心化科学指南](https://future.com/what-is-decentralized-science-aka-desci/) -- [去中心化科学资源](https://www.vincentweisser.com/decentralized-science) +- [去中心化科学资源](https://www.vincentweisser.com/desci) - [Molecule 的生物制药知识产权-非同质化代币 - 技术描述](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Jon Starr 的《构建去信任科学系统》](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) - [Paul Kohlhaas - 去中心化科学:去中心化科学的未来(播客)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) From c5b3e5f64a9cff556c938913a65cc8aec11cd742 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 19:06:01 -0500 Subject: [PATCH 028/368] changing https://metamask.io/download.html to https://metamask.io/download --- .../hello-world-smart-contract-fullstack/index.md | 10 +++++----- .../tutorials/hello-world-smart-contract/index.md | 2 +- .../how-to-write-and-deploy-an-nft/index.md | 2 +- .../content/developers/tutorials/nft-minter/index.md | 8 ++++---- .../tutorials/hello-world-smart-contract/index.md | 2 +- .../how-to-write-and-deploy-an-nft/index.md | 2 +- .../hello-world-smart-contract-fullstack/index.md | 12 ++++++------ .../tutorials/hello-world-smart-contract/index.md | 10 +++++----- .../how-to-write-and-deploy-an-nft/index.md | 4 ++-- .../es/developers/tutorials/nft-minter/index.md | 8 ++++---- .../hello-world-smart-contract-fullstack/index.md | 12 ++++++------ .../tutorials/hello-world-smart-contract/index.md | 10 +++++----- .../how-to-write-and-deploy-an-nft/index.md | 4 ++-- .../fr/developers/tutorials/nft-minter/index.md | 8 ++++---- .../tutorials/hello-world-smart-contract/index.md | 2 +- .../how-to-write-and-deploy-an-nft/index.md | 2 +- .../id/developers/tutorials/nft-minter/index.md | 8 ++++---- .../hello-world-smart-contract-fullstack/index.md | 12 ++++++------ .../tutorials/hello-world-smart-contract/index.md | 10 +++++----- .../how-to-write-and-deploy-an-nft/index.md | 4 ++-- .../it/developers/tutorials/nft-minter/index.md | 8 ++++---- .../hello-world-smart-contract-fullstack/index.md | 10 +++++----- .../tutorials/hello-world-smart-contract/index.md | 10 +++++----- .../how-to-write-and-deploy-an-nft/index.md | 4 ++-- .../ja/developers/tutorials/nft-minter/index.md | 8 ++++---- .../hello-world-smart-contract-fullstack/index.md | 10 +++++----- .../tutorials/hello-world-smart-contract/index.md | 10 +++++----- .../how-to-write-and-deploy-an-nft/index.md | 4 ++-- .../pt-br/developers/tutorials/nft-minter/index.md | 8 ++++---- .../tutorials/hello-world-smart-contract/index.md | 2 +- .../how-to-write-and-deploy-an-nft/index.md | 2 +- .../ro/developers/tutorials/nft-minter/index.md | 8 ++++---- .../hello-world-smart-contract-fullstack/index.md | 10 +++++----- .../tutorials/hello-world-smart-contract/index.md | 2 +- .../how-to-write-and-deploy-an-nft/index.md | 2 +- .../tr/developers/tutorials/nft-minter/index.md | 8 ++++---- .../hello-world-smart-contract-fullstack/index.md | 10 +++++----- .../tutorials/hello-world-smart-contract/index.md | 2 +- .../how-to-write-and-deploy-an-nft/index.md | 4 ++-- .../zh/developers/tutorials/nft-minter/index.md | 8 ++++---- 40 files changed, 131 insertions(+), 131 deletions(-) diff --git a/public/content/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/developers/tutorials/hello-world-smart-contract-fullstack/index.md index e8b357c9faf..129fd2a2c7a 100644 --- a/public/content/developers/tutorials/hello-world-smart-contract-fullstack/index.md +++ b/public/content/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -50,7 +50,7 @@ Click **Create app**. Your app will appear in the table below. You need an Ethereum account to send and receive transactions. We'll use MetaMask, a virtual wallet in the browser that lets users manage their Ethereum account address. -You can download and create a MetaMask account for free [here](https://metamask.io/download.html). When you are creating an account, or if you already have an account, make sure to switch over to the “Goerli Test Network” in the upper right (so that we’re not dealing with real money). +You can download and create a MetaMask account for free [here](https://metamask.io/download). When you are creating an account, or if you already have an account, make sure to switch over to the “Goerli Test Network” in the upper right (so that we’re not dealing with real money). ### Step 4: Add ether from a Faucet {#step-4-add-ether-from-a-faucet} @@ -1119,7 +1119,7 @@ If you want to understand more about how transactions on Ethereum work, check ou #### Download MetaMask {#download-metamask} -You can download and create a MetaMask account for free [here](https://metamask.io/download.html). When you are creating an account, or if you already have an account, make sure to switch over to the “Goerli Test Network” in the upper right \(so that we’re not dealing with real money\). +You can download and create a MetaMask account for free [here](https://metamask.io/download). When you are creating an account, or if you already have an account, make sure to switch over to the “Goerli Test Network” in the upper right \(so that we’re not dealing with real money\). #### Add ether from a Faucet {#add-ether-from-a-faucet} @@ -1174,7 +1174,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1270,7 +1270,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1332,7 +1332,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/developers/tutorials/hello-world-smart-contract/index.md b/public/content/developers/tutorials/hello-world-smart-contract/index.md index 702c94a5a7a..5aecaac8b24 100644 --- a/public/content/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/developers/tutorials/hello-world-smart-contract/index.md @@ -44,7 +44,7 @@ Once you’ve created an Alchemy account, you can generate an API key by creatin We need an Ethereum account to send and receive transactions. For this tutorial, we’ll use MetaMask, a virtual wallet in the browser used to manage your Ethereum account address. More on [transactions](/developers/docs/transactions/). -You can download and create a MetaMask account for free [here](https://metamask.io/download.html). When you are creating an account, or if you already have an account, make sure to switch over to the “Goerli Test Network” in the upper right (so that we’re not dealing with real money). +You can download and create a MetaMask account for free [here](https://metamask.io/download). When you are creating an account, or if you already have an account, make sure to switch over to the “Goerli Test Network” in the upper right (so that we’re not dealing with real money). ![metamask ropsten example](./metamask-ropsten-example.png) diff --git a/public/content/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index 22a5d440396..6c0533025b5 100644 --- a/public/content/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -42,7 +42,7 @@ Once you’ve created an Alchemy account, you can generate an API key by creatin We need an Ethereum account to send and receive transactions. For this tutorial, we’ll use MetaMask, a virtual wallet in the browser used to manage your Ethereum account address. If you want to understand more about how transactions on Ethereum work, check out [this page](/developers/docs/transactions/) from the Ethereum foundation. -You can download and create a MetaMask account for free [here](https://metamask.io/download.html). When you are creating an account, or if you already have an account, make sure to switch over to the “Sepolia Test Network” in the upper right (so that we’re not dealing with real money). +You can download and create a MetaMask account for free [here](https://metamask.io/download). When you are creating an account, or if you already have an account, make sure to switch over to the “Sepolia Test Network” in the upper right (so that we’re not dealing with real money). ![Set Sepolia as your network](./metamask-goerli.png) diff --git a/public/content/developers/tutorials/nft-minter/index.md b/public/content/developers/tutorials/nft-minter/index.md index dac3bc801dc..9726f92e663 100644 --- a/public/content/developers/tutorials/nft-minter/index.md +++ b/public/content/developers/tutorials/nft-minter/index.md @@ -197,7 +197,7 @@ For users to be able to interact with your smart contract they will need to conn For this tutorial, we’ll use MetaMask, a virtual wallet in the browser used to manage your Ethereum account address. If you want to understand more about how transactions on Ethereum work, check out [this page](/developers/docs/transactions/). -You can download and create a MetaMask account for free [here](https://metamask.io/download.html). When you are creating an account, or if you already have an account, make sure to switch over to the “Ropsten Test Network” in the upper right \(so that we’re not dealing with real money\). +You can download and create a MetaMask account for free [here](https://metamask.io/download). When you are creating an account, or if you already have an account, make sure to switch over to the “Ropsten Test Network” in the upper right \(so that we’re not dealing with real money\). ### Add ether from a Faucet {#add-ether-from-faucet} @@ -254,7 +254,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -364,7 +364,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -428,7 +428,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md index f4539390f61..3ed37f19dfa 100644 --- a/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md @@ -42,7 +42,7 @@ Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel ge Wir benötigen ein Ethereum-Konto, um Transaktionen zu senden und zu empfangen. In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Weitere Informationen zu [Transaktionen](/developers/docs/transactions/). -Sie können MetaMask [hier](https://metamask.io/download.html) kostenlos herunterladen und ein Konto erstellen. Wenn Sie ein Konto erstellen oder wenn Sie bereits ein Konto haben, stellen Sie sicher, dass Sie oben rechts zum "Ropsten-Testnet" wechseln (damit wir nicht mit echtem Geld arbeiten). +Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn Sie ein Konto erstellen oder wenn Sie bereits ein Konto haben, stellen Sie sicher, dass Sie oben rechts zum "Ropsten-Testnet" wechseln (damit wir nicht mit echtem Geld arbeiten). ![Beispiel MetaMask Ropsten](./metamask-ropsten-example.png) diff --git a/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index 717e997ded9..166fef44a6a 100644 --- a/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -47,7 +47,7 @@ Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel ge Zum Versenden und Empfangen von Transaktionen benötigen Sie ein Ethereum-Konto. In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Wenn Sie mehr über Transaktionen auf Ethereum erfahren möchten, besuchen Sie [diese Seite](/developers/docs/transactions/) von der Ethereum Foundation. -Sie können [hier](https://metamask.io/download.html) MetaMask kostenlos herunterladen und ein Konto erstellen. Wie Sie ein neues Konto erstellen oder wenn Sie bereits ein Konto haben, stellen Sie bitte sicher, dass Sie zum Ropsten-Testnet oben rechts wechseln (um sicherzustellen, dass Sie nicht mit echtem Geld handeln). +Sie können [hier](https://metamask.io/download) MetaMask kostenlos herunterladen und ein Konto erstellen. Wie Sie ein neues Konto erstellen oder wenn Sie bereits ein Konto haben, stellen Sie bitte sicher, dass Sie zum Ropsten-Testnet oben rechts wechseln (um sicherzustellen, dass Sie nicht mit echtem Geld handeln). ![Ropsten als Netzwerk festlegen](./metamask-goerli.png) diff --git a/public/content/translations/es/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/es/developers/tutorials/hello-world-smart-contract-fullstack/index.md index 8f40855e534..82504ee8199 100644 --- a/public/content/translations/es/developers/tutorials/hello-world-smart-contract-fullstack/index.md +++ b/public/content/translations/es/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -48,7 +48,7 @@ Haga clic en **Create app**. Su aplicación aparecerá en la siguiente tabla. Necesita tener una cuenta de Ethereum para enviar y recibir transacciones. Utilizaremos MetaMask, una cartera virtual en el navegador que permite a los usuarios gestionar la dirección de su cuenta de Ethereum. -Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la “red de prueba Goerli” en la parte superior derecha (para no operar con dinero real). +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la “red de prueba Goerli” en la parte superior derecha (para no operar con dinero real). ### Paso 4: Añadir ether de un faucet {#step-4-add-ether-from-a-faucet} @@ -1116,7 +1116,7 @@ Si quiere más información sobre cómo funcionan las transacciones en Ethereum, #### Descargar MetaMask {#download-metamask} -Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar de «Goerli Test Network» en la parte superior \(para que no se trate de dinero real\). +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar de «Goerli Test Network» en la parte superior \(para que no se trate de dinero real\). #### Añada ether a partir de un grifo {#add-ether-from-a-faucet} @@ -1171,7 +1171,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1276,7 +1276,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1346,7 +1346,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

@@ -1358,7 +1358,7 @@ function addWalletListener() { Llegados a este punto, apuesto a que ni siquiera necesita de nuestra ayuda para entender lo que ocurre. Pero, para ser más exhaustivos, desglosémoslo rápidamente: -- Primero, nuestra función verifica si `window.ethereum` está habilitado \(esto es si MetaMask está instalado\). +- Primero, nuestra función verifica si `window.ethereum` está habilitado \(esto es si MetaMask está instalado\). - Si no lo está, simplemente establecemos nuestra variable de estado `status` a una cadena JSX que solicite al usuario instalar MetaMask. - Si está habilitado, configuramos el oyente `window.ethereum.on("accountsChanged")` en la línea 3, que escucha cambios de estado en la billetera de MetaMask, incluyendo cuando el usuario conecte una cuenta adicional a la dapp, cambie de cuenta o desconecte una cuenta. Si hay por lo menos una cuenta conectada, la variable de estado `walletAddress` es actualizada como la primera cuenta en el arreglo `accounts` devuelto por el oyente. De lo contrario, `walletAddress` se establece como cadena vacía. diff --git a/public/content/translations/es/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/es/developers/tutorials/hello-world-smart-contract/index.md index f1c99d6bfd7..58cb4c4493d 100644 --- a/public/content/translations/es/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/es/developers/tutorials/hello-world-smart-contract/index.md @@ -16,11 +16,11 @@ published: 2021-03-31 Si es nuevo en el desarrollo de cadena de bloques y no sabe por dónde empezar, o si solo quiere entender cómo implementar e interactuar con contratos inteligentes, esta es su guía. Abordaremos cómo crear e implementar un contrato inteligente sencillo en la red de prueba Goerli usando una billetera virtual ([Metamask](https://metamask.io/)), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) y [Alchemy](https://alchemyapi.io/eth) (no se preocupe si aún no entiende lo que significa todo esto: lo explicaremos). > **Advertencia** -> +> > 🚧 Aviso de baja -> +> > Para toda esta guía, se está usando la red de prueba Goerli para crear e implementar un contrato inteligente. Sin embargo, tenga en cuenta que la Ethereum Foundation ha anuciado que [Goerli pronto se dará de baja](https://www.alchemy.com/blog/goerli-faucet-deprecation). -> +> > Recomendamos usar [Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) y el [grifo de Sepolia](https://sepoliafaucet.com/) para este tutorial. En la [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) de este tutorial repasaremos cómo podemos interactuar con nuestro contrato inteligente una vez que se implemente aquí, y en [parte 3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) mostraremos cómo publicarlo en Etherscan. @@ -49,7 +49,7 @@ Una vez que haya creado una cuenta de Alchemy, puede generar una clave de API cr Necesitamos tener una cuenta Ethereum para enviar y recibir transacciones. Para este tutorial, usaremos Metamask, una cartera virtual en el navegador usada para manejar la dirección de su cuenta Ethereum. Más información sobre las [transacciones](/developers/docs/transactions/). -Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la “red de prueba Goerli” en la parte superior derecha (para no operar con dinero real). +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la “red de prueba Goerli” en la parte superior derecha (para no operar con dinero real). ![ejemplo de Metamask Ropsten](./metamask-ropsten-example.png) @@ -66,7 +66,7 @@ Para comprobar que nuestro balance este ahí, hagamos una solicitud de [eth_getB ``` > **NOTA:** Este resultado es en wei, no en ETH. Wei se usa como la denominación más pequeña de Ether. La conversión de wei a ETH es: 1 eth = 1018 wei. Entonces si queremos convertir 0x2B5E3AF16B1880000 a decimales, obtenemos 5\*10¹⁸, que equivale a 5 ETH. -> +> > ¡Fiu! Nuestro dinero de prueba está todo ahí . ## Paso 6: Iniciar nuestro proyecto {#step-6} diff --git a/public/content/translations/es/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/es/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index d922ff1d578..6e24704309d 100644 --- a/public/content/translations/es/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/es/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -46,7 +46,7 @@ Una vez que haya creado una cuenta de Alchemy, puede generar una clave de API cr Necesitamos una cuenta Ethereum para enviar y recibir transacciones. Para este tutorial, usaremos Metamask, una cartera virtual en el navegador usada para manejar la dirección de su cuenta Ethereum. Si quiere más información sobre cómo funcionan las transacciones en Ethereum, eche un vistazo a [esta página](/developers/docs/transactions/) de Ethereum Foundation. -Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o si ya tiene una cuenta, asegurese de alternar a la «red de pruebas Sepolia» en la parte superior derecha (para que no estemos usando dinero real). +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download). Cuando esté creando una cuenta, o si ya tiene una cuenta, asegurese de alternar a la «red de pruebas Sepolia» en la parte superior derecha (para que no estemos usando dinero real). ![Establezca Sepolia como su red](./metamask-goerli.png) @@ -87,7 +87,7 @@ Realmente no importa la respuesta que dé a las preguntas de instalación, he aq author: license: (ISC) About to write to /Users/thesuperb1/Desktop/my-nft/package.json: - + { "name": "my-nft", "version": "1.0.0", diff --git a/public/content/translations/es/developers/tutorials/nft-minter/index.md b/public/content/translations/es/developers/tutorials/nft-minter/index.md index 5dbeea30205..ae77bc30f3f 100644 --- a/public/content/translations/es/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/es/developers/tutorials/nft-minter/index.md @@ -203,7 +203,7 @@ Para que los usuarios puedan interactuar con su contrato inteligente, necesitar Para este tutorial, usaremos Metamask, una cartera virtual en el navegador usada para manejar la dirección de su cuenta Ethereum. Si desea más información sobre cómo funcionan las transacciones en Ethereum, eche un vistazo a [esta página](/developers/docs/transactions/). -Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la "Red de prueba Ropsten" en la parte superior derecha \(para no usar dinero real\). +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la "Red de prueba Ropsten" en la parte superior derecha \(para no usar dinero real\). ### Añada ether a partir de un grifo {#add-ether-from-faucet} @@ -260,7 +260,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -370,7 +370,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -434,7 +434,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/fr/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/fr/developers/tutorials/hello-world-smart-contract-fullstack/index.md index 753c92c0f40..d1297617319 100644 --- a/public/content/translations/fr/developers/tutorials/hello-world-smart-contract-fullstack/index.md +++ b/public/content/translations/fr/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -48,7 +48,7 @@ Cliquer sur **Create app**. Votre application apparaîtra dans le tableau ci-des Vous avez besoin d'un compte Ethereum pour envoyer et recevoir des transactions. Nous utiliserons MetaMask, un portefeuille virtuel intégré au navigateur permettant aux utilisateurs de gérer l'adresse de leur compte Ethereum. -Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download.html). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer sur « Réseau de test Goerli » en haut à droite (afin de ne pas utiliser d'argent réel). +Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer sur « Réseau de test Goerli » en haut à droite (afin de ne pas utiliser d'argent réel). ### Étape 4 : Ajouter des ethers depuis un faucet {#step-4-add-ether-from-a-faucet} @@ -1363,7 +1363,7 @@ Si vous voulez en savoir plus sur le fonctionnement des transactions sur Ethereu #### Téléchargez MetaMask {#download-metamask} -Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download.html). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer vers le « Goerli Test Network » en haut à droite \(afin que nous ne traitions pas avec de l'argent réel\). +Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer vers le « Goerli Test Network » en haut à droite \(afin que nous ne traitions pas avec de l'argent réel\). @@ -1431,7 +1431,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1537,7 +1537,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1607,7 +1607,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

@@ -1619,7 +1619,7 @@ function addWalletListener() { Je parie que vous n'avez même pas besoin de notre aide pour comprendre ce qui se passe ici à ce stade, mais pour des raisons de rigueur, décomposons rapidement : -- Premièrement, notre fonction vérifie si `window.ethereum` est activé \(ex. : MetaMask est installé\). +- Premièrement, notre fonction vérifie si `window.ethereum` est activé \(ex. : MetaMask est installé\). - Si ce n'est pas le cas, nous fixons simplement notre variable d'état `status` à une chaîne de caractères JSX qui invite l'utilisateur à installer MetaMask. - S'il est activé, nous configurons le listener `window.ethereum.on("accountsChanged")` à la ligne 3 qui écoute les changements d'état dans le portefeuille MetaMask, qui les incluent lorsque l'utilisateur connecte un compte additionnel à la dApp, change de compte ou déconnecte un compte. S'il existe au moins un compte connecté, la variable d'état `walletAddress` est mise à jour comme premier compte dans le tableau des comptes `accounts` retourné par l'écouteur. Sinon, `walletAdresse` est défini comme une chaîne de caractères vide. diff --git a/public/content/translations/fr/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/fr/developers/tutorials/hello-world-smart-contract/index.md index 8d0d61367d9..8e57c79c613 100644 --- a/public/content/translations/fr/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/fr/developers/tutorials/hello-world-smart-contract/index.md @@ -16,11 +16,11 @@ published: 2021-03-31 Si vous débutez dans le développement de blockchain et ne savez pas par où commencer, ou si vous souhaitez uniquement comprendre comment déployer et interagir avec les contrats intelligents, ce guide est fait pour vous. Nous allons parcourir la création et le déploiement d'un contrat intelligent simple sur le réseau de test de Goerli à l'aide d'un portefeuille virtuel [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), et [Alchemy](https://alchemyapi.io/eth) (ne vous inquiétez pas si vous ne comprenez pas à ce stade ce que cela signifie, nous allons l'expliquer). > **Avertissement ** -> +> > 🚧 Avis de fin de support -> +> > Tout au long de ce guide, le réseau de test Goerli est utilisé pour créer et déployer un contrat intelligent. Cependant, veuillez noter que l'Ethereum Foundation a annoncé que [Goerli sera bientôt obsolète](https://www.alchemy.com/blog/goerli-faucet-deprecation). -> +> > Nous vous recommandons d'utiliser le [Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) et le [distributeur sur Sepolia](https://sepoliafaucet.com/) pour ce tutoriel. Dans la [partie 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) de ce tutoriel, nous allons voir comment nous pouvons interagir avec notre contrat intelligent une fois qu'il sera déployé ici, et dans la [partie 3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) nous couvrirons comment le publier sur Etherscan. @@ -49,7 +49,7 @@ Une fois que vous avez créé un compte Alchemy, vous pouvez générer une clé Nous avons besoin d'un compte Ethereum pour effectuer des transactions (envoyer et recevoir). Pour ce tutoriel, nous allons utiliser MetaMask, un portefeuille virtuel intégré au navigateur, servant à gérer les adresses de votre compte Ethereum. Plus d'infos sur les [transactions](/developers/docs/transactions/). -Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download.html). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer sur « Réseau de test Goerli » en haut à droite (afin de ne pas utiliser d'argent réel). +Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer sur « Réseau de test Goerli » en haut à droite (afin de ne pas utiliser d'argent réel). ![exemple metamask ropsten](./metamask-ropsten-example.png) @@ -66,7 +66,7 @@ Pour vérifier notre solde, faisons une requête [eth_getBalance](https://docs.a ``` > **REMARQUE :** Ce résultat est en wei et non pas en ETH. Le wei est utilisé comme la plus petite dénomination d'ether. La conversion de wei en ETH est : 1 eth = 1018 wei. Donc si nous convertissons 0x2B5E3AF16B1880000 en décimales, nous obtenons 5\*10¹⁸, ce qui équivaut à 5 ETH. -> +> > Ouf ! Notre fausse monnaie est bien là . ## Étape 6 : Initialisez notre projet {#step-6} diff --git a/public/content/translations/fr/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/fr/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index 22ff9cfcebd..da0a3175f15 100644 --- a/public/content/translations/fr/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/fr/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -46,7 +46,7 @@ Une fois que vous avez créé un compte Alchemy, vous pouvez générer une clé Nous avons besoin d'un compte Ethereum pour effectuer des transactions (envoyer et recevoir). Pour ce tutoriel, nous utiliserons MetaMask, un portefeuille virtuel utilisable dans le navigateur servant à gérer les adresses Ethereum. Si vous voulez en savoir plus sur le fonctionnement des transactions sur Ethereum, consultez [cette page](/developers/docs/transactions/) de la fondation Ethereum. -Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download.html). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer sur « Réseau de test Sepolia » en haut à droite (afin de ne pas utiliser d'argent réel). +Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer sur « Réseau de test Sepolia » en haut à droite (afin de ne pas utiliser d'argent réel). ![Définir Sepolia comme votre réseau](./metamask-goerli.png) @@ -87,7 +87,7 @@ La manière dont vous répondez à ces questions d'installation a peu d'importan author: license: (ISC) About to write to /Users/thesuperb1/Desktop/my-nft/package.json: - + { "name": "my-nft", "version": "1.0.0", diff --git a/public/content/translations/fr/developers/tutorials/nft-minter/index.md b/public/content/translations/fr/developers/tutorials/nft-minter/index.md index f343496b542..de77e07740b 100644 --- a/public/content/translations/fr/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/fr/developers/tutorials/nft-minter/index.md @@ -203,7 +203,7 @@ Pour que les utilisateurs puissent interagir avec votre contrat intelligent, ils Pour ce tutoriel, nous utiliserons MetaMask, un portefeuille virtuel utilisable dans le navigateur servant à gérer les adresses Ethereum. Si vous voulez en savoir plus sur le fonctionnement des transactions sur Ethereum, consultez [cette page](/developers/docs/transactions/). -Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download.html). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer sur « Réseau de test Ropsten » en haut à droite \(afin de ne pas utiliser d'argent réel\). +Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer sur « Réseau de test Ropsten » en haut à droite \(afin de ne pas utiliser d'argent réel\). ### Ajoutez de l'ether depuis un Robinet {#add-ether-from-faucet} @@ -260,7 +260,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -370,7 +370,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -434,7 +434,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/id/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/id/developers/tutorials/hello-world-smart-contract/index.md index 9977dd292d0..45a0f452259 100644 --- a/public/content/translations/id/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/id/developers/tutorials/hello-world-smart-contract/index.md @@ -42,7 +42,7 @@ Setelah Anda membuat akun Alchemy, Anda dapat membuat kunci API dengan membuat a Kita memerlukan akun Ethereum untuk mengirim dan menerima transaksi. Untuk tutorial ini, kita akan menggunakan MetaMask, dompet virtual dalam peramban yang digunakan untuk mengelola alamat akun Ethereum Anda. Selengkapnya tentang [transaksi](/developers/docs/transactions/). -Anda dapat mengunduh dan membuat akun MetaMask secara gratis [di sini](https://metamask.io/download.html). Saat Anda membuat akun, atau jika Anda sudah memiliki akun, pastikan untuk beralih ke "Jaringan Pengujian Ropsten" di kanan atas (sehingga kita tidak berurusan dengan uang asli). +Anda dapat mengunduh dan membuat akun MetaMask secara gratis [di sini](https://metamask.io/download). Saat Anda membuat akun, atau jika Anda sudah memiliki akun, pastikan untuk beralih ke "Jaringan Pengujian Ropsten" di kanan atas (sehingga kita tidak berurusan dengan uang asli). ![contoh metamask ropsten](./metamask-ropsten-example.png) diff --git a/public/content/translations/id/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/id/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index 9e53a664ef3..42147013532 100644 --- a/public/content/translations/id/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/id/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -47,7 +47,7 @@ Setelah Anda membuat akun Alchemy, Anda dapat membuat kunci API dengan membuat a Kita memerlukan akun Ethereum untuk mengirim dan menerima transaksi. Untuk tutorial ini, kita akan menggunakan MetaMask, dompet virtual dalam peramban yang digunakan untuk mengelola alamat akun Ethereum Anda. Jika Anda ingin memahami lebih lanjut tentang cara transaksi di Ethereum bekerja, lihat [halaman ini](/developers/docs/transactions/) dari yayasan Ethereum. -Anda dapat mengunduh dan membuat akun MetaMask secara gratis [di sini](https://metamask.io/download.html). Saat Anda membuat akun, atau jika Anda sudah memiliki akun, pastikan untuk beralih ke "Jaringan Pengujian Ropsten" di kanan atas (sehingga kita tidak berurusan dengan uang asli). +Anda dapat mengunduh dan membuat akun MetaMask secara gratis [di sini](https://metamask.io/download). Saat Anda membuat akun, atau jika Anda sudah memiliki akun, pastikan untuk beralih ke "Jaringan Pengujian Ropsten" di kanan atas (sehingga kita tidak berurusan dengan uang asli). ![Tetapkan Ropsten sebagi jaringan Anda](./metamask-goerli.png) diff --git a/public/content/translations/id/developers/tutorials/nft-minter/index.md b/public/content/translations/id/developers/tutorials/nft-minter/index.md index 6bf125fd57f..8ca8f8c255f 100644 --- a/public/content/translations/id/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/id/developers/tutorials/nft-minter/index.md @@ -204,7 +204,7 @@ For users to be able to interact with your smart contract they will need to conn Untuk tutorial ini, kita akan menggunakan MetaMask, dompet virtual dalam peramban yang digunakan untuk mengelola alamat akun Ethereum Anda. If you want to understand more about how transactions on Ethereum work, check out [this page](/developers/docs/transactions/). -Anda dapat mengunduh dan membuat akun MetaMask secara gratis [di sini](https://metamask.io/download.html). When you are creating an account, or if you already have an account, make sure to switch over to the “Ropsten Test Network” in the upper right \(so that we’re not dealing with real money\). +Anda dapat mengunduh dan membuat akun MetaMask secara gratis [di sini](https://metamask.io/download). When you are creating an account, or if you already have an account, make sure to switch over to the “Ropsten Test Network” in the upper right \(so that we’re not dealing with real money\). ### Add ether from a Faucet {#add-ether-from-faucet} @@ -261,7 +261,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -371,7 +371,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -435,7 +435,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/it/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/it/developers/tutorials/hello-world-smart-contract-fullstack/index.md index 45d2efb5925..ba9f9b5a454 100644 --- a/public/content/translations/it/developers/tutorials/hello-world-smart-contract-fullstack/index.md +++ b/public/content/translations/it/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -48,7 +48,7 @@ Fa i clic su **Crea app**. La tua app apparirà nella tabella sottostante. Per inviare e ricevere transazioni, hai bisogno di un account di Ethereum. Useremo MetaMask, un portafoglio virtuale nel browser che permette agli utenti di gestire l'indirizzo del proprio conto di Ethereum. -Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download.html). Quando crei un account, o se ne possiedi già uno, assicurati di passare alla "rete di prova di Goerli" in alto a destra (così da non avere a che fare con denaro reale). +Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download). Quando crei un account, o se ne possiedi già uno, assicurati di passare alla "rete di prova di Goerli" in alto a destra (così da non avere a che fare con denaro reale). ### Fase 4: aggiungi ether da un Faucet {#step-4-add-ether-from-a-faucet} @@ -1249,7 +1249,7 @@ Se vuoi capire di più su come funzionano le transazioni su Ethereum, dai un'occ #### Scarica MetaMask {#download-metamask} -Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download.html). Quando crei un conto, o se ne possiedi già uno, assicurati di passare alla "rete di prova di Goerli" in alto a destra \(così da non avere a che fare con denaro reale\). +Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download). Quando crei un conto, o se ne possiedi già uno, assicurati di passare alla "rete di prova di Goerli" in alto a destra \(così da non avere a che fare con denaro reale\). @@ -1317,7 +1317,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1423,7 +1423,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1493,7 +1493,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

@@ -1505,7 +1505,7 @@ function addWalletListener() { Scommetto che a questo punto non hai bisogno del nostro aiuto per capire cosa succede qui, ma per completezza di informazioni, vediamo di analizzare velocemente la situazione: -- Per prima cosa, la nostra funzione verifica se `window.ethereum` è abilitata \(cioè se MetaMask è installato\). +- Per prima cosa, la nostra funzione verifica se `window.ethereum` è abilitata \(cioè se MetaMask è installato\). - Se non lo è, impostiamo semplicemente la nostra variabile di stato `status`a una stringa JSX che richiede all'utente di installare MetaMask. - Se è abilitato, configuriamo l'ascoltatore `window.ethereum.on("accountsChanged")` alla riga 3, affinché ascolti i cambiamenti di stato nel portafoglio di MetaMask, tra cui, quando l'utente connette un ulteriore conto alla dapp, cambia conto, o ne disconnette uno. Se è connesso almeno un conto, la variabile di stato `walletAddress` è aggiornata come primo conto nell'insieme `accounts`, restituito dall'ascoltatore. Altrimenti, `walletAddress` è impostato come una stringa vuota. diff --git a/public/content/translations/it/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/it/developers/tutorials/hello-world-smart-contract/index.md index a6f0e96099a..61c18fa14bb 100644 --- a/public/content/translations/it/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/it/developers/tutorials/hello-world-smart-contract/index.md @@ -16,11 +16,11 @@ published: 2021-03-31 Se hai appena iniziato con lo sviluppo blockchain e non sai da dove cominciare, oppure se sei solo interessato a capire come distribuire e interagire con gli smart contract, questa è la guida che fa al caso tuo. Esamineremo la creazione e la distribuzione di un semplice contratto intelligente sulla rete di prova di Goerli, utilizzando un portafoglio virtuale di [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) e [Alchemy](https://alchemyapi.io/eth) (non preoccuparti se non capisci cosa significhi, lo spiegheremo). > **Attenzione** -> +> > 🚧 Avviso di obsolescenza -> +> > Per l'intera guida, la rete di test Goerli viene utilizzata per creare e distribuire un contratto intelligente. Tuttavia, tieni presente che la Ethereum Foundation ha annunciato che [Goerli sarà presto abbandonata](https://www.alchemy.com/blog/goerli-faucet-deprecation). -> +> > Ti consigliamo di utilizzare [Sepolia](https://sepoliafaucet.com/) e il [faucet di Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) per questo tutorial. Nella [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) di questo tutorial, esamineremo come possiamo interagire con il nostro contratto intelligente una volta distribuito e, nella [parte 3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan), copriremo come pubblicarlo su Etherscan. @@ -49,7 +49,7 @@ Una volta creato un conto di Alchemy, puoi generare una chiave API creando un'ap Per inviare e ricevere le transazioni, necessitiamo di un conto di Ethereum. Per questo tutorial, useremo MetaMask, un portafoglio virtuale nel browser per gestire l'indirizzo del tuo conto di Ethereum. Maggiori informazioni sulle [transazioni](/developers/docs/transactions/). -Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download.html). Quando crei un account, o se ne possiedi già uno, assicurati di passare alla "rete di prova di Goerli" in alto a destra (così da non avere a che fare con denaro reale). +Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download). Quando crei un account, o se ne possiedi già uno, assicurati di passare alla "rete di prova di Goerli" in alto a destra (così da non avere a che fare con denaro reale). ![esempio ropsten metamask](./metamask-ropsten-example.png) @@ -66,7 +66,7 @@ Per ricontrollare che ci sia il saldo, facciamo una richiesta [eth_getBalance](h ``` > **NOTA:** questo risultato è in wei non in ETH. Wei è usato come taglio più piccolo dell'ether. La conversione da wei a ETH è: 1 eth = 1018 wei. Quindi se convertiamo 0x2B5E3AF16B1880000 in decimali, otteniamo 5\*10¹⁸, pari a 5 ETH. -> +> > Meno male! I nostri soldi finti ci sono tutti . ## Fase 6: inizializza il progetto {#step-6} diff --git a/public/content/translations/it/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/it/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index fbe6c7961c3..15f525d33a3 100644 --- a/public/content/translations/it/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -46,7 +46,7 @@ Una volta creato un profilo di Alchemy, puoi generare una chiave API creando un' Per inviare e ricevere le transazioni, necessitiamo di un conto di Ethereum. Per questo tutorial, useremo MetaMask, un portafoglio virtuale nel browser per gestire l'indirizzo del tuo conto di Ethereum. Se vuoi capire di più su come funzionano le transazioni su Ethereum, dai un'occhiata a [questa pagina](/developers/docs/transactions/) della Ethereum Foundation. -Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download.html). Quando crei un account, o se ne possiedi già uno, assicurati di passare alla "Rete di prova di Sepolia" in alto a destra (così da non avere a che fare con denaro reale). +Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download). Quando crei un account, o se ne possiedi già uno, assicurati di passare alla "Rete di prova di Sepolia" in alto a destra (così da non avere a che fare con denaro reale). ![Imposta Sepolia come tua rete](./metamask-goerli.png) @@ -87,7 +87,7 @@ Non è importante come rispondi alle domande d'installazione; a titolo di esempi author: license: (ISC) About to write to /Users/thesuperb1/Desktop/my-nft/package.json: - + { "name": "my-nft", "version": "1.0.0", diff --git a/public/content/translations/it/developers/tutorials/nft-minter/index.md b/public/content/translations/it/developers/tutorials/nft-minter/index.md index d6392b874ea..284042043c3 100644 --- a/public/content/translations/it/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/it/developers/tutorials/nft-minter/index.md @@ -203,7 +203,7 @@ Per poter interagire con il tuo smart contract, gli utenti dovranno connettere i Per questo tutorial, utilizzeremo MetaMask, un portafoglio virtuale nel browser, utilizzato per gestire l'indirizzo del tuo conto di Ethereum. Se vuoi capire di più su come funzionano le transazioni su Ethereum, dai un'occhiata a [questa pagina](/developers/docs/transactions/). -Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download.html). Quando stai creando un conto, o se ne hai già uno, assicurati di passare alla "Rete di Prova di Ropsten" in alto a destra \(così da non avere a che fare con denaro reale\). +Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download). Quando stai creando un conto, o se ne hai già uno, assicurati di passare alla "Rete di Prova di Ropsten" in alto a destra \(così da non avere a che fare con denaro reale\). ### Aggiungere ether da un Faucet {#add-ether-from-faucet} @@ -260,7 +260,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -370,7 +370,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -434,7 +434,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract-fullstack/index.md index 3be7dc73466..9090b26ac1f 100644 --- a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract-fullstack/index.md +++ b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -48,7 +48,7 @@ _注意: 必ず**Goerli**を選択してください。そうしないと、こ トランザクションの送受信には、イーサリアムアカウントが必要です。 ここでは、MetaMaskを使います。MataMaskは、ユーザーがイーサリアムのアカウントアドレスを管理できるブラウザーの仮想ウォレットです。 -Metamaskのアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Goerli Test Network」に切り替えてください。 +Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Goerli Test Network」に切り替えてください。 ### ステップ4: フォーセットからイーサリアムを追加する {#step-4-add-ether-from-a-faucet} @@ -1116,7 +1116,7 @@ useEffect(async () => { #### MetaMaskをダウンロード {#download-metamask} -Metamaskのアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は\( 実際に支払いが発生しないように \)右上の「Goerli Test Network」に切り替えてください。 +Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は\( 実際に支払いが発生しないように \)右上の「Goerli Test Network」に切り替えてください。 #### フォーセットからイーサ(ETH)を追加 {#add-ether-from-a-faucet} @@ -1171,7 +1171,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1267,7 +1267,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1329,7 +1329,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md index 9ea7d2fbeec..5da8cb7d508 100644 --- a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md @@ -16,11 +16,11 @@ published: 2021-03-31 このチュートリアルは、ブロックチェーンの開発が初めてで、どこから始めたらよいのか分からない場合や、 スマートコントラクトをデプロイしてやり取りする方法を理解したいだけの場合に、最適なガイドとなります。 このチュートリアルでは、仮想ウォレット([MetaMask](https://metamask.io/))、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org/)、[Alchemy](https://alchemyapi.io/eth)を使用して、Goerliテストネットワーク上で簡単なスマートコントラクトを作成してデプロイする方法を順を追って説明します(現時点でしっかりと理解できていなくても、心配はご無用です。後ほど説明します)。 > **警告** -> +> > 🚧 非推奨の通知 -> +> > このガイドでは、Goerliテストネットワークをスマートコントラクトの作成とデプロイに使用しています。 ただし、イーサリアム・ファウンデーションにより、[Goerliが間もなく廃止予定](https://www.alchemy.com/blog/goerli-faucet-deprecation)であることが発表されました。 -> +> > このチュートリアルでは、[Sepolia](https://www.alchemy.com/overviews/sepolia-testnet)および[Sepoliaフォーセット](https://sepoliafaucet.com/)の利用を推奨します。 このチュートリアルの[パート2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract)では、ここでデプロイしたスマートコントラクトとやり取りする方法について説明します。[パート3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan)では、そのスマートコントラクトをEtherscanで公開する方法について説明します。 @@ -49,7 +49,7 @@ Alchemyのアカウントを作成すると、アプリを作成することでA トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 [トランザクション](/developers/docs/transactions/)の詳細。 -Metamaskのアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Goerli Test Network」に切り替えてください。 +Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Goerli Test Network」に切り替えてください。 ![MetaMask Ropstenの例](./metamask-ropsten-example.png) @@ -66,7 +66,7 @@ Metamaskのアカウントは[こちら](https://metamask.io/download.html)か ``` > **注:** この結果の単位は、ETHではなくweiです。 weiはETHの最小単位として使われています。 weiからETHへ変換すると、1 eth = 1018 weiになります。 つまり、0x2B5E3AF16B1880000を10進数に変換すると、5\*10¹⁸となり、5 ETHに相当します。 -> +> > ご安心ください。 偽のお金はすべてそこにあります。 ## ステップ6: プロジェクトを初期化する {#step-6} diff --git a/public/content/translations/ja/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/ja/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index dd960cde570..41d1292c2fe 100644 --- a/public/content/translations/ja/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/ja/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -46,7 +46,7 @@ Alchemyのアカウントを作成すると、アプリを作成することでA トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 イーサリアムのトランザクションの仕組みの詳細については、イーサリアム・ファウンデーションの[こちらのページ](/developers/docs/transactions/)をご覧ください。 -Metamaskのアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Sepolia Test Network」に切り替えてください。 +Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Sepolia Test Network」に切り替えてください。 ![Sepoliaをネットワークとして設定する](./metamask-goerli.png) @@ -87,7 +87,7 @@ Metamaskのアカウントは[こちら](https://metamask.io/download.html)か author: license: (ISC) About to write to /Users/thesuperb1/Desktop/my-nft/package.json: - + { "name": "my-nft", "version": "1.0.0", diff --git a/public/content/translations/ja/developers/tutorials/nft-minter/index.md b/public/content/translations/ja/developers/tutorials/nft-minter/index.md index 7ae743e9bb1..73c207a00c0 100644 --- a/public/content/translations/ja/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/ja/developers/tutorials/nft-minter/index.md @@ -203,7 +203,7 @@ return ( このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 イーサリアムのトランザクションの仕組みの詳細については、[こちらのページ](/developers/docs/transactions/)をご覧ください。 -Metamaskのアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は、(実際に支払いが発生しないように)右上の「Ropsten Test Network」に切り替えてください。 +Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は、(実際に支払いが発生しないように)右上の「Ropsten Test Network」に切り替えてください。 ### フォーセットからイーサ(ETH)を追加 {#add-ether-from-faucet} @@ -260,7 +260,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -370,7 +370,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -434,7 +434,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract-fullstack/index.md index 83b560c08ac..39cf2394925 100644 --- a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract-fullstack/index.md +++ b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -48,7 +48,7 @@ Clique em **Criar app**. Seu app aparecerá na tabela abaixo. Você precisa de uma conta Ethereum para enviar e receber transações. Nós usaremos MetaMask, a carteira virtual no navegador que permite usuários gerenciarem o endereço da sua conta Ethereum. -Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando você estiver criando uma conta, ou se já tiver uma conta, certifique-se de mudar para a “Rede de teste Goerli”, no canto superior direito (para que não estejamos lidando com dinheiro real). +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download). Quando você estiver criando uma conta, ou se já tiver uma conta, certifique-se de mudar para a “Rede de teste Goerli”, no canto superior direito (para que não estejamos lidando com dinheiro real). ### Etapa 4: Adicionar ether de um faucet {#step-4-add-ether-from-a-faucet} @@ -1116,7 +1116,7 @@ Se você quiser entender mais sobre como as transações no Ethereum funcionam, #### Baixar MetaMask {#download-metamask} -Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Ao criar uma conta, ou mesmo se você já tiver uma conta, certifique-se de mudar para "Goerli Test Network” na parte superior direita \(para não lidarmos com dinheiro real\). +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download). Ao criar uma conta, ou mesmo se você já tiver uma conta, certifique-se de mudar para "Goerli Test Network” na parte superior direita \(para não lidarmos com dinheiro real\). #### Etapa: Adicionar Faucet ether {#add-ether-from-a-faucet} @@ -1171,7 +1171,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1267,7 +1267,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1329,7 +1329,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md index 2db6baca805..789695cb150 100644 --- a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md @@ -16,11 +16,11 @@ published: 2021-03-31 Se você é novo no desenvolvimento de blockchain e não sabe por onde começar, ou se apenas deseja entender como implementar ou interagir com contratos inteligentes, este guia é para você. Vamos criar e implantar um contrato inteligente simples na rede de teste Goerli usando uma carteira virtual [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) e [Alchemy](https://alchemyapi.io/eth) (não se preocupe se você ainda não entendeu o que isso significa, nós explicaremos). > **Atenção** -> +> > Aviso de descontinuidade -> +> > Para este guia inteiro, a rede de teste Goerli está sendo usada para criação e implantação de contratos inteligentes. Entretanto, por favor note que a Ethereum Foundation anunciou que a [Goerli será descontinuada em breve](https://www.alchemy.com/blog/goerli-faucet-deprecation). -> +> > Nós recomendamos você usar a [Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) e [faucets Sepolia](https://sepoliafaucet.com/) para este tutorial. Na [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) deste tutorial, veremos como podemos interagir com nosso contrato inteligente, assim que for implantado aqui, e na [parte 3](https://docs.alchemy.com/docs/submitted-your-smart-contract-to-etherscan), abordaremos como publicá-lo no Etherscan. @@ -49,7 +49,7 @@ Assim que você criar uma conta na Alchemy, você pode gerar uma chave de API cr Precisamos de uma conta de Ethereum para enviar e receber transações. Para este tutorial, usaremos uma carteira virtual no navegador, a MetaMask, para gerenciar o endereço da sua conta Ethereum. Mais sobre [transações](/developers/docs/transactions/). -Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando você estiver criando uma conta, ou se já tiver uma conta, certifique-se de mudar para a “Rede de teste Goerli”, no canto superior direito (para que não estejamos lidando com dinheiro real). +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download). Quando você estiver criando uma conta, ou se já tiver uma conta, certifique-se de mudar para a “Rede de teste Goerli”, no canto superior direito (para que não estejamos lidando com dinheiro real). ![exemplo metamask ropsten](./metamask-ropsten-example.png) @@ -66,7 +66,7 @@ Para verificar novamente que temos saldo, vamos fazer uma solicitação através ``` > **OBSERVAÇÃO:** este resultado é em wei não em ETH. Lembre-se de que "Wei" é a menor unidade de ether. A conversão de wei para ETH é 1 ETH = 1018 wei. Desta maneira, se convertermos 0x2B5E3AF16B1880000 em decimal obteremos 5\*10¹⁸, o que equivale a 5 ETH. -> +> > Ufa! Nosso dinheiro de imitação está todo aí . ## Passo 6: Inicialize nosso projeto {#step-6} diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index 1419b4d33c0..aa90db7d63f 100644 --- a/public/content/translations/pt-br/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/pt-br/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -46,7 +46,7 @@ Assim que criar uma conta na Alchemy, você pode gerar uma chave de API criando Precisamos de uma conta Ethereum para enviar e receber transações. Para este tutorial, usaremos uma carteira virtual no navegador, a MetaMask, para gerenciar o endereço da sua conta Ethereum. Se você quiser entender mais sobre como as transações no Ethereum funcionam, confira [esta página](/developers/docs/transactions/) na Fundação Ethereum. -Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando você estiver criando uma conta, ou se você já tiver uma, certifique-se de mudar para a “Sepolia Test Network” no canto superior direito (para que não lidemos com dinheiro real). +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download). Quando você estiver criando uma conta, ou se você já tiver uma, certifique-se de mudar para a “Sepolia Test Network” no canto superior direito (para que não lidemos com dinheiro real). ![Defina Sepolia como sua rede](./metamask-goerli.png) @@ -87,7 +87,7 @@ Não importa realmente como você responde às questões de instalação; aqui e author: license: (ISC) About to write to /Users/thesuperb1/Desktop/my-nft/package.json: - + { "name": "my-nft", "version": "1.0.0", diff --git a/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md b/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md index b5ef01302fc..56bf004d487 100644 --- a/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md @@ -203,7 +203,7 @@ Para que os usuários possam interagir com o seu contrato inteligente, eles prec Para este tutorial, usaremos uma carteira virtual no navegador, a MetaMask, para gerenciar o endereço da sua conta Ethereum. Se você quiser entender mais sobre como as transações no Ethereum funcionam, confira [esta página](/developers/docs/transactions/) na Fundação Ethereum. -Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando estiver criando uma conta, ou se já tiver uma, certifique-se de mudar para a "Ropsten Test Network", no canto superior direito (para não precisar lidar com dinheiro de verdade\). +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download). Quando estiver criando uma conta, ou se já tiver uma, certifique-se de mudar para a "Ropsten Test Network", no canto superior direito (para não precisar lidar com dinheiro de verdade\). ### Etapa: Adicionar Faucet ether {#add-ether-from-faucet} @@ -260,7 +260,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -370,7 +370,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -434,7 +434,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/ro/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/ro/developers/tutorials/hello-world-smart-contract/index.md index 2019d7b0cc9..fae17c28475 100644 --- a/public/content/translations/ro/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/ro/developers/tutorials/hello-world-smart-contract/index.md @@ -42,7 +42,7 @@ Odată ce v-ați creat un cont Alchemy, puteți să generați o cheie API creân Avem nevoie de un cont Ethereum pentru a trimite și primi tranzacții. În acest tutorial, vom folosi un portofel virtual în browser, MetaMask, pentru a gestiona adresa contului Ethereum. Aflați mai multe despre [tranzacții](/developers/docs/transactions/). -Puteți descărca și crea un cont MetaMask gratuit [aici](https://metamask.io/download.html). Atunci când vă creați un cont sau dacă aveți deja unul, aveţi grijă să comutaţi pe Ropsten Test Network” („Rețeaua de testare Ropsten”) în dreapta sus (pentru a nu avea de-a face cu bani reali). +Puteți descărca și crea un cont MetaMask gratuit [aici](https://metamask.io/download). Atunci când vă creați un cont sau dacă aveți deja unul, aveţi grijă să comutaţi pe Ropsten Test Network” („Rețeaua de testare Ropsten”) în dreapta sus (pentru a nu avea de-a face cu bani reali). ![exemplu metamask ropsten](./metamask-ropsten-example.png) diff --git a/public/content/translations/ro/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/ro/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index 023a4fb55d8..a0d6c0d2d87 100644 --- a/public/content/translations/ro/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/ro/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -47,7 +47,7 @@ Odată ce v-ați creat un cont Alchemy, puteți să generați o cheie API creân Avem nevoie de un cont Ethereum pentru a trimite și primi tranzacții. În acest tutorial vom folosi un portofel virtual în browser, MetaMask, pentru a gestiona adresa contului Ethereum. Dacă doriți să înțelegeți mai multe despre cum funcționează tranzacțiile pe Ethereum, consultaţi [această pagină](/developers/docs/transactions/) de la fundația Ethereum. -Puteți descărca și crea un cont MetaMask pe gratis [aici](https://metamask.io/download.html). Atunci când vă creați un cont sau dacă aveți deja unul, aveţi grijă să comutaţi pe „Ropsten Test Network” („Rețeaua de testare Ropsten”) în dreapta sus (pentru a nu avea de-a face cu bani reali). +Puteți descărca și crea un cont MetaMask pe gratis [aici](https://metamask.io/download). Atunci când vă creați un cont sau dacă aveți deja unul, aveţi grijă să comutaţi pe „Ropsten Test Network” („Rețeaua de testare Ropsten”) în dreapta sus (pentru a nu avea de-a face cu bani reali). ![Setați Ropsten ca rețeaua dvs.](./metamask-goerli.png) diff --git a/public/content/translations/ro/developers/tutorials/nft-minter/index.md b/public/content/translations/ro/developers/tutorials/nft-minter/index.md index feb774ada97..496141a493d 100644 --- a/public/content/translations/ro/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/ro/developers/tutorials/nft-minter/index.md @@ -206,7 +206,7 @@ For users to be able to interact with your smart contract they will need to conn În acest tutorial vom folosi un portofel virtual în browser, MetaMask, pentru a gestiona adresa contului Ethereum. If you want to understand more about how transactions on Ethereum work, check out [this page](/developers/docs/transactions/). -Puteți descărca și crea un cont MetaMask pe gratis [aici](https://metamask.io/download.html). When you are creating an account, or if you already have an account, make sure to switch over to the “Ropsten Test Network” in the upper right \(so that we’re not dealing with real money\). +Puteți descărca și crea un cont MetaMask pe gratis [aici](https://metamask.io/download). When you are creating an account, or if you already have an account, make sure to switch over to the “Ropsten Test Network” in the upper right \(so that we’re not dealing with real money\). ### Add ether from a Faucet {#add-ether-from-faucet} @@ -263,7 +263,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -373,7 +373,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -437,7 +437,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/tr/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/tr/developers/tutorials/hello-world-smart-contract-fullstack/index.md index ce5420f55eb..79427647d22 100644 --- a/public/content/translations/tr/developers/tutorials/hello-world-smart-contract-fullstack/index.md +++ b/public/content/translations/tr/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -48,7 +48,7 @@ _Not: **Goerli**'yi seçmezseniz bu öğretici çalışmaz._ İşlem göndermek ve almak için bir Ethereum hesabına ihtiyacınız vardır. Kullanıcıların Ethereum hesap adreslerini yönetmelerini sağlayan bir sanal tarayıcı cüzdanı olan MetaMask'i kullanacağız. -[Buradan](https://metamask.io/download.html) ücretsiz olarak bir MetaMask hesabı indirebilir ve oluşturabilirsiniz. Bir hesap oluştururken ya da zaten bir hesabınız varsa, sağ üstten "Goerli Test Ağına" geçin (bu sayede gerçek parayla denemeler yapmayız). +[Buradan](https://metamask.io/download) ücretsiz olarak bir MetaMask hesabı indirebilir ve oluşturabilirsiniz. Bir hesap oluştururken ya da zaten bir hesabınız varsa, sağ üstten "Goerli Test Ağına" geçin (bu sayede gerçek parayla denemeler yapmayız). ### Adım 4: Bir Musluktan ether ekleyin {#step-4-add-ether-from-a-faucet} @@ -1116,7 +1116,7 @@ Ethereum'daki işlemlerin nasıl çalıştığı hakkında daha fazla bilgi edin #### MetaMask'i indirin {#download-metamask} -[Buradan](https://metamask.io/download.html) ücretsiz olarak bir MetaMask hesabı indirebilir ve oluşturabilirsiniz. Bir hesap oluştururken ya da zaten bir hesabınız varsa, sağ üstten "Goerli Test Ağına" geçin \(bu sayede gerçek parayla denemeler yapmayız\). +[Buradan](https://metamask.io/download) ücretsiz olarak bir MetaMask hesabı indirebilir ve oluşturabilirsiniz. Bir hesap oluştururken ya da zaten bir hesabınız varsa, sağ üstten "Goerli Test Ağına" geçin \(bu sayede gerçek parayla denemeler yapmayız\). #### Bir Musluktan ether ekleyin {#add-ether-from-a-faucet} @@ -1171,7 +1171,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1267,7 +1267,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1329,7 +1329,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/tr/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/tr/developers/tutorials/hello-world-smart-contract/index.md index 6932fb31e8a..0a372e00566 100644 --- a/public/content/translations/tr/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/tr/developers/tutorials/hello-world-smart-contract/index.md @@ -49,7 +49,7 @@ Bir Alchemy hesabı oluşturduktan sonra, bir uygulama yaratarak bir API anahtar İşlem göndermek ve almak için bir Ethereum hesabına ihtiyacımız var. Bu eğitim için, Ethereum hesap adresinizi yönetmek için kullanılan tarayıcı üstü bir sanal cüzdan olan MetaMask'i kullanacağız. [İşlemler](/developers/docs/transactions/) üzerine dahası. -[Buradan](https://metamask.io/download.html) ücretsiz olarak indirebilir ve bir Metamask hesabı oluşturabilirsiniz. Bir hesap oluştururken ya da zaten bir hesabınız varsa, sağ üstten "Goerli Test Ağına" geçin (bu sayede gerçek parayla denemeler yapmayız). +[Buradan](https://metamask.io/download) ücretsiz olarak indirebilir ve bir Metamask hesabı oluşturabilirsiniz. Bir hesap oluştururken ya da zaten bir hesabınız varsa, sağ üstten "Goerli Test Ağına" geçin (bu sayede gerçek parayla denemeler yapmayız). ![metamask ropsten örneği](./metamask-ropsten-example.png) diff --git a/public/content/translations/tr/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/tr/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index bc288a45700..a1942eb1fea 100644 --- a/public/content/translations/tr/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/tr/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -46,7 +46,7 @@ Bir Alchemy hesabı oluşturduktan sonra, bir uygulama oluşturarak bir API anah İşlem göndermek ve almak için bir Ethereum hesabına ihtiyacımız var. Bu eğitim için, Ethereum hesap adresinizi yönetmek için kullanılan tarayıcı üstü bir sanal cüzdan olan MetaMask'i kullanacağız. Ethereum'daki işlemlerin nasıl çalıştığı hakkında daha fazla bilgi edinmek istiyorsanız, Ethereum Vakfı'nın [bu sayfasına](/developers/docs/transactions/) göz atın. -[Buradan](https://metamask.io/download.html) ücretsiz olarak bir MetaMask hesabı indirebilir ve oluşturabilirsiniz. Bir hesap oluştururken, ya da bir hesabınız çoktan varsa, sağ üstten Sepolia Test Ağına geçtiğinizden emin olun (bu sayede gerçek parayla denemeler yapmayız). +[Buradan](https://metamask.io/download) ücretsiz olarak bir MetaMask hesabı indirebilir ve oluşturabilirsiniz. Bir hesap oluştururken, ya da bir hesabınız çoktan varsa, sağ üstten Sepolia Test Ağına geçtiğinizden emin olun (bu sayede gerçek parayla denemeler yapmayız). ![Sepolia'yı ağınız olarak ayarlayın](./metamask-goerli.png) diff --git a/public/content/translations/tr/developers/tutorials/nft-minter/index.md b/public/content/translations/tr/developers/tutorials/nft-minter/index.md index 456d50f2be3..c433e9cfefa 100644 --- a/public/content/translations/tr/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/tr/developers/tutorials/nft-minter/index.md @@ -203,7 +203,7 @@ Kullanıcıların akıllı sözleşmenizle etkileşime girebilmeleri için Ether Bu öğretici için, Ethereum hesap adresinizi yönetmek için kullanılan tarayıcıda sanal bir cüzdan olan MetaMask'ı kullanacağız. Ethereum'daki işlemlerin nasıl çalıştığı hakkında daha fazla bilgi edinmek istiyorsanız, [bu sayfaya](/developers/docs/transactions/) bakın. -[Buradan](https://metamask.io/download.html) ücretsiz olarak bir MetaMask hesabı indirebilir ve oluşturabilirsiniz. Bir hesap oluşturuyorsanız veya zaten bir hesabınız varsa, sağ üstteki "Ropsten Test Ağı"na geçtiğinizden emin olun \(böylece gerçek parayla uğraşmayız\). +[Buradan](https://metamask.io/download) ücretsiz olarak bir MetaMask hesabı indirebilir ve oluşturabilirsiniz. Bir hesap oluşturuyorsanız veya zaten bir hesabınız varsa, sağ üstteki "Ropsten Test Ağı"na geçtiğinizden emin olun \(böylece gerçek parayla uğraşmayız\). ### Bir Musluktan ether ekleyin {#add-ether-from-faucet} @@ -260,7 +260,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -370,7 +370,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -434,7 +434,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/zh/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/zh/developers/tutorials/hello-world-smart-contract-fullstack/index.md index 7000bbe9926..e558642127d 100644 --- a/public/content/translations/zh/developers/tutorials/hello-world-smart-contract-fullstack/index.md +++ b/public/content/translations/zh/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -48,7 +48,7 @@ _注:请确保选择 **Goerli**,否则本教程将不适用。_ 你需要一个以太坊帐户来发送和接受交易。 我们将会使用 MetaMask,这是一个浏览器中的虚拟钱包,可供用户管理他们的以太坊帐户地址。 -你可以[在这里](https://metamask.io/download.html)免费下载并创建一个 MetaMask 帐户。 When you are creating an account, or if you already have an account, make sure to switch over to the “Goerli Test Network” in the upper right (so that we’re not dealing with real money). +你可以[在这里](https://metamask.io/download)免费下载并创建一个 MetaMask 帐户。 When you are creating an account, or if you already have an account, make sure to switch over to the “Goerli Test Network” in the upper right (so that we’re not dealing with real money). ### 步骤 4:从水龙头添加以太币 {#step-4-add-ether-from-a-faucet} @@ -1116,7 +1116,7 @@ useEffect(async () => { #### 下载 MetaMask {#download-metamask} -你可以[在这里](https://metamask.io/download.html)免费下载并创建一个 MetaMask 帐户。 在你创建帐户时,或者如果你已经有帐户,请确保切换到右上角的“Goerli 测试网络”(这样我们就不会使用实际货币进行交易)。 +你可以[在这里](https://metamask.io/download)免费下载并创建一个 MetaMask 帐户。 在你创建帐户时,或者如果你已经有帐户,请确保切换到右上角的“Goerli 测试网络”(这样我们就不会使用实际货币进行交易)。 #### 通过水龙头中添加以太币 {#add-ether-from-a-faucet} @@ -1171,7 +1171,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1267,7 +1267,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -1329,7 +1329,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

diff --git a/public/content/translations/zh/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/zh/developers/tutorials/hello-world-smart-contract/index.md index 843258e9e9d..4be05754cde 100644 --- a/public/content/translations/zh/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/zh/developers/tutorials/hello-world-smart-contract/index.md @@ -42,7 +42,7 @@ published: 2021-03-31 我们需要一个以太坊帐户来发送和接收交易。 在本教程中,我们将使用 MetaMask,它是浏览器中的虚拟钱包,用来管理您的以太坊账户地址。 关于[交易](/developers/docs/transactions/)的详细信息。 -您可以点击[此处](https://metamask.io/download.html)免费下载并创建一个 MetaMask 账户。 创建账户时,或者如果您已经有一个账户时,确保切换到右上方的“Ropsten 测试网络”(这样我们就不会用实际货币进行交易)。 +您可以点击[此处](https://metamask.io/download)免费下载并创建一个 MetaMask 账户。 创建账户时,或者如果您已经有一个账户时,确保切换到右上方的“Ropsten 测试网络”(这样我们就不会用实际货币进行交易)。 ![metask ropsten 示例](./metamask-ropsten-example.png) diff --git a/public/content/translations/zh/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/zh/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index 1f4d1b87f55..14182373791 100644 --- a/public/content/translations/zh/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/zh/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -46,7 +46,7 @@ Alchemy 非常自豪能够推动非同质化代币领域的一些巨头,包括 我们需要一个以太坊帐户来发送和接收交易。 在本教程中,我们将使用 MetaMask——浏览器中的虚拟钱包,用来管理你的以太坊帐户地址。 如果你想了解更多关于以太坊交易的运作方式,请查看以太坊基金会的[这个页面](/developers/docs/transactions/)。 -你可以[在这里](https://metamask.io/download.html)免费下载并创建一个 MetaMask 帐户。 在你创建帐户时,或者如果你已有一个帐户,请确保切换到右上角的“Sepolia Test Network”(这样我们就不会使用实际货币进行交易)。 +你可以[在这里](https://metamask.io/download)免费下载并创建一个 MetaMask 帐户。 在你创建帐户时,或者如果你已有一个帐户,请确保切换到右上角的“Sepolia Test Network”(这样我们就不会使用实际货币进行交易)。 ![将 Sepolia 设置为你的网络](./metamask-goerli.png) @@ -87,7 +87,7 @@ Alchemy 非常自豪能够推动非同质化代币领域的一些巨头,包括 author: license: (ISC) About to write to /Users/thesuperb1/Desktop/my-nft/package.json: - + { "name": "my-nft", "version": "1.0.0", diff --git a/public/content/translations/zh/developers/tutorials/nft-minter/index.md b/public/content/translations/zh/developers/tutorials/nft-minter/index.md index ccba1ffd2ba..a0712ee6981 100644 --- a/public/content/translations/zh/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/zh/developers/tutorials/nft-minter/index.md @@ -206,7 +206,7 @@ return ( 在本教程中,我们将使用 MetaMask,它是浏览器中的虚拟钱包,用来管理您的以太坊账户地址。 如果您想了解更多关于以太坊交易如何运作的信息,请参阅[此页面](/developers/docs/transactions/)。 -您可以点击[此处](https://metamask.io/download.html)免费下载并创建一个 MetaMask 账户。 在创建账户时,或者如果您已经有一个账户,确保切换到右上角的“Ropsten 测试网络”\(这样我们就不会交易真正的钱币\)。 +您可以点击[此处](https://metamask.io/download)免费下载并创建一个 MetaMask 账户。 在创建账户时,或者如果您已经有一个账户,确保切换到右上角的“Ropsten 测试网络”\(这样我们就不会交易真正的钱币\)。 ### 通过水龙头中添加以太币 {#add-ether-from-faucet} @@ -263,7 +263,7 @@ export const connectWallet = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -373,7 +373,7 @@ export const getCurrentWalletConnected = async () => {

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser. @@ -437,7 +437,7 @@ function addWalletListener() { setStatus(

{" "} - 🦊 + 🦊 You must install MetaMask, a virtual Ethereum wallet, in your browser.

From d648220fda0697e269c18e3fa2bfe8f229447191 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 19:18:22 -0500 Subject: [PATCH 029/368] change https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6 to https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41 --- public/content/translations/id/community/grants/index.md | 2 +- public/content/translations/nl/community/grants/index.md | 2 +- public/content/translations/ro/community/grants/index.md | 2 +- public/content/translations/sl/community/grants/index.md | 2 +- public/content/translations/sw/community/grants/index.md | 2 +- public/content/translations/uk/community/grants/index.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/content/translations/id/community/grants/index.md b/public/content/translations/id/community/grants/index.md index 623e02096bc..8f5bff3e4c7 100644 --- a/public/content/translations/id/community/grants/index.md +++ b/public/content/translations/id/community/grants/index.md @@ -26,7 +26,7 @@ Proyek-proyek ini telah menciptakan hibah sendiri untuk proyek-proyek yang bertu - [TheGraph](https://airtable.com/shrdfvnFvVch3IOVm) – _ekosistem [The Graph](https://thegraph.com/)_ - [Program Hibah Uniswap](https://www.uniswapfoundation.org/) – _komunitas [Uniswap](https://uniswap.org/)_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _Dana Ekosistem [Balancer](https://balancer.fi/)_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _Dana Ekosistem [Balancer](https://balancer.fi/)_ - [mStable](https://docs.mstable.org/advanced/grants-program) - _[komunitas](https://mstable.org/) mStable_ ## Pendanaan kuadrat {#quadratic-funding} diff --git a/public/content/translations/nl/community/grants/index.md b/public/content/translations/nl/community/grants/index.md index 4f193839b56..77402a093f6 100644 --- a/public/content/translations/nl/community/grants/index.md +++ b/public/content/translations/nl/community/grants/index.md @@ -26,7 +26,7 @@ Deze programma's ondersteunen het brede Ethereum-ecosysteem door subsidies aan t Deze projecten hebben hun eigen beurzen gecreëerd voor projecten die gericht zijn op de ontwikkeling en het experimenteren met hun eigen technologie. - [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) Grants DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/)-ecosysteemfonds_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/)-ecosysteemfonds_ - [Chainlink Grants Program](https://chain.link/community/grants) - _[Chainlink](https://chain.link/)-gemeenschapssubsidies_ - [Compound Grants Program](https://compoundgrants.questbook.app/) – _[Compound](https://compound.finance/)-financieringsecosysteem_ - [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/)-financieringsecosysteem_ diff --git a/public/content/translations/ro/community/grants/index.md b/public/content/translations/ro/community/grants/index.md index 9da76f7a7af..bc8a03f9e7f 100644 --- a/public/content/translations/ro/community/grants/index.md +++ b/public/content/translations/ro/community/grants/index.md @@ -27,8 +27,8 @@ Aceste programe sprijină ecosistemul Ethereum extins oferind granturi pentru o Aceste proiecte și-au creat propriile granturi pentru proiecte care vizează dezvoltarea și experimentarea propriei tehnologii. - [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) grants DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) ecosystem fund_ - [Compound Grants Program](https://compoundgrants.questbook.app/) – _[Compound](https://compound.finance/) finance ecosystem_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/) ecosystem fund_ - [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) finance ecosystem_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ - [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) community_ diff --git a/public/content/translations/sl/community/grants/index.md b/public/content/translations/sl/community/grants/index.md index c1b5c3680f2..2c050634230 100644 --- a/public/content/translations/sl/community/grants/index.md +++ b/public/content/translations/sl/community/grants/index.md @@ -25,7 +25,7 @@ Te projekti so ustvarili svoje finančne spodbude za projekte, ki merijo proti r - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/) ekosistem_ - [Uniswap](https://www.uniswapfoundation.org/) – _[Uniswap](https://uniswap.org/) skupnost_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) sklad ekosistema_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/) sklad ekosistema_ - [mStable](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) skupnost_ ## Kvadratično financiranje {#quadratic-funding} diff --git a/public/content/translations/sw/community/grants/index.md b/public/content/translations/sw/community/grants/index.md index 603333ab80b..c02db101f42 100644 --- a/public/content/translations/sw/community/grants/index.md +++ b/public/content/translations/sw/community/grants/index.md @@ -25,8 +25,8 @@ Programu hizi zinasaidia ikolojia ya Ethereum kwa kutoa fedha kwa miradi mingi. Miradi hii imeunda misaada yao kwa miradi inayolenga kukuza na kujaribu teknolojia yao wenyewe. - [Mpango wa Ruzuku wa Aave](https://aavegrants.org/) - _[Aave](https://aave.com/) hutoa ruzuku za DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) - _fedha za ikolojia ya [Balancer](https://balancer.fi/)_ - [Mpango wa Ruzuku za Compound](https://compoundgrants.questbook.app/) - _[Compaound](https://compound.finance/) hugharamia ikolojia_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) - _fedha za ikolojia ya [Balancer](https://balancer.fi/)_ - [Mpango wa Ruzuku wa Consensys](https://consensys.net/grants/) - _[Consensys](https://consensys.net/) fedha za minyororo ya blocku & ruzuku za Ethereum_ - [Shirika la Ruzuku ya Ikolojia ya Lido (LEGO)](https://lego.lido.fi/) - _hugharamia ikolojia ya [Lido](https://lido.fi/)_ - [Programu ya Ruzuku ya mStable](https://docs.mstable.org/advanced/grants-program) - _jamii ya [mStablei](https://mstable.org/)_ diff --git a/public/content/translations/uk/community/grants/index.md b/public/content/translations/uk/community/grants/index.md index 9e7020ebb93..e0a6e9c569f 100644 --- a/public/content/translations/uk/community/grants/index.md +++ b/public/content/translations/uk/community/grants/index.md @@ -26,7 +26,7 @@ lang: uk У межах цих проєктів створено власні гранти, спрямовані на розробку й тестування власних технологій. - [Програма грантів Aave](https://aavegrants.org/) — _гранти DAO від [Aave](https://aave.com/)_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) — _фонд екосистеми [Balancer](https://balancer.fi/)_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) — _фонд екосистеми [Balancer](https://balancer.fi/)_ - [Програма грантів Chainlink](https://chain.link/community/grants) — _гранти спільноти [Chainlink](https://chain.link/)_ - [Програма грантів Compound](https://compoundgrants.questbook.app/) — _фінансова екосистема [Compound](https://compound.finance/)_ - [Програма грантів Decentraland](https://governance.decentraland.org/grants/) — _[децентралізація](https://decentraland.org/) DAO Metaverse_ From ea30ab82c74ccacbd3746f330dc43529f90296d7 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 19:19:14 -0500 Subject: [PATCH 030/368] looks like a stagaling file snuck through other commits --- public/content/translations/ca/community/grants/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ca/community/grants/index.md b/public/content/translations/ca/community/grants/index.md index 8a320f26eec..372dff87bc8 100644 --- a/public/content/translations/ca/community/grants/index.md +++ b/public/content/translations/ca/community/grants/index.md @@ -27,7 +27,7 @@ Aquests programes donen suport a l'ample ecosistema Ethereum oferint subvencions Aquests projectes han creat les seves pròpies subvencions per projectes enfocades al desenvolupament i la experimentació amb les seves pròpies tecnologies. - [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) grants DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) ecosystem fund_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/) ecosystem fund_ - [Compound Grants Program](https://compoundgrants.questbook.app/) – _[Compound](https://compound.finance/) finance ecosystem_ - [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) finance ecosystem_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ From 258353398083bcc9d23f1d17f3749ab25d51bb9e Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 20:10:59 -0500 Subject: [PATCH 031/368] change https://chainsafe.github.io/lodestar/usage/local/ to https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet --- public/content/developers/docs/development-networks/index.md | 2 +- .../de/developers/docs/development-networks/index.md | 2 +- .../el/developers/docs/development-networks/index.md | 2 +- .../es/developers/docs/development-networks/index.md | 2 +- .../fr/developers/docs/development-networks/index.md | 2 +- .../hu/developers/docs/development-networks/index.md | 2 +- .../it/developers/docs/development-networks/index.md | 2 +- .../ja/developers/docs/development-networks/index.md | 2 +- .../pt-br/developers/docs/development-networks/index.md | 2 +- .../tr/developers/docs/development-networks/index.md | 2 +- .../zh-tw/developers/docs/development-networks/index.md | 2 +- .../zh/developers/docs/development-networks/index.md | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/content/developers/docs/development-networks/index.md b/public/content/developers/docs/development-networks/index.md index 73e7cad8d4e..ff348bed691 100644 --- a/public/content/developers/docs/development-networks/index.md +++ b/public/content/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ Hardhat Network comes built-in with Hardhat, an Ethereum development environment Some consensus clients have built-in tools for spinning up local beacon chains for testing purposes. Instructions for Lighthouse, Nimbus and Lodestar are available: -- [Local testnet using Lodestar](https://chainsafe.github.io/lodestar/usage/local/) +- [Local testnet using Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Local testnet using Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Local testnet using Nimbus](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/de/developers/docs/development-networks/index.md b/public/content/translations/de/developers/docs/development-networks/index.md index ee860d69acf..a7a46b7aacb 100644 --- a/public/content/translations/de/developers/docs/development-networks/index.md +++ b/public/content/translations/de/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ Hardhat Network beinhaltet Hardhat, eine Ethereum-Entwicklungsumgebung für Prof Einige Konsensclients verfügen über integrierte Tools, um lokale Beacon Chains zu Testzwecken zu erstellen. Anleitungen für Lighthouse, Nimbus und Lodestar sind verfügbar: -- [Lokales Testnetz unter Verwendung von Lodestar](https://chainsafe.github.io/lodestar/usage/local/) +- [Lokales Testnetz unter Verwendung von Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Lokales Testnetz unter Verwendung von Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Lokales Testnetz unter Verwendung von Nimbus](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/el/developers/docs/development-networks/index.md b/public/content/translations/el/developers/docs/development-networks/index.md index e8349ee860d..3ce28321651 100644 --- a/public/content/translations/el/developers/docs/development-networks/index.md +++ b/public/content/translations/el/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ _θα μπορούσατε_ [να εκτελέσετε έναν κόμβο](/dev Ορισμένοι πελάτες συναίνεσης διαθέτουν ενσωματωμένα εργαλεία για την περιστροφή τοπικών αλυσίδων beacon για δοκιμαστικούς σκοπούς. Οδηγίες για Lighthouse, Nimbus και Lodestar είναι διαθέσιμες: -- [Τοπικό δίκτυο δοκιμών χρησιμοποιώντας Lodestar](https://chainsafe.github.io/lodestar/usage/local/) +- [Τοπικό δίκτυο δοκιμών χρησιμοποιώντας Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Τοπικό δίκτυο δοκιμών χρησιμοποιώντας το Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Τοπικό δίκτυο δοκιμών χρησιμοποιώντας Nimbus](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/es/developers/docs/development-networks/index.md b/public/content/translations/es/developers/docs/development-networks/index.md index 45659958ba1..11a543064af 100644 --- a/public/content/translations/es/developers/docs/development-networks/index.md +++ b/public/content/translations/es/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ La red de tipo Hardhat viene integrada con Hardhat, que es un entorno de desarro Algunos clientes de consenso tienen herramientas integradas para implementar cadenas de baliza locales con fines de prueba. Las instrucciones para Lighthouse, Nimbus y Lodestar están disponibles: -- [Red de prueba local con Lodestar](https://chainsafe.github.io/lodestar/usage/local/) +- [Red de prueba local con Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Red de prueba local con Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Red de prueba local con Nimbus](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/fr/developers/docs/development-networks/index.md b/public/content/translations/fr/developers/docs/development-networks/index.md index df28c65f26f..7301b983733 100644 --- a/public/content/translations/fr/developers/docs/development-networks/index.md +++ b/public/content/translations/fr/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ Le réseau Hardhat est intégré avec Hardhat, un environnement de développemen Certains clients de consensus disposent d'outils intégrés pour faire tourner les chaînes phares locales à des fins de test. Les instructions pour Lighthouse, Nimbus et Lodestar sont disponibles ici : -- [Réseau de test local utilisant Lodestar](https://chainsafe.github.io/lodestar/usage/local/) +- [Réseau de test local utilisant Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Réseau de test local utilisant Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Réseau de test local utilisant Nimbus](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/hu/developers/docs/development-networks/index.md b/public/content/translations/hu/developers/docs/development-networks/index.md index 7a9fa7487e3..63932f804ee 100644 --- a/public/content/translations/hu/developers/docs/development-networks/index.md +++ b/public/content/translations/hu/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ A Hardhat Network a beépített Hardhat-tel jön, ami egy Ethereum fejlesztői k Néhány konszenzusos kliens rendelkezik olyan beépített eszközökkel, amellyel fel lehet állítani helyi Beacon láncokat a teszteléshez. Elérhető instrukciók a Lighthouse, Nimbus és Lodestar kliensekhez: -- [Helyi teszthálózat a Lodestarhoz](https://chainsafe.github.io/lodestar/usage/local/) +- [Helyi teszthálózat a Lodestarhoz](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Helyi teszthálózat a Lighthouse-hoz](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Helyi teszthálózat a Nimbushoz](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/it/developers/docs/development-networks/index.md b/public/content/translations/it/developers/docs/development-networks/index.md index 048445d02f4..d5a5afe6789 100644 --- a/public/content/translations/it/developers/docs/development-networks/index.md +++ b/public/content/translations/it/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ La rete Hardhat è incorporata in Hardhat, un ambiente di sviluppo Ethereum prof Alcuni client del consenso sono dotati di strumenti integrati per avviare Beacon Chain locali per scopi di test. Sono disponibili le istruzioni per Lighthouse, Nimbus e Lodestar: -- [Testnet locale usando Lodestar](https://chainsafe.github.io/lodestar/usage/local/) +- [Testnet locale usando Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Testnet locale usando Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Testnet locale usando Nimbus](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/ja/developers/docs/development-networks/index.md b/public/content/translations/ja/developers/docs/development-networks/index.md index cc77c909598..dd02903631d 100644 --- a/public/content/translations/ja/developers/docs/development-networks/index.md +++ b/public/content/translations/ja/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ Hardhat Networkには、プロフェッショナルのためのイーサリア 一部のコンセンサスクライアントには、テスト用にローカルビーコンチェーンをスピンアップするためのツールが組み込まれています。 Lighthouse、Nimbus、Lodestarでの手順は、以下で確認できます。 -- [Lodestarを使用したローカルテストネット](https://chainsafe.github.io/lodestar/usage/local/) +- [Lodestarを使用したローカルテストネット](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Lighthouseを使用したローカルテストネット](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Nimbusを使用したローカルテストネット](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/pt-br/developers/docs/development-networks/index.md b/public/content/translations/pt-br/developers/docs/development-networks/index.md index a2e043d6dfd..71d45fd986f 100644 --- a/public/content/translations/pt-br/developers/docs/development-networks/index.md +++ b/public/content/translations/pt-br/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ A rede Hardhat vem integrada com Hardhat, um ambiente de desenvolvimento para pr Alguns clientes de consenso têm ferramentas integradas para ativar as cadeias Beacon locais para fins de teste. Instruções para Lighthouse, Nimbus e Lodestar estão disponíveis: -- [Testnet local usando Lodestar](https://chainsafe.github.io/lodestar/usage/local/) +- [Testnet local usando Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Testnet local usando Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Testnet local usando Nimbus](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/tr/developers/docs/development-networks/index.md b/public/content/translations/tr/developers/docs/development-networks/index.md index 7727546945d..2a501963b71 100644 --- a/public/content/translations/tr/developers/docs/development-networks/index.md +++ b/public/content/translations/tr/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ Hardhat Network, profesyoneller için bir Ethereum geliştirme ortamı olan Hard Bazı fikir birliği istemcileri, test amacıyla yerel işaret zincirleri oluşturmak için yerleşik araçlara sahiptir. Lighthouse, Nimbus ve Lodestar için talimatlar mevcuttur: -- [Lodestar kullanan yerel test ağı](https://chainsafe.github.io/lodestar/usage/local/) +- [Lodestar kullanan yerel test ağı](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [Lighthouse kullanan yerel test ağı](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [Nimbus kullanan yerel test ağı](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/zh-tw/developers/docs/development-networks/index.md b/public/content/translations/zh-tw/developers/docs/development-networks/index.md index bd407faf2c9..5aad411acfe 100644 --- a/public/content/translations/zh-tw/developers/docs/development-networks/index.md +++ b/public/content/translations/zh-tw/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ Hardhat 網路內建了 Hardhat,這是一個專業以太坊開發環境。 一些共識用戶端具有內建工具,用於啟動本地信標鏈以進行測試。 Lighthouse、Nimbus 和 Lodestar 的說明如下: -- [使用 Lodestar 的本地測試網](https://chainsafe.github.io/lodestar/usage/local/) +- [使用 Lodestar 的本地測試網](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [使用 Lighthouse 的本地測試網](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [使用 Nimbus 的本地測試網](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) diff --git a/public/content/translations/zh/developers/docs/development-networks/index.md b/public/content/translations/zh/developers/docs/development-networks/index.md index 7aff7aa181a..0cd9759af8c 100644 --- a/public/content/translations/zh/developers/docs/development-networks/index.md +++ b/public/content/translations/zh/developers/docs/development-networks/index.md @@ -41,7 +41,7 @@ lang: zh 一些共识客户端具有内置工具,用于启动本地信标链以进行测试。 提供了 Lighthouse、Nimbus 和 Lodestar 的说明: -- [使用 Lodestar 的本地测试网](https://chainsafe.github.io/lodestar/usage/local/) +- [使用 Lodestar 的本地测试网](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) - [使用 Lightthouse 的本地测试网](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) - [使用 Nimbus 的本地测试网](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) From 5384b843b5f65eb7acac7119cb01b718e841b2c5 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 19:27:55 -0500 Subject: [PATCH 032/368] changing https://thegraph.com/docs/en/about/network/ to https://thegraph.com/docs/en/about/ - they removed the section that was linked https://web.archive.org/web/20220516092946/https://thegraph.com/docs/en/about/network/ --- public/content/developers/docs/data-and-analytics/index.md | 4 ++-- .../de/developers/docs/data-and-analytics/index.md | 2 +- .../el/developers/docs/data-and-analytics/index.md | 2 +- .../es/developers/docs/data-and-analytics/index.md | 2 +- .../fr/developers/docs/data-and-analytics/index.md | 2 +- .../hu/developers/docs/data-and-analytics/index.md | 2 +- .../it/developers/docs/data-and-analytics/index.md | 2 +- .../ja/developers/docs/data-and-analytics/index.md | 2 +- .../pt-br/developers/docs/data-and-analytics/index.md | 2 +- .../ro/developers/docs/data-and-analytics/index.md | 2 +- .../tr/developers/docs/data-and-analytics/index.md | 2 +- .../zh-tw/developers/docs/data-and-analytics/index.md | 2 +- .../zh/developers/docs/data-and-analytics/index.md | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/content/developers/docs/data-and-analytics/index.md b/public/content/developers/docs/data-and-analytics/index.md index c2de60c04df..1465fbbddd5 100644 --- a/public/content/developers/docs/data-and-analytics/index.md +++ b/public/content/developers/docs/data-and-analytics/index.md @@ -43,11 +43,11 @@ Using [GraphQL](https://graphql.org/), developers can query any of the curated o To start, visit the [Ethereum quick start guide](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html) to start indexing Ethereum blockchain data in minutes in a local Docker environment for testing before going live on a [SubQuery's managed service](https://managedservice.subquery.network/) or on [SubQuery's decentralised network](https://app.subquery.network/dashboard). ## Ethernow - Mempool Data Program {#ethernow} -[Blocknative](https://www.blocknative.com/) provides open access to its Ethereum historical [mempool data archive](https://www.ethernow.xyz/mempool-data-archive). This enables researchers and community good projects to explore the pre-chain layer of Ethereum Mainnet. The data set is actively maintained and represents the most comprehensive historical record of mempool transaction events within the Ethereum ecosystem. Learn more at [Ethernow](https://www.ethernow.xyz/). +[Blocknative](https://www.blocknative.com/) provides open access to its Ethereum historical [mempool data archive](https://www.ethernow.xyz/mempool-data-archive). This enables researchers and community good projects to explore the pre-chain layer of Ethereum Mainnet. The data set is actively maintained and represents the most comprehensive historical record of mempool transaction events within the Ethereum ecosystem. Learn more at [Ethernow](https://www.ethernow.xyz/). ## Further Reading {#further-reading} -- [Graph Network Overview](https://thegraph.com/docs/en/about/network/) +- [Graph Network Overview](https://thegraph.com/docs/en/about//) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [API code examples on EtherScan](https://etherscan.io/apis#contracts) - [Beaconcha.in Beacon Chain explorer](https://beaconcha.in) diff --git a/public/content/translations/de/developers/docs/data-and-analytics/index.md b/public/content/translations/de/developers/docs/data-and-analytics/index.md index 1fcf4ad194e..67c4a413f4b 100644 --- a/public/content/translations/de/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/de/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Um loszulegen, sehen Sie sich die [Ethereum-Schnellstartanleitung](https://acade ## Weiterführende Informationen {#further-reading} -- [Graph Network-Übersicht](https://thegraph.com/docs/en/about/network/) +- [Graph Network-Übersicht](https://thegraph.com/docs/en/about//) - [Graph-Abfrageplatz](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [API-Code-Beispiele auf EtherScan](https://etherscan.io/apis#contracts) - [Beaconcha.in Beacon Chain Explorer](https://beaconcha.in) diff --git a/public/content/translations/el/developers/docs/data-and-analytics/index.md b/public/content/translations/el/developers/docs/data-and-analytics/index.md index 12b8b28a6f6..c6256db2735 100644 --- a/public/content/translations/el/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/el/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ lang: el ## Περισσότερες πληροφορίες {#further-reading} -- [Επισκόπηση του Δικτύου Graph](https://thegraph.com/docs/en/about/network/) +- [Επισκόπηση του Δικτύου Graph](https://thegraph.com/docs/en/about//) - [Χώρος ανάπτυξης Graph Query](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Παραδείγματα κώδικα API στο EtherScan](https://etherscan.io/apis#contracts) - [Beaconcha.in εξερευνητής κύριας αλυσίδας](https://beaconcha.in) diff --git a/public/content/translations/es/developers/docs/data-and-analytics/index.md b/public/content/translations/es/developers/docs/data-and-analytics/index.md index f5445a1e940..b8f3c2f17ed 100644 --- a/public/content/translations/es/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/es/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Para comenzar, visite la guía de inicio rápido de [Ethereum](https://academy.s ## Más información {#further-reading} -- [Descripción general de Graph Network](https://thegraph.com/docs/en/about/network/) +- [Descripción general de Graph Network](https://thegraph.com/docs/en/about//) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Ejemplos de código API en EtherScan](https://etherscan.io/apis#contracts) - [Explorador de la cadena de Baliza Beaconcha.in](https://beaconcha.in) diff --git a/public/content/translations/fr/developers/docs/data-and-analytics/index.md b/public/content/translations/fr/developers/docs/data-and-analytics/index.md index 6025982c8a1..7f08745cf92 100644 --- a/public/content/translations/fr/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/fr/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Pour commencer, consultez le [guide de démarrage rapide Ethereum](https://acade ## Complément d'information {#further-reading} -- [Présentation du réseau Graph](https://thegraph.com/docs/en/about/network/) +- [Présentation du réseau Graph](https://thegraph.com/docs/en/about//) - [Bac à sable de requêtes Graph](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Examples de code d'APIs sur EtherScan](https://etherscan.io/apis#contracts) - [Explorateur de Beacon Chain](https://beaconcha.in) diff --git a/public/content/translations/hu/developers/docs/data-and-analytics/index.md b/public/content/translations/hu/developers/docs/data-and-analytics/index.md index c043605dfd2..56fa0916979 100644 --- a/public/content/translations/hu/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/hu/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ A [Blocknative](https://www.blocknative.com/) nyílt hozzáférést biztosít az ## További olvasnivaló {#further-reading} -- [A gráfhálózat áttekintése](https://thegraph.com/docs/en/about/network/) +- [A gráfhálózat áttekintése](https://thegraph.com/docs/en/about//) - [Gráflekérdezési próbafelület (playground)](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [API-kódpéldák az EtherScan oldalon](https://etherscan.io/apis#contracts) - [Beaconcha.in – Beaconlánc-felfedező](https://beaconcha.in) diff --git a/public/content/translations/it/developers/docs/data-and-analytics/index.md b/public/content/translations/it/developers/docs/data-and-analytics/index.md index decd6891667..285a4695fcb 100644 --- a/public/content/translations/it/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/it/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Per iniziare, visita la [guida rapida per principianti di Ethereum](https://acad ## Letture consigliate {#further-reading} -- [Panoramica della rete Graph](https://thegraph.com/docs/en/about/network/) +- [Panoramica della rete Graph](https://thegraph.com/docs/en/about//) - [GraphQL Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Esempi di codice API su EtherScan](https://etherscan.io/apis#contracts) - [Esploratore della Beacon Chain di Beaconcha.in](https://beaconcha.in) diff --git a/public/content/translations/ja/developers/docs/data-and-analytics/index.md b/public/content/translations/ja/developers/docs/data-and-analytics/index.md index c98064505a5..2d9a31a0b30 100644 --- a/public/content/translations/ja/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/ja/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ lang: ja ## 参考文献 {#further-reading} -- [Graphネットワークの概要](https://thegraph.com/docs/en/about/network/) +- [Graphネットワークの概要](https://thegraph.com/docs/en/about//) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [EtherScanのAPIコードの例](https://etherscan.io/apis#contracts) - [Beaconcha.inビーコンチェーンエクスプローラー](https://beaconcha.in) diff --git a/public/content/translations/pt-br/developers/docs/data-and-analytics/index.md b/public/content/translations/pt-br/developers/docs/data-and-analytics/index.md index d913a53e93e..4bbe7c62533 100644 --- a/public/content/translations/pt-br/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/pt-br/developers/docs/data-and-analytics/index.md @@ -38,7 +38,7 @@ O [Dune Analytics](https://dune.com/) pré-processa dados da blockchain em tabel ## Leitura Adicional {#further-reading} -- [Visão geral da rede de gráficos](https://thegraph.com/docs/en/about/network/) +- [Visão geral da rede de gráficos](https://thegraph.com/docs/en/about//) - [Área de consulta de gráficos](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Exemplos de código de API em EtherScan](https://etherscan.io/apis#contracts) - [Explorador de Beacon Chain Beaconcha.in](https://beaconcha.in) diff --git a/public/content/translations/ro/developers/docs/data-and-analytics/index.md b/public/content/translations/ro/developers/docs/data-and-analytics/index.md index 38d4889d38c..bfb88bdb54f 100644 --- a/public/content/translations/ro/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/ro/developers/docs/data-and-analytics/index.md @@ -30,6 +30,6 @@ Dezvoltatorii pot apoi procesa și transforma aceste date pentru a le oferi util ## Referințe suplimentare {#further-reading} -- [Prezentare generală Graph Network](https://thegraph.com/docs/en/about/network/) +- [Prezentare generală Graph Network](https://thegraph.com/docs/en/about//) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Exemple de cod API pe EtherScan](https://etherscan.io/apis#contracts) diff --git a/public/content/translations/tr/developers/docs/data-and-analytics/index.md b/public/content/translations/tr/developers/docs/data-and-analytics/index.md index 011f8fabb6b..35228da52e0 100644 --- a/public/content/translations/tr/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/tr/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Başlarken, Ethereum blokzinciri verilerini yerel bir Docker ortamında dakikala ## Daha Fazla Okuma {#further-reading} -- [Graph Ağına Genel Bakış](https://thegraph.com/docs/en/about/network/) +- [Graph Ağına Genel Bakış](https://thegraph.com/docs/en/about//) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [EtherScan'deki API kodu örnekleri](https://etherscan.io/apis#contracts) - [Beaconcha.in İçaret Zincir'i keşif aracı](https://beaconcha.in) diff --git a/public/content/translations/zh-tw/developers/docs/data-and-analytics/index.md b/public/content/translations/zh-tw/developers/docs/data-and-analytics/index.md index ad2ae77406e..cb9e82e49f6 100644 --- a/public/content/translations/zh-tw/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/zh-tw/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ lang: zh-tw ## 衍生閱讀 {#further-reading} -- [Graph Network 概覽](https://thegraph.com/docs/en/about/network/) +- [Graph Network 概覽](https://thegraph.com/docs/en/about//) - [Graph Query 訓練場](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [EtherScan 上的應用程式介面程式碼範例](https://etherscan.io/apis#contracts) - [Beaconcha.in 信標鏈瀏覽器](https://beaconcha.in) diff --git a/public/content/translations/zh/developers/docs/data-and-analytics/index.md b/public/content/translations/zh/developers/docs/data-and-analytics/index.md index 6dc43e2b5a3..5ae74b42d02 100644 --- a/public/content/translations/zh/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/zh/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ lang: zh ## 延伸阅读 {#further-reading} -- [Graph 网络概览](https://thegraph.com/docs/en/about/network/) +- [Graph 网络概览](https://thegraph.com/docs/en/about//) - [Graph 查询实战](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [EtherScan 上的应用程序接口代码示例](https://etherscan.io/apis#contracts) - [Beaconcha.in 信标链浏览器](https://beaconcha.in) From 1ea1faa5ee7c6f27fd5e0fcf00b4d5cf3d7cfa3f Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 19:34:35 -0500 Subject: [PATCH 033/368] changing https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist with https://zeroknowledge.fm/podcast/202/ --- public/content/roadmap/verkle-trees/index.md | 2 +- public/content/translations/cs/roadmap/verkle-trees/index.md | 2 +- public/content/translations/de/roadmap/verkle-trees/index.md | 2 +- public/content/translations/es/roadmap/verkle-trees/index.md | 2 +- public/content/translations/fa/roadmap/verkle-trees/index.md | 2 +- public/content/translations/fr/roadmap/verkle-trees/index.md | 2 +- public/content/translations/hu/roadmap/verkle-trees/index.md | 2 +- public/content/translations/id/roadmap/verkle-trees/index.md | 2 +- public/content/translations/it/roadmap/verkle-trees/index.md | 2 +- public/content/translations/ja/roadmap/verkle-trees/index.md | 2 +- public/content/translations/nl/roadmap/verkle-trees/index.md | 2 +- public/content/translations/pl/roadmap/verkle-trees/index.md | 2 +- public/content/translations/pt-br/roadmap/verkle-trees/index.md | 2 +- public/content/translations/ru/roadmap/verkle-trees/index.md | 2 +- public/content/translations/te/roadmap/verkle-trees/index.md | 2 +- public/content/translations/tr/roadmap/verkle-trees/index.md | 2 +- public/content/translations/zh-tw/roadmap/verkle-trees/index.md | 2 +- public/content/translations/zh/roadmap/verkle-trees/index.md | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/public/content/roadmap/verkle-trees/index.md b/public/content/roadmap/verkle-trees/index.md index a5a466f03a8..cfa814f03e4 100644 --- a/public/content/roadmap/verkle-trees/index.md +++ b/public/content/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Verkle tree testnets are already up and running, but there are still substantial - [Guillaume Ballet explain Verkle trees at ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - ["How Verkle trees make Ethereum lean and mean" by Guillaume Ballet at Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam on stateless clients from ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest explains Verkle trees and statelessness on Zero Knowledge podcast](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest explains Verkle trees and statelessness on Zero Knowledge podcast](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin on Verkle trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist on Verkle trees](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Verkle tree EIP documentation](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/cs/roadmap/verkle-trees/index.md b/public/content/translations/cs/roadmap/verkle-trees/index.md index 8fdccaf755a..7758181a010 100644 --- a/public/content/translations/cs/roadmap/verkle-trees/index.md +++ b/public/content/translations/cs/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Testovací sítě Verkle tree jsou již v provozu, ale vyžadují značné aktua - [Guillaume Ballet vysvětluje Verkle trees na ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [„Jak Verkle trees činí Ethereum štíhlejším a efektivnějším“ od Guillauma Balleta na Devconu 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam o bezstavových klientech z ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Feist vysvětluje Verkle trees a bezstavovost v podcastu Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Feist vysvětluje Verkle trees a bezstavovost v podcastu Zero Knowledge](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin o Verkle trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist o Verkle trees](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Dokumentace k EIP Verkle trees](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/de/roadmap/verkle-trees/index.md b/public/content/translations/de/roadmap/verkle-trees/index.md index 373b9e3310e..20abb653934 100644 --- a/public/content/translations/de/roadmap/verkle-trees/index.md +++ b/public/content/translations/de/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Verkle Tree Testnetzwerke laufen bereits, aber es sind noch substantielle Update - [Guillaume Ballet erklärt Verkle Trees bei ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - ["Wie Verkle Trees Ethereum schlank und super machen" von Guillaume Ballet bei Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam über zustandsfreie Clients bei ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest erklärt Verkle Trees und Zustandslosigkeit im Podcast zu Null-Wissen](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest erklärt Verkle Trees und Zustandslosigkeit im Podcast zu Null-Wissen](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin über Verkle Trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist über Verkle Trees](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Verkle Trees EIP Dokumentation](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/es/roadmap/verkle-trees/index.md b/public/content/translations/es/roadmap/verkle-trees/index.md index 5a824943100..53d8c88d54a 100644 --- a/public/content/translations/es/roadmap/verkle-trees/index.md +++ b/public/content/translations/es/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Las redes de prueba del árbol de Verkle ya están en funcionamiento, pero todav - [Guillaume Ballet explica los árboles de Verkle en ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [«Cómo los árboles de Verkle hacen que Ethereum sean claro y directo» por Guillaume Ballet en Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam sobre clientes sin estado en ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest explica los árboles de Verkle y la falta de estado en el podcast Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest explica los árboles de Verkle y la falta de estado en el podcast Zero Knowledge](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin comenta los árboles de Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist habla de los árboles de Verkle](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Documentación EIP de los árboles de Verkle](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/fa/roadmap/verkle-trees/index.md b/public/content/translations/fa/roadmap/verkle-trees/index.md index aeadcd6c7ef..e10781bb17d 100644 --- a/public/content/translations/fa/roadmap/verkle-trees/index.md +++ b/public/content/translations/fa/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ summaryPoints: - [Guillaume Ballet درباره درختان ورکل در ETHGlobal توضیح می‌دهد](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [«چگونه درختان ورکل اتریوم را مختصر و مفید می‌کنند» از Guillaume Ballet در دِوکان 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam از ETHDenver 2020 درباره کلاینت‌های بی‌حالت می‌گوید](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [دانکارد فیست در پادکست Zero Knowledge درختان ورکل و بی‌حالتی را توضیح می‌دهد](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [دانکارد فیست در پادکست Zero Knowledge درختان ورکل و بی‌حالتی را توضیح می‌دهد](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin درباره درختان ورکل می‌گوید](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist درباره درختان ورکل می‌گوید](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [مستندات مربوط به EIP درختان ورکل](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/fr/roadmap/verkle-trees/index.md b/public/content/translations/fr/roadmap/verkle-trees/index.md index 6aefc0629d8..c525a0a8bc8 100644 --- a/public/content/translations/fr/roadmap/verkle-trees/index.md +++ b/public/content/translations/fr/roadmap/verkle-trees/index.md @@ -62,7 +62,7 @@ Les réseaux de test des arbres Verkle sont déjà opérationnels, mais il reste - [Guillaume Ballet présente les arbres de Verkle à l'ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [« Comment les arbres de Verkle rendent Ethereum léger et agressif » par Guillaume Ballet à Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam sur les clients sans état depuis l'ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest nous parle des arbres de Verkle et du « Statelessness » dans le podcast Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest nous parle des arbres de Verkle et du « Statelessness » dans le podcast Zero Knowledge](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin sur les arbres de Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist sur les arbres de Verkle](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Documentation EIP sur l'Arbre de Verkle](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/hu/roadmap/verkle-trees/index.md b/public/content/translations/hu/roadmap/verkle-trees/index.md index 2f608b229e9..cad9c733619 100644 --- a/public/content/translations/hu/roadmap/verkle-trees/index.md +++ b/public/content/translations/hu/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ A Verkle-fa teszthálózatai már működnek, de jelentős mértékű kliensfris - [Guillaume Ballet magyarázata a Verkle-fákról az ETHGlobal rendezvényen](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [„Hogyan segítenek a Verkle-fák abban, hogy az Ethereum áttekinthető és egyszerű legyen?” – Guillaume Ballet előadása a Devcon 6 rendezvényen](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam előadása a státusztalan kliensekről az ETHDenver 2020-as rendezvényén](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest Verkle-fákról és státuszmentességről szóló podcastja a Zero Knowledge csatornán](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest Verkle-fákról és státuszmentességről szóló podcastja a Zero Knowledge csatornán](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin magyarázata a Verkle-fákról](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist magyarázata a Verkle-fákról](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [A Verkle-fák EIP-dokumentációja](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/id/roadmap/verkle-trees/index.md b/public/content/translations/id/roadmap/verkle-trees/index.md index 23252e11625..eefc81644e2 100644 --- a/public/content/translations/id/roadmap/verkle-trees/index.md +++ b/public/content/translations/id/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Jaringan percobaan pohon Verkle sudah aktif dan berjalan, tetapi masih ada pemba - [Guillaume Ballet menjelaskan pohon verkle di ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - ["Cara pohon Verkle menjadikan Ethereum ramping dan efektif" oleh Guillaume Ballet di Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam tentang klien tanpa keadaan dari ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest menjelaskan pohon Verkle dan kondisi tanpa keadaan di podcast Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest menjelaskan pohon Verkle dan kondisi tanpa keadaan di podcast Zero Knowledge](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin tentang pohon Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist tentang pohon Verkle](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Dokumentasi EIP pohon Verkle](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/it/roadmap/verkle-trees/index.md b/public/content/translations/it/roadmap/verkle-trees/index.md index 1e1c380bd32..ea74f2c45cc 100644 --- a/public/content/translations/it/roadmap/verkle-trees/index.md +++ b/public/content/translations/it/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Le reti di prova dell'albero di Verkle sono già in esecuzione, ma servono ancor - [Guillaume Ballet spiega gli alberi di Verkle all'ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - ["Come gli alberi di Verkle rendono Ethereum snello e succinto" di Guillaume Ballet al Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam sui client privi di stato dall'ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest spiega gli alberi di Verkle e l'assenza di stato nel podcast "Zero Knowledge"](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest spiega gli alberi di Verkle e l'assenza di stato nel podcast "Zero Knowledge"](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin sugli alberi di Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist sugli alberi di Verkle](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Documentazione sull'EIP degli alberi di Verkle](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/ja/roadmap/verkle-trees/index.md b/public/content/translations/ja/roadmap/verkle-trees/index.md index 3ba5c4f6e2c..6a7d53e95cc 100644 --- a/public/content/translations/ja/roadmap/verkle-trees/index.md +++ b/public/content/translations/ja/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ summaryPoints: - [Guillaume BalletによるETHGlobalでのバークルツリーの説明](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [Devcon6でのGuillaume Balletによる「バークルツリーがイーサリアムを効率的にする仕組み」](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [ETHDenver 2020でのPiper Merriamによるステートレスクライアントに関する説明](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [ダンクラッド・フィーストによるゼロ知識ポッドキャストでのバークルツリーとステートレス性についての解説](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [ダンクラッド・フィーストによるゼロ知識ポッドキャストでのバークルツリーとステートレス性についての解説](https://zeroknowledge.fm/podcast/202/) - [ヴィタリック・ブテリンによるバークルツリーの説明](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [ダンクラッド・フィーストによるバークルツリーの説明](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [バークルツリーのEIPドキュメント](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/nl/roadmap/verkle-trees/index.md b/public/content/translations/nl/roadmap/verkle-trees/index.md index cb5f3225f61..322ee319f0b 100644 --- a/public/content/translations/nl/roadmap/verkle-trees/index.md +++ b/public/content/translations/nl/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ De testnetten van Verkle Trees zijn al in gebruik genomen, maar er zijn nog stee - [Guillaume Ballet legt Verkle Trees uit op ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [“Hoe Verkle bomen Ethereum mager en gedreven maken” door Guillaume Ballet op Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam over statusloze clients op ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest legt Verkle Trees en statusloosheid uit op de Zero Knowledge-podcast](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest legt Verkle Trees en statusloosheid uit op de Zero Knowledge-podcast](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin over Verkle Trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist over Verkle Trees](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [EIP documentatie Verkle Tree](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/pl/roadmap/verkle-trees/index.md b/public/content/translations/pl/roadmap/verkle-trees/index.md index df197fda434..808806d9e66 100644 --- a/public/content/translations/pl/roadmap/verkle-trees/index.md +++ b/public/content/translations/pl/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Sieci testowe drzew Verkle są już dostępne, ale wciąż istnieją spore zaleg - [Guillaume Ballet wyjaśnia drzewa Verkle na ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [„Jak drzewa Verkle sprawiają, że Ethereum jest w dobrej kondycji” — Guillaume Ballet na Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam o bezstanowych klientach na ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest objaśnia drzewa Verkle i bezstanowość w podcaście Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest objaśnia drzewa Verkle i bezstanowość w podcaście Zero Knowledge](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin o drzewach Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist o drzewach Verkle](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Dokumentacja EIP drzew Verkle](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/pt-br/roadmap/verkle-trees/index.md b/public/content/translations/pt-br/roadmap/verkle-trees/index.md index 876d3de8bdf..dd37b518e2f 100644 --- a/public/content/translations/pt-br/roadmap/verkle-trees/index.md +++ b/public/content/translations/pt-br/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ As redes de testes de Verkle Trees já estão em execução, mas ainda há atual - [Guillaume Ballet explica árvores de Verkle no ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - ["Como as Verkle Trees tornam o Ethereum simples e eficiente", por Guillaume Ballet na Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam sobre clientes sem estado da ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest explica as árvores Verkle e a falta de estado no podcast da Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest explica as árvores Verkle e a falta de estado no podcast da Zero Knowledge](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin sobre Verkle Trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist sobre Verkle Trees](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Documentação de EIO da Verkle Tree](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/ru/roadmap/verkle-trees/index.md b/public/content/translations/ru/roadmap/verkle-trees/index.md index 0bd719d61c3..2671dd25867 100644 --- a/public/content/translations/ru/roadmap/verkle-trees/index.md +++ b/public/content/translations/ru/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ summaryPoints: - [Гийом Балле объясняет деревья Веркла на ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [«Как деревья Меркла делают Ethereum эффективным и готовым к работе» — Гийом Балле, Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Пайпер Мерриам о клиентах без состояния на ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Данкрад Фиест объясняет, что такое деревья Веркла и клиенты без фиксации состояния, в подкасте Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Данкрад Фиест объясняет, что такое деревья Веркла и клиенты без фиксации состояния, в подкасте Zero Knowledge](https://zeroknowledge.fm/podcast/202/) - [Виталик Бутерин о деревьях Веркла](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Данкрад Фейст о деревьях Веркла](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Документация EIP деревьев Веркла](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/te/roadmap/verkle-trees/index.md b/public/content/translations/te/roadmap/verkle-trees/index.md index b361317a467..89c2324cfc6 100644 --- a/public/content/translations/te/roadmap/verkle-trees/index.md +++ b/public/content/translations/te/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Verkle ట్రీ టెస్ట్‌నెట్‌లు ఇప్పట - [Guillaume బ్యాలెట్ ETHGlobal వద్ద Verkle ట్రీస్ వివరిస్తుంది](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [డెవ్‌కాన్ 6లో గుయిలౌమ్ బ్యాలెట్ ద్వారా "Verkle ట్రీస్ మేక్ Ethereum లీన్ అండ్ మీన్"](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [ETHDenver 2020 నుండి స్టేట్‌లెస్ క్లయింట్‌లపై Piper Merriam](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [జీరో నాలెడ్జ్ పాడ్‌క్యాస్ట్‌లో Verkle ట్రీస్ మరియు స్టేట్‌లెస్‌నెస్‌ను Dankrad Fiest వివరిస్తుంది](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [జీరో నాలెడ్జ్ పాడ్‌క్యాస్ట్‌లో Verkle ట్రీస్ మరియు స్టేట్‌లెస్‌నెస్‌ను Dankrad Fiest వివరిస్తుంది](https://zeroknowledge.fm/podcast/202/) - [Verkle ట్రీస్‌పై Vitalik Buterin](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Verkle ట్రీస్‌పై Dankrad Feist](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Verkle ట్రీ EIP డాక్యుమెంటేషన్](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/tr/roadmap/verkle-trees/index.md b/public/content/translations/tr/roadmap/verkle-trees/index.md index 9c83b6ce750..cf3b4aa4013 100644 --- a/public/content/translations/tr/roadmap/verkle-trees/index.md +++ b/public/content/translations/tr/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Verkle ağacı test ağları zaten aktif ve çalışıyor, ancak Verkle ağaçla - [Guillaume Ballet ETHGlobal'de Verkle ağaçlarını açıklıyor](https://www.youtube.com/watch?v=f7bEtX3Z57o) - ["Verkle ağaçları Ethereum'u nasıl yalın ve anlamlı kılar", Devcon 6'da Guillaume Ballet](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Durumsuz müşteriler, ETHDenver 2020'den Piper Merriam](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest, Sıfır Bilgi podcast'inde Verkle ağaçlarını ve durumsuzluğu açıklıyor](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest, Sıfır Bilgi podcast'inde Verkle ağaçlarını ve durumsuzluğu açıklıyor](https://zeroknowledge.fm/podcast/202/) - [Verkle ağaçları, Vitalik Buterin](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Verkle ağaçları, Dankrad Feist](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Verkle ağacı EIP Belgeleri](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/zh-tw/roadmap/verkle-trees/index.md b/public/content/translations/zh-tw/roadmap/verkle-trees/index.md index ba55dd988ab..e0ccd44e3fe 100644 --- a/public/content/translations/zh-tw/roadmap/verkle-trees/index.md +++ b/public/content/translations/zh-tw/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ Verkle 樹是 `(key,value)` 對,其中鍵是 32 字節位元組要素,由 31 - [Guillaume Ballet 在 ETHGlobal 上解釋沃克爾樹](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [「沃克爾樹如何讓以太坊變得更加精幹而簡約」Guillaume Ballet 在 Devcon 6 發表的演講](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam 談 ETHDenver 2020 的無狀態用戶端](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Feist 在「零知識」播客上談沃克爾樹和無狀態性](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Feist 在「零知識」播客上談沃克爾樹和無狀態性](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin 談沃克爾樹](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist 談沃克爾樹](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [以太坊改進提案文件:沃克爾樹](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/zh/roadmap/verkle-trees/index.md b/public/content/translations/zh/roadmap/verkle-trees/index.md index ab4fe255340..ba9f8c6bf18 100644 --- a/public/content/translations/zh/roadmap/verkle-trees/index.md +++ b/public/content/translations/zh/roadmap/verkle-trees/index.md @@ -60,7 +60,7 @@ summaryPoints: - [Guillaume Ballet 在 ETHGlobal 解释沃克尔树](https://www.youtube.com/watch?v=f7bEtX3Z57o) - [Guillaume Ballet 在 Devcon 6 上的演讲“沃克尔树如何让以太坊变得高效精简”](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam 在 2020 年 ETHDenver 大会上关于无状态客户端的讲解](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Fiest 在 Zero Knowledge 播客上关于沃克尔树和无状态性的讲解](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Dankrad Fiest 在 Zero Knowledge 播客上关于沃克尔树和无状态性的讲解](https://zeroknowledge.fm/podcast/202/) - [Vitalik Buterin 关于沃克尔树的讲解](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist 关于沃克尔树的讲解](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [沃克尔树的以太坊改进提案](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) From 7ef9953cc10f2e6400a2f8069e7e6ced5625b7d4 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 19:49:48 -0500 Subject: [PATCH 034/368] changing https://en.wikipedia.org/wiki/Directed_acycle_graph with https://en.wikipedia.org/wiki/Directed_acyclic_graph - acycle to acyclic --- .../consensus-mechanisms/pow/mining/mining-algorithms/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md b/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md index a78bfffe494..c55f7a2501c 100644 --- a/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md +++ b/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md @@ -18,7 +18,7 @@ Bu sayfayı daha iyi anlamak için, önce [iş kanıtı konsensus](/developers/d Dagger Hashimoto, Ethash'ın yerini aldığı Ethereum madenciliği için öncü bir araştırma algoritmasıydı. İki farklı algoritmanın birleşimiydi: Dagger ve Hashimoto. Sadece bir araştırma uygulaması olarak kaldı ve Ethereum Ana Ağı başlatıldığında, Ethereum 1.0 için iş ispatı algoritması yani Ethash çalıştırıldığında geçerliliği kalmadı. -[Dagger](http://www.hashcash.org/papers/dagger.html), rastgele dilimleri bir araya getirilen bir [Yönlendirilmiş Döngüsel Grafik](https://en.wikipedia.org/wiki/Directed_acycle_graph) oluşturulmasını içerir. Temel ilke, her nonce'nin büyük bir toplam veri ağacının yalnızca küçük bir bölümünü gerektirmesidir. Her bir nonce için alt ağacı yeniden hesaplamak, madencilik için yasaklayıcıdır - bu nedenle ağacı depolama ihtiyacı vardır - ancak tek bir nonce'nin doğrulama değeri için tamamdır. Dagger, Scrypt gibi bellek açısından zor olan ancak bellek sertliği gerçekten güvenli seviyelere yükseldiğinde doğrulanması zor olan mevcut algoritmalara bir alternatif olacak şekilde tasarlanmıştır. Bununla birlikte, Dagger paylaşılan bellek donanım hızlandırmasına karşı savunmasızdı ve diğer araştırma yollarının lehine düştü. +[Dagger](http://www.hashcash.org/papers/dagger.html), rastgele dilimleri bir araya getirilen bir [Yönlendirilmiş Döngüsel Grafik](https://en.wikipedia.org/wiki/Directed_acyclic_graph) oluşturulmasını içerir. Temel ilke, her nonce'nin büyük bir toplam veri ağacının yalnızca küçük bir bölümünü gerektirmesidir. Her bir nonce için alt ağacı yeniden hesaplamak, madencilik için yasaklayıcıdır - bu nedenle ağacı depolama ihtiyacı vardır - ancak tek bir nonce'nin doğrulama değeri için tamamdır. Dagger, Scrypt gibi bellek açısından zor olan ancak bellek sertliği gerçekten güvenli seviyelere yükseldiğinde doğrulanması zor olan mevcut algoritmalara bir alternatif olacak şekilde tasarlanmıştır. Bununla birlikte, Dagger paylaşılan bellek donanım hızlandırmasına karşı savunmasızdı ve diğer araştırma yollarının lehine düştü. [Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf), G/Ç'ye bağlı olarak ASIC direnci ekleyen bir algoritmadır (yani bellek okumaları, madencilik sürecinde sınırlayıcı faktördür). Teori, RAM'in hesaplamadan daha erişilebilir olmasıdır; milyarlarca dolarlık araştırma, RAM'i, genellikle neredeyse rastgele erişim kalıplarını (dolayısıyla "rastgele erişim belleği") içeren farklı kullanım durumları için optimize etmeyi zaten araştırdı. Sonuç olarak, mevcut RAM'in algoritmayı değerlendirmek için optimale orta derecede yakın olması muhtemeldir. Hashimoto, blok zincirini bir veri kaynağı olarak kullanır ve aynı anda yukarıdaki (1) ve (3)'ü sağlar. From 0c6aef20b849fdf04a59b69624d85f5a76008c28 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 19:53:52 -0500 Subject: [PATCH 035/368] change https://calendly.com/dan-trailofbits/ethereum-office-hours to https://calendly.com/dan-trailofbits/office-hours --- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- .../developers/tutorials/secure-development-workflow/index.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/content/developers/tutorials/secure-development-workflow/index.md b/public/content/developers/tutorials/secure-development-workflow/index.md index 1dbc4b96ad6..039d5b50393 100644 --- a/public/content/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/developers/tutorials/secure-development-workflow/index.md @@ -47,6 +47,6 @@ Finally, be mindful of issues that automated tools cannot easily find: ## Ask for help {#ask-for-help} -[Ethereum office hours](https://calendly.com/dan-trailofbits/ethereum-office-hours) run every Tuesday afternoon. These 1-hour, 1-on-1 sessions are an opportunity to ask us any questions you have about security, troubleshoot using our tools, and get feedback from experts about your current approach. We will help you work through this guide. +[Ethereum office hours](https://calendly.com/dan-trailofbits/office-hours) run every Tuesday afternoon. These 1-hour, 1-on-1 sessions are an opportunity to ask us any questions you have about security, troubleshoot using our tools, and get feedback from experts about your current approach. We will help you work through this guide. Join our Slack: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). We're always available in the #crytic and #ethereum channels if you have any questions. diff --git a/public/content/translations/es/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/es/developers/tutorials/secure-development-workflow/index.md index 857267bbf7c..400f5f4da1a 100644 --- a/public/content/translations/es/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/es/developers/tutorials/secure-development-workflow/index.md @@ -50,6 +50,6 @@ Por último, tenga en cuenta los problemas que las herramientas automatizadas no ## Pedir ayuda {#ask-for-help} -[El horario de oficina de Ethereum](https://calendly.com/dan-trailofbits/ethereum-office-hours) funciona cada martes por la tarde. Estas sesiones individuales de una hora de duración son una oportunidad para hacernos cualquier pregunta que tenga sobre la seguridad, solucionar problemas usando nuestras herramientas y obtener comentarios de expertos sobre su enfoque actual. Le ayudaremos a trabajar con esta guía. +[El horario de oficina de Ethereum](https://calendly.com/dan-trailofbits/office-hours) funciona cada martes por la tarde. Estas sesiones individuales de una hora de duración son una oportunidad para hacernos cualquier pregunta que tenga sobre la seguridad, solucionar problemas usando nuestras herramientas y obtener comentarios de expertos sobre su enfoque actual. Le ayudaremos a trabajar con esta guía. Únase a nuestro Slack: [Pirateando el imperio](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Siempre estamos disponibles en los canales #crytic y #ethereum si tiene alguna duda. diff --git a/public/content/translations/fr/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/fr/developers/tutorials/secure-development-workflow/index.md index d41025d660e..5cf6f987b11 100644 --- a/public/content/translations/fr/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/fr/developers/tutorials/secure-development-workflow/index.md @@ -51,6 +51,6 @@ Enfin, soyez attentifs aux problèmes que les outils automatisés ne peuvent pas ## Demandez de l'aide {#ask-for-help} -[Les heures de bureau d'Ethereum](https://calendly.com/dan-trailofbits/ethereum-office-hours) se déroulent tous les mardis après-midi. Ces sessions en tête à tête sont l'occasion de nous poser toutes vos questions sur la sécurité, de dépannage à l'aide de nos outils et d'obtenir des commentaires d'experts sur votre approche actuelle. Nous vous aiderons à travailler à travers ce guide. +[Les heures de bureau d'Ethereum](https://calendly.com/dan-trailofbits/office-hours) se déroulent tous les mardis après-midi. Ces sessions en tête à tête sont l'occasion de nous poser toutes vos questions sur la sécurité, de dépannage à l'aide de nos outils et d'obtenir des commentaires d'experts sur votre approche actuelle. Nous vous aiderons à travailler à travers ce guide. Rejoignez notre Slack : [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Nous sommes toujours disponibles dans les canaux #crytic et #ethereum si vous avez des questions. diff --git a/public/content/translations/id/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/id/developers/tutorials/secure-development-workflow/index.md index 0ce520061b2..d336d16175f 100644 --- a/public/content/translations/id/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/id/developers/tutorials/secure-development-workflow/index.md @@ -50,6 +50,6 @@ Akhirnya, waspadalah terhadap masalah yang tidak dapat dengan mudah ditemukan ol ## Minta bantuan {#ask-for-help} -[Jam kerja Ethereum](https://calendly.com/dan-trailofbits/ethereum-office-hours) dimulai setiap Selasa sore. Sesi berdurasi 1 jam dan 1 lawan 1 ini adalah kesempatan untuk mengajukan pertanyaan apa pun kepada kami tentang keamanan, penyelesaian masalah menggunakan peralatan kami, dan mendapatkan umpan balik dari para ahli tentang pendekatan yang Anda pakai saat ini. Kami akan menolong Anda memahami panduan ini. +[Jam kerja Ethereum](https://calendly.com/dan-trailofbits/office-hours) dimulai setiap Selasa sore. Sesi berdurasi 1 jam dan 1 lawan 1 ini adalah kesempatan untuk mengajukan pertanyaan apa pun kepada kami tentang keamanan, penyelesaian masalah menggunakan peralatan kami, dan mendapatkan umpan balik dari para ahli tentang pendekatan yang Anda pakai saat ini. Kami akan menolong Anda memahami panduan ini. Bergabunglah dengan Slack kami: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Kami selalu dapat dihubungi di kanal #crytic dan #ethereum jika Anda memiliki pertanyaan apa pun. diff --git a/public/content/translations/it/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/it/developers/tutorials/secure-development-workflow/index.md index f418bdf96b7..124522bb671 100644 --- a/public/content/translations/it/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/it/developers/tutorials/secure-development-workflow/index.md @@ -50,6 +50,6 @@ Infine, ricordati dei problemi che gli strumenti automatizzati non possono facil ## Chiedi aiuto {#ask-for-help} -[Orari lavorativi di Ethereum](https://calendly.com/dan-trailofbits/ethereum-office-hours): ogni martedì pomeriggio. Queste sessioni 1 a 1 di un'ora sono un'opportunità per farci domande sulla sicurezza, la risoluzione dei problemi usando i nostri strumenti e la ricezione di feedback dagli esperti sul tuo approccio corrente. Ti aiuteremo ad arrivare in fondo a questa guida. +[Orari lavorativi di Ethereum](https://calendly.com/dan-trailofbits/office-hours): ogni martedì pomeriggio. Queste sessioni 1 a 1 di un'ora sono un'opportunità per farci domande sulla sicurezza, la risoluzione dei problemi usando i nostri strumenti e la ricezione di feedback dagli esperti sul tuo approccio corrente. Ti aiuteremo ad arrivare in fondo a questa guida. Unisciti al nostro Slack: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Siamo sempre disponibili nei canali #crytic ed #ethereum se hai domande. diff --git a/public/content/translations/ja/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/ja/developers/tutorials/secure-development-workflow/index.md index 11fe3f32d6e..a8c2f9e347f 100644 --- a/public/content/translations/ja/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/ja/developers/tutorials/secure-development-workflow/index.md @@ -50,6 +50,6 @@ sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/devel ## ヘルプを求めましょう {#ask-for-help} -毎週火曜日の午後に、[イーサリアム・オフィス・アワー](https://calendly.com/dan-trailofbits/ethereum-office-hours)が開かれています。 この1対1の1時間のセッションで、セキュリティに関する質問をしたり、ツールを使ってトラブルシューティングをしたり、現在のアプローチについて専門家からフィードバックを得ることができます。 私たちが、このガイドに基づいてサポートします。 +毎週火曜日の午後に、[イーサリアム・オフィス・アワー](https://calendly.com/dan-trailofbits/office-hours)が開かれています。 この1対1の1時間のセッションで、セキュリティに関する質問をしたり、ツールを使ってトラブルシューティングをしたり、現在のアプローチについて専門家からフィードバックを得ることができます。 私たちが、このガイドに基づいてサポートします。 ぜひ、私たちのスタックである[Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw)に参加してください。 質問があれば、いつでも#cryticチャンネルと#ethereumチャンネルにお問い合わせください。 diff --git a/public/content/translations/pt-br/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/pt-br/developers/tutorials/secure-development-workflow/index.md index 9491de81926..7caf23f4aca 100644 --- a/public/content/translations/pt-br/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/pt-br/developers/tutorials/secure-development-workflow/index.md @@ -50,6 +50,6 @@ Finalmente, esteja atento a questões que as ferramentas automatizadas não cons ## Pedir ajuda {#ask-for-help} -[Horário de escritório Ethereum](https://calendly.com/dan-trailofbits/ethereum-office-hours) executa todas as terças da tarde. Essas sessões presenciais de uma hora são uma oportunidade para você nos fazer quaisquer perguntas que sobre segurança, solucionar problemas usando nossas ferramentas e obter comentários de especialistas sobre sua abordagem atual. Vamos ajudá-lo a trabalhar neste guia. +[Horário de escritório Ethereum](https://calendly.com/dan-trailofbits/office-hours) executa todas as terças da tarde. Essas sessões presenciais de uma hora são uma oportunidade para você nos fazer quaisquer perguntas que sobre segurança, solucionar problemas usando nossas ferramentas e obter comentários de especialistas sobre sua abordagem atual. Vamos ajudá-lo a trabalhar neste guia. Junte-se ao nosso Slack: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Sempre estaremos disponíveis nos canais #crytic e #ethereum caso tenha alguma dúvida. diff --git a/public/content/translations/ro/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/ro/developers/tutorials/secure-development-workflow/index.md index 93b7ae3c524..b9a630f3949 100644 --- a/public/content/translations/ro/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/ro/developers/tutorials/secure-development-workflow/index.md @@ -50,6 +50,6 @@ Documentați proprietățile de securitate de importanță majoră și utilizaț ## Solicitați ajutor {#ask-for-help} -[Biroul Ethereum este deschis](https://calendly.com/dan-trailofbits/ethereum-office-hours) în fiecare marți după-amiază. Aceste sesiuni individuale de 1 oră reprezintă ocazia să ne puneți orice întrebări despre securitate și depanare cu instrumentele noastre, precum și să primiți feedback de la experți cu privire la abordarea dvs. actuală. Vă vom ajuta să parcurgeți acest ghid. +[Biroul Ethereum este deschis](https://calendly.com/dan-trailofbits/office-hours) în fiecare marți după-amiază. Aceste sesiuni individuale de 1 oră reprezintă ocazia să ne puneți orice întrebări despre securitate și depanare cu instrumentele noastre, precum și să primiți feedback de la experți cu privire la abordarea dvs. actuală. Vă vom ajuta să parcurgeți acest ghid. Veniți cu noi pe site-ul Slack: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Vă stăm tot timpul la dispoziție pe canalele #crytic și #ethereum dacă aveți întrebări. diff --git a/public/content/translations/tr/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/tr/developers/tutorials/secure-development-workflow/index.md index 28d5a302d47..4d6b680f0d8 100644 --- a/public/content/translations/tr/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/tr/developers/tutorials/secure-development-workflow/index.md @@ -50,6 +50,6 @@ Son olarak, otomatik araçların kolayca bulamayacağı sorunlara dikkat edin: ## Yardım isteyin {#ask-for-help} -[Ethereum office hours](https://calendly.com/dan-trailofbits/ethereum-office-hours), (çalışma asatleri) her salı öğleden sonra gerçekleştirilir. Bu 1 saatlik 1'e 1 oturumlar, güvenlikle ilgili tüm sorularınızı bize sorma, araçlarımızı kullanarak sorun giderme ve mevcut yaklaşımınız hakkında uzmanlardan geri bildirim alma fırsatıdır. Bu rehberi tamamlamanıza yardımcı olacağız. +[Ethereum office hours](https://calendly.com/dan-trailofbits/office-hours), (çalışma asatleri) her salı öğleden sonra gerçekleştirilir. Bu 1 saatlik 1'e 1 oturumlar, güvenlikle ilgili tüm sorularınızı bize sorma, araçlarımızı kullanarak sorun giderme ve mevcut yaklaşımınız hakkında uzmanlardan geri bildirim alma fırsatıdır. Bu rehberi tamamlamanıza yardımcı olacağız. Slack'imize katılın: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Herhangi bir sorunuz olursa #crytic ve #ethereum kanallarında her zaman yanınızdayız. diff --git a/public/content/translations/zh/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/zh/developers/tutorials/secure-development-workflow/index.md index 2adc0b1246f..a0e6bdba9bb 100644 --- a/public/content/translations/zh/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/zh/developers/tutorials/secure-development-workflow/index.md @@ -50,6 +50,6 @@ sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/devel ## 寻求帮助 {#ask-for-help} -[以太坊的办公时间](https://calendly.com/dan-trailofbits/ethereum-office-hours)为每周二下午。 这些 1 小时的 1 对 1 会议是一个机会,你可以向我们询问有关安全的任何问题,使用我们的工具进行故障排除,并获得专家对你当前方法的反馈。 我们将帮助你消化本指南。 +[以太坊的办公时间](https://calendly.com/dan-trailofbits/office-hours)为每周二下午。 这些 1 小时的 1 对 1 会议是一个机会,你可以向我们询问有关安全的任何问题,使用我们的工具进行故障排除,并获得专家对你当前方法的反馈。 我们将帮助你消化本指南。 加入我们的 Slack: [ Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw)。 如果你有任何问题,可以随时在 #crytic 和 #ethereum 频道上联系我们。 From 62ed843c7f3e47a23d9aa34c644fc8d894c40acc Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Thu, 6 Feb 2025 20:26:39 -0500 Subject: [PATCH 036/368] reverting a change --- public/content/developers/docs/networks/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/networks/index.md b/public/content/developers/docs/networks/index.md index 43b605a0660..a7dca454f37 100644 --- a/public/content/developers/docs/networks/index.md +++ b/public/content/developers/docs/networks/index.md @@ -90,7 +90,7 @@ Goerli is a testnet for testing validating and staking. The Goerli network is op - [Alchemy Goerli Faucet](https://goerlifaucet.com/) - [All That Node Goerli Faucet](https://www.allthatnode.com/faucet/ethereum.dsrv) - [Coinbase Wallet Faucet | Goerli](https://coinbase.com/faucets/ethereum-goerli-faucet) -- [Chainstack faucet](https://faucet.chainstack.com/goerli-faucet) +- [Chainstack Goerli faucet](https://faucet.chainstack.com/goerli-faucet) To launch a Validator on Holesky testnet, use ethstaker's ["cheap Holesky validator" launchpad](https://holesky.launchpad.ethstaker.cc/en/). From acdccd6e6afdfb6d8a390c1d8eff4b8ef8680f0c Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 19:46:11 -0500 Subject: [PATCH 037/368] change https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work to https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work -- their slug updated the optimisms-rollup piecce to optimism-s-rollup --- .../content/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../cs/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../de/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../es/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../fr/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../hu/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../id/developers/docs/scaling/layer-2-rollups/index.md | 2 +- .../it/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../ja/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../pl/developers/docs/scaling/layer-2-rollups/index.md | 2 +- .../pt-br/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../ro/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../sl/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../tr/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../zh-tw/developers/docs/scaling/optimistic-rollups/index.md | 2 +- .../zh/developers/docs/scaling/optimistic-rollups/index.md | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/public/content/developers/docs/scaling/optimistic-rollups/index.md b/public/content/developers/docs/scaling/optimistic-rollups/index.md index 1c67359da68..770040a0991 100644 --- a/public/content/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ More of a visual learner? Watch Finematics explain optimistic rollups: - [How do optimistic rollups work (The Complete guide)](https://www.alchemy.com/overviews/optimistic-rollups) - [What is a Blockchain Rollup? A Technical Introduction](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [The Essential Guide to Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [How does Optimism's Rollup really work?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [How does Optimism's Rollup really work?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [What is the Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/cs/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/cs/developers/docs/scaling/optimistic-rollups/index.md index 7daea8babff..03630850e50 100644 --- a/public/content/translations/cs/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/cs/developers/docs/scaling/optimistic-rollups/index.md @@ -259,6 +259,6 @@ Učíte se spíše vizuálně? Podívejte se na video od Finematics, které vysv - [Jak fungují optimistické rollupy (kompletní průvodce)](https://www.alchemy.com/overviews/optimistic-rollups) - [Co je to Blockchain Rollup? Technický úvod](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Zásadní průvodce pro Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Jak skutečně funguje rollup od Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Jak skutečně funguje rollup od Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [Hloubkový rozbor OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [Co je to Virtuální stroj Optimistic?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md index f4cac17ca0d..abfd1faf2c1 100644 --- a/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md @@ -46,5 +46,5 @@ Sehen Sie, wie Finematics optimistische Rollups erklärt: **Optimistische Rollups verstehen** - [Der Leitfaden zu Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Wie funktioniert das Rollup von Optimismus wirklich?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Wie funktioniert das Rollup von Optimismus wirklich?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) diff --git a/public/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md index 860a6a4a184..3da3c071151 100644 --- a/public/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ Se espera que la introducción de la [fragmentación de datos](/roadmap/dankshar - [¿Cómo funcionan los rollups optimistas? (La guía completa)](https://www.alchemy.com/overviews/optimistic-rollups) - [¿Qué es un rollup de cadena de bloques?: introducción técnica](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Guía esencial sobre Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [¿Cómo funcionan realmente los rollup optimistas?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [¿Cómo funcionan realmente los rollup optimistas?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [Análisis detallado de OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [¿Qué es la máquina virtual optimista?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md index 62c55ffb451..0f00b70c586 100644 --- a/public/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ Davantage qu'un apprenant visuel ? Regardez Finematics expliquer les rollups opt - [Comment fonctionnent les rollups optimistes (Le guide complet)](https://www.alchemy.com/overviews/optimistic-rollups) - [Qu'est-ce qu'un rollup de blockchain ? Une introduction technique](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Le guide essentiel pour Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Comment fonctionne réellement le rollup d'Optimism ?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Comment fonctionne réellement le rollup d'Optimism ?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [Qu’est-ce que la machine virtuelle optimiste ?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/hu/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/hu/developers/docs/scaling/optimistic-rollups/index.md index 18ced537206..4b0860cefb6 100644 --- a/public/content/translations/hu/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/hu/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ Az [adat sharding](/roadmap/danksharding/) bevezetése az Ethereumban várhatóa - [Hogyan működnek az optimista összevont tranzakciók (teljes útmutató)](https://www.alchemy.com/overviews/optimistic-rollups) - [Mi az a blokklánc összevont tranzakció? Technikai bevezetés](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Az alapvető útmutató az Arbitrumhoz](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Hogyan működik valójában az optimista összevont tranzakció?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Hogyan működik valójában az optimista összevont tranzakció?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [Az OVM részletes bemutatása](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [Mi az az optimista virtuális gép?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md b/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md index 6d3997fab43..b9e2610693e 100644 --- a/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md +++ b/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md @@ -142,7 +142,7 @@ Solusi hibrida ada dengan menggabungkan bagian terbaik dari berbagai teknologi l **Rollup Optimistic** - [Panduan Penting untuk Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Bagaimana Rollup Optimism benar-benar berfungsi?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Bagaimana Rollup Optimism benar-benar berfungsi?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) **Solusi Hibrida** diff --git a/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md index 6a7e12db336..65fc1e05800 100644 --- a/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ Preferisci un approccio visivo all'apprendimento? Guarda Finematics spiegare i r - [Come funzionano gli Optimistic Rollup (La guida completa)](https://www.alchemy.com/overviews/optimistic-rollups) - [Cos'è un rollup della blockchain? Un'introduzione tecnica](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Guida essenziale ad Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Come funziona davvero il rollup di Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Come funziona davvero il rollup di Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [Approfondimento su OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [What is the Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md index e06d4651a23..c7cd69803be 100644 --- a/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ ii. オプティミスティック・ロールアップを使用するデベロ - [オプティミスティック・ロールアップの仕組み(完全ガイド)](https://www.alchemy.com/overviews/optimistic-rollups) - [ブロックチェーンにおけるロールアップとは何か? 技術ガイド](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Arbitrumの基本ガイド](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Optimismのロールアップはどのように機能するのか?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Optimismのロールアップはどのように機能するのか?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVMの詳細を学ぶ](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [オプティミスティック仮想マシンとは何か?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md b/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md index b2ac35e140b..02c7526a7bf 100644 --- a/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md +++ b/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md @@ -125,7 +125,7 @@ Istnieją rozwiązania hybrydowe, które łączą w sobie najlepsze elementy wie **Optymistyczne pakiety zbiorcze** - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) -- [Jak faktycznie działa pakiet zbiorczy Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Jak faktycznie działa pakiet zbiorczy Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) **Rozwiązania hybrydowe** diff --git a/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md index ce7f842e8f9..a514f55028d 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ Você é o tipo de pessoa que aprende mais com recursos visuais? Assista aos Fin - [Como funcionam os optimistic rollups (o guia completo)](https://www.alchemy.com/overviews/optimistic-rollups) - [O que é uma Blockchain Rollup? Uma introdução técnica](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [O guia essencial do Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Como o optimistic rollup realmente funciona?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Como o optimistic rollup realmente funciona?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM: aprofundamento](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [O que é a máquina virtual otimista?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md index e69000d9410..121ebddca4a 100644 --- a/public/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md @@ -44,5 +44,5 @@ Urmăriți cum explică Finematics rollup-urile optimistic: **Optimistic rollups reading** - [Ghidul esențial pentru Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Cum funcționează cu adevărat Rollup-ul Optimistic?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Cum funcționează cu adevărat Rollup-ul Optimistic?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) diff --git a/public/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md index f535a88fd2d..392207a0d44 100644 --- a/public/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md @@ -46,5 +46,5 @@ Oglejte si, kako Finematics razložijo optimistične zvitke: **Gradivo za branje o optimističnih zvitkih** - [Ključni vodnik za Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Kako zares deluje zvitek Optimizma?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Kako zares deluje zvitek Optimizma?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [Globoki vpogled v OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) diff --git a/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md index 65226e5a35e..52aeb79da54 100644 --- a/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ Görerek öğrenmeyi mi tercih ediyorsunuz? Finematics'in iyimser toplamalar hak - [İyimser toplamalar nasıl çalışır? (Tam klavuz)](https://www.alchemy.com/overviews/optimistic-rollups) - [Blokzincir Toplaması nedir? Teknik Giriş](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Temel Arbitrum Rehberi](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Optimism'in Toplaması aslında nasıl çalışıyor?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [Optimism'in Toplaması aslında nasıl çalışıyor?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [İyimser Sanal Makine nedir?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/zh-tw/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/zh-tw/developers/docs/scaling/optimistic-rollups/index.md index 5d5dc18f3ee..c62d6c47457 100644 --- a/public/content/translations/zh-tw/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/zh-tw/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ ii. 使用樂觀卷軸的開發者和專案團隊可以利用以太坊的基礎 - [樂觀卷軸如何運作(完整指引)](https://www.alchemy.com/overviews/optimistic-rollups) - [什麽是區塊鏈卷軸? (技術介紹)](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Arbitrum 之概要指引](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [樂觀卷軸究竟如何運作?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [樂觀卷軸究竟如何運作?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [樂觀虛擬機深入探索](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [什麽是樂觀虛擬機?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md index f80c20dbb79..771c3795bff 100644 --- a/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md @@ -258,6 +258,6 @@ ii. 使用乐观卷叠的开发者和项目团队可以利用以太坊的基础 - [乐观卷叠如何工作(完整指南)](https://www.alchemy.com/overviews/optimistic-rollups) - [什么是区块链卷叠? 技术介绍](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) - [Arbitrum 基本指南](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [乐观卷叠究竟如何工作?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [乐观卷叠究竟如何工作?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [深入研究乐观虚拟机](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [什么是乐观虚拟机?](https://www.alchemy.com/overviews/optimistic-virtual-machine) From a9907140d30a053fc5be7d86986870a0d69db969 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 19:50:31 -0500 Subject: [PATCH 038/368] change https://my.ethswarm.org/grants to https://my.ethswarm.org/ - https://web.archive.org/web/20240221041758/https://my.ethswarm.org/grants looks like the old link went to the application form for grants which now exists on the home page --- public/content/community/grants/index.md | 2 +- public/content/translations/de/community/grants/index.md | 2 +- public/content/translations/el/community/grants/index.md | 2 +- public/content/translations/es/community/grants/index.md | 2 +- public/content/translations/fr/community/grants/index.md | 2 +- public/content/translations/hu/community/grants/index.md | 2 +- public/content/translations/it/community/grants/index.md | 2 +- public/content/translations/ja/community/grants/index.md | 2 +- public/content/translations/pl/community/grants/index.md | 2 +- public/content/translations/ru/community/grants/index.md | 2 +- public/content/translations/tr/community/grants/index.md | 2 +- public/content/translations/zh-tw/community/grants/index.md | 2 +- public/content/translations/zh/community/grants/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/community/grants/index.md b/public/content/community/grants/index.md index f0eacff034e..4383b0d2ccc 100644 --- a/public/content/community/grants/index.md +++ b/public/content/community/grants/index.md @@ -31,7 +31,7 @@ These projects have created their own grants for projects aimed at developing an - [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) finance ecosystem_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ - [SKALE Network Grants Program](https://skale.space/developers#grants) - _[SKALE Network](https://skale.space/) ecosystem_ -- [Swarm Foundation Grants Program](https://my.ethswarm.org/grants) - _[Swarm Foundation](https://www.ethswarm.org/) ecosystem_ +- [Swarm Foundation Grants Program](https://my.ethswarm.org) - _[Swarm Foundation](https://www.ethswarm.org/) ecosystem_ - [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/) ecosystem_ - [Uniswap Grants Program](https://www.uniswapfoundation.org/approach) – _[Uniswap](https://uniswap.org/) community_ diff --git a/public/content/translations/de/community/grants/index.md b/public/content/translations/de/community/grants/index.md index 19aa5e17cb3..188fd8f32f7 100644 --- a/public/content/translations/de/community/grants/index.md +++ b/public/content/translations/de/community/grants/index.md @@ -31,7 +31,7 @@ Diese Projekte haben ihre eigenen Zuschüsse für Projektvorhaben zur Entwicklun - [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/)-Finanzökosystem_ - [MetaMask-Programm](https://metamaskgrants.org/) – _Mitarbeitergeleitete DAO für[MetaMask](https://metamask.io/)-Zuschüsse_ - [SKALE-Network-Förderprogramm](https://skale.space/developers#grants) – _[SKALE-Network](https://skale.space/)-Ökosystem_ -- [Swarm Foundation-Förderprogramm](https://my.ethswarm.org/grants) – _[Swarm Foundation](https://www.ethswarm.org/)-Ökosystem_ +- [Swarm Foundation-Förderprogramm](https://my.ethswarm.org) – _[Swarm Foundation](https://www.ethswarm.org/)-Ökosystem_ - [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/)-Ökosystem_ - [Uniswap-Förderprogramm](https://www.uniswapfoundation.org/approach) – _[Uniswap](https://uniswap.org/)-Community_ diff --git a/public/content/translations/el/community/grants/index.md b/public/content/translations/el/community/grants/index.md index 3b1d3e25c9c..787a0cdf8c7 100644 --- a/public/content/translations/el/community/grants/index.md +++ b/public/content/translations/el/community/grants/index.md @@ -31,7 +31,7 @@ lang: el - [Lido Ecosystem Grants Organization (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) χρηματοοικονομικό οικοσύστημα_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ - [Πρόγραμμα επιχορήγησης δικτύου SKALE](https://skale.space/developers#grants) - _[SKALE](https://skale.space/)δίκτυο οικοσυστήματος_ -- [Ίδρυμα Swarm πρόγραμμα χρηματοδοτήσεων](https://my.ethswarm.org/grants) - _Οικοσύστημα [Ιδρύματος Swarm](https://www.ethswarm.org/)_ +- [Ίδρυμα Swarm πρόγραμμα χρηματοδοτήσεων](https://my.ethswarm.org) - _Οικοσύστημα [Ιδρύματος Swarm](https://www.ethswarm.org/)_ - [The Graph](https://thegraph.com/ecosystem/grants/) – _Οικοσύστημα [The Graph](https://thegraph.com/)_ - [Πρόγραμμα χρηματοδοτήσεων Uniswap](https://www.uniswapfoundation.org/approach) – _Κοινότητα [Uniswap](https://uniswap.org/)_ diff --git a/public/content/translations/es/community/grants/index.md b/public/content/translations/es/community/grants/index.md index 44faafa18ec..5463c1c891f 100644 --- a/public/content/translations/es/community/grants/index.md +++ b/public/content/translations/es/community/grants/index.md @@ -31,7 +31,7 @@ Estos proyectos han creado sus propias subvenciones para proyectos con fines de - [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego): _[ecosistema financiero](https://lido.fi/) Lido_ - [Programa MetaMask](https://metamaskgrants.org/): _[MetaMask](https://metamask.io/) subvenciones lideradas por empleados DAO_ - [Programa de subvenciones para la red SKALE](https://skale.space/developers#grants): _[ecosistema](https://skale.space/) de la red SKALE_ -- [Programa de Subvenciones de la Swarm Foundation](https://my.ethswarm.org/grants): ecosistema de la _[Swarm Foundation](https://www.ethswarm.org/)_ +- [Programa de Subvenciones de la Swarm Foundation](https://my.ethswarm.org): ecosistema de la _[Swarm Foundation](https://www.ethswarm.org/)_ - [The Graph](https://thegraph.com/ecosystem/grants/): ecosistema de _[The Graph](https://thegraph.com/)_ - [Programa de donaciones de Uniswap](https://www.uniswapfoundation.org/approach): comunidad de _[Uniswap](https://uniswap.org/)_ diff --git a/public/content/translations/fr/community/grants/index.md b/public/content/translations/fr/community/grants/index.md index 67492032d99..4cd17570673 100644 --- a/public/content/translations/fr/community/grants/index.md +++ b/public/content/translations/fr/community/grants/index.md @@ -31,7 +31,7 @@ Ces projets ont crée leurs propres subventions pour encourager d'autres projets - [Organisme de subvention Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _Écosystème financier [Lido](https://lido.fi/)_ - [Programme MetaMask](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) DAO de subventions gérées par les employés_ - [Programme de subventions SKALE Network](https://skale.space/developers#grants) - _Écosystème [SKALE Network](https://skale.space/)_ -- [Programme de subvention de la fondation Swarm](https://my.ethswarm.org/grants) - _Écosystème de la [fondation Swarm](https://www.ethswarm.org/)_ +- [Programme de subvention de la fondation Swarm](https://my.ethswarm.org) - _Écosystème de la [fondation Swarm](https://www.ethswarm.org/)_ - [TheGraph](https://thegraph.com/ecosystem/grants/) – _Écosystème [TheGraph](https://thegraph.com/)_ - [Programme de subventions Uniswap](https://www.uniswapfoundation.org/approach) – _Communauté [Uniswap](https://uniswap.org/)_ diff --git a/public/content/translations/hu/community/grants/index.md b/public/content/translations/hu/community/grants/index.md index 06307fb83f2..22c81dd74a9 100644 --- a/public/content/translations/hu/community/grants/index.md +++ b/public/content/translations/hu/community/grants/index.md @@ -31,7 +31,7 @@ Projektek által adott támogatás olyanoknak, akik az adott technológiát fejl - [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) pénzügyi ökoszisztéma_ - [MetaMask Program](https://metamaskgrants.org/) – _[MetaMask](https://metamask.io/) munkavállalók által vezetett támogatási DAO_ - [SKALE Network Grants Program](https://skale.space/developers#grants) – _[SKALE Network](https://skale.space/) ökoszisztéma_ -- [Swarm Foundation Grants Program](https://my.ethswarm.org/grants) - _[Swarm Foundation](https://www.ethswarm.org/) ökoszisztéma_ +- [Swarm Foundation Grants Program](https://my.ethswarm.org) - _[Swarm Foundation](https://www.ethswarm.org/) ökoszisztéma_ - [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/) ökoszisztéma_ - [Uniswap Grants Program](https://www.uniswapfoundation.org/approach) – _[Uniswap](https://uniswap.org/)-közösség_ diff --git a/public/content/translations/it/community/grants/index.md b/public/content/translations/it/community/grants/index.md index 7c00de48e3e..1312d04005a 100644 --- a/public/content/translations/it/community/grants/index.md +++ b/public/content/translations/it/community/grants/index.md @@ -31,7 +31,7 @@ Questi progetti hanno creato le proprie sovvenzioni per progetti volti a svilupp - [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _Ecosistema finanziario di [Lido](https://lido.fi/)_ - [MetaMask Program](https://metamaskgrants.org/): _DAO di sovvenzioni operata dai dipendenti di [MetaMask](https://metamask.io/)_ - [SKALE Network Grants Program](https://skale.space/developers#grants): _ecosistema della [rete SKALE](https://skale.space/)_ -- [Programma di sovvenzioni della Swarm Foundation](https://my.ethswarm.org/grants): _Ecosistema di [Swarm Foundation](https://www.ethswarm.org/)_ +- [Programma di sovvenzioni della Swarm Foundation](https://my.ethswarm.org): _Ecosistema di [Swarm Foundation](https://www.ethswarm.org/)_ - [The Graph](https://thegraph.com/ecosystem/grants/): _Ecosistema di [The Graph](https://thegraph.com/)_ - [Programma di sovvenzioni di Uniswap](https://www.uniswapfoundation.org/approach): _community di [Uniswap](https://uniswap.org/)_ diff --git a/public/content/translations/ja/community/grants/index.md b/public/content/translations/ja/community/grants/index.md index 5f3fbf0f68f..79775c2b2af 100644 --- a/public/content/translations/ja/community/grants/index.md +++ b/public/content/translations/ja/community/grants/index.md @@ -31,7 +31,7 @@ lang: ja - [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/)金融エコシステム_ - [MetaMaskプログラム](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/)従業員主導のDAO助成プログラム_ - [SKALE Network助成金プログラム](https://skale.space/developers#grants) - _[SKALE Network](https://skale.space/)エコシステム_ -- [Swarm Foundation助成金プログラム](https://my.ethswarm.org/grants) - _[Swarm Foundation](https://www.ethswarm.org/)エコシステム_ +- [Swarm Foundation助成金プログラム](https://my.ethswarm.org) - _[Swarm Foundation](https://www.ethswarm.org/)エコシステム_ - [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/)エコシステム_ - [ユニスワップ助成金プログラム](https://www.uniswapfoundation.org/approach) – _[ユニスワップ](https://uniswap.org/)コミュニティ_ diff --git a/public/content/translations/pl/community/grants/index.md b/public/content/translations/pl/community/grants/index.md index c5ba3bf2256..bde04295dc5 100644 --- a/public/content/translations/pl/community/grants/index.md +++ b/public/content/translations/pl/community/grants/index.md @@ -31,7 +31,7 @@ Projekty te stworzyły własne granty dla projektów mających na celu rozwój i - [Organizacja grantów ekosystemu Lido (LEGO)](https://lido.fi/lego) — _ekosystem finansowy [Lido](https://lido.fi/)_ - [Program MetaMask](https://metamaskgrants.org/) — _DAO prowadzonych przez pracowników grantów [MetaMask](https://metamask.io/)_ - [Program grantów sieci SKALE](https://skale.space/developers#grants) — _ekosystem [sieci SKALE](https://skale.space/)_ -- [Program grantów Swarm Foundation](https://my.ethswarm.org/grants) — _ekosystem [Swarm Foundation](https://www.ethswarm.org/)_ +- [Program grantów Swarm Foundation](https://my.ethswarm.org) — _ekosystem [Swarm Foundation](https://www.ethswarm.org/)_ - [The Graph](https://thegraph.com/ecosystem/grants/) — _ekosystem [The Graph](https://thegraph.com/)_ - [Program grantów Uniswap](https://www.uniswapfoundation.org/approach) — _społeczność [Uniswap](https://uniswap.org/)_ diff --git a/public/content/translations/ru/community/grants/index.md b/public/content/translations/ru/community/grants/index.md index 814115e7aa5..95fc493a5b7 100644 --- a/public/content/translations/ru/community/grants/index.md +++ b/public/content/translations/ru/community/grants/index.md @@ -31,7 +31,7 @@ lang: ru - [Организация грантов экосистемы Lido (LEGO)](https://lido.fi/lego): _финансовая экосистема [Lido](https://lido.fi/)._ - [ Программа MetaMask](https://metamaskgrants.org/): _DAO по выдаче грантов под руководством сотрудников [MetaMask](https://metamask.io/)._ - [Программа грантов SKALE Network](https://skale.space/developers#grants): _экосистема [SKALE Network](https://skale.space/)._ -- [Программа грантов фонда Swarm](https://my.ethswarm.org/grants) — _экосистема [фонда Swarm](https://www.ethswarm.org/)_ +- [Программа грантов фонда Swarm](https://my.ethswarm.org) — _экосистема [фонда Swarm](https://www.ethswarm.org/)_ - [The Graph](https://thegraph.com/ecosystem/grants/) — _экосистема [Graph](https://thegraph.com/)_ - [Программа грантов Uniswap](https://www.uniswapfoundation.org/approach) — _сообщество [Uniswap](https://uniswap.org/)_ diff --git a/public/content/translations/tr/community/grants/index.md b/public/content/translations/tr/community/grants/index.md index 93eabf7159d..2a2484811f4 100644 --- a/public/content/translations/tr/community/grants/index.md +++ b/public/content/translations/tr/community/grants/index.md @@ -31,7 +31,7 @@ Bu projeler kendi teknolojilerini geliştirmeye ve deneyimlemeye yönelik olarak - [Lido Ekosistem Hibeleri Organizasyonu (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) finans ekosistemi_ - [MetaMask Programı](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) çalışanlar öncülüğünde yönetilen hibe DAO'su_ - [SKALE Ağı Hibe Ekosistemi](https://skale.space/developers#grants) - _[SKALE Ağı](https://skale.space/) ekosistemi_ -- [Swarm Vakfı Hibe Programı](https://my.ethswarm.org/grants) - _[Swarm Vakfı](https://www.ethswarm.org/) ekosistemi_ +- [Swarm Vakfı Hibe Programı](https://my.ethswarm.org) - _[Swarm Vakfı](https://www.ethswarm.org/) ekosistemi_ - [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/) ekosistemi_ - [Uniswap Hibe Programı](https://www.uniswapfoundation.org/approach) – _[Uniswap](https://uniswap.org/) topluluğu_ diff --git a/public/content/translations/zh-tw/community/grants/index.md b/public/content/translations/zh-tw/community/grants/index.md index 1133d58cfba..9eca6e1f49f 100644 --- a/public/content/translations/zh-tw/community/grants/index.md +++ b/public/content/translations/zh-tw/community/grants/index.md @@ -31,7 +31,7 @@ lang: zh-tw - [Lido 生態系統資助機構 (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) 金融生態系統_ - [MetaMask 計劃](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) 員工引導自助去中心化自治組織_ - [SKALE 網路資助計劃](https://skale.space/developers#grants) - _[SKALE 網路](https://skale.space/)生態系統_ -- [Swarm 基金會資助計劃](https://my.ethswarm.org/grants) - _[Swarm 基金會](https://www.ethswarm.org/)生態系統_ +- [Swarm 基金會資助計劃](https://my.ethswarm.org) - _[Swarm 基金會](https://www.ethswarm.org/)生態系統_ - [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/) 生態系統_ - [Uniswap 資助計劃](https://www.uniswapfoundation.org/approach) – _[Uniswap](https://uniswap.org/) 社群_ diff --git a/public/content/translations/zh/community/grants/index.md b/public/content/translations/zh/community/grants/index.md index 2c10e98226a..b58aeaf5957 100644 --- a/public/content/translations/zh/community/grants/index.md +++ b/public/content/translations/zh/community/grants/index.md @@ -31,7 +31,7 @@ lang: zh - [Lido 生态系统资助组织 (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) 金融生态系统_ - [MetaMask 方案](https://metamaskgrants.org/) - _-[MetaMask](https://metamask.io/) 员工主导的资助去中心化自助组织_ - [SKALE 网络资助方案](https://skale.space/developers#grants) - _[SKALE 网络](https://skale.space/)生态系统_ -- [Swarm 基金会资助计划](https://my.ethswarm.org/grants) - _[Swarm 基金会](https://www.ethswarm.org/)生态系统_ +- [Swarm 基金会资助计划](https://my.ethswarm.org) - _[Swarm 基金会](https://www.ethswarm.org/)生态系统_ - [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/) 生态系统_ - [Uniswap 资助计划](https://www.uniswapfoundation.org/approach) – _[Uniswap](https://uniswap.org/) 社区_ From 9ff1fd87520458e5f6480c1953d7ec93681fb217 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 19:53:59 -0500 Subject: [PATCH 039/368] change https://www.apollographql.com/blog/graphql-explained-5844742f195e/ to https://www.apollographql.com/blog/graphql-explained - appollographql removed hashing from their slugs --- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/content/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 6aed327d08c..d5899d17190 100644 --- a/public/content/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -93,7 +93,7 @@ First let's talk about GraphQL, originally designed and implemented by Facebook. -The two images pretty much capture the essence of GraphQL. With the query on the right we can define exactly what data we want, so there we get everything in one request and nothing more than exactly what we need. A GraphQL server handles the fetching of all data required, so it is incredibly easy for the frontend consumer side to use. [This is a nice explanation](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) of how exactly the server handles a query if you're interested. +The two images pretty much capture the essence of GraphQL. With the query on the right we can define exactly what data we want, so there we get everything in one request and nothing more than exactly what we need. A GraphQL server handles the fetching of all data required, so it is incredibly easy for the frontend consumer side to use. [This is a nice explanation](https://www.apollographql.com/blog/graphql-explained) of how exactly the server handles a query if you're interested. Now with that knowledge, let's finally jump into blockchain space and The Graph. diff --git a/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 1a7656ccb12..b86997f03f8 100644 --- a/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ Primero hablemos de GraphQL, que fue originalmente desarrollado e implementado p -Las dos imágenes representan en términos generales la esencia de GraphQL. Con la consulta de la derecha podemos definir exactamente qué datos queremos, así que ahí recibimos todo en una única solicitud y nada más que exactamente lo que necesitamos. Un servidor de GraphQL maneja la obtención de todos los datos requeridos, por lo que es increíblemente fácil de usar desde el lado del consumidor del frontend. [Esta es una buena explicación](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) de cómo exactamente el servidor gestiona una consulta si usted está interesado. +Las dos imágenes representan en términos generales la esencia de GraphQL. Con la consulta de la derecha podemos definir exactamente qué datos queremos, así que ahí recibimos todo en una única solicitud y nada más que exactamente lo que necesitamos. Un servidor de GraphQL maneja la obtención de todos los datos requeridos, por lo que es increíblemente fácil de usar desde el lado del consumidor del frontend. [Esta es una buena explicación](https://www.apollographql.com/blog/graphql-explained) de cómo exactamente el servidor gestiona una consulta si usted está interesado. Ahora, con ese conocimiento, vayamos finalmente al campo de la cadena de bloques y The Graph. diff --git a/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 33b46b8ca27..59e431d8559 100644 --- a/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ Commençons par parler de GraphQL, initialement conçu et implémenté par Faceb -Ces deux images illustrent bien l'essence de GraphQL. Avec la requête de droite, nous pouvons définir exactement les données que nous voulons. Ainsi, nous récupérons tout en une seule requête et rien de plus que ce dont nous avons exactement besoin. Un serveur GraphQL gère la récupération de toutes les données requises, il est ainsi incroyablement facile à utiliser côté consommateur. [Voici une bonne explication](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) de la façon dont le serveur gère exactement une requête si vous êtes intéressé. +Ces deux images illustrent bien l'essence de GraphQL. Avec la requête de droite, nous pouvons définir exactement les données que nous voulons. Ainsi, nous récupérons tout en une seule requête et rien de plus que ce dont nous avons exactement besoin. Un serveur GraphQL gère la récupération de toutes les données requises, il est ainsi incroyablement facile à utiliser côté consommateur. [Voici une bonne explication](https://www.apollographql.com/blog/graphql-explained) de la façon dont le serveur gère exactement une requête si vous êtes intéressé. Maintenant, avec cette connaissance, parlons enfin de blockchain et de The Graph. diff --git a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 85d0684162d..b98e5604d26 100644 --- a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ Pertama, mari kita bicara tentang GraphQL, yang semula dirancang dan diimplement -Kedua gambar cukup menangkap inti GraphQL. Dengan kueri di sebelah kanan, kita bisa secara persis menentukan data apa yang kita inginkan, sehingga di sana kita mendapatkan semua hal dalam satu permintaan dan tidak lebih dari yang benar-benar kita butuhkan. Server GraphQL menangani pengambilan semua data yang diperlukan, sehingga itu sangat mudah digunakan dari sisi pengguna frontend. [Ini adalah penjelasan baik](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) tentang bagaimana sebenarnya server menangani kueri jika Anda tertarik. +Kedua gambar cukup menangkap inti GraphQL. Dengan kueri di sebelah kanan, kita bisa secara persis menentukan data apa yang kita inginkan, sehingga di sana kita mendapatkan semua hal dalam satu permintaan dan tidak lebih dari yang benar-benar kita butuhkan. Server GraphQL menangani pengambilan semua data yang diperlukan, sehingga itu sangat mudah digunakan dari sisi pengguna frontend. [Ini adalah penjelasan baik](https://www.apollographql.com/blog/graphql-explained) tentang bagaimana sebenarnya server menangani kueri jika Anda tertarik. Sekarang dengan pengetahuan itu, mari akhirnya masuk ke dalam ruang blockchain dan The Graph. diff --git a/public/content/translations/it/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/it/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index ad18a610c69..c5a6f467e64 100644 --- a/public/content/translations/it/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/it/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ Parliamo prima di GraphQL, originariamente progettato e implementato da Facebook -Le due immagini catturano quasi perfettamente l'essenza di GraphQL. Con la query sulla destra possiamo definire esattamente i dati che vogliamo, così otteniamo tutto in un'unica richiesta e niente di più di quanto necessario. Un server GraphQL gestisce il recupero di tutti i dati necessari, quindi è incredibilmente facile da usare dal lato frontend client. [Questa è una spiegazione efficace](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) e accurata di come il server gestisce una query. +Le due immagini catturano quasi perfettamente l'essenza di GraphQL. Con la query sulla destra possiamo definire esattamente i dati che vogliamo, così otteniamo tutto in un'unica richiesta e niente di più di quanto necessario. Un server GraphQL gestisce il recupero di tutti i dati necessari, quindi è incredibilmente facile da usare dal lato frontend client. [Questa è una spiegazione efficace](https://www.apollographql.com/blog/graphql-explained) e accurata di come il server gestisce una query. Con queste informazioni, passiamo finalmente allo spazio della blockchain e a The Graph. diff --git a/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 9e7a14dbf40..326318ffeb8 100644 --- a/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ GameContract.events.BetPlaced({ -2つの画像は、GraphQLの本質をほぼ捉えています。 右のクエリーでは、必要なデータを正確に定義できるので、1回のリクエストで必要なものだけを取得できます。 GraphQLサーバーは必要とされるすべてのデータの取得を処理できるので、フロントエンドのコンシューマ側にとっては極めて使いやすいツールとなっています。 ご興味があれば、サーバーが具体的にどのようにクエリを処理するかについて[わかりやすい説明](https://www.apollographql.com/blog/graphql-explained-5844742f195e/)をご覧ください。 +2つの画像は、GraphQLの本質をほぼ捉えています。 右のクエリーでは、必要なデータを正確に定義できるので、1回のリクエストで必要なものだけを取得できます。 GraphQLサーバーは必要とされるすべてのデータの取得を処理できるので、フロントエンドのコンシューマ側にとっては極めて使いやすいツールとなっています。 ご興味があれば、サーバーが具体的にどのようにクエリを処理するかについて[わかりやすい説明](https://www.apollographql.com/blog/graphql-explained)をご覧ください。 この知識をもとに、ブロックチェーン空間とThe Graphの世界に入って行きましょう。 diff --git a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index a42726f0006..243009a4654 100644 --- a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ Najpierw porozmawiajmy o GraphQL, pierwotnie zaprojektowanym i zaimplementowanym -Te dwa obrazy w dużym stopniu oddają istotę GraphQL. Za pomocą zapytania po prawej stronie możemy zdefiniować dokładnie, jakich danych chcemy, dzięki czemu otrzymujemy wszystko w jednym żądaniu i nic więcej niż dokładnie to, czego potrzebujemy. Serwer GraphQL obsługuje pobieranie wszystkich wymaganych danych, dzięki czemu jest niezwykle łatwy w użyciu dla użytkownika frontendu. [To dobre wyjaśnienie](https://www.apollographql.com/blog/graphql-explained-5844742f195e/), jak dokładnie serwer obsługuje zapytanie, jeśli jesteś zainteresowany. +Te dwa obrazy w dużym stopniu oddają istotę GraphQL. Za pomocą zapytania po prawej stronie możemy zdefiniować dokładnie, jakich danych chcemy, dzięki czemu otrzymujemy wszystko w jednym żądaniu i nic więcej niż dokładnie to, czego potrzebujemy. Serwer GraphQL obsługuje pobieranie wszystkich wymaganych danych, dzięki czemu jest niezwykle łatwy w użyciu dla użytkownika frontendu. [To dobre wyjaśnienie](https://www.apollographql.com/blog/graphql-explained), jak dokładnie serwer obsługuje zapytanie, jeśli jesteś zainteresowany. Teraz, mając tę ​​wiedzę, w końcu wskoczmy w przestrzeń blockchain i The Graph. diff --git a/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 5fc117503d7..9c6a1e7ba3e 100644 --- a/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ Primeiro, vamos falar sobre GraphQL, originalmente projetado e implementado pelo -As duas imagens capturam praticamente a essência do GraphQL. Com a consulta à direita, podemos definir exactamente quais os dados que queremos, assim aí temos tudo ao alcance e nada mais do que aquilo de que precisamos. Um servidor GraphQL lida com a busca de todos os dados necessários, então é incrivelmente fácil para o lado frontend do consumidor. [Esta é uma bela explicação](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) de como exatamente o servidor lida com uma consulta se estiver interessado. +As duas imagens capturam praticamente a essência do GraphQL. Com a consulta à direita, podemos definir exactamente quais os dados que queremos, assim aí temos tudo ao alcance e nada mais do que aquilo de que precisamos. Um servidor GraphQL lida com a busca de todos os dados necessários, então é incrivelmente fácil para o lado frontend do consumidor. [Esta é uma bela explicação](https://www.apollographql.com/blog/graphql-explained) de como exatamente o servidor lida com uma consulta se estiver interessado. Agora com esse conhecimento, vamos finalmente adentrar o espaço da blockchain e The Graph. diff --git a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 119f1150a44..07fd52b7136 100644 --- a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ Acum să analizăm o soluție mai bună. -Cele două imagini surprind destul de bine esența GraphQL. Cu ajutorul interogării din dreapta putem defini exact ce date vrem și astfel obținem totul printr-o singură cerere, exact ce avem nevoie și nimic mai mult. Un server GraphQL se ocupă de preluarea tuturor datelor necesare, utilizarea fiind deci incredibil de ușoară de către consumatorul din frontend. [Se explică frumos prin aceasta](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) cum anume gestionează serverul o interogare, dacă sunteți interesat. +Cele două imagini surprind destul de bine esența GraphQL. Cu ajutorul interogării din dreapta putem defini exact ce date vrem și astfel obținem totul printr-o singură cerere, exact ce avem nevoie și nimic mai mult. Un server GraphQL se ocupă de preluarea tuturor datelor necesare, utilizarea fiind deci incredibil de ușoară de către consumatorul din frontend. [Se explică frumos prin aceasta](https://www.apollographql.com/blog/graphql-explained) cum anume gestionează serverul o interogare, dacă sunteți interesat. Cunoscând acum aceste lucruri, să ne avântăm în sfârșit în spațiul blockchain și în „The Graph”. diff --git a/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index ab775c5f18e..5272506665c 100644 --- a/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ Bunun neden optimal olmadığını görebilirsiniz: -İki görüntü, GraphQL'in özünü hemen hemen yakalar. Sağdaki sorgu ile tam olarak hangi verileri istediğimizi tanımlayabiliriz, böylece orada her şeyi tek bir istekte alırız ve tam olarak ihtiyacımız olandan fazlasını elde ederiz. Bir GraphQL sunucusu, gerekli tüm verilerin alınmasını yönetir, bu nedenle ön uç tüketici tarafının kullanımı inanılmaz derecede kolaydır. [Bu, ilgileniyorsanız sunucunun bir sorguyu tam olarak nasıl ele aldığının güzel bir açıklamasıdır](https://www.apollographql.com/blog/graphql-explained-5844742f195e/). +İki görüntü, GraphQL'in özünü hemen hemen yakalar. Sağdaki sorgu ile tam olarak hangi verileri istediğimizi tanımlayabiliriz, böylece orada her şeyi tek bir istekte alırız ve tam olarak ihtiyacımız olandan fazlasını elde ederiz. Bir GraphQL sunucusu, gerekli tüm verilerin alınmasını yönetir, bu nedenle ön uç tüketici tarafının kullanımı inanılmaz derecede kolaydır. [Bu, ilgileniyorsanız sunucunun bir sorguyu tam olarak nasıl ele aldığının güzel bir açıklamasıdır](https://www.apollographql.com/blog/graphql-explained). Şimdi bu bilgiyle, nihayet blok zinciri alanına ve The Graph'a geçelim. diff --git a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index cb73a2493ff..4a1fe4b257d 100644 --- a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -91,7 +91,7 @@ GameContract.events.BetPlaced({ -这两张图片基本上抓住了 GraphQL 的精髓。 通过右边的查询,我们可以精确地定义我们想要的数据,这样我们就可以在一个请求中得到所有的东西,而不仅仅是我们需要的东西。 GraphQL 服务器处理所有所需数据的获取,因此前端用户端使用起来非常简单。 如果您感兴趣,[这是一个很好的解释](https://www.apollographql.com/blog/graphql-explained-5844742f195e/),说明服务器是如何处理查询的。 +这两张图片基本上抓住了 GraphQL 的精髓。 通过右边的查询,我们可以精确地定义我们想要的数据,这样我们就可以在一个请求中得到所有的东西,而不仅仅是我们需要的东西。 GraphQL 服务器处理所有所需数据的获取,因此前端用户端使用起来非常简单。 如果您感兴趣,[这是一个很好的解释](https://www.apollographql.com/blog/graphql-explained),说明服务器是如何处理查询的。 现在有了这些知识,让我们最终进入区块链空间和 The Graph。 From 054e8d24b4cf4a4bf3857052be47c4883da5809d Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 19:56:49 -0500 Subject: [PATCH 040/368] change https://thegraph.com/docs/assemblyscript-api#api-reference to https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference - https://web.archive.org/web/20201012014722/https://thegraph.com/docs/assemblyscript-api#api-reference - graph docs updated so the slug changed but same content --- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/content/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index d5899d17190..e09b706248e 100644 --- a/public/content/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -198,7 +198,7 @@ Then we create a new Bet entity. The id for this will be `event.transaction.hash Lastly we can update the Player entity with all the data. Arrays cannot be pushed to directly, but need to be updated as shown here. We use the id to reference the bet. And `.save()` is required at the end to store an entity. -The full documentation can be seen here: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. You can also add logging output to the mapping file, see [here](https://thegraph.com/docs/assemblyscript-api#api-reference). +The full documentation can be seen here: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. You can also add logging output to the mapping file, see [here](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index b86997f03f8..b3bfb70598d 100644 --- a/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Luego creamos una nueva entidad Bet. El id para esto será `event.transaction.ha Por último, podemos actualizar la entidad Player con todos los datos. Los arrays no pueden empujarse directamente, sino que necesitan ser actualizados como se muestra aquí. Utilizamos el id para referenciar la apuesta. `.save()` es necesario al final para almacenar una entidad. -La documentación completa puede obtenerse aquí: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. También puede añadir salida de registro al archivo de mapeo; consulte [aquí](https://thegraph.com/docs/assemblyscript-api#api-reference). +La documentación completa puede obtenerse aquí: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. También puede añadir salida de registro al archivo de mapeo; consulte [aquí](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 59e431d8559..a3bc9c409bc 100644 --- a/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Puis nous créons une nouvelle entité Bet. L'ID pour cela sera `event.transacti Enfin, nous pouvons mettre à jour l'entité du Player avec toutes les données. Les tableaux ne peuvent pas être poussés directement, mais doivent être mis à jour comme indiqué ici. Nous utilisons l'ID pour référencer le pari. Et `.save()` est requis à la fin pour stocker une entité. -La documentation complète est disponible ici : https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Vous pouvez également ajouter une sortie de journalisation au fichier de mapping, voir [ici](https://thegraph.com/docs/assemblyscript-api#api-reference). +La documentation complète est disponible ici : https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Vous pouvez également ajouter une sortie de journalisation au fichier de mapping, voir [ici](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index b98e5604d26..0e33a8b443b 100644 --- a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Lalu kita membuat entitas Bet baru. The id for this will be `event.transaction.h Lastly we can update the Player entity with all the data. Array tidak boleh didorong secara langsung, tapi perlu diperbarui seperti yang ditunjukkan di sini. Kita menggunakan id untuk merujuk pada taruhannya. And `.save()` is required at the end to store an entity. -Dokumentasi lengkapnya bisa dilihat di sini: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Anda juga bisa menambahkan output yang membuat log ke file pemetaan, lihat [di sini](https://thegraph.com/docs/assemblyscript-api#api-reference). +Dokumentasi lengkapnya bisa dilihat di sini: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Anda juga bisa menambahkan output yang membuat log ke file pemetaan, lihat [di sini](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/it/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/it/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index c5a6f467e64..1adc5485c36 100644 --- a/public/content/translations/it/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/it/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Poi creiamo una nuova entità Bet. L'id sarà `event.transaction.hash.toHex() + Infine possiamo aggiornare l'entità Player con tutti i dati. Non è possibile eseguire direttamente il push degli array, bensì devono essere aggiornati come indicato qui. Usiamo l'id per fare riferimento alla scommessa. E occorre aggiungere `.save()` alla fine per memorizzare un'entità. -La documentazione completa può essere consultata qui: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Puoi anche aggiungere l'output di registrazione al file di mapping, vedi [qui](https://thegraph.com/docs/assemblyscript-api#api-reference). +La documentazione completa può essere consultata qui: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Puoi anche aggiungere l'output di registrazione al file di mapping, vedi [qui](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 326318ffeb8..313d5265f64 100644 --- a/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ The Graphのマッピングファイルは、受信したイベントをエン 最後に、すべてのデータでPlayerエンティティを更新します。 配列を直接プッシュすることはできませんが、ここに示すように更新する必要があります。 betを参照するためにidを使用します。 エンティティを保存するには、`.save()`が最後に必要です。 -ドキュメント全文については、こちらをご覧ください。https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings マッピングファイルにログの出力を追加できます。詳細は[こちら](https://thegraph.com/docs/assemblyscript-api#api-reference)をご覧ください。 +ドキュメント全文については、こちらをご覧ください。https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings マッピングファイルにログの出力を追加できます。詳細は[こちら](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference)をご覧ください。 ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 243009a4654..1fbe7dcad72 100644 --- a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Następnie tworzymy nową jednostkę zakładu. Identyfikatorem dla tego będzie Na koniec możemy zaktualizować podmiot Player, który będzie zawierał wszystkie dane. Tablice nie mogą być wypychane bezpośrednio, ale muszą zostać zaktualizowane, jak pokazano tutaj. Używamy identyfikatora, aby odnieść się do zakładu. A .save() jest wymagane na końcu do przechowywania obiektu. -Pełną dokumentację można zobaczyć tutaj: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Możesz także dodać dane wyjściowe rejestrowania do pliku mapowania, zobacz [tutaj](https://thegraph.com/docs/assemblyscript-api#api-reference). +Pełną dokumentację można zobaczyć tutaj: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Możesz także dodać dane wyjściowe rejestrowania do pliku mapowania, zobacz [tutaj](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 9c6a1e7ba3e..f89911ec9c6 100644 --- a/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Em seguida, criamos uma nova entidade Bet. O ID para isso sempre `event.transact Finalmente, nós podemos atualizar a entidade "Player" com todos os dados. Arrays não podem ser empurrados diretamente, mas precisam ser atualizados como mostrado aqui. Usamos o id para fazer referência à aposta. E `.save()` é necessário no final para armazenar uma entidade. -A documentação completa pode ser vista aqui: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Você também pode adicionar a saída do log ao arquivo de mapeamento, consultando [aqui](https://thegraph.com/docs/assemblyscript-api#api-reference). +A documentação completa pode ser vista aqui: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Você também pode adicionar a saída do log ao arquivo de mapeamento, consultando [aqui](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 07fd52b7136..f2cd03e6a20 100644 --- a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Apoi vom crea o nouă entitate Bet. The id for this will be `event.transaction.h Lastly we can update the Player entity with all the data. Matricele nu pot fi împinse direct, dar trebuie actualizate așa cum se arată aici. Folosim id-ul pentru a face referire la pariu. And `.save()` is required at the end to store an entity. -Puteți vedea aici documentația completă: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Puteți și adăuga rezultatele jurnalizării în fișierul de mapare; pentru aceasta, uitați-vă [aici](https://thegraph.com/docs/assemblyscript-api#api-reference). +Puteți vedea aici documentația completă: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Puteți și adăuga rezultatele jurnalizării în fișierul de mapare; pentru aceasta, uitați-vă [aici](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 5272506665c..6a2191a909a 100644 --- a/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Sonrasında yeni bir Bet varlığı oluştururuz. Bunun kimliği, her zaman benz Son olarak Player varlığını tüm verilerle güncelleyebiliriz. Diziler doğrudan aktarılamaz, ancak burada gösterildiği gibi güncellenmesi gerekir. Bahise başvurmak için id'yi kullanırız. Ve bir varlığı saklamak için sonunda `.save()` gereklidir. -Belgelerin tamamına buradan erişilebilir: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Ayrıca eşleştirme dosyasında kayıt çıktısı da ekleyebilirsiniz, [buraya](https://thegraph.com/docs/assemblyscript-api#api-reference) göz atın. +Belgelerin tamamına buradan erişilebilir: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Ayrıca eşleştirme dosyasında kayıt çıktısı da ekleyebilirsiniz, [buraya](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference) göz atın. ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 4a1fe4b257d..f2ea8cf2ab6 100644 --- a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ The Graph 中的映射文件定义了将传入事件转换为实体的函数。 最后,我们可以使用所有数据更新 Player 实体。 数组不能直接推送,需要按如下所示进行更新。 我们使用 id 来引用投注。 最后需要 `.save()` 来存储实体。 -完整的文档可以在这里看到:https://thegraph.com/docs/define-a-subgraph#writing-mappings。 您还可以将日志输出添加到映射文件,请参阅[此处](https://thegraph.com/docs/assemblyscript-api#api-reference)。 +完整的文档可以在这里看到:https://thegraph.com/docs/define-a-subgraph#writing-mappings。 您还可以将日志输出添加到映射文件,请参阅[此处](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference)。 ```typescript import { Bet, Player } from "../generated/schema" From 1615d289a6f761c07911c69926841e8981f140ca Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 20:00:35 -0500 Subject: [PATCH 041/368] change https://thegraph.com/docs/define-a-subgraph#the-subgraph-manifest to https://thegraph.com/docs/en/subgraphs/developing/creating/subgraph-manifest/ -https://web.archive.org/web/20201129154312/https://thegraph.com/docs/define-a-subgraph#the-subgraph-manifest graph docs updated so the slug changed but same content --- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 0e33a8b443b..e4e599e9f77 100644 --- a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -124,7 +124,7 @@ Anda bisa menentukan kontrak dan handler beragam di sini. Pengaturan umumnya aka Untuk alasan kenyamanan, Anda mungkin juga mau menggunakan peralatan templat seperti mustache. Then you create a `subgraph.template.yaml` and insert the addresses based on the latest deployments. Untuk pengaturan percontohan yang lebih canggih, lihat contoh [repo subgraph Aave](https://github.com/aave/aave-protocol/tree/master/thegraph). -Dan dokumentasi lengkapnya bisa dilihat di sini: https://thegraph.com/docs/define-a-subgraph#the-subgraph-manifest. +Dan dokumentasi lengkapnya bisa dilihat di sini: https://thegraph.com/docs/en/subgraphs/developing/creating/subgraph-manifest. ```yaml specVersion: 0.0.1 diff --git a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 1fbe7dcad72..2061eee3e89 100644 --- a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -124,7 +124,7 @@ Tutaj możesz zdefiniować wiele kontraktów i programów obsługi. Typowa konfi Dla wygody możesz również użyć narzędzia szablonu, takiego jak wąsy. Następnie tworzysz subgraph.template.yaml i wstawiasz adresy oparte na najnowszych wdrożeniach. Aby zapoznać się z bardziej zaawansowaną przykładową konfiguracją, zobacz na przykład [Repozytorium subgrafów Aave](https://github.com/aave/aave-protocol/tree/master/thegraph). -A pełną dokumentację można zobaczyć tutaj: https://thegraph.com/docs/define-a-subgraph#the-subgraph-manifest. +A pełną dokumentację można zobaczyć tutaj: https://thegraph.com/docs/en/subgraphs/developing/creating/subgraph-manifest. ```yaml specVersion: 0.0.1 diff --git a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index f2cd03e6a20..d9513e6a06e 100644 --- a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -124,7 +124,7 @@ Aici puteți defini mai multe contracte și manipulatoare. O configurare tipică Din comoditate, ați dori probabil să utilizați un instrument șablon, cum ar fi „mustache”. Then you create a `subgraph.template.yaml` and insert the addresses based on the latest deployments. Pentru a vedea un exemplu de configurare mai avansată, puteți consulta, de exemplu, [depozitarul subgraph-ului Aave](https://github.com/aave/aave-protocol/tree/master/thegraph). -Iar aici puteți vedea documentația completă: https://thegraph.com/docs/define-a-subgraph#the-subgraph-manifest. +Iar aici puteți vedea documentația completă: https://thegraph.com/docs/en/subgraphs/developing/creating/subgraph-manifest. ```yaml specVersion: 0.0.1 diff --git a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index f2ea8cf2ab6..86754d1b188 100644 --- a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -124,7 +124,7 @@ GameContract.events.BetPlaced({ 为方便起见,您可能还想使用像 mustache 这样的模板工具。 然后创建一个 `subgraph.template.yaml` 并根据最新部署插入地址。 有关更高级的示例设置,请参阅这个 [Aave subgraph repo](https://github.com/aave/aave-protocol/tree/master/thegraph) 示例。 -完整的文档可以在这里看到:https://thegraph.com/docs/define-a-subgraph#the-subgraph-manifest。 +完整的文档可以在这里看到:https://thegraph.com/docs/en/subgraphs/developing/creating/subgraph-manifest。 ```yaml specVersion: 0.0.1 From d0cbf9a94c015cce27e3b0a07834902c8e425837 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 20:05:03 -0500 Subject: [PATCH 042/368] change https://thegraph.com/docs/define-a-subgraph#the-graphql-schema to https://thegraph.com/docs/en/subgraphs/developing/creating/ql-schema ||| https://web.archive.org/web/20200324005040/https://thegraph.com/docs/define-a-subgraph#the-graphql-schema - graph docs updated so the slug changed but same content --- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index e4e599e9f77..a7c4f7057bb 100644 --- a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -167,7 +167,7 @@ Skema adalah definisi data GraphQL. Skema akan memungkinkan Anda menentukan enti - BigInt - BigDecimal -Anda bisa juga menggunakan entitas sebagai jenis untuk menentukan hubungan. Dalam contoh kita, kita menentukan 1 untuk banyak hubungan dari pemain ke taruhan. Tanda ! berarti nilai tidak boleh kosong. Dokumentasi lengkapnya bisa dilihat di sini: https://thegraph.com/docs/define-a-subgraph#the-graphql-schema. +Anda bisa juga menggunakan entitas sebagai jenis untuk menentukan hubungan. Dalam contoh kita, kita menentukan 1 untuk banyak hubungan dari pemain ke taruhan. Tanda ! berarti nilai tidak boleh kosong. Dokumentasi lengkapnya bisa dilihat di sini: https://thegraph.com/docs/en/subgraphs/developing/creating/ql-schema. ```graphql type Bet @entity { diff --git a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 2061eee3e89..4f9f21e993d 100644 --- a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -167,7 +167,7 @@ Schematem jest definicja danych GraphQL. Pozwoli to na zdefiniowanie istniejący - BigInt - BigDecimal -Możesz również używać obiektów jako typu do definiowania relacji. W naszym przykładzie definiujemy relacje od gracza do zakładów. ! oznacza, że ​​wartość nie może być pusta. Pełną dokumentację można zobaczyć tutaj: https://thegraph.com/docs/define-a-subgraph#the-graphql-schema. +Możesz również używać obiektów jako typu do definiowania relacji. W naszym przykładzie definiujemy relacje od gracza do zakładów. ! oznacza, że ​​wartość nie może być pusta. Pełną dokumentację można zobaczyć tutaj: https://thegraph.com/docs/en/subgraphs/developing/creating/ql-schema. ```graphql type Bet @entity { diff --git a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index d9513e6a06e..e233cc5da69 100644 --- a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -167,7 +167,7 @@ Schema este definiția datelor GraphQL. Aceasta vă va permite să definiți ce - BigInt - BigDecimal -De asemenea, puteți utiliza entitățile ca „tip” pentru a defini relațiile. În exemplul nostru definim o relație între 1-și-mai-mulți a unui jucător la pariuri. Semnul „!” ne spune că valoarea nu poate fi goală. Puteți vedea aici documentația completă: https://thegraph.com/docs/define-a-subgraph#the-graphql-schema. +De asemenea, puteți utiliza entitățile ca „tip” pentru a defini relațiile. În exemplul nostru definim o relație între 1-și-mai-mulți a unui jucător la pariuri. Semnul „!” ne spune că valoarea nu poate fi goală. Puteți vedea aici documentația completă: https://thegraph.com/docs/en/subgraphs/developing/creating/ql-schema. ```graphql type Bet @entity { diff --git a/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 6a2191a909a..39d8f1f4765 100644 --- a/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -167,7 +167,7 @@ dataSources: - BigInt - BigDecimal -İlişkileri tanımlamak için varlıkları tür olarak da kullanabilirsiniz. Örneğimizde, oyuncudan bahislere "1'e çok" ilişkisi tanımladık. "!", değerin boş olamayacağı anlamına gelir. Belgelerin tamamına [buradan](https://thegraph.com/docs/define-a-subgraph#the-graphql-schema) erişilebilir. +İlişkileri tanımlamak için varlıkları tür olarak da kullanabilirsiniz. Örneğimizde, oyuncudan bahislere "1'e çok" ilişkisi tanımladık. "!", değerin boş olamayacağı anlamına gelir. Belgelerin tamamına [buradan](https://thegraph.com/docs/en/subgraphs/developing/creating/ql-schema) erişilebilir. ```graphql type Bet @entity { diff --git a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 86754d1b188..af8d5f0f1ca 100644 --- a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -167,7 +167,7 @@ dataSources: - 大整数 - 大十进制数 -您还可以使用实体作为类型来定义关系。 在我们的示例中,我们定义了从玩家到投注的一对多关系。 感叹号(!) 表示值不能为空。 完整的文档可以在这里看到:https://thegraph.com/docs/define-a-subgraph#the-graphql-schema。 +您还可以使用实体作为类型来定义关系。 在我们的示例中,我们定义了从玩家到投注的一对多关系。 感叹号(!) 表示值不能为空。 完整的文档可以在这里看到:https://thegraph.com/docs/en/subgraphs/developing/creating/ql-schema。 ```graphql type Bet @entity { From 7be0867a5201d3ad3979a3539f921aa3a49046e7 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 20:10:07 -0500 Subject: [PATCH 043/368] change https://thegraph.com/docs/define-a-subgraph#writing-mappings to https://thegraph.com/docs/en/subgraphs/developing/creating/assemblyscript-mappings/#writing-mappings ||| https://web.archive.org/web/20200324005040/https://thegraph.com/docs/define-a-subgraph#writing-mappings - graph docs updated so the slug changed but same content --- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- .../tutorials/the-graph-fixing-web3-data-querying/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index a7c4f7057bb..2256bf0bec3 100644 --- a/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/id/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Lalu kita membuat entitas Bet baru. The id for this will be `event.transaction.h Lastly we can update the Player entity with all the data. Array tidak boleh didorong secara langsung, tapi perlu diperbarui seperti yang ditunjukkan di sini. Kita menggunakan id untuk merujuk pada taruhannya. And `.save()` is required at the end to store an entity. -Dokumentasi lengkapnya bisa dilihat di sini: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Anda juga bisa menambahkan output yang membuat log ke file pemetaan, lihat [di sini](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). +Dokumentasi lengkapnya bisa dilihat di sini: https://thegraph.com/docs/en/subgraphs/developing/creating/assemblyscript-mappings/#writing-mappings. Anda juga bisa menambahkan output yang membuat log ke file pemetaan, lihat [di sini](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 4f9f21e993d..4c8a2303ae3 100644 --- a/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/pl/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Następnie tworzymy nową jednostkę zakładu. Identyfikatorem dla tego będzie Na koniec możemy zaktualizować podmiot Player, który będzie zawierał wszystkie dane. Tablice nie mogą być wypychane bezpośrednio, ale muszą zostać zaktualizowane, jak pokazano tutaj. Używamy identyfikatora, aby odnieść się do zakładu. A .save() jest wymagane na końcu do przechowywania obiektu. -Pełną dokumentację można zobaczyć tutaj: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Możesz także dodać dane wyjściowe rejestrowania do pliku mapowania, zobacz [tutaj](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). +Pełną dokumentację można zobaczyć tutaj: https://thegraph.com/docs/en/subgraphs/developing/creating/assemblyscript-mappings/#writing-mappings. Możesz także dodać dane wyjściowe rejestrowania do pliku mapowania, zobacz [tutaj](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index e233cc5da69..fd0c5885011 100644 --- a/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/ro/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Apoi vom crea o nouă entitate Bet. The id for this will be `event.transaction.h Lastly we can update the Player entity with all the data. Matricele nu pot fi împinse direct, dar trebuie actualizate așa cum se arată aici. Folosim id-ul pentru a face referire la pariu. And `.save()` is required at the end to store an entity. -Puteți vedea aici documentația completă: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Puteți și adăuga rezultatele jurnalizării în fișierul de mapare; pentru aceasta, uitați-vă [aici](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). +Puteți vedea aici documentația completă: https://thegraph.com/docs/en/subgraphs/developing/creating/assemblyscript-mappings/#writing-mappings. Puteți și adăuga rezultatele jurnalizării în fișierul de mapare; pentru aceasta, uitați-vă [aici](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference). ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 39d8f1f4765..1ee83828ab6 100644 --- a/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/tr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ Sonrasında yeni bir Bet varlığı oluştururuz. Bunun kimliği, her zaman benz Son olarak Player varlığını tüm verilerle güncelleyebiliriz. Diziler doğrudan aktarılamaz, ancak burada gösterildiği gibi güncellenmesi gerekir. Bahise başvurmak için id'yi kullanırız. Ve bir varlığı saklamak için sonunda `.save()` gereklidir. -Belgelerin tamamına buradan erişilebilir: https://thegraph.com/docs/define-a-subgraph#writing-mappings. Ayrıca eşleştirme dosyasında kayıt çıktısı da ekleyebilirsiniz, [buraya](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference) göz atın. +Belgelerin tamamına buradan erişilebilir: https://thegraph.com/docs/en/subgraphs/developing/creating/assemblyscript-mappings/#writing-mappings. Ayrıca eşleştirme dosyasında kayıt çıktısı da ekleyebilirsiniz, [buraya](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference) göz atın. ```typescript import { Bet, Player } from "../generated/schema" diff --git a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index af8d5f0f1ca..7608d467ad9 100644 --- a/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/zh/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -196,7 +196,7 @@ The Graph 中的映射文件定义了将传入事件转换为实体的函数。 最后,我们可以使用所有数据更新 Player 实体。 数组不能直接推送,需要按如下所示进行更新。 我们使用 id 来引用投注。 最后需要 `.save()` 来存储实体。 -完整的文档可以在这里看到:https://thegraph.com/docs/define-a-subgraph#writing-mappings。 您还可以将日志输出添加到映射文件,请参阅[此处](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference)。 +完整的文档可以在这里看到:https://thegraph.com/docs/en/subgraphs/developing/creating/assemblyscript-mappings/#writing-mappings。 您还可以将日志输出添加到映射文件,请参阅[此处](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference)。 ```typescript import { Bet, Player } from "../generated/schema" From 70a2e5b27a33e1cb61323bdd6dcd3d86cb1bcdd4 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 20:14:45 -0500 Subject: [PATCH 044/368] change https://thegraph.com/docs/define-a-subgraph to https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph/ ||| https://web.archive.org/web/20200324005040/https://thegraph.com/docs/define-a-subgraph - graph docs updated so the slug changed but same content --- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/content/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 15527d37798..d92838acb9c 100644 --- a/public/content/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -54,7 +54,7 @@ While [Web3](https://docs.web3js.org/) is still mostly used, [ethers.js](https:/ Usually you would fetch data from your smart contract directly. Want to read the time of the latest trade? Just call `MyContract.methods.latestTradeTime().call()` which fetches the data from an Ethereum node into your dapp. But what if you need hundreds of different data points? That would result in hundreds of data fetches to the node, each time requiring an [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) making your dapp slow and inefficient. One workaround might be a fetcher call function inside your contract that returns multiple data at once. This is not always ideal though. -And then you might be interested in historical data as well. You want to know not only the last trade time, but the times for all trades that you ever did yourself. Use the _create-eth-app_ subgraph package, read the [documentation](https://thegraph.com/docs/define-a-subgraph) and adapt it to your own contracts. If you are looking for popular smart contracts, there may even already be a subgraph. Check out the [subgraph explorer](https://thegraph.com/explorer/). +And then you might be interested in historical data as well. You want to know not only the last trade time, but the times for all trades that you ever did yourself. Use the _create-eth-app_ subgraph package, read the [documentation](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) and adapt it to your own contracts. If you are looking for popular smart contracts, there may even already be a subgraph. Check out the [subgraph explorer](https://thegraph.com/explorer/). Once you have a subgraph, it allows you to write one simple query in your dapp that retrieves all the important blockchain data including historical ones that you need, only one fetch required. diff --git a/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index 5312d1ab50d..3eadf3da534 100644 --- a/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -59,7 +59,7 @@ A pesar de que [Web3](https://docs.web3js.org/) es todavia la opcion más usada, Normalmente, conseguirá los datos directamente de su contrato inteligente. ¿Quieres saber la hora de la última operación? Tan solo escriba `MyContract.methods.latestTradeTime().call()` que obtiene los datos de un nodo de Ethereum a su DApp. Pero, ¿qué pasa si se necesitan cientos de puntos de datos diferentes? Eso resultaría en centenares de solicitudes de datos al nodo, con su [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) cada una de ellas, lo que ralentizaría e inutiliaría a su DApp. Una alternativa sería instalar una función de obtención en su contrato que devuelva varios datos a la vez. Aunque no siempre es lo ideal. -O también puede que le interese obtener datos históricos. Quiere saber no sólo la fecha de la última operación, sino también la de todas las operaciones que haya realizado alguna vez. Puede utilizar el paquete de subgrafo de _create-eth-app_, leer la [documentación](https://thegraph.com/docs/define-a-subgraph) y adaptarlo a sus propios contratos. Si busca contratos inteligentes populares, puede que incluso ya exista un subgrafo. Compruebe el [explorador de subgrafo](https://thegraph.com/explorer/). +O también puede que le interese obtener datos históricos. Quiere saber no sólo la fecha de la última operación, sino también la de todas las operaciones que haya realizado alguna vez. Puede utilizar el paquete de subgrafo de _create-eth-app_, leer la [documentación](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) y adaptarlo a sus propios contratos. Si busca contratos inteligentes populares, puede que incluso ya exista un subgrafo. Compruebe el [explorador de subgrafo](https://thegraph.com/explorer/). Una vez tenga un subgrafo, este le permitirá escribir una sencilla consulta en su DApp que recupera todos los datos importantes de la cadena de bloques, incluyendo los datos históricos que necesita, solo con activar esta funcionalidad una vez. diff --git a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 1ec0b9131ff..01dde279ba2 100644 --- a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -59,7 +59,7 @@ Si [Web3](https://docs.web3js.org/) est encore largement utilisé, [ethers.js](h Vous récupérez normalement directement les données de votre contrat intelligent. Vous souhaitez connaître l'instant précis de la dernière transaction ? Appelez simplement `MyContract.methods.latestTradeTime().call()` qui récupère les données d'un nœud Ethereum comme Infura dans votre dApp. Mais que faire si vous avez besoin de centaines de points de données différents ? Il en résulterait des centaines d'extractions de données vers le nœud, nécessitant à chaque fois un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) qui ralentirait votre dApp et lui ferait perdre son efficacité. Pour éviter cela, une solution pourrait être d'utiliser une fonction d'appel de récupération dans votre contrat qui restitue plusieurs données à la fois. Ce n'est cependant pas toujours idéal. -Vous pourriez également être intéressé par les données historiques. Vous souhaitez peut-être connaître non seulement le moment de la dernière transaction mais également le moment de chacune des transactions que vous avez réalisées vous-même. Utilisez le paquet subgraph de _create-eth-app_, lisez la [documentation](https://thegraph.com/docs/define-a-subgraph) et adaptez-la à vos propres contrats. Si vous êtes à la recherche de contrats intelligents populaires, il se peut même qu'il en existe déjà un avec subgraph. Jetez un œil à [l'explorateur de sous-graphes](https://thegraph.com/explorer/). +Vous pourriez également être intéressé par les données historiques. Vous souhaitez peut-être connaître non seulement le moment de la dernière transaction mais également le moment de chacune des transactions que vous avez réalisées vous-même. Utilisez le paquet subgraph de _create-eth-app_, lisez la [documentation](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) et adaptez-la à vos propres contrats. Si vous êtes à la recherche de contrats intelligents populaires, il se peut même qu'il en existe déjà un avec subgraph. Jetez un œil à [l'explorateur de sous-graphes](https://thegraph.com/explorer/). Une fois que vous disposez d'un subgraph, vous pouvez écrire une simple requête dans votre dApp afin de récupérer toutes les données importantes de la blockchain, y compris les données historiques dont vous avez besoin. Une seule demande de récupération suffit. diff --git a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index b756c45d627..3fd2391426c 100644 --- a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -59,7 +59,7 @@ Si [Web3](https://docs.web3js.org/) est encore largement utilisé, [ethers.js](h Vous récupérez normalement directement les données de votre contrat intelligent. Vous souhaitez connaître l'instant précis de la dernière transaction ? Appelez simplement `MyContract.methods.latestTradeTime().call()` qui récupère les données d'un nœud Ethereum comme Infura dans votre dApp. Mais que faire si vous avez besoin de centaines de points de données différents ? Il en résulterait des centaines d'extractions de données vers le nœud, nécessitant à chaque fois un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) qui ralentirait votre dApp et lui ferait perdre son efficacité. Pour éviter cela, une solution pourrait être d'utiliser une fonction d'appel de récupération dans votre contrat qui restitue plusieurs données à la fois. Ce n'est cependant pas toujours idéal. -Vous pourriez également être intéressé par les données historiques. Vous souhaitez peut-être connaître non seulement le moment de la dernière transaction mais également le moment de chacune des transactions que vous avez réalisées vous-même. Utilisez le paquet subgraph de _create-eth-app_, lisez la [documentation](https://thegraph.com/docs/define-a-subgraph) et adaptez-la à vos propres contrats. Si vous êtes à la recherche de contrats intelligents populaires, il se peut même qu'il en existe déjà un avec subgraph. Jetez un œil à [l'explorateur de sous-graphes](https://thegraph.com/explorer/). +Vous pourriez également être intéressé par les données historiques. Vous souhaitez peut-être connaître non seulement le moment de la dernière transaction mais également le moment de chacune des transactions que vous avez réalisées vous-même. Utilisez le paquet subgraph de _create-eth-app_, lisez la [documentation](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) et adaptez-la à vos propres contrats. Si vous êtes à la recherche de contrats intelligents populaires, il se peut même qu'il en existe déjà un avec subgraph. Jetez un œil à [l'explorateur de sous-graphes](https://thegraph.com/explorer/). Une fois que vous disposez d'un subgraph, vous pouvez écrire une simple requête dans votre dApp afin de récupérer toutes les données importantes de la blockchain, y compris les données historiques dont vous avez besoin. Une seule demande de récupération suffit. diff --git a/public/content/translations/id/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/id/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index c14da4eefaa..aa19635614a 100644 --- a/public/content/translations/id/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/id/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -59,7 +59,7 @@ Meskipun [Web3](https://docs.web3js.org/) masih menjadi yang paling sering digun Biasanya Anda akan mengambil data dari kontrak pintar Anda secara langsung. Ingin membaca waktu perdagangan terbaru? Cukup panggil `MyContract.methods.latestTradeTime().call()` yang mengambilkan data dari node Ethereum seperti Infura ke dalam Dapp Anda. Tetapi bagaimana jika Anda membutuhkan ratusan titik data yang berbeda? Itu akan menghasilkan ratusan pengambilan data ke node, yang setiap kali pengambilan memerlukan [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) yang membuat Dapp Anda menjadi lambat dan tidak efisien. Satu solusi untuk ini mungkin adalah dengan menggunakan fungsi pemanggilan pengambil di dalam kontrak Anda yang mengembalikan beberapa data sekaligus. Namun, ini tidak selalu merupakan cara yang ideal. -Lalu, Anda juga mungkin tertarik dengan data riwayat. Anda ingin mengetahui tidak hanya waktu perdagangan terakhir, tapi juga waktu dari semua perdagangan yang pernah Anda lakukan sendiri. Gunakan paket subgraph _create-eth-app_, baca [dokumentasi](https://thegraph.com/docs/define-a-subgraph) dan sesuaikan dengan kontrak Anda. Jika Anda berencana menggunakan kontrak pintar populer, mungkin telah ada subgraph di dalamnya. Lihat [penjelajah subgraph](https://thegraph.com/explorer/). +Lalu, Anda juga mungkin tertarik dengan data riwayat. Anda ingin mengetahui tidak hanya waktu perdagangan terakhir, tapi juga waktu dari semua perdagangan yang pernah Anda lakukan sendiri. Gunakan paket subgraph _create-eth-app_, baca [dokumentasi](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) dan sesuaikan dengan kontrak Anda. Jika Anda berencana menggunakan kontrak pintar populer, mungkin telah ada subgraph di dalamnya. Lihat [penjelajah subgraph](https://thegraph.com/explorer/). Setelah memiliki subgraph, ini memungkinkan Anda menulis kueri sederhana di Dapp Anda yang mengambil semua data blockchain penting termasuk data riwayat yang Anda perlukan, cukup dengan satu kali pengambilan. diff --git a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index d7d41a671ee..37d839255f4 100644 --- a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -59,7 +59,7 @@ Mentre [Web3](https://docs.web3js.org/) è ancora molto usato, nell'ultimo anno Solitamente recupereresti i dati direttamente dal tuo smart contract. Vuoi leggere l'ora dell'ultima operazione? Basta chiamare `MyContract.methods.latestTradeTime().call()`, che recupera i dati da un nodo di Ethereum nella tua dapp. E se ci fossero centinaia di punti di dati diversi? Ciò risulterebbe in centinaia di recuperi di dati al nodo, richiedendo ogni volta un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) e rendendo la tua dapp lenta e inefficace. Una scappatoia potrebbe essere una funzione di chiamata del recuperatore nel tuo contratto, in modo da restituire più dati in una volta. Questa soluzione però non è sempre ideale. -E poi potresti essere interessato anche ai dati storici. Vuoi sapere non solo l'orario dell'ultima operazione, ma gli orari per tutte le operazioni che tu stesso hai mai eseguito? Usa il pacchetto subgraph _create-eth-app_, leggi la [documentazione](https://thegraph.com/docs/define-a-subgraph) e adattalo ai tuoi contratti. Se stai cercando degli smart contract popolari, potrebbe anche esistere già un subgraph. Dai un'occhiata al [subgraph explorer](https://thegraph.com/explorer/). +E poi potresti essere interessato anche ai dati storici. Vuoi sapere non solo l'orario dell'ultima operazione, ma gli orari per tutte le operazioni che tu stesso hai mai eseguito? Usa il pacchetto subgraph _create-eth-app_, leggi la [documentazione](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) e adattalo ai tuoi contratti. Se stai cercando degli smart contract popolari, potrebbe anche esistere già un subgraph. Dai un'occhiata al [subgraph explorer](https://thegraph.com/explorer/). Una volta che hai un grafico secondario, ti consente di scrivere una semplice richiesta nella tua dapp che recuperi tutti i dati importanti della blockchain, inclusi quelli storici che necessiti, tramite un solo recupero necessario. diff --git a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index d7d41a671ee..37d839255f4 100644 --- a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -59,7 +59,7 @@ Mentre [Web3](https://docs.web3js.org/) è ancora molto usato, nell'ultimo anno Solitamente recupereresti i dati direttamente dal tuo smart contract. Vuoi leggere l'ora dell'ultima operazione? Basta chiamare `MyContract.methods.latestTradeTime().call()`, che recupera i dati da un nodo di Ethereum nella tua dapp. E se ci fossero centinaia di punti di dati diversi? Ciò risulterebbe in centinaia di recuperi di dati al nodo, richiedendo ogni volta un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) e rendendo la tua dapp lenta e inefficace. Una scappatoia potrebbe essere una funzione di chiamata del recuperatore nel tuo contratto, in modo da restituire più dati in una volta. Questa soluzione però non è sempre ideale. -E poi potresti essere interessato anche ai dati storici. Vuoi sapere non solo l'orario dell'ultima operazione, ma gli orari per tutte le operazioni che tu stesso hai mai eseguito? Usa il pacchetto subgraph _create-eth-app_, leggi la [documentazione](https://thegraph.com/docs/define-a-subgraph) e adattalo ai tuoi contratti. Se stai cercando degli smart contract popolari, potrebbe anche esistere già un subgraph. Dai un'occhiata al [subgraph explorer](https://thegraph.com/explorer/). +E poi potresti essere interessato anche ai dati storici. Vuoi sapere non solo l'orario dell'ultima operazione, ma gli orari per tutte le operazioni che tu stesso hai mai eseguito? Usa il pacchetto subgraph _create-eth-app_, leggi la [documentazione](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) e adattalo ai tuoi contratti. Se stai cercando degli smart contract popolari, potrebbe anche esistere già un subgraph. Dai un'occhiata al [subgraph explorer](https://thegraph.com/explorer/). Una volta che hai un grafico secondario, ti consente di scrivere una semplice richiesta nella tua dapp che recuperi tutti i dati importanti della blockchain, inclusi quelli storici che necessiti, tramite un solo recupero necessario. diff --git a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 5e6620e58c5..89e4e78a7e2 100644 --- a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -62,7 +62,7 @@ yarn react-app:start 通常、スマートコントラクトからは直接データを取得することができます。 最後に行った取引の時間を取得したい場合は、 `MyContract.methods.latestTradeTime().call()`を呼び出すだけで、infura のようなイーサリアムノードからデータを取得し、あなたの Dapp で使うことができます。 しかし、何百もの異なる種類のデータが必要な場合は事情が異なります。 ノードからのデータ取得が何百回も発生し、その都度[RTT](https://wikipedia.org/wiki/Round-trip_delay_time)が必要となるため、Dapp の処理速度が低下し、非効率になってしまいます。 ひとつの回避策としては、一度に複数のデータを返すデータ取得用の関数をスマートコントラクト側で用意する方法があるでしょう。 しかし、これは常に最善の方法とは言えません。 -また、過去のデータが必要な場合もあるでしょう。 最後の取引の時間だけではなく、今まで自分が行った全ての取引の時間が知りたいかもしれません。 このような場合は、*create-eth-app*にある subgraph パッケージを活用できます。[ドキュメンテーション](https://thegraph.com/docs/define-a-subgraph)を参照して、あなたのニーズに合うように調整してください。 人気が高いスマートコントラクトの場合、すでに subgraph が含まれているかもしれません。 [subgraph explorer](https://thegraph.com/explorer/)をチェックしてみてください。 +また、過去のデータが必要な場合もあるでしょう。 最後の取引の時間だけではなく、今まで自分が行った全ての取引の時間が知りたいかもしれません。 このような場合は、*create-eth-app*にある subgraph パッケージを活用できます。[ドキュメンテーション](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph)を参照して、あなたのニーズに合うように調整してください。 人気が高いスマートコントラクトの場合、すでに subgraph が含まれているかもしれません。 [subgraph explorer](https://thegraph.com/explorer/)をチェックしてみてください。 subgraph があれば、Dapp にシンプルなクエリをひとつ追加するだけで、過去のデータも含めた全てのブロックチェーンのデータを 1 回のフェッチ処理で取得することができます。 diff --git a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index 1a832f05ffb..b3c8401f9d9 100644 --- a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -59,7 +59,7 @@ yarn react-app:start 通常、スマートコントラクトからは直接データを取得することができます。 最後に行った取引の時間を取得したい場合は、 `MyContract.methods.latestTradeTime().call()`を呼び出すだけで、イーサリアムノードからデータを取得し、あなたのDappで使うことができます。 しかし、何百もの異なる種類のデータが必要な場合は事情が異なります。 ノードからのデータ取得が何百回も発生し、その都度[RTT](https://wikipedia.org/wiki/Round-trip_delay_time)が必要となるため、Dappの処理速度が低下し、非効率になってしまいます。 ひとつの回避策としては、一度に複数のデータを返すデータ取得用の関数をスマートコントラクト側で用意する方法があるでしょう。 しかし、これは常に最善の方法とは言えません。 -また、過去のデータが必要な場合もあるでしょう。 最後の取引の時間だけではなく、今まで自分が行った全ての取引の時間が知りたいかもしれません。 このような場合は、_create-eth-app_にあるsubgraphパッケージを活用できます。[ドキュメンテーション](https://thegraph.com/docs/define-a-subgraph)を参照して、あなたのニーズに合うように調整してください。 人気が高いスマートコントラクトの場合、すでにsubgraphが含まれているかもしれません。 [subgraph explorer](https://thegraph.com/explorer/)をチェックしてみてください。 +また、過去のデータが必要な場合もあるでしょう。 最後の取引の時間だけではなく、今まで自分が行った全ての取引の時間が知りたいかもしれません。 このような場合は、_create-eth-app_にあるsubgraphパッケージを活用できます。[ドキュメンテーション](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph)を参照して、あなたのニーズに合うように調整してください。 人気が高いスマートコントラクトの場合、すでにsubgraphが含まれているかもしれません。 [subgraph explorer](https://thegraph.com/explorer/)をチェックしてみてください。 subgraphがあれば、Dappにシンプルなクエリをひとつ追加するだけで、過去のデータも含めた全てのブロックチェーンのデータを1回のフェッチ処理で取得することができます。 diff --git a/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index d96aa4a5e30..e0b621bfcc2 100644 --- a/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -59,7 +59,7 @@ Enquanto o [Web3](https://docs.web3js.org/) ainda é mais usado, [ethers. s](htt Geralmente, você obteria dados diretamente do seu contrato inteligente. Gostaria de saber o horário da última transação? Basta chamar `MyContract.methods.latestTradeTime().call()` que busca os dados de um nó Ethereum em seu dapp. Mas e se você precisar de centenas de pontos de dados diferentes? Isso resultaria em centenas de buscas de dados para o nó, cada vez exigindo um [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) tornando seu dapp lento e ineficiente. Uma solução alternativa pode ser uma função de busca de chamadas dentro do seu contrato que retorna vários dados de uma só vez. Mas nem sempre é o ideal. -E então talvez também estejam interessados em dados históricos. Você quer saber não apenas a última troca, mas também os tempos para todas as negociações que você já fez. Use o _create-eth-app_ pacote de subgráfico, leia a [documentação](https://thegraph.com/docs/define-a-subgraph) e adapte-a aos seus próprios contratos. Se você estiver procurando contratos inteligentes populares, pode até ser que já exista um subgrafo. Confira o [explorador de subgrafos](https://thegraph.com/explorer/). +E então talvez também estejam interessados em dados históricos. Você quer saber não apenas a última troca, mas também os tempos para todas as negociações que você já fez. Use o _create-eth-app_ pacote de subgráfico, leia a [documentação](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) e adapte-a aos seus próprios contratos. Se você estiver procurando contratos inteligentes populares, pode até ser que já exista um subgrafo. Confira o [explorador de subgrafos](https://thegraph.com/explorer/). Ao obter um subgrafo, você pode escrever uma consulta simples em seu dapp para recuperar todos os dados importantes da blockchain, incluindo os históricos de que você precisa — basta uma única busca. diff --git a/public/content/translations/ro/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/ro/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 62a13c05275..a165da0dfe7 100644 --- a/public/content/translations/ro/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/ro/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -59,7 +59,7 @@ Chiar dacă [Web3](https://docs.web3js.org/) este încă utilizat cel mai des, s În mod normal, ați prelua date direct din contractul dvs. inteligent. Doriți să citiți ora ultimei tranzacții? Trebuie doar să apelați `MyContract.methods.latestTradeTime().call()`, care preia datele dintr-un nod Ethereum precum Infura în aplicația dvs. Dapp. Dar dacă aveți nevoie de sute de puncte de date diferite? Acest lucru ar duce la preluarea a sute de date către nod, de fiecare dată fiind nevoie de un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time), ceea ce face ca aplicaţia dvs. Dapp să fie înceată și ineficientă. O soluţie ar putea fi o apelare a unei funcții fetcher în cadrul contractului care răspunde prin mai multe date simultan. Totuși, nu este întotdeauna ideal să acţionăm astfel. -În plus, v-ar putea interesa şi nişte date istorice. Vreţi să știți nu numai data ultimei tranzacții, ci și datele pentru toate tranzacțiile pe care le-ați făcut vreodată. Utilizați pachetul subgraph din _create-eth-app_, citiți [documentația](https://thegraph.com/docs/define-a-subgraph) și adaptați-l la propriile contracte. Dacă sunteți în căutarea unor contracte inteligente cunoscute, este posibil să existe deja un subgraf. Accesați [exploratorul de subgrafuri](https://thegraph.com/explorer/). +În plus, v-ar putea interesa şi nişte date istorice. Vreţi să știți nu numai data ultimei tranzacții, ci și datele pentru toate tranzacțiile pe care le-ați făcut vreodată. Utilizați pachetul subgraph din _create-eth-app_, citiți [documentația](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) și adaptați-l la propriile contracte. Dacă sunteți în căutarea unor contracte inteligente cunoscute, este posibil să existe deja un subgraf. Accesați [exploratorul de subgrafuri](https://thegraph.com/explorer/). Odată ce aveți un subgraf, acesta vă permite să scrieți o simplă interogare în aplicația dvs. Dapp, care preia toate datele importante din blockchain, inclusiv cele istorice de care aveți nevoie, fiind necesară doar o preluare. diff --git a/public/content/translations/tr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/tr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index dd7ee389bd3..1efd193befd 100644 --- a/public/content/translations/tr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/tr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -59,7 +59,7 @@ Hâlâ çoğunlukla [Web3](https://docs.web3js.org/) kullanılıyor olsa da, [et Genellikle akıllı sözleşmenizden doğrudan veri alırsınız. En son işlemin gerçekleştiği zamanı okumak mı istiyorsunuz? Sadece Ethereum düğümünden merkeziyetsiz uygulamanıza veriyi getiren `MyContract.methods.latestTradeTime().call()`'u çağırın. Peki ya yüzlerce farklı veri noktasına ihtiyacınız varsa? Bu, düğüme yüzlerce veri alınmasına yol açar ve bu alımların her biri bir [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) gerektirerek merkeziyetsiz uygulamanızı yavaş ve verimsiz hâle getirir. Bir geçici çözüm, sözleşmenizin içinde aynı anda birden çok veri döndüren bir alıcı çağrı işlevi olabilir. Ancak bu her zaman ideal değildir. -Tarihsel verilerle de ilgileniyor olabilirsiniz. Yalnızca son işlem zamanını değil, kendi yaptığınız tüm işlemlerin zamanlarını da bilmek istiyorsunuz. _create-eth-app_ alt grafik paketini kullanın, [belgeleri](https://thegraph.com/docs/define-a-subgraph) okuyun ve kendi sözleşmelerinize uyarlayın. Popüler akıllı sözleşmeler arıyorsanız, zaten bir alt grafik bile olabilir. [Alt grafik gezgini](https://thegraph.com/explorer/)'ne bir göz atın. +Tarihsel verilerle de ilgileniyor olabilirsiniz. Yalnızca son işlem zamanını değil, kendi yaptığınız tüm işlemlerin zamanlarını da bilmek istiyorsunuz. _create-eth-app_ alt grafik paketini kullanın, [belgeleri](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) okuyun ve kendi sözleşmelerinize uyarlayın. Popüler akıllı sözleşmeler arıyorsanız, zaten bir alt grafik bile olabilir. [Alt grafik gezgini](https://thegraph.com/explorer/)'ne bir göz atın. Bir alt grafiğiniz olduğunda, ihtiyacınız olan geçmiş veriler de dahil olmak üzere tüm önemli blok zinciri verilerini alan merkeziyetsiz uygulamanıza basit bir sorgu yazmanıza olanak tanır, yalnızca tek bir getirme gerekir. diff --git a/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index d31a112d8dd..6542d826611 100644 --- a/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -59,7 +59,7 @@ yarn react-app:start 通常您会直接从您的智能合约中获取数据。 想要读取上次交易的时间吗? 只需调用 `MyContract.methods.latestTradeTime().call()`,它将数据从以太坊节点(如 Infura)提取到你的去中心化应用程序。 但如果您需要数百个不同的数据点,该怎么办? 这将导致在节点上进行数百次数据提取操作,每次都有[往返延时](https://wikipedia.org/wiki/Round-trip_delay_time),使你的去中心化应用程序缓慢且效率低下。 一个变通的办法是在您的合约中设置一个取数器调用函数,一次性返回多个数据。 但这并不总是理想的。 -然后您可能对历史数据也感兴趣。 您不仅想知道上次交易的时间,还想知道自己做过的所有交易的时间。 使用 _create-eth-app_ 子图包,阅读[文档](https://thegraph.com/docs/define-a-subgraph)并使其适合您自己的合约。 如果您正在寻找受欢迎的智能合约,甚至可能已经有了一个子图。 可以查看[子图浏览器](https://thegraph.com/explorer/)。 +然后您可能对历史数据也感兴趣。 您不仅想知道上次交易的时间,还想知道自己做过的所有交易的时间。 使用 _create-eth-app_ 子图包,阅读[文档](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph)并使其适合您自己的合约。 如果您正在寻找受欢迎的智能合约,甚至可能已经有了一个子图。 可以查看[子图浏览器](https://thegraph.com/explorer/)。 有了子图后,你可以在去中心化应用程序中编写一个简单的查询来检索所有重要的区块链数据,包括你需要的历史数据,并且只需一次提取操作即可。 diff --git a/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index 3fe08c87523..f48d99eb8e7 100644 --- a/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -59,7 +59,7 @@ yarn react-app:start 通常你会直接从你的智能合约中获取数据。 想要读取上次交易的时间吗? 只需调用 `MyContract.methods.latestTradeTime().call()`,它会从以太坊节点获取数据并传输到你的去中心化应用程序中。 但如果你需要数百个不同的数据点,该怎么办? 这将导致在节点上进行数百次数据提取操作,每次都有[往返延时](https://wikipedia.org/wiki/Round-trip_delay_time),使你的去中心化应用程序缓慢且效率低下。 一个变通的办法是在你的合约中设置一个取数器调用函数,一次性返回多个数据。 但这并不总是理想的。 -然后你可能对历史数据也感兴趣。 你不仅想知道上次交易的时间,还想知道自己做过的所有交易的时间。 使用 _create-eth-app_ 子图包,阅读[文档](https://thegraph.com/docs/define-a-subgraph)并使其适合你自己的合约。 如果你正在寻找受欢迎的智能合约,甚至可能已经有了一个子图。 可以查看[子图浏览器](https://thegraph.com/explorer/)。 +然后你可能对历史数据也感兴趣。 你不仅想知道上次交易的时间,还想知道自己做过的所有交易的时间。 使用 _create-eth-app_ 子图包,阅读[文档](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph)并使其适合你自己的合约。 如果你正在寻找受欢迎的智能合约,甚至可能已经有了一个子图。 可以查看[子图浏览器](https://thegraph.com/explorer/)。 有了子图后,你可以在去中心化应用程序中编写一个简单的查询来检索所有重要的区块链数据,包括你需要的历史数据,并且只需一次提取操作即可。 From d845d27cf20d6af917dcf4e7deb61e0b4c1723ef Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 10 Feb 2025 20:25:32 -0500 Subject: [PATCH 045/368] change https://thegraph.com/docs/network#overview to https://thegraph.com/docs/en/about/ ||| https://web.archive.org/web/20210928211025/https://thegraph.com/docs/about/network - graph docs updated most probable replacement --- .../translations/id/developers/docs/data-and-analytics/index.md | 2 +- .../translations/pl/developers/docs/data-and-analytics/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/id/developers/docs/data-and-analytics/index.md b/public/content/translations/id/developers/docs/data-and-analytics/index.md index c3fa664645a..412bfc608b3 100644 --- a/public/content/translations/id/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/id/developers/docs/data-and-analytics/index.md @@ -30,6 +30,6 @@ Pengembang kemudian dapat memroses dan mengubah data ini untuk memberikan wawasa ## Bacaan Lebih Lanjut {#further-reading} -- [Gambaran Umum Graph Network](https://thegraph.com/docs/network#overview) +- [Gambaran Umum Graph Network](https://thegraph.com/docs/en/about) - [Playground Query Graph](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Contoh kode API pada EtherScan](https://etherscan.io/apis#contracts) diff --git a/public/content/translations/pl/developers/docs/data-and-analytics/index.md b/public/content/translations/pl/developers/docs/data-and-analytics/index.md index 58c329c5e49..68cc6abbbf9 100644 --- a/public/content/translations/pl/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/pl/developers/docs/data-and-analytics/index.md @@ -30,6 +30,6 @@ Programiści mogą następnie przetwarzać i przekształcać te dane, aby umożl ## Dalsza lektura {#further-reading} -- [Przegląd Graph Network](https://thegraph.com/docs/network#overview) +- [Przegląd Graph Network](https://thegraph.com/docs/en/about) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Przykłady kodu API w EtherScan](https://etherscan.io/apis#contracts) From bb8f544dc6d7171fd739722ca5fdb96b2715e2a8 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 14:07:08 -0500 Subject: [PATCH 046/368] change https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2 to https://www.apollographql.com/blog/apollo-client-now-with-react-hooks - apollographql removed hash from slugs --- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/content/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index d92838acb9c..56f84a32c28 100644 --- a/public/content/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -60,7 +60,7 @@ Once you have a subgraph, it allows you to write one simple query in your dapp t ### Apollo {#apollo} -Thanks to the [Apollo Boost](https://www.apollographql.com/docs/react/get-started/) integration you can easily integrate the graph in your React dapp. Especially when using [React hooks and Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), fetching data is as simple as writing a single GraphQl query in your component: +Thanks to the [Apollo Boost](https://www.apollographql.com/docs/react/get-started/) integration you can easily integrate the graph in your React dapp. Especially when using [React hooks and Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), fetching data is as simple as writing a single GraphQl query in your component: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index 3eadf3da534..135d9ed3c26 100644 --- a/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -65,7 +65,7 @@ Una vez tenga un subgrafo, este le permitirá escribir una sencilla consulta en ### Apollo {#apollo} -Gracias a la integración con [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puedes integrar fácilmente el grafo en tu dapp de React. Especialmente al usar [ganchos de React y Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), obtener datos es tan sencillo como escribir una única consulta GraphQL en su componente: +Gracias a la integración con [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puedes integrar fácilmente el grafo en tu dapp de React. Especialmente al usar [ganchos de React y Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), obtener datos es tan sencillo como escribir una única consulta GraphQL en su componente: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 01dde279ba2..e7ca2c8c47c 100644 --- a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -65,7 +65,7 @@ Une fois que vous disposez d'un subgraph, vous pouvez écrire une simple requêt ### Apollo {#apollo} -Grâce à l'intégration d'[Apollo Boost](https://www.apollographql.com/docs/react/get-started/), vous pouvez facilement intégrer Graph dans votre dApp React. Surtout lorsque vous utilisez [des hooks React et Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), récupérer des données est aussi simple que d'écrire une requête GraphQl dans votre composant: +Grâce à l'intégration d'[Apollo Boost](https://www.apollographql.com/docs/react/get-started/), vous pouvez facilement intégrer Graph dans votre dApp React. Surtout lorsque vous utilisez [des hooks React et Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), récupérer des données est aussi simple que d'écrire une requête GraphQl dans votre composant: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index 3fd2391426c..fbe1043d06c 100644 --- a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -65,7 +65,7 @@ Une fois que vous disposez d'un subgraph, vous pouvez écrire une simple requêt ### Apollo {#apollo} -Grâce à l'intégration d'[Apollo Boost](https://www.apollographql.com/docs/react/get-started/), vous pouvez facilement intégrer Graph dans votre dApp React. Surtout lorsque vous utilisez [des hooks React et Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), récupérer des données est aussi simple que d'écrire une requête GraphQl dans votre composant: +Grâce à l'intégration d'[Apollo Boost](https://www.apollographql.com/docs/react/get-started/), vous pouvez facilement intégrer Graph dans votre dApp React. Surtout lorsque vous utilisez [des hooks React et Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), récupérer des données est aussi simple que d'écrire une requête GraphQl dans votre composant: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/id/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/id/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index aa19635614a..3dd0c9f208c 100644 --- a/public/content/translations/id/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/id/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -65,7 +65,7 @@ Setelah memiliki subgraph, ini memungkinkan Anda menulis kueri sederhana di Dapp ### Apollo {#apollo} -Berkat integrasi [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), Anda dapat dengan mudah mengintegrasikan graph ke dalam Dapp React Anda. Khususnya ketika menggunakan [kaitan React dan Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), mengambil data menjadi semudah menulis sebuah kueri GraphQl dalam kompenen Anda: +Berkat integrasi [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), Anda dapat dengan mudah mengintegrasikan graph ke dalam Dapp React Anda. Khususnya ketika menggunakan [kaitan React dan Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), mengambil data menjadi semudah menulis sebuah kueri GraphQl dalam kompenen Anda: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 37d839255f4..d990c395090 100644 --- a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -65,7 +65,7 @@ Una volta che hai un grafico secondario, ti consente di scrivere una semplice ri ### Apollo {#apollo} -Grazie all'integrazione di [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puoi integrare facilmente il grafico nella tua dapp di React. Specialmente quando si utilizzano gli [hook di React e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), recuperare i dati è tanto facile quanto scrivere una singola query di GraphQL nel tuo componente: +Grazie all'integrazione di [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puoi integrare facilmente il grafico nella tua dapp di React. Specialmente quando si utilizzano gli [hook di React e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), recuperare i dati è tanto facile quanto scrivere una singola query di GraphQL nel tuo componente: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index 37d839255f4..d990c395090 100644 --- a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -65,7 +65,7 @@ Una volta che hai un grafico secondario, ti consente di scrivere una semplice ri ### Apollo {#apollo} -Grazie all'integrazione di [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puoi integrare facilmente il grafico nella tua dapp di React. Specialmente quando si utilizzano gli [hook di React e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), recuperare i dati è tanto facile quanto scrivere una singola query di GraphQL nel tuo componente: +Grazie all'integrazione di [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puoi integrare facilmente il grafico nella tua dapp di React. Specialmente quando si utilizzano gli [hook di React e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), recuperare i dati è tanto facile quanto scrivere una singola query di GraphQL nel tuo componente: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 89e4e78a7e2..91cec9ce9cf 100644 --- a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -68,7 +68,7 @@ subgraph があれば、Dapp にシンプルなクエリをひとつ追加する ### Apollo {#apollo} -[Apollo Boost](https://www.apollographql.com/docs/react/get-started/)との統合により、React で作成した Dapp に The Graph を簡単に搭載できるようになりました。 特に[React hooks と Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2)を使えば、コンポーネントに GraphQL のクエリをひとつ追加するだけで、簡単にデータ取得が可能になります: +[Apollo Boost](https://www.apollographql.com/docs/react/get-started/)との統合により、React で作成した Dapp に The Graph を簡単に搭載できるようになりました。 特に[React hooks と Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks)を使えば、コンポーネントに GraphQL のクエリをひとつ追加するだけで、簡単にデータ取得が可能になります: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index b3c8401f9d9..b7f79e52644 100644 --- a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -65,7 +65,7 @@ subgraphがあれば、Dappにシンプルなクエリをひとつ追加する ### Apollo {#apollo} -[Apollo Boost](https://www.apollographql.com/docs/react/get-started/)との統合により、Reactで作成したDappにThe Graphを簡単に搭載できるようになりました。 特に[React hooksとApollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2)を使えば、コンポーネントにGraphQLのクエリをひとつ追加するだけで、簡単にデータ取得が可能になります: +[Apollo Boost](https://www.apollographql.com/docs/react/get-started/)との統合により、Reactで作成したDappにThe Graphを簡単に搭載できるようになりました。 特に[React hooksとApollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks)を使えば、コンポーネントにGraphQLのクエリをひとつ追加するだけで、簡単にデータ取得が可能になります: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index e0b621bfcc2..3edbe0b9607 100644 --- a/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -65,7 +65,7 @@ Ao obter um subgrafo, você pode escrever uma consulta simples em seu dapp para ### Apollo {#apollo} -Graças à integração do [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), você pode integrar facilmente o grafo em seu aplicativo React. Especialmente ao usar [React hooks e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), buscar dados é tão simples como escrever uma única consulta GraphQl em seu componente: +Graças à integração do [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), você pode integrar facilmente o grafo em seu aplicativo React. Especialmente ao usar [React hooks e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), buscar dados é tão simples como escrever uma única consulta GraphQl em seu componente: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/ro/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/ro/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index a165da0dfe7..342689b8fbd 100644 --- a/public/content/translations/ro/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/ro/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -65,7 +65,7 @@ Odată ce aveți un subgraf, acesta vă permite să scrieți o simplă interogar ### Apollo {#apollo} -Datorită integrării [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puteți integra cu ușurință graful în aplicația dvs. Dapp React. Mai ales când folosiți [React hooks și Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), preluarea datelor este la fel de simplă ca scrierea unei singure interogări GraphQL în componenta dvs.: +Datorită integrării [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puteți integra cu ușurință graful în aplicația dvs. Dapp React. Mai ales când folosiți [React hooks și Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), preluarea datelor este la fel de simplă ca scrierea unei singure interogări GraphQL în componenta dvs.: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/tr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/tr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 1efd193befd..601feda7fd3 100644 --- a/public/content/translations/tr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/tr/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -65,7 +65,7 @@ Bir alt grafiğiniz olduğunda, ihtiyacınız olan geçmiş veriler de dahil olm ### Apollo {#apollo} -[Apollo Boost](https://www.apollographql.com/docs/react/get-started/) entegrasyonu sayesinde grafiği React merkeziyetsiz uygulamanıza kolayca entegre edebilirsiniz. Özellikle [React hooks ve Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2) kullanılırken, verileri almak, bileşeninize tek bir GraphQl sorgusu yazmak kadar basittir: +[Apollo Boost](https://www.apollographql.com/docs/react/get-started/) entegrasyonu sayesinde grafiği React merkeziyetsiz uygulamanıza kolayca entegre edebilirsiniz. Özellikle [React hooks ve Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks) kullanılırken, verileri almak, bileşeninize tek bir GraphQl sorgusu yazmak kadar basittir: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 6542d826611..08555135b8a 100644 --- a/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -65,7 +65,7 @@ yarn react-app:start ### Apollo {#apollo} -由于 [Apollo Boost](https://www.apollographql.com/docs/react/get-started/) 集成,你可以轻松将图集成到 React 去中心化应用程序中。 特别是在使用 [React hooks 和 Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2) 时,获取数据就像在您的组件中写一个 GraphQl 查询一样简单: +由于 [Apollo Boost](https://www.apollographql.com/docs/react/get-started/) 集成,你可以轻松将图集成到 React 去中心化应用程序中。 特别是在使用 [React hooks 和 Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks) 时,获取数据就像在您的组件中写一个 GraphQl 查询一样简单: ```js const { loading, error, data } = useQuery(myGraphQlQuery) diff --git a/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md index f48d99eb8e7..3a488f61250 100644 --- a/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ b/public/content/translations/zh/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -65,7 +65,7 @@ yarn react-app:start ### Apollo {#apollo} -由于 [Apollo Boost](https://www.apollographql.com/docs/react/get-started/) 集成,你可以轻松将图集成到 React 去中心化应用程序中。 特别是在使用 [React hooks 和 Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2) 时,获取数据就像在你的组件中写一个 GraphQl 查询一样简单: +由于 [Apollo Boost](https://www.apollographql.com/docs/react/get-started/) 集成,你可以轻松将图集成到 React 去中心化应用程序中。 特别是在使用 [React hooks 和 Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks) 时,获取数据就像在你的组件中写一个 GraphQl 查询一样简单: ```js const { loading, error, data } = useQuery(myGraphQlQuery) From 9d412e0961c187d74123f20e9e1009d57b1c9252 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 14:09:02 -0500 Subject: [PATCH 047/368] change https://www.uniswapfoundation.org/apply-for-a-grant to https://www.uniswapfoundation.org/opportunities --- public/content/translations/fa/community/grants/index.md | 2 +- public/content/translations/pt-br/community/grants/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/fa/community/grants/index.md b/public/content/translations/fa/community/grants/index.md index 429b087b3bf..999089a393c 100644 --- a/public/content/translations/fa/community/grants/index.md +++ b/public/content/translations/fa/community/grants/index.md @@ -32,7 +32,7 @@ lang: fa - [برنامه‌ی Metamask‏](https://metamaskgrants.org/) - _[سازمان خودمختار غیرمتمرکز کمک‌های مالی کارمندمحور MetaMask‏](https://metamask.io/)_ - [برنامه کمک‌های مالی شبکه SKALE‏](https://skale.space/developers#grants) - _[اکوسیستم شبکه](https://skale.space/)‏SKALE‏_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _اکوسیستم [‏The Graph‏](https://thegraph.com/)_ -- [برنامه کمک‌های مالی Uniswap‏](https://www.uniswapfoundation.org/apply-for-a-grant) - _[جامعه](https://uniswap.org/)‏Uniswap‏_ +- [برنامه کمک‌های مالی Uniswap‏](https://www.uniswapfoundation.org/opportunities) - _[جامعه](https://uniswap.org/)‏Uniswap‏_ ## کمک مالی درجه‌ی دوم {#quadratic-funding} diff --git a/public/content/translations/pt-br/community/grants/index.md b/public/content/translations/pt-br/community/grants/index.md index 8e60f9b6b25..a6767b4dc54 100644 --- a/public/content/translations/pt-br/community/grants/index.md +++ b/public/content/translations/pt-br/community/grants/index.md @@ -32,7 +32,7 @@ Estes projetos criaram seus próprios programas de recompensas destinados a dese - [Programa MetaMask](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) bolsas lideradas por funcionários DAO_ - [Programa de bolsas da SKALE Network](https://skale.space/developers#grants) - _[Ecossistema da SKALE Network](https://skale.space/)_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _Ecossistema [The Graph](https://thegraph.com/)_ -- [Uniswap Grants Program](https://www.uniswapfoundation.org/apply-for-a-grant) - _[Comunidade da Uniswap](https://uniswap.org/)_ +- [Uniswap Grants Program](https://www.uniswapfoundation.org/opportunities) - _[Comunidade da Uniswap](https://uniswap.org/)_ ## Financiamento quadrático {#quadratic-funding} From 6ddc8c1ee904aaca29d3c7fc772781222fb49b4a Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 14:17:52 -0500 Subject: [PATCH 048/368] change https://docs.nodereal.io/nodereal/meganode/introduction to https://docs.nodereal.io/docs/introduction --- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 4ab1b1247c6..8eec88dc138 100644 --- a/public/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ Here is a list of some of the most popular Ethereum node providers, feel free to - Direct, technical support - [**NodeReal MegaNode**](https://nodereal.io/) - - [Docs](https://docs.nodereal.io/nodereal/meganode/introduction) + - [Docs](https://docs.nodereal.io/docs/introduction) - Features - Reliable, fast and scalable RPC API services - Enhanced API for web3 developers diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 0bf40f1e262..869e277a98d 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Direkter, technischer Support - [**NodeReal MegaNode**](https://nodereal.io/) - - [Dokumente](https://docs.nodereal.io/nodereal/meganode/introduction) + - [Dokumente](https://docs.nodereal.io/docs/introduction) - Eigenschaften - Zuverlässige, schnelle und skalierbare RPC-API-Services - Verbesserte API für Web3-Entwickler diff --git a/public/content/translations/es/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/es/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 42a4eabcf8d..837c2c1e034 100644 --- a/public/content/translations/es/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/es/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ A continuación se incluye una lista con algunos de los proveedores de nodos de - Soporte técnico directo - [**MegaNode de NodeReal**](https://nodereal.io/) - - [Documentos](https://docs.nodereal.io/nodereal/meganode/introduction) + - [Documentos](https://docs.nodereal.io/docs/introduction) - Características - Servicios de API RPC de confianza, rápidos y escalables - API mejorada para desarrolladores de Web3 diff --git a/public/content/translations/fa/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/fa/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 603008296b5..4d4a14add4b 100644 --- a/public/content/translations/fa/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/fa/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ sidebarDepth: 2 - پشتیبانی فنی مستقیم - [**مگانود نودرئال**](https://nodereal.io/) - - [مستندات](https://docs.nodereal.io/nodereal/meganode/introduction) + - [مستندات](https://docs.nodereal.io/docs/introduction) - ویژگی‌ها - خدمات RPC ای‌پی‌آی قابل اعتماد، سریع و مقیاس‌پذیر - API پیشرفته برای توسعه‌دهندگان Web3 diff --git a/public/content/translations/fr/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/fr/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 06d4828aa4f..4e93edb0862 100644 --- a/public/content/translations/fr/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/fr/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ Voici une liste des fournisseurs de nœuds Ethereum les plus populaires. N'hési - Assistance technique directe - [**NodeReal MegaNode**](https://nodereal.io/) - - [Documentation](https://docs.nodereal.io/nodereal/meganode/introduction) + - [Documentation](https://docs.nodereal.io/docs/introduction) - Fonctionnalités - Services API RPC fiables, rapides et évolutifs - API améliorée pour les développeurs web3 diff --git a/public/content/translations/hi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/hi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 220b248bf22..5146f46830b 100644 --- a/public/content/translations/hi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/hi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ sidebarDepth: 2 - प्रत्यक्ष, तकनीकी सहायता - [**NodeReal MegaNode**](https://nodereal.io/) - - [डॉक्स](https://docs.nodereal.io/nodereal/meganode/introduction) + - [डॉक्स](https://docs.nodereal.io/docs/introduction) - विशेषताएँ - विश्वसनीय, तेज और स्केलेबल RPC API सेवाएं - web3 डेवलपर के लिए उन्नत API diff --git a/public/content/translations/hu/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/hu/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 299af6a2d47..f59f2baadfc 100644 --- a/public/content/translations/hu/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/hu/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ Az alábbiak a legnépszerűbb Ethereum-csomópontszolgáltatók – ha ismer ol - Közvetlen, technikai támogatás - [**NodeReal MegaNode**](https://nodereal.io/) - - [Dokumentáció](https://docs.nodereal.io/nodereal/meganode/introduction) + - [Dokumentáció](https://docs.nodereal.io/docs/introduction) - Jellemzők - Megbízható, gyors és skálázható RPC API-szolgáltatások - Továbbfejlesztett API a web3-fejlesztőknek diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 1d79c2bde0f..acea8ed3645 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ Ecco una lista di alcuni dei più popolari fornitori di nodi Ethereum. Aggiungin - Supporto tecnico diretto - [**NodeReal MegaNode**](https://nodereal.io/) - - [Documentazione](https://docs.nodereal.io/nodereal/meganode/introduction) + - [Documentazione](https://docs.nodereal.io/docs/introduction) - Caratteristiche - Servizi API RPC affidabili, veloci e scalabili - API migliorata per sviluppatori web3 diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index ad74e7691be..db9eab3e302 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ sidebarDepth: 2 - ダイレクト技術サポート - [**NodeReal MegaNode**](https://nodereal.io/) - - [ドキュメント](https://docs.nodereal.io/nodereal/meganode/introduction) + - [ドキュメント](https://docs.nodereal.io/docs/introduction) - 機能 - 信頼性の高い、高速かつスケーラブルなRPC APIサービス - Web3デベロッパー向けに改良されたAPI diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 6a875dc2e18..f22eab2d6d6 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ Segue uma lista de alguns dos fornecedores de nós para Ethereum mais populares. - Suporte técnico direto - [**NodeReal MegaNode**](https://nodereal.io/) - - [Documentação](https://docs.nodereal.io/nodereal/meganode/introduction) + - [Documentação](https://docs.nodereal.io/docs/introduction) - Recursos - Serviços confiáveis, rápidos e dimensionáveis da API RPC - API aprimorada para desenvolvedores Web3 diff --git a/public/content/translations/tr/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/tr/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 4e4c578abd0..6bbbd7ba317 100644 --- a/public/content/translations/tr/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/tr/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ Bir düğüm hizmeti kullanarak, ürününüzün altyapı yönünü merkezileşt - Doğrudan teknik destek - [**NodeReal MegaNode**](https://nodereal.io/) - - [Belgeler](https://docs.nodereal.io/nodereal/meganode/introduction) + - [Belgeler](https://docs.nodereal.io/docs/introduction) - Özellikler - Güvenilir, hızlı ve ölçeklenebilir RPC API servisleri - Web3 geliştiricileri için gelişmiş API diff --git a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 5439ec30368..fa68e4175aa 100644 --- a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ sidebarDepth: 2 - 直接技術支援 - [**NodeReal MegaNode**](https://nodereal.io/) - - [文件](https://docs.nodereal.io/nodereal/meganode/introduction) + - [文件](https://docs.nodereal.io/docs/introduction) - 功能 - 可靠、快速和可擴充的遠端程序呼叫應用程式介面服務 - 專為 Web3 開發者打造的增強版應用程式介面 diff --git a/public/content/translations/zh/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/zh/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 075e4c521b8..d8ca1639679 100644 --- a/public/content/translations/zh/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/zh/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -264,7 +264,7 @@ sidebarDepth: 2 - 直接技术支持 - [**NodeReal MegaNode**](https://nodereal.io/) - - [相关文档](https://docs.nodereal.io/nodereal/meganode/introduction) + - [相关文档](https://docs.nodereal.io/docs/introduction) - 功能 - 可靠、快速而且可扩展的远程过程调用应用程序接口服务 - 面向 Web3 开发者的增强型应用程序接口 From e8e53cc9946951db50b5384d017b1287ad26c870 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 14:29:32 -0500 Subject: [PATCH 049/368] change https://www.optimism.io/apps/bridges to https://optimism.io/apps#bridge --- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/content/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/developers/tutorials/optimism-std-bridge-annotated-code/index.md index fb48cef6e8b..9acc8e17434 100644 --- a/public/content/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1347,7 +1347,7 @@ The only way we can do this from L2 is to send a message that will have to wait The standard bridge is the most flexible mechanism for asset transfers. However, because it is so generic it is not always the easiest mechanism to use. -Especially for withdrawals, most users prefer to use [third party bridges](https://www.optimism.io/apps/bridges) that do not wait the challenge period and do not require a Merkle proof to finalize the withdrawal. +Especially for withdrawals, most users prefer to use [third party bridges](https://optimism.io/apps#bridge) that do not wait the challenge period and do not require a Merkle proof to finalize the withdrawal. These bridges typically work by having assets on L1, which they provide immediately for a small fee (often less than the cost of gas for a standard bridge withdrawal). When the bridge (or the people running it) anticipates being short on L1 assets it transfers sufficient assets from L2. As these are very big withdrawals, the withdrawal cost is amortized over a large amount and is a much smaller percentage. diff --git a/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 46e7485fa33..6a75c21145e 100644 --- a/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ Si un usuario realizó un error detectable mediante el uso de la dirección de t ## Conclusión {#conclusion} -El puente estándar es el mecanismo más flexible para las transferencias de activos. Sin embargo, debido a que es muy genérico, no siempre es el mecanismo más fácil de utilizar. Especialmente para los retiros, la mayoría de los usuarios prefieren usar [puentes de terceros](https://www.optimism.io/apps/bridges) que no esperen el periodo de desafío y no requieran una prueba de Merkle para finalizar el retiro. +El puente estándar es el mecanismo más flexible para las transferencias de activos. Sin embargo, debido a que es muy genérico, no siempre es el mecanismo más fácil de utilizar. Especialmente para los retiros, la mayoría de los usuarios prefieren usar [puentes de terceros](https://optimism.io/apps#bridge) que no esperen el periodo de desafío y no requieran una prueba de Merkle para finalizar el retiro. Estos puentes normalmente funcionan teniendo activos en L1, que proporcionan inmediatamente por una pequeña tarifa (a menudo menor que el costo del gas para un retiro de puente estándar). Cuando el puente (o la gente que lo ejecuta) anticipa quedarse con pocos activos en L1, transfiere suficientes activos de L2. Como se trata de retiros muy grandes, el costo de la retirada se amortiza en grandes cantidades y resulta en un porcentaje mucho menor. diff --git a/public/content/translations/fr/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/fr/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 258fabeb507..d0f7cc60bf2 100644 --- a/public/content/translations/fr/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/fr/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ Si un utilisateur a fait une erreur détectable en utilisant la mauvaise adresse ## Conclusion {#conclusion} -La passerelle standard est le mécanisme le plus souple pour les transferts d'actifs. Cependant, parce qu'il est si générique, ce n'est pas toujours le mécanisme le plus facile à utiliser. Spécialement pour les retraits, la plupart des utilisateurs préfèrent utiliser des [passerelles tierces](https://www.optimism.io/apps/bridges) qui n'attendent pas la période problématique et ne nécessitent pas de preuve de Merkle pour finaliser le retrait. +La passerelle standard est le mécanisme le plus souple pour les transferts d'actifs. Cependant, parce qu'il est si générique, ce n'est pas toujours le mécanisme le plus facile à utiliser. Spécialement pour les retraits, la plupart des utilisateurs préfèrent utiliser des [passerelles tierces](https://optimism.io/apps#bridge) qui n'attendent pas la période problématique et ne nécessitent pas de preuve de Merkle pour finaliser le retrait. Ces passerelles fonctionnent généralement en ayant des actifs sur L1 qu'ils fournissent immédiatement moyennant un petit supplément (souvent inférieur au coût du gaz pour un retrait standard d'une passerelle). Quand la passerelle (ou la personne qui la gère) prévoit d'être en deçà des actifs L1, elle transfère suffisamment d'actifs de L2. Comme il s'agit de retraits très importants, le coût de retrait est amorti sur une somme importante et représente un pourcentage beaucoup plus faible. diff --git a/public/content/translations/id/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/id/developers/tutorials/optimism-std-bridge-annotated-code/index.md index de2b0aae34d..f75f4394943 100644 --- a/public/content/translations/id/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/id/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ If a user made a detectable error by using the wrong L2 token address, we want t ## Kesimpulan {#conclusion} -The standard bridge is the most flexible mechanism for asset transfers. However, because it is so generic it is not always the easiest mechanism to use. Especially for withdrawals, most users prefer to use [third party bridges](https://www.optimism.io/apps/bridges) that do not wait the challenge period and do not require a Merkle proof to finalize the withdrawal. +The standard bridge is the most flexible mechanism for asset transfers. However, because it is so generic it is not always the easiest mechanism to use. Especially for withdrawals, most users prefer to use [third party bridges](https://optimism.io/apps#bridge) that do not wait the challenge period and do not require a Merkle proof to finalize the withdrawal. These bridges typically work by having assets on L1, which they provide immediately for a small fee (often less than the cost of gas for a standard bridge withdrawal). When the bridge (or the people running it) anticipates being short on L1 assets it transfers sufficient assets from L2. As these are very big withdrawals, the withdrawal cost is amortized over a large amount and is a much smaller percentage. diff --git a/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md index a7c2e9925e9..d82e42d4548 100644 --- a/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ Se un utente ha commesso un errore rilevabile usando l'indirizzo del token L2 er ## Conclusioni {#conclusion} -Il ponte standard è il meccanismo più flessibile per i trasferimenti di risorse. Tuttavia, essendo così generico, non è sempre il metodo più facile da usare. Specialmente per i prelievi, gran parte degli utenti preferisce usare [ponti di terze parti](https://www.optimism.io/apps/bridges) che non attendono il periodo di contestazione dell'errore e non richiedono una prova di Merkle per finalizzare il prelievo. +Il ponte standard è il meccanismo più flessibile per i trasferimenti di risorse. Tuttavia, essendo così generico, non è sempre il metodo più facile da usare. Specialmente per i prelievi, gran parte degli utenti preferisce usare [ponti di terze parti](https://optimism.io/apps#bridge) che non attendono il periodo di contestazione dell'errore e non richiedono una prova di Merkle per finalizzare il prelievo. Questi ponti funzionano tipicamente avendo delle risorse sul L1, che forniscono immediatamente per una ridotta commissione (spesso inferiore al costo del gas per un prelievo del ponte standard). Quando il ponte (o le persone che lo gestiscono) prevede di avere poche risorse su L1, trasferisce delle sufficienti risorse da L2. Poiché questi sono prelievi molto grandi, il costo di prelievo è ammortizzato su un grande importo e ha un'incidenza minore. diff --git a/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 85575af4262..466d9ae4504 100644 --- a/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ L2のトークンアドレスが間違っており、検知可能なエラーが ## まとめ {#conclusion} -標準ブリッジは、アセットを移転する上で最も柔軟なメカニズムです。 しかし、汎用性が高いため、必ずしも使いやすいメカニズムではない場合もあります。 特に出金については、大部分のユーザーは、異議申し立て期間が存在せず、出金を最終確認するためにMerkleプルーフを必要としない[サードパーティーのブリッジ](https://www.optimism.io/apps/bridges)を使いたいと考えるでしょう。 +標準ブリッジは、アセットを移転する上で最も柔軟なメカニズムです。 しかし、汎用性が高いため、必ずしも使いやすいメカニズムではない場合もあります。 特に出金については、大部分のユーザーは、異議申し立て期間が存在せず、出金を最終確認するためにMerkleプルーフを必要としない[サードパーティーのブリッジ](https://optimism.io/apps#bridge)を使いたいと考えるでしょう。 サードパーティのブリッジは通常、少額の手数料(標準ブリッジの出金にかかるガス代よりも安価な場合が多いです)で、L1上でアセットを保持する機能を提供します。 ブリッジ(または、ブリッジを稼働するスタッフ)がL1上での資産不足を予想する場合、L2から必要な資産が移転されます。 これらは非常に大規模な出金になるため、出金コストは高額を対象として償却され、手数料が全体に占める割合が非常に低くなります。 diff --git a/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 4eb6f676681..e4a0a257408 100644 --- a/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ Se um usuário fez um erro detectável usando o endereço de token L2 errado, n ## Conclusão {#conclusion} -A ponte padrão é o mecanismo mais flexível para transferência de ativos. Porém, por ser genérico não é sempre o mecanismo mais fácil de usar. Especialmente para retiradas, a maioria dos usuários prefere usar [pontes de terceiros](https://www.optimism.io/apps/bridges) a esperar o período de desafio e também não precisar de uma prova de Merkle para finalizar a retirada. +A ponte padrão é o mecanismo mais flexível para transferência de ativos. Porém, por ser genérico não é sempre o mecanismo mais fácil de usar. Especialmente para retiradas, a maioria dos usuários prefere usar [pontes de terceiros](https://optimism.io/apps#bridge) a esperar o período de desafio e também não precisar de uma prova de Merkle para finalizar a retirada. Estas pontes tipicamente funcionam tendo ativos na L1, que elas fornecem imediatamente por uma taxa pequena (geralmente menor que o custo de gas para uma retirada de uma ponte padrão). Quando a ponte (ou as pessoas que a administram) antecipa a falta de ativos L1, ela transfere ativos suficientes da L2. Como estes são saques muito grandes, o custo do saque é amortizado por uma larga quantia e é um percentual muito menor. diff --git a/public/content/translations/ro/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/ro/developers/tutorials/optimism-std-bridge-annotated-code/index.md index c203e149609..7c043f7f6a9 100644 --- a/public/content/translations/ro/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/ro/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ If a user made a detectable error by using the wrong L2 token address, we want t ## Concluzie {#conclusion} -The standard bridge is the most flexible mechanism for asset transfers. However, because it is so generic it is not always the easiest mechanism to use. Especially for withdrawals, most users prefer to use [third party bridges](https://www.optimism.io/apps/bridges) that do not wait the challenge period and do not require a Merkle proof to finalize the withdrawal. +The standard bridge is the most flexible mechanism for asset transfers. However, because it is so generic it is not always the easiest mechanism to use. Especially for withdrawals, most users prefer to use [third party bridges](https://optimism.io/apps#bridge) that do not wait the challenge period and do not require a Merkle proof to finalize the withdrawal. These bridges typically work by having assets on L1, which they provide immediately for a small fee (often less than the cost of gas for a standard bridge withdrawal). When the bridge (or the people running it) anticipates being short on L1 assets it transfers sufficient assets from L2. As these are very big withdrawals, the withdrawal cost is amortized over a large amount and is a much smaller percentage. diff --git a/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md index bcc987c586d..54141eab9a8 100644 --- a/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ Bir kullanıcı yanlış Katman 2 token adresini kullanarak tespit edilebilir bi ## Sonuç {#conclusion} -Standart köprü, varlık aktarımları için en esnek mekanizmadır. Ancak çok genel olduğu için her zaman kullanması en kolay olan mekanizma değildir. Özellikle çekimler için, çoğu kullanıcı meydan okuma süresini beklemeyen ve çekimi sonlandırmak için bir Merkle ispatı gerektirmeyen [üçüncü parti köprüleri](https://www.optimism.io/apps/bridges) kullanmayı tercih eder. +Standart köprü, varlık aktarımları için en esnek mekanizmadır. Ancak çok genel olduğu için her zaman kullanması en kolay olan mekanizma değildir. Özellikle çekimler için, çoğu kullanıcı meydan okuma süresini beklemeyen ve çekimi sonlandırmak için bir Merkle ispatı gerektirmeyen [üçüncü parti köprüleri](https://optimism.io/apps#bridge) kullanmayı tercih eder. Bu köprüler genellikle Katman 1 üzerinde küçük bir ücret (genelde bir standart köprü çekiminin gaz ücretinden daha azına) için anında sağladıkları varlıklara sahip olarak çalışırlar. Köprü (ya da onu çalıştıran insanlar) Katman 1 varlıklarının azaldığını sezdiğinde Katman 2'den yeteri kadar varlığı aktarır. Bunlar çok büyük çekimler olduğu için, çekim ücreti büyük bir miktar üzerinden amorti edilmiştir ve daha küçük bir yüzdeliktir. diff --git a/public/content/translations/zh/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/zh/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 12563c668bd..78a65029898 100644 --- a/public/content/translations/zh/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/zh/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1270,7 +1270,7 @@ contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled { ## 总结 {#conclusion} -标准链桥是最灵活的资产转移机制。 然而,由于它非常笼统,因而并非总是可供使用的最简便机制。 特别是对于提款,大多数用户喜欢使用[第三方链桥](https://www.optimism.io/apps/bridges),这些链桥不用等待质询期并且不需要进行默克尔证明就能完成提款。 +标准链桥是最灵活的资产转移机制。 然而,由于它非常笼统,因而并非总是可供使用的最简便机制。 特别是对于提款,大多数用户喜欢使用[第三方链桥](https://optimism.io/apps#bridge),这些链桥不用等待质询期并且不需要进行默克尔证明就能完成提款。 通常,这些链桥的工作方式是在第一层上拥有资产,而且它们会立即为这些资产提供一小笔费用(通常少于标准链桥提款的燃料费用)。 当链桥(或运行链桥的人)预计第一层资产短缺时,它将从第二层转移足够的资产。 由于这些提款的数额非常庞大,大笔的提款费用经分期摊销后,所占百分比要小得多。 From bf77b98bb87b7a1fdde0b9aa3b77c957acfcc9cd Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 14:52:14 -0500 Subject: [PATCH 050/368] change https://community.optimism.io/docs/developers/bridge/standard-bridge to https://docs.optimism.io/app-developers/bridging/standard-bridge --- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- .../tutorials/optimism-std-bridge-annotated-code/index.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/content/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 9acc8e17434..34ca3578e4f 100644 --- a/public/content/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -17,7 +17,7 @@ One way to achieve this is for users to lock assets (ETH and [ERC-20 tokens](/de Eventually, whoever ends up with them might want to bridge them back to L1. When doing this, the assets are burned on L2 and then released back to the user on L1. -This is the way the [Optimism standard bridge](https://community.optimism.io/docs/developers/bridge/standard-bridge) works. +This is the way the [Optimism standard bridge](https://docs.optimism.io/app-developers/bridging/standard-bridge) works. In this article we go over the source code for that bridge to see how it works and study it as an example of well written Solidity code. ## Control flows {#control-flows} diff --git a/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 6a75c21145e..1ac98ad7779 100644 --- a/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: es Para utilizar activos de L1 en Optimism (o cualquier otra L2), los activos deben "[puentearse](/bridges/#prerequisites)". Una manera de lograr esto es que los usuarios bloqueen activos (ETH y los [tokens ERC-20](/developers/docs/standards/tokens/erc-20/) son los más comunes) en L1 y recibir activos equivalentes para usar en L2. Eventualmente, quien acabe poseyéndolos puede querer puentearlos de vuelta a la L1. Al hacer esto, los activos se queman en L2 y luego se liberan nuevamente al usuario en L1. -Así es como funciona el [puente estándar de Optimism](https://community.optimism.io/docs/developers/bridge/standard-bridge). En este artículo analizaremos el código fuente de ese puente para ver cómo funciona y lo estudiaremos como ejemplo de código de Solidity bien escrito. +Así es como funciona el [puente estándar de Optimism](https://docs.optimism.io/app-developers/bridging/standard-bridge). En este artículo analizaremos el código fuente de ese puente para ver cómo funciona y lo estudiaremos como ejemplo de código de Solidity bien escrito. ## Flujos de control {#control-flows} diff --git a/public/content/translations/fr/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/fr/developers/tutorials/optimism-std-bridge-annotated-code/index.md index d0f7cc60bf2..ac53b339684 100644 --- a/public/content/translations/fr/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/fr/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: fr Pour utiliser les actifs L1 sur Optimism (ou n'importe quel autre L2), les actifs doivent être [connectés](/bridges/#prerequisites). Une façon d'y arriver est pour les utilisateurs de verrouiller les actifs (ETH et les [jetons ERC-20](/developers/docs/standards/tokens/erc-20/) sont les plus communs) sur L1 et de recevoir des actifs équivalents à utiliser sur L2. Finalement, celui qui se retrouve avec souhaitera peut-être les ramener en L1. En faisant cela, les actifs sont brûlés sur L2 puis redistribués à l'utilisateur sur L1. -C'est ainsi que fonctionne la [passerelle standard Optimism](https://community.optimism.io/docs/developers/bridge/standard-bridge). Dans cet article, nous passerons en revue le code source de cette passerelle pour comprendre comment elle fonctionne et l'étudier comme un exemple de code Solidity parfaitement écrit. +C'est ainsi que fonctionne la [passerelle standard Optimism](https://docs.optimism.io/app-developers/bridging/standard-bridge). Dans cet article, nous passerons en revue le code source de cette passerelle pour comprendre comment elle fonctionne et l'étudier comme un exemple de code Solidity parfaitement écrit. ## Flux de contrôle {#control-flows} diff --git a/public/content/translations/id/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/id/developers/tutorials/optimism-std-bridge-annotated-code/index.md index f75f4394943..cc8273d1925 100644 --- a/public/content/translations/id/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/id/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: id To use L1 assets on Optimism (or any other L2), the assets need to be [bridged](/bridges/#prerequisites). One way to achieve this is for users to lock assets (ETH and [ERC-20 tokens](/developers/docs/standards/tokens/erc-20/) are the most common ones) on L1, and receive equivalent assets to use on L2. Eventually, whoever ends up with them might want to bridge them back to L1. When doing this, the assets are burned on L2 and then released back to the user on L1. -This is the way the [Optimism standard bridge](https://community.optimism.io/docs/developers/bridge/standard-bridge) works. In this article we go over the source code for that bridge to see how it works and study it as an example of well written Solidity code. +This is the way the [Optimism standard bridge](https://docs.optimism.io/app-developers/bridging/standard-bridge) works. In this article we go over the source code for that bridge to see how it works and study it as an example of well written Solidity code. ## Control flows {#control-flows} diff --git a/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md index d82e42d4548..2633b9a5da7 100644 --- a/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: it Per usare le risorse del L1 su Optimism (o su qualsiasi altro L2), le risorse devono essere collegate con un [ponte](/bridges/#prerequisites). Un modo per farlo è che gli utenti blocchino le risorse (ETH e [token ERC-20](/developers/docs/standards/tokens/erc-20/) sono le più comuni) nel L1 e ricevano le risorse equivalenti da usare nel L2. In definitiva, chiunque le riceva potrebbe volerle ricollegare al L1. Così facendo, le risorse sono bruciate nel L2 e poi rilasciate nuovamente all'utente nel L1. -Questo è il modo in cui funziona il [ponte standard di Optimism](https://community.optimism.io/docs/developers/bridge/standard-bridge). In questo articolo esaminiamo il codice sorgente di quel ponte, per vedere come funziona e per studiarlo come un esempio di codice di Solidity ben scritto. +Questo è il modo in cui funziona il [ponte standard di Optimism](https://docs.optimism.io/app-developers/bridging/standard-bridge). In questo articolo esaminiamo il codice sorgente di quel ponte, per vedere come funziona e per studiarlo come un esempio di codice di Solidity ben scritto. ## Flussi di controllo {#control-flows} diff --git a/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 466d9ae4504..061558e6078 100644 --- a/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: ja Optimism(またはその他のL2)上でL1のアセットを使用するには、当該アセットを[ブリッジ](/bridges/#prerequisites)する必要があります。 アセットをブリッジする方法のひとつとして、アセット(最も一般的なのは、ETHや[ERC-20 トークン](/developers/docs/standards/tokens/erc-20/)です)をL1上でロックし、L2上で同等のアセットを受け取る方法があります。 最終的に、これらのアセットを所持するユーザーは、再度L1にブリッジする必要があるでしょう。 L1にアセットをブリッジすると、L2上のアセットはバーンされ、L1上のアセットがユーザーに戻されます。 -以上が、[Optimismにおける標準ブリッジ](https://community.optimism.io/docs/developers/bridge/standard-bridge)の仕組みです。 この記事では、このブリッジ機能についてSolidity上で適切に作成したソースコードを確認しながら、その仕組みを学びます。 +以上が、[Optimismにおける標準ブリッジ](https://docs.optimism.io/app-developers/bridging/standard-bridge)の仕組みです。 この記事では、このブリッジ機能についてSolidity上で適切に作成したソースコードを確認しながら、その仕組みを学びます。 ## 制御フロー {#control-flows} diff --git a/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md index e4a0a257408..7697cff63b4 100644 --- a/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: pt-br Para usar ativos L1 na Optimism (ou qualquer outra L2), os ativos precisam ser [enviados pela ponte](/bridges/#prerequisites). Uma maneira de conseguir isso é os usuários bloquearem ativos (ETH e [tokens ERC-20](/developers/docs/standards/tokens/erc-20/) são os mais comuns) na L1, e receber ativos equivalentes para usar na L2. Por fim, quem for que acabe com eles, talvez queira enviá-los de volta para a L1. Ao fazer isso, os ativos são queimados na L2 e, em seguida, liberados para o usuário na L1. -É assim que a [ponte padrão Optimism](https://community.optimism.io/docs/developers/bridge/standard-bridge) funciona. Neste artigo, passamos pelo código-fonte para essa ponte para ver como ele funciona e estudá-lo como um exemplo de código Solidity bem escrito. +É assim que a [ponte padrão Optimism](https://docs.optimism.io/app-developers/bridging/standard-bridge) funciona. Neste artigo, passamos pelo código-fonte para essa ponte para ver como ele funciona e estudá-lo como um exemplo de código Solidity bem escrito. ## Fluxo de controle {#control-flows} diff --git a/public/content/translations/ro/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/ro/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 7c043f7f6a9..3546d2bb4a3 100644 --- a/public/content/translations/ro/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/ro/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: ro To use L1 assets on Optimism (or any other L2), the assets need to be [bridged](/bridges/#prerequisites). One way to achieve this is for users to lock assets (ETH and [ERC-20 tokens](/developers/docs/standards/tokens/erc-20/) are the most common ones) on L1, and receive equivalent assets to use on L2. Eventually, whoever ends up with them might want to bridge them back to L1. When doing this, the assets are burned on L2 and then released back to the user on L1. -This is the way the [Optimism standard bridge](https://community.optimism.io/docs/developers/bridge/standard-bridge) works. In this article we go over the source code for that bridge to see how it works and study it as an example of well written Solidity code. +This is the way the [Optimism standard bridge](https://docs.optimism.io/app-developers/bridging/standard-bridge) works. In this article we go over the source code for that bridge to see how it works and study it as an example of well written Solidity code. ## Control flows {#control-flows} diff --git a/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 54141eab9a8..f6bcc4111b5 100644 --- a/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: tr Optimism'de (veya başka herhangi bir K2'de) K1 varlıklarını kullanmak için varlıkların [köprülenmesi](/bridges/#prerequisites) gerekir. Kullanıcıların varlıkları (ETH ve [ERC-20 token'ları](/developers/docs/standards/tokens/erc-20/) en yaygın olanlardır) L1'de kilitlemesi ve L2'de eş değer varlıklar alması bunu başarmanın yollarından biridir. Nihayetinde bu varlıkları alan kişiler bunları tekrar K1'e köprülemek isteyebilir. Bunu yaparken, varlıklar K2'de yakılır ve ardından K1'de kullanıcıya geri verilir. -[Optimism standart köprüsü](https://community.optimism.io/docs/developers/bridge/standard-bridge) bu şekilde çalışır. Bu makalede, nasıl çalıştığını görmek için bu köprünün kaynak kodunu gözden geçireceğiz ve onu iyi yazılmış bir Solidity kodu örneği olarak inceleyeceğiz. +[Optimism standart köprüsü](https://docs.optimism.io/app-developers/bridging/standard-bridge) bu şekilde çalışır. Bu makalede, nasıl çalıştığını görmek için bu köprünün kaynak kodunu gözden geçireceğiz ve onu iyi yazılmış bir Solidity kodu örneği olarak inceleyeceğiz. ## Kontrol akışları {#control-flows} diff --git a/public/content/translations/zh/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/zh/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 78a65029898..be1a3248231 100644 --- a/public/content/translations/zh/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/zh/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -15,7 +15,7 @@ lang: zh 要在乐观解决方案(或任何其他第二层)上使用第一层资产,需要[桥接](/bridges/#prerequisites)该资产。 实现这一点的一种方法是,用户在一层网络上锁定资产(以太币和 [ERC-20 代币](/developers/docs/standards/tokens/erc-20/)是最常见的资产)并收到供在二层网络上使用的对等资产。 最后,拥有这些资产的任何人可能想把它们桥接回第一层。 在桥接过程中,资产会在第二层销毁,然后在第一层上发放给用户。 -这就是[乐观解决方案标准链桥](https://community.optimism.io/docs/developers/bridge/standard-bridge)的工作方式。 在本文中,我们将学习链桥的源代码,看看它如何工作,并将它作为精心编写的 Solidity 代码示例加以研究。 +这就是[乐观解决方案标准链桥](https://docs.optimism.io/app-developers/bridging/standard-bridge)的工作方式。 在本文中,我们将学习链桥的源代码,看看它如何工作,并将它作为精心编写的 Solidity 代码示例加以研究。 ## 控制流通 {#control-flows} From 8ec4061ac917b0d127a656a666adbd7649b8acd2 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 14:52:49 -0500 Subject: [PATCH 051/368] change https://www.coindesk.com/markets/2016/06/25/understanding-the-dao-attack to https://www.coindesk.com/learn/understanding-the-dao-attack - https://web.archive.org/web/20211006094626/https://www.coindesk.com/markets/2016/06/25/understanding-the-dao-attack/ --- public/content/translations/ja/history/index.md | 2 +- public/content/translations/pt-br/history/index.md | 2 +- public/content/translations/ro/history/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/translations/ja/history/index.md b/public/content/translations/ja/history/index.md index aec43a252cf..e3a418295ab 100644 --- a/public/content/translations/ja/history/index.md +++ b/public/content/translations/ja/history/index.md @@ -401,7 +401,7 @@ sidebarDepth: 1 #### 要約 {#dao-fork-summary} -DAO フォークは、安全でない[自律分散型組織(DAO)](/glossary/#dao)のコントラクトが、1 回のハッキングによって、360 万以上の ETH を流出させた[2016 年の DAO 攻撃](https://www.coindesk.com/markets/2016/06/25/understanding-the-dao-attack/)に対する対策でした。 フォークにより、欠陥のあるコントラクトから[新しいコントラクト](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754)に資金が移されました。その際に使用した関数が withdraw です。 資金を失った人がウォレット内の 100DAO トークンごとに 1ETH を引き出せるようにしました。 +DAO フォークは、安全でない[自律分散型組織(DAO)](/glossary/#dao)のコントラクトが、1 回のハッキングによって、360 万以上の ETH を流出させた[2016 年の DAO 攻撃](https://www.coindesk.com/learn/understanding-the-dao-attack/)に対する対策でした。 フォークにより、欠陥のあるコントラクトから[新しいコントラクト](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754)に資金が移されました。その際に使用した関数が withdraw です。 資金を失った人がウォレット内の 100DAO トークンごとに 1ETH を引き出せるようにしました。 この行動指針は Ethereum コミュニティの投票で行われました。 ETH 保有者は、 [投票プラットフォーム](http://v1.carbonvote.com/)でトランザクションを通じて投票することができました。 フォークの実行は、投票の 85%以上に支持されました。 diff --git a/public/content/translations/pt-br/history/index.md b/public/content/translations/pt-br/history/index.md index cad383780e8..de0d541274b 100644 --- a/public/content/translations/pt-br/history/index.md +++ b/public/content/translations/pt-br/history/index.md @@ -391,7 +391,7 @@ O fork (bifurcação) Whistle Tangerine foi a primeira resposta aos ataques de n #### Resumo {#dao-fork-summary} -O fork (bifurcação) DAO foi em resposta ao [ataque DAO de 2016](https://www.coindesk.com/markets/2016/06/25/understanding-the-dao-attack/), duranto o qual um contrato inseguro de [DAO](/glossary/#dao) foi esvaziado em mais de 3 milhões de ETH em um hack. O fork (bifurcação) moveu os fundos do contrato defeituoso para um [novo contrato](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754) com uma única função: fazer saque. Qualquer pessoa que tenha perdido fundos poderia sacar 1 ETH para cada 100 tokens DAO em suas carteiras. +O fork (bifurcação) DAO foi em resposta ao [ataque DAO de 2016](https://www.coindesk.com/learn/understanding-the-dao-attack/), duranto o qual um contrato inseguro de [DAO](/glossary/#dao) foi esvaziado em mais de 3 milhões de ETH em um hack. O fork (bifurcação) moveu os fundos do contrato defeituoso para um [novo contrato](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754) com uma única função: fazer saque. Qualquer pessoa que tenha perdido fundos poderia sacar 1 ETH para cada 100 tokens DAO em suas carteiras. Esse curso de ação foi votado pela comunidade Ethereum. Qualquer titular de ETH pôde votar por meio de uma transação em [uma plataforma de votação](http://v1.carbonvote.com/). A decisão de fazer a bifurcação ultrapassou 85% dos votos. diff --git a/public/content/translations/ro/history/index.md b/public/content/translations/ro/history/index.md index 598d3bbd7bd..8b87324b888 100644 --- a/public/content/translations/ro/history/index.md +++ b/public/content/translations/ro/history/index.md @@ -308,7 +308,7 @@ Fork-ul Tangerine Whistle a fost primul răspuns la atacurile prin refuzul-servi #### Rezumat {#dao-fork-summary} -Fork-ul DAO a fost un răspuns la [atacul DAO din 2016](https://www.coindesk.com/markets/2016/06/25/understanding-the-dao-attack/), în care un contract [DAO](/glossary/#dao) nesecurizat a fost golit de peste 3,6 milioane de ETH prin piratare. Fork-ul a mutat fondurile de pe contractul defectuos pe un [contract nou](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754) cu o singură funcție: „withdraw” (retragere). Oricine a pierdut fonduri a putut retrage 1 ETH pentru fiecare 100 de tokenuri DAO din portofel. +Fork-ul DAO a fost un răspuns la [atacul DAO din 2016](https://www.coindesk.com/learn/understanding-the-dao-attack/), în care un contract [DAO](/glossary/#dao) nesecurizat a fost golit de peste 3,6 milioane de ETH prin piratare. Fork-ul a mutat fondurile de pe contractul defectuos pe un [contract nou](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754) cu o singură funcție: „withdraw” (retragere). Oricine a pierdut fonduri a putut retrage 1 ETH pentru fiecare 100 de tokenuri DAO din portofel. Această măsură a fost votată de comunitatea Ethereum. Orice deținător de ETH a putut vota printr-o tranzacție pe [o platformă de vot](http://v1.carbonvote.com/). Decizia de creare a fork-ului a întrunit peste 85% din voturi. From c988dd12ab2c1bff3ae9fde5cfa54ca61090e224 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 15:03:56 -0500 Subject: [PATCH 052/368] change https://nethermind.io/smart-contracts-audits to https://www.nethermind.io/smart-contract-audits --- .../developers/docs/smart-contracts/security/index.md | 6 +++--- .../cs/developers/docs/smart-contracts/security/index.md | 2 +- .../de/developers/docs/smart-contracts/security/index.md | 2 +- .../el/developers/docs/smart-contracts/security/index.md | 2 +- .../es/developers/docs/smart-contracts/security/index.md | 2 +- .../fa/developers/docs/smart-contracts/security/index.md | 2 +- .../fr/developers/docs/smart-contracts/security/index.md | 2 +- .../hi/developers/docs/smart-contracts/security/index.md | 2 +- .../hu/developers/docs/smart-contracts/security/index.md | 2 +- .../id/developers/docs/smart-contracts/security/index.md | 2 +- .../it/developers/docs/smart-contracts/security/index.md | 2 +- .../ja/developers/docs/smart-contracts/security/index.md | 4 ++-- .../nl/developers/docs/smart-contracts/security/index.md | 2 +- .../pcm/developers/docs/smart-contracts/security/index.md | 2 +- .../pt-br/developers/docs/smart-contracts/security/index.md | 2 +- .../tr/developers/docs/smart-contracts/security/index.md | 2 +- .../zh-tw/developers/docs/smart-contracts/security/index.md | 2 +- .../zh/developers/docs/smart-contracts/security/index.md | 2 +- 18 files changed, 21 insertions(+), 21 deletions(-) diff --git a/public/content/developers/docs/smart-contracts/security/index.md b/public/content/developers/docs/smart-contracts/security/index.md index 17a70417390..bd5a5c28b13 100644 --- a/public/content/developers/docs/smart-contracts/security/index.md +++ b/public/content/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ If you plan on querying an on-chain oracle for asset prices, consider using one - **[Hacken](https://hacken.io)** - _Web3 cybersecurity auditor bringing the 360-degree approach to blockchain security._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Solidity and Cairo auditing services, ensuring the integrity of smart contracts and the safety of users across Ethereum and Starknet._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Solidity and Cairo auditing services, ensuring the integrity of smart contracts and the safety of users across Ethereum and Starknet._ - **[HashEx](https://hashex.org/)** - _HashEx focuses on blockchain and smart contract auditing to ensure the security of cryptocurrencies, providing services such as smart contract development, penetration testing, blockchain consulting._ @@ -528,9 +528,9 @@ If you plan on querying an on-chain oracle for asset prices, consider using one - **[HackerOne](https://www.hackerone.com/)** - _Vulnerability coordination and bug bounty platform that connects businesses with penetration testers and cybersecurity researchers._ - **[HackenProof](https://hackenproof.com/)** - _Expert bug bounty platform for crypto projects (DeFi, Smart Contracts, Wallets, CEX and more), where security professionals provide triage services and researchers get paid for relevant, verified bug reports._ - + - **[Sherlock](https://www.sherlock.xyz/)** - _Underwriter in Web3 for smart contract security, with payouts for auditors managed via smart contracts to secure that relevant bugs are paid fairly._ - + - **[CodeHawks](https://www.codehawks.com/)** - _Competitive bug bounty platform where auditors take part in security contests and challenges, and (soon) in their own private audits._ ### Publications of known smart contract vulnerabilities and exploits {#common-smart-contract-vulnerabilities-and-exploits} diff --git a/public/content/translations/cs/developers/docs/smart-contracts/security/index.md b/public/content/translations/cs/developers/docs/smart-contracts/security/index.md index 3b54e9f6d1a..24677753f99 100644 --- a/public/content/translations/cs/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/cs/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ Pokud plánujete dotazovat on-chain orákulum na ceny aktiv, zvažte použití t - **[Hacken](https://hacken.io)** – _Web3 auditor kybernetické bezpečnosti přinášející 360stupňový přístup k bezpečnosti blockchainu._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** – _služby auditu Solidity a Cairo, které zajišťují integritu smart kontraktů a bezpečnost uživatelů napříč Ethereem a Starknetem._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** – _služby auditu Solidity a Cairo, které zajišťují integritu smart kontraktů a bezpečnost uživatelů napříč Ethereem a Starknetem._ - **[HashEx](https://hashex.org/)** – _HashEx se zaměřuje na audit blockchainu a smart kontraktů s cílem zajistit bezpečnost kryptoměn a poskytuje služby, jako je vývoj smart kontraktů, penetrační testování a poradenství v oblasti blockchainu._ diff --git a/public/content/translations/de/developers/docs/smart-contracts/security/index.md b/public/content/translations/de/developers/docs/smart-contracts/security/index.md index ac2f0602a13..09dcb7d0270 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ Wenn Sie vorhaben, ein On-Chain-Orakel für Asset-Preise abzufragen, sollten Sie - **[Hacken](https://hacken.io)** - _Web3 Cybersicherheitsauditor mit 360-Grad-Ansatz für die Sicherheit der Blockchain._ -- **[](https://nethermind.io/smart-contracts-audits)** - _Solidity und Cairo Audit-Dienste sorgen für Datenintegrität der Smart Contracts und Sicherheit der Nutzer im Ethereum- und Starknet-Ökosystem._ +- **[](https://www.nethermind.io/smart-contract-audits)** - _Solidity und Cairo Audit-Dienste sorgen für Datenintegrität der Smart Contracts und Sicherheit der Nutzer im Ethereum- und Starknet-Ökosystem._ - **[HashEx](https://hashex.org/)** - _HashEx konzentriert sich auf die Prüfung von Blockchain und Smart Contracts, um die Sicherheit von Kryptowährungen zu gewährleisten, und bietet Dienstleistungen wie die Entwicklung von Smart Contracts, Penetrationstests und Blockchain-Beratung._ diff --git a/public/content/translations/el/developers/docs/smart-contracts/security/index.md b/public/content/translations/el/developers/docs/smart-contracts/security/index.md index be9fa4a7d38..f3f332e493d 100644 --- a/public/content/translations/el/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/el/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ contract Attack { - **[Hacken](https://hacken.io)** - _Ελεγκτής κυβερνοασφάλειας Web3 που φέρνει την προσέγγιση 360 μοιρών στην ασφάλεια blockchain._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Υπηρεσίες ελέγχου Solidity και Cairo, που διασφαλίζει την ακεραιότητα των έξυπνων συμβολαίων και την ασφάλεια των χρηστών σε όλο το Ethereum και το Starknet._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Υπηρεσίες ελέγχου Solidity και Cairo, που διασφαλίζει την ακεραιότητα των έξυπνων συμβολαίων και την ασφάλεια των χρηστών σε όλο το Ethereum και το Starknet._ - **[HashEx](https://hashex.org/)** - _Η HashEx επικεντρώνεται στον έλεγχο blockchain και έξυπνων συμβολαίων για να διασφαλίσει την ασφάλεια των κρυπτονομισμάτων, παρέχοντας υπηρεσίες όπως ανάπτυξη έξυπνων συμβολαίων, δοκιμές διείσδυσης, συμβουλευτική blockchain._ diff --git a/public/content/translations/es/developers/docs/smart-contracts/security/index.md b/public/content/translations/es/developers/docs/smart-contracts/security/index.md index 2895834b498..d6ae93d8a02 100644 --- a/public/content/translations/es/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/es/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ Si planea consultar a un oráculo en cadena precios de activos, considere el uso - **[Hacken:](https://hacken.io)** _Auditor de ciberseguridad Web3 que aporta el enfoque de 360 grados a la seguridad de la cadena de bloques. _ -- **[Nethermind:](https://nethermind.io/smart-contracts-audits)** _Servicios de auditoría de Solidity y Cairo que garantizan la integridad de los contratos inteligentes y la seguridad de los usuarios en Ethereum y Starknet._ +- **[Nethermind:](https://www.nethermind.io/smart-contract-audits)** _Servicios de auditoría de Solidity y Cairo que garantizan la integridad de los contratos inteligentes y la seguridad de los usuarios en Ethereum y Starknet._ - **[HashEx:](https://hashex.org/)** _HashEx se centra en la auditoría de cadena de bloques y contratos inteligentes para garantizar la seguridad de las criptomonedas, proporcionando servicios como el desarrollo de contratos inteligentes, las pruebas de penetración y la consultoría de cadenas de bloques. _ diff --git a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md index 19490be6333..4c61f31d1b3 100644 --- a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ contract Attack { - **[هک](https://hacken.io)** - _حسابرس امنیت سایبری Web3 که ارائه دهنده 360 رویکرد درجه به امنیت بلاک چین است._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _ خدمات حسابرسی سالیدیتی و کایرو، تضمین یکپارچگی قراردادهای هوشمند و ایمنی کاربران در سراسر اتریوم و استارک نت را ارائه می‌دهد._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _ خدمات حسابرسی سالیدیتی و کایرو، تضمین یکپارچگی قراردادهای هوشمند و ایمنی کاربران در سراسر اتریوم و استارک نت را ارائه می‌دهد._ - **[HashEx](https://hashex.org/)** - _HashEx بر روی بلاکین و حسابرسی قراردادهای هوشمند برای اطمینان از امنیت ارزهای دیجیتال، ارائه خدماتی مانند توسعه قرارداد هوشمند، تست نفوذ، مشاوره بلاکچین تمرکز دارد. diff --git a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md index 9378756bff2..92ff30345e5 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ Si vous comptez interroger un oracle sur le prix des actifs, envisagez d'utilise - **[Hacken](https://hacken.io)** - _Auditeur de cybersécurité Web3 apportant une approche à 360° à la sécurité de la blockchain._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Des services offrant des audits Cairo et Solidity, utilisés comme garantie pour assurer l'intégrité des contrats intelligents et la sécurité des utilisateurs dans les écosystèmes Ethereum et Starknet._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Des services offrant des audits Cairo et Solidity, utilisés comme garantie pour assurer l'intégrité des contrats intelligents et la sécurité des utilisateurs dans les écosystèmes Ethereum et Starknet._ - **[HashEx](https://hashex.org/)** - _Les rapports d'audit présentés par HashEx relatifs à la blockchain et aux contrats intelligents, visent à garantir la sécurité des cryptomonnaies, fournissant des services tels que le développement des contrats intelligents, le test de pénétration, ou le conseil blockchain._ diff --git a/public/content/translations/hi/developers/docs/smart-contracts/security/index.md b/public/content/translations/hi/developers/docs/smart-contracts/security/index.md index 6246da9d701..dfb27994094 100644 --- a/public/content/translations/hi/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/hi/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ DEX की कीमतें अक्सर सटीक होती है - **[हैकेन](https://hacken.io)** - _Web3 साइबर सुरक्षा लेखा परीक्षक जो ब्लॉकचेन सुरक्षा में 360-डिग्री दृष्टिकोण लाता है।_ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Solidity और Cairo ऑडिटिंग सेवाएँ, जो एथेरियम और स्टार्कनेट पर स्मार्ट अनुबंधों की अखंडता और उपयोगकर्ताओं की सुरक्षा सुनिश्चित करती हैं।_ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Solidity और Cairo ऑडिटिंग सेवाएँ, जो एथेरियम और स्टार्कनेट पर स्मार्ट अनुबंधों की अखंडता और उपयोगकर्ताओं की सुरक्षा सुनिश्चित करती हैं।_ - **[HashEx](https://hashex.org/)** - _HashEx क्रिप्टोकरेंसी की सुरक्षा सुनिश्चित करने के लिए ब्लॉकचेन और स्मार्ट अनुबंध ऑडिटिंग पर ध्यान केंद्रित करता है, जो स्मार्ट अनुबंध विकास, प्रवेश परीक्षण, ब्लॉकचेन परामर्श जैसी सेवाएँ प्रदान करता है।_ diff --git a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md index 321fc6ebb4b..826ea1554f4 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ Ha Ön azt tervezi, hogy egy láncon lévő orákulumot kérdez le eszközárak - **[Hacken](https://hacken.io)** – _Web3 kiberbiztonsági auditor, amely 360 fokos megközelítést alkalmaz a blokkláncbiztonságban._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** – _Solidity és Cairo auditszolgáltatások, amelyekkel az okosszerződések integritása, valamint a felhasználók biztonsága is biztosíthat az Ethereumon és a Starkneten._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** – _Solidity és Cairo auditszolgáltatások, amelyekkel az okosszerződések integritása, valamint a felhasználók biztonsága is biztosíthat az Ethereumon és a Starkneten._ - **[HashEx](https://hashex.org/)** – _A HashEx a blokkláncok és okosszerződések auditálásra szakosodott a kriptovaluták biztonságának biztosítása céljából, illetve olyan szolgáltatásokat nyújt, mint az okosszerződés-fejlesztés, sérülékenység-vizsgálat, blokklánctanácsadás._ diff --git a/public/content/translations/id/developers/docs/smart-contracts/security/index.md b/public/content/translations/id/developers/docs/smart-contracts/security/index.md index 040965070ae..3644d33941e 100644 --- a/public/content/translations/id/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/id/developers/docs/smart-contracts/security/index.md @@ -500,7 +500,7 @@ Jika Anda berencana untuk meminta harga aset dari oracle di dalam rantai, pertim - **[Hacken](https://hacken.io)** - _Auditor keamanan Web3 yang menghadirkan pendekatan 360 derajat untuk keamanan rantai blok._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Layanan pengauditan Solidity dan Cairo, memastikan integritas kontrak pintar dan keamanan pengguna di seluruh Ethereum dan Starknet._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Layanan pengauditan Solidity dan Cairo, memastikan integritas kontrak pintar dan keamanan pengguna di seluruh Ethereum dan Starknet._ - **[HashEx](https://hashex.org/)** - _HashEx berfokus pada pengauditan rantai blok dan kontrak pintar untuk memastikan keamanan mata uang kripto, menyediakan layanan seperti pengembangan kontrak pintar, pengujian penetrasi, konsultasi rantai blok._ diff --git a/public/content/translations/it/developers/docs/smart-contracts/security/index.md b/public/content/translations/it/developers/docs/smart-contracts/security/index.md index db98d8cafcd..52b56b3e90a 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ Se prevedi di interrogare un oracolo sulla catena per conoscere i prezzi dei ben - **[Hacken](https://hacken.io)**: _Controllore della cybersicurezza in Web3 che porta un approccio a 360 gradi alla sicurezza della blockchain._ -- **[](https://nethermind.io/smart-contracts-audits)**: _servizi di controllo in Solidity e Carico che garantiscono l'integrità dei contratti intelligenti e la sicurezza degli utenti nell'ecosistema Ethereum e Starknet._ +- **[](https://www.nethermind.io/smart-contract-audits)**: _servizi di controllo in Solidity e Carico che garantiscono l'integrità dei contratti intelligenti e la sicurezza degli utenti nell'ecosistema Ethereum e Starknet._ - **[HashEx](https://hashex.org/)**: _HashEx è incentrata sul controllo della blockchain e dei controlli intelligenti allo scopo di garantire la sicurezza delle criptovalute, fornendo servizi come lo sviluppo di contratti intelligenti, test di penetrazione o consulenza sulla blockchain._ diff --git a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md index cf503e612ad..d4343b5310d 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md @@ -417,7 +417,7 @@ contract Attack { function attack() public payable { timeLock.deposit{value: msg.value}(); /* - 「t = 現在のロック時間」ならば、xを以下のようにして求める必要があります。 + 「t = 現在のロック時間」ならば、xを以下のようにして求める必要があります。 x + t = 2**256 = 0 so x = -t 2**256 = type(uint).max + 1 @@ -503,7 +503,7 @@ DEXの価格は正確であることが多く、これは市場の均衡を取 - **[Hacken](https://hacken.io)** - _ブロックチェーンセキュリティへの360度アプローチをもたらすサイバーセキュリティ監査人。_ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _ SolidityとCairoの監査サービスにより、イーサリアムとStarknet全体でスマートコントラクトの整合性とユーザーの安全を確保。_ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _ SolidityとCairoの監査サービスにより、イーサリアムとStarknet全体でスマートコントラクトの整合性とユーザーの安全を確保。_ - **[HashEx](https://hashex.org/)** - _HashExは、ブロックチェーンとスマート コントラクトの監査に焦点を当てており、暗号通貨のセキュリティを確保するためのスマートコントラクト開発、侵入テスト、ブロックチェーンコンサルティングなどのサービスを提供。_ diff --git a/public/content/translations/nl/developers/docs/smart-contracts/security/index.md b/public/content/translations/nl/developers/docs/smart-contracts/security/index.md index aa9d5a62503..21330628f8e 100644 --- a/public/content/translations/nl/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/nl/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ Als u van plan bent om een on-chain oracle te raadplegen voor activaprijzen, geb - **[Hacken](https://hacken.io)** - _Web3-cyberbeveiligingsauditor die een 360-gradenaanpak levert voor blockchainbeveiliging._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Solidity- en Cairo-auditservices, die de integriteit van smart contracts en de beveiliging van gebruikers op Ethereum en Starknet waarborgen._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Solidity- en Cairo-auditservices, die de integriteit van smart contracts en de beveiliging van gebruikers op Ethereum en Starknet waarborgen._ - **[HashEx](https://hashex.org/)** - _HashEx richt zich op blockchain- en smart contract-auditing om de beveiliging van cryptovaluta te garanderen, en levert services zoals smart contract-ontwikkeling, penetratietesten en blockchain-consulting._ diff --git a/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md b/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md index e81b4b9f834..6da2f85510a 100644 --- a/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ If yu dey plan query on-chain orakol for asset prices, make yu konsida to dey yu - **[Hacken](https://hacken.io)** - _ Web3 cybersekurity auditor wey dey bring di 360-degree approach to blockchain sekurity._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _ Solidity and Cairo auditing savis wey sure sey di intergrity of smart kontracts and di safety of di users akross Ethereum and Starknet._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _ Solidity and Cairo auditing savis wey sure sey di intergrity of smart kontracts and di safety of di users akross Ethereum and Starknet._ - **[HashEx](https://hashex.org/)** - _HashEx dey fokus on blockchain and di smart kontract auditing to sure sey di sekurity of cryptocurrencies, dey provide savis laik smart kontract divelopment, penetrashon testing, blockchain konsulting._ diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md index 3fdeccb47a5..316fa37d97b 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ Se você planeja consultar um oráculo on-chain para preços de ativos, consider - **[Hacken](https://hacken.io)** - _Auditor de cibersegurança da Web3 que traz a abordagem de 360 graus à segurança da blockchain._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Serviços de auditoria Solidity e Cairo que garantem a integridade dos contratos inteligentes e a segurança dos usuários em toda a Ethereum e Starknet._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Serviços de auditoria Solidity e Cairo que garantem a integridade dos contratos inteligentes e a segurança dos usuários em toda a Ethereum e Starknet._ - **[HashEx](https://hashex.org/)** – _O HashEx se dedica a blockchain e auditoria de contrato inteligente para garantir a segurança de criptomoedas, fornecendo serviços como desenvolvimento de contrato inteligente, teste de penetração e consultoria em blockchain._ diff --git a/public/content/translations/tr/developers/docs/smart-contracts/security/index.md b/public/content/translations/tr/developers/docs/smart-contracts/security/index.md index 5cb6c26154a..d8766680242 100644 --- a/public/content/translations/tr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/tr/developers/docs/smart-contracts/security/index.md @@ -504,7 +504,7 @@ Varlık fiyatları için bir zincir üstünde kâhin sorgulaması yapmayı planl - **[Hacken](https://hacken.io)** - _Blokzincir güvenliğine 360 derece yaklaşımını getiren Web3 siber güvenlik denetimcisi._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Ethereum ve Starknet üzerinde akıllı sözleşmelerin bütünlüğünü ve kullanıcıların güvenliğini güvence altına alan Solidity ve Cairo denetim hizmetleri._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Ethereum ve Starknet üzerinde akıllı sözleşmelerin bütünlüğünü ve kullanıcıların güvenliğini güvence altına alan Solidity ve Cairo denetim hizmetleri._ - **[HashEx](https://hashex.org/)** - _HashEx, kripto paraların güvenliğini güvence altına almak için blokzincir ve akıllı sözleşme denetimlerine odaklanırken akıllı sözleşme geliştirme, penetrasyon testi ve blokzincir danışmanlığı gibi hizmetler de sunar._ diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md index 692eca72671..e8366b43df3 100644 --- a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ contract Attack { - **[Hacken](https://hacken.io)** - _為區塊鏈安全採用 360 度全方位方法的 Web3 網路安全審核者。_ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Solidity 和 Cairo 稽核服務,確保智慧型合約完整性、以及以太坊及 Starknet 使用者的安全。_ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Solidity 和 Cairo 稽核服務,確保智慧型合約完整性、以及以太坊及 Starknet 使用者的安全。_ - **[HashEx](https://hashex.org/)** - _HashEx 專注於區塊鏈和智慧型合約審核,以確保加密貨幣的安全性,提供智慧型合約開發、滲透測試、區塊鏈諮詢等服務。_ diff --git a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md index 60a26a76fbb..166f3e66393 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md @@ -505,7 +505,7 @@ contract Attack { - **[Hacken](https://hacken.io)** - _Web3 网络安全审计公司,为区块链安全提供全方位解决方案。_ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Solidity 和 Cairo 审计服务,确保智能合约的完整性和跨以太坊和 Starknet 的用户安全_ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Solidity 和 Cairo 审计服务,确保智能合约的完整性和跨以太坊和 Starknet 的用户安全_ - **[HashEx](https://hashex.org/)** - _HashEx 专注于区块链和智能合约审计,确保加密货币安全,提供智能合约开发、渗透测试、区块链咨询等服务。_ From f5570c4c6dde538ef4dcd8dc64ec2d090e49e2ff Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 15:04:29 -0500 Subject: [PATCH 053/368] change https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach to https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach - https://web.archive.org/web/20180720020038/https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach/ --- .../content/developers/docs/smart-contracts/security/index.md | 2 +- .../cs/developers/docs/smart-contracts/security/index.md | 2 +- .../de/developers/docs/smart-contracts/security/index.md | 2 +- .../el/developers/docs/smart-contracts/security/index.md | 2 +- .../content/translations/es/developers/docs/security/index.md | 2 +- .../es/developers/docs/smart-contracts/security/index.md | 2 +- .../fa/developers/docs/smart-contracts/security/index.md | 2 +- .../content/translations/fr/developers/docs/security/index.md | 2 +- .../fr/developers/docs/smart-contracts/security/index.md | 2 +- .../hi/developers/docs/smart-contracts/security/index.md | 2 +- .../content/translations/hu/developers/docs/security/index.md | 2 +- .../hu/developers/docs/smart-contracts/security/index.md | 2 +- .../id/developers/docs/smart-contracts/security/index.md | 2 +- .../content/translations/it/developers/docs/security/index.md | 2 +- .../it/developers/docs/smart-contracts/security/index.md | 2 +- .../ja/developers/docs/smart-contracts/security/index.md | 2 +- .../nl/developers/docs/smart-contracts/security/index.md | 2 +- .../pcm/developers/docs/smart-contracts/security/index.md | 2 +- .../content/translations/pl/developers/docs/security/index.md | 2 +- .../pt-br/developers/docs/smart-contracts/security/index.md | 2 +- .../content/translations/ro/developers/docs/security/index.md | 2 +- .../ro/developers/docs/smart-contracts/security/index.md | 2 +- .../tr/developers/docs/smart-contracts/security/index.md | 2 +- .../zh-tw/developers/docs/smart-contracts/security/index.md | 2 +- .../content/translations/zh/developers/docs/security/index.md | 2 +- .../zh/developers/docs/smart-contracts/security/index.md | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/public/content/developers/docs/smart-contracts/security/index.md b/public/content/developers/docs/smart-contracts/security/index.md index bd5a5c28b13..0205042c26c 100644 --- a/public/content/developers/docs/smart-contracts/security/index.md +++ b/public/content/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Smart contracts are extremely flexible, and capable of controlling large amounts Public blockchains, like Ethereum, further complicate the issue of securing smart contracts. Deployed contract code _usually_ cannot be changed to patch security flaws, while assets stolen from smart contracts are extremely difficult to track and mostly irrecoverable due to immutability. -Although figures vary, it is estimated that the total amount of value stolen or lost due to security defects in smart contracts is easily over $1 billion. This includes high-profile incidents, such as the [DAO hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M ETH stolen, worth over $1B in today’s prices), [Parity multi-sig wallet hack](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) ($30M lost to hackers), and the [Parity frozen wallet issue](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (over $300M in ETH locked forever). +Although figures vary, it is estimated that the total amount of value stolen or lost due to security defects in smart contracts is easily over $1 billion. This includes high-profile incidents, such as the [DAO hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M ETH stolen, worth over $1B in today’s prices), [Parity multi-sig wallet hack](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) ($30M lost to hackers), and the [Parity frozen wallet issue](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (over $300M in ETH locked forever). The aforementioned issues make it imperative for developers to invest effort in building secure, robust, and resilient smart contracts. Smart contract security is serious business, and one that every developer will do well to learn. This guide will cover security considerations for Ethereum developers and explore resources for improving smart contract security. diff --git a/public/content/translations/cs/developers/docs/smart-contracts/security/index.md b/public/content/translations/cs/developers/docs/smart-contracts/security/index.md index 24677753f99..ce69a581f4d 100644 --- a/public/content/translations/cs/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/cs/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Smart kontrakty jsou velmi flexibilní a schopné ovládat velké množství hod Veřejné blockchainy, jako je Ethereum, dále komplikují otázku zabezpečení smart kontraktů. Nasazený kód kontraktu _obvykle_ není možné změnit, aby se opravily bezpečnostní chyby, a majetek odcizený ze smart kontraktů je kvůli nezměnitelnosti extrémně obtížné sledovat a prakticky nemožné získat zpět. -I když se údaje liší, odhaduje se, že celková hodnota odcizených nebo ztracených prostředků z důvodu bezpečnostních chyb ve smart kontraktech dnes přesahuje 1 miliardu dolarů. To zahrnuje incidenty s vysokým profilem, jako je [hack DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (ukradeno 3,6 milionu ETH, což v dnešní ceně představuje více než 1 miliardu dolarů), [hack multi-sig peněženky Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (škoda ve výši 30 milionů dolarů kvůli hackerům) a [problém se zmrazením peněženek Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (přes 300 milionů dolarů v ETH zůstalo zamčeno navždy). +I když se údaje liší, odhaduje se, že celková hodnota odcizených nebo ztracených prostředků z důvodu bezpečnostních chyb ve smart kontraktech dnes přesahuje 1 miliardu dolarů. To zahrnuje incidenty s vysokým profilem, jako je [hack DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (ukradeno 3,6 milionu ETH, což v dnešní ceně představuje více než 1 miliardu dolarů), [hack multi-sig peněženky Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (škoda ve výši 30 milionů dolarů kvůli hackerům) a [problém se zmrazením peněženek Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (přes 300 milionů dolarů v ETH zůstalo zamčeno navždy). Výše zmíněné problémy ukazují na důležitost zajištění bezpečnosti smart kontraktů a dělají z ní nezbytnost, do které by měli vývojáři investovat úsilí. Zabezpečení smart kontraktů je vážnou záležitostí, kterou by se měl každý vývojář naučit. Tento průvodce pokrývá bezpečnostní aspekty pro vývojáře Etherea a poskytuje zdroje pro zvýšení bezpečnosti smart kontraktů. diff --git a/public/content/translations/de/developers/docs/smart-contracts/security/index.md b/public/content/translations/de/developers/docs/smart-contracts/security/index.md index 09dcb7d0270..65a4ba8a492 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Smart Contracts sind äußerst flexibel und in der Lage, große Mengen an Werten Öffentliche Blockchains wie Ethereum erschweren das Problem der Sicherung von Smart Contracts zusätzlich. Der Code des veröffentlichten Vertrags _kann in der Regel _ nicht geändert werden, um Sicherheitslücken zu schließen, während die aus Smart Contracts gestohlenen Vermögenswerte aufgrund der Unveränderlichkeit extrem schwer nachzuverfolgen und meist nicht wiederherzustellen sind. -Obwohl die Zahlen variieren, wird geschätzt, dass der Gesamtbetrag des gestohlenen oder verlorenen Werts aufgrund von Sicherheitsmängeln in Smart Contracts weit über 1 Milliarde US-Dollar beträgt. Dies beinhaltet hochkarätige Vorfälle, wie den [DAO-Hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 Mio. ETH gestohlen, nach heutigen Preisen über 1 Milliarde US-Dollar wert), den [Parity Multi-Sig Wallet-Hack](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (30 Mio. US-Dollar von Hackern verloren) und das [Problem mit den eingefrorenen Parity-Wallets](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (über 300 Mio. US-Dollar in ETH gesperrt). +Obwohl die Zahlen variieren, wird geschätzt, dass der Gesamtbetrag des gestohlenen oder verlorenen Werts aufgrund von Sicherheitsmängeln in Smart Contracts weit über 1 Milliarde US-Dollar beträgt. Dies beinhaltet hochkarätige Vorfälle, wie den [DAO-Hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 Mio. ETH gestohlen, nach heutigen Preisen über 1 Milliarde US-Dollar wert), den [Parity Multi-Sig Wallet-Hack](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 Mio. US-Dollar von Hackern verloren) und das [Problem mit den eingefrorenen Parity-Wallets](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (über 300 Mio. US-Dollar in ETH gesperrt). Die oben genannten Probleme machen es für Entwickler zwingend erforderlich, in die Entwicklung sicherer, robuster und widerstandsfähiger Smart Contracts zu investieren. Die Sicherheit von Smart Contracts ist eine ernste Angelegenheit, die jeder Entwickler lernen sollte. In diesem Ratgeber werden Sicherheitsüberlegungen für Ethereum-Entwickler behandelt und Ressourcen zur Verbesserung der Smart Contract-Sicherheit vorgestellt. diff --git a/public/content/translations/el/developers/docs/smart-contracts/security/index.md b/public/content/translations/el/developers/docs/smart-contracts/security/index.md index f3f332e493d..bb0598c8e0d 100644 --- a/public/content/translations/el/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/el/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ lang: el Τα δημόσια blockchain, όπως το Ethereum, περιπλέκουν περαιτέρω το ζήτημα της ασφάλειας των έξυπνων συμβολαίων. Ο αναπτυγμένος κώδικας συμβολαίων _συνήθως_ δεν μπορεί να αλλάξει για να διορθώσει τρωτότητες της ασφάλειας, ενώ τα περιουσιακά στοιχεία που αποσπώνται από έξυπνα συμβόλαια είναι εξαιρετικά δύσκολο να εντοπιστούν και η ανάκτησή τους είναι ως επί το πλείστον αδύνατη λόγω του αμετακλήτου τους. -Αν και οι αριθμοί διαφέρουν, εκτιμάται ότι το συνολικό ποσό αξίας που κλάπηκε ή χάθηκε λόγω ελαττωμάτων ασφαλείας στα έξυπνα συμβόλαια υπερβαίνει άνετα το 1 δισεκατομμύριο δολάρια. Αυτό περιλαμβάνει υψηλού προφίλ περιστατικά, όπως το [hack του DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 εκατομμύρια ETH κλαπέντα, αξίας άνω του 1 δισεκατομμυρίου δολαρίων σε σημερινές τιμές), το [hack του πορτοφολιού πολλαπλών υπογραφών Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (30 εκατομμύρια δολάρια χάθηκαν από χάκερ) και το πρόβλημα του [παγωμένου πορτοφολιού Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (πάνω από 300 εκατομμύρια ETH κλειδωμένα για πάντα). +Αν και οι αριθμοί διαφέρουν, εκτιμάται ότι το συνολικό ποσό αξίας που κλάπηκε ή χάθηκε λόγω ελαττωμάτων ασφαλείας στα έξυπνα συμβόλαια υπερβαίνει άνετα το 1 δισεκατομμύριο δολάρια. Αυτό περιλαμβάνει υψηλού προφίλ περιστατικά, όπως το [hack του DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 εκατομμύρια ETH κλαπέντα, αξίας άνω του 1 δισεκατομμυρίου δολαρίων σε σημερινές τιμές), το [hack του πορτοφολιού πολλαπλών υπογραφών Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 εκατομμύρια δολάρια χάθηκαν από χάκερ) και το πρόβλημα του [παγωμένου πορτοφολιού Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (πάνω από 300 εκατομμύρια ETH κλειδωμένα για πάντα). Τα προαναφερθέντα ζητήματα καθιστούν επιτακτική την ανάγκη οι προγραμματιστές να καταβάλουν προσπάθειες για την ανάπτυξη ασφαλών, εύρωστων και ανθεκτικών έξυπνων συμβολαίων. Η ασφάλεια των έξυπνων συμβολαίων είναι σοβαρή υπόθεση και κάθε προγραμματιστής θα πρέπει να μάθει γι' αυτή. Αυτός ο οδηγός θα καλύψει ζητήματα ασφάλειας για προγραμματιστές Ethereum και θα εξερευνήσει πόρους για τη βελτίωση της ασφάλειας των έξυπνων συμβολαίων. diff --git a/public/content/translations/es/developers/docs/security/index.md b/public/content/translations/es/developers/docs/security/index.md index 9d321396909..7d1ae2629fa 100644 --- a/public/content/translations/es/developers/docs/security/index.md +++ b/public/content/translations/es/developers/docs/security/index.md @@ -6,7 +6,7 @@ lang: es Los contratos Inteligentes de Ethereum son extremadamente flexibles, capaces de contener grandes cantidades de tokens (A menudo más de $1B) y ejecutar una lógica inmutable basada en el código de contrato inteligente previamente desplegado. Aunque esto ha creado un ecosistema vibrante y creativo de contratos inteligentes sin confianza e interconectados, es también el ecosistema perfecto para atraer atacantes que buscan beneficios explotando las vulnerabilidades de los contratos inteligentes y los comportamientos inesperados en Ethereum. El código del contrato inteligente _normalmente_ no se puede modificar para "poner parches" a los fallos de seguridad, por lo que los activos robados de contratos inteligentes son irrecuperables, y los activos robados son extremadamente difíciles de rastrear. La cantidad total de valor robado o perdido debido a problemas de contratos inteligentes asciende fácilmente a $1B USD. Algunos de los mayores debido a errores de codificación de contrato inteligente incluyen: -- [Parity multi-sig issue #1: $30 M perdidos](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) +- [Parity multi-sig issue #1: $30 M perdidos](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) - [Problema de paridad multi-sig #2: $300M bloqueados](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) - [TheDAO hack, 3.6M ETH! Más de $1B en los precios ETH de hoy](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) diff --git a/public/content/translations/es/developers/docs/smart-contracts/security/index.md b/public/content/translations/es/developers/docs/smart-contracts/security/index.md index d6ae93d8a02..2109053f32f 100644 --- a/public/content/translations/es/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/es/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Los contratos inteligentes son extremadamente flexibles y capaces de controlar g Las cadenas de bloques públicas como Ethereum complican aún más la cuestión de la seguridad de los contratos inteligentes. El código de los contratos ya implementado _por lo general_ no puede cambiarse para corregir fallas de seguridad, mientras que los activos robados de los contratos inteligentes son extremadamente difíciles de rastrear y en su mayor parte irrecuperables debido a la inmutabilidad. -Aunque las cifras varían, se estima que la cantidad total de valor robado o perdido debido a defectos de seguridad en los contratos inteligentes supera fácilmente los USD 1000 millones de dólares. Esto incluye incidentes de alto perfil, tal como el [hackeo a la DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 millones de ETH robados, por valor de más de USD 1000 millones a precios actuales), el [hackeo de la billetera multifirma de Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (USD 30M perdidos a manos de hackers) y el [problema de billeteras congeladas de Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (mas de USD 300M en ETH bloqueados para siempre). +Aunque las cifras varían, se estima que la cantidad total de valor robado o perdido debido a defectos de seguridad en los contratos inteligentes supera fácilmente los USD 1000 millones de dólares. Esto incluye incidentes de alto perfil, tal como el [hackeo a la DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 millones de ETH robados, por valor de más de USD 1000 millones a precios actuales), el [hackeo de la billetera multifirma de Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (USD 30M perdidos a manos de hackers) y el [problema de billeteras congeladas de Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (mas de USD 300M en ETH bloqueados para siempre). Los problemas mencionados anteriormente hacen que sea imperativo que los desarrolladores inviertan esfuerzos en la creación de contratos inteligentes seguros, robustos y resistentes. La seguridad de los contratos inteligentes es un asunto serio que todo desarrollador hará bien en aprender. Esta guía abordará consideraciones de seguridad para los desarrolladores de Ethereum y explorará recursos para mejorar la seguridad de los contratos inteligentes. diff --git a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md index 4c61f31d1b3..c15de3ace25 100644 --- a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ lang: fa بلاک چین های عمومی، مانند اتریوم، مسئله ایمن‌سازی قراردادهای هوشمند را پیچیده‌تر و سخت‌تر می کند. _معمولا_ پس از استقرار کد قرارداد در شبکه، نمی‌توان آن را به منظور رفع نقص های امنیتی را تغییر داد، در حالی که ردیابی دارایی های دزدیده شده از قراردادهای هوشمند بسیار دشوار است و عمدتاً به دلیل تغییر ناپذیری قابل بازیابی نیستند. -اگرچه اعداد و ارقام متفاوت است، تخمین زده می شود که کل ارزش سرقت شده یا از دست رفته به دلیل نقص امنیتی در قراردادهای هوشمند به راحتی بیش از یک میلیارد دلار است. این شامل حوادث پرمخاطب، مانند [هک DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M اتریوم دزدیده شده، به ارزش بیش از 1 میلیارد دلار در قیمت های امروزی)، [هک کیف پول چند علامتی Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (30 میلیون دلار از دست هکرها) و [ مشکل کیف پول منجمد شده](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (بیش از 300 میلیون دلار ETH برای همیشه قفل شده است). +اگرچه اعداد و ارقام متفاوت است، تخمین زده می شود که کل ارزش سرقت شده یا از دست رفته به دلیل نقص امنیتی در قراردادهای هوشمند به راحتی بیش از یک میلیارد دلار است. این شامل حوادث پرمخاطب، مانند [هک DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M اتریوم دزدیده شده، به ارزش بیش از 1 میلیارد دلار در قیمت های امروزی)، [هک کیف پول چند علامتی Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 میلیون دلار از دست هکرها) و [ مشکل کیف پول منجمد شده](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (بیش از 300 میلیون دلار ETH برای همیشه قفل شده است). مسائل ذکر شده، توسعه دهندگان را مجبور می‌کند تا تلاش کنند قراردادهای هوشمند ایمن، نبوغ آمیز و منعطف بسازند. امنیت قراردادهای هوشمند یک تجارت جدی است و هر توسعه‌دهنده‌ای باید آن را یاد بگیرد. این راهنما ملاحظات امنیتی برای توسعه دهندگان اتریوم را پوشش می دهد و منابعی را برای بهبود امنیت قراردادهای هوشمند بررسی می کند. diff --git a/public/content/translations/fr/developers/docs/security/index.md b/public/content/translations/fr/developers/docs/security/index.md index a6c101614c6..a25a9004ae8 100644 --- a/public/content/translations/fr/developers/docs/security/index.md +++ b/public/content/translations/fr/developers/docs/security/index.md @@ -6,7 +6,7 @@ lang: fr Les contrats intelligents Ethereum sont extrêmement flexibles, capables à la fois de détenir de grandes quantités de jetons (souvent plus de 1 milliard de $) et d'exécuter une logique immuable sur du code intelligent précédemment déployé. Alors que cela a créé un écosystème dynamique et créatif de contrats intelligents interconnectés et trustless, c'est aussi l'écosystème parfait pour attirer les attaquants qui cherchent à en tirer profit en exploitant des vulnérabilités dans les contrats intelligents et des comportements inattendus dans Ethereum. Le code d'un contrat intelligent ne peut _habituellement_ pas être modifié pour corriger les défauts de sécurité, les actifs volés à partir de contrats intelligents sont irrécupérables et extrêmement difficiles à tracer. Le montant total volé ou perdu en raison de problèmes sur les contrats intelligents atteint facilement le milliard de dollars. Voici quelques-uns des problèmes les plus importants dus à des erreurs de codage de contrat intelligent : -- [Problème n°1 de multisig Parity - 30 millions de dollars perdus](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) +- [Problème n°1 de multisig Parity - 30 millions de dollars perdus](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) - [Problème n°2 de multisig Parity - 300 millions de dollars perdus](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) - [Hack TheDAO, 3,6 millions d'ETH ! Prés de 1 milliard de dollars en prix actuel de l'ETH](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) diff --git a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md index 92ff30345e5..df203b1d057 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Les contrats intelligents sont extrêmement flexibles et capables de contrôler Les blockchains publiques, comme Ethereum, compliquent encore davantage la question de la sécurisation des contrats intelligents. Le code de contrat déployé ne peut _généralement_ pas être modifié pour corriger des défauts de sécurité, et les actifs volés sur des contrats intelligents sont extrêmement difficiles à suivre et la plupart du temps irrécupérables en raison de l’immuabilité. -Bien que les chiffres varient, on estime que le montant total de la valeur volée ou perdue en raison de défauts de sécurité dans les contrats intelligents est d'au moins 1 milliard de dollars. Cela inclut des incidents de haut niveau, tels que [le hack de DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 millions d'ETH volés, d'une valeur de plus de 1 milliard de dollars aux prix actuels), [le hack du portefeuille multi-sig Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (30 millions de dollars volés par les hackeurs), et [le problème du portefeuille gelé Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (plus de 300 millions de dollars en ETH verrouillés pour toujours). +Bien que les chiffres varient, on estime que le montant total de la valeur volée ou perdue en raison de défauts de sécurité dans les contrats intelligents est d'au moins 1 milliard de dollars. Cela inclut des incidents de haut niveau, tels que [le hack de DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 millions d'ETH volés, d'une valeur de plus de 1 milliard de dollars aux prix actuels), [le hack du portefeuille multi-sig Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 millions de dollars volés par les hackeurs), et [le problème du portefeuille gelé Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (plus de 300 millions de dollars en ETH verrouillés pour toujours). Les problèmes susmentionnés rendent impératif pour les développeurs d'investir des efforts dans la construction de contrats intelligents sécurisés, robustes et résistants. La sécurité des contrats intelligents est une affaire sérieuse, que chaque développeur ferait bien d’apprendre. Ce guide couvrira les considérations de sécurité des développeurs Ethereum et explorera les ressources pour améliorer la sécurité des contrats intelligents. diff --git a/public/content/translations/hi/developers/docs/smart-contracts/security/index.md b/public/content/translations/hi/developers/docs/smart-contracts/security/index.md index dfb27994094..19628e23f8d 100644 --- a/public/content/translations/hi/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/hi/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ lang: hi एथेरियम जैसे सार्वजनिक ब्लॉकचेन, स्मार्ट अनुबंध को सुरक्षित करने के मुद्दे को और जटिल बनाते हैं। परिनियोजित किया गया अनुबंध कोड _आमतौर_ पर सुरक्षा खामियों को ठीक करने के लिए नहीं बदला जा सकता, जबकि स्मार्ट अनुबंधों से चुराई गई संपत्तियों को ट्रैक करना बेहद मुश्किल होता है और अपरिवर्तनीयता के कारण ज्यादातर वापस नहीं मिल पाती हैं। -हालांकि आंकड़े अलग-अलग हैं, यह अनुमान लगाया जाता है कि स्मार्ट अनुबंधों में सुरक्षा दोषों के कारण चोरी या खोए गए कुल मूल्य की राशि आसानी से 1 अरब डॉलर से अधिक है। इसमें उच्च-प्रोफाइल घटनाएं शामिल हैं, जैसे [डीएओ हैक](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M ETH चोरी, आज की कीमतों में $1B से अधिक मूल्य), [पैरिटी मल्टी-सिग वॉलेट हैक](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (हैकर्स के कारण $30M का नुकसान), और [पैरिटी फ्रोजन वॉलेट समस्या](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) ($300M से अधिक ETH हमेशा के लिए लॉक हो गए)। +हालांकि आंकड़े अलग-अलग हैं, यह अनुमान लगाया जाता है कि स्मार्ट अनुबंधों में सुरक्षा दोषों के कारण चोरी या खोए गए कुल मूल्य की राशि आसानी से 1 अरब डॉलर से अधिक है। इसमें उच्च-प्रोफाइल घटनाएं शामिल हैं, जैसे [डीएओ हैक](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M ETH चोरी, आज की कीमतों में $1B से अधिक मूल्य), [पैरिटी मल्टी-सिग वॉलेट हैक](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (हैकर्स के कारण $30M का नुकसान), और [पैरिटी फ्रोजन वॉलेट समस्या](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) ($300M से अधिक ETH हमेशा के लिए लॉक हो गए)। उपरोक्त समस्याएं डेवलपर्स के लिए सुरक्षित, मजबूत और लचीले स्मार्ट अनुबंध बनाने में प्रयास करना अनिवार्य बनाती हैं। स्मार्ट अनुबंध सुरक्षा एक गंभीर व्यवसाय है, और ऐसा जिसे हर डेवलपर को सीखना चाहिए। यह गाइड एथेरियम डेवलपर्स के लिए सुरक्षा संबंधी विचारों को कवर करेगी और स्मार्ट अनुबंध सुरक्षा में सुधार के लिए संसाधनों की खोज करेगी। diff --git a/public/content/translations/hu/developers/docs/security/index.md b/public/content/translations/hu/developers/docs/security/index.md index 0d34146fecc..f69d5f50d44 100644 --- a/public/content/translations/hu/developers/docs/security/index.md +++ b/public/content/translations/hu/developers/docs/security/index.md @@ -6,7 +6,7 @@ lang: hu Az Ethereum okosszerződések rendkívül flexibilisek, képesek nagy mennyiségű tokent tárolni (néha meghaladja az 1 Mrd. Usd-t) és megváltoztathatatlan logikát futtatni, mely korábban telepített okosszerződés kódon alapszik. Bár ez egy élénk és kreatív ökoszisztémát hozott létre a bizalom nélküli, egymással összekapcsolt okosszerződésekből, ugyanakkor tökéletes ökoszisztéma a profitra törekvő támadók számára is, aki az okosszerződések sebezhető pontjainak és az Ethereum váratlan viselkedésének kihasználásával szeretnének profitra szert tenni. Az okosszerződés kódot _általában_ nem lehet megváltoztatni biztonsági hibák javítása céljából, az okosszerződésekből ellopott vagyont nem lehet visszaszerezni, és a lopott vagyont rendkívül nehéz nyomon követni. Az okosszerződés hibák miatt ellopott vagy elveszett érték teljes összege már könnyedén meghaladja az 1 Mrd. USD-t. A nagyobb okosszerződés hibák között van a: -- [Parity multi-sig hiba #1 - 30 millió USD elveszett](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) +- [Parity multi-sig hiba #1 - 30 millió USD elveszett](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) - [Parity multi-sig hiba#2 - 300 millió USD lekötve](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) - [A TheDAO hack, 3.6M ETH! Több mint 1 Mrd. USD a mai ETH árfolyamon](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) diff --git a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md index 826ea1554f4..aff6264d90a 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Az okosszerződések rendkívüli módon rugalmasak és képesek nagy mennyiség A nyilvános blokkláncok, mint az Ethereum, tovább bonyolítják az okosszerződések biztosításának problémáját. A telepített szerződéskód _általában_ nem módosítható, hogy ezzel a biztonsági kockázatokat elkerüljék, eközben az okosszerződésekből ellopott eszközöket rendkívül nehéz lekövetni és a legtöbb esetben visszaszerezhetetlenek a megváltoztathatatlanság miatt. -Bár a számok változnak, de úgy becsülik, hogy a biztonsági hibák miatt az okosszerződésből ellopott vagy onnan elvesztett értékek teljes összege könnyen meghaladhatja az 1 milliárd dollárt is. Ez magába foglal olyan nagy horderejű incidenseket is, mint amilyen a [DAO-hackelés volt](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 millió ETH-t loptak, ami meghaladja az 1 milliárd dollárt mai áron), [Parity több aláírásos tárca hackelését](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (30 millió USD-t veszett el), és a [Parity befagyasztott tárcaproblémát](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (300 millió USD-nyi ETH örökre elérhetetlenné vált). +Bár a számok változnak, de úgy becsülik, hogy a biztonsági hibák miatt az okosszerződésből ellopott vagy onnan elvesztett értékek teljes összege könnyen meghaladhatja az 1 milliárd dollárt is. Ez magába foglal olyan nagy horderejű incidenseket is, mint amilyen a [DAO-hackelés volt](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 millió ETH-t loptak, ami meghaladja az 1 milliárd dollárt mai áron), [Parity több aláírásos tárca hackelését](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 millió USD-t veszett el), és a [Parity befagyasztott tárcaproblémát](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (300 millió USD-nyi ETH örökre elérhetetlenné vált). Ezek az esetek kötelezővé teszik a fejlesztők számára, hogy folyamatosan azon dolgozzanak, hogy az okosszerződések biztonságosak, robusztusak és ellenállók legyenek. Az okosszerződésbiztonság komoly téma, melyet minden fejlesztőnek a maga érdekében meg kell ismerni. Ez az útmutató lefedi azokat a biztonsági megfontolásokat, amelyek az Ethereum-fejlesztőknek fontosak, és forrásokat tár fel az okosszerződésbiztonság továbbfejlesztésére. diff --git a/public/content/translations/id/developers/docs/smart-contracts/security/index.md b/public/content/translations/id/developers/docs/smart-contracts/security/index.md index 3644d33941e..c9b9f2dae83 100644 --- a/public/content/translations/id/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/id/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Kontrak pintar sangat fleksibel dan mampu mengontrol nilai dan data dalam jumlah Rantai Blok publik, seperti Ethereum, makin memperumit masalah pengamanan kontrak pintar. Kode kontrak yang disebarkan _biasanya_ tidak dapat diubah untuk menambal kekurangan pada keamanannya, sementara aset yang dicuri dari kontrak pintar sulit sekali untuk dilacak dan kebanyakan tidak dapat dipulihkan karena sifat permanennya. -Meskipun ada perbedaan angka, diperkirakan bahwa nilai total yang dicuri atau hilang akibat cacat keamanan di kontrak pintar dapat mencapai lebih dari $1 miliar. Hal ini termasuk insiden yang menjadi perhatian publik, seperti [peretasan DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 juta ETH dicuri, yang saat ini bernilai lebih dari $1 miliar dolar), [Peretasan dompet parity multi-sig](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) ($30 juta hilang karena peretas), dan [Masalah dompet beku parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (lebih dari $300 juta nilai ETH terkunci selamanya). +Meskipun ada perbedaan angka, diperkirakan bahwa nilai total yang dicuri atau hilang akibat cacat keamanan di kontrak pintar dapat mencapai lebih dari $1 miliar. Hal ini termasuk insiden yang menjadi perhatian publik, seperti [peretasan DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 juta ETH dicuri, yang saat ini bernilai lebih dari $1 miliar dolar), [Peretasan dompet parity multi-sig](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) ($30 juta hilang karena peretas), dan [Masalah dompet beku parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (lebih dari $300 juta nilai ETH terkunci selamanya). Berbagai masalah yang disebutkan di atas mengharuskan pengembang untuk meningkatkan upaya dalam membuat kontrak pintar yang aman, kuat, dan tangguh. Keamanan kontrak pintar adalah masalah yang serius, dan harus dipelajari dengan baik oleh setiap pengembang. Panduan ini akan membahas pertimbangan keamanan bagi pengembang Ethereum dan menyelidiki sumber daya untuk peningkatan keamanan kontrak pintar. diff --git a/public/content/translations/it/developers/docs/security/index.md b/public/content/translations/it/developers/docs/security/index.md index 4f7d4de2bc3..cb2de5fba5c 100644 --- a/public/content/translations/it/developers/docs/security/index.md +++ b/public/content/translations/it/developers/docs/security/index.md @@ -6,7 +6,7 @@ lang: it Gli Smart Contract Ethereum sono estremamente flessibili, in grado di contenere grandi quantità di token (spesso per importi superiori a 1 miliardo di USD) e di eseguire una logica immutabile basata su codice di Smart Contract distribuito precedentemente. Sebbene questa situazione abbia creato un ecosistema vibrante e creativo di Smart Contract affidabili e interconnessi, è anche l'ecosistema perfetto per attrarre malintenzionati che cercano di trarre profitto sfruttando le vulnerabilità degli Smart Contract e il comportamento imprevisto di Ethereum. Il codice degli Smart Contract _di solito_ non può essere modificato per correggere falle di sicurezza, le risorse rubate dagli Smart Contract sono irrecuperabili e anche estremamente difficili da tracciare. L'importo totale del valore rubato o perso a causa di problemi degli Smart Contract si aggira facilmente attorno al miliardo di dollari. Alcuni dei maggiori errori dovuti a errori di codifica degli Smart Contract includono: -- [Problema 1 relativo a multi-sig Parity: persi 30 milioni di dollari](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) +- [Problema 1 relativo a multi-sig Parity: persi 30 milioni di dollari](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) - [Problema 2 relativo a multi-sig Parity: bloccati 300 milioni di dollari](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) - [The DAO hack, 3,6 milioni di ETH! Oltre un miliardo di dollari in base al prezzo attuale dell'ETH](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) diff --git a/public/content/translations/it/developers/docs/smart-contracts/security/index.md b/public/content/translations/it/developers/docs/smart-contracts/security/index.md index 52b56b3e90a..d4c08acd15e 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ I contratti intelligenti sono estremamente flessibili e in grado di gestire gran Blochchain pubbliche come Ethereun rendono ancora più complessa la questione della sicurezza dei contratti intelligenti. Una volta distribuito, il codice dei contratti _di solito_ non può essere modificato per correggere falle di sicurezza. In più, le risorse rubate dai contratti intelligenti sono estremamente difficili da tracciare e praticamente irrecuperabili per via della loro immutabilità. -Anche se i dati possono variare, si stima che l'ammontare totale di valore rubato o perduto a causa di falle di sicurezza nei contratti intelligenti superi facilmente $1 miliardo. In questo sono inclusi incidenti rilievo come la [violazione della DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 milioni di ETH rubati, per un valore superiore a $1 miliardo al prezzo attuale), la [violazione del portafoglio multi-firma di Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) ($30 milioni sottratti dagli hacker), e la questione del [portafoglio Parity congelato](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (più di $300 milioni di ETH bloccati per sempre). +Anche se i dati possono variare, si stima che l'ammontare totale di valore rubato o perduto a causa di falle di sicurezza nei contratti intelligenti superi facilmente $1 miliardo. In questo sono inclusi incidenti rilievo come la [violazione della DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 milioni di ETH rubati, per un valore superiore a $1 miliardo al prezzo attuale), la [violazione del portafoglio multi-firma di Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) ($30 milioni sottratti dagli hacker), e la questione del [portafoglio Parity congelato](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (più di $300 milioni di ETH bloccati per sempre). Per via di tutte queste problematiche, è imperativo per gli sviluppatori investire risorse nella costruzione di contratti intelligenti sicuri, robusti e resilienti. La sicurezza dei contratti intelligenti è una questione seria, su cui ogni sviluppatore farebbe bene a informarsi. Questa guida tratterà alcune considerazioni sulla sicurezza rivolte agli sviluppatori Ethereum ed esaminerà le risorse per migliorare la sicurezza dei contratti intelligenti. diff --git a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md index d4343b5310d..25009e90701 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ lang: ja イーサリアムのようなパブリックブロックチェーンは、スマートコントラクトのセキュリティ確保の問題をさらに複雑にします。 デプロイされたコントラクトのコードは_通常_、セキュリティ上の欠陥にパッチを当てるために変更することはできません。一方、スマートコントラクトから盗まれた資産は追跡が非常に難しく、その不変性により、大抵回収できません。 -数値は一様ではありませんが、スマートコントラクトのセキュリティ上の欠陥が原因で盗まれたり失われたりした価値の総額は、10億ドルを超えると推定されています。 これには、[The DAOハック](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(現行価格10億ドル相当以上の360万ETHの盗難)、[パリティ(Parity)マルチシグウォレットハック](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (ハッカーによる3000万ドルの盗難)、[パリティ(Parity)凍結ウォレット問題](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether)(3億ドル以上のETHを永遠にロック)などの有名な事件も含まれています。 +数値は一様ではありませんが、スマートコントラクトのセキュリティ上の欠陥が原因で盗まれたり失われたりした価値の総額は、10億ドルを超えると推定されています。 これには、[The DAOハック](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(現行価格10億ドル相当以上の360万ETHの盗難)、[パリティ(Parity)マルチシグウォレットハック](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (ハッカーによる3000万ドルの盗難)、[パリティ(Parity)凍結ウォレット問題](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether)(3億ドル以上のETHを永遠にロック)などの有名な事件も含まれています。 前述の問題は、デベロッパーに安全で堅牢な回復力のあるスマートコントラクトの構築に労力を費やすことを不可欠にしました。 スマートコントラクトのセキュリティは深刻な課題であり、全てのデベロッパーが学ぶべきことです。 このガイドでは、イーサリアムデベロッパーのためのセキュリティの考慮事項について説明します。さらに、スマートコントラクトのセキュリティ向上に役立つリソースもご紹介します。 diff --git a/public/content/translations/nl/developers/docs/smart-contracts/security/index.md b/public/content/translations/nl/developers/docs/smart-contracts/security/index.md index 21330628f8e..a3cbfde4d29 100644 --- a/public/content/translations/nl/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/nl/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Smart contracts zijn extreem flexibel en kunnen grote hoeveelheden waarden en ge Openbare blockchains, zoals Ethereum, maken de beveiliging van smart contracts nog ingewikkelder. Ingezette contractcode kan _gewoonlijk_ niet worden gewijzigd om beveiligingsproblemen op te lossen, terwijl activa die zijn gestolen van smart contracts extreem moeilijk te traceren zijn en meestal niet kunnen worden teruggehaald vanwege de onveranderlijkheid. -Hoewel de cijfers variëren, wordt geschat dat het totale bedrag aan waarde dat gestolen of verloren is gegaan door beveiligingsfouten in smart contracts al gauw meer dan $1 miljard bedraagt. Hieronder vallen ook opvallende incidenten, zoals de [DAO-hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6M ETH gestolen, met een waarde van meer dan 1 miljard dollar in de huidige prijzen), [Parity multisig-wallethack](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) ($30M verloren aan hackers), en het [Parity frozen wallet-probleem](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (meer dan $300M in ETH voor altijd vergrendeld). +Hoewel de cijfers variëren, wordt geschat dat het totale bedrag aan waarde dat gestolen of verloren is gegaan door beveiligingsfouten in smart contracts al gauw meer dan $1 miljard bedraagt. Hieronder vallen ook opvallende incidenten, zoals de [DAO-hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6M ETH gestolen, met een waarde van meer dan 1 miljard dollar in de huidige prijzen), [Parity multisig-wallethack](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) ($30M verloren aan hackers), en het [Parity frozen wallet-probleem](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (meer dan $300M in ETH voor altijd vergrendeld). De bovengenoemde problemen maken het noodzakelijk voor ontwikkelaars om te investeren in het bouwen van veilige, robuuste en veerkrachtige smart contracts. De beveiliging van smart contracts is een serieuze zaak en iedere ontwikkelaar doet er goed aan om dit te leren. Deze gids behandelt de beveiligingsaspecten voor Ethereum-ontwikkelaars en gaat in op bronnen voor het verbeteren van de beveiliging van smart contracts. diff --git a/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md b/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md index 6da2f85510a..6243273c60b 100644 --- a/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Smart kontracts dey very flexibol, and dem kapabol to dey kontrol big-big amount Blockchains wey dey publik laik Ethereum, dey make di issues to dey sekure smart kontracts more hard. Dem nor fit shanj kontract code wey dem deploy _ushually_ to patch-patch sekurity wey nor strong, as asset wey dem steal from smart kontracts dey very difikut to track and most taims dem nor fit rikova dem bikos kontract nor dey shanj. -Aldoh numbas dey difren, dem don estimate sey di total amount of value wey dem steal abi don lost bikos of sekurity wey get fault don pass $1 billion. Dis inklude events wey dey very high, laik di [DAO hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M ETH wey dem steal, worth pass $1B for today prices), [Parity multi-sig wallet hack](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (wey lose $30M to dem hackers), and di [Parity frozen wallet issue](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (ova $300M in ETH wey dey lock foreva). +Aldoh numbas dey difren, dem don estimate sey di total amount of value wey dem steal abi don lost bikos of sekurity wey get fault don pass $1 billion. Dis inklude events wey dey very high, laik di [DAO hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M ETH wey dem steal, worth pass $1B for today prices), [Parity multi-sig wallet hack](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (wey lose $30M to dem hackers), and di [Parity frozen wallet issue](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (ova $300M in ETH wey dey lock foreva). Di issues menshon bifor make am impotant for divelopas to invest effort to dey build sekure, robust, and strong smart kontracts. Smart kontract sekurity na serious biznes, and one wey efri divelopa go do well to learn. Dis guide go kover sekurity konsiderashons for Ethereum divelopas and eksplore risorsis to dey impruf smart kontract sekurity. diff --git a/public/content/translations/pl/developers/docs/security/index.md b/public/content/translations/pl/developers/docs/security/index.md index 489da60cd91..d2c4d395b5c 100644 --- a/public/content/translations/pl/developers/docs/security/index.md +++ b/public/content/translations/pl/developers/docs/security/index.md @@ -6,7 +6,7 @@ lang: pl Inteligentne kontrakty Ethereum są niezwykle elastyczne, zdolne zarówno do utrzymywania dużych ilości tokenów (często powyżej 1 mld USD), jak i do używania niezmiennej logiki opartej na wcześniej wdrożonym kodzie kontraktów inteligentnych. Stworzyło to wprawdzie dynamiczny i kreatywny ekosystem godny zaufania, ale powiązane ze sobą inteligentne kontrakty są również idealnym ekosystemem, który przyciąga atakujących poszukujących zysków poprzez wykorzystanie słabych punktów w inteligentnych kontraktach i nieoczekiwanych zachowań w Ethereum. Kodu inteligentnego kontraktu _zazwyczaj_ nie można zmienić w celu usunięcia luk w zabezpieczeniach; zasoby, które zostały skradzione z inteligentnych kontraktów, są nie do odzyskania, a skradzione aktywa są niezwykle trudne do śledzenia. Całkowita kwota wartości skradzionej lub utraconej z powodu problemów z inteligentnymi kontraktami z dużym prawdopodobieństwem sięga 1 mld USD. Do poważniejszych strat wynikających z błędów w kodowaniu kontraktów inteligentnych należą: -- [Problem kont Parity z wieloma podpisami nr 1 — utracono 30 mln USD](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) +- [Problem kont Parity z wieloma podpisami nr 1 — utracono 30 mln USD](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) - [Problem kont Parity z wieloma podpisami nr 2 — zablokowane 300 mln USD](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) - [Zhakowanie The DAO na 3,6 mln ETH! Ponad 1 mld USD w dzisiejszych cenach ETH](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md index 316fa37d97b..4cae5203f3b 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Os contratos inteligentes são extremamente flexíveis e capazes de controlar gr Blockchains públicas, como a Ethereum, complicam ainda mais a questão de proteger contratos inteligentes. O código de contrato implantado _geralmente_ não pode ser alterado para corrigir falhas de segurança, enquanto os ativos roubados de contratos inteligentes são extremamente difíceis de rastrear e, em sua maioria, irrecuperáveis devido à imutabilidade. -Embora os números variem, estima-se que o valor total roubado ou perdido devido a defeitos de segurança em contratos inteligentes é facilmente superior a 1 bilhão de dólares. Isso inclui incidentes de alto perfil, como o [DAO hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (com 3,6 milhões de ETH roubados, no valor de mais de US$ 1 bilhão de dólares nos preços de hoje), [Hack da carteira múltiplas assinaturas da Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (US$ 30 milhões perdidos para hackers) e o [Caso da carteira congelada da Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (mais de US$ 300 milhões em ETH bloqueados para sempre). +Embora os números variem, estima-se que o valor total roubado ou perdido devido a defeitos de segurança em contratos inteligentes é facilmente superior a 1 bilhão de dólares. Isso inclui incidentes de alto perfil, como o [DAO hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (com 3,6 milhões de ETH roubados, no valor de mais de US$ 1 bilhão de dólares nos preços de hoje), [Hack da carteira múltiplas assinaturas da Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (US$ 30 milhões perdidos para hackers) e o [Caso da carteira congelada da Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (mais de US$ 300 milhões em ETH bloqueados para sempre). As questões mencionadas tornam imperativo para os desenvolvedores investirem esforços na construção de contratos inteligentes seguros, sólidos e resistentes. Segurança dos contratos inteligentes é um assunto sério, e todo desenvolvedor deve aprender. Este guia abrangerá considerações de segurança para desenvolvedores de Ethereum e explorará recursos para melhorar a segurança dos contratos inteligentes. diff --git a/public/content/translations/ro/developers/docs/security/index.md b/public/content/translations/ro/developers/docs/security/index.md index ae265c4a39e..7dbd0ddf7a7 100644 --- a/public/content/translations/ro/developers/docs/security/index.md +++ b/public/content/translations/ro/developers/docs/security/index.md @@ -6,7 +6,7 @@ lang: ro Contractele inteligente Ethereum sunt extrem de flexibile, capabile atât să dețină cantități mari de tokenuri (de multe ori mai mari de 1 miliard USD), cât și să ruleze o logică imuabilă pe baza codului de contract inteligent desfășurat anterior. Deși acest lucru a creat un ecosistem vibrant și creativ de contracte inteligente fără încredere, interconectate, este de asemenea, ecosistemul perfect pentru a atrage atacatorii care doresc să profite prin exploatarea vulnerabilității din contractele inteligente și a comportamentului neașteptat în Ethereum. Codul de contract inteligent, _de obicei_ nu poate fi schimbat ca să fie reparate defectele de securitate, activele care au fost furate din contracte inteligente sunt irecuperabile, iar activele furate sunt extrem de dificil de urmărit. Suma totală a valorii furate sau pierdute din cauza problemelor de contract inteligent este cu ușurință de 1 miliard de dolari. Unele dintre cele mai mari pierderi din cauza erorilor de codare a contractelor inteligente includ: -- [Problema nr. 1 cu Parity Multi-Sign - 30 mil. de dolari pierduți](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) +- [Problema nr. 1 cu Parity Multi-Sign - 30 mil. de dolari pierduți](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) - [Problema nr. 2 cu Parity Multi-Sign - 300 mil. de dolari blocați](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) - [Piratare DAO, 3.6 mil. de dolari ETH! Peste 1 mld. de dolari în prețurile ETH de astăzi](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) diff --git a/public/content/translations/ro/developers/docs/smart-contracts/security/index.md b/public/content/translations/ro/developers/docs/smart-contracts/security/index.md index 6a9c33b8ef7..9d17dc7e014 100644 --- a/public/content/translations/ro/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/ro/developers/docs/smart-contracts/security/index.md @@ -6,7 +6,7 @@ lang: ro Contractele inteligente Ethereum sunt extrem de flexibile, capabile atât să dețină cantități mari de tokenuri (de multe ori peste 1 miliard USD), cât și să ruleze o logică imuabilă pe baza codului de contract inteligent implementat anterior. Pe de-o parte, acest lucru a creat un ecosistem vibrant și creativ de contracte inteligente ce nu necesită autorizarea, interconectate, dar este şi ecosistemul perfect pentru a atrage atacatorii care doresc să profite prin exploatarea vulnerabilității din contractele inteligente și a comportamentului neașteptat în Ethereum. Codul de contract inteligent, _de obicei_ nu poate fi schimbat ca să fie remediate defectele de securitate; activele care au fost furate din contracte inteligente sunt irecuperabile, iar activele furate sunt extrem de dificil de urmărit. The total of amount of value stolen or lost due to smart contract issues is easily over $1B. Unele dintre cele mai mari pierderi din cauza erorilor de programare a contractelor inteligente includ: -- [Problema nr. 1 cu Parity Multi-Sign - 30 mil. USD pierduți](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) +- [Problema nr. 1 cu Parity Multi-Sign - 30 mil. USD pierduți](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) - [Problema nr. 2 cu Parity Multi-Sign - 300 mil. USD blocați](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) - [Atacul TheDAO, 3,6 mil. USD în ETH! Peste 1 mld. USD la prețul ETH-ului de astăzi](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) diff --git a/public/content/translations/tr/developers/docs/smart-contracts/security/index.md b/public/content/translations/tr/developers/docs/smart-contracts/security/index.md index d8766680242..db4cb13a8a7 100644 --- a/public/content/translations/tr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/tr/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Akıllı sözleşmeler son derece esnektir ve blokzincirlere dağıtılan kod te Ethereum gibi halka açık blokzincirler, akıllı sözleşmelerin güvenliğini sağlama sorununu daha da karmaşık hale getirir. Dağıtılmış sözleşme kodu _genellikle_ güvenlik açıklarını kapatmak için değiştirilemez, ayrıca akıllı sözleşmelerden çalınan varlıkların takibi aşırı derecede zordur ve çoğunlukla değiştirilemezlik kaynaklı olarak geri alınamaz. -Rakamlar değişkenlik gösterse de, akıllı sözleşmelerdeki güvenlik açıklarından kaynaklı kaybedilen veya çalınan toplam değerin miktarının 1 milyar doları rahatlıkla aştığı tahmin edilmektedir. Bu, [DAO hacki](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6 milyon ETH çalınmıştır; değeri, günümüz fiyatlarıyla 1 milyar doların üzerindedir), [Parity çoklu imza cüzdanı hacki](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (Hackerlara 30 milyon dolar kaybedilmiştir), [Parity donmuş cüzdan sorunu](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (300 milyon dolardan fazla ETH sonsuza kadar kilitlenmiştir) gibi yüksek profilli olayları içerir. +Rakamlar değişkenlik gösterse de, akıllı sözleşmelerdeki güvenlik açıklarından kaynaklı kaybedilen veya çalınan toplam değerin miktarının 1 milyar doları rahatlıkla aştığı tahmin edilmektedir. Bu, [DAO hacki](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6 milyon ETH çalınmıştır; değeri, günümüz fiyatlarıyla 1 milyar doların üzerindedir), [Parity çoklu imza cüzdanı hacki](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (Hackerlara 30 milyon dolar kaybedilmiştir), [Parity donmuş cüzdan sorunu](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (300 milyon dolardan fazla ETH sonsuza kadar kilitlenmiştir) gibi yüksek profilli olayları içerir. Sayılan sorunlar geliştiricilerin güvenli, güçlü ve sağlam akıllı sözleşmeler oluşturmaya çaba harcamasını zorunlu kılmaktadır. Akıllı sözleşme güvenliği ciddi bir iştir ve her geliştiricinin öğrenmesi gerekir. Bu kılavuz, Ethereum geliştiricilerinin güvenlik konusunda dikkat etmesi gereken hususları ele alacak ve akıllı sözleşme güvenliğini geliştirmeye yönelik kaynakları inceleyecektir. diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md index e8366b43df3..d44aef0e8b5 100644 --- a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ lang: zh-tw 公共區塊鏈,例如以太坊,使智慧型合約的安全議題更加複雜。 已部署的合約程式碼_通常_無法變更,以修補安全缺陷;而要追蹤從智慧型合約竊取的資產也十分困難,且因為物件的不可變性,大多無法挽回。 -雖然數字有差異,但因智慧型合約安全缺陷而遭竊取或損失的總額,估計超過 10 億美元。 備受關注的事件如 [DAO 駭客攻擊](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(駭客竊取 360 萬以太幣,現價超過 10 億美元);[Parity 多重簽章錢包駭客攻擊](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach)(駭客竊取 3 千萬美元);以及 [Parity 凍結錢包問題](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether)(超過 3 億美元的以太幣遭到永久凍結)。 +雖然數字有差異,但因智慧型合約安全缺陷而遭竊取或損失的總額,估計超過 10 億美元。 備受關注的事件如 [DAO 駭客攻擊](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(駭客竊取 360 萬以太幣,現價超過 10 億美元);[Parity 多重簽章錢包駭客攻擊](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach)(駭客竊取 3 千萬美元);以及 [Parity 凍結錢包問題](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether)(超過 3 億美元的以太幣遭到永久凍結)。 前面提到的問題,促使開發者將努力打造安全、健全且有韌性的智慧型合約視為當務之急。 我們必須嚴肅看待智慧型合約的安全性,每個開發者都需要好好加以瞭解。 此指南將涵蓋以太坊開發者應有的資安考量,並探索提升智慧型合約安全性的資源。 diff --git a/public/content/translations/zh/developers/docs/security/index.md b/public/content/translations/zh/developers/docs/security/index.md index cab9ca97ced..9797e598488 100644 --- a/public/content/translations/zh/developers/docs/security/index.md +++ b/public/content/translations/zh/developers/docs/security/index.md @@ -6,7 +6,7 @@ lang: zh 以太坊智能合约是极为灵活的。它能够存储超过非常大量的虚拟货币(超过十亿美元),并且根据先前部署的智能合同运行不可修改的代码。 虽然这创造了一个充满活力和创造性的生态系统,但其中包含的无信任、相互关联的智能合约,也吸引了攻击者利用智能合约中的漏洞和以太坊中的未知错误来赚取利润。 智能合约代码*通常*无法修改来修复安全漏洞,因此从智能合约中被盗窃的资产是无法收回的,且被盗资产极难追踪。 由于智能合约问题而被盗或丢失的价值总额已经达到了 10 亿美元。 一些因为智能合约代码编写错误导致较大经济损失的例子: -- [钱包问题 #1 - 3000 万美金损失](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) +- [钱包问题 #1 - 3000 万美金损失](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) - [钱包问题 #2 - 3 亿美金锁定](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) - [TheDAO 被黑,360 万 ETH 被盗! 目前价值超过 10 亿美元](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) diff --git a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md index 166f3e66393..8d849ade3d6 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ lang: zh 公共区块链(比如以太坊)使智能合约的安全性问题变的更加复杂。 已部署的合约代码_通常_无法更改因而不能给安全问题打补丁,并且由于这种不可变性,从智能合约中盗取的资产极难追踪并且绝大多数无法挽回。 -虽然统计数据有所差异,但据估计,由于智能合约的安全缺陷而被盗窃或丢失的资产总额肯定超过了 10 亿美元。 其中包括几次著名事件,比如 [DAO 攻击事件](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(360 万个以太币被盗,按照当前价格计算总金额超过 10 亿美元)、[Parity 多重签名钱包攻击事件](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach)(黑客窃取了 3000 万美元)以及 [Parity 钱包冻结问题](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether)(价值超过 3 亿美元的以太币遭到永久锁定)。 +虽然统计数据有所差异,但据估计,由于智能合约的安全缺陷而被盗窃或丢失的资产总额肯定超过了 10 亿美元。 其中包括几次著名事件,比如 [DAO 攻击事件](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(360 万个以太币被盗,按照当前价格计算总金额超过 10 亿美元)、[Parity 多重签名钱包攻击事件](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach)(黑客窃取了 3000 万美元)以及 [Parity 钱包冻结问题](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether)(价值超过 3 亿美元的以太币遭到永久锁定)。 上述几个事件迫使开发者必须付诸努力,构建安全、稳健、恢复力强的智能合约。 智能合约安全性是每个开发者都需要学习和研究的严肃问题。 本指南将介绍针对以太坊开发者的安全性注意事项,并研究增强智能合约安全性的资源。 From 57fb872eb8e6077d30fc9b120114d88bb009cb51 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 15:05:56 -0500 Subject: [PATCH 054/368] change https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/ to https://www.coindesk.com/learn/understanding-the-dao-attack --- .../content/developers/docs/smart-contracts/security/index.md | 2 +- .../cs/developers/docs/smart-contracts/security/index.md | 2 +- .../de/developers/docs/smart-contracts/security/index.md | 2 +- .../el/developers/docs/smart-contracts/security/index.md | 2 +- .../es/developers/docs/smart-contracts/security/index.md | 2 +- .../fa/developers/docs/smart-contracts/security/index.md | 2 +- .../fr/developers/docs/smart-contracts/security/index.md | 2 +- .../hi/developers/docs/smart-contracts/security/index.md | 2 +- .../hu/developers/docs/smart-contracts/security/index.md | 2 +- .../id/developers/docs/smart-contracts/security/index.md | 2 +- .../it/developers/docs/smart-contracts/security/index.md | 2 +- .../ja/developers/docs/smart-contracts/security/index.md | 2 +- .../nl/developers/docs/smart-contracts/security/index.md | 2 +- .../pcm/developers/docs/smart-contracts/security/index.md | 2 +- .../pt-br/developers/docs/smart-contracts/security/index.md | 2 +- .../tr/developers/docs/smart-contracts/security/index.md | 2 +- .../zh-tw/developers/docs/smart-contracts/security/index.md | 2 +- .../zh/developers/docs/smart-contracts/security/index.md | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/public/content/developers/docs/smart-contracts/security/index.md b/public/content/developers/docs/smart-contracts/security/index.md index 0205042c26c..f0f7de064e7 100644 --- a/public/content/developers/docs/smart-contracts/security/index.md +++ b/public/content/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ There’s nothing wrong here, except that `Attacker` has another function that c - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -The summary is that because the caller’s balance isn't set to 0 until the function execution completes, subsequent invocations will succeed and allow the caller to withdraw their balance multiple times. This kind of attack can be used to drain a smart contract of its funds, like what happened in the [2016 DAO hack](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Reentrancy attacks are still a critical issue for smart contracts today as [public listings of reentrancy exploits](https://github.com/pcaversaccio/reentrancy-attacks) show. +The summary is that because the caller’s balance isn't set to 0 until the function execution completes, subsequent invocations will succeed and allow the caller to withdraw their balance multiple times. This kind of attack can be used to drain a smart contract of its funds, like what happened in the [2016 DAO hack](https://www.coindesk.com/learn/understanding-the-dao-attack). Reentrancy attacks are still a critical issue for smart contracts today as [public listings of reentrancy exploits](https://github.com/pcaversaccio/reentrancy-attacks) show. ##### How to prevent reentrancy attacks diff --git a/public/content/translations/cs/developers/docs/smart-contracts/security/index.md b/public/content/translations/cs/developers/docs/smart-contracts/security/index.md index ce69a581f4d..8092555e981 100644 --- a/public/content/translations/cs/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/cs/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Na první pohled není na tomto kontraktu nic špatného, až na to, že kontrak - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Výsledkem je, že následná vyvolání budou úspěšná a umožní volajícímu vybrat svůj zůstatek vícekrát, protože zůstatek volajícího není nastaven na 0, dokud se nedokončí provedení funkce. Tento druh útoku může být použit k vybrání prostředků smart kontraktu, jako se to stalo při [DAO hacku v roce 2016](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Útoky opětovným vstupem (reentrancy) jsou stále kritickým problémem smart kontraktů, jak ukazují [veřejné seznamy exploitů reentrancy útoků](https://github.com/pcaversaccio/reentrancy-attacks). +Výsledkem je, že následná vyvolání budou úspěšná a umožní volajícímu vybrat svůj zůstatek vícekrát, protože zůstatek volajícího není nastaven na 0, dokud se nedokončí provedení funkce. Tento druh útoku může být použit k vybrání prostředků smart kontraktu, jako se to stalo při [DAO hacku v roce 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Útoky opětovným vstupem (reentrancy) jsou stále kritickým problémem smart kontraktů, jak ukazují [veřejné seznamy exploitů reentrancy útoků](https://github.com/pcaversaccio/reentrancy-attacks). ##### Jak zabránit útokům opětovným vstupem diff --git a/public/content/translations/de/developers/docs/smart-contracts/security/index.md b/public/content/translations/de/developers/docs/smart-contracts/security/index.md index 65a4ba8a492..ebf87bf0b90 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Hier ist nichts verkehrt, außer dass `Attacker` eine weitere Funktion hat, die - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Da das Guthaben des Aufrufers nicht auf 0 gesetzt wird, bevor die Funktion ausgeführt wurde, können nachfolgende Aufrufe erfolgreich sein und dem Aufrufer ermöglichen, sein Guthaben mehrmals abzuheben. Diese Art von Angriff kann genutzt werden, um einem Smart Contract das Kapital zu entziehen, wie es beim [2016 DAO-Hack](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/) geschehen ist. Wiederholungsangriffe sind auch heute noch ein kritisches Thema für Smart Contracts, wie [öffentliche Auflistungen von Reentrancy-Exploits](https://github.com/pcaversaccio/reentrancy-attacks) zeigen. +Da das Guthaben des Aufrufers nicht auf 0 gesetzt wird, bevor die Funktion ausgeführt wurde, können nachfolgende Aufrufe erfolgreich sein und dem Aufrufer ermöglichen, sein Guthaben mehrmals abzuheben. Diese Art von Angriff kann genutzt werden, um einem Smart Contract das Kapital zu entziehen, wie es beim [2016 DAO-Hack](https://www.coindesk.com/learn/understanding-the-dao-attack) geschehen ist. Wiederholungsangriffe sind auch heute noch ein kritisches Thema für Smart Contracts, wie [öffentliche Auflistungen von Reentrancy-Exploits](https://github.com/pcaversaccio/reentrancy-attacks) zeigen. ##### So verhindert man Wiederholungsangriffe diff --git a/public/content/translations/el/developers/docs/smart-contracts/security/index.md b/public/content/translations/el/developers/docs/smart-contracts/security/index.md index bb0598c8e0d..f47f26818e8 100644 --- a/public/content/translations/el/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/el/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ contract Victim { - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Εν συντομία: επειδή το υπόλοιπο του καλούντος δεν ορίζεται σε 0 μέχρι την ολοκλήρωση της εκτέλεσης της συνάρτησης, οι επόμενες κλήσεις θα είναι επιτυχημένες και θα επιτρέψουν στον καλούντα να κάνει ανάληψη του υπολοίπου του πολλές φορές. Αυτός ο τύπος επίθεσης μπορεί να χρησιμοποιηθεί για να απομυζήσει τα κεφάλαια ένος έξυπνου συμβολαίου, όπως συνέβη στο [hack του DAO το 2016](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Οι επιθέσεις επανεισόδου εξακολουθούν να αποτελούν ένα κρίσιμο ζήτημα για τα έξυπνα συμβόλαια σήμερα, όπως δείχνουν οι [δημόσιες καταχωρίσεις προγραμμάτων εκμετάλλευσης τρωτότητας (exploit) επανεισόδου](https://github.com/pcaversaccio/reentrancy-attacks). +Εν συντομία: επειδή το υπόλοιπο του καλούντος δεν ορίζεται σε 0 μέχρι την ολοκλήρωση της εκτέλεσης της συνάρτησης, οι επόμενες κλήσεις θα είναι επιτυχημένες και θα επιτρέψουν στον καλούντα να κάνει ανάληψη του υπολοίπου του πολλές φορές. Αυτός ο τύπος επίθεσης μπορεί να χρησιμοποιηθεί για να απομυζήσει τα κεφάλαια ένος έξυπνου συμβολαίου, όπως συνέβη στο [hack του DAO το 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Οι επιθέσεις επανεισόδου εξακολουθούν να αποτελούν ένα κρίσιμο ζήτημα για τα έξυπνα συμβόλαια σήμερα, όπως δείχνουν οι [δημόσιες καταχωρίσεις προγραμμάτων εκμετάλλευσης τρωτότητας (exploit) επανεισόδου](https://github.com/pcaversaccio/reentrancy-attacks). ##### Πώς να αποτρέψετε επιθέσεις επανεισόδου diff --git a/public/content/translations/es/developers/docs/smart-contracts/security/index.md b/public/content/translations/es/developers/docs/smart-contracts/security/index.md index 2109053f32f..3c12b11beb5 100644 --- a/public/content/translations/es/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/es/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ No hay nada malo aquí, excepto que `Attacker` tiene otra función que llama a ` - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -El resumen es que, debido a que el saldo de la persona que llama no se establece en 0 hasta que se complete la ejecución de la función, las invocaciones posteriores tendrán éxito y permitirán que la persona que llame retire su saldo varias veces. Este tipo de ataque se puede utilizar para drenar un contrato inteligente de sus fondos, como lo que sucedió en el [hackeo de 2016 de DAO](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Los ataques de reentrada siguen siendo un problema crítico para los contratos inteligentes hoy en día, como muestran las [listas públicas de explotaciones de reentrada](https://github.com/pcaversaccio/reentrancy-attacks). +El resumen es que, debido a que el saldo de la persona que llama no se establece en 0 hasta que se complete la ejecución de la función, las invocaciones posteriores tendrán éxito y permitirán que la persona que llame retire su saldo varias veces. Este tipo de ataque se puede utilizar para drenar un contrato inteligente de sus fondos, como lo que sucedió en el [hackeo de 2016 de DAO](https://www.coindesk.com/learn/understanding-the-dao-attack). Los ataques de reentrada siguen siendo un problema crítico para los contratos inteligentes hoy en día, como muestran las [listas públicas de explotaciones de reentrada](https://github.com/pcaversaccio/reentrancy-attacks). ##### Cómo prevenir los ataques de reentrada diff --git a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md index c15de3ace25..91340168995 100644 --- a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ contract Victim { - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -خلاصه موضوع این است که چون موجودی تماس‌گیرنده تا زمانی که اجرای تابع کامل نشود روی 0 تنظیم نمی‌شود، فراخوانی‌های بعدی موفق خواهند شد و به تماس‌گیرنده اجازه می‌دهند تا موجودی خود را چندین بار برداشت کند. از این نوع حمله می توان برای تخلیه یک قرارداد هوشمند از وجوه آن استفاده کرد، مانند آنچه در [هک DAO سال 2016](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/) اتفاق افتاد. همانطور که [فهرست‌های عمومی اکسپلویت‌های reentrancy](https://github.com/pcaversaccio/reentrancy-attacks) نشان می‌دهند، حملات reentrancy امروزه همچنان یک موضوع حیاتی برای قراردادهای هوشمند است. +خلاصه موضوع این است که چون موجودی تماس‌گیرنده تا زمانی که اجرای تابع کامل نشود روی 0 تنظیم نمی‌شود، فراخوانی‌های بعدی موفق خواهند شد و به تماس‌گیرنده اجازه می‌دهند تا موجودی خود را چندین بار برداشت کند. از این نوع حمله می توان برای تخلیه یک قرارداد هوشمند از وجوه آن استفاده کرد، مانند آنچه در [هک DAO سال 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) اتفاق افتاد. همانطور که [فهرست‌های عمومی اکسپلویت‌های reentrancy](https://github.com/pcaversaccio/reentrancy-attacks) نشان می‌دهند، حملات reentrancy امروزه همچنان یک موضوع حیاتی برای قراردادهای هوشمند است. ##### چگونه از حملات بازگشت مجدد جلوگیری کنیم diff --git a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md index df203b1d057..3788f23aeb7 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Il n'y a rien de mal ici, excepté que l'`Attacker` a une autre fonction qui app - `Victim` applique enfin les résultats de la première transaction (et de celles subséquentes) à son état, donc le solde de `Attacker` est fixé à 0 ``` -Le résumé est que, comme le solde de l'appelant n'est pas défini à 0 jusqu'à ce que l'exécution de la fonction soit terminée, les invocations suivantes réussiront et permettront à l'appelant de retirer son solde plusieurs fois. Ce type d'attaque peut être utilisé pour drainer un contrat intelligent de ses fonds, comme ce qui s'est passé dans le hack [DAO 2016](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Les attaques par réentrance sont toujours un problème critique pour les contrats intelligents aujourd'hui, comme le montre [les listes publiques des exploits de réentrance](https://github.com/pcaversaccio/reentrancy-attacks). +Le résumé est que, comme le solde de l'appelant n'est pas défini à 0 jusqu'à ce que l'exécution de la fonction soit terminée, les invocations suivantes réussiront et permettront à l'appelant de retirer son solde plusieurs fois. Ce type d'attaque peut être utilisé pour drainer un contrat intelligent de ses fonds, comme ce qui s'est passé dans le hack [DAO 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Les attaques par réentrance sont toujours un problème critique pour les contrats intelligents aujourd'hui, comme le montre [les listes publiques des exploits de réentrance](https://github.com/pcaversaccio/reentrancy-attacks). ##### Comment empêcher les attaques par réentrance diff --git a/public/content/translations/hi/developers/docs/smart-contracts/security/index.md b/public/content/translations/hi/developers/docs/smart-contracts/security/index.md index 19628e23f8d..6d05e6ece73 100644 --- a/public/content/translations/hi/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/hi/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ contract Victim { - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -सारांश यह है कि क्योंकि फंक्शन निष्पादन पूरा होने तक कॉलर की शेष राशि 0 पर सेट नहीं होती है, बाद के प्रयास सफल होंगे और कॉलर को कई बार अपनी शेष राशि वापस लेने की अनुमति देंगे। इस तरह के हमले का उपयोग अपने धन के एक स्मार्ट अनुबंध को निकालने के लिए किया जा सकता है, जैसा कि [2016 डीएओ हैक](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/) में हुआ था। रीएंट्रेंसी हमले आज भी स्मार्ट अनुबंध के लिए एक महत्वपूर्ण मुद्दा है जैसा कि [रीएंट्रेंसी शोषण की सार्वजनिक सूचियां](https://github.com/pcaversaccio/reentrancy-attacks) दिखाती है। +सारांश यह है कि क्योंकि फंक्शन निष्पादन पूरा होने तक कॉलर की शेष राशि 0 पर सेट नहीं होती है, बाद के प्रयास सफल होंगे और कॉलर को कई बार अपनी शेष राशि वापस लेने की अनुमति देंगे। इस तरह के हमले का उपयोग अपने धन के एक स्मार्ट अनुबंध को निकालने के लिए किया जा सकता है, जैसा कि [2016 डीएओ हैक](https://www.coindesk.com/learn/understanding-the-dao-attack) में हुआ था। रीएंट्रेंसी हमले आज भी स्मार्ट अनुबंध के लिए एक महत्वपूर्ण मुद्दा है जैसा कि [रीएंट्रेंसी शोषण की सार्वजनिक सूचियां](https://github.com/pcaversaccio/reentrancy-attacks) दिखाती है। ##### रीएंट्रेंसी हमलों को कैसे रोकें diff --git a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md index aff6264d90a..f2241f1a904 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Ebben még nincs semmi rossz, viszont a `attacker` (támadó) szerződésben van - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Összességében, mivel a meghívó egyenlege nem lesz 0 mindaddig, amíg a függvényvégrehajtás nem zárul le, a rákövetkező meghívások sikeresek lesznek, és megengedik a meghívónak, hogy kivegye az egyenlegét többször is. Ez a támadás alkalmas arra, hogy egy okosszerződés pénzeszközeit kifolyassák, ahogy az a [2016-os DAO hackelésnél](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/) megtörtént. Az újrabelépéses támadás még mindig kritikus probléma az okosszerződéseknél, ahogy azt az [újrabelépéses támadások nyilvános listája](https://github.com/pcaversaccio/reentrancy-attacks) mutatja. +Összességében, mivel a meghívó egyenlege nem lesz 0 mindaddig, amíg a függvényvégrehajtás nem zárul le, a rákövetkező meghívások sikeresek lesznek, és megengedik a meghívónak, hogy kivegye az egyenlegét többször is. Ez a támadás alkalmas arra, hogy egy okosszerződés pénzeszközeit kifolyassák, ahogy az a [2016-os DAO hackelésnél](https://www.coindesk.com/learn/understanding-the-dao-attack) megtörtént. Az újrabelépéses támadás még mindig kritikus probléma az okosszerződéseknél, ahogy azt az [újrabelépéses támadások nyilvános listája](https://github.com/pcaversaccio/reentrancy-attacks) mutatja. ##### Hogyan lehet megakadályozni egy újrabelépéses támadást diff --git a/public/content/translations/id/developers/docs/smart-contracts/security/index.md b/public/content/translations/id/developers/docs/smart-contracts/security/index.md index c9b9f2dae83..a4cca2f712d 100644 --- a/public/content/translations/id/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/id/developers/docs/smart-contracts/security/index.md @@ -301,7 +301,7 @@ Tidak ada yang salah di sini, kecuali bahwa `Attacker` memiliki fungsi lain yang - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Ringkasnya adalah karena saldo pemanggil tidak ditetapkan ke 0 hingga selesainya eksekusi fungsi, pemanggilan berikutnya akan berhasil dan memungkinkan pemanggil menarik saldonya beberapa kali. Jenis serangan seperti ini dapat digunakan untuk menguras dana dari kontrak pintar, seperti yang terjadi dalam serangan [peretasan DAO 2016](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Serangan reentrancy (masuk kembali) masih menjadi masalah kritis bagi kontrak pintar saat ini, seperti yang ditunjukkan oleh [daftar publik eksploit reentrancy](https://github.com/pcaversaccio/reentrancy-attacks). +Ringkasnya adalah karena saldo pemanggil tidak ditetapkan ke 0 hingga selesainya eksekusi fungsi, pemanggilan berikutnya akan berhasil dan memungkinkan pemanggil menarik saldonya beberapa kali. Jenis serangan seperti ini dapat digunakan untuk menguras dana dari kontrak pintar, seperti yang terjadi dalam serangan [peretasan DAO 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Serangan reentrancy (masuk kembali) masih menjadi masalah kritis bagi kontrak pintar saat ini, seperti yang ditunjukkan oleh [daftar publik eksploit reentrancy](https://github.com/pcaversaccio/reentrancy-attacks). ##### Cara mencegah serangan reentrancy (masuk kembali) diff --git a/public/content/translations/it/developers/docs/smart-contracts/security/index.md b/public/content/translations/it/developers/docs/smart-contracts/security/index.md index d4c08acd15e..92ca2e4b976 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Non c'è nulla di sbagliato qui, tranne il fatto che l'`Attacker` ha un'altra fu - `Victim` infine applica i risultati della prima transazione (e delle successive) al proprio stato, così che il saldo di `Attacker` è impostato su 0 ``` -Riepilogando: poiché il saldo del chiamante non è impostato a 0 fino al completamento dell'esecuzione della funzione, le invocazioni successive avranno successo, consentendo al chiamante di prelevare il proprio saldo numerose volte. Questo tipo di attacco è utilizzabile per sottrarre a un contratto intelligente i suoi fondi, come è avvenuto nella [violazione della DAO del 2016](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Gli attacchi di rientranza sono ancora oggi un problema critico per i contratti intelligenti, come mostrato dagli [elenchi pubblici di exploit di rientranza](https://github.com/pcaversaccio/reentrancy-attacks). +Riepilogando: poiché il saldo del chiamante non è impostato a 0 fino al completamento dell'esecuzione della funzione, le invocazioni successive avranno successo, consentendo al chiamante di prelevare il proprio saldo numerose volte. Questo tipo di attacco è utilizzabile per sottrarre a un contratto intelligente i suoi fondi, come è avvenuto nella [violazione della DAO del 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Gli attacchi di rientranza sono ancora oggi un problema critico per i contratti intelligenti, come mostrato dagli [elenchi pubblici di exploit di rientranza](https://github.com/pcaversaccio/reentrancy-attacks). ##### Come prevenire gli attacchi di rientranza diff --git a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md index 25009e90701..a2886e19e69 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ contract Victim { - 「Victim」は、最終的に最初のトランザクション(および後続のトランザクション)の結果をステート(状態)に適用するので、「Attacker」の残高は0に設定されます。 ``` -要約すると、関数の実行が完了するまで呼び出し元の残高が0にならないため、その後の呼び出しが成功し、呼び出し元が何度も残高を引き出せるようになります。 この種の攻撃は、[2016年のDAOハック](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/)で行われたように、スマートコントラクトから資金を流出させるために使用されます。 [再入可能(リエントランシー)エクスプロイトの公開リスト](https://github.com/pcaversaccio/reentrancy-attacks)が示すように、再入可能攻撃は今日でもスマートコントラクトにとって深刻な問題になっています。 +要約すると、関数の実行が完了するまで呼び出し元の残高が0にならないため、その後の呼び出しが成功し、呼び出し元が何度も残高を引き出せるようになります。 この種の攻撃は、[2016年のDAOハック](https://www.coindesk.com/learn/understanding-the-dao-attack)で行われたように、スマートコントラクトから資金を流出させるために使用されます。 [再入可能(リエントランシー)エクスプロイトの公開リスト](https://github.com/pcaversaccio/reentrancy-attacks)が示すように、再入可能攻撃は今日でもスマートコントラクトにとって深刻な問題になっています。 ##### 再入可能 (リエントランシー) 攻撃を防ぐ方法 diff --git a/public/content/translations/nl/developers/docs/smart-contracts/security/index.md b/public/content/translations/nl/developers/docs/smart-contracts/security/index.md index a3cbfde4d29..ae5b0d6126d 100644 --- a/public/content/translations/nl/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/nl/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Er is hier niets aan de hand, behalve dat `Attacker` een andere functie heeft di - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -De conclusie is dat omdat het saldo van de oproeper niet op 0 wordt gezet totdat de uitvoering van de functie is voltooid, latere oproepen zullen slagen en de oproeper in staat stellen zijn/haar saldo meerdere keren op te nemen. Dit soort aanval kan gebruikt worden om middelen van een smart contract leeg te halen, zoals gebeurde in de [2016 DAO hack](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Reentrancy-aanvallen zijn vandaag de dag nog steeds een kritiek probleem voor smart contracts, zoals blijkt uit [openbare lijsten van reentrancy-exploitaties](https://github.com/pcaversaccio/reentrancy-attacks). +De conclusie is dat omdat het saldo van de oproeper niet op 0 wordt gezet totdat de uitvoering van de functie is voltooid, latere oproepen zullen slagen en de oproeper in staat stellen zijn/haar saldo meerdere keren op te nemen. Dit soort aanval kan gebruikt worden om middelen van een smart contract leeg te halen, zoals gebeurde in de [2016 DAO hack](https://www.coindesk.com/learn/understanding-the-dao-attack). Reentrancy-aanvallen zijn vandaag de dag nog steeds een kritiek probleem voor smart contracts, zoals blijkt uit [openbare lijsten van reentrancy-exploitaties](https://github.com/pcaversaccio/reentrancy-attacks). ##### Hoe reentrancy-aanvallen voorkomen diff --git a/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md b/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md index 6243273c60b..6ad99a76404 100644 --- a/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Nortin dey wrong here, eksept dat `Attacka` get anoda funshon wey koll`withdraw( - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Di summary bi sey bikos di kolla balans nor dey set to 0 ontil di funshon don run finish, invokashons wey follow go succeed and go allow di kolla to witdraw dia balana plenti taims. Dem fit yus dis kain attak take drain funds from di smart kontract, laik wetin hapun in di [2016 DAO hack](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Reentrancy attaks still dey kritical issue for smart kontracts today as [di publik listings of reentrancy exploits](https://github.com/pcaversaccio/reentrancy-attacks) dey show. +Di summary bi sey bikos di kolla balans nor dey set to 0 ontil di funshon don run finish, invokashons wey follow go succeed and go allow di kolla to witdraw dia balana plenti taims. Dem fit yus dis kain attak take drain funds from di smart kontract, laik wetin hapun in di [2016 DAO hack](https://www.coindesk.com/learn/understanding-the-dao-attack). Reentrancy attaks still dey kritical issue for smart kontracts today as [di publik listings of reentrancy exploits](https://github.com/pcaversaccio/reentrancy-attacks) dey show. ##### Hau yu fit privent reentrancy attaks diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md index 4cae5203f3b..f9e645fec21 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Não há nada de errado aqui, exceto que o `Attacker` tem outra função que cha - `Victim` finalmente aplica os resultados da primeira transação (e as subsequentes) ao seu estado, então o saldo do `Attacker` é definido para 0 (zero) ``` -O resumo é que, como o saldo do chamador não é definido como 0 até que a execução da função termine, as invocações subsequentes serão bem-sucedidas e permitirão que o chamador retire seu saldo várias vezes. Esse tipo de ataque pode ser usado para drenar um contrato inteligente de seus fundos, como aconteceu no [DAO hack em 2016](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/). Os ataques de reentrância ainda são um problema crítico para contratos inteligentes hoje, como mostram as[listagens públicas de exploits de reentrância](https://github.com/pcaversaccio/reentrancy-attacks). +O resumo é que, como o saldo do chamador não é definido como 0 até que a execução da função termine, as invocações subsequentes serão bem-sucedidas e permitirão que o chamador retire seu saldo várias vezes. Esse tipo de ataque pode ser usado para drenar um contrato inteligente de seus fundos, como aconteceu no [DAO hack em 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Os ataques de reentrância ainda são um problema crítico para contratos inteligentes hoje, como mostram as[listagens públicas de exploits de reentrância](https://github.com/pcaversaccio/reentrancy-attacks). ##### Como prevenir ataques de reentrância diff --git a/public/content/translations/tr/developers/docs/smart-contracts/security/index.md b/public/content/translations/tr/developers/docs/smart-contracts/security/index.md index db4cb13a8a7..36a22e32c65 100644 --- a/public/content/translations/tr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/tr/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ Burada, gelen `msg.sender.call.value` tarafından bırakılan gaz miktarı 40.00 - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Özetle, çağıranın bakiyesi fonksiyonun yürütülmesi tamamlanana kadar 0'a ayarlanmadığı için sonraki çağrılar başarılı olacak ve çağıranın bakiyesini birden fazla kez çekmesine olanak tanıyacaktır. Bu tür saldırılar, [2016 DAO hack](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/) olayında olduğu gibi akıllı sözleşmenin fonlarını boşaltmak için kullanılabilir. Yeniden giriş saldırıları, [yeniden giriş suistimallerinin herkese açık listesi](https://github.com/pcaversaccio/reentrancy-attacks) içinde gösterildiği gibi bugün hala akıllı sözleşmeler için ciddi bir sorundur. +Özetle, çağıranın bakiyesi fonksiyonun yürütülmesi tamamlanana kadar 0'a ayarlanmadığı için sonraki çağrılar başarılı olacak ve çağıranın bakiyesini birden fazla kez çekmesine olanak tanıyacaktır. Bu tür saldırılar, [2016 DAO hack](https://www.coindesk.com/learn/understanding-the-dao-attack) olayında olduğu gibi akıllı sözleşmenin fonlarını boşaltmak için kullanılabilir. Yeniden giriş saldırıları, [yeniden giriş suistimallerinin herkese açık listesi](https://github.com/pcaversaccio/reentrancy-attacks) içinde gösterildiği gibi bugün hala akıllı sözleşmeler için ciddi bir sorundur. ##### Yeniden giriş saldırılarını engelleme diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md index d44aef0e8b5..cb6a94a7c06 100644 --- a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ contract Victim { - `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -總起來說,因為調用者的餘額並非 0,直到函數執行結束前,後續的調用都能成功執行,並允許調用者多次提領餘額。 這類攻擊可以被用於將智慧型合約內的所有資金提領一空,如同 [2016 年的 DAO 駭客攻擊](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/)。 就像[重入入侵公開清單](https://github.com/pcaversaccio/reentrancy-attacks)所示,如今重入攻擊仍是智慧型合約面臨的嚴重問題。 +總起來說,因為調用者的餘額並非 0,直到函數執行結束前,後續的調用都能成功執行,並允許調用者多次提領餘額。 這類攻擊可以被用於將智慧型合約內的所有資金提領一空,如同 [2016 年的 DAO 駭客攻擊](https://www.coindesk.com/learn/understanding-the-dao-attack)。 就像[重入入侵公開清單](https://github.com/pcaversaccio/reentrancy-attacks)所示,如今重入攻擊仍是智慧型合約面臨的嚴重問題。 ##### 如何預防重入攻擊 diff --git a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md index 8d849ade3d6..9158169aeb9 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md @@ -304,7 +304,7 @@ contract Victim { - 最后 `Victim` 将第一笔交易(和后续交易)的结果应用于其状态,所以 `Attacker` 的余额被设置为 0 ``` -总结起来就是,由于调用者的余额在函数执行完成之前没有设置为 0,所以后续的调用会成功,让调用者可以多次提取他们的余额。 这种攻击可以用来提空智能合约中的资金,就像 [2016 DAO 黑客攻击](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/)中发生情况的那样。 正如[公开的重入攻击列表](https://github.com/pcaversaccio/reentrancy-attacks)所示,当前重入攻击仍是智能合约所面临的一个严重问题。 +总结起来就是,由于调用者的余额在函数执行完成之前没有设置为 0,所以后续的调用会成功,让调用者可以多次提取他们的余额。 这种攻击可以用来提空智能合约中的资金,就像 [2016 DAO 黑客攻击](https://www.coindesk.com/learn/understanding-the-dao-attack)中发生情况的那样。 正如[公开的重入攻击列表](https://github.com/pcaversaccio/reentrancy-attacks)所示,当前重入攻击仍是智能合约所面临的一个严重问题。 ##### 如何防止重入攻击 From dfb74a6b45372b10db4b2cf204e2847ff3c9b1f8 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 15:08:44 -0500 Subject: [PATCH 055/368] change https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/ to https://www.coindesk.com/learn/4-ways-to-stay-safe-in-crypto --- public/content/translations/ca/security/index.md | 2 +- public/content/translations/fil/security/index.md | 2 +- public/content/translations/ko/security/index.md | 2 +- public/content/translations/ro/security/index.md | 4 ++-- public/content/translations/uk/security/index.md | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/content/translations/ca/security/index.md b/public/content/translations/ca/security/index.md index 9eb6671feb6..93fdd1769dc 100644 --- a/public/content/translations/ca/security/index.md +++ b/public/content/translations/ca/security/index.md @@ -276,7 +276,7 @@ Les estafes d'enviament involucren que un projecte d'estafa enviï un actiu (NFT ### Criptoseguretat {#reading-crypto-security} - [Protegint-vos a vosaltres i als vostres fons](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) - _MyCrypto_ -- [Quatre formes d'anar amb compte en el món de les criptomonedes](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ +- [Quatre formes d'anar amb compte en el món de les criptomonedes](https://www.coindesk.com/learn/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ - [Guia de seguretat per a principiants i també per a gent intel·ligent](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) - _MyCrypto_ - [Criptoseguretat: contrasenyes i autenticacions](https://www.youtube.com/watch?v=m8jlnZuV1i4) - _Andreas M. Antonopoulos_ diff --git a/public/content/translations/fil/security/index.md b/public/content/translations/fil/security/index.md index b1ad5b49030..3df6e2ae616 100644 --- a/public/content/translations/fil/security/index.md +++ b/public/content/translations/fil/security/index.md @@ -278,7 +278,7 @@ Sa mga airdrop scam, may scam project na mag-e-airdrop ng asset (NFT, token) sa ### Seguridad ng Crypto {#reading-crypto-security} - [Pagprotekta sa Sarili at sa Iyong Pondo](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) - _MyCrypto_ -- [4 na Paraan Upang Manatiling Ligtas sa Crypto](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ +- [4 na Paraan Upang Manatiling Ligtas sa Crypto](https://www.coindesk.com/learn/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ - [Gabay sa Seguridad para sa Mga Walang Alam at Maging sa Mga May Alam](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) - _MyCrypto_ - [Seguridad sa Crypto: Mga Password at Authentication](https://www.youtube.com/watch?v=m8jlnZuV1i4) - _Andreas M. Antonopoulos_ diff --git a/public/content/translations/ko/security/index.md b/public/content/translations/ko/security/index.md index 3c8460f38ab..c9e232eeacd 100644 --- a/public/content/translations/ko/security/index.md +++ b/public/content/translations/ko/security/index.md @@ -268,7 +268,7 @@ _참고: 스테이킹된 ETH를 나타내기 위한 파생 토큰/티커가 있 ### 암호화폐 보안 {#reading-crypto-security} - [당신과 당신의 자금 보호하기](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) - _MyCrypto_ -- [암호화폐를 안전하게 보관하는 4가지 방법](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) - _코인데스크_ +- [암호화폐를 안전하게 보관하는 4가지 방법](https://www.coindesk.com/learn/4-ways-to-stay-safe-in-crypto/) - _코인데스크_ - [모두를 위한 보안 가이드](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) - _MyCrypto_ - [암호화폐 보안: 비밀번호와 인증](https://www.youtube.com/watch?v=m8jlnZuV1i4) - _Andreas M. Antonopoulos_ diff --git a/public/content/translations/ro/security/index.md b/public/content/translations/ro/security/index.md index 7ff7f03fd2e..18e93fdc9ce 100644 --- a/public/content/translations/ro/security/index.md +++ b/public/content/translations/ro/security/index.md @@ -70,7 +70,7 @@ Utilizarea **Autentificării cu doi factori (2FA)**  oferă un *factor de sec
- Observaţie: Utilizarea 2FA bazată pe SMS este vulnerabilă la + Observaţie: Utilizarea 2FA bazată pe SMS este vulnerabilă la piratarea SIM (SIM jacking) @@ -274,7 +274,7 @@ Escrocherile Airdrop implică un proiect de escrocherie care lansează un activ ### Securitatea cripto {#reading-crypto-security} - [Protejarea dvs. și a fondurilor dvs.](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) - _MyCrypto_ -- [4 moduri de a rămâne în siguranță în cripto](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ +- [4 moduri de a rămâne în siguranță în cripto](https://www.coindesk.com/learn/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ - [Ghidul de securitate pentru începători și pentru oamenii inteligenți](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) - _MyCrypto_ - [Securitate cripto: Parole și autentificare](https://www.youtube.com/watch?v=m8jlnZuV1i4) - _Andreas M. Antonopoulos_ diff --git a/public/content/translations/uk/security/index.md b/public/content/translations/uk/security/index.md index 5d9e41e30c2..227d451ebb5 100644 --- a/public/content/translations/uk/security/index.md +++ b/public/content/translations/uk/security/index.md @@ -74,7 +74,7 @@ lang: uk SMS-повідомлень небезпечно, -  оскільки SIM-карту можуть зламати. Для кращої безпеки використовуйте програми на кшталт{" "} +  оскільки SIM-карту можуть зламати. Для кращої безпеки використовуйте програми на кшталт{" "} Google Authenticator @@ -278,7 +278,7 @@ _Примітка. Існують похідні токени / тікери, я ### Криптобезпека {#reading-crypto-security} - [Захистіть себе та свої кошти](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) — _MyCrypto_ -- [4 способи захистити себе в криптовалюті](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) — _CoinDesk_ +- [4 способи захистити себе в криптовалюті](https://www.coindesk.com/learn/4-ways-to-stay-safe-in-crypto/) — _CoinDesk_ - [Посібник із безпеки для чайників і просунутих](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) — _MyCrypto_ - [Криптобезпека: паролі й автентифікація](https://www.youtube.com/watch?v=m8jlnZuV1i4) — _Андреас М. Антонопулос_ From d23287914cac48fdd4c46bbb74059700b93e6c84 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 15:38:33 -0500 Subject: [PATCH 056/368] change https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/ to https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager --- public/content/translations/ar/enterprise/index.md | 2 +- public/content/translations/bn/enterprise/index.md | 2 +- public/content/translations/cs/enterprise/index.md | 2 +- public/content/translations/fi/enterprise/index.md | 2 +- public/content/translations/ko/enterprise/index.md | 2 +- public/content/translations/lt/enterprise/index.md | 2 +- public/content/translations/ml/enterprise/index.md | 2 +- public/content/translations/nb/enterprise/index.md | 2 +- public/content/translations/se/enterprise/index.md | 2 +- public/content/translations/sk/enterprise/index.md | 2 +- public/content/translations/uk/enterprise/index.md | 2 +- public/content/translations/vi/enterprise/index.md | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/content/translations/ar/enterprise/index.md b/public/content/translations/ar/enterprise/index.md index 4ba9fc7155b..d2507587392 100644 --- a/public/content/translations/ar/enterprise/index.md +++ b/public/content/translations/ar/enterprise/index.md @@ -63,7 +63,7 @@ lang: ar - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _المزيد من المعلومات [هنا](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _المزيد من المعلومات [هنا](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _المزيد من المعلومات [هنا](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _المزيد من المعلومات [هنا](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### الأمان {#security} diff --git a/public/content/translations/bn/enterprise/index.md b/public/content/translations/bn/enterprise/index.md index d3433e8fb07..64550106063 100644 --- a/public/content/translations/bn/enterprise/index.md +++ b/public/content/translations/bn/enterprise/index.md @@ -63,7 +63,7 @@ lang: bn - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _আরো তথ্য [এখানে](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _আরো তথ্য এখানে_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _আরো তথ্য_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _আরো তথ্য_ - [এখানে](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works) ### নিরাপত্তা {#security} diff --git a/public/content/translations/cs/enterprise/index.md b/public/content/translations/cs/enterprise/index.md index c1368998f9e..3b3fa99940a 100644 --- a/public/content/translations/cs/enterprise/index.md +++ b/public/content/translations/cs/enterprise/index.md @@ -64,7 +64,7 @@ Veřejné a soukromé Ethereum sítě mohou v závislosti na tom, kdo je použí - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _Více informací [zde](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _Více informací [zde](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _Více informací [zde](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _Více informací [zde](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### Bezpečnost {#security} diff --git a/public/content/translations/fi/enterprise/index.md b/public/content/translations/fi/enterprise/index.md index a622a097689..f746cbf2e00 100644 --- a/public/content/translations/fi/enterprise/index.md +++ b/public/content/translations/fi/enterprise/index.md @@ -64,7 +64,7 @@ Julkiset ja yksityiset Ethereum-verkot saattavat tarvita tiettyjä ominaisuuksia - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _Lisätietoa on [täällä](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _Lisätietoa on [täällä](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _Lisätietoa on [täällä](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _Lisätietoa on [täällä](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### Turvallisuus {#security} diff --git a/public/content/translations/ko/enterprise/index.md b/public/content/translations/ko/enterprise/index.md index dd7eedcd2ec..94a1c273e62 100644 --- a/public/content/translations/ko/enterprise/index.md +++ b/public/content/translations/ko/enterprise/index.md @@ -64,7 +64,7 @@ sidebarDepth: 1 - [Ernst & Young의 'Nightfall'](https://github.com/EYBlockchain/nightfall) *[여기](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)*에서 자세한 정보 확인 - [Pegasys의 Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) *[여기](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)*에서 자세한 정보 확인 -- [Quorum의 Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) *[여기](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)*에서 자세한 정보 확인 +- [Quorum의 Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) *[여기](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)*에서 자세한 정보 확인 ### 보안 {#security} diff --git a/public/content/translations/lt/enterprise/index.md b/public/content/translations/lt/enterprise/index.md index bef015230dc..f7ca0ab334d 100644 --- a/public/content/translations/lt/enterprise/index.md +++ b/public/content/translations/lt/enterprise/index.md @@ -64,7 +64,7 @@ Viešiesiems ir privatiems Ethereum tinklams gali prireikti specifinių savybių - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _Daugiau informacijos [here](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _Daugiau informacijos [here](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _Daugiau informacijos [here](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _Daugiau informacijos [here](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### Saugumas {#security} diff --git a/public/content/translations/ml/enterprise/index.md b/public/content/translations/ml/enterprise/index.md index 60c74c7046e..f2960ee7d77 100644 --- a/public/content/translations/ml/enterprise/index.md +++ b/public/content/translations/ml/enterprise/index.md @@ -63,7 +63,7 @@ Ethereum എന്റർപ്രൈസ് സൗഹൃദമാക്കുന - [ഏണസ്റ്റ് & യങ്ങിന്റെ ‘നൈറ്റ്ഫാൾ’](https://github.com/EYBlockchain/nightfall) _ കൂടുതൽ വിവരങ്ങൾ [ഇവിടെ](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on) _ - [പെഗാസിസിന്റെ ഓറിയോൺ](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _ കൂടുതൽ വിവരങ്ങൾ [ഇവിടെ](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/) _ -- [കോറം ടെസ്സെറ](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _ കൂടുതൽ വിവരങ്ങൾ [ഇവിടെ](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works) _ +- [കോറം ടെസ്സെറ](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _ കൂടുതൽ വിവരങ്ങൾ [ഇവിടെ](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works) _ ### സുരക്ഷ {#security} diff --git a/public/content/translations/nb/enterprise/index.md b/public/content/translations/nb/enterprise/index.md index 94df2f34680..f937579bd10 100644 --- a/public/content/translations/nb/enterprise/index.md +++ b/public/content/translations/nb/enterprise/index.md @@ -63,7 +63,7 @@ Offentlige og private Ethereum-nettverk kan trenge spesifikke funksjoner som kre - [Ernst & Youngs "Nightfall"](https://github.com/EYBlockchain/nightfall) _Mer informasjon [her](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _mer informasjon [her](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _Mer informasjon [her](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _Mer informasjon [her](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### Sikkerhet {#security} diff --git a/public/content/translations/se/enterprise/index.md b/public/content/translations/se/enterprise/index.md index a74aca55811..82abe4dae9a 100644 --- a/public/content/translations/se/enterprise/index.md +++ b/public/content/translations/se/enterprise/index.md @@ -63,7 +63,7 @@ Offentliga och privata Ethereum-nätverk kan behöva specifika funktioner som kr - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _Mer information finns [här](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _Mer information finns [här](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _Mer information finns [här](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _Mer information finns [här](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### Säkerhet {#security} diff --git a/public/content/translations/sk/enterprise/index.md b/public/content/translations/sk/enterprise/index.md index 15ec355ee9e..b64218fdb56 100644 --- a/public/content/translations/sk/enterprise/index.md +++ b/public/content/translations/sk/enterprise/index.md @@ -63,7 +63,7 @@ Verejné a súkromné ​​siete Etherea môžu potrebovať špecifické vlastn - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _Viac informácií [tu](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _Viac informácií [tu](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _Viac informácií [tu](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _Viac informácií [tu](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### Zabezpečenie {#security} diff --git a/public/content/translations/uk/enterprise/index.md b/public/content/translations/uk/enterprise/index.md index 9a2e057c43d..1b91ea37542 100644 --- a/public/content/translations/uk/enterprise/index.md +++ b/public/content/translations/uk/enterprise/index.md @@ -64,7 +64,7 @@ sidebarDepth: 1 - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _Більше інформації можна отримати [тут](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _Більше інформації можна отримати [тут](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _Більше інформації можна отримати [тут](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _Більше інформації можна отримати [тут](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### Безпека {#security} diff --git a/public/content/translations/vi/enterprise/index.md b/public/content/translations/vi/enterprise/index.md index e6ebd0318a9..248033f021a 100644 --- a/public/content/translations/vi/enterprise/index.md +++ b/public/content/translations/vi/enterprise/index.md @@ -64,7 +64,7 @@ Mạng Ethereum công cộng và riêng tư có thể cần các tính năng c - [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _Chi tiết [tại đây](https://bravenewcoin.com/insights/ernst-and-young-rolls-out-'nightfall-to-enable-private-transactions-on)_ - [Pegasys' Orion](https://docs.pantheon.pegasys.tech/en/stable/Concepts/Privacy/Privacy-Overview/) _Chi tiết [tại đây](https://pegasys.tech/privacy-in-pantheon-how-it-works-and-why-your-enterprise-should-care/)_ -- [Quorum's Tessera](https://docs.goquorum.com/en/latest/Privacy/Tessera/Tessera/) _Chi tiết [tại đây](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ +- [Quorum's Tessera](https://docs.goquorum.consensys.io/concepts/privacy#private-transaction-manager/) _Chi tiết [tại đây](https://github.com/jpmorganchase/tessera/wiki/How-Tessera-works)_ ### Bảo mật {#security} From c93a685dcb2082f29134f7022706a2e04d28da07 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 15:51:24 -0500 Subject: [PATCH 057/368] change https://docs.openzeppelin.com/contracts/4.x/wizard to https://docs.openzeppelin.com/contracts/5.x/wizard - 4.x wizard no longer available --- .../es/developers/tutorials/erc20-with-safety-rails/index.md | 2 +- .../fr/developers/tutorials/erc20-with-safety-rails/index.md | 2 +- .../it/developers/tutorials/erc20-with-safety-rails/index.md | 2 +- .../ja/developers/tutorials/erc20-with-safety-rails/index.md | 2 +- .../zh/developers/tutorials/erc20-with-safety-rails/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md index 1e62c5bfb5c..107363408c7 100644 --- a/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ Si quieres ver el código fuente completo: ## Creando un contrato ERC-20 {#creating-an-erc-20-contract} -Antes de agregar la funcionalidad del riel de seguridad, necesitamos un contrato ERC-20. En este artículo usaremos [el Asistente de Contratos de OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/wizard). Ábrelo en otra ventana del navegador y sigue estas instrucciones: +Antes de agregar la funcionalidad del riel de seguridad, necesitamos un contrato ERC-20. En este artículo usaremos [el Asistente de Contratos de OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Ábrelo en otra ventana del navegador y sigue estas instrucciones: 1. Selecciona **ERC-20**. 2. Ingresa estos ajustes: diff --git a/public/content/translations/fr/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/fr/developers/tutorials/erc20-with-safety-rails/index.md index e16a55fd4bb..fee27446296 100644 --- a/public/content/translations/fr/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/fr/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ Si vous souhaitez consulter le code source complet : ## Création d'un contrat ERC-20 {#creating-an-erc-20-contract} -Avant de pouvoir ajouter la fonctionnalité de sécurité, nous avons besoin d'un contrat ERC-20. Dans cet article, nous utiliserons [l'assistant de contrats OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/wizard). Ouvrez-le dans un autre navigateur et suivez ces instructions : +Avant de pouvoir ajouter la fonctionnalité de sécurité, nous avons besoin d'un contrat ERC-20. Dans cet article, nous utiliserons [l'assistant de contrats OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Ouvrez-le dans un autre navigateur et suivez ces instructions : 1. Sélectionnez **ERC20**. 2. Entrez ces paramètres : diff --git a/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md index d5b3b070e99..3bd263bc34d 100644 --- a/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ Se desideri visualizzare il codice sorgente completo: ## Creare un contratto ERC-20 {#creating-an-erc-20-contract} -Prima di poter aggiungere la funzionalità della barriera di sicurezza, ci occorre un contratto ERC-20. In questo articolo utilizzeremo [la procedura guidata dei contratti di OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/wizard). Aprila in un altro browser e segui queste istruzioni: +Prima di poter aggiungere la funzionalità della barriera di sicurezza, ci occorre un contratto ERC-20. In questo articolo utilizzeremo [la procedura guidata dei contratti di OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Aprila in un altro browser e segui queste istruzioni: 1. Seleziona **ERC20**. 2. Inserisci queste impostazioni: diff --git a/public/content/translations/ja/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/ja/developers/tutorials/erc20-with-safety-rails/index.md index e20290128d3..df1670d4332 100644 --- a/public/content/translations/ja/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/ja/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ published: 2022-08-15 ## ERC-20コントラクトの作成 {#creating-an-erc-20-contract} -安全策を講じるための機能を追加する前に、ERC-20コントラクトが必要になります。 この記事では、[OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/4.x/wizard)を使って加えます。 もう一つブラウザで開いて、次の手順に従ってください。 +安全策を講じるための機能を追加する前に、ERC-20コントラクトが必要になります。 この記事では、[OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/5.x/wizard)を使って加えます。 もう一つブラウザで開いて、次の手順に従ってください。 1. **ERC20**を選びます。 2. 次の設定値を入力します。 diff --git a/public/content/translations/zh/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/zh/developers/tutorials/erc20-with-safety-rails/index.md index 1383711e9c9..e62d88c3382 100644 --- a/public/content/translations/zh/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/zh/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ published: 2022-08-15 ## 创建 ERC-20 合约 {#creating-an-erc-20-contract} -在添加安全保障功能之前,我们首先需要 ERC-20 合约。 在这篇文章中,我们将使用 [the OpenZeppelin 合约向导](https://docs.openzeppelin.com/contracts/4.x/wizard)。 在另一个浏览器中将其打开,然后遵循以下说明: +在添加安全保障功能之前,我们首先需要 ERC-20 合约。 在这篇文章中,我们将使用 [the OpenZeppelin 合约向导](https://docs.openzeppelin.com/contracts/5.x/wizard)。 在另一个浏览器中将其打开,然后遵循以下说明: 1. 选择 **ERC-20**。 2. 请输入以下设置: From 1a802d48bba6c9bfcb92f6cec0cb770c15a05ef5 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 16:04:20 -0500 Subject: [PATCH 058/368] change https://docs.figment.io/introduction/what-is-datahub to https://figment-docs.gitbook.io/learn-docs/introduction/what-is-datahub - figmet has new docs though https://docs.figment.io/docs/welcome --- .../translations/id/developers/docs/apis/backend/index.md | 2 +- .../translations/pt-br/developers/docs/apis/backend/index.md | 2 +- .../translations/ro/developers/docs/apis/backend/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/translations/id/developers/docs/apis/backend/index.md b/public/content/translations/id/developers/docs/apis/backend/index.md index b47a31f4c6f..20661bf07a0 100644 --- a/public/content/translations/id/developers/docs/apis/backend/index.md +++ b/public/content/translations/id/developers/docs/apis/backend/index.md @@ -45,7 +45,7 @@ Pustaka ini menyederhanakan banyak kerumitan dalam interaksi langsung dengan nod **DataHub oleh Figment -** **_layanan API Web3 dengan Jaringan Utama Ethereum dan testnet._** - [DataHub](https://www.figment.io/datahub) -- [Dokumentasi](https://docs.figment.io/introduction/what-is-datahub) +- [Dokumentasi](https://figment-docs.gitbook.io/learn-docs/introduction/what-is-datahub) **Nodesmith -** **_Akses API JSON-RPC ke Jaringan Utama dan testnet Ethereum._** diff --git a/public/content/translations/pt-br/developers/docs/apis/backend/index.md b/public/content/translations/pt-br/developers/docs/apis/backend/index.md index ac9d4c7ada8..37821c3f2c4 100644 --- a/public/content/translations/pt-br/developers/docs/apis/backend/index.md +++ b/public/content/translations/pt-br/developers/docs/apis/backend/index.md @@ -56,7 +56,7 @@ Essas bibliotecas abstraem muito da complexidade de interagir diretamente com um **DataHub por Figment -** **_Serviços de API Web3 API com rede principal Ethereum e rede de testes._** - [DataHub](https://www.figment.io/datahub) -- [Documentação](https://docs.figment.io/introduction/what-is-datahub) +- [Documentação](https://figment-docs.gitbook.io/learn-docs/introduction/what-is-datahub) **NFTPort -** **_Dados Ethereum e APIs Mint._** diff --git a/public/content/translations/ro/developers/docs/apis/backend/index.md b/public/content/translations/ro/developers/docs/apis/backend/index.md index 9e6be7baf17..f78e9810aa6 100644 --- a/public/content/translations/ro/developers/docs/apis/backend/index.md +++ b/public/content/translations/ro/developers/docs/apis/backend/index.md @@ -45,7 +45,7 @@ Aceste biblioteci elimină o mare parte din complexitatea interacțiunii directe **DataHub de Figment-** **_Servicii API Web3 cu Mainnet -ul Ethereum și testnet-uri_** - [DataHub](https://www.figment.io/datahub) -- [Documentație](https://docs.figment.io/introduction/what-is-datahub) +- [Documentație](https://figment-docs.gitbook.io/learn-docs/introduction/what-is-datahub) **Nodesmith -** **_Acces la API-ul JSON-RPC pentru Mainnet-ul Ethereum și testnet-uri._** From c04a8e5a00655ca4d11862ef9d14115b242b72e1 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 16:17:44 -0500 Subject: [PATCH 059/368] change https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0 to https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum --- public/content/translations/el/learn/index.md | 2 +- public/content/translations/fa/learn/index.md | 2 +- public/content/translations/fi/learn/index.md | 2 +- public/content/translations/ig/learn/index.md | 2 +- public/content/translations/nl/learn/index.md | 2 +- public/content/translations/pl/learn/index.md | 2 +- public/content/translations/ru/learn/index.md | 2 +- public/content/translations/se/learn/index.md | 2 +- public/content/translations/sk/learn/index.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/content/translations/el/learn/index.md b/public/content/translations/el/learn/index.md index d4f17a7b579..248a532ca2c 100644 --- a/public/content/translations/el/learn/index.md +++ b/public/content/translations/el/learn/index.md @@ -91,7 +91,7 @@ lang: el Το ETH 2.0 (επίσης γνωστό και ως "Serenity") αναφέρεται στην επόμενη σημαντική αναβάθμιση του βασικού πρωτοκόλλου του Ethereum. Συνδυάζει αρκετές βελτιώσεις στο βασικό πρωτόκολλο του Ethereum ("Layer 1"). -- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _Dec 9, 2018 - Christine Kim_ +- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _Dec 9, 2018 - Christine Kim_ - [ETH 2.0 - The Road to Scaling Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Video) November, 2018 - YouTube_ ## ETH 1.x {#execution-layer-upgrades} diff --git a/public/content/translations/fa/learn/index.md b/public/content/translations/fa/learn/index.md index 2a823cc8353..4d6cd4e71ed 100644 --- a/public/content/translations/fa/learn/index.md +++ b/public/content/translations/fa/learn/index.md @@ -119,7 +119,7 @@ lang: fa سرنیتی "Serenity" یا ETH 2.0 به ارتقای بزرگ بعدی پروتکل اتریوم هسته اتلاق می‌شود که از ترکیب چندین مرحله بهسازی پروتکل هسته اتریوم یا "لایه 1" تشکیل می‌شود. -- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _Dec 9, 2018 - Christine Kim_ +- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _Dec 9, 2018 - Christine Kim_ - [ETH 2.0 - The Road to Scaling Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Video) November, 2018 - YouTube_ - [9 Things You Didn't Know About Ethereum 2.0](https://our.status.im/9-things-you-didnt-know-about-ethereum-2-0/) _July 18, 2019 - Bruno Škvorc_ diff --git a/public/content/translations/fi/learn/index.md b/public/content/translations/fi/learn/index.md index 9274c7934d9..6897d06e0c4 100644 --- a/public/content/translations/fi/learn/index.md +++ b/public/content/translations/fi/learn/index.md @@ -104,7 +104,7 @@ Taso 2 viittaa teknologioihin, jotka on rakennettu Ethereumin pääprotokollan p ETH 2.0 (tunnetaan myös nimellä Serenity) viittaa seuraavaan merkittävään päivitykseen Ethereumin ydinprotokollassa. Se yhdistää useita parannuksia Ethereumin ydinprotokollaan eli Taso 1:een. -- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _Dec 9, 2018 - Christine Kim_ +- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _Dec 9, 2018 - Christine Kim_ - [ETH 2.0 - The Road to Scaling Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Video) November, 2018 - YouTube_ - [9 Things You Didn't Know About Ethereum 2.0](https://our.status.im/9-things-you-didnt-know-about-ethereum-2-0/) _July 18, 2019 - Bruno Škvorc_ diff --git a/public/content/translations/ig/learn/index.md b/public/content/translations/ig/learn/index.md index c9708352c64..1661d3ca72e 100644 --- a/public/content/translations/ig/learn/index.md +++ b/public/content/translations/ig/learn/index.md @@ -89,7 +89,7 @@ Na mgbakwunye na ozi dị na peeji a, enwere ọtụtụ ihe enyere obodo aka kw ETH 2.0 (nke a makwaara dị ka “Serenity”) na-ezo aka na nkwalite isi ọzọ nke usoro isi protocol Ethereum. Ọ jikọtara ọtụtụ ndozi na usoro isi Ethereum, ma ọ bụ “Etu otu”. - - [Otu egwuregwu asato na-agbasa iji wuo Ọgbọ ọzọ nke Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _Dec 9, 2018 - Christine Kim_ + - [Otu egwuregwu asato na-agbasa iji wuo Ọgbọ ọzọ nke Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _Dec 9, 2018 - Christine Kim_ - [Okporo uzo eji e scalu Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Video) November, 2018 - YouTube_ ## ETH 1.x {#execution-layer-upgrades} diff --git a/public/content/translations/nl/learn/index.md b/public/content/translations/nl/learn/index.md index 5cdeac4f25f..980cc54bd91 100644 --- a/public/content/translations/nl/learn/index.md +++ b/public/content/translations/nl/learn/index.md @@ -91,7 +91,7 @@ Er wordt veel aandacht besteed aan het beter 'schaalbaar' maken van Ethereum doo ETH 2.0 (ook bekend als 'Serenity') verwijst naar de volgende grote verbetering van het Ethereum-coreprotocol. Hierin komen verschillende verbeteringen in het coreprotocol van Ethereum of ‘Layer 1’ samen. -- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _Dec 9, 2018 - Christine Kim_ +- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _Dec 9, 2018 - Christine Kim_ - [ETH 2.0 - The Road to Scaling Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Video) November, 2018 - YouTube_ ## ETH 1.x {#execution-layer-upgrades} diff --git a/public/content/translations/pl/learn/index.md b/public/content/translations/pl/learn/index.md index 0ea2c9e0e2f..8e380d6e902 100644 --- a/public/content/translations/pl/learn/index.md +++ b/public/content/translations/pl/learn/index.md @@ -91,7 +91,7 @@ Podejmowanych jest wiele starań, aby Ethereum było bardziej „skalowalne” p ETH 2.0 (znany również jako „Serenity”) odnosi się do kolejnej ważnej aktualizacji podstawowego protokołu Ethereum. Łączy kilka ulepszeń podstawowego protokołu Ethereum lub tzw. „Warstwy 1”. -- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _09.12.2018 - Christine Kim_ +- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _09.12.2018 - Christine Kim_ - [ETH 2.0 - The Road to Scaling Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Wideo) Listopad 2018 - YouTube_ ## ETH 1.x {#execution-layer-upgrades} diff --git a/public/content/translations/ru/learn/index.md b/public/content/translations/ru/learn/index.md index 328886735b4..7b9789f86bb 100644 --- a/public/content/translations/ru/learn/index.md +++ b/public/content/translations/ru/learn/index.md @@ -91,7 +91,7 @@ lang: ru ETH 2.0 (также известный как Serenity) относится к следующему крупному обновлению базового протокола Ethereum. Он объединяет некоторые улучшения базового протокола Ethereum (уровень 1). -- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _Dec 9, 2018 - Christine Kim_ +- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _Dec 9, 2018 - Christine Kim_ - [ETH 2.0 - The Road to Scaling Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Video) November, 2018 - YouTube_ ## ETH 1.x {#execution-layer-upgrades} diff --git a/public/content/translations/se/learn/index.md b/public/content/translations/se/learn/index.md index 41297e89f51..134e4c05bba 100644 --- a/public/content/translations/se/learn/index.md +++ b/public/content/translations/se/learn/index.md @@ -103,7 +103,7 @@ Många ansträngningar har gjorts för att göra Ethereum mer "skalbar" genom at ETH 2.0 (även känd som "Serenity") hänvisar till nästa stora uppgradering av Ethereum-kärnprotokollet. Den kombinerar flera förbättringar av Ethereums kärnprotokoll, eller "Skikt 1". -- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _9 dec., 2018 - Christine Kim_ +- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _9 dec., 2018 - Christine Kim_ - [ETH 2.0 - The Road to Scaling Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Video) November, 2018 - YouTube_ - [9 Things You Didn't Know About Ethereum 2.0](https://our.status.im/9-things-you-didnt-know-about-ethereum-2-0/) _18 juli, 2019 - Bruno Škvorc_ diff --git a/public/content/translations/sk/learn/index.md b/public/content/translations/sk/learn/index.md index e33aefc6115..67a887e3f7c 100644 --- a/public/content/translations/sk/learn/index.md +++ b/public/content/translations/sk/learn/index.md @@ -103,7 +103,7 @@ Je vyvíjané veľké úsilie o to, aby bolo Ethereum „škálovateľnejšie“ Ethereum 2.0 (známe aj ako „Serenity“) je ďalšou významnou inováciou základného protokolu Etherea. Kombinuje niekoľko vylepšení základného protokolu Etherea, teda „vrstvy 1“. -- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/next-gen-buidlers-the-8-teams-working-on-ethereum-2-0) _9. decembra 2018 - Christine Kim_ +- [8 Teams Are Sprinting to Build the Next Generation of Ethereum](https://www.coindesk.com/markets/2018/12/09/8-teams-are-sprinting-to-build-the-next-generation-of-ethereum) _9. decembra 2018 - Christine Kim_ - [ETH 2.0 - The Road to Scaling Ethereum - Vitalik Buterin](https://youtu.be/kCVpDrlVesA) _(Video) november 2018 - YouTube_ - [9 Things You Didn't Know About Ethereum 2.0](https://our.status.im/9-things-you-didnt-know-about-ethereum-2-0/) _18. júla 2019 - Bruno Škvorc_ From 8876a253b30a91bcf366d233ddbba432300ad195 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 16:18:10 -0500 Subject: [PATCH 060/368] change https://pinata.cloud/documentation#PinJSONToIPFS to https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json --- public/content/developers/tutorials/nft-minter/index.md | 2 +- .../translations/es/developers/tutorials/nft-minter/index.md | 2 +- .../translations/fr/developers/tutorials/nft-minter/index.md | 2 +- .../translations/id/developers/tutorials/nft-minter/index.md | 2 +- .../translations/it/developers/tutorials/nft-minter/index.md | 2 +- .../translations/ja/developers/tutorials/nft-minter/index.md | 2 +- .../translations/pt-br/developers/tutorials/nft-minter/index.md | 2 +- .../translations/ro/developers/tutorials/nft-minter/index.md | 2 +- .../translations/tr/developers/tutorials/nft-minter/index.md | 2 +- .../translations/zh/developers/tutorials/nft-minter/index.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/content/developers/tutorials/nft-minter/index.md b/public/content/developers/tutorials/nft-minter/index.md index 9726f92e663..9b2b269a25e 100644 --- a/public/content/developers/tutorials/nft-minter/index.md +++ b/public/content/developers/tutorials/nft-minter/index.md @@ -512,7 +512,7 @@ Save the file, and then you're ready to start writing the function to upload you ### Implement pinJSONToIPFS {#pin-json-to-ipfs} -Fortunately for us, Pinata has an [API specifically for uploading JSON data to IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) and a convenient JavaScript with axios example that we can use, with some slight modifications. +Fortunately for us, Pinata has an [API specifically for uploading JSON data to IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) and a convenient JavaScript with axios example that we can use, with some slight modifications. In your `utils` folder, let's create another file called `pinata.js` and then import our Pinata secret and key from the .env file like so: diff --git a/public/content/translations/es/developers/tutorials/nft-minter/index.md b/public/content/translations/es/developers/tutorials/nft-minter/index.md index ae77bc30f3f..a0810c38b77 100644 --- a/public/content/translations/es/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/es/developers/tutorials/nft-minter/index.md @@ -518,7 +518,7 @@ Guarde el archivo y luego estará listo para iniciar la escritura de la función ### Implemente pinJSONToIPFS {#pin-json-to-ipfs} -Afortunadamente para nosotros, Pinata tiene una [API específicamente para subir datos JSON a IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) y un práctico ejemplo de JavaScript con axios que podemos usar, con algunas ligeras modificaciones. +Afortunadamente para nosotros, Pinata tiene una [API específicamente para subir datos JSON a IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) y un práctico ejemplo de JavaScript con axios que podemos usar, con algunas ligeras modificaciones. En la carpeta `utils`, vamos a crear otro archivo llamado `pinata.js` y luego importar su secreto y clave de Pinata desde el archivo .env de la siguiente manera: diff --git a/public/content/translations/fr/developers/tutorials/nft-minter/index.md b/public/content/translations/fr/developers/tutorials/nft-minter/index.md index de77e07740b..73e00084b7c 100644 --- a/public/content/translations/fr/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/fr/developers/tutorials/nft-minter/index.md @@ -518,7 +518,7 @@ Enregistrez le fichier et vous êtes prêt à commencer à écrire la fonction p ### Implémenter pinJSONToIPFS {#pin-json-to-ipfs} -Heureusement pour nous, Pinata a une [API spécifique pour télécharger des données JSON sur IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) et un JavaScript pratique avec un exemple d'axios que nous pouvons utiliser en opérant juste quelques petites modifications. +Heureusement pour nous, Pinata a une [API spécifique pour télécharger des données JSON sur IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) et un JavaScript pratique avec un exemple d'axios que nous pouvons utiliser en opérant juste quelques petites modifications. Dans votre dossier `utils`, créons un autre fichier appelé `pinata.js` puis importez notre clé secrète Pinata à partir du fichier `.env` comme suit : diff --git a/public/content/translations/id/developers/tutorials/nft-minter/index.md b/public/content/translations/id/developers/tutorials/nft-minter/index.md index 8ca8f8c255f..5773c91fef6 100644 --- a/public/content/translations/id/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/id/developers/tutorials/nft-minter/index.md @@ -519,7 +519,7 @@ Save the file, and then you're ready to start writing the function to upload you ### Implement pinJSONToIPFS {#pin-json-to-ipfs} -Fortunately for us, Pinata has an [API specifically for uploading JSON data to IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) and a convenient JavaScript with axios example that we can use, with some slight modifications. +Fortunately for us, Pinata has an [API specifically for uploading JSON data to IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) and a convenient JavaScript with axios example that we can use, with some slight modifications. In your `utils` folder, let's create another file called `pinata.js` and then import our Pinata secret and key from the .env file like so: diff --git a/public/content/translations/it/developers/tutorials/nft-minter/index.md b/public/content/translations/it/developers/tutorials/nft-minter/index.md index 284042043c3..fcac440f4cc 100644 --- a/public/content/translations/it/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/it/developers/tutorials/nft-minter/index.md @@ -518,7 +518,7 @@ Salva il file: sei pronto ora per scrivere la funzione per caricare i tuoi metad ### Implementa pinJSONToIPFS {#pin-json-to-ipfs} -Per nostra fortuna, Pinata ha un'[API specifica per caricare i dati JSON su IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) e un comodo JavaScript con esempio di axios che possiamo usare, con alcune lievi modifiche. +Per nostra fortuna, Pinata ha un'[API specifica per caricare i dati JSON su IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) e un comodo JavaScript con esempio di axios che possiamo usare, con alcune lievi modifiche. Nella cartella `utils` creiamo un altro file denominato `pinata.js` e poi importiamo il nostro codice segreto di Pinata e la chiave dal file .env, come segue: diff --git a/public/content/translations/ja/developers/tutorials/nft-minter/index.md b/public/content/translations/ja/developers/tutorials/nft-minter/index.md index 73c207a00c0..7a2c3ca9413 100644 --- a/public/content/translations/ja/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/ja/developers/tutorials/nft-minter/index.md @@ -518,7 +518,7 @@ REACT_APP_PINATA_SECRET = ### pinJSONToIPFSの実装 {#pin-json-to-ipfs} -幸いにもPinataでは、[惑星間ファイルシステム(IPFS)へのJSONデータのアップロードに特化したAPI](https://pinata.cloud/documentation#PinJSONToIPFS)と、少しの変更を加えるだけで使用できるaxiosのサンプルを備えた便利なJavaScriptを使用できます。 +幸いにもPinataでは、[惑星間ファイルシステム(IPFS)へのJSONデータのアップロードに特化したAPI](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json)と、少しの変更を加えるだけで使用できるaxiosのサンプルを備えた便利なJavaScriptを使用できます。 `utils`フォルダーに`pinata.js`という別のファイルを作成し、.envファイルからPinataのシークレットとキーをインポートしましょう。 diff --git a/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md b/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md index 56bf004d487..9fe52ddba69 100644 --- a/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md @@ -518,7 +518,7 @@ Salve o arquivo e então você estará pronto para começar a escrever a funçã ### Implementar pinJSONToIPFS {#pin-json-to-ipfs} -Felizmente para nós, a Pinata tem uma API [especificamente para carregar dados JSON para o IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) e um JavaScript conveniente com axios de exemplo que podemos usar, com algumas pequenas modificações. +Felizmente para nós, a Pinata tem uma API [especificamente para carregar dados JSON para o IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) e um JavaScript conveniente com axios de exemplo que podemos usar, com algumas pequenas modificações. Na sua pasta `utils`, vamos criar outro arquivo chamado `pinata.js` e então importar nossa chave Pinata do arquivo .env assim: diff --git a/public/content/translations/ro/developers/tutorials/nft-minter/index.md b/public/content/translations/ro/developers/tutorials/nft-minter/index.md index 496141a493d..6b64fba4aaa 100644 --- a/public/content/translations/ro/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/ro/developers/tutorials/nft-minter/index.md @@ -521,7 +521,7 @@ Save the file, and then you're ready to start writing the function to upload you ### Implement pinJSONToIPFS {#pin-json-to-ipfs} -Fortunately for us, Pinata has an [API specifically for uploading JSON data to IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) and a convenient JavaScript with axios example that we can use, with some slight modifications. +Fortunately for us, Pinata has an [API specifically for uploading JSON data to IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) and a convenient JavaScript with axios example that we can use, with some slight modifications. In your `utils` folder, let's create another file called `pinata.js` and then import our Pinata secret and key from the .env file like so: diff --git a/public/content/translations/tr/developers/tutorials/nft-minter/index.md b/public/content/translations/tr/developers/tutorials/nft-minter/index.md index c433e9cfefa..5b9b4a98818 100644 --- a/public/content/translations/tr/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/tr/developers/tutorials/nft-minter/index.md @@ -518,7 +518,7 @@ Dosyayı kaydettikten sonra JSON meta verilerinizi IPFS'ye yüklemek için fonks ### PinJSONToIPFS'yi uygulayın {#pin-json-to-ipfs} -Neyse ki, Pinata'nın [özellikle JSON verilerini IPFS'ye yüklemek için bir API'si](https://pinata.cloud/documentation#PinJSONToIPFS) ve axios örneğiyle bazı ufak değişiklikler yaparak birlikte kullanabileceğimiz uygun bir JavaScript'i var. +Neyse ki, Pinata'nın [özellikle JSON verilerini IPFS'ye yüklemek için bir API'si](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) ve axios örneğiyle bazı ufak değişiklikler yaparak birlikte kullanabileceğimiz uygun bir JavaScript'i var. `utils` klasörünüzde `pinata.js` adında başka bir dosya oluşturalım ve ardından .env dosyasından Pinata sırrımızı ve anahtarımızı şu şekilde içe aktaralım: diff --git a/public/content/translations/zh/developers/tutorials/nft-minter/index.md b/public/content/translations/zh/developers/tutorials/nft-minter/index.md index a0712ee6981..7a1c085ee2b 100644 --- a/public/content/translations/zh/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/zh/developers/tutorials/nft-minter/index.md @@ -521,7 +521,7 @@ REACT_APP_PINATA_SECRET = ### 实现 pinJSONToIPFS {#pin-json-to-ipfs} -对我们来说幸运的是,Pinata 提供了一个[专门用于将 JSON 数据上传到星际文件系统的应用程序接口](https://pinata.cloud/documentation#PinJSONToIPFS)和一个方便的使用 axios 示例的 JavaScript,我们做一些轻微修改后就可以使用它。 +对我们来说幸运的是,Pinata 提供了一个[专门用于将 JSON 数据上传到星际文件系统的应用程序接口](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json)和一个方便的使用 axios 示例的 JavaScript,我们做一些轻微修改后就可以使用它。 在您的 `utils` 文件夹中,我们创建另一个名为 `pinata.js` 的文件,然后从 .env 文件中导入我们的 Pinata 私钥和密钥,如下所示: From 9cd3ad0781ae25b3b3c8ddd0bb443af5c2534023 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 11 Feb 2025 16:34:41 -0500 Subject: [PATCH 061/368] change https://pinata.cloud/signup to https://app.pinata.cloud/auth/signup [skip ci] --- public/content/developers/tutorials/nft-minter/index.md | 2 +- .../translations/es/developers/tutorials/nft-minter/index.md | 2 +- .../translations/fr/developers/tutorials/nft-minter/index.md | 2 +- .../translations/id/developers/tutorials/nft-minter/index.md | 2 +- .../translations/it/developers/tutorials/nft-minter/index.md | 2 +- .../translations/ja/developers/tutorials/nft-minter/index.md | 2 +- .../translations/ro/developers/tutorials/nft-minter/index.md | 2 +- .../translations/tr/developers/tutorials/nft-minter/index.md | 2 +- .../translations/zh/developers/tutorials/nft-minter/index.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/content/developers/tutorials/nft-minter/index.md b/public/content/developers/tutorials/nft-minter/index.md index 9b2b269a25e..293d1edb685 100644 --- a/public/content/developers/tutorials/nft-minter/index.md +++ b/public/content/developers/tutorials/nft-minter/index.md @@ -473,7 +473,7 @@ To store our metadata on IPFS, we will use [Pinata](https://pinata.cloud/), a co ## Use Pinata to pin your metadata to IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} -If you don't have a [Pinata](https://pinata.cloud/) account, sign up for a free account [here](https://pinata.cloud/signup) and complete the steps to verify your email and account. +If you don't have a [Pinata](https://pinata.cloud/) account, sign up for a free account [here](https://app.pinata.cloud/auth/signup) and complete the steps to verify your email and account. ### Create your Pinata API key {#create-pinata-api-key} diff --git a/public/content/translations/es/developers/tutorials/nft-minter/index.md b/public/content/translations/es/developers/tutorials/nft-minter/index.md index a0810c38b77..1b1027b9352 100644 --- a/public/content/translations/es/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/es/developers/tutorials/nft-minter/index.md @@ -479,7 +479,7 @@ Para almacenar nuestros metadatos en IPFS, usaremos [Pinata](https://pinata.clou ## Use Pinata para fijar sus metadatos en IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} -Si no tiene una cuenta de [Pinata](https://pinata.cloud/), cree una cuenta gratuita [aquí](https://pinata.cloud/signup) y complete los pasos para verificar su correo electrónico y su cuenta. +Si no tiene una cuenta de [Pinata](https://pinata.cloud/), cree una cuenta gratuita [aquí](https://app.pinata.cloud/auth/signup) y complete los pasos para verificar su correo electrónico y su cuenta. ### Cree su clave de API de Pinata {#create-pinata-api-key} diff --git a/public/content/translations/fr/developers/tutorials/nft-minter/index.md b/public/content/translations/fr/developers/tutorials/nft-minter/index.md index 73e00084b7c..3b6aacf4caa 100644 --- a/public/content/translations/fr/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/fr/developers/tutorials/nft-minter/index.md @@ -479,7 +479,7 @@ Pour stocker nos métadonnées sur IPFS, nous allons utiliser [Pinata](https://p ## Utiliser Pinata pour épingler vos métadonnées sur IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} -Si vous n'avez pas de compte [Pinata](https://pinata.cloud/), créez-vous un compte gratuit [ici](https://pinata.cloud/signup) et suivez les étapes pour vérifier votre mail et votre compte. +Si vous n'avez pas de compte [Pinata](https://pinata.cloud/), créez-vous un compte gratuit [ici](https://app.pinata.cloud/auth/signup) et suivez les étapes pour vérifier votre mail et votre compte. ### Créer votre clé API Pinata {#create-pinata-api-key} diff --git a/public/content/translations/id/developers/tutorials/nft-minter/index.md b/public/content/translations/id/developers/tutorials/nft-minter/index.md index 5773c91fef6..90fb21be116 100644 --- a/public/content/translations/id/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/id/developers/tutorials/nft-minter/index.md @@ -480,7 +480,7 @@ To store our metadata on IPFS, we will use [Pinata](https://pinata.cloud/), a co ## Use Pintata to pin your metadata to IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} -If you don't have a [Pinata](https://pinata.cloud/) account, sign up for a free account [here](https://pinata.cloud/signup) and complete the steps to verify your email and account. +If you don't have a [Pinata](https://pinata.cloud/) account, sign up for a free account [here](https://app.pinata.cloud/auth/signup) and complete the steps to verify your email and account. ### Create your Pinata API key {#create-pinata-api-key} diff --git a/public/content/translations/it/developers/tutorials/nft-minter/index.md b/public/content/translations/it/developers/tutorials/nft-minter/index.md index fcac440f4cc..1171601bf02 100644 --- a/public/content/translations/it/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/it/developers/tutorials/nft-minter/index.md @@ -479,7 +479,7 @@ Per memorizzare i nostri metadati su IPFS, useremo [Pinata](https://pinata.cloud ## Utilizza Pinata per fissare i tuoi metadati su IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} -Se non hai un conto di [Pinata](https://pinata.cloud/), registrane gratuitamente uno [qui](https://pinata.cloud/signup) e completa i passaggi per verificare la tua email e il tuo conto. +Se non hai un conto di [Pinata](https://pinata.cloud/), registrane gratuitamente uno [qui](https://app.pinata.cloud/auth/signup) e completa i passaggi per verificare la tua email e il tuo conto. ### Crea la tua chiave API di Pinata {#create-pinata-api-key} diff --git a/public/content/translations/ja/developers/tutorials/nft-minter/index.md b/public/content/translations/ja/developers/tutorials/nft-minter/index.md index 7a2c3ca9413..99fe6eb2a9f 100644 --- a/public/content/translations/ja/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/ja/developers/tutorials/nft-minter/index.md @@ -479,7 +479,7 @@ JSONオブジェクトとしてメタデータを設定し、保存する必要 ## Pinataを使用してメタデータをIPFSに固定化 {#use-pinata-to-pin-your-metadata-to-IPFS} -[Pinata](https://pinata.cloud/)アカウントをお持ちでない場合は、[こちら](https://pinata.cloud/signup)から無料のアカウントにサインアップし、メールアドレスとアカウントの認証手順を完了してください。 +[Pinata](https://pinata.cloud/)アカウントをお持ちでない場合は、[こちら](https://app.pinata.cloud/auth/signup)から無料のアカウントにサインアップし、メールアドレスとアカウントの認証手順を完了してください。 ### Pinata APIキーの作成 {#create-pinata-api-key} diff --git a/public/content/translations/ro/developers/tutorials/nft-minter/index.md b/public/content/translations/ro/developers/tutorials/nft-minter/index.md index 6b64fba4aaa..58a0e7ac729 100644 --- a/public/content/translations/ro/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/ro/developers/tutorials/nft-minter/index.md @@ -482,7 +482,7 @@ To store our metadata on IPFS, we will use [Pinata](https://pinata.cloud/), a co ## Use Pintata to pin your metadata to IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} -If you don't have a [Pinata](https://pinata.cloud/) account, sign up for a free account [here](https://pinata.cloud/signup) and complete the steps to verify your email and account. +If you don't have a [Pinata](https://pinata.cloud/) account, sign up for a free account [here](https://app.pinata.cloud/auth/signup) and complete the steps to verify your email and account. ### Create your Pinata API key {#create-pinata-api-key} diff --git a/public/content/translations/tr/developers/tutorials/nft-minter/index.md b/public/content/translations/tr/developers/tutorials/nft-minter/index.md index 5b9b4a98818..45baf9d6ead 100644 --- a/public/content/translations/tr/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/tr/developers/tutorials/nft-minter/index.md @@ -479,7 +479,7 @@ Meta verilerimizi IPFS'de depolamak için, uygun bir IPFS API'si ve araç takım ## Meta verilerinizi IPFS'ye sabitlemek için Pinata'yı kullanın {#use-pinata-to-pin-your-metadata-to-IPFS} -[Pinata](https://pinata.cloud/) hesabınız yoksa, [buradan](https://pinata.cloud/signup) ücretsiz bir hesap için kaydolun ve e-postanızla hesabınızı doğrulamak için adımları tamamlayın. +[Pinata](https://pinata.cloud/) hesabınız yoksa, [buradan](https://app.pinata.cloud/auth/signup) ücretsiz bir hesap için kaydolun ve e-postanızla hesabınızı doğrulamak için adımları tamamlayın. ### Pinata API anahtarınızı oluşturun {#create-pinata-api-key} diff --git a/public/content/translations/zh/developers/tutorials/nft-minter/index.md b/public/content/translations/zh/developers/tutorials/nft-minter/index.md index 7a1c085ee2b..7821c9f0446 100644 --- a/public/content/translations/zh/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/zh/developers/tutorials/nft-minter/index.md @@ -482,7 +482,7 @@ useEffect(async () => { ## 使用 Pintata 将元数据固定到星际文件系统 {#use-pinata-to-pin-your-metadata-to-IPFS} -如果您没有 [Pinata](https://pinata.cloud/) 帐户,请点击[此处](https://pinata.cloud/signup)注册一个免费帐户完成您的电子邮件和帐户验证步骤。 +如果您没有 [Pinata](https://pinata.cloud/) 帐户,请点击[此处](https://app.pinata.cloud/auth/signup)注册一个免费帐户完成您的电子邮件和帐户验证步骤。 ### 创建您的 Pinata 应用程序接口密钥 {#create-pinata-api-key} From 7c76a0eaf244bcd93bd3639f486a24421d2ef1f4 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 12 Feb 2025 13:28:44 -0500 Subject: [PATCH 062/368] change https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne to https://www.klimadao.finance/resources/klimadao-impact-report-analysis-of-the-base-carbon-tonne --- public/content/translations/ar/refi/index.md | 2 +- public/content/translations/az/refi/index.md | 2 +- public/content/translations/bn/refi/index.md | 2 +- public/content/translations/fil/refi/index.md | 2 +- public/content/translations/kn/refi/index.md | 2 +- public/content/translations/ko/refi/index.md | 2 +- public/content/translations/mr/refi/index.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/content/translations/ar/refi/index.md b/public/content/translations/ar/refi/index.md index ab5ec7855c1..49a26123a40 100644 --- a/public/content/translations/ar/refi/index.md +++ b/public/content/translations/ar/refi/index.md @@ -47,7 +47,7 @@ summaryPoint3: أداة تسهم في توسع الأصول الإيكولوجي - **حيث تتركز السيولة النقدية ضمن أعداد قليلة من مجموعات السيولة النقدية** والتي يمكن أن يداولها الجميع بحرية. المستخدمون الفرديون والمؤسسات على حد سواء يمكنهم استخدام هذه المجموعات، من دون الحاجة إلى البحث اليدوي عن بائع/مشترٍ، دفع رسوم المشاركة، أو حتى التسجيل المسبق. - **كما أن جميع المعاملات مسجلة على بلوكتشين عامة**. يمكن تتبع المسار، الناتج عن أنشطة التداول، الذي يسلكه كل رصيد كربوني إلى الأبد بمجرد توافره في أسواق الكربون الرقمية. - **ناهيك عن أن سرعة المعاملة تكاد أن تكون فورية**. قد تستغرق عملية الحصول على كمية كبيرة من الحصص الكربونية من الأسواق التقليدية أيامًا أو أسابيع بينما تستغرق نفس العملية بضع لحظات في أسواق الكربون الرقمية. -- **تحدث عملية التداول بدون وسطاء**، الذين يفرضون رسومًا باهظة. فبالاستناد الى بيانات إحدى شركات التحليلات،[ تحسن الحصص الكربونية الرقمية التكلفة بنسبة ٦٢%، بالمقارنة مع الحصص التقليدية](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne). +- **تحدث عملية التداول بدون وسطاء**، الذين يفرضون رسومًا باهظة. فبالاستناد الى بيانات إحدى شركات التحليلات،[ تحسن الحصص الكربونية الرقمية التكلفة بنسبة ٦٢%، بالمقارنة مع الحصص التقليدية](https://www.klimadao.finance/resources/klimadao-impact-report-analysis-of-the-base-carbon-tonne). - يتميز **سوق الكربون الرقمية بقابلية التطور** التي تسطيع تلبية احتياجات الأفراد والشركات متعددة الجنسيات. ### العناصر الرئيسة لأسواق الكربون الرقمية {#key-components-dcm} diff --git a/public/content/translations/az/refi/index.md b/public/content/translations/az/refi/index.md index 4c8aad839cd..8a7a009ab3c 100644 --- a/public/content/translations/az/refi/index.md +++ b/public/content/translations/az/refi/index.md @@ -47,7 +47,7 @@ ReFi layihələri ənənəvi bazarın bir çox problemlərini yüngülləşdirm - **Likvidlik hər kəs tərəfindən sərbəst şəkildə satıla bilən az sayda likvidlik hovuzlarında cəmləşmişdir**. Böyük təşkilatlar, eləcə də fərdi istifadəçilər bu hovuzlardan satıcılar/alıcılar üçün manual axtarışlar, iştirak haqqı və ya əvvəlcədən qeydiyyat olmadan istifadə edə bilərlər. - **Bütün əməliyyatlar ictimai blokçeynlərdə qeydə alınır**. Hər bir karbon kreditinin ticarət fəaliyyəti ilə bağlı keçdiyi yol, DCM-də mövcud olan kimi həmişəlik izlənilə bilər. - **Tranzaksiya sürəti demək olar ki, anidir**. Böyük miqdarda karbon kreditinin köhnə bazarlar vasitəsilə təmin edilməsi günlər və ya həftələr çəkə bilər, lakin DCM-də buna bir neçə saniyə ərzində nail olmaq olar. -- **Ticarət fəaliyyəti yüksək rüsum tələb edən vasitəçilər olmadan baş verir**. Bir analitik firmanın verdiyi məlumata görə, rəqəmsal karbon kreditləri [ekvivalent ənənəvi kreditlərlə müqayisədə xərclərin 62% yaxşılaşdırılmasını](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne) təmsil edir. +- **Ticarət fəaliyyəti yüksək rüsum tələb edən vasitəçilər olmadan baş verir**. Bir analitik firmanın verdiyi məlumata görə, rəqəmsal karbon kreditləri [ekvivalent ənənəvi kreditlərlə müqayisədə xərclərin 62% yaxşılaşdırılmasını](https://www.klimadao.finance/resources/klimadao-impact-report-analysis-of-the-base-carbon-tonne) təmsil edir. - **DCM genişlənə** və həm fiziki şəxslərin, həm də çoxmillətli korporasiyaların tələblərinə cavab verə bilər. ### DCM-nin əsas komponentləri {#key-components-dcm} diff --git a/public/content/translations/bn/refi/index.md b/public/content/translations/bn/refi/index.md index 30c5fc4247f..9eb7b22cfb2 100644 --- a/public/content/translations/bn/refi/index.md +++ b/public/content/translations/bn/refi/index.md @@ -47,7 +47,7 @@ ReFi প্রকল্পগুলি প্রথাগত বাজারে - **লিকুইডিটি অল্প সংখ্যক লিকুইডিটি পুলে কেন্দ্রীভূত হয়** যা যে কেউ অবাধে ট্রেড করতে পারে। বড় সংস্থাগুলির পাশাপাশি স্বতন্ত্র ব্যবহারকারীরা বিক্রেতা/ক্রেতাদের জন্য ম্যানুয়াল অনুসন্ধান, অংশগ্রহণ ফি বা পূর্ব নিবন্ধন ছাড়াই এই পুলগুলি ব্যবহার করতে পারেন। - **সমস্ত লেনদেন পাবলিক ব্লকচেইনে রেকর্ড করা হয়**। ট্রেডিং ক্রিয়াকলাপের কারণে প্রতিটি কার্বন ক্রেডিট যে পথটি নেয় তা DCM-এ এভেইল্যাবল হওয়ার সাথে সাথে চিরতরে শনাক্ত করা যায়। - **লেনদেনের গতি প্রায় তাৎক্ষণিক**। পূর্ববর্তী বাজারের মাধ্যমে প্রচুর পরিমাণে কার্বন ক্রেডিট সুরক্ষিত করতে কয়েক দিন বা সপ্তাহ সময় লাগতে পারে তবে এটি DCM-এ কয়েক সেকেন্ডের মধ্যে অর্জন করা যেতে পারে। -- **ব্যবসায়িক কার্যকলাপ মধ্যস্থতাকারীদের ছাড়াই ঘটে**, যা উচ্চ ফি চার্জ করে। একটি অ্যানালিটিক্স ফার্মের তথ্য অনুসারে, [ডিজিটাল কার্বন ক্রেডিটগুলি সমতুল্য প্রথাগত ক্রেডিটের তুলনায় 62% ব্যয়ের উন্নতি](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne) প্রতিনিধিত্ব করে। +- **ব্যবসায়িক কার্যকলাপ মধ্যস্থতাকারীদের ছাড়াই ঘটে**, যা উচ্চ ফি চার্জ করে। একটি অ্যানালিটিক্স ফার্মের তথ্য অনুসারে, [ডিজিটাল কার্বন ক্রেডিটগুলি সমতুল্য প্রথাগত ক্রেডিটের তুলনায় 62% ব্যয়ের উন্নতি](https://www.klimadao.finance/resources/klimadao-impact-report-analysis-of-the-base-carbon-tonne) প্রতিনিধিত্ব করে। - **DCM মাপযোগ্য** এবং একইভাবে ব্যক্তি এবং বহুজাতিক কর্পোরেশনের চাহিদা মেটাতে পারে। ### DCM এর মূল উপাদান {#key-components-dcm} diff --git a/public/content/translations/fil/refi/index.md b/public/content/translations/fil/refi/index.md index 8e85df634ee..a5a8cf36952 100644 --- a/public/content/translations/fil/refi/index.md +++ b/public/content/translations/fil/refi/index.md @@ -47,7 +47,7 @@ Gumagamit ang mga proyekto sa ReFi ng blockchain technology para solusyonan ang - **Tinitipon ang liquidity sa iilang liquidity pool** na malayang mate-trade ng kahit sino. Ginagamit ng malalaking organisasyon, pati na rin ng mga indibidwal na user ang mga pool na ito nang hindi manual na naghahanap ng mga seller/buyer, bayarin sa paglahok, o paunang pagpaparehistro. - **Nire-record ang lahat ng transaksyon sa mga pampublikong blockchain**. Ang daang tinatahak ng bawat carbon credit dahil sa aktibidad sa trading ay palaging masusubaybayan sa sandaling maging available ito sa digital carbon market (DCM). - **Halos agaran ang bilis ng transaksyon**. Maaaring abutin nang ilang araw o linggo ang pagkuha ng maraming carbon credit sa pamamagitan ng mga legacy market, pero magagawa ito sa loob ng ilang segundo sa DCM. -- **Isinasagawa ang mga gawain sa trading nang walang intermediary**, na naniningil ng mahal na bayarin. Ayon sa data mula sa isang analytics firm, kumakatawan ang mga digital carbon credit sa [62% pagpapabuti sa gastos kumpara sa mga katumbas na tradisyonal na credit](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne). +- **Isinasagawa ang mga gawain sa trading nang walang intermediary**, na naniningil ng mahal na bayarin. Ayon sa data mula sa isang analytics firm, kumakatawan ang mga digital carbon credit sa [62% pagpapabuti sa gastos kumpara sa mga katumbas na tradisyonal na credit](https://www.klimadao.finance/resources/klimadao-impact-report-analysis-of-the-base-carbon-tonne). - **Scalable ang DCM** at kaya nitong tugunan ang mga demand ng mga indibidwal at multinational corporation. ### Mga pangunahing bahagi ng DCM {#key-components-dcm} diff --git a/public/content/translations/kn/refi/index.md b/public/content/translations/kn/refi/index.md index 4d38f2f9eec..eb8313a913f 100644 --- a/public/content/translations/kn/refi/index.md +++ b/public/content/translations/kn/refi/index.md @@ -47,7 +47,7 @@ VCM ಅನ್ನು ಹೊಸ ಬ್ಲಾಕ್ಚೈನ್ ಆಧಾರಿತ - **ಲಿಕ್ವಿಡಿಟಿ ಕಡಿಮೆ ಸಂಖ್ಯೆಯ liquidity pools -ದ್ರವ್ಯತೆ ಕೊಳಗಳಲ್ಲಿ ಕೇಂದ್ರೀಕೃತವಾಗಿದೆ**, ಅದನ್ನು ಯಾರು ಬೇಕಾದರೂ ಮುಕ್ತವಾಗಿ ವ್ಯಾಪಾರ ಮಾಡಬಹುದು. ದೊಡ್ಡ ಸಂಸ್ಥೆಗಳು ಹಾಗೂ ವೈಯಕ್ತಿಕ ಬಳಕೆದಾರರು ಈ ಗುಂಪುಗಳನ್ನು ಮಾರಾಟಗಾರರು/ಖರೀದಿದಾರರ ಕೈಗಾರಿಕ ಶೋಧಗಳಿಲ್ಲದೆ, ಭಾಗವಹಿಸುವಿಕೆ ಶುಲ್ಕಗಳು ಅಥವಾ ಮೊದಲಿನ ನೋಂದಣಿ ಇಲ್ಲದೆ ಬಳಸಬಹುದು. - **ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ಸಾರ್ವಜನಿಕ ಬ್ಲಾಕ್ ಚೈನ್ ಗಳಲ್ಲಿ ದಾಖಲಿಸಲಾಗುತ್ತದೆ**. ವ್ಯಾಪಾರ ಚಟುವಟಿಕೆಯಿಂದಾಗಿ ಪ್ರತಿ ಇಂಗಾಲದ ಕ್ರೆಡಿಟ್ ತೆಗೆದುಕೊಳ್ಳುವ ಮಾರ್ಗವನ್ನು DCMನಲ್ಲಿ ಲಭ್ಯವಾದ ಕೂಡಲೇ ಶಾಶ್ವತವಾಗಿ ಪತ್ತೆಹಚ್ಚಬಹುದು. - **ವಹಿವಾಟಿನ ವೇಗವು ಬಹುತೇಕ ತ್ವರಿತವಾಗಿರುತ್ತದೆ**. ಪಾರಂಪರಿಕ ಮಾರುಕಟ್ಟೆಗಳ ಮೂಲಕ ದೊಡ್ಡ ಪ್ರಮಾಣದ ಇಂಗಾಲದ ಕ್ರೆಡಿಟ್ ಗಳನ್ನು ಪಡೆಯಲು ದಿನಗಳು ಅಥವಾ ವಾರಗಳು ತೆಗೆದುಕೊಳ್ಳಬಹುದು, ಆದರೆ ಇದನ್ನು DCMನಲ್ಲಿ ಕೆಲವೇ ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸಾಧಿಸಬಹುದು. -- ಹೆಚ್ಚಿನ ಶುಲ್ಕವನ್ನು ವಿಧಿಸುವ **ಮಧ್ಯವರ್ತಿಗಳಿಲ್ಲದೆ ವ್ಯಾಪಾರ** ಚಟುವಟಿಕೆ ನಡೆಯುತ್ತದೆ. ಡಿಜಿಟಲ್ ಕಾರ್ಬನ್ ಕ್ರೆಡಿಟ್ಗಳು ಸಮಾನ ಸಾಂಪ್ರದಾಯಿಕ ಕ್ರೆಡಿಟ್ಗಳಿಗೆ ಹೋಲಿಸಿದರೆ [62% ವೆಚ್ಚ ಸುಧಾರಣೆಯನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತವೆ](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne) ಎಂದು ಒಂದು ವಿಶ್ಲೇಷಣಾತ್ಮಕ ಸಂಸ್ಥೆಯ ಡೇಟಾ ತಿಳಿಸಿದೆ. +- ಹೆಚ್ಚಿನ ಶುಲ್ಕವನ್ನು ವಿಧಿಸುವ **ಮಧ್ಯವರ್ತಿಗಳಿಲ್ಲದೆ ವ್ಯಾಪಾರ** ಚಟುವಟಿಕೆ ನಡೆಯುತ್ತದೆ. ಡಿಜಿಟಲ್ ಕಾರ್ಬನ್ ಕ್ರೆಡಿಟ್ಗಳು ಸಮಾನ ಸಾಂಪ್ರದಾಯಿಕ ಕ್ರೆಡಿಟ್ಗಳಿಗೆ ಹೋಲಿಸಿದರೆ [62% ವೆಚ್ಚ ಸುಧಾರಣೆಯನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತವೆ](https://www.klimadao.finance/resources/klimadao-impact-report-analysis-of-the-base-carbon-tonne) ಎಂದು ಒಂದು ವಿಶ್ಲೇಷಣಾತ್ಮಕ ಸಂಸ್ಥೆಯ ಡೇಟಾ ತಿಳಿಸಿದೆ. - **DCM ಸ್ಕೇಲೆಬಲ್** ಮತ್ತು ವ್ಯಕ್ತಿಗಳು ಮತ್ತು ಬಹುರಾಷ್ಟ್ರೀಯ ನಿಗಮಗಳ ಬೇಡಿಕೆಗಳನ್ನು ಸಮಾನವಾಗಿ ಪೂರೈಸಬಹುದು. ### DCMನ ಪ್ರಮುಖ ಅಂಶಗಳು {#key-components-dcm} diff --git a/public/content/translations/ko/refi/index.md b/public/content/translations/ko/refi/index.md index 1fde84830d1..44a318d5f03 100644 --- a/public/content/translations/ko/refi/index.md +++ b/public/content/translations/ko/refi/index.md @@ -47,7 +47,7 @@ VCM을 새로운 블록체인 기반 **DCM(디지털 탄소시장)**으로 전 - 누구나 자유롭게 거래할 수 있는 **소량의 유동성 풀로 유동성이 집중됩니다**. 개인 사용자는 물론 대형 조직도 판매자/구매자를 직접 찾는 수고나 참가비, 사전 등록 없이 이러한 풀을 이용할 수 있습니다. - **모든 거래는 공개 블록체인에 기록됩니다**. 거래 활동에 따른 탄소 크레딧의 이전은 DCM에 등록되는 즉시 영구히 추적 가능합니다. - **거래 속도는 거의 실시간으로 즉각적입니다**. 레거시 마켓을 통해 대량의 탄소 크레딧을 확보하려면 며칠에서 몇 주까지 소요될 수 있으나 DCM에서는 몇 초만에 가능합니다. -- **중개인 없이 거래 활동이 이루어져** 높은 수수료 부담이 없습니다. 한 분석 회사의 데이터에 따르면 디지털 탄소 크레딧은 [기존 크레딧과 비교했을 때 62% 더 비용 효율적](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne)입니다. +- **중개인 없이 거래 활동이 이루어져** 높은 수수료 부담이 없습니다. 한 분석 회사의 데이터에 따르면 디지털 탄소 크레딧은 [기존 크레딧과 비교했을 때 62% 더 비용 효율적](https://www.klimadao.finance/resources/klimadao-impact-report-analysis-of-the-base-carbon-tonne)입니다. - **DCM은 확장 가능**하며 개인과 다국적 기업의 수요를 모두 충족할 수 있습니다. ### DCM의 핵심 구성요소 {#key-components-dcm} diff --git a/public/content/translations/mr/refi/index.md b/public/content/translations/mr/refi/index.md index 95a1024b81d..ed8dbc1b4ed 100644 --- a/public/content/translations/mr/refi/index.md +++ b/public/content/translations/mr/refi/index.md @@ -47,7 +47,7 @@ VCM ला नवीन ब्लॉकचेन-आधारित **डिज - **लिक्विडिटी थोड्या संख्येने लिक्विडिटी पूलमध्ये केंद्रित आहे** ज्याचा कोणीही मुक्तपणे व्यापार करू शकतो. मोठ्या संस्था तसेच वैयक्तिक वापरकर्ते विक्रेते/खरेदीदार, सहभाग शुल्क किंवा पूर्व नोंदणीसाठी मॅन्युअल शोध न घेता हे पूल वापरू शकतात. - **सर्व व्यवहार सार्वजनिक ब्लॉकचेनवर रेकॉर्ड केले जातात**. ट्रेडिंग अॅक्टिव्हिटीमुळे प्रत्येक कार्बन क्रेडिटचा मार्ग DCM मध्ये उपलब्ध होताच कायमचा शोधता येतो. - **व्यवहाराची गती जवळजवळ त्वरित आहे**. लेगसी मार्केटद्वारे मोठ्या प्रमाणात कार्बन क्रेडिट्स सुरक्षित करण्यासाठी काही दिवस किंवा आठवडे लागू शकतात, परंतु हे DCM मध्ये काही सेकंदात साध्य केले जाऊ शकते. -- **व्यापार क्रियाकलाप मध्यस्थांशिवाय होतो**, जे जास्त शुल्क आकारतात. एका विश्लेषण फर्मच्या डेटानुसार डिजिटल कार्बन क्रेडिट्स [समान पारंपारिक क्रेडिटच्या तुलनेत 62% किमतीत सुधारणा](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne) दर्शवतात. +- **व्यापार क्रियाकलाप मध्यस्थांशिवाय होतो**, जे जास्त शुल्क आकारतात. एका विश्लेषण फर्मच्या डेटानुसार डिजिटल कार्बन क्रेडिट्स [समान पारंपारिक क्रेडिटच्या तुलनेत 62% किमतीत सुधारणा](https://www.klimadao.finance/resources/klimadao-impact-report-analysis-of-the-base-carbon-tonne) दर्शवतात. - **DCM स्केलेबल आहे** आणि व्यक्ती आणि बहुराष्ट्रीय कंपन्यांच्या मागण्या सारख्याच पूर्ण करू शकतात. ### DCM चे प्रमुख घटक {#key-components-dcm} From aadbebf9769383a7ef08ac9950efc127229856cc Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 12 Feb 2025 13:32:44 -0500 Subject: [PATCH 063/368] change https://www.coindesk.com/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum to https://www.coindesk.com/markets/2019/09/12/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum --- public/content/translations/de/enterprise/index.md | 2 +- public/content/translations/id/enterprise/index.md | 2 +- public/content/translations/pl/enterprise/index.md | 2 +- public/content/translations/ro/enterprise/index.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/content/translations/de/enterprise/index.md b/public/content/translations/de/enterprise/index.md index a111ef40c17..cf9ca2b6bd3 100644 --- a/public/content/translations/de/enterprise/index.md +++ b/public/content/translations/de/enterprise/index.md @@ -118,7 +118,7 @@ Nachfolgend werden einige der Anwendungen für Unternehmen aufgelistet, die bisl ### Finanzen {#finance} -- [Santander Bank](https://www.coindesk.com/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _Ausgabe und Abwicklung von Anleihen_ +- [Santander Bank](https://www.coindesk.com/markets/2019/09/12/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _Ausgabe und Abwicklung von Anleihen_ - [Generale Societe](https://www.societegenerale.com/en/news/newsroom/societe-generale-performs-first-financial-transaction-settled-central-bank-digital) _Ausgabe von Anleihen_ - [Cadence](https://www.forbes.com/sites/benjaminpirus/2019/10/09/fatburger-and-others-feed-30-million-into-ethereum-for-new-bond-offering/#513870be115b) _Anleiheangebot und Tokenisierung für FAT-Marken_ - [Sila](https://silamoney.com/) _Bank- und ACH-Zahlungsinfrastruktur-as-a-Service_ diff --git a/public/content/translations/id/enterprise/index.md b/public/content/translations/id/enterprise/index.md index 828f37a9197..8d8a9908b14 100644 --- a/public/content/translations/id/enterprise/index.md +++ b/public/content/translations/id/enterprise/index.md @@ -117,7 +117,7 @@ Berikut adalah beberapa aplikasi perusahaan yang telah digunakan pada Jaringan U ### Keuangan {#finance} -- [Santander Bank](https://www.coindesk.com/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _penerbitan dan penyelesaian obligasi_ +- [Santander Bank](https://www.coindesk.com/markets/2019/09/12/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _penerbitan dan penyelesaian obligasi_ - [Societe Generale](https://www.societegenerale.com/en/news/newsroom/societe-generale-performs-first-financial-transaction-settled-central-bank-digital) _penerbitan obligasi_ - [Cadence](https://www.forbes.com/sites/benjaminpirus/2019/10/09/fatburger-and-others-feed-30-million-into-ethereum-for-new-bond-offering/#513870be115b) _penawaran dan tokenisasi obligasi untuk FAT Brands_ - [Sila](https://silamoney.com/) _perbankan dan infrastructure-as-a-service pembayaran ACH_ diff --git a/public/content/translations/pl/enterprise/index.md b/public/content/translations/pl/enterprise/index.md index 5fcf2c3e11f..9e3216c6ddd 100644 --- a/public/content/translations/pl/enterprise/index.md +++ b/public/content/translations/pl/enterprise/index.md @@ -114,7 +114,7 @@ Oto niektóre aplikacje dla przedsiębiorstw, które zostały wdrożone w public ### Finanse {#finance} -- [Santander Bank](https://www.coindesk.com/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _emisja i rozrachunek obligacji_ +- [Santander Bank](https://www.coindesk.com/markets/2019/09/12/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _emisja i rozrachunek obligacji_ - [Societe Generale](https://www.societegenerale.com/en/newsroom-first-financial-transaction-settled-with-a-digital-currency) _emisja obligacji_ - [Cadence](https://www.forbes.com/sites/benjaminpirus/2019/10/09/fatburger-and-others-feed-30-million-into-ethereum-for-new-bond-offering/#513870be115b) _oferta obligacji i tokenizacja dla marek FAT_ - [Sila](https://silamoney.com/) _infrastruktura bankowa i płatności ACH jako usługa_ diff --git a/public/content/translations/ro/enterprise/index.md b/public/content/translations/ro/enterprise/index.md index 3489c9b0ddb..f5d13dcdc10 100644 --- a/public/content/translations/ro/enterprise/index.md +++ b/public/content/translations/ro/enterprise/index.md @@ -117,7 +117,7 @@ Iată câteva dintre aplicațiile pentru întreprinderi care au fost implementat ### Finanțe {#finance} -- [Santander Bank](https://www.coindesk.com/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _emiterea și decontarea obligațiunilor_ +- [Santander Bank](https://www.coindesk.com/markets/2019/09/12/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _emiterea și decontarea obligațiunilor_ - [Societe Generale](https://www.societegenerale.com/en/news/newsroom/societe-generale-performs-first-financial-transaction-settled-central-bank-digital) _emisiune de obligațiuni_ - [Cadence](https://www.forbes.com/sites/benjaminpirus/2019/10/09/fatburger-and-others-feed-30-million-into-ethereum-for-new-bond-offering/#513870be115b) _oferirea de obligațiuni și tokenizarea pentru mărcile FAT_ - [Sila](https://silamoney.com/) _infrastructura de plăți bancare și ACH ca serviciu_ From ef0cf50d58ca9e93403f2a998e01192b04ad4a8c Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 12 Feb 2025 13:49:46 -0500 Subject: [PATCH 064/368] change https://docs.nethermind.io/nethermind/ to https://docs.nethermind.io/ - https://web.archive.org/web/20221103221929/https://docs.nethermind.io/nethermind/ --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../de/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../es/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../fa/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../fr/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../hi/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../hu/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../id/developers/docs/nodes-and-clients/index.md | 2 +- .../it/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../ja/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../ro/developers/docs/nodes-and-clients/index.md | 2 +- .../ru/developers/docs/nodes-and-clients/index.md | 2 +- .../tr/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- .../zh/developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- src/pages/bug-bounty.tsx | 2 +- 17 files changed, 30 insertions(+), 30 deletions(-) diff --git a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md index 5b9a9307751..8d16a86202a 100644 --- a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md @@ -289,7 +289,7 @@ Check [docs for all configuration options](https://geth.ethereum.org/docs/fundam ##### Running Nethermind -Nethermind offers various [installation options](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started). The package comes with various binaries, including a Launcher with a guided setup, which will help you to create the configuration interactively. Alternatively, you find Runner which is the executable itself and you can just run it with config flags. JSON-RPC is enabled by default. +Nethermind offers various [installation options](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). The package comes with various binaries, including a Launcher with a guided setup, which will help you to create the configuration interactively. Alternatively, you find Runner which is the executable itself and you can just run it with config flags. JSON-RPC is enabled by default. ```sh Nethermind.Runner --config mainnet \ @@ -297,7 +297,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Nethermind docs offer a [complete guide](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) on running Nethermind with consensus client. +Nethermind docs offer a [complete guide](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) on running Nethermind with consensus client. An execution client will initiate its core functions, chosen endpoints, and start looking for peers. After successfully discovering peers, the client starts synchronization. The execution client will await a connection from consensus client. Current blockchain data will be available once the client is successfully synced to the current state. diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md index 33536fa157c..a8796c3e9a2 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### Ausführen von Nethermind -Nethermind bietet verschiedene [Installationsoptionen](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started). Das Paket enthält verschiedene Binärdateien, darunter einen Launcher mit einem geführten Setup, mit dem Sie die Konfiguration interaktiv erstellen können. Alternativ finden Sie Runner, das die ausführbare Datei selbst ist, und Sie können sie einfach mit Konfigurationsflaggen ausführen. JSON-RPC ist standardmäßig aktiviert. +Nethermind bietet verschiedene [Installationsoptionen](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). Das Paket enthält verschiedene Binärdateien, darunter einen Launcher mit einem geführten Setup, mit dem Sie die Konfiguration interaktiv erstellen können. Alternativ finden Sie Runner, das die ausführbare Datei selbst ist, und Sie können sie einfach mit Konfigurationsflaggen ausführen. JSON-RPC ist standardmäßig aktiviert. ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Die Nethermind-Dokumente bieten eine [vollständige Anleitung](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) zum Betrieb von Nethermind mit Konsensclients. +Die Nethermind-Dokumente bieten eine [vollständige Anleitung](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) zum Betrieb von Nethermind mit Konsensclients. Ein Ausführungsclient initiiert seine Kernfunktionen, wählt Endpunkte und beginnt mit der Suche nach Peers. Nach erfolgreicher Erkennung von Peers beginnt der Client mit der Synchronisierung. Der Ausführungsclient wartet auf eine Verbindung vom Konsensclient. Die aktuellen Blockchain-Daten sind verfügbar, sobald der Client erfolgreich mit dem aktuellen Zustand synchronisiert wurde. diff --git a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md index 3e9399dc073..e17f4319134 100644 --- a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Compruebe los [documentos para todas las opciones de configuración](https://get ##### Cómo ejecutar Nethermind -Nethermind ofrece varias [opciones de instalación](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started). El paquete viene con varios binarios, incluido un lanzador con una configuración guiada, que le ayudará a crear la configuración interactivamente. Asimismo, se encuentra Runner que es el archivo ejecutable en sí y que se puede ejecutar con parámetros de configuración. JSON-RPC está habilitado de forma predeterminada. +Nethermind ofrece varias [opciones de instalación](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). El paquete viene con varios binarios, incluido un lanzador con una configuración guiada, que le ayudará a crear la configuración interactivamente. Asimismo, se encuentra Runner que es el archivo ejecutable en sí y que se puede ejecutar con parámetros de configuración. JSON-RPC está habilitado de forma predeterminada. ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Los documentos sobre Nethermind ofrecen una [guía completa](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) sobre cómo ejecutar Nethermind con el cliente de consenso. +Los documentos sobre Nethermind ofrecen una [guía completa](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) sobre cómo ejecutar Nethermind con el cliente de consenso. Un cliente de ejecución iniciará sus funciones básicas, las terminales elegidas seleccionados y comenzará a buscar pares. Al encontrar pares correctamente, el cliente inicia la sincronización. El cliente de ejecución esperará una conexión desde el cliente de consenso. Los datos actuales de la cadena de bloques estarán disponibles una vez que el cliente se sincronice correctamente al estado actual. diff --git a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md index f01d54b0da4..81c3cba6073 100644 --- a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### اجرای Nethermind -Nethermind [گزینه های نصب](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started) مختلفی را ارائه می دهد. این بسته با باینری‌های مختلف، از جمله یک لانچر با راه‌اندازی هدایت‌شده ارائه می‌شود که به شما در ایجاد پیکربندی به صورت تعاملی کمک می‌کند. از طرف دیگر، Runner را پیدا می‌کنید که خود فایل اجرایی است و فقط می‌توانید آن را با پرچم‌های پیکربندی اجرا کنید. JSON-RPC به‌صورت پیش‌فرض فعال است. +Nethermind [گزینه های نصب](https://docs.nethermind.io/first-steps-with-nethermind/getting-started) مختلفی را ارائه می دهد. این بسته با باینری‌های مختلف، از جمله یک لانچر با راه‌اندازی هدایت‌شده ارائه می‌شود که به شما در ایجاد پیکربندی به صورت تعاملی کمک می‌کند. از طرف دیگر، Runner را پیدا می‌کنید که خود فایل اجرایی است و فقط می‌توانید آن را با پرچم‌های پیکربندی اجرا کنید. JSON-RPC به‌صورت پیش‌فرض فعال است. ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -اسناد Nethermind یک [راهنمای کامل](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) در مورد اجرای Nethermind با کلاینت اجماع ارائه می دهد. +اسناد Nethermind یک [راهنمای کامل](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) در مورد اجرای Nethermind با کلاینت اجماع ارائه می دهد. یک کلاینت اجرا، توابع اصلی، نقاط پایانی انتخابی خود را آغاز می کند و شروع به جستجوی همتا می کند. پس از یافتن موفق همتایان، کلاینت شروع به همگام‌سازی می‌کند. کلاینت اجرا منتظر اتصال از سمت کلاینت اجماع خواهد بود. داده‌های کنونی زنجیره‌ی بلوکی زمانی آماده خواهد بود که کلاینت به‌طور موفقیت‌آمیز با وضعیت فعلی همگام‌سازی کرده باشد. diff --git a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md index 2dc92e05997..5938c692a41 100644 --- a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Vérifiez la documentation [pour toutes les options de configuration](https://ge ##### Exécuter Nethermind -Nethermind offre diverses [options d'installation](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started). Le paquet est fourni avec divers binaires, y compris un lanceur doté d'une installation guidée, qui vous aidera à créer votre configuration de manière interactive. Autrement, vous trouverez Runner, qui est l'exécutable lui-même, et pouvez simplement l'exécuter en utilisant des options de configuration. JSON-RPC est activé par défaut. +Nethermind offre diverses [options d'installation](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). Le paquet est fourni avec divers binaires, y compris un lanceur doté d'une installation guidée, qui vous aidera à créer votre configuration de manière interactive. Autrement, vous trouverez Runner, qui est l'exécutable lui-même, et pouvez simplement l'exécuter en utilisant des options de configuration. JSON-RPC est activé par défaut. ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -La documentation de Nethermind offre un [guide complet](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) sur le fonctionnement de Nethermind avec un client de consensus. +La documentation de Nethermind offre un [guide complet](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) sur le fonctionnement de Nethermind avec un client de consensus. Un client d'exécution initiera ses fonctions principales, ses points de terminaison choisis, et commencera à rechercher des pairs. Après avoir réussi à trouver des pairs, le client débute la synchronisation. Le client d'exécution attendra une connexion du client de consensus. Les données actuelles de la blockchain seront disponibles une fois le client correctement synchronisé avec l'état actuel. diff --git a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md index efadb7cf1a2..8639fd3b660 100644 --- a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### Nethermind चलाना -Nethermind विभिन्न [इंस्टॉलेशन विकल्प](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started) प्रदान करता है। पैकेज में विभिन्न बाइनरी आते हैं, जिसमें एक निर्देशित सेटअप के साथ एक लॉन्चर शामिल है, जो आपको कॉन्फ़िगरेशन को इंटरैक्टिव रूप से बनाने में मदद करेगा। वैकल्पिक रूप से, आप रनर पा सकते हैं जो स्वयं एक्जीक्यूटेबल है और आप इसे कॉन्फ़िग ध्वजों के साथ चला सकते हैं। JSON-RPC डिफ़ॉल्ट रूप से सक्षम है। +Nethermind विभिन्न [इंस्टॉलेशन विकल्प](https://docs.nethermind.io/first-steps-with-nethermind/getting-started) प्रदान करता है। पैकेज में विभिन्न बाइनरी आते हैं, जिसमें एक निर्देशित सेटअप के साथ एक लॉन्चर शामिल है, जो आपको कॉन्फ़िगरेशन को इंटरैक्टिव रूप से बनाने में मदद करेगा। वैकल्पिक रूप से, आप रनर पा सकते हैं जो स्वयं एक्जीक्यूटेबल है और आप इसे कॉन्फ़िग ध्वजों के साथ चला सकते हैं। JSON-RPC डिफ़ॉल्ट रूप से सक्षम है। ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Nethermind दस्तावेज़, सहमति क्लाइंट के साथ Nethermind चलाने पर एक [पूर्ण मार्गदर्शिका](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) प्रदान करते हैं। +Nethermind दस्तावेज़, सहमति क्लाइंट के साथ Nethermind चलाने पर एक [पूर्ण मार्गदर्शिका](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) प्रदान करते हैं। एक निष्पादन क्लाइंट अपने मुख्य कार्यों, चुने गए एंडपॉइंट्स को आरंभ करेगा और पीयर्स की खोज शुरू करेगा। पीयर्स की सफलतापूर्वक खोज के बाद, क्लाइंट सिंक्रनाइज़ेशन शुरू करता है। निष्पादन क्लाइंट, सहमति क्लाइंट से कनेक्शन की प्रतीक्षा करेगा। वर्तमान ब्लॉकचेन डेटा तब उपलब्ध होगा जब क्लाइंट वर्तमान स्थिति के साथ सफलतापूर्वक सिंक हो जाएगा। diff --git a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md index d3161ec3889..8f00ee11810 100644 --- a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Tekintse meg a [dokumentációt az összes konfigurálási opcióhoz](https://ge ##### A Nethermind futtatása -A Nethermind különféle [telepítési opciókat](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started) kínál. A csomag számos binárist tartalmaz, beleértve egy Telepítőt, ami egy vezetett felállítást tesz lehetővé, így a konfigurációt interaktív módon lehet létrehozni. Másik megoldásként használhatja a Runner-t is, ami a végrehajtási program maga, és konfigurációs jelölőkkel futtathatja. A JSON-RPC alapból engedélyezve van. +A Nethermind különféle [telepítési opciókat](https://docs.nethermind.io/first-steps-with-nethermind/getting-started) kínál. A csomag számos binárist tartalmaz, beleértve egy Telepítőt, ami egy vezetett felállítást tesz lehetővé, így a konfigurációt interaktív módon lehet létrehozni. Másik megoldásként használhatja a Runner-t is, ami a végrehajtási program maga, és konfigurációs jelölőkkel futtathatja. A JSON-RPC alapból engedélyezve van. ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -A Nethermind dokumentációk egy [teljeskörű útmutatót](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) adnak arról, hogyan lehet a Nethermind-ot konszenzusos klienssel működtetni. +A Nethermind dokumentációk egy [teljeskörű útmutatót](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) adnak arról, hogyan lehet a Nethermind-ot konszenzusos klienssel működtetni. A végrehajtási kliens elindítja a fő funkcióit, a kiválasztott végpontokat, és társakat keres. Miután sikeresen felfedezte a társait, elkezd szinkronizálni. A végrehajtási kliens kapcsolódásra vár a konszenzusos klienstől. A jelenlegi blokkláncadatok elérhetők lesznek, amint a kliens sikeresen szinkronizál a jelen státuszhoz. diff --git a/public/content/translations/id/developers/docs/nodes-and-clients/index.md b/public/content/translations/id/developers/docs/nodes-and-clients/index.md index bccc501394c..106829990ef 100644 --- a/public/content/translations/id/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/id/developers/docs/nodes-and-clients/index.md @@ -235,7 +235,7 @@ Perhatikan dokumentasi klien atau halaman bantuan untuk menemukan mode sinkronis `besu --sync-mode=FULL` -Sama seperti konfigurasi lainnya, ia dapat ditentukan dengan bendera startup atau dalam berkas konfigurasi. Contoh lainnya adalah [Nethermind](https://docs.nethermind.io/nethermind/) yang mendorong Anda untuk memilih konfigurasi pada saat inisiasi pertama dan membuat berkas konfigurasi. +Sama seperti konfigurasi lainnya, ia dapat ditentukan dengan bendera startup atau dalam berkas konfigurasi. Contoh lainnya adalah [Nethermind](https://docs.nethermind.io/) yang mendorong Anda untuk memilih konfigurasi pada saat inisiasi pertama dan membuat berkas konfigurasi. ## Klien konsensus (sebelumnya klien 'Eth2') {#consensus-clients} diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md index 86c163b0f3e..43b20e3123a 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Controlla la [documentazione per tutte le opzioni di configurazione](https://get ##### Eseguire Nethermind -Nethermind offre varie [opzioni d'installazione](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started). Il pacchetto presenta vari binari, incluso un Launcher con una configurazione guidata, che ti aiuterà a creare la configurazione in modo interattivo. In alternativa trovi Runner, che è l'eseguibile stesso, e puoi eseguirlo coi flag di configurazione. JSON-RPC è abilitato di default. +Nethermind offre varie [opzioni d'installazione](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). Il pacchetto presenta vari binari, incluso un Launcher con una configurazione guidata, che ti aiuterà a creare la configurazione in modo interattivo. In alternativa trovi Runner, che è l'eseguibile stesso, e puoi eseguirlo coi flag di configurazione. JSON-RPC è abilitato di default. ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -La documentazione di Nethermind offre una [guida completa](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) all'esecuzione di Nethermind con il client di consenso. +La documentazione di Nethermind offre una [guida completa](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) all'esecuzione di Nethermind con il client di consenso. Il client di esecuzione avvierà le sue funzioni principali, gli endpoint scelti e inizierà a cercare i pari. Dopo aver scoperto correttamente i pari, il client avvia la sincronizzazione. Il client di esecuzione attenderà una connessione dal client di consenso. I dati correnti della blockchain saranno disponibili una volta che il client è sincronizzato correttamente allo stato corrente. diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md index 835afb854bd..36d4bcac3f3 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### Nethermindの実行 -Nethermindは、さまざまな[インストールオプション](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started)を提供しています。 パッケージには、ガイド付きセットアップ機能を備えたランチャーなどのさまざまなバイナリが含まれており、インタラクティブに設定できます。 他にも、設定フラグを付けて実行できるランナーなどがあります。 JSON-RPCはデフォルトで有効になっています。 +Nethermindは、さまざまな[インストールオプション](https://docs.nethermind.io/first-steps-with-nethermind/getting-started)を提供しています。 パッケージには、ガイド付きセットアップ機能を備えたランチャーなどのさまざまなバイナリが含まれており、インタラクティブに設定できます。 他にも、設定フラグを付けて実行できるランナーなどがあります。 JSON-RPCはデフォルトで有効になっています。 ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Nethermindのドキュメントは、Nethermindとコンセンサスクライアントの実行方法をすべて網羅した[完全ガイド](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge)です。 +Nethermindのドキュメントは、Nethermindとコンセンサスクライアントの実行方法をすべて網羅した[完全ガイド](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge)です。 実行クライアントは、コア機能と選択したエンドポイントを起動し、ピアを探し始めます。 ピアが見つかったら、同期を開始します。 また、コンセンサスクライアントからの接続を待ちます。 クライアントが正常に現在の状態に同期されると、現在のブロックチェーンデータが利用できるようになります。 diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md index 2ec03791d46..b30c4783f3f 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Confira a [documentação para todas as opções de configuração](https://geth ##### Executando o Nethermind -O Nethermind oferece várias [opções de instalação](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started). O pacote vem com vários binários, incluindo um Inicializador com configuração guiada, que ajudará você a criar a configuração interativamente. Como alternativa, você encontrará o Executor, que é o executável em si, que simplesmente pode ser executado com os sinalizadores de configuração. O RPC-JSON é habilitado por padrão. +O Nethermind oferece várias [opções de instalação](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). O pacote vem com vários binários, incluindo um Inicializador com configuração guiada, que ajudará você a criar a configuração interativamente. Como alternativa, você encontrará o Executor, que é o executável em si, que simplesmente pode ser executado com os sinalizadores de configuração. O RPC-JSON é habilitado por padrão. ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Os documentos do Nethermind oferecem um [guia completo](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) sobre como executar o Nethermind com o cliente de consenso. +Os documentos do Nethermind oferecem um [guia completo](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) sobre como executar o Nethermind com o cliente de consenso. Um cliente de execução iniciará suas funções principais, pontos de extremidade escolhidos e começará a procurar por pares. Após conseguir descobrir os pares, o cliente inicia a sincronização. O cliente de execução aguardará uma conexão do cliente de consenso. Os dados atuais da cadeia de blocos estarão disponíveis assim que o cliente for sincronizado com sucesso com o estado atual. diff --git a/public/content/translations/ro/developers/docs/nodes-and-clients/index.md b/public/content/translations/ro/developers/docs/nodes-and-clients/index.md index 17697acd678..19c2da3971f 100644 --- a/public/content/translations/ro/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/ro/developers/docs/nodes-and-clients/index.md @@ -237,7 +237,7 @@ Verificați cu atenţie documentația sau pagina de ajutor a clientului pentru a `besu --sync-mode=FULL` -Ca orice altă configurație, aceasta poate fi definită cu ajutorul steguleţului de pornire sau în fișierul de configurare. Un alt exemplu este [Nethermind](https://docs.nethermind.io/nethermind/), care vă solicită să alegeți o configurație la prima inițializare și creează un fișier de configurare. +Ca orice altă configurație, aceasta poate fi definită cu ajutorul steguleţului de pornire sau în fișierul de configurare. Un alt exemplu este [Nethermind](https://docs.nethermind.io/), care vă solicită să alegeți o configurație la prima inițializare și creează un fișier de configurare. ## Clienți de consens (anterior clienți „Eth2”) {#consensus-clients} diff --git a/public/content/translations/ru/developers/docs/nodes-and-clients/index.md b/public/content/translations/ru/developers/docs/nodes-and-clients/index.md index d6c49df8d10..2d53a314d21 100644 --- a/public/content/translations/ru/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/ru/developers/docs/nodes-and-clients/index.md @@ -237,7 +237,7 @@ Erigon (в прошлом — Turbo-Geth) представляет собой о `besu --sync-mode=FULL` -Как и любую другую конфигурацию, ее можно определить с помощью флага запуска или в файле конфигурации. Другой пример — [Nethermind](https://docs.nethermind.io/nethermind/), который предлагает вам выбрать конфигурацию во время первой инициализации и создает файл конфигурации. +Как и любую другую конфигурацию, ее можно определить с помощью флага запуска или в файле конфигурации. Другой пример — [Nethermind](https://docs.nethermind.io/), который предлагает вам выбрать конфигурацию во время первой инициализации и создает файл конфигурации. ## Консенсус-клиенты (ранее — «клиенты Eth2») {#consensus-clients} diff --git a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md index 601b21139c3..4b15457ff0f 100644 --- a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### Nethermind'ı Çalıştırmak -Nethermind çeşitli [kurulum seçenekleri](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started) sunar. Paket çeşitli dosyalarla gelir, bunlara yapılandırmayı etkileşimli bir şekilde oluşturmanıza yardımcı olacak kılavuzlu kurulumu olan bir Başlatıcı dahildir. Alternatif olarak, çalıştırılabilir dosyanın kendisi olan Çalıştırıcı'yı bulacaksınız ve bunu sadece yapılandırma bayrakları ile çalıştırabilirsiniz. JSON-RPC varsayılan olarak etkindir. +Nethermind çeşitli [kurulum seçenekleri](https://docs.nethermind.io/first-steps-with-nethermind/getting-started) sunar. Paket çeşitli dosyalarla gelir, bunlara yapılandırmayı etkileşimli bir şekilde oluşturmanıza yardımcı olacak kılavuzlu kurulumu olan bir Başlatıcı dahildir. Alternatif olarak, çalıştırılabilir dosyanın kendisi olan Çalıştırıcı'yı bulacaksınız ve bunu sadece yapılandırma bayrakları ile çalıştırabilirsiniz. JSON-RPC varsayılan olarak etkindir. ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Nethermind dokümanları Nethermind'ı bir fikir birliği istemcisi ile çalıştırmak üzerine [tam bir kılavuz](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge) sunar. +Nethermind dokümanları Nethermind'ı bir fikir birliği istemcisi ile çalıştırmak üzerine [tam bir kılavuz](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge) sunar. Bir yürütüm istemcisi çekirdek fonksiyonlarını ve seçili uç noktalarını başlatacak ve eşleri aramaya başlayacaktır. İstemci, eşlerini başarılı bir şekilde bulduktan sonra senkronizasyonu başlatır. Yürütüm istemcisi fikir birliği istemcisinden bir bağlantı bekleyecektir. İstemci mevcut duruma başarılı şekilde senkronize edildiğinde mevcut blok zincir verisi mevcut olacaktır. diff --git a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md index e8f907d7bb1..6dc39f10792 100644 --- a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### 運行 Nethermind -Nethermind 提供多種 [安裝選項](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started)。 此套件包含許多二進位檔案,包括有引導式設定的啟動器,可以互動式幫助你建立設定。 或者,你可以找到可執行執行器,並使用設定標記執行它。 JSON-RPC 是預設啟用的。 +Nethermind 提供多種 [安裝選項](https://docs.nethermind.io/first-steps-with-nethermind/getting-started)。 此套件包含許多二進位檔案,包括有引導式設定的啟動器,可以互動式幫助你建立設定。 或者,你可以找到可執行執行器,並使用設定標記執行它。 JSON-RPC 是預設啟用的。 ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Nethermind 文檔提供了與共識用戶端一起運行 Nethermind 的 [完整指南](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge)。 +Nethermind 文檔提供了與共識用戶端一起運行 Nethermind 的 [完整指南](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge)。 執行用戶端會啟用它的核心功能、選擇端點並開始尋找對等用戶端。 成功發現對等用戶端後,用戶端開始同步。 執行用戶端會等待來自共識用戶端的連接。 在用戶端成功與目前狀態同步以後,目前的區塊鏈資料就可以使用。 diff --git a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md index 6585cf2139e..54ec93afadd 100644 --- a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### 运行 Nethermind -Nethermind 提供各种[安装选项](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started)。 该软件包附带各种二进制文件,包括一个带有引导式设置的启动器,它将帮助你以交互方式创建配置。 或者,你会找到可执行文件 Runner,并且可以使用配置标记运行它。 默认情况下已启用 JSON-RPC。 +Nethermind 提供各种[安装选项](https://docs.nethermind.io/first-steps-with-nethermind/getting-started)。 该软件包附带各种二进制文件,包括一个带有引导式设置的启动器,它将帮助你以交互方式创建配置。 或者,你会找到可执行文件 Runner,并且可以使用配置标记运行它。 默认情况下已启用 JSON-RPC。 ```sh Nethermind.Runner --config mainnet \ @@ -296,7 +296,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Nethermind 相关文档提供了有关运行 Nethermind 和共识客户端的[完整指南](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge)。 +Nethermind 相关文档提供了有关运行 Nethermind 和共识客户端的[完整指南](https://docs.nethermind.io/first-steps-with-nethermind/running-nethermind-post-merge)。 执行客户端将启动其核心功能及所选端点,并开始寻找对等节点。 成功发现对等节点后,该客户端开始同步。 执行客户端将等待来自共识客户端的连接。 当客户端成功同步到最新状态时,最新的区块链数据将可用。 diff --git a/src/pages/bug-bounty.tsx b/src/pages/bug-bounty.tsx index a30ed23d726..64e12ff5392 100644 --- a/src/pages/bug-bounty.tsx +++ b/src/pages/bug-bounty.tsx @@ -317,7 +317,7 @@ const BugBountiesPage = () => { }, { title: "Nethermind", - link: "https://docs.nethermind.io/nethermind/", + link: "https://docs.nethermind.io/", image: nethermind, }, { From 50d779e3d81dcfd6da11860ac7d3645d3d1b3275 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 12 Feb 2025 14:03:53 -0500 Subject: [PATCH 065/368] change https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started to https://docs.nethermind.io/get-started/installing-nethermind --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../de/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../es/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../fa/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../fr/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../hi/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../hu/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../it/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../ja/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../pt-br/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../tr/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../zh/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md index 8d16a86202a..2df20c568be 100644 --- a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md @@ -289,7 +289,7 @@ Check [docs for all configuration options](https://geth.ethereum.org/docs/fundam ##### Running Nethermind -Nethermind offers various [installation options](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). The package comes with various binaries, including a Launcher with a guided setup, which will help you to create the configuration interactively. Alternatively, you find Runner which is the executable itself and you can just run it with config flags. JSON-RPC is enabled by default. +Nethermind offers various [installation options](https://docs.nethermind.io/get-started/installing-nethermind). The package comes with various binaries, including a Launcher with a guided setup, which will help you to create the configuration interactively. Alternatively, you find Runner which is the executable itself and you can just run it with config flags. JSON-RPC is enabled by default. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md index a8796c3e9a2..e6e929108a3 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### Ausführen von Nethermind -Nethermind bietet verschiedene [Installationsoptionen](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). Das Paket enthält verschiedene Binärdateien, darunter einen Launcher mit einem geführten Setup, mit dem Sie die Konfiguration interaktiv erstellen können. Alternativ finden Sie Runner, das die ausführbare Datei selbst ist, und Sie können sie einfach mit Konfigurationsflaggen ausführen. JSON-RPC ist standardmäßig aktiviert. +Nethermind bietet verschiedene [Installationsoptionen](https://docs.nethermind.io/get-started/installing-nethermind). Das Paket enthält verschiedene Binärdateien, darunter einen Launcher mit einem geführten Setup, mit dem Sie die Konfiguration interaktiv erstellen können. Alternativ finden Sie Runner, das die ausführbare Datei selbst ist, und Sie können sie einfach mit Konfigurationsflaggen ausführen. JSON-RPC ist standardmäßig aktiviert. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md index e17f4319134..875ed113c4a 100644 --- a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Compruebe los [documentos para todas las opciones de configuración](https://get ##### Cómo ejecutar Nethermind -Nethermind ofrece varias [opciones de instalación](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). El paquete viene con varios binarios, incluido un lanzador con una configuración guiada, que le ayudará a crear la configuración interactivamente. Asimismo, se encuentra Runner que es el archivo ejecutable en sí y que se puede ejecutar con parámetros de configuración. JSON-RPC está habilitado de forma predeterminada. +Nethermind ofrece varias [opciones de instalación](https://docs.nethermind.io/get-started/installing-nethermind). El paquete viene con varios binarios, incluido un lanzador con una configuración guiada, que le ayudará a crear la configuración interactivamente. Asimismo, se encuentra Runner que es el archivo ejecutable en sí y que se puede ejecutar con parámetros de configuración. JSON-RPC está habilitado de forma predeterminada. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md index 81c3cba6073..7c24fc26398 100644 --- a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### اجرای Nethermind -Nethermind [گزینه های نصب](https://docs.nethermind.io/first-steps-with-nethermind/getting-started) مختلفی را ارائه می دهد. این بسته با باینری‌های مختلف، از جمله یک لانچر با راه‌اندازی هدایت‌شده ارائه می‌شود که به شما در ایجاد پیکربندی به صورت تعاملی کمک می‌کند. از طرف دیگر، Runner را پیدا می‌کنید که خود فایل اجرایی است و فقط می‌توانید آن را با پرچم‌های پیکربندی اجرا کنید. JSON-RPC به‌صورت پیش‌فرض فعال است. +Nethermind [گزینه های نصب](https://docs.nethermind.io/get-started/installing-nethermind) مختلفی را ارائه می دهد. این بسته با باینری‌های مختلف، از جمله یک لانچر با راه‌اندازی هدایت‌شده ارائه می‌شود که به شما در ایجاد پیکربندی به صورت تعاملی کمک می‌کند. از طرف دیگر، Runner را پیدا می‌کنید که خود فایل اجرایی است و فقط می‌توانید آن را با پرچم‌های پیکربندی اجرا کنید. JSON-RPC به‌صورت پیش‌فرض فعال است. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md index 5938c692a41..14d2e1e7b18 100644 --- a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Vérifiez la documentation [pour toutes les options de configuration](https://ge ##### Exécuter Nethermind -Nethermind offre diverses [options d'installation](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). Le paquet est fourni avec divers binaires, y compris un lanceur doté d'une installation guidée, qui vous aidera à créer votre configuration de manière interactive. Autrement, vous trouverez Runner, qui est l'exécutable lui-même, et pouvez simplement l'exécuter en utilisant des options de configuration. JSON-RPC est activé par défaut. +Nethermind offre diverses [options d'installation](https://docs.nethermind.io/get-started/installing-nethermind). Le paquet est fourni avec divers binaires, y compris un lanceur doté d'une installation guidée, qui vous aidera à créer votre configuration de manière interactive. Autrement, vous trouverez Runner, qui est l'exécutable lui-même, et pouvez simplement l'exécuter en utilisant des options de configuration. JSON-RPC est activé par défaut. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md index 8639fd3b660..d29f5f14743 100644 --- a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### Nethermind चलाना -Nethermind विभिन्न [इंस्टॉलेशन विकल्प](https://docs.nethermind.io/first-steps-with-nethermind/getting-started) प्रदान करता है। पैकेज में विभिन्न बाइनरी आते हैं, जिसमें एक निर्देशित सेटअप के साथ एक लॉन्चर शामिल है, जो आपको कॉन्फ़िगरेशन को इंटरैक्टिव रूप से बनाने में मदद करेगा। वैकल्पिक रूप से, आप रनर पा सकते हैं जो स्वयं एक्जीक्यूटेबल है और आप इसे कॉन्फ़िग ध्वजों के साथ चला सकते हैं। JSON-RPC डिफ़ॉल्ट रूप से सक्षम है। +Nethermind विभिन्न [इंस्टॉलेशन विकल्प](https://docs.nethermind.io/get-started/installing-nethermind) प्रदान करता है। पैकेज में विभिन्न बाइनरी आते हैं, जिसमें एक निर्देशित सेटअप के साथ एक लॉन्चर शामिल है, जो आपको कॉन्फ़िगरेशन को इंटरैक्टिव रूप से बनाने में मदद करेगा। वैकल्पिक रूप से, आप रनर पा सकते हैं जो स्वयं एक्जीक्यूटेबल है और आप इसे कॉन्फ़िग ध्वजों के साथ चला सकते हैं। JSON-RPC डिफ़ॉल्ट रूप से सक्षम है। ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md index 8f00ee11810..81581a55226 100644 --- a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Tekintse meg a [dokumentációt az összes konfigurálási opcióhoz](https://ge ##### A Nethermind futtatása -A Nethermind különféle [telepítési opciókat](https://docs.nethermind.io/first-steps-with-nethermind/getting-started) kínál. A csomag számos binárist tartalmaz, beleértve egy Telepítőt, ami egy vezetett felállítást tesz lehetővé, így a konfigurációt interaktív módon lehet létrehozni. Másik megoldásként használhatja a Runner-t is, ami a végrehajtási program maga, és konfigurációs jelölőkkel futtathatja. A JSON-RPC alapból engedélyezve van. +A Nethermind különféle [telepítési opciókat](https://docs.nethermind.io/get-started/installing-nethermind) kínál. A csomag számos binárist tartalmaz, beleértve egy Telepítőt, ami egy vezetett felállítást tesz lehetővé, így a konfigurációt interaktív módon lehet létrehozni. Másik megoldásként használhatja a Runner-t is, ami a végrehajtási program maga, és konfigurációs jelölőkkel futtathatja. A JSON-RPC alapból engedélyezve van. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md index 43b20e3123a..76e31724c94 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Controlla la [documentazione per tutte le opzioni di configurazione](https://get ##### Eseguire Nethermind -Nethermind offre varie [opzioni d'installazione](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). Il pacchetto presenta vari binari, incluso un Launcher con una configurazione guidata, che ti aiuterà a creare la configurazione in modo interattivo. In alternativa trovi Runner, che è l'eseguibile stesso, e puoi eseguirlo coi flag di configurazione. JSON-RPC è abilitato di default. +Nethermind offre varie [opzioni d'installazione](https://docs.nethermind.io/get-started/installing-nethermind). Il pacchetto presenta vari binari, incluso un Launcher con una configurazione guidata, che ti aiuterà a creare la configurazione in modo interattivo. In alternativa trovi Runner, che è l'eseguibile stesso, e puoi eseguirlo coi flag di configurazione. JSON-RPC è abilitato di default. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md index 36d4bcac3f3..4ae4b67fb84 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### Nethermindの実行 -Nethermindは、さまざまな[インストールオプション](https://docs.nethermind.io/first-steps-with-nethermind/getting-started)を提供しています。 パッケージには、ガイド付きセットアップ機能を備えたランチャーなどのさまざまなバイナリが含まれており、インタラクティブに設定できます。 他にも、設定フラグを付けて実行できるランナーなどがあります。 JSON-RPCはデフォルトで有効になっています。 +Nethermindは、さまざまな[インストールオプション](https://docs.nethermind.io/get-started/installing-nethermind)を提供しています。 パッケージには、ガイド付きセットアップ機能を備えたランチャーなどのさまざまなバイナリが含まれており、インタラクティブに設定できます。 他にも、設定フラグを付けて実行できるランナーなどがあります。 JSON-RPCはデフォルトで有効になっています。 ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md index b30c4783f3f..e43e2f8a855 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ Confira a [documentação para todas as opções de configuração](https://geth ##### Executando o Nethermind -O Nethermind oferece várias [opções de instalação](https://docs.nethermind.io/first-steps-with-nethermind/getting-started). O pacote vem com vários binários, incluindo um Inicializador com configuração guiada, que ajudará você a criar a configuração interativamente. Como alternativa, você encontrará o Executor, que é o executável em si, que simplesmente pode ser executado com os sinalizadores de configuração. O RPC-JSON é habilitado por padrão. +O Nethermind oferece várias [opções de instalação](https://docs.nethermind.io/get-started/installing-nethermind). O pacote vem com vários binários, incluindo um Inicializador com configuração guiada, que ajudará você a criar a configuração interativamente. Como alternativa, você encontrará o Executor, que é o executável em si, que simplesmente pode ser executado com os sinalizadores de configuração. O RPC-JSON é habilitado por padrão. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md index 4b15457ff0f..51f0dcd2fa3 100644 --- a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### Nethermind'ı Çalıştırmak -Nethermind çeşitli [kurulum seçenekleri](https://docs.nethermind.io/first-steps-with-nethermind/getting-started) sunar. Paket çeşitli dosyalarla gelir, bunlara yapılandırmayı etkileşimli bir şekilde oluşturmanıza yardımcı olacak kılavuzlu kurulumu olan bir Başlatıcı dahildir. Alternatif olarak, çalıştırılabilir dosyanın kendisi olan Çalıştırıcı'yı bulacaksınız ve bunu sadece yapılandırma bayrakları ile çalıştırabilirsiniz. JSON-RPC varsayılan olarak etkindir. +Nethermind çeşitli [kurulum seçenekleri](https://docs.nethermind.io/get-started/installing-nethermind) sunar. Paket çeşitli dosyalarla gelir, bunlara yapılandırmayı etkileşimli bir şekilde oluşturmanıza yardımcı olacak kılavuzlu kurulumu olan bir Başlatıcı dahildir. Alternatif olarak, çalıştırılabilir dosyanın kendisi olan Çalıştırıcı'yı bulacaksınız ve bunu sadece yapılandırma bayrakları ile çalıştırabilirsiniz. JSON-RPC varsayılan olarak etkindir. ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md index 6dc39f10792..5e9ffdfe162 100644 --- a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### 運行 Nethermind -Nethermind 提供多種 [安裝選項](https://docs.nethermind.io/first-steps-with-nethermind/getting-started)。 此套件包含許多二進位檔案,包括有引導式設定的啟動器,可以互動式幫助你建立設定。 或者,你可以找到可執行執行器,並使用設定標記執行它。 JSON-RPC 是預設啟用的。 +Nethermind 提供多種 [安裝選項](https://docs.nethermind.io/get-started/installing-nethermind)。 此套件包含許多二進位檔案,包括有引導式設定的啟動器,可以互動式幫助你建立設定。 或者,你可以找到可執行執行器,並使用設定標記執行它。 JSON-RPC 是預設啟用的。 ```sh Nethermind.Runner --config mainnet \ diff --git a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md index 54ec93afadd..ff8b43c6980 100644 --- a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md @@ -288,7 +288,7 @@ geth --mainnet \ ##### 运行 Nethermind -Nethermind 提供各种[安装选项](https://docs.nethermind.io/first-steps-with-nethermind/getting-started)。 该软件包附带各种二进制文件,包括一个带有引导式设置的启动器,它将帮助你以交互方式创建配置。 或者,你会找到可执行文件 Runner,并且可以使用配置标记运行它。 默认情况下已启用 JSON-RPC。 +Nethermind 提供各种[安装选项](https://docs.nethermind.io/get-started/installing-nethermind)。 该软件包附带各种二进制文件,包括一个带有引导式设置的启动器,它将帮助你以交互方式创建配置。 或者,你会找到可执行文件 Runner,并且可以使用配置标记运行它。 默认情况下已启用 JSON-RPC。 ```sh Nethermind.Runner --config mainnet \ From 5259a2a3201ab8290218152499301050b26481ff Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 12 Feb 2025 14:12:38 -0500 Subject: [PATCH 066/368] change https://chainsafe.github.io/lodestar/install/source to https://chainsafe.github.io/lodestar/run/getting-started/installation --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../de/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../es/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../fa/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../fr/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../hi/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../hu/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../it/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../ja/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../pt-br/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../tr/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../zh/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md index 2df20c568be..033bbca4805 100644 --- a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md @@ -163,7 +163,7 @@ It is also worth noting that client diversity is an [issue on the execution laye ##### Consensus clients - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (Doesn't provide a pre-built binary, only a Docker image or to be build from source) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (Doesn't provide a pre-built binary, only a Docker image or to be build from source) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md index e6e929108a3..b93eeb01d97 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Es sei auch erwähnet, dass die Client-Vielfalt ein [Problem auf der Ausführung ##### Konsens-Clients - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (Bietet keine vorgefertigte Binärdatei, sondern nur eine Docker-Abbildung, die aus den Quelldateien erstellt werden muss) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (Bietet keine vorgefertigte Binärdatei, sondern nur eine Docker-Abbildung, die aus den Quelldateien erstellt werden muss) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md index 875ed113c4a..e36d2a6bc94 100644 --- a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ También vale la pena señalar que la diversidad del cliente es un [problema en ##### Clientes de consenso - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (no proporciona un binario precompilado, solo una imagen de Docker o para construirse a partir de la fuente) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (no proporciona un binario precompilado, solo una imagen de Docker o para construirse a partir de la fuente) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md index 7c24fc26398..08b246be135 100644 --- a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ sidebarDepth: 2 ##### کلاینت‌های اجماع - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (یک باینری از پیش ساخته شده ارائه نمی دهد، فقط یک تصویر داکر یا باید از منبع ساخته شود) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (یک باینری از پیش ساخته شده ارائه نمی دهد، فقط یک تصویر داکر یا باید از منبع ساخته شود) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md index 14d2e1e7b18..e0216243558 100644 --- a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Il convient également de noter que la diversité de clients est un problème [p ##### Clients de consensus - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (ne fournit pas de binaire pré-compilé, seulement une image Docker ou à construire à partir de la source) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (ne fournit pas de binaire pré-compilé, seulement une image Docker ou à construire à partir de la source) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md index d29f5f14743..e5f593529ca 100644 --- a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ sidebarDepth: 2 ##### सहमति ग्राहक - [लाइटहाउस](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (एक पहले से तैयार बाइनरी, केवल एक डॉकर इमेज प्रदान नहीं करता है या उसे स्रोत से बनाया जा सकता है) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (एक पहले से तैयार बाइनरी, केवल एक डॉकर इमेज प्रदान नहीं करता है या उसे स्रोत से बनाया जा सकता है) - [निम्बस](https://github.com/status-im/nimbus-eth2/releases/latest) - [प्रिज़्म](https://github.com/prysmaticlabs/prysm/releases/latest) - [टेकु](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md index 81581a55226..f4cd2a25ba3 100644 --- a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Fontos tisztában lenni azzal is, hogy a kliensdiverzitás [problémát jelent a ##### Konszenzusos kliensek - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (nem ad előre megépített binárist, csak egy Docker-képet vagy fel kell építeni a forrásból) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (nem ad előre megépített binárist, csak egy Docker-képet vagy fel kell építeni a forrásból) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md index 76e31724c94..426165a5063 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Vale anche la pena notare che la diversità dei client è un [problema sul livel ##### Client di consenso - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (Non fornisce un binario precompilato, solo un'immagine Docker o da compilare da sorgente) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (Non fornisce un binario precompilato, solo un'immagine Docker o da compilare da sorgente) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md index 4ae4b67fb84..c4bd4d2f5e4 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Raspberry PiのようなARMアーキテクチャのシングルボードコン ##### コンセンサスクライアント - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/)(ビルド済みのバイナリを提供していないため、Dockerイメージを使用またはソースからビルド) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/)(ビルド済みのバイナリを提供していないため、Dockerイメージを使用またはソースからビルド) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md index e43e2f8a855..04ca8c94e63 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Também é relevante observar que a diversidade de clientes é um [problema na c ##### Clientes de consenso - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (não fornece um binário pré-compilado, apenas uma imagem do Docker ou para ser compilado a partir da fonte) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (não fornece um binário pré-compilado, apenas uma imagem do Docker ou para ser compilado a partir da fonte) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md index 51f0dcd2fa3..61baad46710 100644 --- a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Ayrıca istemci çeşitliliğinin [yürütüm katmanında bir sorun](/developers ##### Mutabakat istemcileri - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (Önceden inşa edilmiş bir kütüphane sağlamaz, ya kaynağından derlenir ya da bir Docker görüntüsü) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (Önceden inşa edilmiş bir kütüphane sağlamaz, ya kaynağından derlenir ya da bir Docker görüntüsü) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md index 5e9ffdfe162..2b23dece5ea 100644 --- a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ sidebarDepth: 2 ##### 共識客戶 - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/)(並未提供預先建置的二進位檔案,只有一個 Docker 映像檔,或者自行編譯原始碼) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/)(並未提供預先建置的二進位檔案,只有一個 Docker 映像檔,或者自行編譯原始碼) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md index ff8b43c6980..7c60ad20d90 100644 --- a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ sidebarDepth: 2 ##### 共识客户端 - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/)(不提供预构建的二进制文件,仅提供 Docker 映像或使用源代码进行构建) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/)(不提供预构建的二进制文件,仅提供 Docker 映像或使用源代码进行构建) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) From 35545684d920269a46c67bd60f96f6a32686b119 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 12 Feb 2025 14:13:55 -0500 Subject: [PATCH 067/368] (fix last commit) change https://chainsafe.github.io/lodestar/run/getting-started/installation to https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../de/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../es/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../fa/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../fr/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../hi/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../hu/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../it/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../ja/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../pt-br/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../tr/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../zh/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md index 033bbca4805..7eccd0819d3 100644 --- a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md @@ -163,7 +163,7 @@ It is also worth noting that client diversity is an [issue on the execution laye ##### Consensus clients - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (Doesn't provide a pre-built binary, only a Docker image or to be build from source) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (Doesn't provide a pre-built binary, only a Docker image or to be build from source) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md index b93eeb01d97..9d99739ea7a 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Es sei auch erwähnet, dass die Client-Vielfalt ein [Problem auf der Ausführung ##### Konsens-Clients - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (Bietet keine vorgefertigte Binärdatei, sondern nur eine Docker-Abbildung, die aus den Quelldateien erstellt werden muss) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (Bietet keine vorgefertigte Binärdatei, sondern nur eine Docker-Abbildung, die aus den Quelldateien erstellt werden muss) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md index e36d2a6bc94..3e06439100f 100644 --- a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ También vale la pena señalar que la diversidad del cliente es un [problema en ##### Clientes de consenso - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (no proporciona un binario precompilado, solo una imagen de Docker o para construirse a partir de la fuente) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (no proporciona un binario precompilado, solo una imagen de Docker o para construirse a partir de la fuente) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md index 08b246be135..76f67dcdc26 100644 --- a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ sidebarDepth: 2 ##### کلاینت‌های اجماع - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (یک باینری از پیش ساخته شده ارائه نمی دهد، فقط یک تصویر داکر یا باید از منبع ساخته شود) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (یک باینری از پیش ساخته شده ارائه نمی دهد، فقط یک تصویر داکر یا باید از منبع ساخته شود) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md index e0216243558..f27437e849f 100644 --- a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Il convient également de noter que la diversité de clients est un problème [p ##### Clients de consensus - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (ne fournit pas de binaire pré-compilé, seulement une image Docker ou à construire à partir de la source) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (ne fournit pas de binaire pré-compilé, seulement une image Docker ou à construire à partir de la source) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md index e5f593529ca..5fc1fed4c07 100644 --- a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ sidebarDepth: 2 ##### सहमति ग्राहक - [लाइटहाउस](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (एक पहले से तैयार बाइनरी, केवल एक डॉकर इमेज प्रदान नहीं करता है या उसे स्रोत से बनाया जा सकता है) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (एक पहले से तैयार बाइनरी, केवल एक डॉकर इमेज प्रदान नहीं करता है या उसे स्रोत से बनाया जा सकता है) - [निम्बस](https://github.com/status-im/nimbus-eth2/releases/latest) - [प्रिज़्म](https://github.com/prysmaticlabs/prysm/releases/latest) - [टेकु](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md index f4cd2a25ba3..05d5c9f6c4a 100644 --- a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Fontos tisztában lenni azzal is, hogy a kliensdiverzitás [problémát jelent a ##### Konszenzusos kliensek - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (nem ad előre megépített binárist, csak egy Docker-képet vagy fel kell építeni a forrásból) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (nem ad előre megépített binárist, csak egy Docker-képet vagy fel kell építeni a forrásból) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md index 426165a5063..f48a6f1d0c8 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Vale anche la pena notare che la diversità dei client è un [problema sul livel ##### Client di consenso - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (Non fornisce un binario precompilato, solo un'immagine Docker o da compilare da sorgente) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (Non fornisce un binario precompilato, solo un'immagine Docker o da compilare da sorgente) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md index c4bd4d2f5e4..6edc2ce0b7a 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Raspberry PiのようなARMアーキテクチャのシングルボードコン ##### コンセンサスクライアント - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/)(ビルド済みのバイナリを提供していないため、Dockerイメージを使用またはソースからビルド) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/)(ビルド済みのバイナリを提供していないため、Dockerイメージを使用またはソースからビルド) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md index 04ca8c94e63..8ad6850357c 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Também é relevante observar que a diversidade de clientes é um [problema na c ##### Clientes de consenso - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (não fornece um binário pré-compilado, apenas uma imagem do Docker ou para ser compilado a partir da fonte) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (não fornece um binário pré-compilado, apenas uma imagem do Docker ou para ser compilado a partir da fonte) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md index 61baad46710..0013ac6cc70 100644 --- a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ Ayrıca istemci çeşitliliğinin [yürütüm katmanında bir sorun](/developers ##### Mutabakat istemcileri - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/) (Önceden inşa edilmiş bir kütüphane sağlamaz, ya kaynağından derlenir ya da bir Docker görüntüsü) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (Önceden inşa edilmiş bir kütüphane sağlamaz, ya kaynağından derlenir ya da bir Docker görüntüsü) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md index 2b23dece5ea..13866d1db89 100644 --- a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ sidebarDepth: 2 ##### 共識客戶 - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/)(並未提供預先建置的二進位檔案,只有一個 Docker 映像檔,或者自行編譯原始碼) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/)(並未提供預先建置的二進位檔案,只有一個 Docker 映像檔,或者自行編譯原始碼) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) diff --git a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md index 7c60ad20d90..641e21a79a8 100644 --- a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md @@ -162,7 +162,7 @@ sidebarDepth: 2 ##### 共识客户端 - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation/)(不提供预构建的二进制文件,仅提供 Docker 映像或使用源代码进行构建) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/)(不提供预构建的二进制文件,仅提供 Docker 映像或使用源代码进行构建) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) From 9f84844df8c1143bb3dd8e3a99f81f76a8685d20 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 12 Feb 2025 14:17:50 -0500 Subject: [PATCH 068/368] change https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node to https://besu.hyperledger.org/public-networks/get-started/start-node docs changed format, same content --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../de/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../es/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../fa/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../fr/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../hi/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../hu/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../it/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../ja/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../pt-br/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../tr/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- .../zh/developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md index 7eccd0819d3..f520754ca2b 100644 --- a/public/content/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/developers/docs/nodes-and-clients/run-a-node/index.md @@ -257,7 +257,7 @@ Besu also comes with a launcher option which will ask a series of questions and besu --Xlauncher ``` -[Besu's documentation](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) contains additional options and configuration details. +[Besu's documentation](https://besu.hyperledger.org/public-networks/get-started/start-node/) contains additional options and configuration details. ##### Running Erigon diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md index 9d99739ea7a..db96de7af0e 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu verfügt auch über eine Startoption, die eine Reihe von Fragen stellt und besu --Xlauncher ``` -[Dokumentation von Besu](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) enthält zusätzliche Optionen und Konfigurationsdetails. +[Dokumentation von Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) enthält zusätzliche Optionen und Konfigurationsdetails. ##### Ausführen von Erigon diff --git a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md index 3e06439100f..292c990db50 100644 --- a/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/es/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu también incluye una opción de lanzador que hará una serie de preguntas y besu --Xlauncher ``` -[La documentación de Besu](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) contiene opciones adicionales y detalles de configuración. +[La documentación de Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) contiene opciones adicionales y detalles de configuración. ##### Cómo ejecutar Erigon diff --git a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md index 76f67dcdc26..02b81c44ae8 100644 --- a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu همچنین دارای یک گزینه لانچر است که یک سری besu --Xlauncher ``` -[اسناد Besu](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) حاوی گزینه‌های اضافی و جزئیات پیکربندی است. +[اسناد Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) حاوی گزینه‌های اضافی و جزئیات پیکربندی است. ##### اجرای Erigon diff --git a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md index f27437e849f..c24fff207cc 100644 --- a/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu est également fourni avec un lanceur optionnel qui posera une série de qu besu --Xlauncher ``` -[La documentation de Besu](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) contient des options supplémentaires et des détails de configuration. +[La documentation de Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) contient des options supplémentaires et des détails de configuration. ##### Exécuter Erigon diff --git a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md index 5fc1fed4c07..723f2a1050d 100644 --- a/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hi/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu में एक लॉन्चर विकल्प भी आता ह besu --Xlauncher ``` -[Besu का प्रलेखन](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) अतिरिक्त विकल्प और कॉन्फ़िगरेशन विवरण शामिल करता है। +[Besu का प्रलेखन](https://besu.hyperledger.org/public-networks/get-started/start-node/) अतिरिक्त विकल्प और कॉन्फ़िगरेशन विवरण शामिल करता है। ##### Erigon चलाना diff --git a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md index 05d5c9f6c4a..c6ac0dba592 100644 --- a/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/hu/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ A Besu egy telepítő opcióval bír, mely egy sor kérdést tesz fel, majd lege besu --Xlauncher ``` -A [Besu dokumentációja](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) további opciókat és konfigurációs részleteket tartalmaz. +A [Besu dokumentációja](https://besu.hyperledger.org/public-networks/get-started/start-node/) további opciókat és konfigurációs részleteket tartalmaz. ##### Az Erigon futtatása diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md index f48a6f1d0c8..b488644d529 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu presenta inoltre un'opzione del launcher che porrà una serie di domande e besu --Xlauncher ``` -La [documentazione di Besu](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) contiene le opzioni aggiuntive e i dettagli di configurazione. +La [documentazione di Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) contiene le opzioni aggiuntive e i dettagli di configurazione. ##### Eseguire Erigon diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md index 6edc2ce0b7a..54ddc93c94f 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besuには、一連の質問に答えることで設定ファイルを生成で besu --Xlauncher ``` -[Besuのドキュメント](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/)で、追加のオプションと設定の詳細を参照してください。 +[Besuのドキュメント](https://besu.hyperledger.org/public-networks/get-started/start-node/)で、追加のオプションと設定の詳細を参照してください。 ##### Erigonの実行 diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md index 8ad6850357c..18a4e4c948f 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ O Besu também vem com uma opção de inicializador, que fará uma série de per besu --Xlauncher ``` -A [documentação do Besu](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) contém opções adicionais e detalhes de configuração. +A [documentação do Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) contém opções adicionais e detalhes de configuração. ##### Executando o Erigon diff --git a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md index 0013ac6cc70..2d678a27245 100644 --- a/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu aynı zamanda birtakım sorular soran ve yapılandırma dosyasını oluştu besu --Xlauncher ``` -[Besu'nun dokümanlarını](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/) daha fazla seçenek ve yapılandırma detayları içerir. +[Besu'nun dokümanlarını](https://besu.hyperledger.org/public-networks/get-started/start-node/) daha fazla seçenek ve yapılandırma detayları içerir. ##### Erigon'u Çalıştırmak diff --git a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md index 13866d1db89..3fc78d65491 100644 --- a/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh-tw/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu 還有個啟動器選項,會詢問一系列問題並產生設定檔案。 besu --Xlauncher ``` -[Besu 的文件](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/)包含了額外的選項及設定細節。 +[Besu 的文件](https://besu.hyperledger.org/public-networks/get-started/start-node/)包含了額外的選項及設定細節。 ##### 運行 Erigon diff --git a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md index 641e21a79a8..2f9396be249 100644 --- a/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/zh/developers/docs/nodes-and-clients/run-a-node/index.md @@ -256,7 +256,7 @@ Besu 还带有一个启动器选项,它会询问一系列问题并生成配置 besu --Xlauncher ``` -[Besu 相关文档](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/)包含更多选项和配置详细信息。 +[Besu 相关文档](https://besu.hyperledger.org/public-networks/get-started/start-node/)包含更多选项和配置详细信息。 ##### 运行 Erigon From 6c4d245959ec8e5d8f81fbd4130dc837c0730215 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 14:27:17 -0500 Subject: [PATCH 069/368] change https://www.tutorialspoint.com/solidity/solidity_mappings.html to https://www.tutorialspoint.com/solidity/solidity_mappings.htm - weird url --- .../pt-br/developers/tutorials/erc20-annotated-code/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/pt-br/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/erc20-annotated-code/index.md index a1180674191..3480796903b 100644 --- a/public/content/translations/pt-br/developers/tutorials/erc20-annotated-code/index.md +++ b/public/content/translations/pt-br/developers/tutorials/erc20-annotated-code/index.md @@ -216,7 +216,7 @@ Este comentário explica o propósito do contrato. /** * @dev Implementation of the {IERC20} interface. * - * This implementation is agnostic to the way tokens are created. Isto significa + * This implementation is agnostic to the way tokens are created. Isto significa * que um mecanismo de oferta deve ser adicionado em um contrato derivado usando {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * @@ -262,7 +262,7 @@ Essa linha anexa a biblioteca `SafeMath` ao tipo `uint256`. Você pode encontrar Essas definições especificam as variáveis de estado do contrato. Existem variáveis declaradas como `private`, mas isso apenas significa que outros contratos na blockchain não as podem ler. _Não há segredos na blockchain_, o software em cada nó possui o estado de cada contrato em cada bloco. Por convenção, as variáveis de estado são denominadas `_`. -As duas primeiras variáveis são [mapeamentos](https://www.tutorialspoint.com/solidity/solidity_mappings.html), ou seja, se comportam mais ou menos da mesma forma que [matrizes associativas](https://wikipedia.org/wiki/Associative_array), com exceção das chaves, que são valores numéricos. O armazenamento é alocado apenas para as entradas que possuem valores diferentes do padrão (zero). +As duas primeiras variáveis são [mapeamentos](https://www.tutorialspoint.com/solidity/solidity_mappings.htm), ou seja, se comportam mais ou menos da mesma forma que [matrizes associativas](https://wikipedia.org/wiki/Associative_array), com exceção das chaves, que são valores numéricos. O armazenamento é alocado apenas para as entradas que possuem valores diferentes do padrão (zero). ```solidity mapping (address => uint256) private _balances; From 87b94206274842f33d533ec2f878791701e17574 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 14:36:47 -0500 Subject: [PATCH 070/368] change https://hudsonjameson.com/2020-03-23-ethereum-protocol-Development-governance-and-network-upgrad-coordination to https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination --- public/content/translations/hi/eips/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/hi/eips/index.md b/public/content/translations/hi/eips/index.md index 545fc7cfe34..9e8c58a863c 100644 --- a/public/content/translations/hi/eips/index.md +++ b/public/content/translations/hi/eips/index.md @@ -74,6 +74,6 @@ EIP संपादक तय करते हैं कि कोई प्र -हडसन जेमसन द्वारा [एथेरियम प्रोटोकॉल डेवलपमेंट गवर्नेंस एंड नेटवर्क अपग्रेड कोऑर्डिनेशन](https://hudsonjameson.com/2020-03-23-ethereum-protocol-Development-governance-and-network-upgrad-coordination/) में अलग-अलग पेज में दिया गया कंटेंट +हडसन जेमसन द्वारा [एथेरियम प्रोटोकॉल डेवलपमेंट गवर्नेंस एंड नेटवर्क अपग्रेड कोऑर्डिनेशन](https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) में अलग-अलग पेज में दिया गया कंटेंट From a9ef2541c123c9839ae52b7304dacb9348d4e353 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 14:38:38 -0500 Subject: [PATCH 071/368] change https://www.quicknode.com/guides/infrastructor/ethereum-full-node-vs-archive-node to https://www.quicknode.com/guides/infrastructure/node-setup/ethereum-full-node-vs-archive-node --- .../ja/developers/docs/nodes-and-clients/archive-nodes/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/archive-nodes/index.md index c850d1e148b..5861b3586ff 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/archive-nodes/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/archive-nodes/index.md @@ -70,7 +70,7 @@ sidebarDepth: 2 ## 参考文献 {#further-reading} -- [イーサリアムフルノードとアーカイブノードの比較](https://www.quicknode.com/guides/infrastructor/ethereum-full-node-vs-archive-node) - *QuickNode、2022年9月* +- [イーサリアムフルノードとアーカイブノードの比較](https://www.quicknode.com/guides/infrastructure/node-setup/ethereum-full-node-vs-archive-node) - *QuickNode、2022年9月* - [自分のイーサリアムアーカイブノードを構築する](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _Thomas Jay Rush、2021年8月_ - [エリゴン、エリゴンのRPC、TrueBlocks(スクレイピングとAPI)をサービスとしてセットアップする方法](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _ – Magnus Hansson、2022年9月更新_ From b38769a5a75f8f1192d75510b2ee43ff41e6b6f8 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 14:42:36 -0500 Subject: [PATCH 072/368] change https://www.notboring.co/p/the-Web3-debate?s=r to https://www.notboring.co/p/the-web3-debate - for some reason adding s=r to the url params breaks the link --- public/content/translations/ar/web3/index.md | 2 +- public/content/translations/be/web3/index.md | 2 +- public/content/translations/cs/web3/index.md | 2 +- public/content/translations/de/web3/index.md | 2 +- public/content/translations/el/web3/index.md | 2 +- public/content/translations/es/web3/index.md | 2 +- public/content/translations/fa/web3/index.md | 2 +- public/content/translations/fil/web3/index.md | 2 +- public/content/translations/fr/web3/index.md | 2 +- public/content/translations/ha/web3/index.md | 2 +- public/content/translations/hi/web3/index.md | 2 +- public/content/translations/hu/web3/index.md | 2 +- public/content/translations/id/web3/index.md | 2 +- public/content/translations/it/web3/index.md | 2 +- public/content/translations/ja/web3/index.md | 2 +- public/content/translations/ko/web3/index.md | 2 +- public/content/translations/ms/web3/index.md | 2 +- public/content/translations/nl/web3/index.md | 2 +- public/content/translations/pcm/web3/index.md | 2 +- public/content/translations/pl/web3/index.md | 2 +- public/content/translations/pt-br/web3/index.md | 2 +- public/content/translations/ru/web3/index.md | 2 +- public/content/translations/sk/web3/index.md | 2 +- public/content/translations/sr/web3/index.md | 2 +- public/content/translations/te/web3/index.md | 2 +- public/content/translations/tl/web3/index.md | 2 +- public/content/translations/tr/web3/index.md | 2 +- public/content/translations/uk/web3/index.md | 2 +- public/content/translations/uz/web3/index.md | 2 +- public/content/translations/vi/web3/index.md | 2 +- public/content/translations/yo/web3/index.md | 2 +- public/content/translations/zh-tw/web3/index.md | 2 +- public/content/translations/zh/web3/index.md | 2 +- public/content/web3/index.md | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/public/content/translations/ar/web3/index.md b/public/content/translations/ar/web3/index.md index 64e080d7b7f..907a9c13fa2 100644 --- a/public/content/translations/ar/web3/index.md +++ b/public/content/translations/ar/web3/index.md @@ -152,6 +152,6 @@ OnlyFans هو موقع محتوى للبالغين تم إنشاؤه بواسط - [ما سبب أهمية الإصدار الثالث من الويب Web3](https://future.a16z.com/why-web3-matters/) — _كريس ديكسون_ - [ما سبب أهمية اللامركزية](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _كريس ديكسون_ - [تصميم الإصدار الثالث من الويب Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [الجدال بشأن الإصدار الثالث من الويب Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _باكي ماكورميك_ +- [الجدال بشأن الإصدار الثالث من الويب Web3](https://www.notboring.co/p/the-web3-debate) – _باكي ماكورميك_ diff --git a/public/content/translations/be/web3/index.md b/public/content/translations/be/web3/index.md index 7d7bf02537b..aaf606427ec 100644 --- a/public/content/translations/be/web3/index.md +++ b/public/content/translations/be/web3/index.md @@ -152,6 +152,6 @@ Web3 не мае жорсткага вызначэння. Розныя ўдзе - [Чаму Web3 — гэта важна](https://future.a16z.com/why-web3-matters/) — _Крыс Дыксан_ - [Чаму дэцэнтралізацыя з'яўляецца важнай](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Крыс Дыксан_ - [Пейзаж Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) — _a16z_ -- [Дэбаты Web3](https://www.notboring.co/p/the-web3-debate?s=r) — _Пэкі Маккормік_ +- [Дэбаты Web3](https://www.notboring.co/p/the-web3-debate) — _Пэкі Маккормік_ diff --git a/public/content/translations/cs/web3/index.md b/public/content/translations/cs/web3/index.md index e8666388943..22c50a04688 100644 --- a/public/content/translations/cs/web3/index.md +++ b/public/content/translations/cs/web3/index.md @@ -152,6 +152,6 @@ Web3 není pevně definován. Různí členové komunity mají na jeho definici - [Proč na Web3 záleží](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Proč na decentralizaci záleží](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Web3 ekosystém](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Debata o Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Debata o Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/de/web3/index.md b/public/content/translations/de/web3/index.md index 58a04255dc1..74a2f6a8ec3 100644 --- a/public/content/translations/de/web3/index.md +++ b/public/content/translations/de/web3/index.md @@ -152,6 +152,6 @@ Web3 ist nicht starr definiert. Zahlreiche Community-Teilnehmer haben unterschie - [Warum Web3 wichtig ist](https://future.a16z.com/why-web3-matters/) – _Chris Dixon_ - [Warum Dezentralisierung wichtig ist](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) – _Chris Dixon_ - [Die Web3-Landschaft](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Die Web3-Debatte](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Die Web3-Debatte](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/el/web3/index.md b/public/content/translations/el/web3/index.md index 485cbe36c98..56e167bebe7 100644 --- a/public/content/translations/el/web3/index.md +++ b/public/content/translations/el/web3/index.md @@ -152,6 +152,6 @@ H πρώτη σύλληψη της ιδέας του Berners-Lee, γνωστή - [Γιατί το Web3 έχει σημασία](https://future.a16z.com/why-web3-matters/) - _Chris Dixon_ - [Γιατί η αποκέντρωσης έχει σημασία](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Το τοπίο του Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) - _a16z_ -- [Η συζήτηση για το Web3](https://www.notboring.co/p/the-web3-debate?s=r) - _Packy McCormick_ +- [Η συζήτηση για το Web3](https://www.notboring.co/p/the-web3-debate) - _Packy McCormick_ diff --git a/public/content/translations/es/web3/index.md b/public/content/translations/es/web3/index.md index 94021a37c16..6dc2e6de09d 100644 --- a/public/content/translations/es/web3/index.md +++ b/public/content/translations/es/web3/index.md @@ -152,6 +152,6 @@ Web3 no está definida rígidamente. Varios participantes de la comunidad tienen - [¿Por qué es Importante Web3?](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [¿Por qué es importante la Descentralización?](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [El paisaje de la Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [El debate de Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [El debate de Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/fa/web3/index.md b/public/content/translations/fa/web3/index.md index 5da8790eb68..a7d0fd80e4a 100644 --- a/public/content/translations/fa/web3/index.md +++ b/public/content/translations/fa/web3/index.md @@ -152,6 +152,6 @@ Web3 تعریف سفت و محکمی ندارد. شرکت‌کنندگان مخ - [چرا وب 3 مهم است](https://future.a16z.com/why-web3-matters/) – _کریس دیکسون_ - [چرا تمرکززدایی مهم است](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _کریس دیکسون_ - [فضای وب 3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [بحث وب ۳](https://www.notboring.co/p/the-web3-debate?s=r) - _پکی مک‌کورمیک_ +- [بحث وب ۳](https://www.notboring.co/p/the-web3-debate) - _پکی مک‌کورمیک_ diff --git a/public/content/translations/fil/web3/index.md b/public/content/translations/fil/web3/index.md index b7773e48135..f8b23f5fc3d 100644 --- a/public/content/translations/fil/web3/index.md +++ b/public/content/translations/fil/web3/index.md @@ -152,6 +152,6 @@ Walang malinaw na pagpapakahulugan sa Web3. May iba't ibang pananaw dito ang iba - [Bakit Mahalaga ang Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Bakit Mahalaga ang Decentralization](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Ang Web3 Landscape](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Ang Debate tungkol sa Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Ang Debate tungkol sa Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/fr/web3/index.md b/public/content/translations/fr/web3/index.md index 9fba54ea1ae..c04cd7e597d 100644 --- a/public/content/translations/fr/web3/index.md +++ b/public/content/translations/fr/web3/index.md @@ -152,6 +152,6 @@ Le Web3 n’est pas strictement défini. Plusieurs participants de la Communaut - [Importance du Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Pourquoi la décentralisation est importante](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Panorama du Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Débat sur le Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Débat sur le Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/ha/web3/index.md b/public/content/translations/ha/web3/index.md index 2e5e1e0c5e9..5b6a20c5f3b 100644 --- a/public/content/translations/ha/web3/index.md +++ b/public/content/translations/ha/web3/index.md @@ -152,6 +152,6 @@ Ba'a bayyana Web3 sosai ba. Mahalartar al'umma daban-daban suna da hangen nesa d - [Me yasa ake batun Web3](https://future.a16z.com/why-Web3-matters/) - _Chris Dixon_ - [Me yasa ake Batun Karkatattun](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Iyakokin Web3](https://a16z.com/wp-content/uploads/2021/10/The-Web3-Readlng-List.pdf) – _a16z_ -- [Muhawarar Web3](https://www.notboring.co/p/the-Web3-debate?s=r) – _Packy McCormick_ +- [Muhawarar Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/hi/web3/index.md b/public/content/translations/hi/web3/index.md index c776345ec96..a99704a6f8a 100644 --- a/public/content/translations/hi/web3/index.md +++ b/public/content/translations/hi/web3/index.md @@ -152,6 +152,6 @@ Web3 सटीकता से परिभाषित नहीं है। - [Web3 क्यों मायने रखता है](https://future.a16z.com/why-web3-matters/) — _क्रिस डिक्सॉन_ - [विकेंद्रीकरण क्यों मायने रखता है](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _क्रिस डिक्सॉन_ - [Web3 लैंडस्केप](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Web3 बहस](https://www.notboring.co/p/the-web3-debate?s=r) – _पैकी मक्कॉर्मिक_ +- [Web3 बहस](https://www.notboring.co/p/the-web3-debate) – _पैकी मक्कॉर्मिक_ diff --git a/public/content/translations/hu/web3/index.md b/public/content/translations/hu/web3/index.md index 383332ec940..05087eadb7c 100644 --- a/public/content/translations/hu/web3/index.md +++ b/public/content/translations/hu/web3/index.md @@ -152,6 +152,6 @@ A Web3 nincs szigorúan definiálva. A közösségek különböző résztvevői - [Miért számít a Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Miért fontos a decentralizáció](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) – _Chris Dixon_ - [A Web3 világa](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [A Web3 vita](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [A Web3 vita](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/id/web3/index.md b/public/content/translations/id/web3/index.md index e2449ec29c4..647385e80ef 100644 --- a/public/content/translations/id/web3/index.md +++ b/public/content/translations/id/web3/index.md @@ -152,6 +152,6 @@ Web3 tidak didefinisikan secara kaku. Berbagai peserta komunitas memiliki sudut - [Mengapa Web3 Penting](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Mengapa Desentralisasi Penting](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Lanskap Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Debat Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Debat Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/it/web3/index.md b/public/content/translations/it/web3/index.md index 4ed3f8c9ebf..acbf9d8b422 100644 --- a/public/content/translations/it/web3/index.md +++ b/public/content/translations/it/web3/index.md @@ -152,6 +152,6 @@ Il Web3 non ha una definizione rigida. Vari partecipanti della community hanno p - [Perché Web3 È Importante](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Perché la Decentralizzazione È Importante](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Il Panorama di Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Il Dibattito su Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Il Dibattito su Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/ja/web3/index.md b/public/content/translations/ja/web3/index.md index 6553629e16e..5e85c5f80b0 100644 --- a/public/content/translations/ja/web3/index.md +++ b/public/content/translations/ja/web3/index.md @@ -152,6 +152,6 @@ Web3とは何かは、厳密に定義されていません。 さまざまなコ - [Web3が重要な理由](https://future.a16z.com/why-web3-matters/) - _Chris Dixon_ - [非中央集権化が重要な理由](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Web3のランドスケープ](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) - _a16z_ -- [Web3に関する議論](https://www.notboring.co/p/the-web3-debate?s=r) - _Packy McCormick_ +- [Web3に関する議論](https://www.notboring.co/p/the-web3-debate) - _Packy McCormick_ diff --git a/public/content/translations/ko/web3/index.md b/public/content/translations/ko/web3/index.md index 32597f875fd..5c07a46fcef 100644 --- a/public/content/translations/ko/web3/index.md +++ b/public/content/translations/ko/web3/index.md @@ -152,6 +152,6 @@ Ethereum.org는 중요한 이더리움 콘텐츠를 가능한 많은 언어로 - [웹3가 중요한 이유](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [탈중앙화가 중요한 이유](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [웹3의 전망](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [웹3에 대해 토론하기](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [웹3에 대해 토론하기](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/ms/web3/index.md b/public/content/translations/ms/web3/index.md index a0371b4fb0c..e0c43b5a6fa 100644 --- a/public/content/translations/ms/web3/index.md +++ b/public/content/translations/ms/web3/index.md @@ -152,6 +152,6 @@ Web3 tidak ditakrifkan secara tegar. Pelbagai peserta komuniti mempunyai perspek - [Kepentingan Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Kepentingan Keteragihan](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Lanskap Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – *a16z* -- [Debat Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Debat Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/nl/web3/index.md b/public/content/translations/nl/web3/index.md index 8e71249b0c0..a72a8e59624 100644 --- a/public/content/translations/nl/web3/index.md +++ b/public/content/translations/nl/web3/index.md @@ -176,6 +176,6 @@ Web3 is niet strikt gedefinieerd. Verschillende community-deelnemers hebben er v - [Why Web3 Matters](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Why Decentralization Matters](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [The Web3 Landscape](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [The Web3 Debate](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [The Web3 Debate](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/pcm/web3/index.md b/public/content/translations/pcm/web3/index.md index a5962b6e053..91d94beae3a 100644 --- a/public/content/translations/pcm/web3/index.md +++ b/public/content/translations/pcm/web3/index.md @@ -152,6 +152,6 @@ Dem nor rily define Web3. Difrent pipol wey dey patisipate in Web3 get difrent o - [Why We3 Matta](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Why disentralizashon matta](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Di Web3 landscape](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Di Web3 Debate](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Di Web3 Debate](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/pl/web3/index.md b/public/content/translations/pl/web3/index.md index 664c1ae7552..8c355c68bb5 100644 --- a/public/content/translations/pl/web3/index.md +++ b/public/content/translations/pl/web3/index.md @@ -152,6 +152,6 @@ Web3 nie jest jednoznacznie zdefiniowany. Różni uczestnicy społeczności maj - [Dlaczego Web3 ma znaczenie](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Dlaczego decentralizacja ma znaczenie](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Chris Dixon_ - [Wygląd Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) — _a16z_ -- [Debata o Web3](https://www.notboring.co/p/the-web3-debate?s=r) — _Packy McCormick_ +- [Debata o Web3](https://www.notboring.co/p/the-web3-debate) — _Packy McCormick_ diff --git a/public/content/translations/pt-br/web3/index.md b/public/content/translations/pt-br/web3/index.md index 0ffc6c44361..c9a433e9a23 100644 --- a/public/content/translations/pt-br/web3/index.md +++ b/public/content/translations/pt-br/web3/index.md @@ -152,6 +152,6 @@ Web3 não é rigidamente definida. Vários participantes da comunidade têm dive - [Por que a Web3 é Importante?](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Por que a descentralização é importante?](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) _Feb-, - Chris Dixon_ - [O Cenário Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [O Debate Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [O Debate Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/ru/web3/index.md b/public/content/translations/ru/web3/index.md index a7f9ce33046..8c84338ed7b 100644 --- a/public/content/translations/ru/web3/index.md +++ b/public/content/translations/ru/web3/index.md @@ -152,6 +152,6 @@ Web3 — это молодая и развивающаяся экосистем - [Почему Web3 — это важно](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Почему важна децентрализация](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Chris Dixon_ - [Ландшафт Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) — _a16z_ -- [Дебаты о Web3](https://www.notboring.co/p/the-web3-debate?s=r) — _Packy McCormick_ +- [Дебаты о Web3](https://www.notboring.co/p/the-web3-debate) — _Packy McCormick_ diff --git a/public/content/translations/sk/web3/index.md b/public/content/translations/sk/web3/index.md index 40307f0b954..a2f0530d8bb 100644 --- a/public/content/translations/sk/web3/index.md +++ b/public/content/translations/sk/web3/index.md @@ -152,6 +152,6 @@ Web3 nie je pevne definovaný. Rôzni účastníci komunity majú na definíciu - [Prečo na Web3 záleží](https://future.a16z.com/why-web3-matters/) – _Chris Dixon_ - [Prečo na decentralizácii záleží](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) – _Chris Dixon_ - [Web3 ekosystém](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Diskusia o Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Diskusia o Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/sr/web3/index.md b/public/content/translations/sr/web3/index.md index 8d4721fdbca..8b2f992f0e5 100644 --- a/public/content/translations/sr/web3/index.md +++ b/public/content/translations/sr/web3/index.md @@ -152,6 +152,6 @@ Web3 nije rigidno definisan. Različiti članovi zajednice imaju različite pogl - [Zašto je Web3 važan](https://future.a16z.com/why-web3-matters/) – _Kris Dikson_ - [Zašto je decentralizacija važna](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) – _Kris Dikson_ - [Web3 pejzaž](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Rasprava o platformi Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Peki Makkormik_ +- [Rasprava o platformi Web3](https://www.notboring.co/p/the-web3-debate) – _Peki Makkormik_ diff --git a/public/content/translations/te/web3/index.md b/public/content/translations/te/web3/index.md index 990adb01767..af9f696cf7c 100644 --- a/public/content/translations/te/web3/index.md +++ b/public/content/translations/te/web3/index.md @@ -152,6 +152,6 @@ Web3 కఠినంగా నిర్వచించబడలేదు. వి - [Web3 ఎందుకు ముఖ్యమైనది](https://future.a16z.com/why-web3-matters/) — _క్రిస్ డిక్సన్_ - [వికేంద్రీకరణ ఎందుకు ముఖ్యమైనది](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _క్రిస్ డిక్సన్_ - [Web3 ల్యాండ్‌స్కేప్](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Web3 డిబేట్](https://www.notboring.co/p/the-web3-debate?s=r) – _ప్యాకీ మెక్‌కార్మిక్_ +- [Web3 డిబేట్](https://www.notboring.co/p/the-web3-debate) – _ప్యాకీ మెక్‌కార్మిక్_ diff --git a/public/content/translations/tl/web3/index.md b/public/content/translations/tl/web3/index.md index 274802820d2..5665707f1aa 100644 --- a/public/content/translations/tl/web3/index.md +++ b/public/content/translations/tl/web3/index.md @@ -152,6 +152,6 @@ Walang malinaw na pagpapakahulugan sa Web3. May iba't ibang pananaw dito ang iba - [Bakit Mahalaga ang Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Bakit Mahalaga ang Decentralization](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Ang Web3 Landscape](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Ang Debate tungkol sa Web3](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Ang Debate tungkol sa Web3](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/tr/web3/index.md b/public/content/translations/tr/web3/index.md index 6319f4e0d45..00e787a13d8 100644 --- a/public/content/translations/tr/web3/index.md +++ b/public/content/translations/tr/web3/index.md @@ -152,6 +152,6 @@ Web3 rijit bir şekilde tanımlanmamıştır. Çeşitli topluluk katılımcılar - [Web3 Neden Önemli?](https://future.a16z.com/why-web3-matters/)—_Chris Dixon_ - [Merkeziyetsizlik Neden Önemli?](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Web3 Manzarası](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Web3 Tartışması](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Web3 Tartışması](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/uk/web3/index.md b/public/content/translations/uk/web3/index.md index 540dd754687..767cd45a80c 100644 --- a/public/content/translations/uk/web3/index.md +++ b/public/content/translations/uk/web3/index.md @@ -152,6 +152,6 @@ Web3 — це молода екосистема, що розвивається. - [У чому важливість Web3](https://future.a16z.com/why-web3-matters/) — _Кріс Діксон_ - [У чому важливість децентралізації](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Кріс Діксон_ - [Огляд Web3](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) — _a16z_ -- [Дебати довкола Web3](https://www.notboring.co/p/the-web3-debate?s=r) — _Пекі Маккормік_ +- [Дебати довкола Web3](https://www.notboring.co/p/the-web3-debate) — _Пекі Маккормік_ diff --git a/public/content/translations/uz/web3/index.md b/public/content/translations/uz/web3/index.md index a641b5055c9..65f22bdd635 100644 --- a/public/content/translations/uz/web3/index.md +++ b/public/content/translations/uz/web3/index.md @@ -152,6 +152,6 @@ Web3 qat’iy belgilangan emas. Jamiyatning turli ishtirokchilari bu borada turl - [Nega Web3 muhim](https://future.a16z.com/why-web3-matters/) — _Kris Dixon_ - [Markazlashtirmaslik nima uchun muhim](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Kris Dixon_ - [Web3 manzarasi](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) — _a16z_ -- [Web3 bahsi](https://www.notboring.co/p/the-web3-debate?s=r) — _Pakki MakKormik_ +- [Web3 bahsi](https://www.notboring.co/p/the-web3-debate) — _Pakki MakKormik_ diff --git a/public/content/translations/vi/web3/index.md b/public/content/translations/vi/web3/index.md index 0fffe2ddfd4..cf0c81f15c1 100644 --- a/public/content/translations/vi/web3/index.md +++ b/public/content/translations/vi/web3/index.md @@ -152,6 +152,6 @@ Web3 không được xác định một cách cứng nhắc. Nhiều người th - [Tại sao Web3 quan trọng](https://future.a16z.com/why-web3-matters/) - _Chris Dixon_ - [Tại sao phi tập trung quan trọng](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [The Web3 Landscape](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Thảo luận về web3](https://www.notboring.co/p/the-web3-debate?s=r) - _Packy McCormick_ +- [Thảo luận về web3](https://www.notboring.co/p/the-web3-debate) - _Packy McCormick_ diff --git a/public/content/translations/yo/web3/index.md b/public/content/translations/yo/web3/index.md index 201a399e009..deb4b9845fd 100644 --- a/public/content/translations/yo/web3/index.md +++ b/public/content/translations/yo/web3/index.md @@ -152,6 +152,6 @@ Wẹ́ẹ̀bù kẹta ò ní ìtumọ̀ kan. Àwọn omo ẹgbẹ awujo ní èr - [Kí ní ìdí tí Wẹẹbu kẹta fí ṣe koko](https://future.a16z.com/why-web3-matters/)— _Chris Dixon_ - [Kí ní ìdí tí alailakoso fí ṣe koko](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [ Ìrísí Ojú Ilẹ̀ Wẹẹbu kẹta](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) - _Chris Dixon_ -- [Itakurọsọ lori Wẹ́ẹ̀bù kẹta](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Itakurọsọ lori Wẹ́ẹ̀bù kẹta](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/zh-tw/web3/index.md b/public/content/translations/zh-tw/web3/index.md index 9d07ba0aac5..3312fbb4d30 100644 --- a/public/content/translations/zh-tw/web3/index.md +++ b/public/content/translations/zh-tw/web3/index.md @@ -152,6 +152,6 @@ Web3 並未嚴格定義。 不同社群參與者對它有不同的看法。 請 - [為什麼 Web 3 很重要](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [為什麼去中心化很重要](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Web 3 的景況](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Web 3 的辯論](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Web 3 的辯論](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/translations/zh/web3/index.md b/public/content/translations/zh/web3/index.md index 7ec2828b794..8acf87586a1 100644 --- a/public/content/translations/zh/web3/index.md +++ b/public/content/translations/zh/web3/index.md @@ -152,6 +152,6 @@ Web3 没有严格的定义。 不同的社区参与者对其有不同的看法 - [为什么 Web3 很重要](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [为什么去中心化很重要](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [Web3 概况](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [Web3 之辩论](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [Web3 之辩论](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ diff --git a/public/content/web3/index.md b/public/content/web3/index.md index cbcfa0c5df8..d072c8f8343 100644 --- a/public/content/web3/index.md +++ b/public/content/web3/index.md @@ -154,6 +154,6 @@ Web3 isn’t rigidly defined. Various community participants have different pers - [Why Web3 Matters](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Why Decentralization Matters](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ - [The Web3 Landscape](https://a16z.com/wp-content/uploads/2021/10/The-web3-Readlng-List.pdf) – _a16z_ -- [The Web3 Debate](https://www.notboring.co/p/the-web3-debate?s=r) – _Packy McCormick_ +- [The Web3 Debate](https://www.notboring.co/p/the-web3-debate) – _Packy McCormick_ From 8d4b5596c5a14c0fc1738015e463cf1d2f36c84a Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 14:46:57 -0500 Subject: [PATCH 073/368] change https://www.freecodecamp.org/news/what-is-Web3 to https://www.freecodecamp.org/news/what-is-web3/ --- public/content/translations/ha/web3/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ha/web3/index.md b/public/content/translations/ha/web3/index.md index 5b6a20c5f3b..24069e02a41 100644 --- a/public/content/translations/ha/web3/index.md +++ b/public/content/translations/ha/web3/index.md @@ -147,7 +147,7 @@ Mu kawai muna farkone wajen ƙirƙirar abinda yafi Web da Web3, amma muna ci gab Ba'a bayyana Web3 sosai ba. Mahalartar al'umma daban-daban suna da hangen nesa daban-daban game da shi. Ga kadan daga cikin su: -- [Menene Web3? An Bayyana Karkatattun Intanet na Nan Gaba](https://www.freecodecamp.org/news/what-is-Web3/) – _Nader Dabit_ +- [Menene Web3? An Bayyana Karkatattun Intanet na Nan Gaba](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ - [ Fahimta da Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) - _ Josh Stark_ - [Me yasa ake batun Web3](https://future.a16z.com/why-Web3-matters/) - _Chris Dixon_ - [Me yasa ake Batun Karkatattun](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ From 8fd7d3687fea53b03484930a98643fc2107fee35 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 14:49:55 -0500 Subject: [PATCH 074/368] update https://wagmi.sh/react/hooks/useContractRead to https://wagmi.sh/react/api/hooks/useReadContract -- change useContractRead to useReadContract --- .../index.md | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/public/content/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md index b297f49402a..ce0c99f79b5 100644 --- a/public/content/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md +++ b/public/content/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md @@ -176,11 +176,11 @@ This file contains most of the UI functionality. It includes definitions that wo ```tsx import { useState, ChangeEventHandler } from 'react' -import { useNetwork, - useContractRead, - usePrepareContractWrite, - useContractWrite, - useContractEvent +import { useNetwork, + useReadContract, + usePrepareContractWrite, + useContractWrite, + useContractEvent } from 'wagmi' ``` @@ -264,17 +264,17 @@ Because this is a hook (`use...`), every time this information changes the compo The address of the Greeter contract, which varies by chain (and which is `undefined` if we don't have chain information or we are on a chain without that contract). ```tsx - const readResults = useContractRead({ + const readResults = useReadContract({ address: greeterAddr, abi: greeterABI, functionName: "greet" , // No arguments - watch: true + watch: true }) ``` -[The `useContractRead` hook](https://wagmi.sh/react/hooks/useContractRead) reads information from a contract. You can see exactly what information it returns expand `readResults` in the UI. In this case we want it to keep looking so we'll be informed when the greeting changes. +[The `useReadContract` hook](https://wagmi.sh/react/api/hooks/useReadContract) reads information from a contract. You can see exactly what information it returns expand `readResults` in the UI. In this case we want it to keep looking so we'll be informed when the greeting changes. -**Note:** We could listen to [`setGreeting` events](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=logs) to know when the greeting changes and update that way. However, while it may be more efficient, it will not apply in all cases. When the user switches to a different chain the greeting also changes, but that change is not accompanied by an event. We could have one part of the code listening for events and another to identify chain changes, but that would be more complicated than just setting [the `watch` parameter](https://wagmi.sh/react/hooks/useContractRead#watch-optional). +**Note:** We could listen to [`setGreeting` events](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=logs) to know when the greeting changes and update that way. However, while it may be more efficient, it will not apply in all cases. When the user switches to a different chain the greeting also changes, but that change is not accompanied by an event. We could have one part of the code listening for events and another to identify chain changes, but that would be more complicated than just setting [the `watch` parameter](https://wagmi.sh/react/api/hooks/useReadContract#watch-optional). ```tsx const [ newGreeting, setNewGreeting ] = useState("") @@ -290,7 +290,7 @@ The `useState` hook returns a list with two values: In this case, we are using a state variable for the new greeting the user wants to set. ```tsx - const greetingChange : ChangeEventHandler = (evt) => + const greetingChange : ChangeEventHandler = (evt) => setNewGreeting(evt.target.value) ``` @@ -303,7 +303,7 @@ This is the event handler for when the new greeting input field changes. The typ functionName: 'setGreeting', args: [ newGreeting ] }) - const workingTx = useContractWrite(preparedTx.config) + const workingTx = useContractWrite(preparedTx.config) ``` This is the process to submit a blockchain transaction from the client perspective: @@ -336,8 +336,8 @@ Now we can finally create the actual HTML to return. Create a `ShowGreeting` component (explained below), but only if the greeting was read successfully from the blockchain. -```tsx - @@ -481,7 +481,7 @@ const { chains, publicClient, webSocketPublicClient } = configureChains( [ publicProvider(), ], -) +) const { connectors } = getDefaultWallets({ appName: 'My wagmi + RainbowKit App', @@ -526,7 +526,7 @@ These days there are a lot of [L2 scaling solution](https://ethereum.org/en/laye http: ['https://rpc.holesky.redstone.xyz'], webSocket: ['wss://rpc.holesky.redstone.xyz/ws'], }, - public: { + public: { http: ['https://rpc.holesky.redstone.xyz'], webSocket: ['wss://rpc.holesky.redstone.xyz/ws'], }, @@ -543,7 +543,7 @@ These days there are a lot of [L2 scaling solution](https://ethereum.org/en/laye const { chains, publicClient, webSocketPublicClient } = configureChains( [ holesky, sepolia, redstoneHolesky ], [ publicProvider(), ], - ) + ) ``` 1. Ensure that the application knows the address for your contracts on the new network. In this case, we modify `src/components/Greeter.tsx`: @@ -552,13 +552,13 @@ These days there are a lot of [L2 scaling solution](https://ethereum.org/en/laye const contractAddrs : AddressPerBlockchainType = { // Holesky 17000: '0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8', - + // Redstone Holesky 17001: '0x4919517f82a1B89a32392E1BF72ec827ba9986D3', - + // Sepolia 11155111: '0x7143d5c190F048C8d19fe325b748b081903E3BF0' - } + } ``` # Conclusion {#conclusion} From e8ba281b27f0f78189dd350c733ed6289cc3bbef Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 14:57:36 -0500 Subject: [PATCH 075/368] change https://openethereum.github.io/wiki/Warp-Sync-Snapshot-Format to https://openethereum.github.io/Warp-Sync-Snapshot-Format.html --- .../translations/pl/developers/docs/nodes-and-clients/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pl/developers/docs/nodes-and-clients/index.md b/public/content/translations/pl/developers/docs/nodes-and-clients/index.md index b28130b5340..5243a46b506 100644 --- a/public/content/translations/pl/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/pl/developers/docs/nodes-and-clients/index.md @@ -151,7 +151,7 @@ Hyperledger Besu to klient Ethereum klasy korporacyjnej dla sieci publicznych i - Pełna – pobiera wszystkie bloki (w tym nagłówki, transakcje i paragony) i generuje stan łańcucha bloków stopniowo poprzez wykonanie każdego bloku. - Szybka (domyślna) – pobiera wszystkie bloki (w tym nagłówki, transakcje i paragony), weryfikuje wszystkie nagłówki i pobiera stan i weryfikuje go w nagłówkach. - Lekki – pobiera wszystkie nagłówki bloków, dane bloków i weryfikuje niektóre losowo. -- Synchronizacja warp – co 5000 bloków, węzły wykonają migawkę o krytycznym znaczeniu dla konsensusu. Każdy węzeł może pobrać te zrzuty w sieci, umożliwiając szybką synchronizację. [Więcej o warp](https://openethereum.github.io/wiki/Warp-Sync-Snapshot-Format) +- Synchronizacja warp – co 5000 bloków, węzły wykonają migawkę o krytycznym znaczeniu dla konsensusu. Każdy węzeł może pobrać te zrzuty w sieci, umożliwiając szybką synchronizację. [Więcej o warp](https://openethereum.github.io/Warp-Sync-Snapshot-Format.html) - Synchronizacja beam – tryb synchronizacji, który umożliwia szybsze działanie. Nie wymaga długich oczekiwań na synchronizację, zamiast tego wypełnia dane z upływem czasu. [Więcej o beam](https://medium.com/@jason.carver/intro-to-beam-sync-a0fd168be14a) - Synchronizacja nagłówka – możesz użyć zaufanego punktu kontrolnego, aby rozpocząć synchronizację od nowszego nagłówka, a następnie pozostawić to procesowi w tle, aby ostatecznie wypełnić luki From b3b997093f38b6d92e2d6004fcb4903f777ebf88 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:00:01 -0500 Subject: [PATCH 076/368] change https://docs.alchemy.com/docs/submitted-your-smart-contract-to-etherscan to https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan --- .../tutorials/hello-world-smart-contract/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md index 2db6baca805..f20d05ed50d 100644 --- a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md @@ -16,14 +16,14 @@ published: 2021-03-31 Se você é novo no desenvolvimento de blockchain e não sabe por onde começar, ou se apenas deseja entender como implementar ou interagir com contratos inteligentes, este guia é para você. Vamos criar e implantar um contrato inteligente simples na rede de teste Goerli usando uma carteira virtual [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) e [Alchemy](https://alchemyapi.io/eth) (não se preocupe se você ainda não entendeu o que isso significa, nós explicaremos). > **Atenção** -> +> > Aviso de descontinuidade -> +> > Para este guia inteiro, a rede de teste Goerli está sendo usada para criação e implantação de contratos inteligentes. Entretanto, por favor note que a Ethereum Foundation anunciou que a [Goerli será descontinuada em breve](https://www.alchemy.com/blog/goerli-faucet-deprecation). -> +> > Nós recomendamos você usar a [Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) e [faucets Sepolia](https://sepoliafaucet.com/) para este tutorial. -Na [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) deste tutorial, veremos como podemos interagir com nosso contrato inteligente, assim que for implantado aqui, e na [parte 3](https://docs.alchemy.com/docs/submitted-your-smart-contract-to-etherscan), abordaremos como publicá-lo no Etherscan. +Na [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) deste tutorial, veremos como podemos interagir com nosso contrato inteligente, assim que for implantado aqui, e na [parte 3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan), abordaremos como publicá-lo no Etherscan. Caso surjam perguntas em qualquer momento, sinta-se à vontade para falar no Discord da [Alchemy](https://discord.gg/gWuC7zB)! @@ -66,7 +66,7 @@ Para verificar novamente que temos saldo, vamos fazer uma solicitação através ``` > **OBSERVAÇÃO:** este resultado é em wei não em ETH. Lembre-se de que "Wei" é a menor unidade de ether. A conversão de wei para ETH é 1 ETH = 1018 wei. Desta maneira, se convertermos 0x2B5E3AF16B1880000 em decimal obteremos 5\*10¹⁸, o que equivale a 5 ETH. -> +> > Ufa! Nosso dinheiro de imitação está todo aí . ## Passo 6: Inicialize nosso projeto {#step-6} From 07b8775364f3384bfba45622608878b8d66ba19a Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:02:17 -0500 Subject: [PATCH 077/368] change https://docs.kurtosis.com/next/install#ii-install-the-cli to https://docs.kurtosis.com/install#ii-install-the-cli --- .../index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md index f581691ba42..d2692c0d1aa 100644 --- a/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md +++ b/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md @@ -38,7 +38,7 @@ In this guide, the Kurtosis eth-network-package spins up a local Ethereum testne Before you proceed, make sure you have: - [Installed and started the Docker engine](https://docs.kurtosis.com/next/install#i-install--start-docker) on your local machine -- [Installed the Kurtosis CLI](https://docs.kurtosis.com/next/install#ii-install-the-cli) (or upgraded it to the latest release, if you already have the CLI installed) +- [Installed the Kurtosis CLI](https://docs.kurtosis.com/install#ii-install-the-cli) (or upgraded it to the latest release, if you already have the CLI installed) - Installed [Node.js](https://nodejs.org/en), [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable), and [npx](https://www.npmjs.com/package/npx) (for your dApp environment) ## Instantiating a local Ethereum testnet {#instantiate-testnet} From 64787ad74c4c6437b76696195bc3de5d859f68c0 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:03:52 -0500 Subject: [PATCH 078/368] change https://docs.kurtosis.com/concepts-reference/enclaves to https://docs.kurtosis.com/advanced-concepts/enclaves -- change concept-reference to advanced-concepts --- .../index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md index d2692c0d1aa..67c9952477a 100644 --- a/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md +++ b/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md @@ -95,7 +95,7 @@ Congratulations! You used Kurtosis to instantiate a local Ethereum testnet, with ### Review {#review-instantiate-testnet} -In this section, you executed a command that directed Kurtosis to use the [`eth-network-package` hosted remotely on GitHub](https://github.com/kurtosis-tech/eth-network-package) to spin up a local Ethereum testnet within a Kurtosis [Enclave](https://docs.kurtosis.com/concepts-reference/enclaves/). Inside your enclave, you will find both "file artifacts" and "user services". +In this section, you executed a command that directed Kurtosis to use the [`eth-network-package` hosted remotely on GitHub](https://github.com/kurtosis-tech/eth-network-package) to spin up a local Ethereum testnet within a Kurtosis [Enclave](https://docs.kurtosis.com/advanced-concepts/enclaves/). Inside your enclave, you will find both "file artifacts" and "user services". The [File Artifacts](https://docs.kurtosis.com/concepts-reference/files-artifacts/) in your enclave include all the data generated and utilized to bootstrap the EL and CL clients. The data was created using the `prelaunch-data-generator` service built from this [Docker image](https://github.com/ethpandaops/ethereum-genesis-generator) From 79db35940380440eab91a051ef7783c8b7440356 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:05:04 -0500 Subject: [PATCH 079/368] change https://docs.kurtosis.com/concepts-reference/files-artifacts to https://docs.kurtosis.com/advanced-concepts/files-artifacts --- .../index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md index 67c9952477a..000927142c0 100644 --- a/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md +++ b/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md @@ -97,7 +97,7 @@ Congratulations! You used Kurtosis to instantiate a local Ethereum testnet, with In this section, you executed a command that directed Kurtosis to use the [`eth-network-package` hosted remotely on GitHub](https://github.com/kurtosis-tech/eth-network-package) to spin up a local Ethereum testnet within a Kurtosis [Enclave](https://docs.kurtosis.com/advanced-concepts/enclaves/). Inside your enclave, you will find both "file artifacts" and "user services". -The [File Artifacts](https://docs.kurtosis.com/concepts-reference/files-artifacts/) in your enclave include all the data generated and utilized to bootstrap the EL and CL clients. The data was created using the `prelaunch-data-generator` service built from this [Docker image](https://github.com/ethpandaops/ethereum-genesis-generator) +The [File Artifacts](https://docs.kurtosis.com/advanced-concepts/files-artifacts/) in your enclave include all the data generated and utilized to bootstrap the EL and CL clients. The data was created using the `prelaunch-data-generator` service built from this [Docker image](https://github.com/ethpandaops/ethereum-genesis-generator) User services display all the containerized services operating in your enclave. You will notice that a single node, featuring both an EL client and a CL client, has been created. From f50805fbe752a675a3f65786556370a8a9082837 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:07:44 -0500 Subject: [PATCH 080/368] change https://docs.kurtosis.com/next/install#i-install--start-docker to https://docs.kurtosis.com/install/#i-install--start-docker --- .../index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md index 000927142c0..18ae61a95ae 100644 --- a/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md +++ b/public/content/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md @@ -37,7 +37,7 @@ In this guide, the Kurtosis eth-network-package spins up a local Ethereum testne Before you proceed, make sure you have: -- [Installed and started the Docker engine](https://docs.kurtosis.com/next/install#i-install--start-docker) on your local machine +- [Installed and started the Docker engine](https://docs.kurtosis.com/install/#i-install--start-docker) on your local machine - [Installed the Kurtosis CLI](https://docs.kurtosis.com/install#ii-install-the-cli) (or upgraded it to the latest release, if you already have the CLI installed) - Installed [Node.js](https://nodejs.org/en), [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable), and [npx](https://www.npmjs.com/package/npx) (for your dApp environment) From 09259b08196703849cf6537760216898b62d37b8 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:10:14 -0500 Subject: [PATCH 081/368] change https://wiki.metagame.wtf/docs/great-houses/houses-of-daos to https://wiki.metagame.wtf/great-houses/house-of-daos --- public/content/translations/ha/dao/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ha/dao/index.md b/public/content/translations/ha/dao/index.md index 549498c0979..bde6589b748 100644 --- a/public/content/translations/ha/dao/index.md +++ b/public/content/translations/ha/dao/index.md @@ -148,7 +148,7 @@ _Yawanci ana amfani da shi don ingantawa da ƙa'idodin gwamnati da [dapps](/glos ### Maƙalun DAO {#dao-articles} - [Menene DAO?](https://aragon.org/dao) - [Aragon](https://aragon.org/) -- [Gidan DAOs](https://wiki.metagame.wtf/docs/great-houses/houses-of-daos) - [Metagame](https://wiki.metagame.wtf/) +- [Gidan DAOs](https://wiki.metagame.wtf/great-houses/house-of-daos) - [Metagame](https://wiki.metagame.wtf/) - [Menene DAO kuma menene don haka?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) - [DAOhaus](https://daohaus.club/) - [Yadda Ake Fara DAO-Powered Digital Community](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) - [DAOhaus](https://daohaus.club/) - [Menene DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) - [ Coinmarketcap](https://coinmarketcap.com) From 86bc50779c6e28bde921c4fcfe4d964fc9519980 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:12:42 -0500 Subject: [PATCH 082/368] change https://www.antler.co/blog/daos-and-web3-governance to https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead --- public/content/translations/az/desci/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/az/desci/index.md b/public/content/translations/az/desci/index.md index f616a6c8dc7..1a397944d3d 100644 --- a/public/content/translations/az/desci/index.md +++ b/public/content/translations/az/desci/index.md @@ -68,7 +68,7 @@ Elmi maliyyələşdirmək üçün mövcud standart model, ayrı-ayrı şəxslər Tədqiqatlar göstərdi ki, qrantların nəzərdən keçirilməsi panelləri yüksək keyfiyyətli təklifləri seçməkdə zəif iş görür, çünki müxtəlif panellərə verilən eyni təkliflər tamamilə fərqli nəticələr verir. Maliyyələşmə getdikcə azaldıqca, o, daha intellektual mühafizəkar layihələri olan daha böyük tədqiqatçılardan ibarət daha kiçik bir hovuzda cəmləşib. Təsir, təhrif stimulları möhkəmləndirən və innovasiyaları boğan hiper-rəqabətli maliyyələşdirmə mənzərəsi yaradıb. -Web3, DAO və Web3 tərəfindən geniş şəkildə hazırlanmış müxtəlif təşviq modelləri ilə sınaqdan keçirərək, bu pozulmuş maliyyələşdirmə modelini pozmaq potensialına malikdir. [Retroaktiv ictimai malların maliyyələşdirilməsi](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [kvadrat maliyyələşdirmə](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [DAO idarəetməsi](https://www.antler.co/blog/daos-and-web3-governance) və [tokenləşdirilmiş təşviq strukturları](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) bunlardan bəziləridir. Elmin maliyyələşdirilməsində inqilab edə biləcək Web3 alətləri. +Web3, DAO və Web3 tərəfindən geniş şəkildə hazırlanmış müxtəlif təşviq modelləri ilə sınaqdan keçirərək, bu pozulmuş maliyyələşdirmə modelini pozmaq potensialına malikdir. [Retroaktiv ictimai malların maliyyələşdirilməsi](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [kvadrat maliyyələşdirmə](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [DAO idarəetməsi](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) və [tokenləşdirilmiş təşviq strukturları](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) bunlardan bəziləridir. Elmin maliyyələşdirilməsində inqilab edə biləcək Web3 alətləri. ### IP mülkiyyəti və inkişafı {#ip-ownership} From db55781bda816e318ac75765f90cc746ce320b05 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:15:44 -0500 Subject: [PATCH 083/368] change https://cryptoslate.com/in-ethereum-l2-optimism-2m-bounty-paid to https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid --- .../fa/developers/docs/smart-contracts/security/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md index 19490be6333..4eacdded716 100644 --- a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md @@ -99,7 +99,7 @@ contract VendingMachine { راه اندازی یک برنامه باگ بانتی روش دیگری برای اجرای بررسی کدهای خار‌جی است. جایزه باگ یک پاداش مالی است که به افرادی (معمولاً هکرهای کلاه سفید) که آسیب‌پذیری‌های یک برنامه را کشف می‌کنند، داده می‌شود. -هنگامی که به درستی استفاده می‌شود، پاداش‌های باگ به اعضای جامعه هکر انگیزه می‌دهد تا کد شما را از نظر نقص‌های مهم بررسی کنند. یک مثال واقعی "باگ پول بی‌نهایت" است که به مهاجم اجازه می‌دهد مقدار نامحدودی اتر را در [آپتیمیزم](https://www.optimism.io/) ایجاد کند، یک < یک پروتکل لایه که روی اتریوم اجرا می‌شود. خوشبختانه، یک هکر whitehat [این نقص را کشف کرد](https://www.saurik.com/optimism.html) و به تیم اطلاع داد، [کسب پرداختی بزرگ در این فرآیند انجام شد](https://cryptoslate.com/in-ethereum-l2-optimism-2m-bounty-paid/) بحرانی-اشکال-. +هنگامی که به درستی استفاده می‌شود، پاداش‌های باگ به اعضای جامعه هکر انگیزه می‌دهد تا کد شما را از نظر نقص‌های مهم بررسی کنند. یک مثال واقعی "باگ پول بی‌نهایت" است که به مهاجم اجازه می‌دهد مقدار نامحدودی اتر را در [آپتیمیزم](https://www.optimism.io/) ایجاد کند، یک < یک پروتکل لایه که روی اتریوم اجرا می‌شود. خوشبختانه، یک هکر whitehat [این نقص را کشف کرد](https://www.saurik.com/optimism.html) و به تیم اطلاع داد، [کسب پرداختی بزرگ در این فرآیند انجام شد](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/) بحرانی-اشکال-. یک استراتژی مفید این است که پرداخت برنامه پاداش اشکال را متناسب با مقدار وجوه مورد نظر تنظیم کنید. این رویکرد به‌عنوان «[اشکال مقیاس‌گذاری](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) توصیف می‌شود. انگیزه‌های مالی برای افراد برای افشای مسئولانه آسیب پذیری‌ها به جای سوء استفاده از آنها را ایجاد می‌کند. From b164fe4f5fe67f8032d3b5d344338fce07342131 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:17:12 -0500 Subject: [PATCH 084/368] change https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-network-upgrade-coordination/ to https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination --- public/content/translations/pt-br/eips/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pt-br/eips/index.md b/public/content/translations/pt-br/eips/index.md index 669ba2c0e13..ad9a11d7ab7 100644 --- a/public/content/translations/pt-br/eips/index.md +++ b/public/content/translations/pt-br/eips/index.md @@ -74,6 +74,6 @@ Qualquer pessoa pode criar uma EIP. Antes de enviar uma proposta, é necessário -Conteúdo da página retirado parcialmente do artigo [Coordenação do upgrade da rede e governança do desenvolvimento do protocolo Ethereum (em inglês)](https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-network-upgrade-coordination/) por Hudson Jameson +Conteúdo da página retirado parcialmente do artigo [Coordenação do upgrade da rede e governança do desenvolvimento do protocolo Ethereum (em inglês)](https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) por Hudson Jameson From 6bec4ef6083c1a7179cc49f42e4c45b874b04b58 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:19:37 -0500 Subject: [PATCH 085/368] change https://www.societegenerale.com/en/newsroom-first-financial-transaction-settled-with-a-digital-currency to https://www.societegenerale.com/en/news/newsroom/societe-generale-performs-first-financial-transaction-settled-central-bank-digital --- public/content/translations/pl/enterprise/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pl/enterprise/index.md b/public/content/translations/pl/enterprise/index.md index 9e3216c6ddd..c7dd7a0fb2c 100644 --- a/public/content/translations/pl/enterprise/index.md +++ b/public/content/translations/pl/enterprise/index.md @@ -115,7 +115,7 @@ Oto niektóre aplikacje dla przedsiębiorstw, które zostały wdrożone w public ### Finanse {#finance} - [Santander Bank](https://www.coindesk.com/markets/2019/09/12/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _emisja i rozrachunek obligacji_ -- [Societe Generale](https://www.societegenerale.com/en/newsroom-first-financial-transaction-settled-with-a-digital-currency) _emisja obligacji_ +- [Societe Generale](https://www.societegenerale.com/en/news/newsroom/societe-generale-performs-first-financial-transaction-settled-central-bank-digital) _emisja obligacji_ - [Cadence](https://www.forbes.com/sites/benjaminpirus/2019/10/09/fatburger-and-others-feed-30-million-into-ethereum-for-new-bond-offering/#513870be115b) _oferta obligacji i tokenizacja dla marek FAT_ - [Sila](https://silamoney.com/) _infrastruktura bankowa i płatności ACH jako usługa_ - [Tinlake](https://tinlake.centrifuge.io/) _finansowanie należności za pomocą stokenizowanych aktywów rzeczywistych, takich jak faktury, hipoteki lub tantiemy strumieniowe_ From 3e40c22ab77eb8c2776df57b27270e0508172b1f Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 17 Feb 2025 15:47:02 -0500 Subject: [PATCH 086/368] change https://www.freecodecamp.org/news/what-is-Web3/ to https://www.freecodecamp.org/news/what-is-web3 -- capitalized Web3 is breaking link -- lowercase web3 fixes --- public/content/translations/ar/web3/index.md | 2 +- public/content/translations/be/web3/index.md | 2 +- public/content/translations/cs/web3/index.md | 2 +- public/content/translations/de/web3/index.md | 2 +- public/content/translations/el/web3/index.md | 2 +- public/content/translations/es/web3/index.md | 2 +- public/content/translations/fa/web3/index.md | 2 +- public/content/translations/fil/web3/index.md | 2 +- public/content/translations/fr/web3/index.md | 2 +- public/content/translations/ha/web3/index.md | 2 +- public/content/translations/hi/web3/index.md | 2 +- public/content/translations/hu/web3/index.md | 2 +- public/content/translations/id/web3/index.md | 2 +- public/content/translations/it/web3/index.md | 2 +- public/content/translations/ja/web3/index.md | 2 +- public/content/translations/ko/web3/index.md | 2 +- public/content/translations/ms/web3/index.md | 2 +- public/content/translations/nl/web3/index.md | 2 +- public/content/translations/pcm/web3/index.md | 2 +- public/content/translations/pl/web3/index.md | 2 +- public/content/translations/pt-br/web3/index.md | 2 +- public/content/translations/ru/web3/index.md | 2 +- public/content/translations/sk/web3/index.md | 2 +- public/content/translations/sr/web3/index.md | 2 +- public/content/translations/te/web3/index.md | 2 +- public/content/translations/tl/web3/index.md | 2 +- public/content/translations/tr/web3/index.md | 2 +- public/content/translations/uk/web3/index.md | 2 +- public/content/translations/uz/web3/index.md | 2 +- public/content/translations/vi/web3/index.md | 2 +- public/content/translations/yo/web3/index.md | 2 +- public/content/translations/zh-tw/web3/index.md | 2 +- public/content/translations/zh/web3/index.md | 2 +- public/content/web3/index.md | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/public/content/translations/ar/web3/index.md b/public/content/translations/ar/web3/index.md index 907a9c13fa2..06779ee9512 100644 --- a/public/content/translations/ar/web3/index.md +++ b/public/content/translations/ar/web3/index.md @@ -147,7 +147,7 @@ OnlyFans هو موقع محتوى للبالغين تم إنشاؤه بواسط لا يوجد تعريف دقيق للإصدار الثالث من الويب Web3. فلدى مختلف المشاركين في المجتمع وجهات نظر مختلفة بشأن هذا الموضوع. هنا يوجد بعض من وجهات النظر تلك: -- [ما هو الإصدار الثالث من الويب Web3؟ شرح إنترنت المستقبل اللامركزي](https://www.freecodecamp.org/news/what-is-web3/) – _نادر ضبيط_ +- [ما هو الإصدار الثالث من الويب Web3؟ شرح إنترنت المستقبل اللامركزي](https://www.freecodecamp.org/news/what-is-web3) – _نادر ضبيط_ - [فهم الويب 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _جوش ستارك_ - [ما سبب أهمية الإصدار الثالث من الويب Web3](https://future.a16z.com/why-web3-matters/) — _كريس ديكسون_ - [ما سبب أهمية اللامركزية](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _كريس ديكسون_ diff --git a/public/content/translations/be/web3/index.md b/public/content/translations/be/web3/index.md index aaf606427ec..60a2d849c3c 100644 --- a/public/content/translations/be/web3/index.md +++ b/public/content/translations/be/web3/index.md @@ -147,7 +147,7 @@ Web3 — гэта маладая экасістэма, якая развівае Web3 не мае жорсткага вызначэння. Розныя ўдзельнікі супольнасці маюць розныя погляды на гэта. Here are a few of them: -- [Што такое Web3? Тлумачэнне дэцэнтралізаванага Інтэрнэту будучыні](https://www.freecodecamp.org/news/what-is-web3/) — _Надэр Дабіт_ +- [Што такое Web3? Тлумачэнне дэцэнтралізаванага Інтэрнэту будучыні](https://www.freecodecamp.org/news/what-is-web3) — _Надэр Дабіт_ - [Асэнсаванне Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) — _Джош Старк_ - [Чаму Web3 — гэта важна](https://future.a16z.com/why-web3-matters/) — _Крыс Дыксан_ - [Чаму дэцэнтралізацыя з'яўляецца важнай](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Крыс Дыксан_ diff --git a/public/content/translations/cs/web3/index.md b/public/content/translations/cs/web3/index.md index 22c50a04688..e87dd416363 100644 --- a/public/content/translations/cs/web3/index.md +++ b/public/content/translations/cs/web3/index.md @@ -147,7 +147,7 @@ Jsme teprve na začátku lepšího webu s pomocí Web3, ale díky neustávajíc Web3 není pevně definován. Různí členové komunity mají na jeho definici odlišné pohledy. Zde je několik z nich: -- [Co je Web3? Vysvětlení decentralizovaného internetu budoucnosti](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Co je Web3? Vysvětlení decentralizovaného internetu budoucnosti](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Jak dáváme Web3 smysl](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Proč na Web3 záleží](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Proč na decentralizaci záleží](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/de/web3/index.md b/public/content/translations/de/web3/index.md index 74a2f6a8ec3..76769fe90bd 100644 --- a/public/content/translations/de/web3/index.md +++ b/public/content/translations/de/web3/index.md @@ -147,7 +147,7 @@ Wir stehen erst am Anfang der Entwicklung eines besseren Internets mit Web3, doc Web3 ist nicht starr definiert. Zahlreiche Community-Teilnehmer haben unterschiedliche Ansichten dazu. Hier sind einige von ihnen: -- [Was ist Web3? Das dezentralisierte Internet der Zukunft erklärt](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Was ist Web3? Das dezentralisierte Internet der Zukunft erklärt](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Sinnhaftigkeit von Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) _, Josh Stark_ - [Warum Web3 wichtig ist](https://future.a16z.com/why-web3-matters/) – _Chris Dixon_ - [Warum Dezentralisierung wichtig ist](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) – _Chris Dixon_ diff --git a/public/content/translations/el/web3/index.md b/public/content/translations/el/web3/index.md index 56e167bebe7..acbe78a0ba3 100644 --- a/public/content/translations/el/web3/index.md +++ b/public/content/translations/el/web3/index.md @@ -147,7 +147,7 @@ H πρώτη σύλληψη της ιδέας του Berners-Lee, γνωστή Το Web3 δεν είναι αυστηρά καθορισμένο. Διάφοροι συμμετέχοντες της κοινότητας έχουν διαφορετικές απόψεις για αυτό. Δείτε παρακάτω μερικές: -- [Τι είναι το Web3; Το Αποκεντρωμένο Διαδίκτυο του Μέλλοντος Περιγράφηκε](https://www.freecodecamp.org/news/what-is-web3/) - _Nader Dabit_ +- [Τι είναι το Web3; Το Αποκεντρωμένο Διαδίκτυο του Μέλλοντος Περιγράφηκε](https://www.freecodecamp.org/news/what-is-web3) - _Nader Dabit_ - [Κατανοώντας το Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) - _Josh Stark_ - [Γιατί το Web3 έχει σημασία](https://future.a16z.com/why-web3-matters/) - _Chris Dixon_ - [Γιατί η αποκέντρωσης έχει σημασία](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/es/web3/index.md b/public/content/translations/es/web3/index.md index 6dc2e6de09d..82d02720be4 100644 --- a/public/content/translations/es/web3/index.md +++ b/public/content/translations/es/web3/index.md @@ -147,7 +147,7 @@ Esto es solo el comienzo para crear un mejor Internet con Web3, y a medida que s Web3 no está definida rígidamente. Varios participantes de la comunidad tienen diferentes opiniones al respecto. He aquí algunas de ellas: -- [¿Qué es la Web3? El Internet descentralizado del futuro explicado](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [¿Qué es la Web3? El Internet descentralizado del futuro explicado](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Dar sentido a la Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [¿Por qué es Importante Web3?](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [¿Por qué es importante la Descentralización?](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/fa/web3/index.md b/public/content/translations/fa/web3/index.md index a7d0fd80e4a..4b492090644 100644 --- a/public/content/translations/fa/web3/index.md +++ b/public/content/translations/fa/web3/index.md @@ -147,7 +147,7 @@ Web3 یک اکوسیستم جوان و در حال تکامل است. گاوین Web3 تعریف سفت و محکمی ندارد. شرکت‌کنندگان مختلف جامعه، دیدگاه‌های متفاوتی در مورد آن دارند. چند نمونه از آن‌ها در ادامه ذکر شده است: -- [وب 3 چیست؟ توضیح تعامل غیرمتمرکز آینده](https://www.freecodecamp.org/news/what-is-web3/) – _نادر دبیت_ +- [وب 3 چیست؟ توضیح تعامل غیرمتمرکز آینده](https://www.freecodecamp.org/news/what-is-web3) – _نادر دبیت_ - [درک وب 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _ جاش استارک_ - [چرا وب 3 مهم است](https://future.a16z.com/why-web3-matters/) – _کریس دیکسون_ - [چرا تمرکززدایی مهم است](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _کریس دیکسون_ diff --git a/public/content/translations/fil/web3/index.md b/public/content/translations/fil/web3/index.md index f8b23f5fc3d..314216bcd6a 100644 --- a/public/content/translations/fil/web3/index.md +++ b/public/content/translations/fil/web3/index.md @@ -147,7 +147,7 @@ Nasa simula pa lang tayo ng paggawa ng mas magandang Web sa tulong ng Web3, pero Walang malinaw na pagpapakahulugan sa Web3. May iba't ibang pananaw dito ang iba't ibang kalahok ng komunidad. Narito ang iilan sa kanila: -- [Ano ang Web3? Pagpapaliwanag sa Decentralized Internet ng Hinaharap](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Ano ang Web3? Pagpapaliwanag sa Decentralized Internet ng Hinaharap](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Pag-unawa sa Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Bakit Mahalaga ang Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Bakit Mahalaga ang Decentralization](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/fr/web3/index.md b/public/content/translations/fr/web3/index.md index c04cd7e597d..9c6d6d9fdfb 100644 --- a/public/content/translations/fr/web3/index.md +++ b/public/content/translations/fr/web3/index.md @@ -147,7 +147,7 @@ Nous n'en sommes qu'au début de la création d'un meilleur Web avec le Web3, ma Le Web3 n’est pas strictement défini. Plusieurs participants de la Communauté ont des points de vue différents à ce sujet. Voici quelques-uns d'entre eux : -- [Qu'est-ce que le Web3? L'Internet décentralisé du futur expliqué](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Qu'est-ce que le Web3? L'Internet décentralisé du futur expliqué](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Comprendre le Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Importance du Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Pourquoi la décentralisation est importante](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/ha/web3/index.md b/public/content/translations/ha/web3/index.md index 24069e02a41..f3f573610ae 100644 --- a/public/content/translations/ha/web3/index.md +++ b/public/content/translations/ha/web3/index.md @@ -147,7 +147,7 @@ Mu kawai muna farkone wajen ƙirƙirar abinda yafi Web da Web3, amma muna ci gab Ba'a bayyana Web3 sosai ba. Mahalartar al'umma daban-daban suna da hangen nesa daban-daban game da shi. Ga kadan daga cikin su: -- [Menene Web3? An Bayyana Karkatattun Intanet na Nan Gaba](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Menene Web3? An Bayyana Karkatattun Intanet na Nan Gaba](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [ Fahimta da Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) - _ Josh Stark_ - [Me yasa ake batun Web3](https://future.a16z.com/why-Web3-matters/) - _Chris Dixon_ - [Me yasa ake Batun Karkatattun](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/hi/web3/index.md b/public/content/translations/hi/web3/index.md index a99704a6f8a..b9e44ee92eb 100644 --- a/public/content/translations/hi/web3/index.md +++ b/public/content/translations/hi/web3/index.md @@ -147,7 +147,7 @@ Web3 एक युवा और विकासशील पारिस्थ Web3 सटीकता से परिभाषित नहीं है। विभिन्न समुदाय के प्रतिभागियों के पास इस पर अलग-अलग दृष्टिकोण है। यहां उनमें से कुछ हैं: -- [Web3 क्या है? भविष्य के विकेंद्रीकृत इंटरनेट की व्याख्या](https://www.freecodecamp.org/news/what-is-web3/) – _नादेर डेबिट_ +- [Web3 क्या है? भविष्य के विकेंद्रीकृत इंटरनेट की व्याख्या](https://www.freecodecamp.org/news/what-is-web3) – _नादेर डेबिट_ - [Web 3 की समझ बनाना](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _जोश स्टार्क_ - [Web3 क्यों मायने रखता है](https://future.a16z.com/why-web3-matters/) — _क्रिस डिक्सॉन_ - [विकेंद्रीकरण क्यों मायने रखता है](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _क्रिस डिक्सॉन_ diff --git a/public/content/translations/hu/web3/index.md b/public/content/translations/hu/web3/index.md index 05087eadb7c..c999380d1b9 100644 --- a/public/content/translations/hu/web3/index.md +++ b/public/content/translations/hu/web3/index.md @@ -147,7 +147,7 @@ Ez még csak a kezdete annak, hogy az internet jobbá váljon a Web3-mal, és ah A Web3 nincs szigorúan definiálva. A közösségek különböző résztvevői más-más perspektívával bírnak. Néhány ezek közül: -- [Mi az a Web3? Áttekintés a jövő decentralizált internetéről](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Mi az a Web3? Áttekintés a jövő decentralizált internetéről](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [A Web3 értelmezése](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Miért számít a Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Miért fontos a decentralizáció](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) – _Chris Dixon_ diff --git a/public/content/translations/id/web3/index.md b/public/content/translations/id/web3/index.md index 647385e80ef..5d48333470d 100644 --- a/public/content/translations/id/web3/index.md +++ b/public/content/translations/id/web3/index.md @@ -147,7 +147,7 @@ Kami baru berada pada permulaan untuk menciptakan Web yang lebih baik dengan Web Web3 tidak didefinisikan secara kaku. Berbagai peserta komunitas memiliki sudut pandang yang berbeda mengenai ini. Berikut adalah beberapa di antaranya: -- [Apa itu Web3? Penjelasan Masa Depan Internet yang Terdesentralisasi](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Apa itu Web3? Penjelasan Masa Depan Internet yang Terdesentralisasi](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Memahami Pengertian Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Mengapa Web3 Penting](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Mengapa Desentralisasi Penting](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/it/web3/index.md b/public/content/translations/it/web3/index.md index acbf9d8b422..7f9c8a9adc2 100644 --- a/public/content/translations/it/web3/index.md +++ b/public/content/translations/it/web3/index.md @@ -147,7 +147,7 @@ Siamo solo all'inizio della creazione di un Web migliore con Web3, ma mentre con Il Web3 non ha una definizione rigida. Vari partecipanti della community hanno prospettive differenti al riguardo. Eccone alcune: -- [What is Web3? L'Internet Decentralizzato del Futuro Spiegato](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [What is Web3? L'Internet Decentralizzato del Futuro Spiegato](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Dare Senso al Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Perché Web3 È Importante](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Perché la Decentralizzazione È Importante](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/ja/web3/index.md b/public/content/translations/ja/web3/index.md index 5e85c5f80b0..77109fb9720 100644 --- a/public/content/translations/ja/web3/index.md +++ b/public/content/translations/ja/web3/index.md @@ -147,7 +147,7 @@ Web3によるより良いWebの実現はまだ始まったばかりですが、 Web3とは何かは、厳密に定義されていません。 さまざまなコミュニティが多様な視点を持っています。 下記にこれらのいくつかをご紹介します。 -- [Web3とは? 未来の非中央集権インターネットの説明](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Web3とは? 未来の非中央集権インターネットの説明](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Web3の理解](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) - _Josh Stark_ - [Web3が重要な理由](https://future.a16z.com/why-web3-matters/) - _Chris Dixon_ - [非中央集権化が重要な理由](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/ko/web3/index.md b/public/content/translations/ko/web3/index.md index 5c07a46fcef..28155ad1f0d 100644 --- a/public/content/translations/ko/web3/index.md +++ b/public/content/translations/ko/web3/index.md @@ -147,7 +147,7 @@ Ethereum.org는 중요한 이더리움 콘텐츠를 가능한 많은 언어로 웹3는 한 문장으로 정의되지 않습니다. 다양한 커뮤니티 참가자들은 웹3에 대해 서로 다른 관점을 갖고 있습니다. 다음은 그 중 몇 가지입니다. -- [ 웹3란? 미래의 분산화된 인터넷 살펴보기](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [ 웹3란? 미래의 분산화된 인터넷 살펴보기](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [웹3 이해하기](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [웹3가 중요한 이유](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [탈중앙화가 중요한 이유](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/ms/web3/index.md b/public/content/translations/ms/web3/index.md index e0c43b5a6fa..36f78492f3a 100644 --- a/public/content/translations/ms/web3/index.md +++ b/public/content/translations/ms/web3/index.md @@ -147,7 +147,7 @@ Kami hanya pada permulaan mencipta Web yang lebih baik dengan Web3, tetapi sambi Web3 tidak ditakrifkan secara tegar. Pelbagai peserta komuniti mempunyai perspektif yang berbeza mengenainya. Berikut adalah beberapa daripada mereka: -- [Apakah Web3? Internet Teragih Masa Depan Dijelaskan](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Apakah Web3? Internet Teragih Masa Depan Dijelaskan](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Memahami Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _ Josh Stark_ - [Kepentingan Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Kepentingan Keteragihan](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/nl/web3/index.md b/public/content/translations/nl/web3/index.md index a72a8e59624..620fb79dd08 100644 --- a/public/content/translations/nl/web3/index.md +++ b/public/content/translations/nl/web3/index.md @@ -171,7 +171,7 @@ We staan nog maar aan het begin van een beter Web met Web3, maar naarmate we de Web3 is niet strikt gedefinieerd. Verschillende community-deelnemers hebben er verschillende perspectieven op. Hier zijn er een paar: -- [Wat is Web3? The Decentralized Internet of the Future Explained](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Wat is Web3? The Decentralized Internet of the Future Explained](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Making Sense of Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Why Web3 Matters](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Why Decentralization Matters](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/pcm/web3/index.md b/public/content/translations/pcm/web3/index.md index 91d94beae3a..bdcb914d080 100644 --- a/public/content/translations/pcm/web3/index.md +++ b/public/content/translations/pcm/web3/index.md @@ -147,7 +147,7 @@ Wi just dey start to dey kreate betta Web wit Web3, but as we kontinu to impruf Dem nor rily define Web3. Difrent pipol wey dey patisipate in Web3 get difrent opinion abou am. Hia na few of dem: -- [Wetin bi Web3? Di disentralized intanet of di fushure wey dem Explain](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Wetin bi Web3? Di disentralized intanet of di fushure wey dem Explain](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Hau pesi fit make sense of Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Why We3 Matta](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Why disentralizashon matta](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/pl/web3/index.md b/public/content/translations/pl/web3/index.md index 8c355c68bb5..cbf7a70ac6e 100644 --- a/public/content/translations/pl/web3/index.md +++ b/public/content/translations/pl/web3/index.md @@ -147,7 +147,7 @@ Jesteśmy dopiero na początku tworzenia lepszej sieci z Web3, ale ponieważ nad Web3 nie jest jednoznacznie zdefiniowany. Różni uczestnicy społeczności mają na to różne spojrzenia. Oto kilka z nich: -- [Czym jest Web3? Wyjaśnienie zdecentralizowanego Internetu przyszłości](https://www.freecodecamp.org/news/what-is-web3/) — _Nader Dabit_ +- [Czym jest Web3? Wyjaśnienie zdecentralizowanego Internetu przyszłości](https://www.freecodecamp.org/news/what-is-web3) — _Nader Dabit_ - [Zrozumieć Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) — _Josh Stark_ - [Dlaczego Web3 ma znaczenie](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Dlaczego decentralizacja ma znaczenie](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Chris Dixon_ diff --git a/public/content/translations/pt-br/web3/index.md b/public/content/translations/pt-br/web3/index.md index c9a433e9a23..e60f7f81310 100644 --- a/public/content/translations/pt-br/web3/index.md +++ b/public/content/translations/pt-br/web3/index.md @@ -147,7 +147,7 @@ Estamos apenas no início da criação de uma Web melhor com a Web3, mas à medi Web3 não é rigidamente definida. Vários participantes da comunidade têm diversas perspectivas sobre isso. Veja aqui alguns deles: -- [O que é Web3? A Internet Descentralizada do Futuro Explicada](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [O que é Web3? A Internet Descentralizada do Futuro Explicada](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Compreendendo a Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Por que a Web3 é Importante?](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Por que a descentralização é importante?](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) _Feb-, - Chris Dixon_ diff --git a/public/content/translations/ru/web3/index.md b/public/content/translations/ru/web3/index.md index 8c84338ed7b..16ae5bfff3c 100644 --- a/public/content/translations/ru/web3/index.md +++ b/public/content/translations/ru/web3/index.md @@ -147,7 +147,7 @@ Web3 — это молодая и развивающаяся экосистем У Web3 нет строгого определения. Разные участники сообщества смотрят на эту модель по-разному. Вот некоторые из них: -- [ Что такое Web3? Объяснение децентрализованного Интернета будущего](https://www.freecodecamp.org/news/what-is-web3/) — _Nader Dabit_ +- [ Что такое Web3? Объяснение децентрализованного Интернета будущего](https://www.freecodecamp.org/news/what-is-web3) — _Nader Dabit_ - [Разбираемся в Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) — _Josh Stark_ - [Почему Web3 — это важно](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Почему важна децентрализация](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Chris Dixon_ diff --git a/public/content/translations/sk/web3/index.md b/public/content/translations/sk/web3/index.md index a2f0530d8bb..fc5a953d19d 100644 --- a/public/content/translations/sk/web3/index.md +++ b/public/content/translations/sk/web3/index.md @@ -147,7 +147,7 @@ Sme ešte len na začiatku vytvárania lepšieho webu pomocou Web3, ale vďaka n Web3 nie je pevne definovaný. Rôzni účastníci komunity majú na definíciu Web3 rôzne pohľady. Tu je niekoľko z nich: -- [Čo je Web3? Vysvetlenie decentralizovaného internetu budúcnosti](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Čo je Web3? Vysvetlenie decentralizovaného internetu budúcnosti](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Pochopenie Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Prečo na Web3 záleží](https://future.a16z.com/why-web3-matters/) – _Chris Dixon_ - [Prečo na decentralizácii záleží](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) – _Chris Dixon_ diff --git a/public/content/translations/sr/web3/index.md b/public/content/translations/sr/web3/index.md index 8b2f992f0e5..b7935cc0ec1 100644 --- a/public/content/translations/sr/web3/index.md +++ b/public/content/translations/sr/web3/index.md @@ -147,7 +147,7 @@ Tek smo na početku stvaranja boljeg veba sa Web3, ali kako nastavljamo da unapr Web3 nije rigidno definisan. Različiti članovi zajednice imaju različite poglede na to. Here are a few of them: -- [Šta je Web3? Objašnjenje decentralizovanog interneta budućnosti](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Šta je Web3? Objašnjenje decentralizovanog interneta budućnosti](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Razumevanje platforme Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Džoš Stark_ - [Zašto je Web3 važan](https://future.a16z.com/why-web3-matters/) – _Kris Dikson_ - [Zašto je decentralizacija važna](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) – _Kris Dikson_ diff --git a/public/content/translations/te/web3/index.md b/public/content/translations/te/web3/index.md index af9f696cf7c..b08fc6d74a8 100644 --- a/public/content/translations/te/web3/index.md +++ b/public/content/translations/te/web3/index.md @@ -147,7 +147,7 @@ Web3 ఒక యువ మరియు అభివృద్ధి చెంద Web3 కఠినంగా నిర్వచించబడలేదు. వివిధ కమ్యూనిటీ భాగస్వాములు దానిపై విభిన్న దృక్కోణాలను కలిగి ఉన్నారు. Here are a few of them: -- [Web3 అంటే ఏంటి? ఫ్యూచర్ యొక్క వికేంద్రీకృత ఇంటర్నెట్ వివరించబడింది](https://www.freecodecamp.org/news/what-is-web3/) - _నాడర్ డాబిట్_ +- [Web3 అంటే ఏంటి? ఫ్యూచర్ యొక్క వికేంద్రీకృత ఇంటర్నెట్ వివరించబడింది](https://www.freecodecamp.org/news/what-is-web3) - _నాడర్ డాబిట్_ - [మేకింగ్ సెన్స్ ఆఫ్ Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) - _జోష్ స్టార్క్_ - [Web3 ఎందుకు ముఖ్యమైనది](https://future.a16z.com/why-web3-matters/) — _క్రిస్ డిక్సన్_ - [వికేంద్రీకరణ ఎందుకు ముఖ్యమైనది](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _క్రిస్ డిక్సన్_ diff --git a/public/content/translations/tl/web3/index.md b/public/content/translations/tl/web3/index.md index 5665707f1aa..b01f61fce02 100644 --- a/public/content/translations/tl/web3/index.md +++ b/public/content/translations/tl/web3/index.md @@ -147,7 +147,7 @@ Nasa simula pa lang tayo ng paggawa ng mas magandang Web sa tulong ng Web3, pero Walang malinaw na pagpapakahulugan sa Web3. May iba't ibang pananaw dito ang iba't ibang kalahok ng komunidad. Narito ang ilan sa mga ito: -- [Ano ang Web3? Pagpapaliwanag sa Decentralized Internet ng Hinaharap](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Ano ang Web3? Pagpapaliwanag sa Decentralized Internet ng Hinaharap](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Pagiging Makabulhan ng Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Bakit Mahalaga ang Web3](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Bakit Mahalaga ang Decentralization](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/tr/web3/index.md b/public/content/translations/tr/web3/index.md index 00e787a13d8..1b9b7f2441d 100644 --- a/public/content/translations/tr/web3/index.md +++ b/public/content/translations/tr/web3/index.md @@ -147,7 +147,7 @@ Web3 ile daha iyi bir Web yaratmanın henüz başındayız, ancak bunu destekley Web3 rijit bir şekilde tanımlanmamıştır. Çeşitli topluluk katılımcıları bu konuda farklı bakış açılarına sahiptir. İşte bunlardan birkaçı: -- [Web3 nedir? Geleceğin Merkeziyetsiz İnterneti Açıklandı](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Web3 nedir? Geleceğin Merkeziyetsiz İnterneti Açıklandı](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Web 3'ü Anlamak](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae)–_Josh Stark_ - [Web3 Neden Önemli?](https://future.a16z.com/why-web3-matters/)—_Chris Dixon_ - [Merkeziyetsizlik Neden Önemli?](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/uk/web3/index.md b/public/content/translations/uk/web3/index.md index 767cd45a80c..0c6a3abee87 100644 --- a/public/content/translations/uk/web3/index.md +++ b/public/content/translations/uk/web3/index.md @@ -147,7 +147,7 @@ Web3 — це молода екосистема, що розвивається. Мережа Web3 не має жорсткої регламентації. Різні учасники спільноти мають різне ставлення щодо цього. Ось деякі з них: -- [Що таке Web3? Пояснення децентралізованого інтернету майбутнього](https://www.freecodecamp.org/news/what-is-web3/) — _Надер Дабіт_ +- [Що таке Web3? Пояснення децентралізованого інтернету майбутнього](https://www.freecodecamp.org/news/what-is-web3) — _Надер Дабіт_ - [Розуміння Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) — _ Джош Старк_ - [У чому важливість Web3](https://future.a16z.com/why-web3-matters/) — _Кріс Діксон_ - [У чому важливість децентралізації](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Кріс Діксон_ diff --git a/public/content/translations/uz/web3/index.md b/public/content/translations/uz/web3/index.md index 65f22bdd635..d1448ffb7e9 100644 --- a/public/content/translations/uz/web3/index.md +++ b/public/content/translations/uz/web3/index.md @@ -147,7 +147,7 @@ Biz hali Web3 bilan yaxshiroq Web yaratishning boshidamiz, lekin uni qo‘llab-q Web3 qat’iy belgilangan emas. Jamiyatning turli ishtirokchilari bu borada turlicha qarashlarga ega. Mana ulardan bir nechtasi: -- [Web3 nima? Kelajakning markazlashmagan interneti tushuntirildi](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Web3 nima? Kelajakning markazlashmagan interneti tushuntirildi](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Web 3ni tushunish](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _ Josh Stark_ - [Nega Web3 muhim](https://future.a16z.com/why-web3-matters/) — _Kris Dixon_ - [Markazlashtirmaslik nima uchun muhim](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) — _Kris Dixon_ diff --git a/public/content/translations/vi/web3/index.md b/public/content/translations/vi/web3/index.md index cf0c81f15c1..a1d94a20d03 100644 --- a/public/content/translations/vi/web3/index.md +++ b/public/content/translations/vi/web3/index.md @@ -147,7 +147,7 @@ Chúng tôi mới chỉ ở giai đoạn đầu tạo ra một trang Web tốt h Web3 không được xác định một cách cứng nhắc. Nhiều người tham gia cộng đồng có quan điểm khác nhau về nó. Dưới đây là một số trong những cái nhìn đó: -- [Web3 là gì? Giải thích về Internet phi tập trung của tương lai](https://www.freecodecamp.org/news/what-is-web3/) - _Nader Dabit_ +- [Web3 là gì? Giải thích về Internet phi tập trung của tương lai](https://www.freecodecamp.org/news/what-is-web3) - _Nader Dabit_ - [Ý nghĩa của Web3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) - _Josh Stark_ - [Tại sao Web3 quan trọng](https://future.a16z.com/why-web3-matters/) - _Chris Dixon_ - [Tại sao phi tập trung quan trọng](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/yo/web3/index.md b/public/content/translations/yo/web3/index.md index deb4b9845fd..49684f0c7e6 100644 --- a/public/content/translations/yo/web3/index.md +++ b/public/content/translations/yo/web3/index.md @@ -147,7 +147,7 @@ A si wa ni ibẹrẹ siṣẹda wẹẹbu to dara julọ pẹ̀lú wẹẹbu ket Wẹ́ẹ̀bù kẹta ò ní ìtumọ̀ kan. Àwọn omo ẹgbẹ awujo ní èró ọtọọtọ lori rẹ. Èyí ni díẹ̀ nínú won: -- [Kí ni Wẹ́ẹ̀bù keta? Alaye ọjọ iwaju Intanẹẹti alailakoso](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [Kí ni Wẹ́ẹ̀bù keta? Alaye ọjọ iwaju Intanẹẹti alailakoso](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Mímú itúnmọ jade ninu Wẹẹbu keta](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Kí ní ìdí tí Wẹẹbu kẹta fí ṣe koko](https://future.a16z.com/why-web3-matters/)— _Chris Dixon_ - [Kí ní ìdí tí alailakoso fí ṣe koko](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/zh-tw/web3/index.md b/public/content/translations/zh-tw/web3/index.md index 3312fbb4d30..4f3d2861e28 100644 --- a/public/content/translations/zh-tw/web3/index.md +++ b/public/content/translations/zh-tw/web3/index.md @@ -147,7 +147,7 @@ Web3 是一個年輕且不斷發展的生態系統。 Gavin Wood 在 2014 年創 Web3 並未嚴格定義。 不同社群參與者對它有不同的看法。 請見: -- [什麼是 Web3? 明日去中心化網際網路的相關解說](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [什麼是 Web3? 明日去中心化網際網路的相關解說](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [搞懂 Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [為什麼 Web 3 很重要](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [為什麼去中心化很重要](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/translations/zh/web3/index.md b/public/content/translations/zh/web3/index.md index 8acf87586a1..330e102f7ab 100644 --- a/public/content/translations/zh/web3/index.md +++ b/public/content/translations/zh/web3/index.md @@ -147,7 +147,7 @@ Web3 是一个年轻且不断发展的生态系统。 Gavin Wood 在 2014 年创 Web3 没有严格的定义。 不同的社区参与者对其有不同的看法。 例如: -- [什么是 Web3? 解析未来的去中心化互联网](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [什么是 Web3? 解析未来的去中心化互联网](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [理解 Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _ Josh Stark_ - [为什么 Web3 很重要](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [为什么去中心化很重要](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ diff --git a/public/content/web3/index.md b/public/content/web3/index.md index d072c8f8343..36cf228addf 100644 --- a/public/content/web3/index.md +++ b/public/content/web3/index.md @@ -149,7 +149,7 @@ We are only at the beginning of creating a better Web with Web3, but as we conti Web3 isn’t rigidly defined. Various community participants have different perspectives on it. Here are a few of them: -- [What is Web3? The Decentralized Internet of the Future Explained](https://www.freecodecamp.org/news/what-is-web3/) – _Nader Dabit_ +- [What is Web3? The Decentralized Internet of the Future Explained](https://www.freecodecamp.org/news/what-is-web3) – _Nader Dabit_ - [Making Sense of Web 3](https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae) – _Josh Stark_ - [Why Web3 Matters](https://future.a16z.com/why-web3-matters/) — _Chris Dixon_ - [Why Decentralization Matters](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) - _Chris Dixon_ From 4dc970f26a4e4eb508c8ce4e70c9d855fe4fc83e Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 18 Feb 2025 12:15:52 -0500 Subject: [PATCH 087/368] change https://blog.decentlabs.io/contract-composability-the-building-blocks-of-ethereum-smart-contract-development to https://medium.com/decentlabs/contract-composability-the-building-blocks-of-ethereum-smart-contract-development-bdf3219ffeb9 - https://web.archive.org/web/20210621201609/https://blog.decentlabs.io/contract-composability-the-building-blocks-of-ethereum-smart-contract-development/ same article hosted on medium now --- .../id/developers/docs/smart-contracts/composability/index.md | 2 +- .../pl/developers/docs/smart-contracts/composability/index.md | 2 +- .../ro/developers/docs/smart-contracts/composability/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/translations/id/developers/docs/smart-contracts/composability/index.md b/public/content/translations/id/developers/docs/smart-contracts/composability/index.md index 65c71423a73..fde18dca8ea 100644 --- a/public/content/translations/id/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/id/developers/docs/smart-contracts/composability/index.md @@ -11,7 +11,7 @@ Kontrak pintar bersifat publik di Ethereum dan bisa dianggap sebagai API terbuka ## Tutorial terkait {#related-tutorials} -- [Komposabilitas Kontrak: Blok Pembangun dari Pengembangan Kontrak Pintar Ethereum](https://blog.decentlabs.io/contract-composability-the-building-blocks-of-ethereum-smart-contract-development/) +- [Komposabilitas Kontrak: Blok Pembangun dari Pengembangan Kontrak Pintar Ethereum](https://medium.com/decentlabs/contract-composability-the-building-blocks-of-ethereum-smart-contract-development-bdf3219ffeb9/) - [Mulai pengembangan frontend Dapp Anda dengan create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– Gambaran umum tentang cara menggunakan create-eth-app untuk membuat aplikasi dengan kontrak pintar non-konvensional yang populer._ ## Bacaan lebih lanjut {#further-reading} diff --git a/public/content/translations/pl/developers/docs/smart-contracts/composability/index.md b/public/content/translations/pl/developers/docs/smart-contracts/composability/index.md index 63ca3865ec5..3f44005d86f 100644 --- a/public/content/translations/pl/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/pl/developers/docs/smart-contracts/composability/index.md @@ -11,7 +11,7 @@ Inteligentne kontrakty są publiczne w Ethereum i można je uznać za otwarte AP ## Powiązane samouczki {#related-tutorials} -- [Kompozycyjność kontraktu: elementy konstrukcyjne inteligentnych kontraktów Ethereum](https://blog.decentlabs.io/contract-composability-the-building-blocks-of-ethereum-smart-contract-development/) +- [Kompozycyjność kontraktu: elementy konstrukcyjne inteligentnych kontraktów Ethereum](https://medium.com/decentlabs/contract-composability-the-building-blocks-of-ethereum-smart-contract-development-bdf3219ffeb9/) - [Szybkie rozpoczęcie tworzenia frontendu aplikacji dapp za pomocą create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _— omówienie korzystania z create-eth-app do tworzenia aplikacji z zastosowaniem popularnych inteligentnych kontraktów._ ## Dalsza lektura {#further-reading} diff --git a/public/content/translations/ro/developers/docs/smart-contracts/composability/index.md b/public/content/translations/ro/developers/docs/smart-contracts/composability/index.md index b853907ae27..2d7caab7810 100644 --- a/public/content/translations/ro/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/ro/developers/docs/smart-contracts/composability/index.md @@ -11,7 +11,7 @@ Contractele inteligente sunt publice pe Ethereum și pot fi considerate API-uri ## Tutoriale corelate {#related-tutorials} -- [Combinabilitatea contractului: elementele de bază ale dezvoltării contractelor inteligente Ethereum](https://blog.decentlabs.io/contract-composability-the-building-blocks-of-ethereum-smart-contract-development/) +- [Combinabilitatea contractului: elementele de bază ale dezvoltării contractelor inteligente Ethereum](https://medium.com/decentlabs/contract-composability-the-building-blocks-of-ethereum-smart-contract-development-bdf3219ffeb9/) - [Lansează dezvoltarea frontend-ului aplicației dapp cu create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– O prezentare generală a modului de utilizare a create-eth-app pentru a crea aplicații cu contracte inteligente populare gata de funcţionare._ ## Referințe suplimentare {#further-reading} From b4ed827cf7ebbc0a3ead58b831bf9442e5b87e99 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 18 Feb 2025 12:31:22 -0500 Subject: [PATCH 088/368] change https://proofofpersonhood.com to https://passport.human.tech - spun out of gitcoin https://www.biometricupdate.com/202502/holonym-acquires-gitcoin-passport-in-proof-of-personhood-expansion#:~:text=According%20to%20the%20deal%2C%20Gitcoin,without%20disclosing%20sensitive%20personal%20data. --- public/content/translations/ar/decentralized-identity/index.md | 2 +- public/content/translations/az/decentralized-identity/index.md | 2 +- public/content/translations/bn/decentralized-identity/index.md | 2 +- public/content/translations/fil/decentralized-identity/index.md | 2 +- public/content/translations/kn/decentralized-identity/index.md | 2 +- public/content/translations/ko/decentralized-identity/index.md | 2 +- public/content/translations/mr/decentralized-identity/index.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/content/translations/ar/decentralized-identity/index.md b/public/content/translations/ar/decentralized-identity/index.md index e285bdce062..016d646d2c1 100644 --- a/public/content/translations/ar/decentralized-identity/index.md +++ b/public/content/translations/ar/decentralized-identity/index.md @@ -160,7 +160,7 @@ summaryPoint3: بفضل العملات الرقمية، أصبح لدى المس - **[خدمة مصادقة إثيريوم (EAS)](https://attest.sh/)** - _دفتر الأستاذ/البروتوكول اللامركزي لعمل المصادقات ضمن السلسلة أو خارج السلسلة بخصوص أي شيء._ - **[إثبات الإنسانية](https://www.proofofhumanity.id)** - _إثبات الإنسانية (أو poH) هو نظام للتحقق من الهوية الاجتماعية مبني على إثيريوم._ - **[BrightID](https://www.brightid.org/)** - _ شبكة الهوية الاجتماعية اللامركزية مفتوحة المصدر تسعى إلى إصلاح التحقق من الهوية من خلال إنشاء مخطط اجتماعي وتحليله._ -- **[ جواز إثبات الشخصية](https://proofofpersonhood.com/)** - _مجمع للهوية الرقمية اللامركزية_ +- **[ جواز إثبات الشخصية](https://passport.human.tech/)** - _مجمع للهوية الرقمية اللامركزية_ ## قراءة إضافية {#further-reading} diff --git a/public/content/translations/az/decentralized-identity/index.md b/public/content/translations/az/decentralized-identity/index.md index 62568ac80b3..0b8171e7967 100644 --- a/public/content/translations/az/decentralized-identity/index.md +++ b/public/content/translations/az/decentralized-identity/index.md @@ -160,7 +160,7 @@ Ethereum-dan mərkəzləşdirilməmiş kimlik həlləri üçün əsas kimi istif - **[Ethereum Attestasiya Xidməti (EAS)](https://attest.sh/)** - _ Hər hansı bir şey haqqında zəncirli və ya zəncirdən kənar sertifikatlar əldə etmək üçün mərkəzləşdirilməmiş kitab/protokol._ - **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (or PoH) Ethereum üzərində qurulmuş sosial kimlik yoxlama sistemidir._ - **[BrightID](https://www.brightid.org/)** - _Mərkəzləşdirilməmiş, sosial qrafikin yaradılması və təhlili vasitəsilə kimliyin yoxlanılmasında islahatlar aparmağa çalışan açıq mənbəli sosial kimlik şəbəkəsi._ -- **[Kimliyi təsdiq edən pasport](https://proofofpersonhood.com/)** - _ Mərkəzləşdirilməmiş rəqəmsal kimlik toplayıcısı._ +- **[Kimliyi təsdiq edən pasport](https://passport.human.tech/)** - _ Mərkəzləşdirilməmiş rəqəmsal kimlik toplayıcısı._ - **[walt.id](https://walt.id)** — _Tərtibatçılara və təşkilatlara öz suveren kimlik və NFTs/SBT-lərdən istifadə etməyə imkan verən açıq mənbəli mərkəzləşdirilməmiş kimlik və cüzdan infrastrukturu._ ## Further reading {#further-reading} diff --git a/public/content/translations/bn/decentralized-identity/index.md b/public/content/translations/bn/decentralized-identity/index.md index 5e75f6f0804..f8c97b75860 100644 --- a/public/content/translations/bn/decentralized-identity/index.md +++ b/public/content/translations/bn/decentralized-identity/index.md @@ -160,7 +160,7 @@ summaryPoint3: ক্রিপ্টোকারেন্সির জন্য - **[ইথেরিয়াম অ্যাটেস্টেশন সার্ভিস (EAS)](https://attest.sh/)** - _ যেকোনো বিষয়ে অন-চেইন বা অফ-চেইন প্রত্যয়ন করার জন্য একটি বিকেন্দ্রীকৃত লেজার/প্রটোকল।_ - **[প্রুফ অফ হিউম্যানিটি](https://www.proofofhumanity.id)** - _মানবতার প্রমাণ (বা PoH) হল ইথেরিয়াম-এ নির্মিত একটি সামাজিক পরিচয় যাচাইকরণ ব্যবস্থা।_ - **[BrightID](https://www.brightid.org/)** - _একটি বিকেন্দ্রীভূত, ওপেন সোর্স সামাজিক পরিচয় নেটওয়ার্ক যা একটি সামাজিক গ্রাফ তৈরি এবং বিশ্লেষণের মাধ্যমে পরিচয় যাচাইকরণ সংস্কার করতে চাইছে।_ -- **[প্রুফ অফ পার্সনহুড পাসপোর্ট](https://proofofpersonhood.com/)** - _ একটি বিকেন্দ্রীভূত ডিজিটাল পরিচয় সমষ্টিকারী।_ +- **[প্রুফ অফ পার্সনহুড পাসপোর্ট](https://passport.human.tech/)** - _ একটি বিকেন্দ্রীভূত ডিজিটাল পরিচয় সমষ্টিকারী।_ ## Further reading {#further-reading} diff --git a/public/content/translations/fil/decentralized-identity/index.md b/public/content/translations/fil/decentralized-identity/index.md index 9c3bb29b3d6..1ac69336c26 100644 --- a/public/content/translations/fil/decentralized-identity/index.md +++ b/public/content/translations/fil/decentralized-identity/index.md @@ -160,7 +160,7 @@ Maraming malalaking proyekto ang gumagamit ng Ethereum bilang pundasyon para sa - **[Ethereum Attestation Service (EAS)](https://attest.sh/)** - _Isang decentralized ledger/protocol para sa paggawa ng mga on-chain o off-chain na attestation tungkol sa anumang bagay._ - **[Proof of Humanity](https://www.proofofhumanity.id)** - _Ang Proof of Humanity (o PoH) ay isang social identity verification system na ginawa sa Ethereum._ - **[BrightID](https://www.brightid.org/)** - _ Isang decentralized at open-source na social identity network na naglalayong baguhin ang pag-verify ng identity sa pamamagitan ng paggawa at pagsusuri ng isang social graph._ -- **[Proof-of-personhood Passport](https://proofofpersonhood.com/)** - _Isang decentralized digital identity aggregator._ +- **[Proof-of-personhood Passport](https://passport.human.tech/)** - _Isang decentralized digital identity aggregator._ ## Karagdagang pagbabasa {#further-reading} diff --git a/public/content/translations/kn/decentralized-identity/index.md b/public/content/translations/kn/decentralized-identity/index.md index 300ba950330..ce1ae3068b5 100644 --- a/public/content/translations/kn/decentralized-identity/index.md +++ b/public/content/translations/kn/decentralized-identity/index.md @@ -160,7 +160,7 @@ DIDs ಡಿಐಡಿಗಳನ್ನು ಬ್ಲಾಕ್‍ಚೈನ್‍ನ - **[ಇಥಿರಿಯಮ್ ದೃಢೀಕರಣ ಸೇವೆ (ENS)](https://attest.sh/)** - _ ಯಾವುದೇ ವಿಷಯದ ಬಗ್ಗೆ ಆನ್-ಚೈನ್ ಅಥವಾ ಆಫ್-ಚೈನ್ ದೃಢೀಕರಣಗಳನ್ನು ಮಾಡಲು ವಿಕೇಂದ್ರೀಕೃತ ಲೆಡ್ಜರ್ / ಪ್ರೋಟೋಕಾಲ್._ - **[ಮಾನವೀಯತೆಯ ಪುರಾವೆ](https://www.proofofhumanity.id)** - _ಮಾನವೀಯತೆಯ ಪುರಾವೆ (ಅಥವಾ PoH) ಇಥಿರಿಯಮ್‍ನಲ್ಲಿ ನಿರ್ಮಿಸಲಾದ ಸಾಮಾಜಿಕ ಗುರುತಿನ ಪರಿಶೀಲನಾ ವ್ಯವಸ್ಥೆಯಾಗಿದೆ._ - **[BrightID](https://www.brightid.org/)** - _ಸಾಮಾಜಿಕ ಗ್ರಾಫ್‍ನ ರಚನೆ ಮತ್ತು ವಿಶ್ಲೇಷಣೆಯ ಮೂಲಕ ಗುರುತಿನ ಪರಿಶೀಲನೆಯನ್ನು ಸುಧಾರಿಸಲು ಪ್ರಯತ್ನಿಸುವ ವಿಕೇಂದ್ರೀಕೃತ, ಮುಕ್ತ-ಮೂಲ ಸಾಮಾಜಿಕ ಗುರುತಿನ ನೆಟ್‍ವರ್ಕ್._ -- **[ಪ್ರೂಫ್-ಆಫ್-ಪರ್ಸನಾಲಿಟಿ ಪಾಸ್‍ಪೋರ್ಟ್](https://proofofpersonhood.com/)** - _ವಿಕೇಂದ್ರೀಕೃತ ಡಿಜಿಟಲ್ ಗುರುತಿನ ಅಗ್ರಿಗೇಟರ್._ +- **[ಪ್ರೂಫ್-ಆಫ್-ಪರ್ಸನಾಲಿಟಿ ಪಾಸ್‍ಪೋರ್ಟ್](https://passport.human.tech/)** - _ವಿಕೇಂದ್ರೀಕೃತ ಡಿಜಿಟಲ್ ಗುರುತಿನ ಅಗ್ರಿಗೇಟರ್._ ## Further reading {#further-reading} diff --git a/public/content/translations/ko/decentralized-identity/index.md b/public/content/translations/ko/decentralized-identity/index.md index 407b45daa76..258a3c2eb17 100644 --- a/public/content/translations/ko/decentralized-identity/index.md +++ b/public/content/translations/ko/decentralized-identity/index.md @@ -160,7 +160,7 @@ DID는 블록체인에 저장되기 때문에 누구든지 이더리움에서 - **[EAS(Ethereum Attestation Service)](https://attest.sh/)** - _모든 것에 대한 온체인 또는 오프체인 증명을 만들 수 있는 탈중앙화된 장부/프로토콜입니다._ - **[인간 증명](https://www.proofofhumanity.id)** - _인간 증명(PoH: Proof of Humanity)은 이더리움 기반의 소셜 신원 증명 시스템입니다._ - **[BrightID](https://www.brightid.org/)** - _소셜 그래프를 만들고 분석함으로써 신원 증명을 개혁하고자 하는 탈중앙화된 오픈소스의 소셜 신원 증명 네트워크입니다._ -- **[개인 증명 여권](https://proofofpersonhood.com/)** - _탈중앙화 디지털 신원 정보 종합 플랫폼입니다._ +- **[개인 증명 여권](https://passport.human.tech/)** - _탈중앙화 디지털 신원 정보 종합 플랫폼입니다._ ## 더 읽을 거리 {#further-reading} diff --git a/public/content/translations/mr/decentralized-identity/index.md b/public/content/translations/mr/decentralized-identity/index.md index a7d72c980cb..59e677a2739 100644 --- a/public/content/translations/mr/decentralized-identity/index.md +++ b/public/content/translations/mr/decentralized-identity/index.md @@ -160,7 +160,7 @@ Ethereum ब्लॉकचेनवरील [स्मार्ट कॉन - **[Ethereum प्रमाणीकरण सेवा (EAS)](https://attest.sh/)** - _कोणत्याही गोष्टीबद्दल ऑन-चेन किंवा ऑफ-चेन साक्ष्यीकरण करण्यासाठी विकेंद्रीकृत लेजर/प्रोटोकॉल._ - **[मानवतेचा पुरावा](https://www.proofofhumanity.id)** - _पुरावा मानवता (किंवा PoH) ही Ethereum वर तयार केलेली सामाजिक ओळख पडताळणी प्रणाली आहे._ - **[BrightID](https://www.brightid.org/)** - _एक विकेंद्रित, ओपन-सोर्स सोशल आयडेंटिटी नेटवर्क सामाजिक आलेख निर्मिती आणि विश्लेषणाद्वारे ओळख पडताळणीमध्ये सुधारणा करू इच्छित आहे._ -- **[प्रुफ-ऑफ-पर्सनहुड पासपोर्ट](https://proofofpersonhood.com/)** - _विकेंद्रित डिजिटल ओळख एकत्रित करणारा._ +- **[प्रुफ-ऑफ-पर्सनहुड पासपोर्ट](https://passport.human.tech/)** - _विकेंद्रित डिजिटल ओळख एकत्रित करणारा._ ## Further reading {#further-reading} From 38075ad675ebd0aecb0f513f748c42ef58a70e74 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 18 Feb 2025 12:33:43 -0500 Subject: [PATCH 089/368] change https://businesstechguides.co/what-are-decentralized-social-networks to https://eawosika.com/what-are-decentralized-social-networks --- public/content/translations/ar/social-networks/index.md | 2 +- public/content/translations/az/social-networks/index.md | 2 +- public/content/translations/bn/social-networks/index.md | 2 +- public/content/translations/fil/social-networks/index.md | 2 +- public/content/translations/kn/social-networks/index.md | 2 +- public/content/translations/ko/social-networks/index.md | 2 +- public/content/translations/mr/social-networks/index.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/content/translations/ar/social-networks/index.md b/public/content/translations/ar/social-networks/index.md index 6dbe01451b5..0afdeaf0110 100644 --- a/public/content/translations/ar/social-networks/index.md +++ b/public/content/translations/ar/social-networks/index.md @@ -105,7 +105,7 @@ summaryPoint3: الرموز المميزة و NFTs تنشئ أساليب جدي - [Web3 holds the promise of decentralized, community-powered social networks (يبشر Web3 بشبكات اجتماعية لامركزية مدعومة من المجتمع](https://venturebeat.com/2022/02/26/web3-holds-the-promise-of-decentralized-community-powered-social-networks/) - _سوميت جوش_ - [An Overview of the Blockchain Social Media Landscape (نظرة عامة على وسائل التواصل الاجتماعي لسلسلة الكتلة](https://www.gemini.com/cryptopedia/blockchain-social-media-decentralized-social-media) — _Gemini Cryptopedia_ - [How Blockchain Can Solve Social Media Privacy (كيف يمكن لسلسلة الكتل أن تحل مشكلة الخصوصية في وسائل التواصل الاجتماعي)](https://www.investopedia.com/news/ethereum-blockchain-social-media-privacy-problem-linkedin-indorse/) — _برابلين باجباي_ -- [Social Media Networks Are Coming To The Blockchain (انتقال وسائل التواصل الاجتماعي إلى سلسلة الكتل](https://businesstechguides.co/what-are-decentralized-social-networks) — _إيمانويل أوسيكا_ +- [Social Media Networks Are Coming To The Blockchain (انتقال وسائل التواصل الاجتماعي إلى سلسلة الكتل](https://eawosika.com/what-are-decentralized-social-networks) — _إيمانويل أوسيكا_ - [Sufficient Decentralization for Social Networks (لامركزية كافية للشبكات الاجتماعية](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) _فارون سرينيفاسان_ ### مقاطع الفيديو {#videos} diff --git a/public/content/translations/az/social-networks/index.md b/public/content/translations/az/social-networks/index.md index 06a43554906..e22e37cae5f 100644 --- a/public/content/translations/az/social-networks/index.md +++ b/public/content/translations/az/social-networks/index.md @@ -111,7 +111,7 @@ Rinkeby test şəbəkəsində beta mərhələsini başa vurduqdan sonra, Reddit - [Web3 mərkəzləşdirilməmiş, icma dəstəkli sosial şəbəkələrə inam verir](https://venturebeat.com/2022/02/26/web3-holds-the-promise-of-decentralized-community-powered-social-networks/) — _Sumit Ghosh_ - [Blockchain Sosial Media Landşaftına Baxış](https://www.gemini.com/cryptopedia/blockchain-social-media-decentralized-social-media) — *Gemini Kriptopediyası* - [Blokçeyn Sosial Media Məxfiliyini Necə Həll edə bilər](https://www.investopedia.com/news/ethereum-blockchain-social-media-privacy-problem-linkedin-indorse/) — _Prableen Bajpai_ -- [Sosial Media Şəbəkələri Blockchain-ə gəlir](https://businesstechguides.co/what-are-decentralized-social-networks) — _Emmanuel Awosika_ +- [Sosial Media Şəbəkələri Blockchain-ə gəlir](https://eawosika.com/what-are-decentralized-social-networks) — _Emmanuel Awosika_ - [Sosial şəbəkələr üçün kifayət qədər mərkəzsizləşdirmə](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) — _Varun Srinivasan_ diff --git a/public/content/translations/bn/social-networks/index.md b/public/content/translations/bn/social-networks/index.md index 4017963bba3..6aded688fef 100644 --- a/public/content/translations/bn/social-networks/index.md +++ b/public/content/translations/bn/social-networks/index.md @@ -105,7 +105,7 @@ Twitter Blue জানুয়ারী 2021-এ [NFT সাপোর্ট ক - [Web3 বিকেন্দ্রীভূত, সম্প্রদায়-এর প্রতিশ্রুতি রাখে- চালিত সামাজিক নেটওয়ার্কগুলি](https://venturebeat.com/2022/02/26/web3-holds-the-promise-of-decentralized-community-powered-social-networks/) — _সুমিত ঘোষ_ - [ব্লকচেন সোশ্যাল মিডিয়া ল্যান্ডস্কেপের একটি ওভারভিউ](https://www.gemini.com/cryptopedia/blockchain-social-media-decentralized-social-media) — _Gemini ক্রিপ্টোপিডিয়া_ - [ব্লকচেন কীভাবে সামাজিক মিডিয়া গোপনীয়তার সমাধান করতে পারে](https://www.investopedia.com/news/ethereum-blockchain-social-media-privacy-problem-linkedin-indorse/) — _প্রবলেন বাজপাই_ -- [সোশ্যাল মিডিয়া নেটওয়ার্কগুলি ব্লকচেইনে আসছে](https://businesstechguides.co/what-are-decentralized-social-networks) — _ইমানুয়েল আওসিকা_ +- [সোশ্যাল মিডিয়া নেটওয়ার্কগুলি ব্লকচেইনে আসছে](https://eawosika.com/what-are-decentralized-social-networks) — _ইমানুয়েল আওসিকা_ - [সামাজিক নেটওয়ার্কগুলির জন্য পর্যাপ্ত বিকেন্দ্রীকরণ](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) — _বরুণ শ্রীনিবাসান _ ### Videos {#videos} diff --git a/public/content/translations/fil/social-networks/index.md b/public/content/translations/fil/social-networks/index.md index 222f1ea0711..8867a91e33c 100644 --- a/public/content/translations/fil/social-networks/index.md +++ b/public/content/translations/fil/social-networks/index.md @@ -105,7 +105,7 @@ Noong Mayo 2022, [inanunsyo ng Instagram ang suporta para sa NFTs sa Ethereum at - [Ang Web3 ang susi mga social network na decentralized at pinapatakbo ng komunidad](https://venturebeat.com/2022/02/26/web3-holds-the-promise-of-decentralized-community-powered-social-networks/) — _Sumit Ghosh_ - [Pangkalahatang-ideya ng Landscape ng Blockchain Social Media](https://www.gemini.com/cryptopedia/blockchain-social-media-decentralized-social-media) — _Gemini Cryptopedia_ - "[Paano Malulutas ng Blockchain ang Problema sa Privacy sa Social Media](https://www.investopedia.com/news/ethereum-blockchain-social-media-privacy-problem-linkedin-indorse/) — _Prableen Bajpai_." -- [Papunta na sa Blockchain ang Mga Social Media Network](https://businesstechguides.co/what-are-decentralized-social-networks) — _Emmanuel Awosika_ +- [Papunta na sa Blockchain ang Mga Social Media Network](https://eawosika.com/what-are-decentralized-social-networks) — _Emmanuel Awosika_ - [Sapat na Decentralization para sa Mga Social Network](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) — _Varun Srinivasan_ ### Videos {#videos} diff --git a/public/content/translations/kn/social-networks/index.md b/public/content/translations/kn/social-networks/index.md index de14c45e34c..81cc4027a12 100644 --- a/public/content/translations/kn/social-networks/index.md +++ b/public/content/translations/kn/social-networks/index.md @@ -105,7 +105,7 @@ summaryPoint3: ಟೋಕನ್‍ಗಳು ಮತ್ತು NFTಗಳು ವಿ - [ವೆಬ್ 3 ವಿಕೇಂದ್ರೀಕೃತ, ಸಮುದಾಯ-ಚಾಲಿತ ಸಾಮಾಜಿಕ ನೆಟ್ ವರ್ಕ್ ಗಳ ಭರವಸೆಯನ್ನು ಹೊಂದಿದೆ](https://venturebeat.com/2022/02/26/web3-holds-the-promise-of-decentralized-community-powered-social-networks/) - _ಸುಮಿತ್ ಘೋಷ್_ - [ಬ್ಲಾಕ್ ಚೈನ್ ಸಾಮಾಜಿಕ ಮಾಧ್ಯಮ ಭೂದೃಶ್ಯದ ಅವಲೋಕನ](https://www.gemini.com/cryptopedia/blockchain-social-media-decentralized-social-media) - _ಜೆಮಿನಿ ಕ್ರಿಪ್ಟೋಪೀಡಿಯಾ_ - [ಸಾಮಾಜಿಕ ಮಾಧ್ಯಮ ಗೌಪ್ಯತೆಯನ್ನು ಬ್ಲಾಕ್ ಚೈನ್ ಹೇಗೆ ಪರಿಹರಿಸಬಹುದು](https://www.investopedia.com/news/ethereum-blockchain-social-media-privacy-problem-linkedin-indorse/) - _ಪ್ರಬ್ಲೀನ್ ಬಾಜಪೇಯಿ_ -- [ಸಾಮಾಜಿಕ ಮಾಧ್ಯಮ ನೆಟ್ ವರ್ಕ್ ಗಳು ಬ್ಲಾಕ್ ಚೈನ್ ಗೆ ಬರುತ್ತಿವೆ](https://businesstechguides.co/what-are-decentralized-social-networks) - _Emmanuel Awosika_ +- [ಸಾಮಾಜಿಕ ಮಾಧ್ಯಮ ನೆಟ್ ವರ್ಕ್ ಗಳು ಬ್ಲಾಕ್ ಚೈನ್ ಗೆ ಬರುತ್ತಿವೆ](https://eawosika.com/what-are-decentralized-social-networks) - _Emmanuel Awosika_ - [ಸಾಮಾಜಿಕ ನೆಟ್ ವರ್ಕ್ ಗಳಿಗೆ ಸಾಕಷ್ಟು ವಿಕೇಂದ್ರೀಕರಣ](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) - _ ವರುಣ್ ಶ್ರೀನಿವಾಸನ್_ ### Videos {#videos} diff --git a/public/content/translations/ko/social-networks/index.md b/public/content/translations/ko/social-networks/index.md index d62ec0aa90e..a281a65e2a8 100644 --- a/public/content/translations/ko/social-networks/index.md +++ b/public/content/translations/ko/social-networks/index.md @@ -105,7 +105,7 @@ Reddit은 [ERC-20 토큰](/developers/docs/standards/tokens/erc-20/) 기반의 - [Web3는 탈중앙화, 커뮤니티 기반 소셜 네트워크의 핵심이다](https://venturebeat.com/2022/02/26/web3-holds-the-promise-of-decentralized-community-powered-social-networks/) — *Sumit Ghosh* - [블록체인 소셜 미디어의 개요](https://www.gemini.com/cryptopedia/blockchain-social-media-decentralized-social-media) — *Gemini Cryptopedia* - [블록체인은 어떻게 소셜 미디어의 개인 정보 문제를 어떻게 해결하는가](https://www.investopedia.com/news/ethereum-blockchain-social-media-privacy-problem-linkedin-indorse/) — *Prableen Bajpai* -- [블록체인에 소셜 미디어 네트워크가 다가오고 있다](https://businesstechguides.co/what-are-decentralized-social-networks) — *Emmanuel Awosika* +- [블록체인에 소셜 미디어 네트워크가 다가오고 있다](https://eawosika.com/what-are-decentralized-social-networks) — *Emmanuel Awosika* - [소셜 네트워크를 위한 충분한 탈중앙화](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) — _Varun Srinivasan_ ### 영상 {#videos} diff --git a/public/content/translations/mr/social-networks/index.md b/public/content/translations/mr/social-networks/index.md index d4d526abc36..36140fa2149 100644 --- a/public/content/translations/mr/social-networks/index.md +++ b/public/content/translations/mr/social-networks/index.md @@ -105,7 +105,7 @@ r/क्रिप्टोकरंसी सबरेडिट ["मून" न - [Web3 विकेंद्रित, समुदाय- समर्थित सोशल नेटवर्क्स](https://venturebeat.com/2022/02/26/web3-holds-the-promise-of-decentralized-community-powered-social-networks/) — _सुमित घोष_ - [ब्लॉकचेन सोशल मीडिया लँडस्केपचे विहंगावलोकन](https://www.gemini.com/cryptopedia/blockchain-social-media-decentralized-social-media) — _जेमिनी क्रिप्टोपीडिया_ - [ब्लॉकचेन सोशल मीडिया गोपनीयता कशी सोडवू शकते](https://www.investopedia.com/news/ethereum-blockchain-social-media-privacy-problem-linkedin-indorse/) — _प्रबलेन बाजपेयी_ -- [सोशल मीडिया नेटवर्क्स ब्लॉकचेनवर येत आहेत](https://businesstechguides.co/what-are-decentralized-social-networks) — _इमॅन्युएल अवोसिका_ +- [सोशल मीडिया नेटवर्क्स ब्लॉकचेनवर येत आहेत](https://eawosika.com/what-are-decentralized-social-networks) — _इमॅन्युएल अवोसिका_ - [सामाजिक नेटवर्कसाठी पुरेसे विकेंद्रीकरण](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) — _वरुण श्रीनिवासन_ ### Videos {#videos} From 308ad8e483ee0fe8365724105ac2dfd389db022b Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 18 Feb 2025 12:50:32 -0500 Subject: [PATCH 090/368] change https://www.immunebytes.com//smart-contract-audit to https://immunebytes.com/smart-contract-audit - removed double // for / --- .../developers/docs/smart-contracts/security/index.md | 6 +++--- .../cs/developers/docs/smart-contracts/security/index.md | 2 +- .../de/developers/docs/smart-contracts/security/index.md | 2 +- .../el/developers/docs/smart-contracts/security/index.md | 2 +- .../es/developers/docs/smart-contracts/security/index.md | 2 +- .../fa/developers/docs/smart-contracts/security/index.md | 2 +- .../fr/developers/docs/smart-contracts/security/index.md | 2 +- .../hi/developers/docs/smart-contracts/security/index.md | 2 +- .../hu/developers/docs/smart-contracts/security/index.md | 2 +- .../it/developers/docs/smart-contracts/security/index.md | 2 +- .../ja/developers/docs/smart-contracts/security/index.md | 4 ++-- .../nl/developers/docs/smart-contracts/security/index.md | 2 +- .../pcm/developers/docs/smart-contracts/security/index.md | 2 +- .../pt-br/developers/docs/smart-contracts/security/index.md | 2 +- .../tr/developers/docs/smart-contracts/security/index.md | 2 +- .../zh-tw/developers/docs/smart-contracts/security/index.md | 2 +- .../zh/developers/docs/smart-contracts/security/index.md | 2 +- 17 files changed, 20 insertions(+), 20 deletions(-) diff --git a/public/content/developers/docs/smart-contracts/security/index.md b/public/content/developers/docs/smart-contracts/security/index.md index 1199e9d5cd7..40f56860a2f 100644 --- a/public/content/developers/docs/smart-contracts/security/index.md +++ b/public/content/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ If you plan on querying an onchain oracle for asset prices, consider using one t - **[Cyfrin](https://cyfrin.io)** - _Web3 security powerhouse, incubating crypto security through products and smart contract auditing services._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Web3 security firm offering security audits for blockchain systems through a team of experienced auditors and best-in-class tools._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Web3 security firm offering security audits for blockchain systems through a team of experienced auditors and best-in-class tools._ - **[Oxorio](https://oxor.io/)** - _Smart contract audits and blockchain security services with expertise in EVM, Solidity, ZK, Cross-chain tech for crypto firms and DeFi projects._ @@ -528,9 +528,9 @@ If you plan on querying an onchain oracle for asset prices, consider using one t - **[HackerOne](https://www.hackerone.com/)** - _Vulnerability coordination and bug bounty platform that connects businesses with penetration testers and cybersecurity researchers._ - **[HackenProof](https://hackenproof.com/)** - _Expert bug bounty platform for crypto projects (DeFi, Smart Contracts, Wallets, CEX and more), where security professionals provide triage services and researchers get paid for relevant, verified bug reports._ - + - **[Sherlock](https://www.sherlock.xyz/)** - _Underwriter in Web3 for smart contract security, with payouts for auditors managed via smart contracts to secure that relevant bugs are paid fairly._ - + - **[CodeHawks](https://www.codehawks.com/)** - _Competitive bug bounty platform where auditors take part in security contests and challenges, and (soon) in their own private audits._ ### Publications of known smart contract vulnerabilities and exploits {#common-smart-contract-vulnerabilities-and-exploits} diff --git a/public/content/translations/cs/developers/docs/smart-contracts/security/index.md b/public/content/translations/cs/developers/docs/smart-contracts/security/index.md index 3b54e9f6d1a..57ba7ef9b42 100644 --- a/public/content/translations/cs/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/cs/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ Pokud plánujete dotazovat on-chain orákulum na ceny aktiv, zvažte použití t - **[Cyfrin](https://cyfrin.io)** – _bezpečnostní Web3 společnost, inkubátor krypto bezpečnosti prostřednictvím produktů a služeb auditu smart kontraktů._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** – _Web3 bezpečnostní firma nabízející bezpečnostní audity pro blockchainové systémy prostřednictvím týmu zkušených auditorů a nejlepších nástrojů ve své třídě._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** – _Web3 bezpečnostní firma nabízející bezpečnostní audity pro blockchainové systémy prostřednictvím týmu zkušených auditorů a nejlepších nástrojů ve své třídě._ - **[Oxorio](https://oxor.io/)** – _audity smart kontraktů a bezpečnostní služby blockchainu s odbornými znalostmi v oblasti EVM, Solidity, ZK, technologií napříč blockchainy pro krypto firmy a projekty DeFi._ diff --git a/public/content/translations/de/developers/docs/smart-contracts/security/index.md b/public/content/translations/de/developers/docs/smart-contracts/security/index.md index ac2f0602a13..05ebc6a9cc6 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ Wenn Sie vorhaben, ein On-Chain-Orakel für Asset-Preise abzufragen, sollten Sie - **[Cyfrin](https://cyfrin.io)** – _Web3-Sicherheits-Kraftwerk, das Krypto-Sicherheit durch Produkte und Smart-Contract-Audit-Dienste fördert._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** – _Web3-Sicherheitsunternehmen, das Sicherheits-Audits für Blockchain-Systeme durch ein Team erfahrener Prüfer und erstklassige Tools anbietet._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** – _Web3-Sicherheitsunternehmen, das Sicherheits-Audits für Blockchain-Systeme durch ein Team erfahrener Prüfer und erstklassige Tools anbietet._ - **[Oxorio](https://oxor.io/)** – _Smart-Contract-Audits und Blockchain-Sicherheitsdienste mit Expertise in EVM, Solidity, ZK und Cross-Chain-Technologien für Krypto-Unternehmen und DeFi-Projekte._ diff --git a/public/content/translations/el/developers/docs/smart-contracts/security/index.md b/public/content/translations/el/developers/docs/smart-contracts/security/index.md index be9fa4a7d38..05536352d2c 100644 --- a/public/content/translations/el/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/el/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ contract Attack { - **[Cyfrin](https://cyfrin.io)** - _Δυναμικός παράγοντας για την ασφάλεια του Web3, που ανοίγει τον δρόμο της ασφάλειας κρυπτογράφησης μέσω προϊόντων και υπηρεσιών ελέγχου έξυπνων συμβολαίων._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Εταιρεία ασφάλειας Web3 που προσφέρει ελέγχους ασφάλειας για συστήματα blockchain μέσω μιας ομάδας έμπειρων ελεγκτών και κορυφαίων εργαλείων._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Εταιρεία ασφάλειας Web3 που προσφέρει ελέγχους ασφάλειας για συστήματα blockchain μέσω μιας ομάδας έμπειρων ελεγκτών και κορυφαίων εργαλείων._ - **[Oxorio](https://oxor.io/)** - _Έλεγχοι έξυπνων συμβολαίων και υπηρεσίες ασφάλειας blockchain με εξειδίκευση σε EVM, Solidity, ZK, τεχνολογία διασταύρωσης αλυσίδων για κρυπτο εταιρείες και έργα DeFi._ diff --git a/public/content/translations/es/developers/docs/smart-contracts/security/index.md b/public/content/translations/es/developers/docs/smart-contracts/security/index.md index 2895834b498..bc2a69344fa 100644 --- a/public/content/translations/es/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/es/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ Si planea consultar a un oráculo en cadena precios de activos, considere el uso - **[Cyfrin:](https://cyfrin.io)** _Plataforma de seguridad web3 que incuba la seguridad criptográfica a través de productos y servicios de auditoría de contratos inteligentes._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)**: _empresa de seguridad en Web3 que ofrece auditorías de seguridad para sistemas de cadena de bloque mediante un equipo de auditores expertos y las mejores herramientas existentes._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)**: _empresa de seguridad en Web3 que ofrece auditorías de seguridad para sistemas de cadena de bloque mediante un equipo de auditores expertos y las mejores herramientas existentes._ - **[Oxorio:](https://oxor.io/)** _Auditorías de contratos inteligentes y servicios de seguridad de cadena de bloques con experiencia en EVM, Solidity, ZK y tecnología de cadena cruzada para empresas criptográficas y proyectos DeFi._ diff --git a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md index 4eacdded716..2a8f9f5b582 100644 --- a/public/content/translations/fa/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fa/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ contract Attack { - **[Cyfrin](https://cyfrin.io)** - _ نیروگاه امنیتی وب3، انکوباتور امنیت رمزارز از طریق محصولات و خدمات حسابرسی قرارداد هوشمند._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _شرکت امنیتی وب3 که ممیزی های امنیتی سیستم های بلاکچین را از طریق تیمی از حسابرسان مجرب و بهترین ابزارها ارائه می کند._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _شرکت امنیتی وب3 که ممیزی های امنیتی سیستم های بلاکچین را از طریق تیمی از حسابرسان مجرب و بهترین ابزارها ارائه می کند._ - **[Oxorio](https://oxor.io/)** - _ممیزی قراردادهای هوشمند و خدمات امنیتی بلاکین با تخصص در EVM، سالیدیتی، ZK، فناوری زنجیره‌ای متقابل برای شرکت‌های رمزنگاری و پروژه‌های دیفای._ diff --git a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md index 9378756bff2..f4e0a02c314 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ Si vous comptez interroger un oracle sur le prix des actifs, envisagez d'utilise - **[Cyfrin](https://cyfrin.io)** - _Puissante centrale de sécurité du Web3, veillant sur la sécurité cryptographique avec des produits et des services d'audit de contrats intelligents._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Entreprise de sécurité Web3 qui propose des audits de sécurité pour les systèmes de blockchain grâce à une équipe d'auditeurs expérimentés et des outils de premier plan._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Entreprise de sécurité Web3 qui propose des audits de sécurité pour les systèmes de blockchain grâce à une équipe d'auditeurs expérimentés et des outils de premier plan._ - **[Oxorio](https://oxor.io/)** - _Audits de contrats intelligents et services de sécurité blockchain avec expertise concernant l'EVM, Solidity, le ZK, la technologie inter-chaînes pour les entreprises de crypto et les projets de DeFi._ diff --git a/public/content/translations/hi/developers/docs/smart-contracts/security/index.md b/public/content/translations/hi/developers/docs/smart-contracts/security/index.md index 6246da9d701..a77923b6879 100644 --- a/public/content/translations/hi/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/hi/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ DEX की कीमतें अक्सर सटीक होती है - **[Cyfrin](https://cyfrin.io)** - _Web3 सुरक्षा पावरहाउस, उत्पादों और स्मार्ट अनुबंध ऑडिटिंग सेवाओं के माध्यम से क्रिप्टो सुरक्षा विकसित कर रहा है।_ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Web3 सुरक्षा फर्म जो अनुभवी लेखा परीक्षकों और सर्वोत्तम श्रेणी के उपकरणों की एक टीम के माध्यम से ब्लॉकचेन प्रणालियों के लिए सुरक्षा लेखा परीक्षण प्रदान करती है।_ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Web3 सुरक्षा फर्म जो अनुभवी लेखा परीक्षकों और सर्वोत्तम श्रेणी के उपकरणों की एक टीम के माध्यम से ब्लॉकचेन प्रणालियों के लिए सुरक्षा लेखा परीक्षण प्रदान करती है।_ - **[Oxorio](https://oxor.io/)** - _स्मार्ट अनुबंध लेखा परीक्षण और ब्लॉकचेन सुरक्षा सेवाएँ जो क्रिप्टो फर्मों और DeFi प्रोजेक्ट्स के लिए EVM, Solidity, ZK, क्रॉस-चेन तकनीक में विशेषज्ञता रखती हैं।_ diff --git a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md index 321fc6ebb4b..d9e21280d03 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ Ha Ön azt tervezi, hogy egy láncon lévő orákulumot kérdez le eszközárak - **[Cyfrin](https://cyfrin.io)** – _Web3 biztonsági erőmű, elősegíti kriptobiztonságot termékeken és okosszerződés-ellenőrzési szolgáltatásokon keresztül._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** – _Web3 biztonsági cég, amely a blokkláncrendszerek biztonsági ellenőrzését kínálja tapasztalt auditorcsapattal és a legjobb eszközökkel._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** – _Web3 biztonsági cég, amely a blokkláncrendszerek biztonsági ellenőrzését kínálja tapasztalt auditorcsapattal és a legjobb eszközökkel._ - **[Oxorio](https://oxor.io/)** - _Okosszerződés-auditok és blokkláncbiztonsági szolgáltatások, szakértelem az EVM, Solidity, ZK, kriptocégek láncok közötti technológiái és DeFi projektek területén._ diff --git a/public/content/translations/it/developers/docs/smart-contracts/security/index.md b/public/content/translations/it/developers/docs/smart-contracts/security/index.md index db98d8cafcd..a5a0809ec24 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ Se prevedi di interrogare un oracolo sulla catena per conoscere i prezzi dei ben - **[Cyfrin](https://cyfrin.io)**: _motore di sicurezza per Web3, che incuba la criptosicurezza tramite prodotti e servizi di controllo dei contratti intelligenti._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)**: _studio di sicurezza del Web3 che offre controlli di sicurezza per i sistemi della blockchain tramite un team di revisori esperti e strumenti di prim'ordine._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)**: _studio di sicurezza del Web3 che offre controlli di sicurezza per i sistemi della blockchain tramite un team di revisori esperti e strumenti di prim'ordine._ - **[Oxorio](https://oxor.io/)**: _servizi di controllo dei contratti intelligenti e sicurezza della blockchain con esperienza nell'EVM, in Solidity, tecnologie tra catene per cripto-aziende e progetti di DeFi._ diff --git a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md index cf503e612ad..79cd8851066 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md @@ -417,7 +417,7 @@ contract Attack { function attack() public payable { timeLock.deposit{value: msg.value}(); /* - 「t = 現在のロック時間」ならば、xを以下のようにして求める必要があります。 + 「t = 現在のロック時間」ならば、xを以下のようにして求める必要があります。 x + t = 2**256 = 0 so x = -t 2**256 = type(uint).max + 1 @@ -513,7 +513,7 @@ DEXの価格は正確であることが多く、これは市場の均衡を取 - **[Cyfrin](https://cyfrin.io)** - _Web3セキュリティの有力企業であり、製品やスマート コントラクト監査サービスを通じて暗号セキュリティを推進している。_ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Web3セキュリティファームで、経験豊富な監査人と最高クラスのツールを通じてブロックチェーンシステムのセキュリティ監査を提供している。_ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Web3セキュリティファームで、経験豊富な監査人と最高クラスのツールを通じてブロックチェーンシステムのセキュリティ監査を提供している。_ - **[Oxorio](https://oxor.io/)** - _クリプト会社およびDeFiプロジェクト向けのEVM、Solidity、ゼロ知識、クロスチェーン技術を専門としたスマートコントラクト監査およびブロックチェーンセキュリティサービス。_ diff --git a/public/content/translations/nl/developers/docs/smart-contracts/security/index.md b/public/content/translations/nl/developers/docs/smart-contracts/security/index.md index aa9d5a62503..ba9c7715071 100644 --- a/public/content/translations/nl/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/nl/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ Als u van plan bent om een on-chain oracle te raadplegen voor activaprijzen, geb - **[Cyfrin](https://cyfrin.io)** - _Web3-beveiligingskrachtpatser die cryptobeveiliging stimuleert via producten en auditservices voor smart contracts._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Web3-beveiligingsfirma die beveiligingsaudits aanbiedt voor blockchainsystemen via een team van ervaren auditors en eersteklas tools._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Web3-beveiligingsfirma die beveiligingsaudits aanbiedt voor blockchainsystemen via een team van ervaren auditors en eersteklas tools._ - **[Oxorio](https://oxor.io/)** - _Audits van smart contracts en blockchain-beveiligingsservices met expertise in EVM, Solidity, ZK, Cross-chain tech voor cryptofirma's en DeFi-projecten._ diff --git a/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md b/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md index e81b4b9f834..186dc0dd32b 100644 --- a/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pcm/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ If yu dey plan query on-chain orakol for asset prices, make yu konsida to dey yu - **[Cyfrin](https://cyfrin.io)** - _ Web3 sekurity pawahaus, to dey inkubate crypto sekurity thru products and smart kontract auditing savis._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _ Web3 sekurity firm wey dey give sekurity audits for blockchain systems thru one team wey get ekspiriens auditors and best-in-class tools._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _ Web3 sekurity firm wey dey give sekurity audits for blockchain systems thru one team wey get ekspiriens auditors and best-in-class tools._ - **[Oxorio](https://oxor.io/)** - _ Smart kontract audits and blockchain sekurity savis wit expatise in EVM, Solidity, ZK, Cross-chain tech for crypto firms and DeFi projects._ diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md index 3fdeccb47a5..36c08dbb69f 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ Se você planeja consultar um oráculo on-chain para preços de ativos, consider - **[Cyfrin](https://cyfrin.io)** - _Poderosa empresa de segurança da Web3, desenvolvendo a segurança de criptografia por meio de produtos e serviços de auditoria de contratos inteligentes._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Empresa de segurança Web3 que oferece auditorias de segurança para sistemas de blockchain por meio de uma equipe de auditores experientes e das melhores ferramentas da categoria._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Empresa de segurança Web3 que oferece auditorias de segurança para sistemas de blockchain por meio de uma equipe de auditores experientes e das melhores ferramentas da categoria._ - **[Oxorio](https://oxor.io/)** - _Auditorias de contratos inteligentes e serviços de segurança de blockchain com experiência em EVM, Solidity, ZK, tecnologia cross-chain para empresas de criptografia e projetos DeFi._ diff --git a/public/content/translations/tr/developers/docs/smart-contracts/security/index.md b/public/content/translations/tr/developers/docs/smart-contracts/security/index.md index 5cb6c26154a..26e386e0caa 100644 --- a/public/content/translations/tr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/tr/developers/docs/smart-contracts/security/index.md @@ -514,7 +514,7 @@ Varlık fiyatları için bir zincir üstünde kâhin sorgulaması yapmayı planl - **[Cyfrin](https://cyfrin.io)** - _Kripto güvenliğini ürünler ve akıllı sözleşme denetim hizmetleri aracılığıyla geliştiren Web3 güvenlik merkezi._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Deneyimli denetçilerden oluşan bir ekip ve sınıfının en iyisi araçlar ile blokzincir sistemleri için güvenlik denetimleri sunan Web3 güvenlik şirketi._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Deneyimli denetçilerden oluşan bir ekip ve sınıfının en iyisi araçlar ile blokzincir sistemleri için güvenlik denetimleri sunan Web3 güvenlik şirketi._ - **[Oxorio](https://oxor.io/)** - _Kripto şirketleri ve DeFi projeleri için EVM, Solidity, ZK, Zincirler Arası teknolojilerinde uzmanlığa sahip akıllı sözleşme denetimleri ve blokzincir güvenlik hizmetleri._ diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md index 692eca72671..8f8292a66f4 100644 --- a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ contract Attack { - **[Cyfrin](https://cyfrin.io)** - _Web3 安全巨頭,透過產品和智慧型合約審核服務來發展加密安全。_ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Web3 安全公司,透過經驗豐富的審核者團隊和一流工具,為區塊鏈系統提供安全審核。_ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Web3 安全公司,透過經驗豐富的審核者團隊和一流工具,為區塊鏈系統提供安全審核。_ - **[Oxorio](https://oxor.io/)** - _智慧型合約審核和區塊鏈安全服務,在以太坊虛擬機、Solidity、零知識、加密公司和去中心化金融專案的跨鏈技術方面擁有深厚的專業知識。_ diff --git a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md index 60a26a76fbb..4ec0408be28 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md @@ -515,7 +515,7 @@ contract Attack { - **[Cyfrin](https://cyfrin.io)** - _Web3 安全发电站,通过产品和智能合约审计服务提高加密货币安全性。_ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** - _Web3 安全公司,通过经验丰富的审计员团队和一流的工具,为区块链系统提供安全审计。_ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Web3 安全公司,通过经验丰富的审计员团队和一流的工具,为区块链系统提供安全审计。_ - **[Oxorio](https://oxor.io/)** - _智能合约审计和区块链安全服务,为加密货币公司和去中心化金融项目提供以太坊虚拟机、Solidity、零知识、跨链技术方面的专业知识。_ From a210a8b5acc80189a1bfc8a1d24ed272aba59ebb Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 18 Feb 2025 13:14:20 -0500 Subject: [PATCH 091/368] change https://blog.enjincoin.io/erc-1155-the-crypto-item-standard-ac9cf1c5a226 to https://medium.com/enjin-coin/erc-1155-the-crypto-item-standard-ac9cf1c5a226 - https://web.archive.org/web/20191003014041/https://blog.enjincoin.io/erc-1155-the-crypto-item-standard-ac9cf1c5a226 --- public/content/translations/ro/nft/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ro/nft/index.md b/public/content/translations/ro/nft/index.md index cf2ad9c03bf..71a41372bf8 100644 --- a/public/content/translations/ro/nft/index.md +++ b/public/content/translations/ro/nft/index.md @@ -356,7 +356,7 @@ Procesul a început deja. [Lanțul Beacon](/roadmap/beacon-chain/), prima actual ## Construiți cu NFT-uri {#build-with-nfts} -Cele mai multe NFT-uri sunt construite cu ajutorul unui standard coerent cunoscut sub numele de [ERC-721](/developers/docs/standards/tokens/erc-721/). Totuși, există și alte standarde pe care ați putea dori să le analizați. Standardul [ERC-1155](https://blog.enjincoin.io/erc-1155-the-crypto-item-standard-ac9cf1c5a226) permite tokenurile semi-fungibile, care sunt deosebit de utile în lumea jocurilor. Mai recent, [EIP-2309](https://eips.ethereum.org/EIPS/eip-2309) a fost propus pentru a crește mult eficiența emiterii NFT-urilor. Acest standard vă permite să creați cât de multe tokenuri doriți într-o singură tranzacție! +Cele mai multe NFT-uri sunt construite cu ajutorul unui standard coerent cunoscut sub numele de [ERC-721](/developers/docs/standards/tokens/erc-721/). Totuși, există și alte standarde pe care ați putea dori să le analizați. Standardul [ERC-1155](https://medium.com/enjin-coin/erc-1155-the-crypto-item-standard-ac9cf1c5a226) permite tokenurile semi-fungibile, care sunt deosebit de utile în lumea jocurilor. Mai recent, [EIP-2309](https://eips.ethereum.org/EIPS/eip-2309) a fost propus pentru a crește mult eficiența emiterii NFT-urilor. Acest standard vă permite să creați cât de multe tokenuri doriți într-o singură tranzacție! ## Referințe suplimentare {#further-reading} From 4578fc6ec9a1fa9a29d36987ce692c7691b28fa5 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Tue, 18 Feb 2025 13:21:43 -0500 Subject: [PATCH 092/368] change https://discord.io/EthCatHerders to https://discord.gg/Nz6rtfJ8Cu - https://github.com/ethereum/EIPs/pull/8285/files update invite to catherders --- .../content/translations/fa/community/get-involved/index.md | 4 ++-- .../content/translations/nl/community/get-involved/index.md | 2 +- .../translations/pt-br/community/get-involved/index.md | 4 ++-- .../content/translations/uk/community/get-involved/index.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/content/translations/fa/community/get-involved/index.md b/public/content/translations/fa/community/get-involved/index.md index d03ebcc33a7..38be972dc71 100644 --- a/public/content/translations/fa/community/get-involved/index.md +++ b/public/content/translations/fa/community/get-involved/index.md @@ -18,7 +18,7 @@ lang: fa - [تماس‌های Core Dev](https://www.youtube.com/@EthereumProtocol) را تماشا کنید و یا در آن شرکت کنید - [فهرست نیازمندی‌های برنامه پشتیبانی اکوسیستم](https://esp.ethereum.foundation/wishlist/) - ابزار، اسناد و مناطق زیرساختی که در آن برنامه حمایت از اکوسیستم اتوریوم فعالانه به دنبال کمک به برنامه‌های کمکی است - [Web3Bridge](https://www.web3bridge.com/) - برای شناسایی، آموزش و حمایت از صدها توسعه‌دهنده و اعضای انجمن در سراسر آفریقا به جامعه‌ی مشتاق web3 بپیوندید -- به [Ethereum Cat Herders Discord](https://discord.io/EthCatHerders) بپیوندید +- به [Ethereum Cat Herders Discord](https://discord.gg/Nz6rtfJ8Cu) بپیوندید ## محققان و دانشگاهیان ‍ {#researchers-and-academics} @@ -32,7 +32,7 @@ lang: fa - یاد بگیرید که چگونه یک [ویرایشگر EIP](https://eips.ethereum.org/EIPS/eip-5069) شوید - حالا می توانید EIPها را مورد بازبینی قرار دهید! [PRهای موجود با تگ`e-review` را مشاهده کنید](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). بازخورد فنی را با کلیک بر `discussion-to` ثبت کنید. - در [حاکمیت پیشنهادهای بهبود اتریوم](https://github.com/ethereum-cat-herders/EIPIP) مشارکت کنید - - به [Ethereum Cat Herders Discord](https://discord.io/EthCatHerders) بپیوندید + - به [Ethereum Cat Herders Discord](https://discord.gg/Nz6rtfJ8Cu) بپیوندید - [اطلاعات بیشتر درباره EIPها](/eips/) - [Challenges.ethereum.org](https://challenges.ethereum.org/) - مجموعه‌ای از جایزه‌های تحقیقاتی با ارزش، که در آن می‌توانید تا >100,000 دلار آمریکا کسب کنید - [Ethresear.ch](https://ethresear.ch) - انجمن اصلی اتریوم برای تحقیقات، و تأثیرگذارترین انجمن جهان برای اقتصاد رمزنگاری diff --git a/public/content/translations/nl/community/get-involved/index.md b/public/content/translations/nl/community/get-involved/index.md index a6bc0641724..ee40d0dfb17 100644 --- a/public/content/translations/nl/community/get-involved/index.md +++ b/public/content/translations/nl/community/get-involved/index.md @@ -16,7 +16,7 @@ De Ethereum-gemeenschap omvat mensen met verschillende achtergronden en vaardigh - Bekijk of neem deel aan [Core Dev calls](https://www.youtube.com/@EthereumProtocol) - [Wensenlijst van Ecosystem Support Programma](https://esp.ethereum.foundation/wishlist/) - tooling, documentatie en infrastructuurgebieden waar het Ecosystem Support Programma van Ethereum actief op zoek is naar subsidieaanvragen - [Web3Bridge](https://www.web3bridge.com/) - sluit u aan bij de ambitieuze web3-gemeenschap in hun initiatief om honderden ontwikkelaars en leden van de gemeenschap in heel Afrika te identificeren, te trainen en te ondersteunen -- Sluit u aan bij de [Ethereum Cat Herders Discord](https://discord.io/EthCatHerders) +- Sluit u aan bij de [Ethereum Cat Herders Discord](https://discord.gg/Nz6rtfJ8Cu) ## Onderzoekers & Academici± {#researchers-and-academics} diff --git a/public/content/translations/pt-br/community/get-involved/index.md b/public/content/translations/pt-br/community/get-involved/index.md index c7921a16a44..99e346bd8b3 100644 --- a/public/content/translations/pt-br/community/get-involved/index.md +++ b/public/content/translations/pt-br/community/get-involved/index.md @@ -18,7 +18,7 @@ Comece lendo sobre a missão e os valores da ethereum.org no nosso [código de c - Assista ou participe das [reuniões do núcleo de desenvolvedores](https://www.youtube.com/@EthereumProtocol) - [Lista de desejos do Programa de apoio ao ecossistema](https://esp.ethereum.foundation/wishlist/): ferramentas, documentação e áreas de infraestrutura onde o Programa de suporte ao ecossistema do Ethereum está ativamente buscando aplicativos - [Web3Bridge](https://www.web3bridge.com/): participe da promissora comunidade da web3 em sua iniciativa de identificar, treinar e oferecer suporte a centenas de desenvolvedores e membros da comunidade em toda a África -- Junte-se ao [Discord Ethereum Cat Herders](https://discord.io/EthCatHerders) +- Junte-se ao [Discord Ethereum Cat Herders](https://discord.gg/Nz6rtfJ8Cu) ## Pesquisadores e acadêmicos {#researchers-and-academics} @@ -32,7 +32,7 @@ Você tem formação em matemática, criptografia ou economia? Talvez tenha inte - Saiba como se tornar um [editor de EIP](https://eips.ethereum.org/EIPS/eip-5069) - Você pode fazer a revisão por pares de EIPs agora mesmo! Consulte os [PRs abertos com a tag `e-review`](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Envie feedback técnico por meio do link `discussion-to`. - Participe da [governança de EIP](https://github.com/ethereum-cat-herders/EIPIP) - - Junte-se ao [Discord Ethereum Cat Herders](https://discord.io/EthCatHerders) + - Junte-se ao [Discord Ethereum Cat Herders](https://discord.gg/Nz6rtfJ8Cu) - [Mais sobre EIPs](/eips/) - [Challenges.ethereum.org](https://challenges.ethereum.org/): uma série de pesquisas com recompensas de alto valor. Você pode ganhar >US$ 100.000 - [Ethresear.ch](https://ethresear.ch): fórum principal de pesquisa do Ethereum e o fórum mais influente do mundo sobre criptoeconomia diff --git a/public/content/translations/uk/community/get-involved/index.md b/public/content/translations/uk/community/get-involved/index.md index 49630cc0dd4..004e5630aba 100644 --- a/public/content/translations/uk/community/get-involved/index.md +++ b/public/content/translations/uk/community/get-involved/index.md @@ -16,7 +16,7 @@ lang: uk - Дивіться [онлайн-зустрічі розробників](https://www.youtube.com/@EthereumProtocol) або беріть у них участь - [Список уподобань для програми підтримки екосистем](https://esp.ethereum.foundation/wishlist/) — галузі інструментарію, документації та інфраструктури, у яких активно шукають заявників на гранти в межах програми підтримки екосистеми Ethereum - [Web3Bridge](https://www.web3bridge.com/) — приєднуйтеся до амбітної спільноти web3, яка прагне виявляти, навчати й підтримувати сотні розробників і членів спільнот по всій Африці -- Приєднуйтеся до [групи Ethereum Cat Herders на платформі Discord](https://discord.io/EthCatHerders) +- Приєднуйтеся до [групи Ethereum Cat Herders на платформі Discord](https://discord.gg/Nz6rtfJ8Cu) ## Дослідники й академіки {#researchers-and-academics} From 68c117a2f01c5aab513a8a1d1dedd70fc8e423d7 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Fri, 21 Feb 2025 12:49:19 -0500 Subject: [PATCH 093/368] adding lychee cron monthly or manually run --- .github/workflows/lychee-cron.yml | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 .github/workflows/lychee-cron.yml diff --git a/.github/workflows/lychee-cron.yml b/.github/workflows/lychee-cron.yml new file mode 100644 index 00000000000..bbacfe16e27 --- /dev/null +++ b/.github/workflows/lychee-cron.yml @@ -0,0 +1,64 @@ +name: Check Links In Public Directory + +on: + pull_request: + schedule: + - cron: "0 0 1 * *" # Monthly run on the 1st day of every month at midnight UTC + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + check-links: + runs-on: ubuntu-latest + + steps: + - name: Clone repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: dev + + - name: Check links in /public + uses: lycheeverse/lychee-action@v2 + with: + args: | + public/ + --quiet + --max-retries 1 + --accept 200,429,403 + --exclude-all-private + --exclude '^file://' + --exclude "ethereum\.org" + --include '^https?://' + --format detailed + './**/*.md' + './**/*.html' + output: ./lychee-report.txt + continue-on-error: true + + # looks like we dont need to do this? + # - name: Add Lychee Report to Job Summary + # if: always() + # run: | + # echo "### Lychee Report" >> $GITHUB_STEP_SUMMARY + # echo '```' >> $GITHUB_STEP_SUMMARY + # cat ./lychee-report.txt >> $GITHUB_STEP_SUMMARY + # echo '```' >> $GITHUB_STEP_SUMMARY + + - name: Provide helpful failure message + if: failure() + run: | + echo "::error::Link check failed! Please review the broken links reported above." + echo "" + echo "If certain links are valid but fail due to:" + echo "- CAPTCHA challenges" + echo "- IP blocking" + echo "- Authentication requirements" + echo "- Rate limiting" + echo "" + echo "Consider adding them to .lycheeignore to bypass future checks." + echo "Format: Add one URL pattern per line" + exit 1 From 760b6a22c11371506bd4620fd5124d1a836c0f28 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 24 Feb 2025 11:53:45 -0500 Subject: [PATCH 094/368] removing unused config --- .github/workflows/lychee-cron.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/lychee-cron.yml b/.github/workflows/lychee-cron.yml index bbacfe16e27..fb1757a4a29 100644 --- a/.github/workflows/lychee-cron.yml +++ b/.github/workflows/lychee-cron.yml @@ -36,18 +36,8 @@ jobs: --format detailed './**/*.md' './**/*.html' - output: ./lychee-report.txt continue-on-error: true - # looks like we dont need to do this? - # - name: Add Lychee Report to Job Summary - # if: always() - # run: | - # echo "### Lychee Report" >> $GITHUB_STEP_SUMMARY - # echo '```' >> $GITHUB_STEP_SUMMARY - # cat ./lychee-report.txt >> $GITHUB_STEP_SUMMARY - # echo '```' >> $GITHUB_STEP_SUMMARY - - name: Provide helpful failure message if: failure() run: | From 7af5ebb51ab270c68547074f4f05621ecb889c47 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Wed, 26 Feb 2025 13:54:28 -0500 Subject: [PATCH 095/368] removing // from the end of https://thegraph.com/docs/en/about// --- public/content/developers/docs/data-and-analytics/index.md | 2 +- .../translations/de/developers/docs/data-and-analytics/index.md | 2 +- .../translations/el/developers/docs/data-and-analytics/index.md | 2 +- .../translations/es/developers/docs/data-and-analytics/index.md | 2 +- .../translations/fr/developers/docs/data-and-analytics/index.md | 2 +- .../translations/hu/developers/docs/data-and-analytics/index.md | 2 +- .../translations/it/developers/docs/data-and-analytics/index.md | 2 +- .../translations/ja/developers/docs/data-and-analytics/index.md | 2 +- .../pt-br/developers/docs/data-and-analytics/index.md | 2 +- .../translations/ro/developers/docs/data-and-analytics/index.md | 2 +- .../translations/tr/developers/docs/data-and-analytics/index.md | 2 +- .../zh-tw/developers/docs/data-and-analytics/index.md | 2 +- .../translations/zh/developers/docs/data-and-analytics/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/data-and-analytics/index.md b/public/content/developers/docs/data-and-analytics/index.md index d22f3a5a1ca..8574d41f908 100644 --- a/public/content/developers/docs/data-and-analytics/index.md +++ b/public/content/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ To start, visit the [Ethereum quick start guide](https://academy.subquery.networ ## Further Reading {#further-reading} -- [Graph Network Overview](https://thegraph.com/docs/en/about//) +- [Graph Network Overview](https://thegraph.com/docs/en/about/) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [API code examples on EtherScan](https://etherscan.io/apis#contracts) - [Beaconcha.in Beacon Chain explorer](https://beaconcha.in) diff --git a/public/content/translations/de/developers/docs/data-and-analytics/index.md b/public/content/translations/de/developers/docs/data-and-analytics/index.md index 67c4a413f4b..90348c1a85e 100644 --- a/public/content/translations/de/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/de/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Um loszulegen, sehen Sie sich die [Ethereum-Schnellstartanleitung](https://acade ## Weiterführende Informationen {#further-reading} -- [Graph Network-Übersicht](https://thegraph.com/docs/en/about//) +- [Graph Network-Übersicht](https://thegraph.com/docs/en/about/) - [Graph-Abfrageplatz](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [API-Code-Beispiele auf EtherScan](https://etherscan.io/apis#contracts) - [Beaconcha.in Beacon Chain Explorer](https://beaconcha.in) diff --git a/public/content/translations/el/developers/docs/data-and-analytics/index.md b/public/content/translations/el/developers/docs/data-and-analytics/index.md index c6256db2735..d0792b837c5 100644 --- a/public/content/translations/el/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/el/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ lang: el ## Περισσότερες πληροφορίες {#further-reading} -- [Επισκόπηση του Δικτύου Graph](https://thegraph.com/docs/en/about//) +- [Επισκόπηση του Δικτύου Graph](https://thegraph.com/docs/en/about/) - [Χώρος ανάπτυξης Graph Query](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Παραδείγματα κώδικα API στο EtherScan](https://etherscan.io/apis#contracts) - [Beaconcha.in εξερευνητής κύριας αλυσίδας](https://beaconcha.in) diff --git a/public/content/translations/es/developers/docs/data-and-analytics/index.md b/public/content/translations/es/developers/docs/data-and-analytics/index.md index b8f3c2f17ed..7e2810fd381 100644 --- a/public/content/translations/es/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/es/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Para comenzar, visite la guía de inicio rápido de [Ethereum](https://academy.s ## Más información {#further-reading} -- [Descripción general de Graph Network](https://thegraph.com/docs/en/about//) +- [Descripción general de Graph Network](https://thegraph.com/docs/en/about/) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Ejemplos de código API en EtherScan](https://etherscan.io/apis#contracts) - [Explorador de la cadena de Baliza Beaconcha.in](https://beaconcha.in) diff --git a/public/content/translations/fr/developers/docs/data-and-analytics/index.md b/public/content/translations/fr/developers/docs/data-and-analytics/index.md index 7f08745cf92..0cf2e892bdc 100644 --- a/public/content/translations/fr/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/fr/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Pour commencer, consultez le [guide de démarrage rapide Ethereum](https://acade ## Complément d'information {#further-reading} -- [Présentation du réseau Graph](https://thegraph.com/docs/en/about//) +- [Présentation du réseau Graph](https://thegraph.com/docs/en/about/) - [Bac à sable de requêtes Graph](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Examples de code d'APIs sur EtherScan](https://etherscan.io/apis#contracts) - [Explorateur de Beacon Chain](https://beaconcha.in) diff --git a/public/content/translations/hu/developers/docs/data-and-analytics/index.md b/public/content/translations/hu/developers/docs/data-and-analytics/index.md index 56fa0916979..73aa44dd702 100644 --- a/public/content/translations/hu/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/hu/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ A [Blocknative](https://www.blocknative.com/) nyílt hozzáférést biztosít az ## További olvasnivaló {#further-reading} -- [A gráfhálózat áttekintése](https://thegraph.com/docs/en/about//) +- [A gráfhálózat áttekintése](https://thegraph.com/docs/en/about/) - [Gráflekérdezési próbafelület (playground)](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [API-kódpéldák az EtherScan oldalon](https://etherscan.io/apis#contracts) - [Beaconcha.in – Beaconlánc-felfedező](https://beaconcha.in) diff --git a/public/content/translations/it/developers/docs/data-and-analytics/index.md b/public/content/translations/it/developers/docs/data-and-analytics/index.md index 285a4695fcb..326c2658b65 100644 --- a/public/content/translations/it/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/it/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Per iniziare, visita la [guida rapida per principianti di Ethereum](https://acad ## Letture consigliate {#further-reading} -- [Panoramica della rete Graph](https://thegraph.com/docs/en/about//) +- [Panoramica della rete Graph](https://thegraph.com/docs/en/about/) - [GraphQL Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Esempi di codice API su EtherScan](https://etherscan.io/apis#contracts) - [Esploratore della Beacon Chain di Beaconcha.in](https://beaconcha.in) diff --git a/public/content/translations/ja/developers/docs/data-and-analytics/index.md b/public/content/translations/ja/developers/docs/data-and-analytics/index.md index 2d9a31a0b30..0a8503f68a5 100644 --- a/public/content/translations/ja/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/ja/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ lang: ja ## 参考文献 {#further-reading} -- [Graphネットワークの概要](https://thegraph.com/docs/en/about//) +- [Graphネットワークの概要](https://thegraph.com/docs/en/about/) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [EtherScanのAPIコードの例](https://etherscan.io/apis#contracts) - [Beaconcha.inビーコンチェーンエクスプローラー](https://beaconcha.in) diff --git a/public/content/translations/pt-br/developers/docs/data-and-analytics/index.md b/public/content/translations/pt-br/developers/docs/data-and-analytics/index.md index 4bbe7c62533..062958f8302 100644 --- a/public/content/translations/pt-br/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/pt-br/developers/docs/data-and-analytics/index.md @@ -38,7 +38,7 @@ O [Dune Analytics](https://dune.com/) pré-processa dados da blockchain em tabel ## Leitura Adicional {#further-reading} -- [Visão geral da rede de gráficos](https://thegraph.com/docs/en/about//) +- [Visão geral da rede de gráficos](https://thegraph.com/docs/en/about/) - [Área de consulta de gráficos](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Exemplos de código de API em EtherScan](https://etherscan.io/apis#contracts) - [Explorador de Beacon Chain Beaconcha.in](https://beaconcha.in) diff --git a/public/content/translations/ro/developers/docs/data-and-analytics/index.md b/public/content/translations/ro/developers/docs/data-and-analytics/index.md index bfb88bdb54f..f383c010ea1 100644 --- a/public/content/translations/ro/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/ro/developers/docs/data-and-analytics/index.md @@ -30,6 +30,6 @@ Dezvoltatorii pot apoi procesa și transforma aceste date pentru a le oferi util ## Referințe suplimentare {#further-reading} -- [Prezentare generală Graph Network](https://thegraph.com/docs/en/about//) +- [Prezentare generală Graph Network](https://thegraph.com/docs/en/about/) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Exemple de cod API pe EtherScan](https://etherscan.io/apis#contracts) diff --git a/public/content/translations/tr/developers/docs/data-and-analytics/index.md b/public/content/translations/tr/developers/docs/data-and-analytics/index.md index 35228da52e0..ab235c7fb68 100644 --- a/public/content/translations/tr/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/tr/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ Başlarken, Ethereum blokzinciri verilerini yerel bir Docker ortamında dakikala ## Daha Fazla Okuma {#further-reading} -- [Graph Ağına Genel Bakış](https://thegraph.com/docs/en/about//) +- [Graph Ağına Genel Bakış](https://thegraph.com/docs/en/about/) - [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [EtherScan'deki API kodu örnekleri](https://etherscan.io/apis#contracts) - [Beaconcha.in İçaret Zincir'i keşif aracı](https://beaconcha.in) diff --git a/public/content/translations/zh-tw/developers/docs/data-and-analytics/index.md b/public/content/translations/zh-tw/developers/docs/data-and-analytics/index.md index cb9e82e49f6..59305af8dbd 100644 --- a/public/content/translations/zh-tw/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/zh-tw/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ lang: zh-tw ## 衍生閱讀 {#further-reading} -- [Graph Network 概覽](https://thegraph.com/docs/en/about//) +- [Graph Network 概覽](https://thegraph.com/docs/en/about/) - [Graph Query 訓練場](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [EtherScan 上的應用程式介面程式碼範例](https://etherscan.io/apis#contracts) - [Beaconcha.in 信標鏈瀏覽器](https://beaconcha.in) diff --git a/public/content/translations/zh/developers/docs/data-and-analytics/index.md b/public/content/translations/zh/developers/docs/data-and-analytics/index.md index 5ae74b42d02..a5b74cc5d57 100644 --- a/public/content/translations/zh/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/zh/developers/docs/data-and-analytics/index.md @@ -47,7 +47,7 @@ lang: zh ## 延伸阅读 {#further-reading} -- [Graph 网络概览](https://thegraph.com/docs/en/about//) +- [Graph 网络概览](https://thegraph.com/docs/en/about/) - [Graph 查询实战](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [EtherScan 上的应用程序接口代码示例](https://etherscan.io/apis#contracts) - [Beaconcha.in 信标链浏览器](https://beaconcha.in) From d5f45865fc24866f99ae8a9d8194f9bb211341d6 Mon Sep 17 00:00:00 2001 From: brossetti1 Date: Mon, 24 Mar 2025 13:31:42 -0400 Subject: [PATCH 096/368] reverting some changes that were accidentily overwritten --- public/content/translations/es/defi/index.md | 1 + public/content/translations/fr/defi/index.md | 3 +- public/content/translations/id/defi/index.md | 3 +- public/content/translations/it/defi/index.md | 3 +- .../developers/docs/apis/backend/index.md | 184 +++++++++++------- .../content/translations/zh-tw/defi/index.md | 3 +- 6 files changed, 123 insertions(+), 74 deletions(-) diff --git a/public/content/translations/es/defi/index.md b/public/content/translations/es/defi/index.md index c3d3d0109c8..d3c12eb83d2 100644 --- a/public/content/translations/es/defi/index.md +++ b/public/content/translations/es/defi/index.md @@ -1,5 +1,6 @@ --- title: Finanzas descentralizadas (DeFi) +metaTitle: '¿Qué son las DeFi? | Beneficios y usos de las Finanzas Descentralizadas' description: Una visión de las finanzas descentralizadas en Ethereum lang: es template: use-cases diff --git a/public/content/translations/fr/defi/index.md b/public/content/translations/fr/defi/index.md index 9e46ff2af9b..c08338ad052 100644 --- a/public/content/translations/fr/defi/index.md +++ b/public/content/translations/fr/defi/index.md @@ -1,5 +1,6 @@ --- title: Finance Décentralisée (DeFi) +metaTitle: Qu'est-ce que DeFi ? | Avantages et utilisation de la finance décentralisée description: Un aperçu de la DeFi sur Ethereum lang: fr template: use-cases @@ -324,7 +325,7 @@ Vous pouvez voir la DeFi comme des couches : 3. Les protocoles, [contrats intelligents](/glossary/#smart-contract) qui offrent des fonctionnalités comme les prêts d'actifs décentralisés. 4. [Les applications](/dapps/) les produits que vous utilisez pour accéder et gérer les protocoles. -Note : Beaucoup de DeFi utilisent la [norme ERC-20](/glossary/#erc-20). Les applications de la DeFi utilisent un wrapper pour ETH, appelé Wrapped Ether (WETH). [En apprendre plus à propos de l'ether symbolique](/wrapped-eth). +Note : Beaucoup de DeFi utilisent la [norme ERC-20](/glossary/#erc-20). Les applications de DeFi utilisent un "wrapper" pour l'ETH appelé Wrapped Ether (WETH). [En apprendre plus à propos de l'ether symbolique](/wrapped-eth). ## Fabriquer une DeFi {#build-defi} diff --git a/public/content/translations/id/defi/index.md b/public/content/translations/id/defi/index.md index 7422f4f0a11..4ce00b27ff8 100644 --- a/public/content/translations/id/defi/index.md +++ b/public/content/translations/id/defi/index.md @@ -1,5 +1,6 @@ --- title: Keuangan terdesentralisasi (DeFi) +metaTitle: Apa yang dimaksud dengan DeFi? | Manfaat dan Kegunaan Keuangan Terdesentralisasi description: Gambaran umum tentang DeFi di Ethereum lang: id template: use-cases @@ -324,7 +325,7 @@ Anda dapat membayangkan tentang DeFi dalam lapisan: 3. Protokol – [kontrak pintar](/glossary/#smart-contract) yang menyediakan fungsionalitas, misalnya, layanan yang memungkinkan pemberian pinjaman aset yang terdesentralisasi. 4. [Aplikasi](/dapps/) – produk yang kita gunakan untuk mengelola dan mengakses protokol. -Catatan: sebagian besar DeFi menggunakan [standar ERC-20](/glossary/#erc-20). Aplikasi di DeFi menggunakan pembungkus untuk ETH yang disebut Wrapped Ether (WETH). [Pelajari lebih lanjut tentang wrapped ether](/wrapped-eth). +Catatan: sebagian besar DeFi menggunakan [standar ERC-20](/glossary/#erc-20). Aplikasi di DeFi menggunakan pembungkus ETH yang disebut Wrapped ether (WETH). [Pelajari lebih lanjut tentang wrapped ether](/wrapped-eth). ## Bangun DeFi {#build-defi} diff --git a/public/content/translations/it/defi/index.md b/public/content/translations/it/defi/index.md index c73cc677964..939d9de8319 100644 --- a/public/content/translations/it/defi/index.md +++ b/public/content/translations/it/defi/index.md @@ -1,5 +1,6 @@ --- title: Finanza decentralizzata (DeFi) +metaTitle: Cos'è la DeFi? | Benefici e utilizzi della finanza decentralizzata description: Una panoramica sulla DeFi su Ethereum lang: it template: use-cases @@ -324,7 +325,7 @@ Puoi pensare alla DeFi in termini di strati: 3. I protocolli: [contratti intelligenti](/glossary/#smart-contract) che forniscono la funzionalità, ad esempio, un servizio che consente il prestito decentralizzato delle risorse. 4. [Le applicazioni](/dapps/): i prodotti che utilizziamo per gestire e accedere ai protocolli. -Nota: la DeFi usa in buona parte lo [standard ERC-20](/glossary/#erc-20). Le applicazioni in DeFi usano un wrapper per ETH chiamato Wrapped Ether (WETH). [Scopri di più sul wrapped ether](/wrapped-eth). +Nota: la DeFi usa in buona parte lo [standard ERC-20](/glossary/#erc-20). Le applicazioni nella DeFi utilizzano la versione "wrapped" di ETH, chiamata Wrapped Ether (WETH). [Scopri di più sul wrapped ether](/wrapped-eth). ## Creare DeFi {#build-defi} diff --git a/public/content/translations/pt-br/developers/docs/apis/backend/index.md b/public/content/translations/pt-br/developers/docs/apis/backend/index.md index 37821c3f2c4..3d6d8bf49b2 100644 --- a/public/content/translations/pt-br/developers/docs/apis/backend/index.md +++ b/public/content/translations/pt-br/developers/docs/apis/backend/index.md @@ -6,7 +6,7 @@ lang: pt-br Para um aplicativo de software interagir com a blockchain Ethereum (ou seja, leia os dados da blockchain e/ou envie transações para a rede), ele deve se conectar a um nó do Ethereum. -Para isso, cada cliente Ethereum implementa a especificação [JSON-RPC](/developers/docs/apis/json-rpc/), portanto, há um conjunto uniforme de [métodos](/developers/docs/apis/json-rpc/#json-rpc-methods) com os quais as aplicações podem contar. +Para este propósito, todos os clientes do Ethereum implementam a especificação [JSON-RPC](/developers/docs/apis/json-rpc/), para que haja um conjunto uniforme de [métodos](/developers/docs/apis/json-rpc/#json-rpc-methods) nos quais os aplicativos podem confiar. Se você quiser usar uma linguagem de programação específica para se conectar com um nó Ethereum, existem várias bibliotecas de conveniência dentro do ecossistema que tornam isso muito mais fácil. Com essas bibliotecas, os desenvolvedores podem escrever intuitivamente métodos on-line para iniciar requisições JSON RPC (por debaixo dos panos) que interajam com a Ethereum. @@ -20,83 +20,67 @@ Essas bibliotecas abstraem muito da complexidade de interagir diretamente com um ## Bibliotecas disponíveis {#available-libraries} +### Serviços de nós e infraestrutura {#infrastructure-and-node-services} + **Alchemy -** **_Plataforma de Desenvolvimento Ethereum._** - [alchemy.com](https://www.alchemy.com/) -- [Documentação](https://docs.alchemyapi.io/) +- [Documentação](https://docs.alchemy.com/) - [GitHub](https://github.com/alchemyplatform) -- [Discord](https://discord.com/invite/A39JVCM) +- [Discord](https://discord.com/invite/alchemyplatform) -**BlockCypher -** **_APIs Web Ethereum._** +**All That Node - ** **_Nós-como-um-serviço._** -- [blockcypher.com](https://www.blockcypher.com/) -- [Documentação](https://www.blockcypher.com/dev/ethereum/) +- [All That Node.com](https://www.allthatnode.com/) +- [Documentação](https://docs.allthatnode.com) +- [Discord](https://discord.gg/GmcdVEUbJM) -**Blast, da Bware Labs -\*\***_ APIs descentralizadas para a Ethereum Mainnet ant Testnets._\*\* +**Blast, da Bware Labs -****_ APIs descentralizadas para a Ethereum Mainnet ant Testnets._** - [blastapi.io](https://blastapi.io/) - [Documentação](https://docs.blastapi.io) -- [Discord](https://discord.com/invite/VPkWESgtvV) +- [Discord](https://discord.gg/bwarelabs) -**Infura -** **_A API da Ethereum como serviço._** +**BlockPi -** **_Fornece serviços RPC mais eficientes e mais rápidos_** -- [infura.io](https://infura.io) -- [Documentação](https://infura.io/docs) -- [GitHub](https://github.com/INFURA) +- [blockpi.io](https://blockpi.io/) +- [Documentação](https://docs.blockpi.io/) +- [GitHub](https://github.com/BlockPILabs) +- [Discord](https://discord.com/invite/xTvGVrGVZv) **Gateway Cloudflare de Ethereum.** -- [cloudflare-eth.com](https://cloudflare-eth.com) +- [cloudflare-eth.com](https://www.cloudflare.com/application-services/products/web3/) -**Nó da Nuvem da Coinbase -** **_API de infraestrutura Blockchain._** - -- [Nó da Nuvem da Coinbase](https://www.coinbase.com/cloud/products/node) -- [Documentação](https://docs.cloud.coinbase.com/node/reference/welcome-to-node) - -**DataHub por Figment -** **_Serviços de API Web3 API com rede principal Ethereum e rede de testes._** - -- [DataHub](https://www.figment.io/datahub) -- [Documentação](https://figment-docs.gitbook.io/learn-docs/introduction/what-is-datahub) +**Etherscan - Explorador de blocos e APIs de transações** +- [Documentação](https://docs.etherscan.io/) -**NFTPort -** **_Dados Ethereum e APIs Mint._** +**GetBlock-** **_Blockchain-as-a-service para desenvolvimento Web3_** -- [nftport.xyz](https://www.nftport.xyz/) -- [Documentação](https://docs.nftport.xyz/) -- [GitHub](https://github.com/nftport/) -- [Discord](https://discord.com/invite/K8nNrEgqhE) +- [GetBlock.io](https://getblock.io/) +- [Documentação](https://getblock.io/docs/) -**Nodesmith -** **_Acesso por API JSON-RPC a rede principal e rede de testes Ethereum._** +**Infura -** **_A API da Ethereum como serviço._** -- [nodesmith.io](https://nodesmith.io/network/ethereum/) -- [Documentação](https://nodesmith.io/docs/#/ethereum/apiRef) +- [infura.io](https://infura.io) +- [Documentação](https://docs.infura.io/api) +- [GitHub](https://github.com/INFURA) -**Ethercluster -** **_Execute o seu próprio serviço de API da Ethereum que suporta ETH e ETC._** +**Node RPC - _Provedor de EVM JSON-RPC econômico_** -- [ethercluster.com](https://etccooperative.github.io/ethercluster-website/) +- [noderpc.xyz](https://www.noderpc.xyz/) +- [Documentação](https://docs.noderpc.xyz/node-rpc) -**Chainstack -** **_Nós Ethereum compartilhados e dedicados como serviço._** +**NOWNodes - _Nós Completos e Exploradores de Blocos._** -- [chainstack.com](https://chainstack.com) -- [Documentação](https://docs.chainstack.com) -- [Referência da API Ethereum](https://docs.chainstack.com/api/ethereum/ethereum-api-reference) +- [NOWNodes.io](https://nownodes.io/) +- [Documentação](https://documenter.getpostman.com/view/13630829/TVmFkLwy#intro) **QuickNode -** **_Infraestrutura Blockchain como Serviço._** - [quicknode.com](https://quicknode.com) -- [Documentação](https://www.quicknode.com/docs) -- [Discord](https://discord.gg/NaR7TtpvJq) - -**Python Tooling -** **_Variedade de bibliotecas para interação com a Ethereum via Python._** - -- [py.ethereum.org](http://python.ethereum.org/) -- [web3.py GitHub](https://github.com/ethereum/web3.py) -- [web3.py Chat](https://gitter.im/ethereum/web3.py) - -**web3j -** **_Uma biblioteca de integração para Ethereum em Java/Android/Kotlin/Scala._** - -- [GitHub](https://github.com/web3j/web3j) -- [Documentação](https://docs.web3j.io/) -- [Gitter](https://gitter.im/web3j/web3j) +- [Documentação](https://www.quicknode.com/docs/welcome) +- [Discord](https://discord.gg/quicknode) **Rivet -** **_Ethereum e Ethereum Classic APIs como serviço, desenvolvido por software de código aberto._** @@ -104,12 +88,33 @@ Essas bibliotecas abstraem muito da complexidade de interagir diretamente com um - [Documentação](https://rivet.cloud/docs/) - [GitHub](https://github.com/openrelayxyz/ethercattle-deployment) +**Zmok -** **_Nós Ethereum orientados a velocidade como JSON-RPC/WebSockets API._** + +- [zmok.io](https://zmok.io/) +- [GitHub](https://github.com/zmok-io) +- [Documentação](https://docs.zmok.io/) +- [Discord](https://discord.gg/fAHeh3ka6s) + +### Ferramentas de desenvolvimento {#development-tools} + +**ethers-kt -** **_Biblioteca assíncrona de alto desempenho em Kotlin/Java/Android para blockchains baseadas em EVM._** + +- [GitHub](https://github.com/Kr1ptal/ethers-kt) +- [Exemplos](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) +- [Discord](https://discord.gg/rx35NzQGSb) + **Nethereum -** **_Uma biblioteca de integração .NET de código aberto para blockchain._** - [GitHub](https://github.com/Nethereum/Nethereum) - [Documentação](http://docs.nethereum.com/en/latest/) - [Discord](https://discord.com/invite/jQPrR58FxX) +**Python Tooling -** **_Variedade de bibliotecas para interação com a Ethereum via Python._** + +- [py.ethereum.org](https://python.ethereum.org/) +- [web3.py GitHub](https://github.com/ethereum/web3.py) +- [web3.py Chat](https://gitter.im/ethereum/web3.py) + **QuikNode -** **_A plataforma definitiva de desenvolvimento de blockchains_** - [Tatum](https://tatum.io/) @@ -117,40 +122,79 @@ Essas bibliotecas abstraem muito da complexidade de interagir diretamente com um - [Documentação](https://docs.tatum.io/) - [Discord](https://discord.gg/EDmW3kjTC9) -**Watchdata -** **_Fornecer acesso API simples e confiável à blockchain Ethereum._** +**web3j -** **_Uma biblioteca de integração para Ethereum em Java/Android/Kotlin/Scala._** -- [Watchdata](https://watchdata.io/) -- [Documentação](https://docs.watchdata.io/) -- [Discord](https://discord.com/invite/TZRJbZ6bdn) +- [GitHub](https://github.com/web3j/web3j) +- [Documentação](https://docs.web3j.io/) +- [Gitter](https://gitter.im/web3j/web3j) -**Zmok -** **_Nós Ethereum orientados a velocidade como JSON-RPC/WebSockets API._** +### Serviços blockchain {#blockchain-services} -- [zmok.io](https://zmok.io/) -- [GitHub](https://github.com/zmok-io) -- [Documentação](https://docs.zmok.io/) -- [Discord](https://discord.gg/fAHeh3ka6s) +**BlockCypher -** **_APIs Web Ethereum._** -**NOWNodes - _Nós Completos e Exploradores de Blocos._** +- [blockcypher.com](https://www.blockcypher.com/) +- [Documentação](https://www.blockcypher.com/dev/ethereum/) -- [NOWNodes.io](https://nownodes.io/) -- [Documentação](https://documenter.getpostman.com/view/13630829/TVmFkLwy#intro) +**Chainbase -** **_Infraestrutura de dados web3 tudo-em-um para Ethereum._** + +- [chainbase.com](https://chainbase.com/) +- [Documentação](https://docs.chainbase.com/) +- [Discord](https://discord.gg/Wx6qpqz4AF) + +**Chainstack -** **_Nós Ethereum compartilhados e dedicados como serviço._** + +- [chainstack.com](https://chainstack.com) +- [Documentação](https://docs.chainbase.com/docs) +- [Referência da API Ethereum](https://docs.chainstack.com/reference/ethereum-getting-started) + +**Nó da Nuvem da Coinbase -** **_API de infraestrutura Blockchain._** + +- [Nó da Nuvem da Coinbase](https://www.coinbase.com/cloud) +- [Documentação](https://docs.cloud.coinbase.com/) + +**DataHub por Figment -** **_Serviços de API Web3 API com rede principal Ethereum e rede de testes._** + +- [DataHub](https://www.figment.io/) +- [Documentação](https://docs.figment.io/) **Moralis -** **_Provedor de API para EVM para uso corporativo._** -- [moralis.io](http://moralis.io) +- [moralis.io](https://moralis.io) - [Documentação](https://docs.moralis.io/) - [GitHub](https://github.com/MoralisWeb3) -- [Discord](https://discord.com/invite/KYswaxwEtg) +- [Discord](https://moralis.io/joindiscord/) - [Fórum](https://forum.moralis.io/) -\*_GetBlock- Blockchain como serviço para desenvolvimento Web3_ +**NFTPort -** **_Dados Ethereum e APIs Mint._** + +- [nftport.xyz](https://www.nftport.xyz/) +- [Documentação](https://docs.nftport.xyz/) +- [GitHub](https://github.com/nftport/) +- [Discord](https://discord.com/invite/K8nNrEgqhE) + +**Tokenview -** **_A plataforma geral de APIs blockchain multi-cripto._** + +- [services.tokenview.io](https://services.tokenview.io/) +- [Documentação](https://services.tokenview.io/docs?type=api) +- [GitHub](https://github.com/Tokenview) + +**Watchdata -** **_Fornecer acesso API simples e confiável à blockchain Ethereum._** + +- [Watchdata](https://watchdata.io/) +- [Documentação](https://docs.watchdata.io/) +- [Discord](https://discord.com/invite/TZRJbZ6bdn) + +**Covalent -** **_APIs de blockchain enriquecidas para mais de 200 redes._** + +- [covalenthq.com](https://www.covalenthq.com/) +- [Documentação](https://www.covalenthq.com/docs/api/) +- [GitHub](https://github.com/covalenthq) +- [Discord](https://www.covalenthq.com/discord/) -- [GetBlock.io](https://getblock.io/) -- [Documentação](https://getblock.io/docs/) ## Leitura adicional {#further-reading} -_Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione!_ +_Conhece um recurso da comunidade que te ajudou? Edite essa página e adicione!_ ## Tópicos relacionados {#related-topics} @@ -159,5 +203,5 @@ _Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione ## Tutoriais relacionados {#related-tutorials} -- [Configure o Web3js para usar a blockchain Ethereum em JavaScript](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Instruções para configurar o web3.js em seu projeto._ -- [Chamando um contrato inteligente do JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Usando o token do DAI, veja como os contratos de chamadas funcionam usando JavaScript._ +- [Configure Web3js para usar a blockchain Ethereum em Javascript](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _ – Instruções para configurar web3.js no seu projeto._ +- [Chamando um contrato inteligente do JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _ – Usando o token do DAI, veja como os contratos de chamadas funcionam usando JavaScript._ diff --git a/public/content/translations/zh-tw/defi/index.md b/public/content/translations/zh-tw/defi/index.md index e2ab11cee56..4f64e1eb1de 100644 --- a/public/content/translations/zh-tw/defi/index.md +++ b/public/content/translations/zh-tw/defi/index.md @@ -1,5 +1,6 @@ --- title: 去中心化金融 (DeFi) +metaTitle: 甚麼是去中心化金融? | 去中心化金融的優點和作用 description: 以太坊生態系之去中心化金融概要 lang: zh-tw template: use-cases @@ -324,7 +325,7 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 3. 協定:提供功能的[智慧型合約](/glossary/#smart-contract),例如實現去中心化資產借貸的服務。 4. [應用程式](/dapps/):我們用以管理及存取協定的產品。 -注意:很多去中心化金融使用 [ERC-20 標準](/glossary/#erc-20)。 去中心化金融應用程式會使用一種稱為包裝以太幣(WETH) 的以太幣包裝程式。 [了解更多關於包裝以太幣的資訊](/wrapped-eth)。 +注意:很多去中心化金融使用 [ERC-20 標準](/glossary/#erc-20)。 去中心化金融 (DeFi) 中的應用程式使用一種包裝的以太幣,稱爲包裝以太幣 (WETH)。 [了解更多關於包裝以太幣的資訊](/wrapped-eth)。 ## 建構去中心化金融 {#build-defi} From 0713c4f11945cc762ddb7e4a078eb5cc34c2e13e Mon Sep 17 00:00:00 2001 From: Nuno Loureiro Date: Thu, 15 May 2025 11:55:38 +0100 Subject: [PATCH 097/368] remove innacurated content from the roadmap page --- app/[locale]/roadmap/_components/roadmap.tsx | 26 +------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/app/[locale]/roadmap/_components/roadmap.tsx b/app/[locale]/roadmap/_components/roadmap.tsx index b373eb20747..4bcb4d06469 100644 --- a/app/[locale]/roadmap/_components/roadmap.tsx +++ b/app/[locale]/roadmap/_components/roadmap.tsx @@ -10,11 +10,8 @@ import { DankshardingIcon, ExtraSecurityIcon, FutureProofingIcon, - ProposerBuilderSeparationIcon, - SecretLeaderElectionIcon, SingleSlotFinalityIcon, StatelessnessIcon, - VerkleTreesIcon, } from "@/components/icons/roadmap" import { Image } from "@/components/Image" import MainArticle from "@/components/MainArticle" @@ -98,20 +95,6 @@ const RoadmapPage = () => { "Instead of waiting for fifteen minutes, blocks could get proposed and finalized in the same slot. This is more convenient for apps and difficult to attack.", href: "/roadmap/single-slot-finality", }, - { - icon: , - title: "Proposer-builder separation", - description: - "Splitting the block building and block proposal tasks across separate validators creates a fairer, more censorship resistant and efficient way for Ethereum to come to consensus.", - href: "/roadmap/pbs", - }, - { - icon: , - title: "Secret leader election", - description: - "Clever cryptography can be used to ensure that the identity of the current block proposer is not made public, protecting them from certain types of attack.", - href: "/roadmap/secret-leader-election", - }, { icon: , title: "Account abstraction", @@ -119,13 +102,6 @@ const RoadmapPage = () => { "Account abstraction is a class of upgrades that support smart contract wallets natively on Ethereum, rather than having to use complex middleware.", href: "/roadmap/account-abstraction", }, - { - icon: , - title: "Verkle trees", - description: - "Verkle trees are a data structure that can be used to enable stateless clients on Ethereum. These clients will require a small amount of storage space but will still be able to verify new blocks.", - href: "/roadmap/verkle-trees", - }, { icon: , title: "Statelessness", @@ -238,7 +214,7 @@ const RoadmapPage = () => {

What technical upgrades are coming to Ethereum?

-
+
{technicalUpgradesItems.map((item) => ( Date: Mon, 26 May 2025 14:42:30 +0800 Subject: [PATCH 098/368] fix(validium): DA post-4844 --- public/content/developers/docs/scaling/validium/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/developers/docs/scaling/validium/index.md b/public/content/developers/docs/scaling/validium/index.md index 895332b57c6..59419e871eb 100644 --- a/public/content/developers/docs/scaling/validium/index.md +++ b/public/content/developers/docs/scaling/validium/index.md @@ -69,11 +69,11 @@ As an anti-censorship mechanism, the validium protocol allows users to withdraw After executing a batch of transactions, the operator submits the associated validity proof to the verifier contract and proposes a new state root to the main contract. If the proof is valid, the main contract updates the validium's state and finalizes the results of transactions in the batch. -Unlike a ZK-rollup, block producers on a validium are not required to publish transaction data for transaction batches (only block headers). This makes validium a purely offchain scaling protocol, as opposed to "hybrid" scaling protocols (i.e., [layer 2](/layer-2/)) that publish state data on the main Ethereum chain as `calldata`. +Unlike a ZK-rollup, block producers on a validium are not required to publish transaction data for transaction batches (only block headers). This makes validium a purely offchain scaling protocol, as opposed to "hybrid" scaling protocols (i.e., [layer 2](/layer-2/)) that publish state data on the main Ethereum chain using blob data, `calldata`, or a combination of both. ### Data availability {#data-availability} -As mentioned, validiums utilize an offchain data availability model, where operators store all transaction data off Ethereum Mainnet. Validium's low onchain data footprint improves scalability (throughput isn't limited by Ethereum's data processing capacity) and reduces user fees (the cost of publishing `calldata` is lower). +As mentioned, validiums utilize an offchain data availability model, where operators store all transaction data off Ethereum Mainnet. Validium's low onchain data footprint improves scalability (throughput isn't limited by Ethereum's data processing capacity) and reduces user fees (the cost of publishing data onchain is lower). Offchain data availability, however, presents a problem: data necessary for creating or verifying Merkle proofs may be unavailable. This means users may be unable to withdraw funds from the onchain contract if operators should act maliciously. From 93d9e5918baffca90ee9e96eb21eccee5e8c9aa3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:12:18 -0700 Subject: [PATCH 099/368] refactor: migrate tutorials page to SSR --- .../tutorials/_components/modal.tsx | 76 +++++++++++++++ .../tutorials/_components/tutorials.tsx | 92 +++---------------- app/[locale]/developers/tutorials/page.tsx | 34 ++++++- src/lib/utils/md.ts | 69 +++++++------- 4 files changed, 154 insertions(+), 117 deletions(-) create mode 100644 app/[locale]/developers/tutorials/_components/modal.tsx diff --git a/app/[locale]/developers/tutorials/_components/modal.tsx b/app/[locale]/developers/tutorials/_components/modal.tsx new file mode 100644 index 00000000000..a9ff352f5fc --- /dev/null +++ b/app/[locale]/developers/tutorials/_components/modal.tsx @@ -0,0 +1,76 @@ +"use client" + +import React, { useState } from "react" +import { FaGithub } from "react-icons/fa" + +import Translation from "@/components/Translation" +import { Button } from "@/components/ui/buttons/Button" +import { ButtonLink } from "@/components/ui/buttons/Button" +import Modal from "@/components/ui/dialog-modal" +import { Flex } from "@/components/ui/flex" + +import { trackCustomEvent } from "@/lib/utils/matomo" + +import { useBreakpointValue } from "@/hooks/useBreakpointValue" + +const TutorialSubmitModal = ({ + dir, +}: Pick, "dir">) => { + const [isModalOpen, setModalOpen] = useState(false) + + const modalSize = useBreakpointValue({ base: "xl", md: "md" } as const) + + return ( + <> + setModalOpen(open)} + size={modalSize} + contentProps={{ dir }} + title={ + + } + > +

+ +

+ + + + + +

+ +

+ + + + +
+
+
+ + + + ) +} + +TutorialSubmitModal.displayName = "TutorialSubmitModal" + +export default TutorialSubmitModal diff --git a/app/[locale]/developers/tutorials/_components/tutorials.tsx b/app/[locale]/developers/tutorials/_components/tutorials.tsx index 879f4ba9cbc..523cd9a0c73 100644 --- a/app/[locale]/developers/tutorials/_components/tutorials.tsx +++ b/app/[locale]/developers/tutorials/_components/tutorials.tsx @@ -9,18 +9,14 @@ import React, { useState, } from "react" import { useLocale } from "next-intl" -import { FaGithub } from "react-icons/fa" import { ITutorial, Lang } from "@/lib/types" import Emoji from "@/components/Emoji" -import FeedbackCard from "@/components/FeedbackCard" -import MainArticle from "@/components/MainArticle" import Translation from "@/components/Translation" import { getSkillTranslationId } from "@/components/TutorialMetadata" import TutorialTags from "@/components/TutorialTags" -import { Button, ButtonLink } from "@/components/ui/buttons/Button" -import Modal from "@/components/ui/dialog-modal" +import { Button } from "@/components/ui/buttons/Button" import { Flex, FlexProps } from "@/components/ui/flex" import { Tag, TagButton } from "@/components/ui/tag" @@ -36,12 +32,6 @@ import externalTutorials from "@/data/externalTutorials.json" import { DEFAULT_LOCALE } from "@/lib/constants" -import { useBreakpointValue } from "@/hooks/useBreakpointValue" - -type LinkFlexProps = FlexProps & { - href: string -} - const FilterTag = forwardRef< HTMLButtonElement, { isActive: boolean; name: string } & ButtonHTMLAttributes @@ -66,6 +56,10 @@ const Text = ({ className, ...props }: HTMLAttributes) => (

) +type LinkFlexProps = FlexProps & { + href: string +} + const LinkFlex = ({ href, children, ...props }: LinkFlexProps) => { return ( @@ -85,15 +79,11 @@ const published = (locale: string, published: string) => { ) : null } -type TutorialPageProps = { +type TutorialsListProps = { internalTutorials: ITutorial[] - contentNotTranslated: boolean } -const TutorialPage = ({ - internalTutorials, - contentNotTranslated, -}: TutorialPageProps) => { +const TutorialsList = ({ internalTutorials }: TutorialsListProps) => { const locale = useLocale() const effectiveLocale = internalTutorials.length > 0 ? locale : DEFAULT_LOCALE const filteredTutorialsByLang = useMemo( @@ -111,7 +101,6 @@ const TutorialPage = ({ [filteredTutorialsByLang] ) - const [isModalOpen, setModalOpen] = useState(false) const [filteredTutorials, setFilteredTutorials] = useState( filteredTutorialsByLang ) @@ -152,66 +141,8 @@ const TutorialPage = ({ setSelectedTags([...tempSelectedTags]) } - const dir = contentNotTranslated ? "ltr" : "unset" - - const modalSize = useBreakpointValue({ base: "xl", md: "md" } as const) return ( - -

- -

- - - - - setModalOpen(open)} - size={modalSize} - contentProps={{ dir }} - title={ - - } - > - - - - - - - - - - - - - - - - - - - - - + <>
@@ -312,9 +243,10 @@ const TutorialPage = ({ ) })}
- - + ) } -export default TutorialPage +TutorialsList.displayName = "TutorialsList" + +export default TutorialsList diff --git a/app/[locale]/developers/tutorials/page.tsx b/app/[locale]/developers/tutorials/page.tsx index 16b6295ffde..87d854c68ce 100644 --- a/app/[locale]/developers/tutorials/page.tsx +++ b/app/[locale]/developers/tutorials/page.tsx @@ -7,20 +7,28 @@ import { import { Lang } from "@/lib/types" +import FeedbackCard from "@/components/FeedbackCard" import I18nProvider from "@/components/I18nProvider" +import MainArticle from "@/components/MainArticle" import { existsNamespace } from "@/lib/utils/existsNamespace" import { getTutorialsData } from "@/lib/utils/md" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" -import Tutorials from "./_components/tutorials" +import TutorialSubmitModal from "./_components/modal" +import TutorialsList from "./_components/tutorials" const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { const { locale } = await params setRequestLocale(locale) + const t = await getTranslations({ + locale, + namespace: "page-developers-tutorials", + }) + // Get i18n messages const allMessages = await getMessages({ locale }) const requiredNamespaces = getRequiredNamespacesForPage( @@ -29,13 +37,29 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { const messages = pick(allMessages, requiredNamespaces) const contentNotTranslated = !existsNamespace(locale!, requiredNamespaces[2]) + const dir = contentNotTranslated ? "ltr" : "unset" + + const internalTutorials = await getTutorialsData(locale) return ( - + +

+ {t("page-tutorial-title")} +

+

+ {t("page-tutorial-subtitle")} +

+ + + + + + +
) } diff --git a/src/lib/utils/md.ts b/src/lib/utils/md.ts index 24c9414c540..810b2dc437b 100644 --- a/src/lib/utils/md.ts +++ b/src/lib/utils/md.ts @@ -1,4 +1,3 @@ -import fs from "fs" import fsp from "fs/promises" import { extname, join } from "path" @@ -59,44 +58,50 @@ export const getPostSlugs = async (dir: string, filterRegex?: RegExp) => { return files } -export const getTutorialsData = (locale: string): ITutorial[] => { +export const getTutorialsData = async ( + locale: string +): Promise => { const contentRoot = getContentRoot() const fullPath = join( contentRoot, locale !== "en" ? `translations/${locale!}` : "", "developers/tutorials" ) - let tutorialData: ITutorial[] = [] - - if (fs.existsSync(fullPath)) { - const languageTutorialFiles = fs.readdirSync(fullPath) - - tutorialData = languageTutorialFiles.map((dir) => { - const filePath = join( - contentRoot, - locale !== "en" ? `translations/${locale!}` : "", - "developers/tutorials", - dir, - "index.md" - ) - const fileContents = fs.readFileSync(filePath, "utf8") - const { data, content } = matter(fileContents) - const frontmatter = data as Frontmatter - - return { - href: join(`/${locale}/developers/tutorials`, dir), - title: frontmatter.title, - description: frontmatter.description, - author: frontmatter.author || "", - tags: frontmatter.tags, - skill: frontmatter.skill as Skill, - timeToRead: Math.round(readingTime(content).minutes), - published: dateToString(frontmatter.published), - lang: frontmatter.lang, - isExternal: false, - } - }) + const tutorialData: ITutorial[] = [] + + const stats = await fsp.stat(fullPath) + if (!stats.isDirectory()) { + console.warn(`Tutorials directory not found for locale: ${locale}`) + return tutorialData // Return empty if the directory does not exist } + const languageTutorialFiles = await fsp.readdir(fullPath) + + languageTutorialFiles.forEach(async (dir) => { + const filePath = join( + contentRoot, + locale !== "en" ? `translations/${locale!}` : "", + "developers/tutorials", + dir, + "index.md" + ) + const fileContents = await fsp.readFile(filePath, "utf8") + const { data, content } = matter(fileContents) + const frontmatter = data as Frontmatter + + tutorialData.push({ + href: join(`/${locale}/developers/tutorials`, dir), + title: frontmatter.title, + description: frontmatter.description, + author: frontmatter.author || "", + tags: frontmatter.tags, + skill: frontmatter.skill as Skill, + timeToRead: Math.round(readingTime(content).minutes), + published: dateToString(frontmatter.published), + lang: frontmatter.lang, + isExternal: false, + }) + }) + return tutorialData } From 8685f755287c852b2c67855df46d39cfb8e25e6e Mon Sep 17 00:00:00 2001 From: Pablo Date: Fri, 30 May 2025 14:38:36 +0200 Subject: [PATCH 100/368] initial setup for playwright with basic tests and ci integration --- .github/workflows/playwright.yml | 47 ++++++++++++ package.json | 7 +- playwright.config.ts | 46 +++++++++++ src/components/Nav/Mobile/HamburgerButton.tsx | 2 +- tests/e2e/.gitignore | 2 + tests/e2e/home.spec.ts | 76 +++++++++++++++++++ 6 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/playwright.yml create mode 100644 playwright.config.ts create mode 100644 tests/e2e/.gitignore create mode 100644 tests/e2e/home.spec.ts diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 00000000000..7746804ea88 --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,47 @@ +name: E2E Tests +on: + push: + branches: [master, staging, e2e-tests] # TODO: remove e2e-tests (testing branch) + pull_request: + branches: [master, staging, e2e-tests] # TODO: remove e2e-tests (testing branch) +jobs: + test: + runs-on: ubuntu-latest + env: + CI: true + steps: + - uses: actions/checkout@v4 + + - name: Sleep for 30 minutes + run: sleep 1800 + + - name: Wait for Netlify Deploy + id: netlify_deploy + uses: probablyup/wait-for-netlify-action@3.2.0 + with: + site_id: "e8f2e766-888b-4954-8500-1b647d84db99" + max_timeout: 1800 + env: + NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }} + + - uses: actions/setup-node@v4 + with: + node-version: lts/* + + - name: Install dependencies + run: yarn + + - name: Install Playwright with all browsers + run: npx playwright install --with-deps + + - name: Run E2E Tests on Netlify URL + run: yarn test:e2e + env: + PLAYWRIGHT_TEST_BASE_URL: ${{ steps.netlify_deploy.outputs.url }} + + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: tests/e2e/__report__/ + retention-days: 7 diff --git a/package.json b/package.json index c06f45c9f63..cafaccbe46a 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,11 @@ "markdown-checker": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/markdownChecker.ts", "events-import": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/events-import.ts", "crowdin-needs-review": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/crowdin/reports/generateReviewReport.ts", - "prepare": "husky" + "prepare": "husky", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "test:e2e:debug": "playwright test --debug", + "test:e2e:report": "playwright show-report" }, "dependencies": { "@crowdin/crowdin-api-client": "^1.25.0", @@ -98,6 +102,7 @@ "devDependencies": { "@chromatic-com/storybook": "1.5.0", "@netlify/plugin-nextjs": "^5.10.0", + "@playwright/test": "^1.52.0", "@storybook/addon-essentials": "8.6.14", "@storybook/addon-interactions": "8.6.14", "@storybook/addon-links": "8.6.14", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000000..6dd5c6789fd --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,46 @@ +import { defineConfig, devices } from "@playwright/test" + +import "dotenv/config" + +export default defineConfig({ + testDir: "./tests/e2e", + outputDir: "./tests/e2e/__results__", + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: process.env.CI + ? "dot" + : [["html", { outputFolder: "./tests/e2e/__report__" }]], + use: { + baseURL: process.env.PLAYWRIGHT_TEST_BASE_URL || "http://localhost:3000", + trace: "on-first-retry", + screenshot: "only-on-failure", + }, + projects: [ + /* Test against desktop browsers */ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + { + name: "webkit", + use: { ...devices["Desktop Safari"] }, + }, + /* Test against mobile viewports. */ + { + name: "Mobile Chrome", + use: { ...devices["Pixel 5"] }, + }, + { + name: "Mobile Safari", + use: { ...devices["iPhone 12"] }, + }, + ], + webServer: { + command: "yarn dev", + url: "http://localhost:3000", + reuseExistingServer: !process.env.CI, + timeout: 3 * 60 * 1000, // 3 minutes + }, +}) diff --git a/src/components/Nav/Mobile/HamburgerButton.tsx b/src/components/Nav/Mobile/HamburgerButton.tsx index 15fa6f967a7..61dd739cbe6 100644 --- a/src/components/Nav/Mobile/HamburgerButton.tsx +++ b/src/components/Nav/Mobile/HamburgerButton.tsx @@ -31,7 +31,7 @@ const HamburgerButton = forwardRef(
- +
diff --git a/src/components/ProductTable/PresetFilters.tsx b/src/components/ProductTable/PresetFilters.tsx index 005af344e43..82218857398 100644 --- a/src/components/ProductTable/PresetFilters.tsx +++ b/src/components/ProductTable/PresetFilters.tsx @@ -49,6 +49,7 @@ const PresetFilters = ({ ? "grid grid-cols-2 gap-2 pb-5" : "grid auto-cols-[200px] grid-flow-col gap-4 overflow-x-auto px-4 lg:auto-cols-fr" }`} + data-testid="preset-filters-container" > {presets.map((preset, idx) => { const colorIdx = colors.text[idx] ? idx : idx % colors.text.length diff --git a/src/components/Search/SearchButton.tsx b/src/components/Search/SearchButton.tsx index 297120a8671..46308a89364 100644 --- a/src/components/Search/SearchButton.tsx +++ b/src/components/Search/SearchButton.tsx @@ -14,7 +14,6 @@ const SearchButton = forwardRef( return ( ) diff --git a/src/components/BarChart/index.tsx b/src/components/BarChart/index.tsx index 983b63f8fae..468f786fe9f 100644 --- a/src/components/BarChart/index.tsx +++ b/src/components/BarChart/index.tsx @@ -1,6 +1,6 @@ "use client" -import { FaArrowTrendUp } from "react-icons/fa6" +import { TrendingUp } from "lucide-react" import { Bar, BarChart as RechartsBarChart, @@ -103,7 +103,7 @@ export function BarChart({
{footerText && (
- {footerText} + {footerText}
)} {footerSubText && ( diff --git a/src/components/CopyToClipboard.tsx b/src/components/CopyToClipboard.tsx index 9bfe0d5ec0c..68c81e4d554 100644 --- a/src/components/CopyToClipboard.tsx +++ b/src/components/CopyToClipboard.tsx @@ -1,7 +1,6 @@ "use client" -import { BsCopy } from "react-icons/bs" -import { FaRegCheckCircle } from "react-icons/fa" +import { CheckCircle, Copy } from "lucide-react" import { cn } from "@/lib/utils/cn" @@ -42,7 +41,7 @@ export const CopyButton = ({ message, ...props }: CopyButtonProps) => { const { onCopy, hasCopied } = useClipboard({ timeout: 1500 }) return ( ) } diff --git a/src/components/DocLink/index.tsx b/src/components/DocLink/index.tsx index a5e4b7fc61c..b00fef3853d 100644 --- a/src/components/DocLink/index.tsx +++ b/src/components/DocLink/index.tsx @@ -1,4 +1,4 @@ -import { AiOutlineArrowRight } from "react-icons/ai" +import { ArrowRight } from "lucide-react" import { cn } from "@/lib/utils/cn" @@ -40,7 +40,7 @@ const DocLink = ({ href, children, isExternal = false }: DocLinkProps) => { - {t("eth-current-price")} - + diff --git a/src/components/IdAnchor.tsx b/src/components/IdAnchor.tsx index ea151b87b93..b15fb0b8057 100644 --- a/src/components/IdAnchor.tsx +++ b/src/components/IdAnchor.tsx @@ -1,4 +1,4 @@ -import { CiLink } from "react-icons/ci" +import { Link } from "lucide-react" import { BaseLink } from "@/components/ui/Link" @@ -10,7 +10,7 @@ const IdAnchor = ({ id }: { id?: string }) => { aria-label={id.replaceAll("-", " ") + " permalink"} href={"#" + id} > - + ) } diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index b7bfbba209b..994c9c34f6b 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -1,6 +1,6 @@ import { ComponentPropsWithoutRef } from "react" +import { Check } from "lucide-react" import { useLocale } from "next-intl" -import { BsCheck } from "react-icons/bs" import type { LocaleDisplayInfo } from "@/lib/types" @@ -73,7 +73,7 @@ const MenuItem = ({ displayInfo, ...props }: ItemProps) => {

{sourceName}

{isCurrent && ( - diff --git a/src/components/ProductTable/FilterInputs/SwitchFilterInput.tsx b/src/components/ProductTable/FilterInputs/SwitchFilterInput.tsx index 3c8b3d4685b..5782ee5894c 100644 --- a/src/components/ProductTable/FilterInputs/SwitchFilterInput.tsx +++ b/src/components/ProductTable/FilterInputs/SwitchFilterInput.tsx @@ -1,12 +1,11 @@ import { ReactElement } from "react" -import type { IconType } from "react-icons" import { FilterInputState } from "@/lib/types" import Switch from "@/components/ui/switch" interface SwitchFilterInputProps { - Icon?: IconType + Icon?: React.FC> label: string description?: string | ReactElement filterIndex: number diff --git a/src/components/ProductTable/Filters.tsx b/src/components/ProductTable/Filters.tsx index f965372c3df..8aee6180b83 100644 --- a/src/components/ProductTable/Filters.tsx +++ b/src/components/ProductTable/Filters.tsx @@ -1,4 +1,4 @@ -import { BsArrowCounterclockwise } from "react-icons/bs" +import { RotateCcw } from "lucide-react" import { FilterInputState, FilterOption } from "@/lib/types" @@ -85,7 +85,7 @@ const Filters = ({ className="min-h-0 gap-1 p-0" onClick={resetFilters} > - + {t("table-reset-filters")}
diff --git a/src/components/ProductTable/MobileFilters.tsx b/src/components/ProductTable/MobileFilters.tsx index b19fcd8bcd9..da496ed8fd3 100644 --- a/src/components/ProductTable/MobileFilters.tsx +++ b/src/components/ProductTable/MobileFilters.tsx @@ -1,6 +1,5 @@ import React from "react" -import { BsArrowCounterclockwise } from "react-icons/bs" -import { IoClose } from "react-icons/io5" // Add this import +import { RotateCcw, X } from "lucide-react" import { FilterOption, TPresetFilters } from "@/lib/types" @@ -79,7 +78,7 @@ const MobileFilters = ({
@@ -106,7 +105,7 @@ const MobileFilters = ({ className="gap-1" onClick={resetFilters} > - + {t("table-reset-filters")} diff --git a/src/components/Simulator/ClickAnimation.tsx b/src/components/Simulator/ClickAnimation.tsx index 4f6d5238748..338c2eb45a0 100644 --- a/src/components/Simulator/ClickAnimation.tsx +++ b/src/components/Simulator/ClickAnimation.tsx @@ -3,22 +3,10 @@ import { motion, type Transition } from "framer-motion" import { cn } from "@/lib/utils/cn" -import { createIconBase } from "../icons/icon-base" import { Flex } from "../ui/flex" const MotionFlex = motion(Flex) -const DownArrowLong = motion( - createIconBase({ - displayName: "DownArrowLong", - viewBox: "0 0 8 24", - className: "fill-current", - children: ( - - ), - }) -) - type ClickAnimationProps = { children: ReactNode below?: boolean @@ -60,11 +48,17 @@ export const ClickAnimation = ({ transition={transition} >

{children}

- + > + + ) : null diff --git a/src/components/Simulator/Explanation.tsx b/src/components/Simulator/Explanation.tsx index c9cc84c96fd..e4bb59a1369 100644 --- a/src/components/Simulator/Explanation.tsx +++ b/src/components/Simulator/Explanation.tsx @@ -1,6 +1,6 @@ import React from "react" import { motion } from "framer-motion" -import { MdArrowBack } from "react-icons/md" +import { ArrowLeft } from "lucide-react" import type { SimulatorNavProps } from "@/lib/types" @@ -61,7 +61,7 @@ export const Explanation = ({ variants={backButtonVariants} animate={step === 0 ? "hidden" : "visible"} > - + Back diff --git a/src/components/Simulator/MoreInfoPopover.tsx b/src/components/Simulator/MoreInfoPopover.tsx index 15764038122..a3ab55255f8 100644 --- a/src/components/Simulator/MoreInfoPopover.tsx +++ b/src/components/Simulator/MoreInfoPopover.tsx @@ -1,6 +1,6 @@ import { type ReactNode, useState } from "react" import { motion } from "framer-motion" -import { MdClose, MdInfoOutline } from "react-icons/md" +import { Info, X } from "lucide-react" import { Button } from "../ui/buttons/Button" import { @@ -30,7 +30,7 @@ export const MoreInfoPopover = ({ isFirstStep, children }: MoreInfoPopover) => { data-testid="more-info-popover-trigger" > More info - + {isFirstStep && !clicked && } @@ -39,7 +39,7 @@ export const MoreInfoPopover = ({ isFirstStep, children }: MoreInfoPopover) => { data-testid="more-info-popover-content" > - +
{children}
diff --git a/src/components/Simulator/NotificationPopover.tsx b/src/components/Simulator/NotificationPopover.tsx index c2c3431c376..0ae69155c4e 100644 --- a/src/components/Simulator/NotificationPopover.tsx +++ b/src/components/Simulator/NotificationPopover.tsx @@ -1,5 +1,5 @@ -import React, { type ReactNode } from "react" -import { MdClose } from "react-icons/md" +import { type ReactNode } from "react" +import { X } from "lucide-react" import { Flex } from "../ui/flex" import { @@ -36,7 +36,7 @@ export const NotificationPopover = ({ {title || ""} - +
{content}
diff --git a/src/components/Simulator/WalletHome/AddressPill.tsx b/src/components/Simulator/WalletHome/AddressPill.tsx index 66bde434cbb..65df2ba8755 100644 --- a/src/components/Simulator/WalletHome/AddressPill.tsx +++ b/src/components/Simulator/WalletHome/AddressPill.tsx @@ -1,5 +1,4 @@ -import React from "react" -import { MdContentCopy } from "react-icons/md" +import { Copy } from "lucide-react" import { Flex, type FlexProps } from "@/components/ui/flex" @@ -18,7 +17,7 @@ export const AddressPill = ({ ...btnProps }: AddressPillProps) => ( {...btnProps} >

{FAKE_DEMO_ADDRESS}

- + ) diff --git a/src/components/Simulator/WalletHome/SendReceiveButton.tsx b/src/components/Simulator/WalletHome/SendReceiveButton.tsx index ec5e3fd836f..60f6e284eb3 100644 --- a/src/components/Simulator/WalletHome/SendReceiveButton.tsx +++ b/src/components/Simulator/WalletHome/SendReceiveButton.tsx @@ -1,5 +1,5 @@ import { type ReactNode } from "react" -import type { IconType } from "react-icons/lib" +import { LucideIcon } from "lucide-react" import { Button } from "@/components/ui/buttons/Button" @@ -9,7 +9,7 @@ import { ClickAnimation } from "../ClickAnimation" import { PulseAnimation } from "../PulseAnimation" type SendReceiveButtonProps = { - icon: IconType + icon: LucideIcon | React.FC> isHighlighted: boolean isDisabled: boolean onClick?: () => void diff --git a/src/components/Simulator/WalletHome/SendReceiveButtons.tsx b/src/components/Simulator/WalletHome/SendReceiveButtons.tsx index 41368128057..148cdf6a3c2 100644 --- a/src/components/Simulator/WalletHome/SendReceiveButtons.tsx +++ b/src/components/Simulator/WalletHome/SendReceiveButtons.tsx @@ -1,5 +1,5 @@ import React from "react" -import { PiPaperPlaneRightFill } from "react-icons/pi" +import { SendHorizontal } from "lucide-react" import { Flex } from "@/components/ui/flex" @@ -32,7 +32,7 @@ export const SendReceiveButtons = ({ onClick={nav?.progressStepper} isDisabled={disableSend} isHighlighted={highlightSend} - icon={PiPaperPlaneRightFill} + icon={SendHorizontal} > Send diff --git a/src/components/Simulator/WalletHome/interfaces.ts b/src/components/Simulator/WalletHome/interfaces.ts index f6225e905b2..b90e0ef9944 100644 --- a/src/components/Simulator/WalletHome/interfaces.ts +++ b/src/components/Simulator/WalletHome/interfaces.ts @@ -1,13 +1,12 @@ +import { LucideIcon } from "lucide-react" import { StaticImageData } from "next/image" -import type { IconBaseType } from "@/components/icons/icon-base" - export interface TokenBalance { name: string ticker: string amount: number usdConversion: number - Icon: IconBaseType + Icon: LucideIcon | React.FC> } export interface Contact { diff --git a/src/components/Simulator/__stories__/Explanation.stories.tsx b/src/components/Simulator/__stories__/Explanation.stories.tsx index 5723d6de276..c77b3e9c0e0 100644 --- a/src/components/Simulator/__stories__/Explanation.stories.tsx +++ b/src/components/Simulator/__stories__/Explanation.stories.tsx @@ -1,11 +1,18 @@ import { pickBy } from "lodash" +import type { SVGProps } from "react" import type { Meta, StoryObj } from "@storybook/react" import { fn } from "@storybook/test" import { viewportModes } from "@/storybook/modes" import { Explanation as ExplanationComponent } from "../Explanation" -import { SendReceiveIcon } from "../icons" +import SendReceiveIconSvg from "../icons/send-receive.svg" + +// Create a wrapper component that matches the expected interface +const SendReceiveIcon = (props: SVGProps) => ( + +) +SendReceiveIcon.displayName = "SendReceiveIcon" const meta = { title: "Molecules / Display Content / Simulator / Explanation", diff --git a/src/components/Simulator/icons/ConnectWeb3Icon.tsx b/src/components/Simulator/icons/ConnectWeb3Icon.tsx deleted file mode 100644 index ddf3f1bb364..00000000000 --- a/src/components/Simulator/icons/ConnectWeb3Icon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" - -export const ConnectWeb3Icon = createIconBase({ - displayName: "Connect Web3 Icon", - viewBox: "0 0 32 32", - className: "text-[32px]/none fill-current", - children: ( - <> - - - - - ), -}) diff --git a/src/components/Simulator/icons/CreateAccountIcon.tsx b/src/components/Simulator/icons/CreateAccountIcon.tsx deleted file mode 100644 index bb519964384..00000000000 --- a/src/components/Simulator/icons/CreateAccountIcon.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" - -export const CreateAccountIcon = createIconBase({ - displayName: "CreateAccountIcon", - viewBox: "0 0 32 32", - className: "text-[32px]/none fill-current", - children: ( - <> - - - - - - - - - ), -}) diff --git a/src/components/Simulator/icons/DaiTokenIcon.tsx b/src/components/Simulator/icons/DaiTokenIcon.tsx deleted file mode 100644 index 24d56ec6974..00000000000 --- a/src/components/Simulator/icons/DaiTokenIcon.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" - -export const DaiTokenIcon = createIconBase({ - displayName: "DAITokenIcon", - viewBox: "0 0 30 30", - className: "text-3xl/none fill-none", - children: ( - <> - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/Simulator/icons/EthGlyphIcon.tsx b/src/components/Simulator/icons/EthGlyphIcon.tsx deleted file mode 100644 index 1dc897a4e04..00000000000 --- a/src/components/Simulator/icons/EthGlyphIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" - -export const EthGlyphIcon = createIconBase({ - displayName: "EthGlyphIcon", - viewBox: "0 0 17 26", - className: "x-[17px] y-[26px] fill-current", - children: ( - <> - - - ), -}) diff --git a/src/components/Simulator/icons/EthTokenIcon.tsx b/src/components/Simulator/icons/EthTokenIcon.tsx deleted file mode 100644 index e33ca3b15bc..00000000000 --- a/src/components/Simulator/icons/EthTokenIcon.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" - -export const EthTokenIcon = createIconBase({ - displayName: "ETHTokenIcon", - viewBox: "0 0 30 30", - className: "text-3xl/none fill-none", - children: ( - <> - - - - - - ), -}) - -export const EthTokenIconGrayscale = createIconBase({ - displayName: "ETHTokenIconGrayscale", - viewBox: "0 0 30 30", - className: "text-3xl/none fill-none", - children: ( - <> - - - - - ), -}) diff --git a/src/components/Simulator/icons/QrCodeIcon.tsx b/src/components/Simulator/icons/QrCodeIcon.tsx deleted file mode 100644 index eab15932f30..00000000000 --- a/src/components/Simulator/icons/QrCodeIcon.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" - -export const QrCodeIcon = createIconBase({ - displayName: "QrCodeIcon", - viewBox: "0 0 16 16", - className: "text-md/none fill-current", - children: ( - <> - - - - - - - - - - ), -}) diff --git a/src/components/Simulator/icons/SendReceiveIcon.tsx b/src/components/Simulator/icons/SendReceiveIcon.tsx deleted file mode 100644 index 1a87c9382db..00000000000 --- a/src/components/Simulator/icons/SendReceiveIcon.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" - -export const SendReceiveIcon = createIconBase({ - displayName: "SendReceiveIcon", - viewBox: "0 0 32 32", - className: "text-[32px]/none fill-current", - children: ( - <> - - - - - - ), -}) diff --git a/src/components/Simulator/icons/UniTokenIcon.tsx b/src/components/Simulator/icons/UniTokenIcon.tsx deleted file mode 100644 index ab0dd5b0a53..00000000000 --- a/src/components/Simulator/icons/UniTokenIcon.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" - -export const UniTokenIcon = createIconBase({ - displayName: "UNITokenIcon", - viewBox: "0 0 30 30", - className: "text-3xl/none fill-none", - children: ( - <> - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/Simulator/icons/connect-web3.svg b/src/components/Simulator/icons/connect-web3.svg new file mode 100644 index 00000000000..c6d1b2616fc --- /dev/null +++ b/src/components/Simulator/icons/connect-web3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/create-account.svg b/src/components/Simulator/icons/create-account.svg new file mode 100644 index 00000000000..36372eaccd8 --- /dev/null +++ b/src/components/Simulator/icons/create-account.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/dai-token.svg b/src/components/Simulator/icons/dai-token.svg new file mode 100644 index 00000000000..7eed808016e --- /dev/null +++ b/src/components/Simulator/icons/dai-token.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/eth-glyph.svg b/src/components/Simulator/icons/eth-glyph.svg new file mode 100644 index 00000000000..98f6ecd33a6 --- /dev/null +++ b/src/components/Simulator/icons/eth-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/eth-token-grayscale.svg b/src/components/Simulator/icons/eth-token-grayscale.svg new file mode 100644 index 00000000000..717186483ba --- /dev/null +++ b/src/components/Simulator/icons/eth-token-grayscale.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/eth-token.svg b/src/components/Simulator/icons/eth-token.svg new file mode 100644 index 00000000000..98e60afcf2f --- /dev/null +++ b/src/components/Simulator/icons/eth-token.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/index.ts b/src/components/Simulator/icons/index.ts index 5b773c26080..a6478c06fa5 100644 --- a/src/components/Simulator/icons/index.ts +++ b/src/components/Simulator/icons/index.ts @@ -1,8 +1,21 @@ -export * from "./ConnectWeb3Icon" -export * from "./CreateAccountIcon" -export * from "./DaiTokenIcon" -export * from "./EthGlyphIcon" -export * from "./EthTokenIcon" -export * from "./QrCodeIcon" -export * from "./SendReceiveIcon" -export * from "./UniTokenIcon" +import ConnectWeb3Icon from "./connect-web3.svg" +import CreateAccountIcon from "./create-account.svg" +import DaiTokenIcon from "./dai-token.svg" +import EthGlyphIcon from "./eth-glyph.svg" +import EthTokenIcon from "./eth-token.svg" +import EthTokenIconGrayscale from "./eth-token-grayscale.svg" +import QrCodeIcon from "./qr-code.svg" +import SendReceiveIcon from "./send-receive.svg" +import UniTokenIcon from "./uni-token.svg" + +export { + ConnectWeb3Icon, + CreateAccountIcon, + DaiTokenIcon, + EthGlyphIcon, + EthTokenIcon, + EthTokenIconGrayscale, + QrCodeIcon, + SendReceiveIcon, + UniTokenIcon, +} diff --git a/src/components/Simulator/icons/qr-code.svg b/src/components/Simulator/icons/qr-code.svg new file mode 100644 index 00000000000..780884c3747 --- /dev/null +++ b/src/components/Simulator/icons/qr-code.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/send-receive.svg b/src/components/Simulator/icons/send-receive.svg new file mode 100644 index 00000000000..775fc929a5b --- /dev/null +++ b/src/components/Simulator/icons/send-receive.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/uni-token.svg b/src/components/Simulator/icons/uni-token.svg new file mode 100644 index 00000000000..78fe1c7afdf --- /dev/null +++ b/src/components/Simulator/icons/uni-token.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/Simulator/interfaces.ts b/src/components/Simulator/interfaces.ts index aac60abf117..05fa1cd9cc5 100644 --- a/src/components/Simulator/interfaces.ts +++ b/src/components/Simulator/interfaces.ts @@ -1,15 +1,14 @@ +import { LucideIcon } from "lucide-react" import type { ReactElement } from "react" import { PhoneScreenProps } from "@/lib/types" -import type { IconBaseType } from "../icons/icon-base" - import type { PathId } from "./types" export interface SimulatorPathSummary { primaryText: string secondaryText?: string - Icon: IconBaseType + Icon: LucideIcon | React.FC> } export interface SimulatorExplanation { @@ -33,7 +32,7 @@ export interface LabelHref { export interface SimulatorDetails { title: string - Icon: IconBaseType + Icon: LucideIcon | React.FC> Screen: (props: PhoneScreenProps) => JSX.Element explanations: Array ctaLabels: Array diff --git a/src/components/Simulator/screens/ConnectWeb3/Browser.tsx b/src/components/Simulator/screens/ConnectWeb3/Browser.tsx index 0738d499162..20520186db0 100644 --- a/src/components/Simulator/screens/ConnectWeb3/Browser.tsx +++ b/src/components/Simulator/screens/ConnectWeb3/Browser.tsx @@ -1,9 +1,6 @@ import React, { type HTMLAttributes, useEffect, useState } from "react" import { motion } from "framer-motion" -import { BsTriangle } from "react-icons/bs" -import { IoEllipsisHorizontalSharp } from "react-icons/io5" -import { PiMagnifyingGlass } from "react-icons/pi" -import { TbWorldWww } from "react-icons/tb" +import { Globe, MoreHorizontal, Search, Triangle } from "lucide-react" import { Flex, HStack } from "@/components/ui/flex" @@ -61,20 +58,20 @@ export const Browser = ({ ...props }: BrowserProps) => {

Search or enter website

)} - + - + - - - - + + + + ) diff --git a/src/components/Simulator/screens/ConnectWeb3/Slider.tsx b/src/components/Simulator/screens/ConnectWeb3/Slider.tsx index 99ab4418a05..07eb8d37b93 100644 --- a/src/components/Simulator/screens/ConnectWeb3/Slider.tsx +++ b/src/components/Simulator/screens/ConnectWeb3/Slider.tsx @@ -1,6 +1,6 @@ import { type ReactNode } from "react" import { motion } from "framer-motion" -import { PiCheckThin } from "react-icons/pi" +import { Check } from "lucide-react" import { HStack, VStack } from "@/components/ui/flex" @@ -39,7 +39,7 @@ export const Slider = ({ isConnected, displayUrl, children }: SliderProps) => { animate={{ scale: 1 }} transition={{ type: "spring", delay: 0.25 }} > - + )} - + {children} diff --git a/src/components/Simulator/screens/ConnectWeb3/index.tsx b/src/components/Simulator/screens/ConnectWeb3/index.tsx index 7d2fdcb1209..ee322a1fb67 100644 --- a/src/components/Simulator/screens/ConnectWeb3/index.tsx +++ b/src/components/Simulator/screens/ConnectWeb3/index.tsx @@ -1,13 +1,11 @@ import { useEffect, useMemo, useState } from "react" import { AnimatePresence, motion } from "framer-motion" -import { - RiAuctionLine, - RiFileTransferLine, - RiPriceTag2Line, -} from "react-icons/ri" import type { PhoneScreenProps } from "@/lib/types" +import AuctionLine from "@/components/icons/auction-line.svg" +import FileTransferLine from "@/components/icons/file-transfer-line.svg" +import PriceTagLine from "@/components/icons/price-tag-line.svg" import { Image } from "@/components/Image" import { Button } from "@/components/ui/buttons/Button" import { Flex } from "@/components/ui/flex" @@ -131,15 +129,15 @@ export const ConnectWeb3 = ({ nav, ctaLabel }: PhoneScreenProps) => {

Cool art

diff --git a/src/components/Simulator/screens/CreateAccount/GeneratingKeys.tsx b/src/components/Simulator/screens/CreateAccount/GeneratingKeys.tsx index 7badf89fb3a..aa12ceee96e 100644 --- a/src/components/Simulator/screens/CreateAccount/GeneratingKeys.tsx +++ b/src/components/Simulator/screens/CreateAccount/GeneratingKeys.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from "react" import { motion } from "framer-motion" -import { PiCheckThin } from "react-icons/pi" +import { Check } from "lucide-react" import type { PhoneScreenProps } from "@/lib/types" @@ -71,7 +71,7 @@ export const GeneratingKeys = ({ animate={{ scale: 1 }} transition={{ type: "spring", delay: 0.25 }} > - + )} diff --git a/src/components/Simulator/screens/CreateAccount/HomeScreen.tsx b/src/components/Simulator/screens/CreateAccount/HomeScreen.tsx index 84257497350..03a4ec611d5 100644 --- a/src/components/Simulator/screens/CreateAccount/HomeScreen.tsx +++ b/src/components/Simulator/screens/CreateAccount/HomeScreen.tsx @@ -1,6 +1,6 @@ import { type HTMLAttributes } from "react" import { AnimatePresence, motion } from "framer-motion" -import { MdArrowDownward } from "react-icons/md" +import { ArrowDown } from "lucide-react" import type { SimulatorNavProps } from "@/lib/types" @@ -45,7 +45,7 @@ export const HomeScreen = ({ nav, ...props }: HomeScreenProps) => { initial={{ opacity: 1 }} exit={{ opacity: 0 }} > - + )} diff --git a/src/components/Simulator/screens/CreateAccount/WordSelectorButtons.tsx b/src/components/Simulator/screens/CreateAccount/WordSelectorButtons.tsx index 01fd8fe580a..3eeefb74a6c 100644 --- a/src/components/Simulator/screens/CreateAccount/WordSelectorButtons.tsx +++ b/src/components/Simulator/screens/CreateAccount/WordSelectorButtons.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect } from "react" import { useMemo } from "react" import isChromatic from "chromatic" -import { LiaHandPointerSolid } from "react-icons/lia" +import { Pointer } from "lucide-react" import { Button } from "@/components/ui/buttons/Button" @@ -81,7 +81,7 @@ export const WordSelectorButtons = ({ <> {word} {index === wordsSelected && ( - + )} diff --git a/src/components/Simulator/screens/SendReceive/ReceivedEther.tsx b/src/components/Simulator/screens/SendReceive/ReceivedEther.tsx index 1f6fecabf52..5d973e5bed9 100644 --- a/src/components/Simulator/screens/SendReceive/ReceivedEther.tsx +++ b/src/components/Simulator/screens/SendReceive/ReceivedEther.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo, useState } from "react" import { AnimatePresence, motion } from "framer-motion" -import { MdClose, MdInfo } from "react-icons/md" +import { Info, X } from "lucide-react" import type { SimulatorNavProps } from "@/lib/types" @@ -92,12 +92,12 @@ export const ReceivedEther = ({ exit={{ opacity: 0 }} data-testid="received-ether-toast" > - +

You received {displayEth} ETH ({displayUsd}) {sender ? ` from ${sender}` : ""}!

- setHidden(true)} /> + setHidden(true)} /> )} diff --git a/src/components/Simulator/screens/SendReceive/SendFromContacts.tsx b/src/components/Simulator/screens/SendReceive/SendFromContacts.tsx index 28995539ccf..6170fd99456 100644 --- a/src/components/Simulator/screens/SendReceive/SendFromContacts.tsx +++ b/src/components/Simulator/screens/SendReceive/SendFromContacts.tsx @@ -1,4 +1,4 @@ -import { PiMagnifyingGlass } from "react-icons/pi" +import { Search } from "lucide-react" import type { SimulatorNavProps } from "@/lib/types" @@ -34,7 +34,7 @@ export const SendFromContacts = ({ variant="outline" className="w-full cursor-auto border-disabled py-4 text-disabled hover:!text-disabled hover:shadow-none" > - + Address or contacts diff --git a/src/components/Simulator/screens/SendReceive/Success.tsx b/src/components/Simulator/screens/SendReceive/Success.tsx index f4477ec79f1..7ab765f2cd6 100644 --- a/src/components/Simulator/screens/SendReceive/Success.tsx +++ b/src/components/Simulator/screens/SendReceive/Success.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from "react" import { AnimatePresence, motion } from "framer-motion" -import { PiCheckThin } from "react-icons/pi" +import { Check } from "lucide-react" import { Flex, VStack } from "@/components/ui/flex" import { Spinner } from "@/components/ui/spinner" @@ -102,7 +102,7 @@ export const Success = ({ transition={{ type: "spring", delay: 0.25 }} data-testid="success-icon" > - + )}

diff --git a/src/components/StablecoinsTable.tsx b/src/components/StablecoinsTable.tsx index e034fce305f..f47b23f8e11 100644 --- a/src/components/StablecoinsTable.tsx +++ b/src/components/StablecoinsTable.tsx @@ -1,7 +1,7 @@ "use client" import { Suspense, useState } from "react" -import { MdOutlineFilterList } from "react-icons/md" +import { Filter } from "lucide-react" import type { StablecoinType } from "@/lib/types" @@ -188,7 +188,7 @@ const StablecoinsTable = ({ content, hasError }: StablecoinsTableProps) => { ({activeTypeCount}) )} - + {typeFilters.map((filter) => ( @@ -240,7 +240,7 @@ const StablecoinsTable = ({ content, hasError }: StablecoinsTableProps) => { {activePegCount !== totalPegCount && ( ({activePegCount}) )} - + {pegFilters.map((filter) => ( diff --git a/src/components/Tooltip/Tooltip.stories.tsx b/src/components/Tooltip/Tooltip.stories.tsx index 7beecaef1a6..c78d0d219aa 100644 --- a/src/components/Tooltip/Tooltip.stories.tsx +++ b/src/components/Tooltip/Tooltip.stories.tsx @@ -1,4 +1,4 @@ -import { RiInformationLine } from "react-icons/ri" +import { Info } from "lucide-react" import { Meta, StoryObj } from "@storybook/react" import Translation from "../Translation" @@ -22,7 +22,7 @@ const meta = { content: , children: ( - + ), }, diff --git a/src/components/TranslationBanner.tsx b/src/components/TranslationBanner.tsx index af985b24f87..6e87538828a 100644 --- a/src/components/TranslationBanner.tsx +++ b/src/components/TranslationBanner.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from "react" +import { X } from "lucide-react" import { useLocale } from "next-intl" -import { MdClose } from "react-icons/md" import type { Lang } from "@/lib/types" @@ -89,7 +89,7 @@ const TranslationBanner = ({ className="absolute end-0 top-0 m-2 hover:text-primary" onClick={() => setIsOpen(false)} > - + Close diff --git a/src/components/ui/Link.tsx b/src/components/ui/Link.tsx index c7e1d087820..85f3c9159de 100644 --- a/src/components/ui/Link.tsx +++ b/src/components/ui/Link.tsx @@ -1,8 +1,8 @@ "use client" import { AnchorHTMLAttributes, ComponentProps, forwardRef } from "react" +import { ExternalLink } from "lucide-react" import NextLink from "next/link" -import { RxExternalLink } from "react-icons/rx" import { VisuallyHidden } from "@radix-ui/react-visually-hidden" import { cn } from "@/lib/utils/cn" @@ -104,7 +104,7 @@ export const BaseLink = forwardRef(function Link( {children} (opens in a new tab) {!hideArrow && ( - {VARIANTS.map((variant) => ( - + Banner use case diff --git a/src/components/ui/__stories__/Button.stories.tsx b/src/components/ui/__stories__/Button.stories.tsx index 6061ed6f4a5..35a518920e5 100644 --- a/src/components/ui/__stories__/Button.stories.tsx +++ b/src/components/ui/__stories__/Button.stories.tsx @@ -1,4 +1,4 @@ -import { MdChevronRight, MdExpandMore } from "react-icons/md" +import { ChevronDown, ChevronRight } from "lucide-react" import type { Meta, StoryObj } from "@storybook/react" import { Button, type ButtonVariantProps } from "../buttons/Button" @@ -45,30 +45,30 @@ export const IconVariants: Story = { @@ -92,11 +92,11 @@ export const MultiLineText: Story = { diff --git a/src/components/ui/__stories__/ButtonLinkTwoLines.stories.tsx b/src/components/ui/__stories__/ButtonLinkTwoLines.stories.tsx index 0c0ffaaf90e..c5679d47c77 100644 --- a/src/components/ui/__stories__/ButtonLinkTwoLines.stories.tsx +++ b/src/components/ui/__stories__/ButtonLinkTwoLines.stories.tsx @@ -1,4 +1,4 @@ -import { BiCircle } from "react-icons/bi" +import { Circle } from "lucide-react" import type { Meta, StoryObj } from "@storybook/react" import { ButtonLinkTwoLines as ButtonLinkTwoLinesComponent } from "../buttons/ButtonTwoLines" @@ -15,7 +15,7 @@ type Story = StoryObj export const ButtonLinkTwoLines: Story = { args: { - icon: BiCircle, + icon: Circle, mainText: "Main Text", helperText: "Helper Text", className: "w-[300px]", diff --git a/src/components/ui/__stories__/ButtonTwoLines.stories.tsx b/src/components/ui/__stories__/ButtonTwoLines.stories.tsx index 791db716d4a..7b94ede8aa7 100644 --- a/src/components/ui/__stories__/ButtonTwoLines.stories.tsx +++ b/src/components/ui/__stories__/ButtonTwoLines.stories.tsx @@ -1,4 +1,4 @@ -import { BiCircle } from "react-icons/bi" +import { Circle } from "lucide-react" import { Meta, StoryObj } from "@storybook/react" import { ButtonTwoLines as ButtonTwoLinesComponent } from "../buttons/ButtonTwoLines" @@ -15,7 +15,7 @@ type Story = StoryObj export const ButtonTwoLines: Story = { args: { - icon: BiCircle, + icon: Circle, mainText: "Main Text", helperText: "Helper Text", className: "w-[300px]", diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx index 4e9add817fc..6e6d6880f29 100644 --- a/src/components/ui/alert.tsx +++ b/src/components/ui/alert.tsx @@ -1,6 +1,6 @@ import * as React from "react" import { cva, type VariantProps } from "class-variance-authority" -import { MdClose } from "react-icons/md" +import { X } from "lucide-react" import { cn } from "@/lib/utils/cn" @@ -83,7 +83,7 @@ const AlertCloseButton = React.forwardRef< className={cn("-me-4 rounded-full text-body", className)} {...props} > - + Close )) diff --git a/src/components/ui/breadcrumb.tsx b/src/components/ui/breadcrumb.tsx index 27849ef6dac..47bb493d250 100644 --- a/src/components/ui/breadcrumb.tsx +++ b/src/components/ui/breadcrumb.tsx @@ -1,6 +1,5 @@ import * as React from "react" -import { LuChevronRight } from "react-icons/lu" -import { MdMoreHoriz } from "react-icons/md" +import { ChevronRight, MoreHorizontal } from "lucide-react" import { Slot } from "@radix-ui/react-slot" import { cn } from "@/lib/utils/cn" @@ -93,7 +92,7 @@ const BreadcrumbSeparator = ({ className={cn("m-0", className)} {...props} > - {children ?? } + {children ?? } ) BreadcrumbSeparator.displayName = "BreadcrumbSeparator" @@ -108,7 +107,7 @@ const BreadcrumbEllipsis = ({ className={cn("flex h-9 w-9 items-center justify-center", className)} {...props} > - + More ) diff --git a/src/components/ui/buttons/ButtonTwoLines.tsx b/src/components/ui/buttons/ButtonTwoLines.tsx index faf80c68528..5f6336ae937 100644 --- a/src/components/ui/buttons/ButtonTwoLines.tsx +++ b/src/components/ui/buttons/ButtonTwoLines.tsx @@ -1,4 +1,4 @@ -import type { IconType } from "react-icons/lib" +import type { LucideIcon } from "lucide-react" import { cn } from "@/lib/utils/cn" @@ -12,7 +12,7 @@ import { } from "./Button" type CommonProps = { - icon: IconType + icon: LucideIcon | React.FC> iconAlignment?: "left" | "right" | "start" | "end" /** * Reduced choices of the button variant. diff --git a/src/components/ui/carousel.tsx b/src/components/ui/carousel.tsx index e305c16900b..ee852d1eca9 100644 --- a/src/components/ui/carousel.tsx +++ b/src/components/ui/carousel.tsx @@ -4,7 +4,7 @@ import * as React from "react" import useEmblaCarousel, { type UseEmblaCarouselType, } from "embla-carousel-react" -import { MdChevronLeft, MdChevronRight } from "react-icons/md" +import { ChevronLeft, ChevronRight } from "lucide-react" import { Button } from "@/components/ui/buttons/Button" @@ -217,7 +217,7 @@ const CarouselPrevious = React.forwardRef< onClick={scrollPrev} {...props} > - + Previous slide ) @@ -246,7 +246,7 @@ const CarouselNext = React.forwardRef< onClick={scrollNext} {...props} > - + Next slide ) diff --git a/src/components/ui/checkbox.tsx b/src/components/ui/checkbox.tsx index 9e96ca0a59f..69936370a41 100644 --- a/src/components/ui/checkbox.tsx +++ b/src/components/ui/checkbox.tsx @@ -1,5 +1,5 @@ import * as React from "react" -import { RxCheck } from "react-icons/rx" +import { Check } from "lucide-react" import * as CheckboxPrimitive from "@radix-ui/react-checkbox" import { cn } from "@/lib/utils/cn" @@ -24,7 +24,7 @@ const Checkbox = React.forwardRef< {...props} > - + )) diff --git a/src/components/ui/command.tsx b/src/components/ui/command.tsx index e8a2f2cc16f..fb8f786b4e5 100644 --- a/src/components/ui/command.tsx +++ b/src/components/ui/command.tsx @@ -1,6 +1,6 @@ import * as React from "react" import { Command as CommandPrimitive } from "cmdk" -import { MdOutlineSearch } from "react-icons/md" +import { Search } from "lucide-react" import { type DialogProps } from "@radix-ui/react-dialog" import { Dialog, DialogContent } from "@/components/ui/dialog" @@ -46,7 +46,7 @@ type CommandInputProps = React.ComponentPropsWithoutRef< const CommandInput = React.forwardRef< React.ElementRef, CommandInputProps ->(({ className, icon = MdOutlineSearch, kbdShortcut, ...props }, ref) => { +>(({ className, icon = Search, kbdShortcut, ...props }, ref) => { const Icon = icon return (

- + Close diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx index 2632f7fc588..8eea2cf29a0 100644 --- a/src/components/ui/dialog.tsx +++ b/src/components/ui/dialog.tsx @@ -1,5 +1,5 @@ import * as React from "react" -import { MdClose } from "react-icons/md" +import { X } from "lucide-react" import * as DialogPrimitive from "@radix-ui/react-dialog" import { cn } from "@/lib/utils/cn" @@ -43,7 +43,7 @@ const DialogContent = React.forwardRef< > {children} - + Close diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index 4e2d58bece1..0ffe2d537da 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -1,5 +1,5 @@ import * as React from "react" -import { MdCheck, MdChevronRight, MdCircle } from "react-icons/md" +import { Check, ChevronRight, Circle } from "lucide-react" import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" import { cn } from "@/lib/utils/cn" @@ -32,7 +32,7 @@ const DropdownMenuSubTrigger = React.forwardRef< {...props} > {children} - + )) DropdownMenuSubTrigger.displayName = @@ -105,7 +105,7 @@ const DropdownMenuCheckboxItem = React.forwardRef< > - + {children} @@ -128,7 +128,7 @@ const DropdownMenuRadioItem = React.forwardRef< > - + {children} diff --git a/src/components/ui/radio-group.tsx b/src/components/ui/radio-group.tsx index bb6a1226fbd..77c5d292b7b 100644 --- a/src/components/ui/radio-group.tsx +++ b/src/components/ui/radio-group.tsx @@ -1,5 +1,5 @@ import * as React from "react" -import { MdCircle } from "react-icons/md" +import { Circle } from "lucide-react" import * as RadioGroupPrimitive from "@radix-ui/react-radio-group" import { cn } from "@/lib/utils/cn" @@ -35,7 +35,7 @@ const RadioGroupItem = React.forwardRef< {...props} > - + ) diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx index 6e81adcb078..51e44229d80 100644 --- a/src/components/ui/select.tsx +++ b/src/components/ui/select.tsx @@ -1,6 +1,5 @@ import * as React from "react" -import { IoChevronDown, IoChevronUp } from "react-icons/io5" -import { MdCheck } from "react-icons/md" +import { Check, ChevronDown, ChevronUp } from "lucide-react" import * as SelectPrimitive from "@radix-ui/react-select" import { cn } from "@/lib/utils/cn" @@ -25,7 +24,7 @@ const SelectTrigger = React.forwardRef< > {children} - + )) @@ -43,7 +42,7 @@ const SelectScrollUpButton = React.forwardRef< )} {...props} > - + )) SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName @@ -60,7 +59,7 @@ const SelectScrollDownButton = React.forwardRef< )} {...props} > - + )) SelectScrollDownButton.displayName = @@ -124,7 +123,7 @@ const SelectItem = React.forwardRef< > - + diff --git a/src/components/ui/spinner.tsx b/src/components/ui/spinner.tsx index 64b861542ab..7961d7ae3de 100644 --- a/src/components/ui/spinner.tsx +++ b/src/components/ui/spinner.tsx @@ -1,12 +1,12 @@ import * as React from "react" -import { CgSpinner } from "react-icons/cg" +import { Loader2 } from "lucide-react" const Spinner = React.forwardRef< HTMLDivElement, React.HTMLAttributes >(({ className, ...props }, ref) => (
- +
)) Spinner.displayName = "Spinner" From 4f2d47469d9d739eab0fdeb65f2587841bfb54e7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:52:25 -0700 Subject: [PATCH 148/368] fix: update Storybook stories for icon migration - Create wrapper components for SVG icons to match expected interfaces - Fix TypeScript errors in stories after icon migration - Ensure Storybook compatibility with new icon system --- .../BannerGrid/BannerGrid.stories.tsx | 6 ++-- src/components/icons/Icons.stories.tsx | 28 +++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/components/BannerGrid/BannerGrid.stories.tsx b/src/components/BannerGrid/BannerGrid.stories.tsx index 7b19ebb6637..a8e428e44f4 100644 --- a/src/components/BannerGrid/BannerGrid.stories.tsx +++ b/src/components/BannerGrid/BannerGrid.stories.tsx @@ -1,5 +1,5 @@ +import { Info } from "lucide-react" import { useTranslations } from "next-intl" -import { MdInfoOutline } from "react-icons/md" import { Meta, StoryObj } from "@storybook/react" import { ChildOnlyProp } from "@/lib/types" @@ -127,7 +127,7 @@ export const BannerGridCell: Story = { })} > - + @@ -163,7 +163,7 @@ export const BannerGrid: Story = { })} > - + diff --git a/src/components/icons/Icons.stories.tsx b/src/components/icons/Icons.stories.tsx index 470a5008b4f..d1375317481 100644 --- a/src/components/icons/Icons.stories.tsx +++ b/src/components/icons/Icons.stories.tsx @@ -2,9 +2,9 @@ import type { Meta, StoryObj } from "@storybook/react" import { Center, Flex } from "../ui/flex" -import { FilterBurgerIcon } from "./wallets/FilterBurgerIcon" -import { HighlightDarkIcon } from "./HighlightDarkIcon" -import { HighlightIcon } from "./HighlightIcon" +import FilterBurgerIcon from "./wallets/filter-burger.svg" +import HighlightIcon from "./highlight.svg" +import HighlightDarkIcon from "./highlight-dark.svg" import { CorrectIcon, GreenTickIcon, @@ -13,7 +13,6 @@ import { TrophyIcon, } from "./quiz" import { - DappnodeIcon, DecentralizationEthGlyphIcon, DecentralizationGlyphIcon, DownloadGlyphIcon, @@ -33,7 +32,7 @@ import { BattleTestedIcon, BedrockGlyphIcon, BugBountyIcon, - CautionProductGlyphIcon, + CautionProductGlyph, ChainLaboGlyphIcon, ConsensysStakingGlyphIcon, DefaultOpenSourceGlyphIcon, @@ -42,14 +41,14 @@ import { EthpoolGlyphIcon, EverstakeGlyphIcon, FigmentGlyphIcon, - GreenCheckProductGlyphIcon, + GreenCheckProductGlyph, KilnGlyphIcon, LaunchnodesGlyphIcon, LidoGlyphIcon, LiquidityTokenIcon, MultiClientIcon, OpenSourceStakingIcon, - P2PGlyphIcon, + P2pGlyphIcon, PermissionlessIcon, RocketPoolGlyphIcon, RockXGlyphIcon, @@ -67,9 +66,9 @@ import { StakingGlyphTokenWalletIcon, StereumGlyphIcon, TrustlessIcon, - UnknownProductGlyphIcon, + UnknownProductGlyph, WagyuGlyphIcon, - WarningProductGlyphIcon, + WarningProductGlyph, } from "./staking" import { BrowserIcon, @@ -107,7 +106,6 @@ const iconsDefinitions = [ GreenTickIcon, StarConfettiIcon, TrophyIcon, - DappnodeIcon, DecentralizationGlyphIcon, DecentralizationEthGlyphIcon, DownloadGlyphIcon, @@ -125,7 +123,7 @@ const iconsDefinitions = [ BattleTestedIcon, BedrockGlyphIcon, BugBountyIcon, - CautionProductGlyphIcon, + CautionProductGlyph, ChainLaboGlyphIcon, ConsensysStakingGlyphIcon, StakingDappnodeGlyphIcon, @@ -135,8 +133,8 @@ const iconsDefinitions = [ EthpoolGlyphIcon, EverstakeGlyphIcon, FigmentGlyphIcon, - GreenCheckProductGlyphIcon, - P2PGlyphIcon, + GreenCheckProductGlyph, + P2pGlyphIcon, KilnGlyphIcon, LaunchnodesGlyphIcon, LidoGlyphIcon, @@ -159,9 +157,9 @@ const iconsDefinitions = [ StereumGlyphIcon, SquidGlyphIcon, TrustlessIcon, - UnknownProductGlyphIcon, + UnknownProductGlyph, WagyuGlyphIcon, - WarningProductGlyphIcon, + WarningProductGlyph, BrowserIcon, BuyCryptoIcon, ConnectDappsIcon, From b513e7c6b6751120c6d9038ce1984353a519d0c8 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:54:35 -0700 Subject: [PATCH 149/368] feat: convert icon components to pure SVG files - Convert 118 icon components from createIconBase TSX to pure SVG - Maintain 1em sizing and currentColor for consistent theming - Remove react-icons dependency from icon components - Prepare for createIconBase removal --- src/components/icons/layer-2/developing.svg | 3 ++ src/components/icons/layer-2/emerging.svg | 3 ++ src/components/icons/layer-2/maturing.svg | 3 ++ src/components/icons/layer-2/robust.svg | 3 ++ src/components/icons/listen-to/arrow.svg | 3 ++ src/components/icons/listen-to/autoplay.svg | 3 ++ src/components/icons/listen-to/collapse.svg | 3 ++ src/components/icons/listen-to/expand.svg | 3 ++ .../icons/listen-to/pause-circle.svg | 3 ++ .../icons/listen-to/play-circle.svg | 3 ++ src/components/icons/quiz/correct.svg | 3 ++ src/components/icons/quiz/green-tick.svg | 6 ++++ src/components/icons/quiz/incorrect.svg | 3 ++ src/components/icons/quiz/star-confetti.svg | 3 ++ src/components/icons/quiz/trophy.svg | 3 ++ .../icons/roadmap/account-abstraction.svg | 3 ++ .../icons/roadmap/better-user-experience.svg | 3 ++ .../icons/roadmap/cheaper-transactions.svg | 3 ++ src/components/icons/roadmap/danksharding.svg | 3 ++ .../icons/roadmap/extra-security.svg | 3 ++ .../icons/roadmap/future-proofing.svg | 3 ++ .../roadmap/proposer-builder-separation.svg | 3 ++ .../icons/roadmap/secret-leader-election.svg | 3 ++ .../icons/roadmap/single-slot-finality.svg | 3 ++ .../icons/roadmap/staking-withdrawals.svg | 3 ++ .../icons/roadmap/statelessness.svg | 3 ++ src/components/icons/roadmap/verkle-trees.svg | 3 ++ .../run-a-node/decentralization-eth-glyph.svg | 3 ++ .../run-a-node/decentralization-glyph.svg | 3 ++ .../icons/run-a-node/download-glyph.svg | 3 ++ .../icons/run-a-node/earth-glyph.svg | 3 ++ .../icons/run-a-node/hardware-glyph.svg | 3 ++ .../icons/run-a-node/megaphone-glyph.svg | 3 ++ .../icons/run-a-node/privacy-glyph.svg | 3 ++ .../icons/run-a-node/sovereignty-glyph.svg | 35 +++++++++++++++++++ .../icons/run-a-node/vote-glyph.svg | 3 ++ src/components/icons/staking/abyss-glyph.svg | 3 ++ .../icons/staking/allnodes-glyph.svg | 3 ++ src/components/icons/staking/ankr-glyph.svg | 3 ++ src/components/icons/staking/audited.svg | 3 ++ src/components/icons/staking/avado-glyph.svg | 3 ++ .../icons/staking/battle-tested.svg | 3 ++ .../icons/staking/bedrock-glyph.svg | 3 ++ src/components/icons/staking/bug-bounty.svg | 3 ++ .../icons/staking/caution-product-glyph.svg | 3 ++ .../icons/staking/chain-labo-glyph.svg | 3 ++ .../icons/staking/consensys-staking-glyph.svg | 3 ++ .../staking/default-open-source-glyph.svg | 3 ++ src/components/icons/staking/docker-glyph.svg | 3 ++ src/components/icons/staking/economical.svg | 3 ++ .../icons/staking/ethpool-glyph.svg | 3 ++ .../icons/staking/everstake-glyph.svg | 3 ++ .../icons/staking/figment-glyph.svg | 4 +++ .../staking/green-check-product-glyph.svg | 3 ++ src/components/icons/staking/kiln-glyph.svg | 3 ++ .../icons/staking/launchnodes-glyph.svg | 3 ++ src/components/icons/staking/lido-glyph.svg | 3 ++ .../icons/staking/liquidity-token.svg | 3 ++ src/components/icons/staking/multi-client.svg | 3 ++ .../icons/staking/open-source-staking.svg | 3 ++ .../icons/staking/origin-ether-glyph.svg | 3 ++ src/components/icons/staking/p2p-glyph.svg | 3 ++ .../icons/staking/permissionless.svg | 3 ++ src/components/icons/staking/rock-x-glyph.svg | 4 +++ .../icons/staking/rocket-pool-glyph.svg | 3 ++ src/components/icons/staking/self-custody.svg | 3 ++ .../icons/staking/sensei-node-glyph.svg | 3 ++ src/components/icons/staking/squid-glyph.svg | 3 ++ src/components/icons/staking/stafi-glyph.svg | 3 ++ .../icons/staking/stakefish-glyph.svg | 3 ++ .../icons/staking/stakewise-glyph.svg | 3 ++ .../icons/staking/staking-dappnode-glyph.svg | 3 ++ .../staking/staking-glyph-centralized.svg | 3 ++ .../icons/staking/staking-glyph-cloud.svg | 3 ++ .../icons/staking/staking-glyph-cpu.svg | 3 ++ .../staking/staking-glyph-ether-circle.svg | 3 ++ .../staking/staking-glyph-token-wallet.svg | 3 ++ .../icons/staking/stereum-glyph.svg | 3 ++ src/components/icons/staking/trustless.svg | 3 ++ .../icons/staking/unknown-product-glyph.svg | 3 ++ src/components/icons/staking/wagyu-glyph.svg | 3 ++ .../icons/staking/warning-product-glyph.svg | 3 ++ src/components/icons/wallets/browser.svg | 3 ++ src/components/icons/wallets/buy-crypto.svg | 3 ++ .../icons/wallets/connect-dapps.svg | 3 ++ src/components/icons/wallets/desktop.svg | 3 ++ src/components/icons/wallets/devices.svg | 3 ++ src/components/icons/wallets/ens-support.svg | 3 ++ .../icons/wallets/erc20-support.svg | 3 ++ .../icons/wallets/filter-burger.svg | 3 ++ .../icons/wallets/gas-fee-customization.svg | 3 ++ .../icons/wallets/hardware-support.svg | 3 ++ src/components/icons/wallets/hardware.svg | 3 ++ src/components/icons/wallets/languages.svg | 3 ++ src/components/icons/wallets/layer2.svg | 3 ++ src/components/icons/wallets/mobile.svg | 3 ++ src/components/icons/wallets/multisig.svg | 3 ++ src/components/icons/wallets/nft-support.svg | 3 ++ .../icons/wallets/non-custodial.svg | 3 ++ .../icons/wallets/open-source-wallet.svg | 3 ++ .../icons/wallets/rpc-importing.svg | 3 ++ .../icons/wallets/social-recover.svg | 3 ++ src/components/icons/wallets/staking.svg | 3 ++ src/components/icons/wallets/swap.svg | 3 ++ .../icons/wallets/withdraw-crypto.svg | 3 ++ 105 files changed, 352 insertions(+) create mode 100644 src/components/icons/layer-2/developing.svg create mode 100644 src/components/icons/layer-2/emerging.svg create mode 100644 src/components/icons/layer-2/maturing.svg create mode 100644 src/components/icons/layer-2/robust.svg create mode 100644 src/components/icons/listen-to/arrow.svg create mode 100644 src/components/icons/listen-to/autoplay.svg create mode 100644 src/components/icons/listen-to/collapse.svg create mode 100644 src/components/icons/listen-to/expand.svg create mode 100644 src/components/icons/listen-to/pause-circle.svg create mode 100644 src/components/icons/listen-to/play-circle.svg create mode 100644 src/components/icons/quiz/correct.svg create mode 100644 src/components/icons/quiz/green-tick.svg create mode 100644 src/components/icons/quiz/incorrect.svg create mode 100644 src/components/icons/quiz/star-confetti.svg create mode 100644 src/components/icons/quiz/trophy.svg create mode 100644 src/components/icons/roadmap/account-abstraction.svg create mode 100644 src/components/icons/roadmap/better-user-experience.svg create mode 100644 src/components/icons/roadmap/cheaper-transactions.svg create mode 100644 src/components/icons/roadmap/danksharding.svg create mode 100644 src/components/icons/roadmap/extra-security.svg create mode 100644 src/components/icons/roadmap/future-proofing.svg create mode 100644 src/components/icons/roadmap/proposer-builder-separation.svg create mode 100644 src/components/icons/roadmap/secret-leader-election.svg create mode 100644 src/components/icons/roadmap/single-slot-finality.svg create mode 100644 src/components/icons/roadmap/staking-withdrawals.svg create mode 100644 src/components/icons/roadmap/statelessness.svg create mode 100644 src/components/icons/roadmap/verkle-trees.svg create mode 100644 src/components/icons/run-a-node/decentralization-eth-glyph.svg create mode 100644 src/components/icons/run-a-node/decentralization-glyph.svg create mode 100644 src/components/icons/run-a-node/download-glyph.svg create mode 100644 src/components/icons/run-a-node/earth-glyph.svg create mode 100644 src/components/icons/run-a-node/hardware-glyph.svg create mode 100644 src/components/icons/run-a-node/megaphone-glyph.svg create mode 100644 src/components/icons/run-a-node/privacy-glyph.svg create mode 100644 src/components/icons/run-a-node/sovereignty-glyph.svg create mode 100644 src/components/icons/run-a-node/vote-glyph.svg create mode 100644 src/components/icons/staking/abyss-glyph.svg create mode 100644 src/components/icons/staking/allnodes-glyph.svg create mode 100644 src/components/icons/staking/ankr-glyph.svg create mode 100644 src/components/icons/staking/audited.svg create mode 100644 src/components/icons/staking/avado-glyph.svg create mode 100644 src/components/icons/staking/battle-tested.svg create mode 100644 src/components/icons/staking/bedrock-glyph.svg create mode 100644 src/components/icons/staking/bug-bounty.svg create mode 100644 src/components/icons/staking/caution-product-glyph.svg create mode 100644 src/components/icons/staking/chain-labo-glyph.svg create mode 100644 src/components/icons/staking/consensys-staking-glyph.svg create mode 100644 src/components/icons/staking/default-open-source-glyph.svg create mode 100644 src/components/icons/staking/docker-glyph.svg create mode 100644 src/components/icons/staking/economical.svg create mode 100644 src/components/icons/staking/ethpool-glyph.svg create mode 100644 src/components/icons/staking/everstake-glyph.svg create mode 100644 src/components/icons/staking/figment-glyph.svg create mode 100644 src/components/icons/staking/green-check-product-glyph.svg create mode 100644 src/components/icons/staking/kiln-glyph.svg create mode 100644 src/components/icons/staking/launchnodes-glyph.svg create mode 100644 src/components/icons/staking/lido-glyph.svg create mode 100644 src/components/icons/staking/liquidity-token.svg create mode 100644 src/components/icons/staking/multi-client.svg create mode 100644 src/components/icons/staking/open-source-staking.svg create mode 100644 src/components/icons/staking/origin-ether-glyph.svg create mode 100644 src/components/icons/staking/p2p-glyph.svg create mode 100644 src/components/icons/staking/permissionless.svg create mode 100644 src/components/icons/staking/rock-x-glyph.svg create mode 100644 src/components/icons/staking/rocket-pool-glyph.svg create mode 100644 src/components/icons/staking/self-custody.svg create mode 100644 src/components/icons/staking/sensei-node-glyph.svg create mode 100644 src/components/icons/staking/squid-glyph.svg create mode 100644 src/components/icons/staking/stafi-glyph.svg create mode 100644 src/components/icons/staking/stakefish-glyph.svg create mode 100644 src/components/icons/staking/stakewise-glyph.svg create mode 100644 src/components/icons/staking/staking-dappnode-glyph.svg create mode 100644 src/components/icons/staking/staking-glyph-centralized.svg create mode 100644 src/components/icons/staking/staking-glyph-cloud.svg create mode 100644 src/components/icons/staking/staking-glyph-cpu.svg create mode 100644 src/components/icons/staking/staking-glyph-ether-circle.svg create mode 100644 src/components/icons/staking/staking-glyph-token-wallet.svg create mode 100644 src/components/icons/staking/stereum-glyph.svg create mode 100644 src/components/icons/staking/trustless.svg create mode 100644 src/components/icons/staking/unknown-product-glyph.svg create mode 100644 src/components/icons/staking/wagyu-glyph.svg create mode 100644 src/components/icons/staking/warning-product-glyph.svg create mode 100644 src/components/icons/wallets/browser.svg create mode 100644 src/components/icons/wallets/buy-crypto.svg create mode 100644 src/components/icons/wallets/connect-dapps.svg create mode 100644 src/components/icons/wallets/desktop.svg create mode 100644 src/components/icons/wallets/devices.svg create mode 100644 src/components/icons/wallets/ens-support.svg create mode 100644 src/components/icons/wallets/erc20-support.svg create mode 100644 src/components/icons/wallets/filter-burger.svg create mode 100644 src/components/icons/wallets/gas-fee-customization.svg create mode 100644 src/components/icons/wallets/hardware-support.svg create mode 100644 src/components/icons/wallets/hardware.svg create mode 100644 src/components/icons/wallets/languages.svg create mode 100644 src/components/icons/wallets/layer2.svg create mode 100644 src/components/icons/wallets/mobile.svg create mode 100644 src/components/icons/wallets/multisig.svg create mode 100644 src/components/icons/wallets/nft-support.svg create mode 100644 src/components/icons/wallets/non-custodial.svg create mode 100644 src/components/icons/wallets/open-source-wallet.svg create mode 100644 src/components/icons/wallets/rpc-importing.svg create mode 100644 src/components/icons/wallets/social-recover.svg create mode 100644 src/components/icons/wallets/staking.svg create mode 100644 src/components/icons/wallets/swap.svg create mode 100644 src/components/icons/wallets/withdraw-crypto.svg diff --git a/src/components/icons/layer-2/developing.svg b/src/components/icons/layer-2/developing.svg new file mode 100644 index 00000000000..028be31327e --- /dev/null +++ b/src/components/icons/layer-2/developing.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/layer-2/emerging.svg b/src/components/icons/layer-2/emerging.svg new file mode 100644 index 00000000000..cf49c444fee --- /dev/null +++ b/src/components/icons/layer-2/emerging.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/layer-2/maturing.svg b/src/components/icons/layer-2/maturing.svg new file mode 100644 index 00000000000..277f1af44dc --- /dev/null +++ b/src/components/icons/layer-2/maturing.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/layer-2/robust.svg b/src/components/icons/layer-2/robust.svg new file mode 100644 index 00000000000..c59dfb1dcbf --- /dev/null +++ b/src/components/icons/layer-2/robust.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/listen-to/arrow.svg b/src/components/icons/listen-to/arrow.svg new file mode 100644 index 00000000000..1ce1fd8c95b --- /dev/null +++ b/src/components/icons/listen-to/arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/listen-to/autoplay.svg b/src/components/icons/listen-to/autoplay.svg new file mode 100644 index 00000000000..6d004dfda31 --- /dev/null +++ b/src/components/icons/listen-to/autoplay.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/listen-to/collapse.svg b/src/components/icons/listen-to/collapse.svg new file mode 100644 index 00000000000..e9a523dbb50 --- /dev/null +++ b/src/components/icons/listen-to/collapse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/listen-to/expand.svg b/src/components/icons/listen-to/expand.svg new file mode 100644 index 00000000000..709ed75ae2a --- /dev/null +++ b/src/components/icons/listen-to/expand.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/listen-to/pause-circle.svg b/src/components/icons/listen-to/pause-circle.svg new file mode 100644 index 00000000000..37a8319c0e2 --- /dev/null +++ b/src/components/icons/listen-to/pause-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/listen-to/play-circle.svg b/src/components/icons/listen-to/play-circle.svg new file mode 100644 index 00000000000..aa7aca0b606 --- /dev/null +++ b/src/components/icons/listen-to/play-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/quiz/correct.svg b/src/components/icons/quiz/correct.svg new file mode 100644 index 00000000000..e7f14838370 --- /dev/null +++ b/src/components/icons/quiz/correct.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/quiz/green-tick.svg b/src/components/icons/quiz/green-tick.svg new file mode 100644 index 00000000000..e90e112a751 --- /dev/null +++ b/src/components/icons/quiz/green-tick.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/components/icons/quiz/incorrect.svg b/src/components/icons/quiz/incorrect.svg new file mode 100644 index 00000000000..c9975cf0c2c --- /dev/null +++ b/src/components/icons/quiz/incorrect.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/quiz/star-confetti.svg b/src/components/icons/quiz/star-confetti.svg new file mode 100644 index 00000000000..7a27b8fb3c2 --- /dev/null +++ b/src/components/icons/quiz/star-confetti.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/quiz/trophy.svg b/src/components/icons/quiz/trophy.svg new file mode 100644 index 00000000000..215ad7eb683 --- /dev/null +++ b/src/components/icons/quiz/trophy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/account-abstraction.svg b/src/components/icons/roadmap/account-abstraction.svg new file mode 100644 index 00000000000..48474f26979 --- /dev/null +++ b/src/components/icons/roadmap/account-abstraction.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/better-user-experience.svg b/src/components/icons/roadmap/better-user-experience.svg new file mode 100644 index 00000000000..1497197454d --- /dev/null +++ b/src/components/icons/roadmap/better-user-experience.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/cheaper-transactions.svg b/src/components/icons/roadmap/cheaper-transactions.svg new file mode 100644 index 00000000000..414789868b5 --- /dev/null +++ b/src/components/icons/roadmap/cheaper-transactions.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/danksharding.svg b/src/components/icons/roadmap/danksharding.svg new file mode 100644 index 00000000000..9b4d96be301 --- /dev/null +++ b/src/components/icons/roadmap/danksharding.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/extra-security.svg b/src/components/icons/roadmap/extra-security.svg new file mode 100644 index 00000000000..ad865dc00eb --- /dev/null +++ b/src/components/icons/roadmap/extra-security.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/future-proofing.svg b/src/components/icons/roadmap/future-proofing.svg new file mode 100644 index 00000000000..63c09f609de --- /dev/null +++ b/src/components/icons/roadmap/future-proofing.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/proposer-builder-separation.svg b/src/components/icons/roadmap/proposer-builder-separation.svg new file mode 100644 index 00000000000..bda608d8bbe --- /dev/null +++ b/src/components/icons/roadmap/proposer-builder-separation.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/secret-leader-election.svg b/src/components/icons/roadmap/secret-leader-election.svg new file mode 100644 index 00000000000..4f8840950ed --- /dev/null +++ b/src/components/icons/roadmap/secret-leader-election.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/single-slot-finality.svg b/src/components/icons/roadmap/single-slot-finality.svg new file mode 100644 index 00000000000..d0b05a0df05 --- /dev/null +++ b/src/components/icons/roadmap/single-slot-finality.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/staking-withdrawals.svg b/src/components/icons/roadmap/staking-withdrawals.svg new file mode 100644 index 00000000000..29109b7bb3f --- /dev/null +++ b/src/components/icons/roadmap/staking-withdrawals.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/statelessness.svg b/src/components/icons/roadmap/statelessness.svg new file mode 100644 index 00000000000..f1ac4146803 --- /dev/null +++ b/src/components/icons/roadmap/statelessness.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/roadmap/verkle-trees.svg b/src/components/icons/roadmap/verkle-trees.svg new file mode 100644 index 00000000000..81d89865d4c --- /dev/null +++ b/src/components/icons/roadmap/verkle-trees.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/decentralization-eth-glyph.svg b/src/components/icons/run-a-node/decentralization-eth-glyph.svg new file mode 100644 index 00000000000..595bc56f586 --- /dev/null +++ b/src/components/icons/run-a-node/decentralization-eth-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/decentralization-glyph.svg b/src/components/icons/run-a-node/decentralization-glyph.svg new file mode 100644 index 00000000000..590c6c57019 --- /dev/null +++ b/src/components/icons/run-a-node/decentralization-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/download-glyph.svg b/src/components/icons/run-a-node/download-glyph.svg new file mode 100644 index 00000000000..5a10c249eff --- /dev/null +++ b/src/components/icons/run-a-node/download-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/earth-glyph.svg b/src/components/icons/run-a-node/earth-glyph.svg new file mode 100644 index 00000000000..4353faa1327 --- /dev/null +++ b/src/components/icons/run-a-node/earth-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/hardware-glyph.svg b/src/components/icons/run-a-node/hardware-glyph.svg new file mode 100644 index 00000000000..b2d1699c466 --- /dev/null +++ b/src/components/icons/run-a-node/hardware-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/megaphone-glyph.svg b/src/components/icons/run-a-node/megaphone-glyph.svg new file mode 100644 index 00000000000..4efa61baf6c --- /dev/null +++ b/src/components/icons/run-a-node/megaphone-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/privacy-glyph.svg b/src/components/icons/run-a-node/privacy-glyph.svg new file mode 100644 index 00000000000..f5c7693ea85 --- /dev/null +++ b/src/components/icons/run-a-node/privacy-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/sovereignty-glyph.svg b/src/components/icons/run-a-node/sovereignty-glyph.svg new file mode 100644 index 00000000000..0e162c57044 --- /dev/null +++ b/src/components/icons/run-a-node/sovereignty-glyph.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/vote-glyph.svg b/src/components/icons/run-a-node/vote-glyph.svg new file mode 100644 index 00000000000..3271dbdbe69 --- /dev/null +++ b/src/components/icons/run-a-node/vote-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/abyss-glyph.svg b/src/components/icons/staking/abyss-glyph.svg new file mode 100644 index 00000000000..13b5e27451c --- /dev/null +++ b/src/components/icons/staking/abyss-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/allnodes-glyph.svg b/src/components/icons/staking/allnodes-glyph.svg new file mode 100644 index 00000000000..0e98cf0abfd --- /dev/null +++ b/src/components/icons/staking/allnodes-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/ankr-glyph.svg b/src/components/icons/staking/ankr-glyph.svg new file mode 100644 index 00000000000..16af8ab7e76 --- /dev/null +++ b/src/components/icons/staking/ankr-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/audited.svg b/src/components/icons/staking/audited.svg new file mode 100644 index 00000000000..412883603b9 --- /dev/null +++ b/src/components/icons/staking/audited.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/avado-glyph.svg b/src/components/icons/staking/avado-glyph.svg new file mode 100644 index 00000000000..bbed383c404 --- /dev/null +++ b/src/components/icons/staking/avado-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/battle-tested.svg b/src/components/icons/staking/battle-tested.svg new file mode 100644 index 00000000000..c81675af8ef --- /dev/null +++ b/src/components/icons/staking/battle-tested.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/bedrock-glyph.svg b/src/components/icons/staking/bedrock-glyph.svg new file mode 100644 index 00000000000..999d6414653 --- /dev/null +++ b/src/components/icons/staking/bedrock-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/bug-bounty.svg b/src/components/icons/staking/bug-bounty.svg new file mode 100644 index 00000000000..49582729dd0 --- /dev/null +++ b/src/components/icons/staking/bug-bounty.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/caution-product-glyph.svg b/src/components/icons/staking/caution-product-glyph.svg new file mode 100644 index 00000000000..64f8c20a608 --- /dev/null +++ b/src/components/icons/staking/caution-product-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/chain-labo-glyph.svg b/src/components/icons/staking/chain-labo-glyph.svg new file mode 100644 index 00000000000..94e36ca1072 --- /dev/null +++ b/src/components/icons/staking/chain-labo-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/consensys-staking-glyph.svg b/src/components/icons/staking/consensys-staking-glyph.svg new file mode 100644 index 00000000000..95afd2633a3 --- /dev/null +++ b/src/components/icons/staking/consensys-staking-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/default-open-source-glyph.svg b/src/components/icons/staking/default-open-source-glyph.svg new file mode 100644 index 00000000000..856cd1d59b4 --- /dev/null +++ b/src/components/icons/staking/default-open-source-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/docker-glyph.svg b/src/components/icons/staking/docker-glyph.svg new file mode 100644 index 00000000000..9314bf9864a --- /dev/null +++ b/src/components/icons/staking/docker-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/economical.svg b/src/components/icons/staking/economical.svg new file mode 100644 index 00000000000..2741e00b515 --- /dev/null +++ b/src/components/icons/staking/economical.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/ethpool-glyph.svg b/src/components/icons/staking/ethpool-glyph.svg new file mode 100644 index 00000000000..f5ab6a9724b --- /dev/null +++ b/src/components/icons/staking/ethpool-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/everstake-glyph.svg b/src/components/icons/staking/everstake-glyph.svg new file mode 100644 index 00000000000..4c0a65eefc6 --- /dev/null +++ b/src/components/icons/staking/everstake-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/figment-glyph.svg b/src/components/icons/staking/figment-glyph.svg new file mode 100644 index 00000000000..84fd7a3a7ec --- /dev/null +++ b/src/components/icons/staking/figment-glyph.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/components/icons/staking/green-check-product-glyph.svg b/src/components/icons/staking/green-check-product-glyph.svg new file mode 100644 index 00000000000..ad7d633d2f7 --- /dev/null +++ b/src/components/icons/staking/green-check-product-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/kiln-glyph.svg b/src/components/icons/staking/kiln-glyph.svg new file mode 100644 index 00000000000..abbe1c0ccab --- /dev/null +++ b/src/components/icons/staking/kiln-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/launchnodes-glyph.svg b/src/components/icons/staking/launchnodes-glyph.svg new file mode 100644 index 00000000000..3cccb3c32ea --- /dev/null +++ b/src/components/icons/staking/launchnodes-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/lido-glyph.svg b/src/components/icons/staking/lido-glyph.svg new file mode 100644 index 00000000000..e1a9cfa5887 --- /dev/null +++ b/src/components/icons/staking/lido-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/liquidity-token.svg b/src/components/icons/staking/liquidity-token.svg new file mode 100644 index 00000000000..a5a52d889f1 --- /dev/null +++ b/src/components/icons/staking/liquidity-token.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/multi-client.svg b/src/components/icons/staking/multi-client.svg new file mode 100644 index 00000000000..e83c6f18ef2 --- /dev/null +++ b/src/components/icons/staking/multi-client.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/open-source-staking.svg b/src/components/icons/staking/open-source-staking.svg new file mode 100644 index 00000000000..944e030d6ae --- /dev/null +++ b/src/components/icons/staking/open-source-staking.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/origin-ether-glyph.svg b/src/components/icons/staking/origin-ether-glyph.svg new file mode 100644 index 00000000000..90a50054505 --- /dev/null +++ b/src/components/icons/staking/origin-ether-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/p2p-glyph.svg b/src/components/icons/staking/p2p-glyph.svg new file mode 100644 index 00000000000..c37a7048e96 --- /dev/null +++ b/src/components/icons/staking/p2p-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/permissionless.svg b/src/components/icons/staking/permissionless.svg new file mode 100644 index 00000000000..8fda8f54249 --- /dev/null +++ b/src/components/icons/staking/permissionless.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/rock-x-glyph.svg b/src/components/icons/staking/rock-x-glyph.svg new file mode 100644 index 00000000000..2e70b2f2a34 --- /dev/null +++ b/src/components/icons/staking/rock-x-glyph.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/components/icons/staking/rocket-pool-glyph.svg b/src/components/icons/staking/rocket-pool-glyph.svg new file mode 100644 index 00000000000..acfe88720d7 --- /dev/null +++ b/src/components/icons/staking/rocket-pool-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/self-custody.svg b/src/components/icons/staking/self-custody.svg new file mode 100644 index 00000000000..540e37d2384 --- /dev/null +++ b/src/components/icons/staking/self-custody.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/sensei-node-glyph.svg b/src/components/icons/staking/sensei-node-glyph.svg new file mode 100644 index 00000000000..cc211c2ec44 --- /dev/null +++ b/src/components/icons/staking/sensei-node-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/squid-glyph.svg b/src/components/icons/staking/squid-glyph.svg new file mode 100644 index 00000000000..2e9a76116a8 --- /dev/null +++ b/src/components/icons/staking/squid-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/stafi-glyph.svg b/src/components/icons/staking/stafi-glyph.svg new file mode 100644 index 00000000000..f3c2693e5cb --- /dev/null +++ b/src/components/icons/staking/stafi-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/stakefish-glyph.svg b/src/components/icons/staking/stakefish-glyph.svg new file mode 100644 index 00000000000..1573b333bec --- /dev/null +++ b/src/components/icons/staking/stakefish-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/stakewise-glyph.svg b/src/components/icons/staking/stakewise-glyph.svg new file mode 100644 index 00000000000..14d7a4806a5 --- /dev/null +++ b/src/components/icons/staking/stakewise-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/staking-dappnode-glyph.svg b/src/components/icons/staking/staking-dappnode-glyph.svg new file mode 100644 index 00000000000..7d5e3ac7102 --- /dev/null +++ b/src/components/icons/staking/staking-dappnode-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/staking-glyph-centralized.svg b/src/components/icons/staking/staking-glyph-centralized.svg new file mode 100644 index 00000000000..26ce4a819b6 --- /dev/null +++ b/src/components/icons/staking/staking-glyph-centralized.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/staking-glyph-cloud.svg b/src/components/icons/staking/staking-glyph-cloud.svg new file mode 100644 index 00000000000..a49a3c86419 --- /dev/null +++ b/src/components/icons/staking/staking-glyph-cloud.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/staking-glyph-cpu.svg b/src/components/icons/staking/staking-glyph-cpu.svg new file mode 100644 index 00000000000..e3d2c0f818f --- /dev/null +++ b/src/components/icons/staking/staking-glyph-cpu.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/staking-glyph-ether-circle.svg b/src/components/icons/staking/staking-glyph-ether-circle.svg new file mode 100644 index 00000000000..f4c40278e1a --- /dev/null +++ b/src/components/icons/staking/staking-glyph-ether-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/staking-glyph-token-wallet.svg b/src/components/icons/staking/staking-glyph-token-wallet.svg new file mode 100644 index 00000000000..c6088f6a7bc --- /dev/null +++ b/src/components/icons/staking/staking-glyph-token-wallet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/stereum-glyph.svg b/src/components/icons/staking/stereum-glyph.svg new file mode 100644 index 00000000000..37b5a3a92ad --- /dev/null +++ b/src/components/icons/staking/stereum-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/trustless.svg b/src/components/icons/staking/trustless.svg new file mode 100644 index 00000000000..53bfc32f684 --- /dev/null +++ b/src/components/icons/staking/trustless.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/unknown-product-glyph.svg b/src/components/icons/staking/unknown-product-glyph.svg new file mode 100644 index 00000000000..93ac3f4904e --- /dev/null +++ b/src/components/icons/staking/unknown-product-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/wagyu-glyph.svg b/src/components/icons/staking/wagyu-glyph.svg new file mode 100644 index 00000000000..2ed7860d112 --- /dev/null +++ b/src/components/icons/staking/wagyu-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/staking/warning-product-glyph.svg b/src/components/icons/staking/warning-product-glyph.svg new file mode 100644 index 00000000000..b18af1ea015 --- /dev/null +++ b/src/components/icons/staking/warning-product-glyph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/browser.svg b/src/components/icons/wallets/browser.svg new file mode 100644 index 00000000000..48cb2ba0856 --- /dev/null +++ b/src/components/icons/wallets/browser.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/buy-crypto.svg b/src/components/icons/wallets/buy-crypto.svg new file mode 100644 index 00000000000..4d801ea0279 --- /dev/null +++ b/src/components/icons/wallets/buy-crypto.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/connect-dapps.svg b/src/components/icons/wallets/connect-dapps.svg new file mode 100644 index 00000000000..f6f5fbce6be --- /dev/null +++ b/src/components/icons/wallets/connect-dapps.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/desktop.svg b/src/components/icons/wallets/desktop.svg new file mode 100644 index 00000000000..eff00b4d416 --- /dev/null +++ b/src/components/icons/wallets/desktop.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/devices.svg b/src/components/icons/wallets/devices.svg new file mode 100644 index 00000000000..57078814025 --- /dev/null +++ b/src/components/icons/wallets/devices.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/ens-support.svg b/src/components/icons/wallets/ens-support.svg new file mode 100644 index 00000000000..52c1779beed --- /dev/null +++ b/src/components/icons/wallets/ens-support.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/erc20-support.svg b/src/components/icons/wallets/erc20-support.svg new file mode 100644 index 00000000000..be90c19eac5 --- /dev/null +++ b/src/components/icons/wallets/erc20-support.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/filter-burger.svg b/src/components/icons/wallets/filter-burger.svg new file mode 100644 index 00000000000..02c837407f5 --- /dev/null +++ b/src/components/icons/wallets/filter-burger.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/gas-fee-customization.svg b/src/components/icons/wallets/gas-fee-customization.svg new file mode 100644 index 00000000000..37fefa92369 --- /dev/null +++ b/src/components/icons/wallets/gas-fee-customization.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/hardware-support.svg b/src/components/icons/wallets/hardware-support.svg new file mode 100644 index 00000000000..d76d08582bd --- /dev/null +++ b/src/components/icons/wallets/hardware-support.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/hardware.svg b/src/components/icons/wallets/hardware.svg new file mode 100644 index 00000000000..a40da5c4d17 --- /dev/null +++ b/src/components/icons/wallets/hardware.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/languages.svg b/src/components/icons/wallets/languages.svg new file mode 100644 index 00000000000..2537468ac69 --- /dev/null +++ b/src/components/icons/wallets/languages.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/layer2.svg b/src/components/icons/wallets/layer2.svg new file mode 100644 index 00000000000..17366421eb2 --- /dev/null +++ b/src/components/icons/wallets/layer2.svg @@ -0,0 +1,3 @@ + + , , , + \ No newline at end of file diff --git a/src/components/icons/wallets/mobile.svg b/src/components/icons/wallets/mobile.svg new file mode 100644 index 00000000000..c2dbb3d8720 --- /dev/null +++ b/src/components/icons/wallets/mobile.svg @@ -0,0 +1,3 @@ + + , , + \ No newline at end of file diff --git a/src/components/icons/wallets/multisig.svg b/src/components/icons/wallets/multisig.svg new file mode 100644 index 00000000000..7216e54512d --- /dev/null +++ b/src/components/icons/wallets/multisig.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/nft-support.svg b/src/components/icons/wallets/nft-support.svg new file mode 100644 index 00000000000..3ff71d79ec4 --- /dev/null +++ b/src/components/icons/wallets/nft-support.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/non-custodial.svg b/src/components/icons/wallets/non-custodial.svg new file mode 100644 index 00000000000..67319f0cfab --- /dev/null +++ b/src/components/icons/wallets/non-custodial.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/open-source-wallet.svg b/src/components/icons/wallets/open-source-wallet.svg new file mode 100644 index 00000000000..afbeb9ab0f8 --- /dev/null +++ b/src/components/icons/wallets/open-source-wallet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/rpc-importing.svg b/src/components/icons/wallets/rpc-importing.svg new file mode 100644 index 00000000000..65c0e4396ae --- /dev/null +++ b/src/components/icons/wallets/rpc-importing.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/social-recover.svg b/src/components/icons/wallets/social-recover.svg new file mode 100644 index 00000000000..120d4219dc6 --- /dev/null +++ b/src/components/icons/wallets/social-recover.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/staking.svg b/src/components/icons/wallets/staking.svg new file mode 100644 index 00000000000..d1803eb8921 --- /dev/null +++ b/src/components/icons/wallets/staking.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/swap.svg b/src/components/icons/wallets/swap.svg new file mode 100644 index 00000000000..df42c30eb16 --- /dev/null +++ b/src/components/icons/wallets/swap.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/icons/wallets/withdraw-crypto.svg b/src/components/icons/wallets/withdraw-crypto.svg new file mode 100644 index 00000000000..d3a65f80a5b --- /dev/null +++ b/src/components/icons/wallets/withdraw-crypto.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From fae6ac8a04665df6ba57fd7f8bea4f8f598644ce Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:55:06 -0700 Subject: [PATCH 150/368] feat: migrate core icons from react-icons to Lucide - Replace common icons (chevrons, close, search, info, check, copy) with Lucide equivalents - Update size props to Tailwind text classes for font-size based sizing - Maintain functionality while removing react-icons dependencies - Cover majority of icon usage across the codebase --- .../WalletSubComponent.tsx | 21 ++++++++------- src/components/SocialListItem.tsx | 27 +++++++++---------- .../StartWithEthereumFlow/ShareModal.tsx | 10 +++---- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/components/FindWalletProductTable/WalletSubComponent.tsx b/src/components/FindWalletProductTable/WalletSubComponent.tsx index a8740ee81ee..cbc2fccded7 100644 --- a/src/components/FindWalletProductTable/WalletSubComponent.tsx +++ b/src/components/FindWalletProductTable/WalletSubComponent.tsx @@ -1,14 +1,15 @@ +import { Globe, Info } from "lucide-react" import { useLocale } from "next-intl" -import { FaDiscord, FaGlobe, FaXTwitter } from "react-icons/fa6" -import { MdInfoOutline } from "react-icons/md" import { FilterOption, Lang, WalletData } from "@/lib/types" import { useWalletFilters } from "@/components/FindWalletProductTable/hooks/useWalletFilters" +import Discord from "@/components/icons/discord.svg" import { - GreenCheckProductGlyphIcon, - WarningProductGlyphIcon, + GreenCheckProductGlyph, + WarningProductGlyph, } from "@/components/icons/staking" +import Twitter from "@/components/icons/twitter.svg" import Tooltip from "@/components/Tooltip" import InlineLink from "@/components/ui/Link" @@ -101,9 +102,9 @@ const WalletSubComponent = ({
  • {wallet[item.filterKey] ? ( - + ) : ( - + )}

    @@ -117,7 +118,7 @@ const WalletSubComponent = ({

    } > - +

    @@ -144,7 +145,7 @@ const WalletSubComponent = ({ eventValue: JSON.stringify(filters), }} > - + {wallet.discord && ( - + )} {wallet.twitter && ( @@ -171,7 +172,7 @@ const WalletSubComponent = ({ eventValue: JSON.stringify(filters), }} > - + )}
  • diff --git a/src/components/SocialListItem.tsx b/src/components/SocialListItem.tsx index 6056e311646..fad8b2853b5 100644 --- a/src/components/SocialListItem.tsx +++ b/src/components/SocialListItem.tsx @@ -1,11 +1,10 @@ -import { - FaDiscord, - FaGlobe, - FaRedditAlien, - FaStackExchange, - FaXTwitter, - FaYoutube, -} from "react-icons/fa6" +import { Globe } from "lucide-react" + +import Discord from "@/components/icons/discord.svg" +import Reddit from "@/components/icons/reddit.svg" +import StackExchange from "@/components/icons/stack-exchange.svg" +import Twitter from "@/components/icons/twitter.svg" +import Youtube from "@/components/icons/youtube.svg" import { cn } from "@/lib/utils/cn" @@ -18,12 +17,12 @@ const socialColorClasses = { } const icons = { - reddit: FaRedditAlien, - twitter: FaXTwitter, - youtube: FaYoutube, - discord: FaDiscord, - stackExchange: FaStackExchange, - webpage: FaGlobe, + reddit: Reddit, + twitter: Twitter, + youtube: Youtube, + discord: Discord, + stackExchange: StackExchange, + webpage: Globe, } type SocialListItemProps = React.HTMLAttributes & { diff --git a/src/components/StartWithEthereumFlow/ShareModal.tsx b/src/components/StartWithEthereumFlow/ShareModal.tsx index 969aec34571..7b047426e69 100644 --- a/src/components/StartWithEthereumFlow/ShareModal.tsx +++ b/src/components/StartWithEthereumFlow/ShareModal.tsx @@ -1,9 +1,9 @@ "use client" import { useState } from "react" -import { FaLink, FaXTwitter } from "react-icons/fa6" -import { MdCheck } from "react-icons/md" +import { Check, Link } from "lucide-react" +import Twitter from "@/components/icons/twitter.svg" import { Button } from "@/components/ui/buttons/Button" import { Dialog, @@ -50,12 +50,12 @@ const ShareModal = () => { > {hasCopied ? ( <> - +

    Copied!

    ) : ( <> - +

    Share

    )} @@ -65,7 +65,7 @@ const ShareModal = () => { className="flex flex-col hover:bg-background-highlight" onClick={() => shareOnTwitter()} > - +

    Twitter

    From 54bd16fb5eafd8cc530dbedc23e1cea5ca680365 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:58:07 -0700 Subject: [PATCH 151/368] fix: resolve build errors after icon migration - Fix SVG syntax errors (remove React-specific attributes) - Resolve TypeScript compatibility issues - Ensure clean build after migration --- app/[locale]/10years/_components/Stories.tsx | 6 +- .../tutorials/_components/tutorials.tsx | 4 +- app/[locale]/page.tsx | 15 +- app/[locale]/quizzes/_components/quizzes.tsx | 4 +- .../resources/_components/resources.tsx | 4 +- .../run-a-node/_components/run-a-node.tsx | 7 +- app/[locale]/stablecoins/page.tsx | 4 +- .../_components/what-is-ethereum.tsx | 14 +- docs/best-practices.md | 10 +- src/components/BigNumber/index.tsx | 4 +- src/components/ButtonDropdown.tsx | 4 +- src/components/CallToContribute/index.tsx | 6 +- src/components/Chevron/index.tsx | 6 +- src/components/CodeModal.tsx | 7 +- src/components/DocsNav.tsx | 6 +- src/components/EventCard.tsx | 4 +- src/components/ExpandableCard.tsx | 3 +- src/components/FeedbackCard.tsx | 4 +- src/components/FeedbackWidget/index.tsx | 4 +- .../FindWalletProductTable/WalletInfo.tsx | 6 +- src/components/Footer.tsx | 18 +- src/components/GitStars.tsx | 6 +- src/components/Homepage/CodeExamples.tsx | 5 +- .../Homepage/ValuesMarquee/index.tsx | 7 +- .../NetworksSubComponent.tsx | 12 +- .../hooks/useNetworkColumns.tsx | 17 +- .../ListenToPlayer/PlayerWidget/index.tsx | 4 +- src/components/MeetupList.tsx | 4 +- .../MergeInfographic/Background.tsx | 88 ------- .../MergeInfographic/background.svg | 79 +++++++ src/components/MergeInfographic/index.tsx | 25 +- src/components/Nav/Desktop/index.tsx | 8 +- src/components/Nav/Mobile/FooterButton.tsx | 6 +- src/components/Nav/Mobile/MenuFooter.tsx | 10 +- src/components/Nav/index.tsx | 2 +- src/components/Nav/types.ts | 4 +- .../Quiz/QuizWidget/QuizButtonGroup.tsx | 4 +- src/components/Quiz/QuizzesStats.tsx | 7 +- src/components/RadialChart/index.tsx | 4 +- src/components/Search/SearchButton.tsx | 4 +- src/components/Select/innerComponents.tsx | 4 +- src/components/SideNav.tsx | 5 +- src/components/SideNavMobile.tsx | 8 +- src/components/StablecoinAccordion/index.tsx | 4 +- .../Staking/StakingConsiderations/index.tsx | 12 +- src/components/Staking/StakingHierarchy.tsx | 6 +- .../Staking/StakingLaunchpadWidget.tsx | 4 +- .../StakingProductCard.tsx | 16 +- src/components/Staking/StakingStatsBox.tsx | 4 +- src/components/Stat/index.tsx | 9 +- .../TableOfContents/TableOfContentsMobile.tsx | 5 +- src/components/TableOfContents/index.tsx | 5 +- .../Translatathon/TranslatathonCalendar.tsx | 4 +- src/components/TranslationBannerLegal.tsx | 4 +- src/components/icons/EthHomeIcon.tsx | 47 ---- src/components/icons/FeedbackThumbsUpIcon.tsx | 13 -- src/components/icons/HighlightDarkIcon.tsx | 15 -- src/components/icons/HighlightIcon.tsx | 15 -- src/components/icons/icon-base.tsx | 43 ---- src/components/icons/index.ts | 8 +- .../icons/layer-2/DevelopingIcon.tsx | 37 --- src/components/icons/layer-2/EmergingIcon.tsx | 32 --- src/components/icons/layer-2/MaturingIcon.tsx | 50 ---- src/components/icons/layer-2/RobustIcon.tsx | 67 ------ src/components/icons/layer-2/index.ts | 8 +- src/components/icons/listen-to/arrow.tsx | 15 -- src/components/icons/listen-to/autoplay.tsx | 26 --- src/components/icons/listen-to/collapse.tsx | 22 -- src/components/icons/listen-to/expand.tsx | 22 -- src/components/icons/listen-to/index.ts | 12 +- .../icons/listen-to/pause-circle.tsx | 18 -- .../icons/listen-to/play-circle.tsx | 18 -- src/components/icons/quiz/CorrectIcon.tsx | 10 - src/components/icons/quiz/GreenTickIcon.tsx | 15 -- src/components/icons/quiz/IncorrectIcon.tsx | 10 - .../icons/quiz/StarConfettiIcon.tsx | 103 -------- src/components/icons/quiz/TrophyIcon.tsx | 15 -- src/components/icons/quiz/index.ts | 10 +- .../icons/roadmap/AccountAbstractionIcon.tsx | 15 -- .../roadmap/BetterUserExperienceIcon.tsx | 35 --- .../icons/roadmap/CheaperTransactionsIcon.tsx | 27 --- .../icons/roadmap/DankshardingIcon.tsx | 15 -- .../icons/roadmap/ExtraSecurityIcon.tsx | 23 -- .../icons/roadmap/FutureProofingIcon.tsx | 31 --- .../roadmap/ProposerBuilderSeparationIcon.tsx | 15 -- .../roadmap/SecretLeaderElectionIcon.tsx | 15 -- .../icons/roadmap/SingleSlotFinalityIcon.tsx | 15 -- .../icons/roadmap/StakingWithdrawalsIcon.tsx | 15 -- .../icons/roadmap/StatelessnessIcon.tsx | 15 -- .../icons/roadmap/VerkleTreesIcon.tsx | 15 -- src/components/icons/roadmap/index.ts | 24 +- .../icons/run-a-node/DappnodeIcon.tsx | 12 - .../DecentralizationEthGlyphIcon.tsx | 95 -------- .../run-a-node/DecentralizationGlyphIcon.tsx | 95 -------- .../icons/run-a-node/DownloadGlyphIcon.tsx | 40 ---- .../icons/run-a-node/EarthGlyphIcon.tsx | 16 -- .../icons/run-a-node/HardwareGlyphIcon.tsx | 33 --- .../icons/run-a-node/MegaphoneGlyphIcon.tsx | 61 ----- .../icons/run-a-node/PrivacyGlyphIcon.tsx | 94 -------- .../icons/run-a-node/SovereigntyGlyphIcon.tsx | 93 -------- .../icons/run-a-node/VoteGlyphIcon.tsx | 71 ------ src/components/icons/run-a-node/index.ts | 31 ++- .../icons/staking/AbyssGlyphIcon.tsx | 10 - .../icons/staking/AllnodesGlyphIcon.tsx | 10 - .../icons/staking/AnkrGlyphIcon.tsx | 13 -- src/components/icons/staking/AuditedIcon.tsx | 17 -- .../icons/staking/AvadoGlyphIcon.tsx | 10 - .../icons/staking/BattleTestedIcon.tsx | 31 --- .../icons/staking/BedrockGlyphIcon.tsx | 17 -- .../icons/staking/BugBountyIcon.tsx | 17 -- .../icons/staking/CautionProductGlyphIcon.tsx | 14 -- .../icons/staking/ChainLaboGlyphIcon.tsx | 13 -- .../staking/ConsensysStakingGlyphIcon.tsx | 10 - .../staking/DefaultOpenSourceGlyphIcon.tsx | 22 -- .../icons/staking/DockerGlyphIcon.tsx | 10 - .../icons/staking/EconomicalIcon.tsx | 13 -- .../icons/staking/EthpoolGlyphIcon.tsx | 15 -- .../icons/staking/EverstakeGlyphIcon.tsx | 11 - .../icons/staking/FigmentGlyphIcon.tsx | 19 -- .../staking/GreenCheckProductGlyphIcon.tsx | 22 -- .../icons/staking/KilnGlyphIcon.tsx | 15 -- .../icons/staking/LaunchnodesGlyphIcon.tsx | 25 -- .../icons/staking/LidoGlyphIcon.tsx | 13 -- .../icons/staking/LiquidityTokenIcon.tsx | 13 -- .../icons/staking/MultiClientIcon.tsx | 21 -- .../icons/staking/OpenSourceStakingIcon.tsx | 13 -- .../icons/staking/OriginEtherGlyphIcon.tsx | 124 ---------- src/components/icons/staking/P2PGlyphIcon.tsx | 31 --- .../icons/staking/PermissionlessIcon.tsx | 21 -- .../icons/staking/RockXGlyphIcon.tsx | 22 -- .../icons/staking/RocketPoolGlyphIcon.tsx | 65 ------ .../icons/staking/SelfCustodyIcon.tsx | 19 -- .../icons/staking/SenseiNodeGlyphIcon.tsx | 17 -- .../icons/staking/SquidGlyphIcon.tsx | 220 ------------------ .../icons/staking/StafiGlyphIcon.tsx | 13 -- .../icons/staking/StakefishGlyphIcon.tsx | 19 -- .../icons/staking/StakewiseGlyphIcon.tsx | 117 ---------- .../staking/StakingDappnodeGlyphIcon.tsx | 11 - .../icons/staking/StakingGlyphCPUIcon.tsx | 11 - .../staking/StakingGlyphCentralizedIcon.tsx | 11 - .../icons/staking/StakingGlyphCloudIcon.tsx | 11 - .../staking/StakingGlyphEtherCircleIcon.tsx | 23 -- .../staking/StakingGlyphTokenWalletIcon.tsx | 16 -- .../icons/staking/StereumGlyphIcon.tsx | 12 - .../icons/staking/TrustlessIcon.tsx | 19 -- .../icons/staking/UnknownProductGlyphIcon.tsx | 21 -- .../icons/staking/WagyuGlyphIcon.tsx | 43 ---- .../icons/staking/WarningProductGlyphIcon.tsx | 19 -- src/components/icons/staking/index.ts | 141 +++++++---- src/components/icons/wallets/BrowserIcon.tsx | 16 -- .../icons/wallets/BuyCryptoIcon.tsx | 18 -- .../icons/wallets/ConnectDappsIcon.tsx | 12 - src/components/icons/wallets/DesktopIcon.tsx | 16 -- src/components/icons/wallets/DevicesIcon.tsx | 17 -- .../icons/wallets/ENSSupportIcon.tsx | 16 -- .../icons/wallets/ERC20SupportIcon.tsx | 16 -- .../icons/wallets/FilterBurgerIcon.tsx | 14 -- .../icons/wallets/GasFeeCustomizationIcon.tsx | 20 -- src/components/icons/wallets/HardwareIcon.tsx | 12 - .../icons/wallets/HardwareSupportIcon.tsx | 18 -- .../icons/wallets/LanguagesIcon.tsx | 15 -- src/components/icons/wallets/Layer2Icon.tsx | 20 -- src/components/icons/wallets/MobileIcon.tsx | 18 -- src/components/icons/wallets/MultisigIcon.tsx | 20 -- .../icons/wallets/NFTSupportIcon.tsx | 12 - .../icons/wallets/NonCustodialIcon.tsx | 22 -- .../icons/wallets/OpenSourceWalletIcon.tsx | 12 - .../icons/wallets/RPCImportingIcon.tsx | 16 -- .../icons/wallets/SocialRecoverIcon.tsx | 18 -- src/components/icons/wallets/StakingIcon.tsx | 24 -- src/components/icons/wallets/SwapIcon.tsx | 26 --- .../icons/wallets/WithdrawCryptoIcon.tsx | 18 -- src/components/icons/wallets/index.ts | 46 ++-- 173 files changed, 423 insertions(+), 3457 deletions(-) delete mode 100644 src/components/MergeInfographic/Background.tsx create mode 100644 src/components/MergeInfographic/background.svg delete mode 100644 src/components/icons/EthHomeIcon.tsx delete mode 100644 src/components/icons/FeedbackThumbsUpIcon.tsx delete mode 100644 src/components/icons/HighlightDarkIcon.tsx delete mode 100644 src/components/icons/HighlightIcon.tsx delete mode 100644 src/components/icons/icon-base.tsx delete mode 100644 src/components/icons/layer-2/DevelopingIcon.tsx delete mode 100644 src/components/icons/layer-2/EmergingIcon.tsx delete mode 100644 src/components/icons/layer-2/MaturingIcon.tsx delete mode 100644 src/components/icons/layer-2/RobustIcon.tsx delete mode 100644 src/components/icons/listen-to/arrow.tsx delete mode 100644 src/components/icons/listen-to/autoplay.tsx delete mode 100644 src/components/icons/listen-to/collapse.tsx delete mode 100644 src/components/icons/listen-to/expand.tsx delete mode 100644 src/components/icons/listen-to/pause-circle.tsx delete mode 100644 src/components/icons/listen-to/play-circle.tsx delete mode 100644 src/components/icons/quiz/CorrectIcon.tsx delete mode 100644 src/components/icons/quiz/GreenTickIcon.tsx delete mode 100644 src/components/icons/quiz/IncorrectIcon.tsx delete mode 100644 src/components/icons/quiz/StarConfettiIcon.tsx delete mode 100644 src/components/icons/quiz/TrophyIcon.tsx delete mode 100644 src/components/icons/roadmap/AccountAbstractionIcon.tsx delete mode 100644 src/components/icons/roadmap/BetterUserExperienceIcon.tsx delete mode 100644 src/components/icons/roadmap/CheaperTransactionsIcon.tsx delete mode 100644 src/components/icons/roadmap/DankshardingIcon.tsx delete mode 100644 src/components/icons/roadmap/ExtraSecurityIcon.tsx delete mode 100644 src/components/icons/roadmap/FutureProofingIcon.tsx delete mode 100644 src/components/icons/roadmap/ProposerBuilderSeparationIcon.tsx delete mode 100644 src/components/icons/roadmap/SecretLeaderElectionIcon.tsx delete mode 100644 src/components/icons/roadmap/SingleSlotFinalityIcon.tsx delete mode 100644 src/components/icons/roadmap/StakingWithdrawalsIcon.tsx delete mode 100644 src/components/icons/roadmap/StatelessnessIcon.tsx delete mode 100644 src/components/icons/roadmap/VerkleTreesIcon.tsx delete mode 100644 src/components/icons/run-a-node/DappnodeIcon.tsx delete mode 100644 src/components/icons/run-a-node/DecentralizationEthGlyphIcon.tsx delete mode 100644 src/components/icons/run-a-node/DecentralizationGlyphIcon.tsx delete mode 100644 src/components/icons/run-a-node/DownloadGlyphIcon.tsx delete mode 100644 src/components/icons/run-a-node/EarthGlyphIcon.tsx delete mode 100644 src/components/icons/run-a-node/HardwareGlyphIcon.tsx delete mode 100644 src/components/icons/run-a-node/MegaphoneGlyphIcon.tsx delete mode 100644 src/components/icons/run-a-node/PrivacyGlyphIcon.tsx delete mode 100644 src/components/icons/run-a-node/SovereigntyGlyphIcon.tsx delete mode 100644 src/components/icons/run-a-node/VoteGlyphIcon.tsx delete mode 100644 src/components/icons/staking/AbyssGlyphIcon.tsx delete mode 100644 src/components/icons/staking/AllnodesGlyphIcon.tsx delete mode 100644 src/components/icons/staking/AnkrGlyphIcon.tsx delete mode 100644 src/components/icons/staking/AuditedIcon.tsx delete mode 100644 src/components/icons/staking/AvadoGlyphIcon.tsx delete mode 100644 src/components/icons/staking/BattleTestedIcon.tsx delete mode 100644 src/components/icons/staking/BedrockGlyphIcon.tsx delete mode 100644 src/components/icons/staking/BugBountyIcon.tsx delete mode 100644 src/components/icons/staking/CautionProductGlyphIcon.tsx delete mode 100644 src/components/icons/staking/ChainLaboGlyphIcon.tsx delete mode 100644 src/components/icons/staking/ConsensysStakingGlyphIcon.tsx delete mode 100644 src/components/icons/staking/DefaultOpenSourceGlyphIcon.tsx delete mode 100644 src/components/icons/staking/DockerGlyphIcon.tsx delete mode 100644 src/components/icons/staking/EconomicalIcon.tsx delete mode 100644 src/components/icons/staking/EthpoolGlyphIcon.tsx delete mode 100644 src/components/icons/staking/EverstakeGlyphIcon.tsx delete mode 100644 src/components/icons/staking/FigmentGlyphIcon.tsx delete mode 100644 src/components/icons/staking/GreenCheckProductGlyphIcon.tsx delete mode 100644 src/components/icons/staking/KilnGlyphIcon.tsx delete mode 100644 src/components/icons/staking/LaunchnodesGlyphIcon.tsx delete mode 100644 src/components/icons/staking/LidoGlyphIcon.tsx delete mode 100644 src/components/icons/staking/LiquidityTokenIcon.tsx delete mode 100644 src/components/icons/staking/MultiClientIcon.tsx delete mode 100644 src/components/icons/staking/OpenSourceStakingIcon.tsx delete mode 100644 src/components/icons/staking/OriginEtherGlyphIcon.tsx delete mode 100644 src/components/icons/staking/P2PGlyphIcon.tsx delete mode 100644 src/components/icons/staking/PermissionlessIcon.tsx delete mode 100644 src/components/icons/staking/RockXGlyphIcon.tsx delete mode 100644 src/components/icons/staking/RocketPoolGlyphIcon.tsx delete mode 100644 src/components/icons/staking/SelfCustodyIcon.tsx delete mode 100644 src/components/icons/staking/SenseiNodeGlyphIcon.tsx delete mode 100644 src/components/icons/staking/SquidGlyphIcon.tsx delete mode 100644 src/components/icons/staking/StafiGlyphIcon.tsx delete mode 100644 src/components/icons/staking/StakefishGlyphIcon.tsx delete mode 100644 src/components/icons/staking/StakewiseGlyphIcon.tsx delete mode 100644 src/components/icons/staking/StakingDappnodeGlyphIcon.tsx delete mode 100644 src/components/icons/staking/StakingGlyphCPUIcon.tsx delete mode 100644 src/components/icons/staking/StakingGlyphCentralizedIcon.tsx delete mode 100644 src/components/icons/staking/StakingGlyphCloudIcon.tsx delete mode 100644 src/components/icons/staking/StakingGlyphEtherCircleIcon.tsx delete mode 100644 src/components/icons/staking/StakingGlyphTokenWalletIcon.tsx delete mode 100644 src/components/icons/staking/StereumGlyphIcon.tsx delete mode 100644 src/components/icons/staking/TrustlessIcon.tsx delete mode 100644 src/components/icons/staking/UnknownProductGlyphIcon.tsx delete mode 100644 src/components/icons/staking/WagyuGlyphIcon.tsx delete mode 100644 src/components/icons/staking/WarningProductGlyphIcon.tsx delete mode 100644 src/components/icons/wallets/BrowserIcon.tsx delete mode 100644 src/components/icons/wallets/BuyCryptoIcon.tsx delete mode 100644 src/components/icons/wallets/ConnectDappsIcon.tsx delete mode 100644 src/components/icons/wallets/DesktopIcon.tsx delete mode 100644 src/components/icons/wallets/DevicesIcon.tsx delete mode 100644 src/components/icons/wallets/ENSSupportIcon.tsx delete mode 100644 src/components/icons/wallets/ERC20SupportIcon.tsx delete mode 100644 src/components/icons/wallets/FilterBurgerIcon.tsx delete mode 100644 src/components/icons/wallets/GasFeeCustomizationIcon.tsx delete mode 100644 src/components/icons/wallets/HardwareIcon.tsx delete mode 100644 src/components/icons/wallets/HardwareSupportIcon.tsx delete mode 100644 src/components/icons/wallets/LanguagesIcon.tsx delete mode 100644 src/components/icons/wallets/Layer2Icon.tsx delete mode 100644 src/components/icons/wallets/MobileIcon.tsx delete mode 100644 src/components/icons/wallets/MultisigIcon.tsx delete mode 100644 src/components/icons/wallets/NFTSupportIcon.tsx delete mode 100644 src/components/icons/wallets/NonCustodialIcon.tsx delete mode 100644 src/components/icons/wallets/OpenSourceWalletIcon.tsx delete mode 100644 src/components/icons/wallets/RPCImportingIcon.tsx delete mode 100644 src/components/icons/wallets/SocialRecoverIcon.tsx delete mode 100644 src/components/icons/wallets/StakingIcon.tsx delete mode 100644 src/components/icons/wallets/SwapIcon.tsx delete mode 100644 src/components/icons/wallets/WithdrawCryptoIcon.tsx diff --git a/app/[locale]/10years/_components/Stories.tsx b/app/[locale]/10years/_components/Stories.tsx index 25a72ad4816..58497113a77 100644 --- a/app/[locale]/10years/_components/Stories.tsx +++ b/app/[locale]/10years/_components/Stories.tsx @@ -1,8 +1,8 @@ "use client" import { useState } from "react" -import { FaXTwitter } from "react-icons/fa6" +import Twitter from "@/components/icons/twitter.svg" import { Button, ButtonLink } from "@/components/ui/buttons/Button" import { cn } from "@/lib/utils/cn" @@ -96,7 +96,7 @@ const Stories = ({ stories }: StoriesProps) => { hideArrow className="text-sm" > - + )} @@ -175,7 +175,7 @@ const Stories = ({ stories }: StoriesProps) => { hideArrow className="text-sm" > - + )} diff --git a/app/[locale]/developers/tutorials/_components/tutorials.tsx b/app/[locale]/developers/tutorials/_components/tutorials.tsx index 879f4ba9cbc..32686b1ec2b 100644 --- a/app/[locale]/developers/tutorials/_components/tutorials.tsx +++ b/app/[locale]/developers/tutorials/_components/tutorials.tsx @@ -9,12 +9,12 @@ import React, { useState, } from "react" import { useLocale } from "next-intl" -import { FaGithub } from "react-icons/fa" import { ITutorial, Lang } from "@/lib/types" import Emoji from "@/components/Emoji" import FeedbackCard from "@/components/FeedbackCard" +import Github from "@/components/icons/github.svg" import MainArticle from "@/components/MainArticle" import Translation from "@/components/Translation" import { getSkillTranslationId } from "@/components/TutorialMetadata" @@ -190,7 +190,7 @@ const TutorialPage = ({ variant="outline" href="https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=suggest_tutorial.yaml&title=" > - + diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 26dfd6cf9cd..be156e62075 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -2,8 +2,6 @@ import { Fragment } from "react" import dynamic from "next/dynamic" import { notFound } from "next/navigation" import { getTranslations, setRequestLocale } from "next-intl/server" -import { FaDiscord, FaGithub } from "react-icons/fa6" -import { FaXTwitter } from "react-icons/fa6" import type { AllMetricData, CommunityBlog, ValuesPairing } from "@/lib/types" import type { EventCardProps } from "@/lib/types" @@ -23,11 +21,14 @@ 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" import PickWalletIcon from "@/components/icons/eth-wallet.svg" +import Github from "@/components/icons/github.svg" import TryAppsIcon from "@/components/icons/phone-homescreen.svg" import RoadmapSign from "@/components/icons/roadmap-sign.svg" +import Twitter from "@/components/icons/twitter.svg" import Whitepaper from "@/components/icons/whitepaper.svg" import { Image } from "@/components/Image" import CardImage from "@/components/Image/CardImage" @@ -372,7 +373,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { eventName: "contribute", }, { - Svg: FaGithub, + Svg: Github, label: "GitHub", href: GITHUB_REPO_URL, className: "text-accent-a hover:text-accent-a-hover", @@ -380,7 +381,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { eventName: "GitHub", }, { - Svg: FaDiscord, + Svg: Discord, label: "Discord", href: "/discord/", className: "text-primary hover:text-primary-hover", @@ -388,7 +389,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { eventName: "Discord", }, { - Svg: FaXTwitter, + Svg: Twitter, label: "X", href: "https://x.com/EthDotOrg", className: "text-accent-b hover:text-accent-b-hover", @@ -735,7 +736,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { eventName: "discord", }} > - + }) => { eventName: "github", }} > - + diff --git a/app/[locale]/quizzes/_components/quizzes.tsx b/app/[locale]/quizzes/_components/quizzes.tsx index 2c5f00cb842..7992d6e8fbc 100644 --- a/app/[locale]/quizzes/_components/quizzes.tsx +++ b/app/[locale]/quizzes/_components/quizzes.tsx @@ -1,12 +1,12 @@ "use client" import { useMemo, useState } from "react" -import { FaGithub } from "react-icons/fa" import { QuizKey, QuizStatus } from "@/lib/types" import FeedbackCard from "@/components/FeedbackCard" import { HubHero } from "@/components/Hero" +import Github from "@/components/icons/github.svg" import MainArticle from "@/components/MainArticle" import QuizWidget from "@/components/Quiz/QuizWidget" import QuizzesList from "@/components/Quiz/QuizzesList" @@ -99,7 +99,7 @@ const QuizzesPage = () => { onClick={handleGHAdd} > - + {t("add-quiz")} diff --git a/app/[locale]/resources/_components/resources.tsx b/app/[locale]/resources/_components/resources.tsx index 11dd09d0c68..6b3c409882c 100644 --- a/app/[locale]/resources/_components/resources.tsx +++ b/app/[locale]/resources/_components/resources.tsx @@ -1,12 +1,12 @@ "use client" import { motion } from "framer-motion" -import { FaGithub } from "react-icons/fa6" import type { MetricReturnData } from "@/lib/types" import BannerNotification from "@/components/Banners/BannerNotification" import { HubHero } from "@/components/Hero" +import Github from "@/components/icons/github.svg" import StackIcon from "@/components/icons/stack.svg" import MainArticle from "@/components/MainArticle" import { ResourceItem, ResourcesContainer } from "@/components/Resources" @@ -201,7 +201,7 @@ const ResourcesPage = ({ txCostsMedianUsd }: ResourcesPageProps) => { eventName: "Ethereum.org Github Bug Report", }} > - {t("page-resources-found-bug")} + {t("page-resources-found-bug")} diff --git a/app/[locale]/run-a-node/_components/run-a-node.tsx b/app/[locale]/run-a-node/_components/run-a-node.tsx index 0ed6747c249..b3521833f4c 100644 --- a/app/[locale]/run-a-node/_components/run-a-node.tsx +++ b/app/[locale]/run-a-node/_components/run-a-node.tsx @@ -2,7 +2,6 @@ import { HTMLAttributes } from "react" import type { ReactNode } from "react" -import { FaDiscord } from "react-icons/fa" import type { ChildOnlyProp, PageWithContributorsProps } from "@/lib/types" @@ -10,7 +9,7 @@ import Emoji from "@/components/Emoji" import ExpandableCard from "@/components/ExpandableCard" import FeedbackCard from "@/components/FeedbackCard" import FileContributors from "@/components/FileContributors" -import type { IconBaseType } from "@/components/icons/icon-base" +import Discord from "@/components/icons/discord.svg" import { DecentralizationGlyphIcon, DownloadGlyphIcon, @@ -198,7 +197,7 @@ const Width40 = (props: ChildOnlyProp) => ( ) type RunANodeCard = { - image: IconBaseType + image: React.FC> title: string preview: ReactNode body: string[] @@ -656,7 +655,7 @@ const RunANodePage = ({ {t("page-run-a-node-community-description-2")} - + {t("page-run-a-node-community-link-1")} }) {

    {t("page-stablecoins-top-coins")} - +

    diff --git a/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx b/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx index cf81c8f7ec4..2b3bc733b06 100644 --- a/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx +++ b/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx @@ -1,9 +1,9 @@ "use client" +import { Info } from "lucide-react" import type { ImageProps } from "next/image" import { useLocale } from "next-intl" import type { HTMLAttributes } from "react" -import { MdInfoOutline } from "react-icons/md" import type { ChildOnlyProp, @@ -488,7 +488,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -511,7 +511,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -534,7 +534,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -559,7 +559,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -585,7 +585,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -611,7 +611,7 @@ const WhatIsEthereumPage = ({ })} > - + diff --git a/docs/best-practices.md b/docs/best-practices.md index 3b0c2f1186f..080fabe6c51 100644 --- a/docs/best-practices.md +++ b/docs/best-practices.md @@ -166,15 +166,13 @@ import Emoji from "./Emoji" ; // the base fontSize is `md` ``` -- **Icons**: We use [React Icons](https://react-icons.github.io/react-icons/) - with [Chakra UI Icon component](https://www.chakra-ui.com/docs/components/concepts/overview) +- **Icons**: We use [Lucide](https://lucide.dev/icons/) for icons ```tsx -import { Icon } from "@chakra-ui/react" -import { BsQuestionSquareFill } from "react-icons/bs" +import { CircleHelp } from "lucide-react" -// wrap your imported icon with the `Icon` component from Chakra UI -; +// Use tailwind classes to style, using fontSize for sizing +; // 24px size ``` ## Using custom `Image` component diff --git a/src/components/BigNumber/index.tsx b/src/components/BigNumber/index.tsx index 432c7d2614a..b32292fa9d5 100644 --- a/src/components/BigNumber/index.tsx +++ b/src/components/BigNumber/index.tsx @@ -1,6 +1,6 @@ import { type ReactNode } from "react" +import { Info } from "lucide-react" import { useLocale } from "next-intl" -import { MdInfoOutline } from "react-icons/md" import { cn } from "@/lib/utils/cn" import { isValidDate } from "@/lib/utils/date" @@ -63,7 +63,7 @@ const BigNumber = ({ } > - + )} diff --git a/src/components/ButtonDropdown.tsx b/src/components/ButtonDropdown.tsx index c2ef53c0e75..ade806cff23 100644 --- a/src/components/ButtonDropdown.tsx +++ b/src/components/ButtonDropdown.tsx @@ -1,7 +1,7 @@ "use client" import React, { useState } from "react" -import { MdMenu } from "react-icons/md" +import { Menu } from "lucide-react" import { cn } from "@/lib/utils/cn" import { trackCustomEvent } from "@/lib/utils/matomo" @@ -59,7 +59,7 @@ const ButtonDropdown = ({ list, className }: ButtonDropdownProps) => { variant="outline" className={cn("flex justify-between", className)} > - + {selectedItem} diff --git a/src/components/CallToContribute/index.tsx b/src/components/CallToContribute/index.tsx index 3a25b805b35..8be95b23520 100644 --- a/src/components/CallToContribute/index.tsx +++ b/src/components/CallToContribute/index.tsx @@ -1,8 +1,6 @@ -import React from "react" -import { FaGithub } from "react-icons/fa" - import { ChildOnlyProp } from "@/lib/types" +import Github from "@/components/icons/github.svg" import Translation from "@/components/Translation" import { ButtonLink } from "../ui/buttons/Button" @@ -50,7 +48,7 @@ const CallToContribute = ({ editPath }: CallToContributeProps) => { {" "} - + diff --git a/src/components/Chevron/index.tsx b/src/components/Chevron/index.tsx index 33116e5cdd9..566d5d46349 100644 --- a/src/components/Chevron/index.tsx +++ b/src/components/Chevron/index.tsx @@ -1,4 +1,4 @@ -import { MdChevronLeft, MdChevronRight } from "react-icons/md" +import { ChevronLeft, ChevronRight } from "lucide-react" import { cn } from "@/lib/utils/cn" @@ -9,7 +9,7 @@ export const ChevronNext = ({ ...props }: React.HTMLAttributes) => { const { twFlipForRtl } = useRtlFlip() - return + return } export const ChevronPrev = ({ @@ -17,5 +17,5 @@ export const ChevronPrev = ({ ...props }: React.HTMLAttributes) => { const { twFlipForRtl } = useRtlFlip() - return + return } diff --git a/src/components/CodeModal.tsx b/src/components/CodeModal.tsx index f2631ea05c0..8ef3b3bae0c 100644 --- a/src/components/CodeModal.tsx +++ b/src/components/CodeModal.tsx @@ -1,6 +1,5 @@ import { Children, type ReactElement } from "react" -import { IoMdCopy } from "react-icons/io" -import { MdCheck } from "react-icons/md" +import { Check, Copy } from "lucide-react" import { Button } from "./ui/buttons/Button" import { @@ -44,11 +43,11 @@ const CodeModal = ({ children, isOpen, setIsOpen, title }: CodeModalProps) => { > {hasCopied ? ( <> - {t("copied")} + {t("copied")} ) : ( <> - {t("copy")} + {t("copy")} )} diff --git a/src/components/DocsNav.tsx b/src/components/DocsNav.tsx index 90a2b91450a..68e2b710053 100644 --- a/src/components/DocsNav.tsx +++ b/src/components/DocsNav.tsx @@ -1,6 +1,6 @@ "use client" -import { FaChevronLeft, FaChevronRight } from "react-icons/fa" +import { ChevronLeft, ChevronRight } from "lucide-react" import { TranslationKey } from "@/lib/types" import type { DeveloperDocsLink } from "@/lib/interfaces" @@ -68,9 +68,9 @@ const CardLink = ({ docData, isPrev, contentNotTranslated }: CardLinkProps) => { )} > {isPrev ? ( - + ) : ( - + )} diff --git a/src/components/EventCard.tsx b/src/components/EventCard.tsx index 77bf2d0385c..d6010b4bf7b 100644 --- a/src/components/EventCard.tsx +++ b/src/components/EventCard.tsx @@ -1,6 +1,6 @@ import React from "react" +import { Calendar } from "lucide-react" import { useLocale } from "next-intl" -import { BsCalendar3 } from "react-icons/bs" import type { EventCardProps } from "@/lib/types" @@ -39,7 +39,7 @@ const EventCard: React.FC = ({ return ( - + {formatedDate} diff --git a/src/components/ExpandableCard.tsx b/src/components/ExpandableCard.tsx index aad9b420c7a..3d1a2755d06 100644 --- a/src/components/ExpandableCard.tsx +++ b/src/components/ExpandableCard.tsx @@ -7,7 +7,6 @@ import { Flex, HStack, VStack } from "@/components/ui/flex" import { cn } from "@/lib/utils/cn" import { trackCustomEvent } from "@/lib/utils/matomo" -import type { IconBaseType } from "./icons/icon-base" import { Accordion, AccordionContent, @@ -21,7 +20,7 @@ export type ExpandableCardProps = { children?: ReactNode contentPreview?: ReactNode title: ReactNode - svg?: IconBaseType + svg?: React.FC> eventAction?: string eventCategory?: string eventName?: string diff --git a/src/components/FeedbackCard.tsx b/src/components/FeedbackCard.tsx index ba93d4b1c1b..0c0de4eb010 100644 --- a/src/components/FeedbackCard.tsx +++ b/src/components/FeedbackCard.tsx @@ -80,11 +80,11 @@ const FeedbackCard = ({ prompt, isArticle, ...props }: FeedbackCardProps) => { {!feedbackSubmitted ? ( <> diff --git a/src/components/FeedbackWidget/index.tsx b/src/components/FeedbackWidget/index.tsx index 72a3df59eb9..018304ff927 100644 --- a/src/components/FeedbackWidget/index.tsx +++ b/src/components/FeedbackWidget/index.tsx @@ -1,7 +1,7 @@ "use client" import { useContext } from "react" -import { MdClose } from "react-icons/md" +import { X } from "lucide-react" import { Button } from "@/components/ui/buttons/Button" @@ -66,7 +66,7 @@ const FeedbackWidget = () => { size="sm" ref={cancelRef} > - + diff --git a/src/components/FindWalletProductTable/WalletInfo.tsx b/src/components/FindWalletProductTable/WalletInfo.tsx index e4f6b2d0aea..f7920c8a277 100644 --- a/src/components/FindWalletProductTable/WalletInfo.tsx +++ b/src/components/FindWalletProductTable/WalletInfo.tsx @@ -1,4 +1,4 @@ -import { IoChevronDownSharp, IoChevronUpSharp } from "react-icons/io5" +import { ChevronDown, ChevronUp } from "lucide-react" import { Wallet } from "@/lib/types" @@ -169,9 +169,9 @@ const WalletInfo = ({ wallet, isExpanded }: WalletInfoProps) => {
    diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 94436376f14..063981d80c8 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -1,11 +1,13 @@ "use client" -import { FaDiscord, FaGithub, FaXTwitter } from "react-icons/fa6" -import { IoChevronUpSharp } from "react-icons/io5" -import { SiFarcaster } from "react-icons/si" +import { ChevronUp } from "lucide-react" import type { FooterLink, FooterLinkSection } from "@/lib/types" +import Discord from "@/components/icons/discord.svg" +import Farcaster from "@/components/icons/farcaster.svg" +import Github from "@/components/icons/github.svg" +import Twitter from "@/components/icons/twitter.svg" import Translation from "@/components/Translation" import { cn } from "@/lib/utils/cn" @@ -19,22 +21,22 @@ import { useTranslation } from "@/hooks/useTranslation" const socialLinks = [ { - icon: FaGithub, + icon: Github, href: "https://github.com/ethereum/ethereum-org-website", ariaLabel: "GitHub", }, { - icon: SiFarcaster, + icon: Farcaster, href: "https://warpcast.com/ethdotorg", ariaLabel: "Farcaster", }, { - icon: FaXTwitter, + icon: Twitter, href: "https://x.com/ethdotorg", ariaLabel: "X", }, { - icon: FaDiscord, + icon: Discord, href: "https://discord.gg/ethereum-org", ariaLabel: "Discord", }, @@ -322,7 +324,7 @@ const Footer = ({ lastDeployLocaleTimestamp }: FooterProps) => { isSecondary onClick={() => scrollIntoView("body")} > - + diff --git a/src/components/GitStars.tsx b/src/components/GitStars.tsx index fde0ceda7ae..4eb5d4e8727 100644 --- a/src/components/GitStars.tsx +++ b/src/components/GitStars.tsx @@ -1,6 +1,6 @@ import { useLocale } from "next-intl" -import { FaGithub } from "react-icons/fa" +import Github from "@/components/icons/github.svg" import { Center, Flex } from "@/components/ui/flex" import { BaseLink, LinkProps } from "@/components/ui/Link" @@ -32,11 +32,11 @@ const GitStars = ({ gitHubRepo, hideStars, ...props }: GitStarsProps) => { > {hideStars ? ( - + ) : ( <>
    - +
    diff --git a/src/components/Homepage/CodeExamples.tsx b/src/components/Homepage/CodeExamples.tsx index 8e606500b43..5768f272a5e 100644 --- a/src/components/Homepage/CodeExamples.tsx +++ b/src/components/Homepage/CodeExamples.tsx @@ -1,9 +1,8 @@ "use client" import { Suspense, useState } from "react" +import { Check, Copy } from "lucide-react" import { useLocale } from "next-intl" -import { IoMdCopy } from "react-icons/io" -import { MdCheck } from "react-icons/md" import type { CodeExample } from "@/lib/interfaces" @@ -96,7 +95,7 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => { text={code} className="absolute end-4 top-4" > - {(hasCopied) => (hasCopied ? : )} + {(hasCopied) => (hasCopied ? : )} diff --git a/src/components/Homepage/ValuesMarquee/index.tsx b/src/components/Homepage/ValuesMarquee/index.tsx index 5918aef5a6c..1fa4d97a692 100644 --- a/src/components/Homepage/ValuesMarquee/index.tsx +++ b/src/components/Homepage/ValuesMarquee/index.tsx @@ -1,8 +1,7 @@ "use client" import { forwardRef, useEffect, useRef, useState } from "react" -import { FaCheck } from "react-icons/fa" -import { MdClose } from "react-icons/md" +import { Check, X } from "lucide-react" import type { ValuesPairing } from "@/lib/types" @@ -55,7 +54,7 @@ const Item = ({
    - +
    {pairing.legacy.content.map((line) => ( @@ -196,7 +195,7 @@ const ValuesMarquee = ({ eventCategory={eventCategory} direction={direction} > - + {pairing.ethereum.label} ))} diff --git a/src/components/Layer2NetworksTable/NetworksSubComponent.tsx b/src/components/Layer2NetworksTable/NetworksSubComponent.tsx index 8719fd0c2ee..036587cec39 100644 --- a/src/components/Layer2NetworksTable/NetworksSubComponent.tsx +++ b/src/components/Layer2NetworksTable/NetworksSubComponent.tsx @@ -1,4 +1,4 @@ -import { MdInfoOutline } from "react-icons/md" +import { Info } from "lucide-react" import { ExtendedRollup } from "@/lib/types" @@ -61,7 +61,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { eventName: "age", }} > - +

    @@ -102,7 +102,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { eventName: "wallet_support", }} > - +

    @@ -144,7 +144,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { eventName: "active_addresses", }} > - +

    @@ -171,7 +171,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { eventName: "fee_token", }} > - +

    @@ -200,7 +200,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { } > - +

    diff --git a/src/components/Layer2NetworksTable/hooks/useNetworkColumns.tsx b/src/components/Layer2NetworksTable/hooks/useNetworkColumns.tsx index e30c5f48d08..8e39cc9f266 100644 --- a/src/components/Layer2NetworksTable/hooks/useNetworkColumns.tsx +++ b/src/components/Layer2NetworksTable/hooks/useNetworkColumns.tsx @@ -1,7 +1,6 @@ "use client" -import { IoChevronDownSharp, IoChevronUpSharp } from "react-icons/io5" -import { MdInfoOutline } from "react-icons/md" +import { ChevronDown, ChevronUp, Info } from "lucide-react" import { ColumnDef } from "@tanstack/react-table" import { ExtendedRollup, Lang } from "@/lib/types" @@ -117,9 +116,9 @@ export const useNetworkColumns: ColumnDef[] = [ ) : ( )} @@ -154,7 +153,7 @@ export const useNetworkColumns: ColumnDef[] = [
    } > - +

    @@ -209,7 +208,7 @@ export const useNetworkColumns: ColumnDef[] = [ } > - +

    @@ -260,7 +259,7 @@ export const useNetworkColumns: ColumnDef[] = [ } > - +

    @@ -297,9 +296,9 @@ export const useNetworkColumns: ColumnDef[] = [ diff --git a/src/components/ListenToPlayer/PlayerWidget/index.tsx b/src/components/ListenToPlayer/PlayerWidget/index.tsx index 38ff1995d4e..623799ffa4a 100644 --- a/src/components/ListenToPlayer/PlayerWidget/index.tsx +++ b/src/components/ListenToPlayer/PlayerWidget/index.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef, useState } from "react" -import { IoClose } from "react-icons/io5" +import { X } from "lucide-react" import { ArrowIcon, @@ -324,7 +324,7 @@ const PlayerWidget = ({ handleCloseWidget() }} > - + diff --git a/src/components/MeetupList.tsx b/src/components/MeetupList.tsx index adf0860c74f..f535d3f4f22 100644 --- a/src/components/MeetupList.tsx +++ b/src/components/MeetupList.tsx @@ -2,7 +2,7 @@ import { useState } from "react" import { sortBy } from "lodash" -import { FaChevronRight } from "react-icons/fa6" +import { ChevronRight } from "lucide-react" import Emoji from "@/components/Emoji" import InfoBanner from "@/components/InfoBanner" @@ -95,7 +95,7 @@ const MeetupList = () => {

    {meetup.location}

    - + ))} diff --git a/src/components/MergeInfographic/Background.tsx b/src/components/MergeInfographic/Background.tsx deleted file mode 100644 index 027463ceb5d..00000000000 --- a/src/components/MergeInfographic/Background.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { createIconBase } from "../icons/icon-base" - -export const Background = createIconBase({ - displayName: "MergeInfographicBackground", - viewBox: `0 0 250 110`, - className: "w-[250px] h-[110px] fill-current", - children: ( - <> - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/MergeInfographic/background.svg b/src/components/MergeInfographic/background.svg new file mode 100644 index 00000000000..81ce44508c5 --- /dev/null +++ b/src/components/MergeInfographic/background.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/MergeInfographic/index.tsx b/src/components/MergeInfographic/index.tsx index 163af7e8225..410279b5060 100644 --- a/src/components/MergeInfographic/index.tsx +++ b/src/components/MergeInfographic/index.tsx @@ -4,10 +4,9 @@ import Translation from "@/components/Translation" import { cn } from "@/lib/utils/cn" -import { createIconBase } from "../icons/icon-base" import { HStack } from "../ui/flex" -import { Background } from "./Background" +import Background from "./background.svg" import { useTranslation } from "@/hooks/useTranslation" @@ -46,17 +45,6 @@ const SvgTextInternal = () => { ) } -const SvgText = createIconBase({ - displayName: "SvgText", - viewBox: "0 0 250 110", - version: "1.1", - xmlns: "http://www.w3.org/2000/svg", - xmlnsXlink: "http://www.w3.org/1999/xlink", - "aria-hidden": true, - className: "absolute size-full z-[1]", - children: , -}) - const MergeInfographic = () => { const { t } = useTranslation() @@ -73,7 +61,16 @@ const MergeInfographic = () => { > - + {" "}
    ) diff --git a/src/components/Staking/StakingConsiderations/index.tsx b/src/components/Staking/StakingConsiderations/index.tsx index 15d732d122d..c8a2d78eb17 100644 --- a/src/components/Staking/StakingConsiderations/index.tsx +++ b/src/components/Staking/StakingConsiderations/index.tsx @@ -4,9 +4,9 @@ import type { StakingPage } from "@/lib/types" import ButtonDropdown from "@/components/ButtonDropdown" import { - CautionProductGlyphIcon, - GreenCheckProductGlyphIcon, - WarningProductGlyphIcon, + CautionProductGlyph, + GreenCheckProductGlyph, + WarningProductGlyph, } from "@/components/icons/staking" import Translation from "@/components/Translation" import { Flex, VStack } from "@/components/ui/flex" @@ -28,14 +28,14 @@ const IndicatorGroup = ({ }) => { const IndicatorIcon = ({ style }) => { if (indicatorType === "valid") { - return + return } if (indicatorType === "caution") { - return + return } - return + return } return ( diff --git a/src/components/Staking/StakingHierarchy.tsx b/src/components/Staking/StakingHierarchy.tsx index d871e794a32..a1c41daa3e4 100644 --- a/src/components/Staking/StakingHierarchy.tsx +++ b/src/components/Staking/StakingHierarchy.tsx @@ -1,5 +1,4 @@ import React, { HTMLAttributes } from "react" -import { IconBase } from "react-icons" import { ChildOnlyProp } from "@/lib/types" @@ -81,7 +80,10 @@ const Pill = ({

    ) -type GlyphProps = { glyphIcon: typeof IconBase; className?: string } +type GlyphProps = { + glyphIcon: React.FC> + className?: string +} const Glyph = ({ glyphIcon: GlyphIcon, className }: GlyphProps) => (
    { variant="outline" className="w-full md:w-auto" > - {" "} + {" "} diff --git a/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx b/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx index 0e46a885e2f..b98753cfd46 100644 --- a/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx +++ b/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx @@ -1,10 +1,10 @@ import type { ComponentType, ReactNode, SVGProps } from "react" import { - CautionProductGlyphIcon, - GreenCheckProductGlyphIcon, - UnknownProductGlyphIcon, - WarningProductGlyphIcon, + CautionProductGlyph, + GreenCheckProductGlyph, + UnknownProductGlyph, + WarningProductGlyph, } from "@/components/icons/staking" import SocialListItem from "@/components/SocialListItem" import { ButtonLink } from "@/components/ui/buttons/Button" @@ -31,14 +31,14 @@ const Status = ({ status }: { status: FlagType | undefined }) => { const styles = "me-2 size-5" switch (status) { case "green-check": - return + return case "caution": - return + return case "warning": case "false": - return + return default: - return + return } } diff --git a/src/components/Staking/StakingStatsBox.tsx b/src/components/Staking/StakingStatsBox.tsx index 5cc83623545..9e1646f316a 100644 --- a/src/components/Staking/StakingStatsBox.tsx +++ b/src/components/Staking/StakingStatsBox.tsx @@ -1,5 +1,5 @@ +import { Info } from "lucide-react" import { useLocale } from "next-intl" -import { MdInfoOutline } from "react-icons/md" import type { ChildOnlyProp, Lang, StakingStatsData } from "@/lib/types" @@ -31,7 +31,7 @@ const Label = ({ children }: ChildOnlyProp) => ( // BeaconchainTooltip component const BeaconchainTooltip = ({ children }: ChildOnlyProp) => ( - + ) diff --git a/src/components/Stat/index.tsx b/src/components/Stat/index.tsx index 17ae3fb955a..bd06cd8bff8 100644 --- a/src/components/Stat/index.tsx +++ b/src/components/Stat/index.tsx @@ -1,6 +1,5 @@ import { useEffect, useState } from "react" -import type { IconType } from "react-icons/lib" -import { MdInfoOutline, MdWarning } from "react-icons/md" +import { AlertTriangle, Info, type LucideIcon } from "lucide-react" import { Flex } from "@/components/ui/flex" @@ -10,7 +9,7 @@ import Tooltip, { type TooltipProps } from "../Tooltip" const initialContent = { contentValue: NULL_VALUE, - tooltipIcon: MdInfoOutline, + tooltipIcon: Info, } export type StatProps = { @@ -23,14 +22,14 @@ export type StatProps = { const Stat = ({ tooltipProps, value, label, isError }: StatProps) => { const [content, setContent] = useState<{ contentValue: string | JSX.Element - tooltipIcon: IconType + tooltipIcon: LucideIcon }>(initialContent) useEffect(() => { if (isError) { return setContent({ contentValue: NULL_VALUE, - tooltipIcon: MdWarning, + tooltipIcon: AlertTriangle, }) } diff --git a/src/components/TableOfContents/TableOfContentsMobile.tsx b/src/components/TableOfContents/TableOfContentsMobile.tsx index 605c1f2eeeb..4504fe4398b 100644 --- a/src/components/TableOfContents/TableOfContentsMobile.tsx +++ b/src/components/TableOfContents/TableOfContentsMobile.tsx @@ -1,5 +1,4 @@ -import React from "react" -import { MdExpandMore } from "react-icons/md" +import { ChevronDown } from "lucide-react" import type { ToCItem } from "@/lib/types" @@ -35,7 +34,7 @@ const Mobile = ({ items, maxDepth }: TableOfContentsMobileProps) => { className="flex w-full justify-between lg:hidden" > {t("on-this-page")} - + {!hideEditButton && editPath && ( - + {t("edit-page")} )} diff --git a/src/components/Translatathon/TranslatathonCalendar.tsx b/src/components/Translatathon/TranslatathonCalendar.tsx index 117aadc486c..75a91effd23 100644 --- a/src/components/Translatathon/TranslatathonCalendar.tsx +++ b/src/components/Translatathon/TranslatathonCalendar.tsx @@ -1,10 +1,10 @@ "use client" import { useLocale } from "next-intl" -import { FaDiscord } from "react-icons/fa" import type { Lang } from "@/lib/types" +import Discord from "@/components/icons/discord.svg" import { ButtonLink } from "@/components/ui/buttons/Button" import { Flex } from "@/components/ui/flex" import InlineLink from "@/components/ui/Link" @@ -73,7 +73,7 @@ export const TranslatathonCalendar = () => { might have.

    matomoEvent("discord")}> - + Join Discord diff --git a/src/components/TranslationBannerLegal.tsx b/src/components/TranslationBannerLegal.tsx index 16f9bab2d79..5b88d7c4ddb 100644 --- a/src/components/TranslationBannerLegal.tsx +++ b/src/components/TranslationBannerLegal.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from "react" -import { MdClose } from "react-icons/md" +import { X } from "lucide-react" import { Button } from "@/components/ui/buttons/Button" @@ -81,7 +81,7 @@ const TranslationBannerLegal = ({ )} onClick={() => setIsOpen(false)} > - + diff --git a/src/components/icons/EthHomeIcon.tsx b/src/components/icons/EthHomeIcon.tsx deleted file mode 100644 index fb6c3815df8..00000000000 --- a/src/components/icons/EthHomeIcon.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { createIconBase } from "./icon-base" - -export const EthHomeIcon = createIconBase({ - displayName: "EthHomeIcon", - viewBox: "0 0 115 182", - className: "w-[115px] h-auto", - children: ( - <> - - - - - - - - ), -}) diff --git a/src/components/icons/FeedbackThumbsUpIcon.tsx b/src/components/icons/FeedbackThumbsUpIcon.tsx deleted file mode 100644 index 8a55eae5045..00000000000 --- a/src/components/icons/FeedbackThumbsUpIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { createIconBase } from "./icon-base" - -export const FeedbackThumbsUpIcon = createIconBase({ - displayName: "FeedbackThumbsUpIcon", - viewBox: "0 0 25 25", - className: "size-[25px]", - children: ( - <> - - - - ), -}) diff --git a/src/components/icons/HighlightDarkIcon.tsx b/src/components/icons/HighlightDarkIcon.tsx deleted file mode 100644 index 1d6548d31f9..00000000000 --- a/src/components/icons/HighlightDarkIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "./icon-base" - -export const HighlightDarkIcon = createIconBase({ - displayName: "HighlightDarkIcon", - viewBox: "0 0 280 28", - className: "w-[280px] h-[28px]", - children: ( - - ), -}) diff --git a/src/components/icons/HighlightIcon.tsx b/src/components/icons/HighlightIcon.tsx deleted file mode 100644 index 5f899007557..00000000000 --- a/src/components/icons/HighlightIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "./icon-base" - -export const HighlightIcon = createIconBase({ - displayName: "HighlightIcon", - viewBox: "0 0 280 28", - className: "w-[280px] h-[28px]", - children: ( - - ), -}) diff --git a/src/components/icons/icon-base.tsx b/src/components/icons/icon-base.tsx deleted file mode 100644 index 7ea538019e3..00000000000 --- a/src/components/icons/icon-base.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { IconBase as ReactIconBase, type IconBaseProps } from "react-icons" - -import { cn } from "@/lib/utils/cn" - -/** - * Wrapper to generate an icon component, using the react-icons `IconBase` component. - * Requires setting `displayName` and `children` props. - * - * **NOTE:** Setting SVG attributes in the `options` object become default values, which are overridden when passing props on render. - */ -export const createIconBase = ( - options: IconBaseProps & { - displayName: string - } -) => { - const { - children, - displayName, - className: defaultClassName, - ...defaultProps - } = options - - const Comp = ({ className, ...props }: IconBaseProps) => { - return ( - - {children} - - ) - } - - Comp.displayName = displayName - - return Comp -} - -export type IconBaseType = ReturnType diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index f72356310a8..500fb0d1f0d 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -1,9 +1,9 @@ // General Icons -import { EthHomeIcon } from "./EthHomeIcon" +import EthHomeIcon from "./eth-home-icon.svg" import FeedbackGlyphIcon from "./feedback-glyph-icon.svg" -import { FeedbackThumbsUpIcon } from "./FeedbackThumbsUpIcon" -import { HighlightDarkIcon } from "./HighlightDarkIcon" -import { HighlightIcon } from "./HighlightIcon" +import FeedbackThumbsUpIcon from "./feedback-thumbs-up.svg" +import HighlightIcon from "./highlight.svg" +import HighlightDarkIcon from "./highlight-dark.svg" export { EthHomeIcon, diff --git a/src/components/icons/layer-2/DevelopingIcon.tsx b/src/components/icons/layer-2/DevelopingIcon.tsx deleted file mode 100644 index 422d6c9bbc5..00000000000 --- a/src/components/icons/layer-2/DevelopingIcon.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -export const DevelopingIcon = createIconBase({ - displayName: "DevelopingIcon", - viewBox: "0 0 16 24", - className: "w-4 h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - ), -}) diff --git a/src/components/icons/layer-2/EmergingIcon.tsx b/src/components/icons/layer-2/EmergingIcon.tsx deleted file mode 100644 index 876f08844d7..00000000000 --- a/src/components/icons/layer-2/EmergingIcon.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -export const EmergingIcon = createIconBase({ - displayName: "EmergingIcon", - viewBox: "0 0 16 24", - className: "w-4 h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - ), -}) diff --git a/src/components/icons/layer-2/MaturingIcon.tsx b/src/components/icons/layer-2/MaturingIcon.tsx deleted file mode 100644 index f0585e6a8c6..00000000000 --- a/src/components/icons/layer-2/MaturingIcon.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -export const MaturingIcon = createIconBase({ - displayName: "MaturingIcon", - viewBox: "0 0 16 24", - className: "w-4 h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - ), -}) diff --git a/src/components/icons/layer-2/RobustIcon.tsx b/src/components/icons/layer-2/RobustIcon.tsx deleted file mode 100644 index b900e1d2678..00000000000 --- a/src/components/icons/layer-2/RobustIcon.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { createIconBase } from "@/components/icons/icon-base" -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -export const RobustIcon = createIconBase({ - displayName: "RobustIcon", - viewBox: "0 0 16 24", - className: "w-4 h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/layer-2/index.ts b/src/components/icons/layer-2/index.ts index 1325723a21b..53ff6d41aee 100644 --- a/src/components/icons/layer-2/index.ts +++ b/src/components/icons/layer-2/index.ts @@ -1,6 +1,6 @@ -import { DevelopingIcon } from "./DevelopingIcon" -import { EmergingIcon } from "./EmergingIcon" -import { MaturingIcon } from "./MaturingIcon" -import { RobustIcon } from "./RobustIcon" +import DevelopingIcon from "./developing.svg" +import EmergingIcon from "./emerging.svg" +import MaturingIcon from "./maturing.svg" +import RobustIcon from "./Robust.svg" export { DevelopingIcon, EmergingIcon, MaturingIcon, RobustIcon } diff --git a/src/components/icons/listen-to/arrow.tsx b/src/components/icons/listen-to/arrow.tsx deleted file mode 100644 index f169203399c..00000000000 --- a/src/components/icons/listen-to/arrow.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const ArrowIcon = createIconBase({ - displayName: "ArrowIcon", - viewBox: "0 0 32 32", - fill: "fill-disabled", - children: ( - - - - ), -}) diff --git a/src/components/icons/listen-to/autoplay.tsx b/src/components/icons/listen-to/autoplay.tsx deleted file mode 100644 index b4f94e45ec4..00000000000 --- a/src/components/icons/listen-to/autoplay.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const AutoplayIcon = createIconBase({ - displayName: "AutoplayIcon", - viewBox: "0 0 24 24", - children: ( - - - - - - - ), -}) diff --git a/src/components/icons/listen-to/collapse.tsx b/src/components/icons/listen-to/collapse.tsx deleted file mode 100644 index 62751e36400..00000000000 --- a/src/components/icons/listen-to/collapse.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const CollapseIcon = createIconBase({ - displayName: "CollapseIcon", - viewBox: "0 0 16 16", - children: ( - - - - - ), -}) diff --git a/src/components/icons/listen-to/expand.tsx b/src/components/icons/listen-to/expand.tsx deleted file mode 100644 index a67546b3bde..00000000000 --- a/src/components/icons/listen-to/expand.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const ExpandIcon = createIconBase({ - displayName: "ExpandIcon", - viewBox: "0 0 16 16", - children: ( - - - - - ), -}) diff --git a/src/components/icons/listen-to/index.ts b/src/components/icons/listen-to/index.ts index 0c98c5f8c4a..eb3a40bae12 100644 --- a/src/components/icons/listen-to/index.ts +++ b/src/components/icons/listen-to/index.ts @@ -1,9 +1,9 @@ -import { ArrowIcon } from "./arrow" -import { AutoplayIcon } from "./autoplay" -import { CollapseIcon } from "./collapse" -import { ExpandIcon } from "./expand" -import { PauseCircleIcon } from "./pause-circle" -import { PlayCircleIcon } from "./play-circle" +import ArrowIcon from "./arrow.svg" +import AutoplayIcon from "./autoplay.svg" +import CollapseIcon from "./collapse.svg" +import ExpandIcon from "./expand.svg" +import PauseCircleIcon from "./pause-circle.svg" +import PlayCircleIcon from "./play-circle.svg" export { ArrowIcon, diff --git a/src/components/icons/listen-to/pause-circle.tsx b/src/components/icons/listen-to/pause-circle.tsx deleted file mode 100644 index a62585aeb52..00000000000 --- a/src/components/icons/listen-to/pause-circle.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const PauseCircleIcon = createIconBase({ - displayName: "PauseCircleIcon", - viewBox: "0 0 24 24", - children: ( - - - - - ), -}) diff --git a/src/components/icons/listen-to/play-circle.tsx b/src/components/icons/listen-to/play-circle.tsx deleted file mode 100644 index ea1efad4936..00000000000 --- a/src/components/icons/listen-to/play-circle.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const PlayCircleIcon = createIconBase({ - displayName: "PlayCircleIcon", - viewBox: "0 0 24 24", - children: ( - - - - - ), -}) diff --git a/src/components/icons/quiz/CorrectIcon.tsx b/src/components/icons/quiz/CorrectIcon.tsx deleted file mode 100644 index d6f7ed55cf8..00000000000 --- a/src/components/icons/quiz/CorrectIcon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const CorrectIcon = createIconBase({ - displayName: "CorrectIcon", - viewBox: "0 0 20 16", - className: "h-auto w-5", - children: ( - - ), -}) diff --git a/src/components/icons/quiz/GreenTickIcon.tsx b/src/components/icons/quiz/GreenTickIcon.tsx deleted file mode 100644 index 963ee5a508d..00000000000 --- a/src/components/icons/quiz/GreenTickIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const GreenTickIcon = createIconBase({ - displayName: "GreenTickIcon", - viewBox: "0 0 16 16", - children: ( - - - - - ), -}) diff --git a/src/components/icons/quiz/IncorrectIcon.tsx b/src/components/icons/quiz/IncorrectIcon.tsx deleted file mode 100644 index 2b1bbc45193..00000000000 --- a/src/components/icons/quiz/IncorrectIcon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const IncorrectIcon = createIconBase({ - displayName: "IncorrectIcon", - viewBox: "0 0 20 20", - className: "h-auto w-5", - children: ( - - ), -}) diff --git a/src/components/icons/quiz/StarConfettiIcon.tsx b/src/components/icons/quiz/StarConfettiIcon.tsx deleted file mode 100644 index 03949bffc0c..00000000000 --- a/src/components/icons/quiz/StarConfettiIcon.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const StarConfettiIcon = createIconBase({ - displayName: "StarConfettiIcon", - viewBox: "0 0 185 119", - className: "h-auto w-[185px]", - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/quiz/TrophyIcon.tsx b/src/components/icons/quiz/TrophyIcon.tsx deleted file mode 100644 index 289ee4d5e0a..00000000000 --- a/src/components/icons/quiz/TrophyIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultProps } from "../utils" - -export const TrophyIcon = createIconBase({ - displayName: "TrophyIcon", - viewBox: "0 0 28 28", - className: "h-auto w-7", - ...commonIconDefaultProps, - children: ( - <> - - - - ), -}) diff --git a/src/components/icons/quiz/index.ts b/src/components/icons/quiz/index.ts index 5f5c543ea9c..49c713c0ac3 100644 --- a/src/components/icons/quiz/index.ts +++ b/src/components/icons/quiz/index.ts @@ -1,8 +1,8 @@ -import { CorrectIcon } from "./CorrectIcon" -import { GreenTickIcon } from "./GreenTickIcon" -import { IncorrectIcon } from "./IncorrectIcon" -import { StarConfettiIcon } from "./StarConfettiIcon" -import { TrophyIcon } from "./TrophyIcon" +import CorrectIcon from "./correct.svg" +import GreenTickIcon from "./green-tick.svg" +import IncorrectIcon from "./incorrect.svg" +import StarConfettiIcon from "./star-confetti.svg" +import TrophyIcon from "./trophy.svg" export { CorrectIcon, diff --git a/src/components/icons/roadmap/AccountAbstractionIcon.tsx b/src/components/icons/roadmap/AccountAbstractionIcon.tsx deleted file mode 100644 index 5548ece508a..00000000000 --- a/src/components/icons/roadmap/AccountAbstractionIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const AccountAbstractionIcon = createIconBase({ - displayName: "AccountAbstractionIcon", - viewBox: "0 0 28 28", - className: "w-[28px] h-[28px]", - children: ( - <> - - - ), -}) diff --git a/src/components/icons/roadmap/BetterUserExperienceIcon.tsx b/src/components/icons/roadmap/BetterUserExperienceIcon.tsx deleted file mode 100644 index dde3eb9af99..00000000000 --- a/src/components/icons/roadmap/BetterUserExperienceIcon.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const BetterUserExperienceIcon = createIconBase({ - displayName: "BetterUserExperienceIcon", - viewBox: "0 0 50 50", - className: "w-[50px] h-[50px]", - children: ( - <> - - - - - - - - ), -}) diff --git a/src/components/icons/roadmap/CheaperTransactionsIcon.tsx b/src/components/icons/roadmap/CheaperTransactionsIcon.tsx deleted file mode 100644 index 8c3481c6d13..00000000000 --- a/src/components/icons/roadmap/CheaperTransactionsIcon.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const CheaperTransactionsIcon = createIconBase({ - displayName: "CheaperTransactionsIcon", - viewBox: "0 0 54 40", - className: "w-[54px] h-[40px]", - children: ( - <> - - - - - - ), -}) diff --git a/src/components/icons/roadmap/DankshardingIcon.tsx b/src/components/icons/roadmap/DankshardingIcon.tsx deleted file mode 100644 index e01a7173c7d..00000000000 --- a/src/components/icons/roadmap/DankshardingIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const DankshardingIcon = createIconBase({ - displayName: "DankshardingIcon", - viewBox: "0 0 28 28", - className: "w-[28px] h-[28px]", - children: ( - <> - - - ), -}) diff --git a/src/components/icons/roadmap/ExtraSecurityIcon.tsx b/src/components/icons/roadmap/ExtraSecurityIcon.tsx deleted file mode 100644 index 7b304aeae4e..00000000000 --- a/src/components/icons/roadmap/ExtraSecurityIcon.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const ExtraSecurityIcon = createIconBase({ - displayName: "ExtraSecurityIcon", - viewBox: "0 0 44 53", - className: "w-[44px] h-[53px]", - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/roadmap/FutureProofingIcon.tsx b/src/components/icons/roadmap/FutureProofingIcon.tsx deleted file mode 100644 index cfbe18c7b30..00000000000 --- a/src/components/icons/roadmap/FutureProofingIcon.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const FutureProofingIcon = createIconBase({ - displayName: "FutureProofingIcon", - viewBox: "0 0 56 56", - className: "w-[56px] h-[56px]", - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/roadmap/ProposerBuilderSeparationIcon.tsx b/src/components/icons/roadmap/ProposerBuilderSeparationIcon.tsx deleted file mode 100644 index 4828f3918af..00000000000 --- a/src/components/icons/roadmap/ProposerBuilderSeparationIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const ProposerBuilderSeparationIcon = createIconBase({ - displayName: "ProposerBuilderSeparationIcon", - viewBox: "0 0 28 28", - className: "w-[28px] h-[28px]", - children: ( - <> - - - ), -}) diff --git a/src/components/icons/roadmap/SecretLeaderElectionIcon.tsx b/src/components/icons/roadmap/SecretLeaderElectionIcon.tsx deleted file mode 100644 index 63faec198db..00000000000 --- a/src/components/icons/roadmap/SecretLeaderElectionIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const SecretLeaderElectionIcon = createIconBase({ - displayName: "SecretLeaderElectionIcon", - viewBox: "0 0 28 28", - className: "w-[28px] h-[28px]", - children: ( - <> - - - ), -}) diff --git a/src/components/icons/roadmap/SingleSlotFinalityIcon.tsx b/src/components/icons/roadmap/SingleSlotFinalityIcon.tsx deleted file mode 100644 index 6b2f7653f6a..00000000000 --- a/src/components/icons/roadmap/SingleSlotFinalityIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const SingleSlotFinalityIcon = createIconBase({ - displayName: "SingleSlotFinalityIcon", - viewBox: "0 0 28 28", - className: "w-[28px] h-[28px]", - children: ( - <> - - - ), -}) diff --git a/src/components/icons/roadmap/StakingWithdrawalsIcon.tsx b/src/components/icons/roadmap/StakingWithdrawalsIcon.tsx deleted file mode 100644 index 2023033b85f..00000000000 --- a/src/components/icons/roadmap/StakingWithdrawalsIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const StakingWithdrawalsIcon = createIconBase({ - displayName: "StakingWithdrawalsIcon", - viewBox: "0 0 28 28", - className: "w-[28px] h-[28px]", - children: ( - <> - - - ), -}) diff --git a/src/components/icons/roadmap/StatelessnessIcon.tsx b/src/components/icons/roadmap/StatelessnessIcon.tsx deleted file mode 100644 index c90ccc5d227..00000000000 --- a/src/components/icons/roadmap/StatelessnessIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const StatelessnessIcon = createIconBase({ - displayName: "StatelessnessIcon", - viewBox: "0 0 28 28", - className: "w-[28px] h-[28px]", - children: ( - <> - - - ), -}) diff --git a/src/components/icons/roadmap/VerkleTreesIcon.tsx b/src/components/icons/roadmap/VerkleTreesIcon.tsx deleted file mode 100644 index 326f3c4c4e6..00000000000 --- a/src/components/icons/roadmap/VerkleTreesIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const VerkleTreesIcon = createIconBase({ - displayName: "VerkleTreesIcon", - viewBox: "0 0 28 28", - className: "w-[28px] h-[28px]", - children: ( - <> - - - ), -}) diff --git a/src/components/icons/roadmap/index.ts b/src/components/icons/roadmap/index.ts index 5beac56b0b2..2c496d1dbeb 100644 --- a/src/components/icons/roadmap/index.ts +++ b/src/components/icons/roadmap/index.ts @@ -1,15 +1,15 @@ -import { AccountAbstractionIcon } from "./AccountAbstractionIcon" -import { BetterUserExperienceIcon } from "./BetterUserExperienceIcon" -import { CheaperTransactionsIcon } from "./CheaperTransactionsIcon" -import { DankshardingIcon } from "./DankshardingIcon" -import { ExtraSecurityIcon } from "./ExtraSecurityIcon" -import { FutureProofingIcon } from "./FutureProofingIcon" -import { ProposerBuilderSeparationIcon } from "./ProposerBuilderSeparationIcon" -import { SecretLeaderElectionIcon } from "./SecretLeaderElectionIcon" -import { SingleSlotFinalityIcon } from "./SingleSlotFinalityIcon" -import { StakingWithdrawalsIcon } from "./StakingWithdrawalsIcon" -import { StatelessnessIcon } from "./StatelessnessIcon" -import { VerkleTreesIcon } from "./VerkleTreesIcon" +import AccountAbstractionIcon from "./account-abstraction.svg" +import BetterUserExperienceIcon from "./better-user-experience.svg" +import CheaperTransactionsIcon from "./cheaper-transactions.svg" +import DankshardingIcon from "./danksharding.svg" +import ExtraSecurityIcon from "./extra-security.svg" +import FutureProofingIcon from "./future-proofing.svg" +import ProposerBuilderSeparationIcon from "./proposer-builder-separation.svg" +import SecretLeaderElectionIcon from "./secret-leader-election.svg" +import SingleSlotFinalityIcon from "./single-slot-finality.svg" +import StakingWithdrawalsIcon from "./staking-withdrawals.svg" +import StatelessnessIcon from "./statelessness.svg" +import VerkleTreesIcon from "./verkle-trees.svg" export { AccountAbstractionIcon, diff --git a/src/components/icons/run-a-node/DappnodeIcon.tsx b/src/components/icons/run-a-node/DappnodeIcon.tsx deleted file mode 100644 index 880471737ff..00000000000 --- a/src/components/icons/run-a-node/DappnodeIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const DappnodeIcon = createIconBase({ - displayName: "DappnodeIcon", - viewBox: "0 0 148 160", - className: "h-auto w-[148px] text-[#30bcb2]", - fillRule: "evenodd", - clipRule: "evenodd", - children: ( - - ), -}) diff --git a/src/components/icons/run-a-node/DecentralizationEthGlyphIcon.tsx b/src/components/icons/run-a-node/DecentralizationEthGlyphIcon.tsx deleted file mode 100644 index 64cb1c4c84b..00000000000 --- a/src/components/icons/run-a-node/DecentralizationEthGlyphIcon.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const DecentralizationEthGlyphIcon = createIconBase({ - displayName: "DecentralizationEthGlyphIcon", - viewBox: "0 0 64 64", - className: "h-auto w-[64px]", - children: ( - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/run-a-node/DecentralizationGlyphIcon.tsx b/src/components/icons/run-a-node/DecentralizationGlyphIcon.tsx deleted file mode 100644 index 8a46ddeb987..00000000000 --- a/src/components/icons/run-a-node/DecentralizationGlyphIcon.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const DecentralizationGlyphIcon = createIconBase({ - displayName: "DecentralizationGlyphIcon", - viewBox: "0 0 40 64", - className: "h-auto w-[40px]", - children: ( - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/run-a-node/DownloadGlyphIcon.tsx b/src/components/icons/run-a-node/DownloadGlyphIcon.tsx deleted file mode 100644 index 4780f0240ca..00000000000 --- a/src/components/icons/run-a-node/DownloadGlyphIcon.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable react/jsx-key */ -import { createIconBase } from "../icon-base" - -export const DownloadGlyphIcon = createIconBase({ - displayName: "DownloadGlyphIcon", - viewBox: "0 0 64 64", - className: "h-auto w-[64px]", - children: ( - <> - - - - - - - - - ), -}) diff --git a/src/components/icons/run-a-node/EarthGlyphIcon.tsx b/src/components/icons/run-a-node/EarthGlyphIcon.tsx deleted file mode 100644 index 46cadee865d..00000000000 --- a/src/components/icons/run-a-node/EarthGlyphIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const EarthGlyphIcon = createIconBase({ - displayName: "EarthGlyphIcon", - viewBox: "0 0 64 64", - className: "h-auto w-[64px]", - children: ( - <> - - - - ), -}) diff --git a/src/components/icons/run-a-node/HardwareGlyphIcon.tsx b/src/components/icons/run-a-node/HardwareGlyphIcon.tsx deleted file mode 100644 index 7778b68813a..00000000000 --- a/src/components/icons/run-a-node/HardwareGlyphIcon.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const HardwareGlyphIcon = createIconBase({ - displayName: "HardwareGlyphIcon", - viewBox: "0 0 49 42", - className: "h-auto w-[49px]", - fillRule: "evenodd", - clipRule: "evenodd", - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/run-a-node/MegaphoneGlyphIcon.tsx b/src/components/icons/run-a-node/MegaphoneGlyphIcon.tsx deleted file mode 100644 index 51f8a0c147f..00000000000 --- a/src/components/icons/run-a-node/MegaphoneGlyphIcon.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const MegaphoneGlyphIcon = createIconBase({ - displayName: "MegaphoneGlyphIcon", - viewBox: "0 0 64 64", - className: "h-auto w-[64px]", - children: ( - <> - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/run-a-node/PrivacyGlyphIcon.tsx b/src/components/icons/run-a-node/PrivacyGlyphIcon.tsx deleted file mode 100644 index 8d8c72d0b55..00000000000 --- a/src/components/icons/run-a-node/PrivacyGlyphIcon.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const PrivacyGlyphIcon = createIconBase({ - displayName: "PrivacyGlyphIcon", - viewBox: "0 0 64 64", - className: "h-auto w-[64px]", - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/run-a-node/SovereigntyGlyphIcon.tsx b/src/components/icons/run-a-node/SovereigntyGlyphIcon.tsx deleted file mode 100644 index 4e5f8a3463a..00000000000 --- a/src/components/icons/run-a-node/SovereigntyGlyphIcon.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const SovereigntyGlyphIcon = createIconBase({ - displayName: "SovereigntyGlyphIcon", - viewBox: "0 0 64 64", - className: "h-auto w-[64px]", - fillRule: "evenodd", - clipRule: "evenodd", - fill: "none", - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/run-a-node/VoteGlyphIcon.tsx b/src/components/icons/run-a-node/VoteGlyphIcon.tsx deleted file mode 100644 index 660ba9045db..00000000000 --- a/src/components/icons/run-a-node/VoteGlyphIcon.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const VoteGlyphIcon = createIconBase({ - displayName: "VoteGlyphIcon", - viewBox: "0 0 64 64", - className: "h-auto w-[64px]", - fill: "none", - fillRule: "evenodd", - clipRule: "evenodd", - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/run-a-node/index.ts b/src/components/icons/run-a-node/index.ts index 80e47b67192..3df85b2452d 100644 --- a/src/components/icons/run-a-node/index.ts +++ b/src/components/icons/run-a-node/index.ts @@ -1,10 +1,21 @@ -export * from "./DappnodeIcon" -export * from "./DecentralizationEthGlyphIcon" -export * from "./DecentralizationGlyphIcon" -export * from "./DownloadGlyphIcon" -export * from "./EarthGlyphIcon" -export * from "./HardwareGlyphIcon" -export * from "./MegaphoneGlyphIcon" -export * from "./PrivacyGlyphIcon" -export * from "./SovereigntyGlyphIcon" -export * from "./VoteGlyphIcon" +import DecentralizationEthGlyphIcon from "./decentralization-eth-glyph.svg" +import DecentralizationGlyphIcon from "./decentralization-glyph.svg" +import DownloadGlyphIcon from "./download-glyph.svg" +import EarthGlyphIcon from "./earth-glyph.svg" +import HardwareGlyphIcon from "./hardware-glyph.svg" +import MegaphoneGlyphIcon from "./megaphone-glyph.svg" +import PrivacyGlyphIcon from "./privacy-glyph.svg" +import SovereigntyGlyphIcon from "./sovereignty-glyph.svg" +import VoteGlyphIcon from "./vote-glyph.svg" + +export { + DecentralizationEthGlyphIcon, + DecentralizationGlyphIcon, + DownloadGlyphIcon, + EarthGlyphIcon, + HardwareGlyphIcon, + MegaphoneGlyphIcon, + PrivacyGlyphIcon, + SovereigntyGlyphIcon, + VoteGlyphIcon, +} diff --git a/src/components/icons/staking/AbyssGlyphIcon.tsx b/src/components/icons/staking/AbyssGlyphIcon.tsx deleted file mode 100644 index d408d354583..00000000000 --- a/src/components/icons/staking/AbyssGlyphIcon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const AbyssGlyphIcon = createIconBase({ - displayName: "AbyssGlyphIcon", - viewBox: "0 0 32 39", - className: "size-[1em]", - children: ( - - ), -}) diff --git a/src/components/icons/staking/AllnodesGlyphIcon.tsx b/src/components/icons/staking/AllnodesGlyphIcon.tsx deleted file mode 100644 index 7e6f1e5b02b..00000000000 --- a/src/components/icons/staking/AllnodesGlyphIcon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const AllnodesGlyphIcon = createIconBase({ - displayName: "AllnodesGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - children: ( - - ), -}) diff --git a/src/components/icons/staking/AnkrGlyphIcon.tsx b/src/components/icons/staking/AnkrGlyphIcon.tsx deleted file mode 100644 index adf6a56018f..00000000000 --- a/src/components/icons/staking/AnkrGlyphIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const AnkrGlyphIcon = createIconBase({ - displayName: "AnkrGlyphIcon", - viewBox: "0 0 30 32", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/AuditedIcon.tsx b/src/components/icons/staking/AuditedIcon.tsx deleted file mode 100644 index b6e415e2c5e..00000000000 --- a/src/components/icons/staking/AuditedIcon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const AuditedIcon = createIconBase({ - displayName: "AuditedIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/staking/AvadoGlyphIcon.tsx b/src/components/icons/staking/AvadoGlyphIcon.tsx deleted file mode 100644 index 01fe69ce004..00000000000 --- a/src/components/icons/staking/AvadoGlyphIcon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const AvadoGlyphIcon = createIconBase({ - displayName: "AvadoGlyphIcon", - viewBox: "0 0 265.7 300", - className: "size-[1em]", - children: ( - - ), -}) diff --git a/src/components/icons/staking/BattleTestedIcon.tsx b/src/components/icons/staking/BattleTestedIcon.tsx deleted file mode 100644 index 98157e10ea2..00000000000 --- a/src/components/icons/staking/BattleTestedIcon.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const BattleTestedIcon = createIconBase({ - displayName: "BattleTestedIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/BedrockGlyphIcon.tsx b/src/components/icons/staking/BedrockGlyphIcon.tsx deleted file mode 100644 index 58d53358dd4..00000000000 --- a/src/components/icons/staking/BedrockGlyphIcon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const BedrockGlyphIcon = createIconBase({ - displayName: "BedrockGlyphIcon", - viewBox: "0 0 33 32", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/BugBountyIcon.tsx b/src/components/icons/staking/BugBountyIcon.tsx deleted file mode 100644 index 1b4aef05846..00000000000 --- a/src/components/icons/staking/BugBountyIcon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const BugBountyIcon = createIconBase({ - displayName: "BugBountyIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/staking/CautionProductGlyphIcon.tsx b/src/components/icons/staking/CautionProductGlyphIcon.tsx deleted file mode 100644 index 01d480effa7..00000000000 --- a/src/components/icons/staking/CautionProductGlyphIcon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const CautionProductGlyphIcon = createIconBase({ - displayName: "CautionProductGlyphIcon", - viewBox: "0 0 24 24", - className: "size-[1em]", - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/staking/ChainLaboGlyphIcon.tsx b/src/components/icons/staking/ChainLaboGlyphIcon.tsx deleted file mode 100644 index d8b2c601bbe..00000000000 --- a/src/components/icons/staking/ChainLaboGlyphIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const ChainLaboGlyphIcon = createIconBase({ - displayName: "ChainLaboGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - children: ( - - ), -}) diff --git a/src/components/icons/staking/ConsensysStakingGlyphIcon.tsx b/src/components/icons/staking/ConsensysStakingGlyphIcon.tsx deleted file mode 100644 index bb02ca46ed6..00000000000 --- a/src/components/icons/staking/ConsensysStakingGlyphIcon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const ConsensysStakingGlyphIcon = createIconBase({ - displayName: "ConsensysStakingGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - children: ( - - ), -}) diff --git a/src/components/icons/staking/DefaultOpenSourceGlyphIcon.tsx b/src/components/icons/staking/DefaultOpenSourceGlyphIcon.tsx deleted file mode 100644 index ff42e0dc526..00000000000 --- a/src/components/icons/staking/DefaultOpenSourceGlyphIcon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const DefaultOpenSourceGlyphIcon = createIconBase({ - displayName: "DefaultOpenSourceGlyphIcon", - viewBox: "0 0 32 32", - fill: "none", - className: "size-[1em]", - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/staking/DockerGlyphIcon.tsx b/src/components/icons/staking/DockerGlyphIcon.tsx deleted file mode 100644 index 1b7bcfbf012..00000000000 --- a/src/components/icons/staking/DockerGlyphIcon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const DockerGlyphIcon = createIconBase({ - displayName: "DockerGlyphIcon", - viewBox: "0 0 66 47", - className: "w-[66px] h-auto", - children: ( - - ), -}) diff --git a/src/components/icons/staking/EconomicalIcon.tsx b/src/components/icons/staking/EconomicalIcon.tsx deleted file mode 100644 index 5b6a28b0b81..00000000000 --- a/src/components/icons/staking/EconomicalIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const EconomicalIcon = createIconBase({ - displayName: "EconomicalIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/EthpoolGlyphIcon.tsx b/src/components/icons/staking/EthpoolGlyphIcon.tsx deleted file mode 100644 index aa2bc204ffc..00000000000 --- a/src/components/icons/staking/EthpoolGlyphIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const EthpoolGlyphIcon = createIconBase({ - displayName: "EthpoolGlyphIcon", - viewBox: "0 0 33 33", - className: "size-[1em]", - children: ( - - ), -}) diff --git a/src/components/icons/staking/EverstakeGlyphIcon.tsx b/src/components/icons/staking/EverstakeGlyphIcon.tsx deleted file mode 100644 index 5793e93d48c..00000000000 --- a/src/components/icons/staking/EverstakeGlyphIcon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const EverstakeGlyphIcon = createIconBase({ - displayName: "EverstakeGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - fill: "currentColor", - children: ( - - ), -}) diff --git a/src/components/icons/staking/FigmentGlyphIcon.tsx b/src/components/icons/staking/FigmentGlyphIcon.tsx deleted file mode 100644 index 1b9a7947480..00000000000 --- a/src/components/icons/staking/FigmentGlyphIcon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const FigmentGlyphIcon = createIconBase({ - displayName: "FigmentGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - fill: "none", - children: ( - <> - - - - ), -}) diff --git a/src/components/icons/staking/GreenCheckProductGlyphIcon.tsx b/src/components/icons/staking/GreenCheckProductGlyphIcon.tsx deleted file mode 100644 index 2ca5b88c794..00000000000 --- a/src/components/icons/staking/GreenCheckProductGlyphIcon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const GreenCheckProductGlyphIcon = createIconBase({ - displayName: "GreenCheckProductGlyphIcon", - viewBox: "0 0 24 24", - className: "size-[1em]", - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/staking/KilnGlyphIcon.tsx b/src/components/icons/staking/KilnGlyphIcon.tsx deleted file mode 100644 index a030d127e17..00000000000 --- a/src/components/icons/staking/KilnGlyphIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const KilnGlyphIcon = createIconBase({ - displayName: "KilnGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - fill: "currentColor", - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/staking/LaunchnodesGlyphIcon.tsx b/src/components/icons/staking/LaunchnodesGlyphIcon.tsx deleted file mode 100644 index 5574fbc69e4..00000000000 --- a/src/components/icons/staking/LaunchnodesGlyphIcon.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const LaunchnodesGlyphIcon = createIconBase({ - displayName: "LaunchnodesGlyphIcon", - viewBox: "0 0 44 44", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/LidoGlyphIcon.tsx b/src/components/icons/staking/LidoGlyphIcon.tsx deleted file mode 100644 index 20a74c347c5..00000000000 --- a/src/components/icons/staking/LidoGlyphIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const LidoGlyphIcon = createIconBase({ - displayName: "LidoGlyphIcon", - viewBox: "0 0 23 32", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/LiquidityTokenIcon.tsx b/src/components/icons/staking/LiquidityTokenIcon.tsx deleted file mode 100644 index f3db00a976f..00000000000 --- a/src/components/icons/staking/LiquidityTokenIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const LiquidityTokenIcon = createIconBase({ - displayName: "LiquidityTokenIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/MultiClientIcon.tsx b/src/components/icons/staking/MultiClientIcon.tsx deleted file mode 100644 index be9b537a0bd..00000000000 --- a/src/components/icons/staking/MultiClientIcon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const MultiClientIcon = createIconBase({ - displayName: "MultiClientIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/OpenSourceStakingIcon.tsx b/src/components/icons/staking/OpenSourceStakingIcon.tsx deleted file mode 100644 index 555be2c5d4a..00000000000 --- a/src/components/icons/staking/OpenSourceStakingIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const OpenSourceStakingIcon = createIconBase({ - displayName: "OpenSourceStakingIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/OriginEtherGlyphIcon.tsx b/src/components/icons/staking/OriginEtherGlyphIcon.tsx deleted file mode 100644 index 9999f206d6c..00000000000 --- a/src/components/icons/staking/OriginEtherGlyphIcon.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const OriginEtherGlyphIcon = createIconBase({ - displayName: "OriginEtherGlyphIcon", - viewBox: "0 0 196 196", - className: "size-[1em] [&_.white]:fill-white dark:[&_.white]:fill-black", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/P2PGlyphIcon.tsx b/src/components/icons/staking/P2PGlyphIcon.tsx deleted file mode 100644 index 70cc0062ab3..00000000000 --- a/src/components/icons/staking/P2PGlyphIcon.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const P2PGlyphIcon = createIconBase({ - displayName: "P2PGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - fill: "currentColor", - children: ( - <> - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/PermissionlessIcon.tsx b/src/components/icons/staking/PermissionlessIcon.tsx deleted file mode 100644 index 4f66e15e9b1..00000000000 --- a/src/components/icons/staking/PermissionlessIcon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const PermissionlessIcon = createIconBase({ - displayName: "PermissionlessIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/RockXGlyphIcon.tsx b/src/components/icons/staking/RockXGlyphIcon.tsx deleted file mode 100644 index 90a09317d69..00000000000 --- a/src/components/icons/staking/RockXGlyphIcon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const RockXGlyphIcon = createIconBase({ - displayName: "RockXGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - ), -}) diff --git a/src/components/icons/staking/RocketPoolGlyphIcon.tsx b/src/components/icons/staking/RocketPoolGlyphIcon.tsx deleted file mode 100644 index 52dfa139fe7..00000000000 --- a/src/components/icons/staking/RocketPoolGlyphIcon.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const RocketPoolGlyphIcon = createIconBase({ - displayName: "RocketPoolGlyphIcon", - viewBox: "0 0 50 50", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/SelfCustodyIcon.tsx b/src/components/icons/staking/SelfCustodyIcon.tsx deleted file mode 100644 index f27bfc762b1..00000000000 --- a/src/components/icons/staking/SelfCustodyIcon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const SelfCustodyIcon = createIconBase({ - displayName: "SelfCustodyIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/staking/SenseiNodeGlyphIcon.tsx b/src/components/icons/staking/SenseiNodeGlyphIcon.tsx deleted file mode 100644 index be516a165ac..00000000000 --- a/src/components/icons/staking/SenseiNodeGlyphIcon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const SenseiNodeGlyphIcon = createIconBase({ - displayName: "SenseiNodeGlyphIcon", - viewBox: "0 0 23 32", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/staking/SquidGlyphIcon.tsx b/src/components/icons/staking/SquidGlyphIcon.tsx deleted file mode 100644 index d14337453f7..00000000000 --- a/src/components/icons/staking/SquidGlyphIcon.tsx +++ /dev/null @@ -1,220 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const SquidGlyphIcon = createIconBase({ - displayName: "SquidGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/StafiGlyphIcon.tsx b/src/components/icons/staking/StafiGlyphIcon.tsx deleted file mode 100644 index 76d520d0563..00000000000 --- a/src/components/icons/staking/StafiGlyphIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const StafiGlyphIcon = createIconBase({ - displayName: "StafiGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/StakefishGlyphIcon.tsx b/src/components/icons/staking/StakefishGlyphIcon.tsx deleted file mode 100644 index acdb7e5e61b..00000000000 --- a/src/components/icons/staking/StakefishGlyphIcon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const StakefishGlyphIcon = createIconBase({ - displayName: "StakefishGlyphIcon", - viewBox: "0 0 40 24", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/staking/StakewiseGlyphIcon.tsx b/src/components/icons/staking/StakewiseGlyphIcon.tsx deleted file mode 100644 index 020579f9850..00000000000 --- a/src/components/icons/staking/StakewiseGlyphIcon.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const StakewiseGlyphIcon = createIconBase({ - displayName: "StakewiseGlyphIcon", - viewBox: "0 0 32 38", - className: "size-[1em]", - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/StakingDappnodeGlyphIcon.tsx b/src/components/icons/staking/StakingDappnodeGlyphIcon.tsx deleted file mode 100644 index 39d16e1acd6..00000000000 --- a/src/components/icons/staking/StakingDappnodeGlyphIcon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const StakingDappnodeGlyphIcon = createIconBase({ - displayName: "StakingDappnodeGlyphIcon", - viewBox: "0 0 148 160", - className: "size-[1em]", - fillRule: "evenodd", - children: ( - - ), -}) diff --git a/src/components/icons/staking/StakingGlyphCPUIcon.tsx b/src/components/icons/staking/StakingGlyphCPUIcon.tsx deleted file mode 100644 index c29a1440897..00000000000 --- a/src/components/icons/staking/StakingGlyphCPUIcon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const StakingGlyphCPUIcon = createIconBase({ - displayName: "StakingGlyphCPUIcon", - viewBox: "0 0 50 50", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/StakingGlyphCentralizedIcon.tsx b/src/components/icons/staking/StakingGlyphCentralizedIcon.tsx deleted file mode 100644 index 0f0a81832af..00000000000 --- a/src/components/icons/staking/StakingGlyphCentralizedIcon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const StakingGlyphCentralizedIcon = createIconBase({ - displayName: "StakingGlyphCentralizedIcon", - viewBox: "0 0 51 51", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/StakingGlyphCloudIcon.tsx b/src/components/icons/staking/StakingGlyphCloudIcon.tsx deleted file mode 100644 index 8d7e35f0935..00000000000 --- a/src/components/icons/staking/StakingGlyphCloudIcon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const StakingGlyphCloudIcon = createIconBase({ - displayName: "StakingGlyphCloudIcon", - viewBox: "0 0 50 28", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/StakingGlyphEtherCircleIcon.tsx b/src/components/icons/staking/StakingGlyphEtherCircleIcon.tsx deleted file mode 100644 index ac3752cf4e6..00000000000 --- a/src/components/icons/staking/StakingGlyphEtherCircleIcon.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const StakingGlyphEtherCircleIcon = createIconBase({ - displayName: "StakingGlyphEtherCircleIcon", - viewBox: "0 0 32 32", - ...commonIconDefaultAttrs, - children: ( - <> - - - - ), -}) diff --git a/src/components/icons/staking/StakingGlyphTokenWalletIcon.tsx b/src/components/icons/staking/StakingGlyphTokenWalletIcon.tsx deleted file mode 100644 index f6580401fb3..00000000000 --- a/src/components/icons/staking/StakingGlyphTokenWalletIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const StakingGlyphTokenWalletIcon = createIconBase({ - displayName: "StakingGlyphTokenWalletIcon", - viewBox: "0 0 50 39", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - ), -}) diff --git a/src/components/icons/staking/StereumGlyphIcon.tsx b/src/components/icons/staking/StereumGlyphIcon.tsx deleted file mode 100644 index 273b64ffeef..00000000000 --- a/src/components/icons/staking/StereumGlyphIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const StereumGlyphIcon = createIconBase({ - displayName: "StereumGlyphIcon", - viewBox: "0 0 32 32", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/staking/TrustlessIcon.tsx b/src/components/icons/staking/TrustlessIcon.tsx deleted file mode 100644 index de09c184608..00000000000 --- a/src/components/icons/staking/TrustlessIcon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { commonIconDefaultAttrs } from "@/components/icons/utils" - -import { createIconBase } from "../icon-base" - -export const TrustlessIcon = createIconBase({ - displayName: "TrustlessIcon", - viewBox: "0 0 72 72", - className: "size-[1em]", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/staking/UnknownProductGlyphIcon.tsx b/src/components/icons/staking/UnknownProductGlyphIcon.tsx deleted file mode 100644 index a07b98b3270..00000000000 --- a/src/components/icons/staking/UnknownProductGlyphIcon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const UnknownProductGlyphIcon = createIconBase({ - displayName: "UnknownProductGlyphIcon", - viewBox: "0 0 24 24", - className: "size-[1em]", - children: ( - <> - - - - - - ), -}) diff --git a/src/components/icons/staking/WagyuGlyphIcon.tsx b/src/components/icons/staking/WagyuGlyphIcon.tsx deleted file mode 100644 index aafa9447e26..00000000000 --- a/src/components/icons/staking/WagyuGlyphIcon.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const WagyuGlyphIcon = createIconBase({ - displayName: "WagyuGlyphIcon", - viewBox: "0 0 28 32", - className: "size-[1em]", - fill: "currentColor", - children: ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/staking/WarningProductGlyphIcon.tsx b/src/components/icons/staking/WarningProductGlyphIcon.tsx deleted file mode 100644 index 5b2d738f726..00000000000 --- a/src/components/icons/staking/WarningProductGlyphIcon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const WarningProductGlyphIcon = createIconBase({ - displayName: "WarningProductGlyphIcon", - viewBox: "0 0 24 24", - className: "size-[1em]", - children: ( - <> - - - - ), -}) diff --git a/src/components/icons/staking/index.ts b/src/components/icons/staking/index.ts index 0b92df2a245..428cb0583ab 100644 --- a/src/components/icons/staking/index.ts +++ b/src/components/icons/staking/index.ts @@ -1,46 +1,95 @@ -export * from "./AbyssGlyphIcon" -export * from "./AllnodesGlyphIcon" -export * from "./AnkrGlyphIcon" -export * from "./AuditedIcon" -export * from "./AvadoGlyphIcon" -export * from "./BattleTestedIcon" -export * from "./BedrockGlyphIcon" -export * from "./BugBountyIcon" -export * from "./CautionProductGlyphIcon" -export * from "./ChainLaboGlyphIcon" -export * from "./ConsensysStakingGlyphIcon" -export * from "./DefaultOpenSourceGlyphIcon" -export * from "./DockerGlyphIcon" -export * from "./EconomicalIcon" -export * from "./EthpoolGlyphIcon" -export * from "./EverstakeGlyphIcon" -export * from "./FigmentGlyphIcon" -export * from "./GreenCheckProductGlyphIcon" -export * from "./KilnGlyphIcon" -export * from "./LaunchnodesGlyphIcon" -export * from "./LidoGlyphIcon" -export * from "./LiquidityTokenIcon" -export * from "./MultiClientIcon" -export * from "./OpenSourceStakingIcon" -export * from "./OriginEtherGlyphIcon" -export * from "./P2PGlyphIcon" -export * from "./PermissionlessIcon" -export * from "./RocketPoolGlyphIcon" -export * from "./RockXGlyphIcon" -export * from "./SelfCustodyIcon" -export * from "./SenseiNodeGlyphIcon" -export * from "./SquidGlyphIcon" -export * from "./StafiGlyphIcon" -export * from "./StakefishGlyphIcon" -export * from "./StakewiseGlyphIcon" -export * from "./StakingDappnodeGlyphIcon" -export * from "./StakingGlyphCentralizedIcon" -export * from "./StakingGlyphCloudIcon" -export * from "./StakingGlyphCPUIcon" -export * from "./StakingGlyphEtherCircleIcon" -export * from "./StakingGlyphTokenWalletIcon" -export * from "./StereumGlyphIcon" -export * from "./TrustlessIcon" -export * from "./UnknownProductGlyphIcon" -export * from "./WagyuGlyphIcon" -export * from "./WarningProductGlyphIcon" +import AbyssGlyphIcon from "./abyss-glyph.svg" +import AllnodesGlyphIcon from "./allnodes-glyph.svg" +import AnkrGlyphIcon from "./ankr-glyph.svg" +import AuditedIcon from "./audited.svg" +import AvadoGlyphIcon from "./avado-glyph.svg" +import BattleTestedIcon from "./battle-tested.svg" +import BedrockGlyphIcon from "./bedrock-glyph.svg" +import BugBountyIcon from "./bug-bounty.svg" +import CautionProductGlyph from "./caution-product-glyph.svg" +import ChainLaboGlyphIcon from "./chain-labo-glyph.svg" +import ConsensysStakingGlyphIcon from "./consensys-staking-glyph.svg" +import DefaultOpenSourceGlyphIcon from "./default-open-source-glyph.svg" +import DockerGlyphIcon from "./docker-glyph.svg" +import EconomicalIcon from "./economical.svg" +import EthpoolGlyphIcon from "./ethpool-glyph.svg" +import EverstakeGlyphIcon from "./everstake-glyph.svg" +import FigmentGlyphIcon from "./figment-glyph.svg" +import GreenCheckProductGlyph from "./green-check-product-glyph.svg" +import KilnGlyphIcon from "./kiln-glyph.svg" +import LaunchnodesGlyphIcon from "./launchnodes-glyph.svg" +import LidoGlyphIcon from "./lido-glyph.svg" +import LiquidityTokenIcon from "./liquidity-token.svg" +import MultiClientIcon from "./multi-client.svg" +import OpenSourceStakingIcon from "./open-source-staking.svg" +import OriginEtherGlyphIcon from "./origin-ether-glyph.svg" +import P2pGlyphIcon from "./p2p-glyph.svg" +import PermissionlessIcon from "./permissionless.svg" +import RockXGlyphIcon from "./rock-x-glyph.svg" +import RocketPoolGlyphIcon from "./rocket-pool-glyph.svg" +import SelfCustodyIcon from "./self-custody.svg" +import SenseiNodeGlyphIcon from "./sensei-node-glyph.svg" +import SquidGlyphIcon from "./squid-glyph.svg" +import StafiGlyphIcon from "./stafi-glyph.svg" +import StakefishGlyphIcon from "./stakefish-glyph.svg" +import StakewiseGlyphIcon from "./stakewise-glyph.svg" +import StakingDappnodeGlyphIcon from "./staking-dappnode-glyph.svg" +import StakingGlyphCentralizedIcon from "./staking-glyph-centralized.svg" +import StakingGlyphCloudIcon from "./staking-glyph-cloud.svg" +import StakingGlyphCPUIcon from "./staking-glyph-cpu.svg" +import StakingGlyphEtherCircleIcon from "./staking-glyph-ether-circle.svg" +import StakingGlyphTokenWalletIcon from "./staking-glyph-token-wallet.svg" +import StereumGlyphIcon from "./stereum-glyph.svg" +import TrustlessIcon from "./trustless.svg" +import UnknownProductGlyph from "./unknown-product-glyph.svg" +import WagyuGlyphIcon from "./wagyu-glyph.svg" +import WarningProductGlyph from "./warning-product-glyph.svg" + +export { + AbyssGlyphIcon, + AllnodesGlyphIcon, + AnkrGlyphIcon, + AuditedIcon, + AvadoGlyphIcon, + BattleTestedIcon, + BedrockGlyphIcon, + BugBountyIcon, + CautionProductGlyph, + ChainLaboGlyphIcon, + ConsensysStakingGlyphIcon, + DefaultOpenSourceGlyphIcon, + DockerGlyphIcon, + EconomicalIcon, + EthpoolGlyphIcon, + EverstakeGlyphIcon, + FigmentGlyphIcon, + GreenCheckProductGlyph, + KilnGlyphIcon, + LaunchnodesGlyphIcon, + LidoGlyphIcon, + LiquidityTokenIcon, + MultiClientIcon, + OpenSourceStakingIcon, + OriginEtherGlyphIcon, + P2pGlyphIcon, + PermissionlessIcon, + RocketPoolGlyphIcon, + RockXGlyphIcon, + SelfCustodyIcon, + SenseiNodeGlyphIcon, + SquidGlyphIcon, + StafiGlyphIcon, + StakefishGlyphIcon, + StakewiseGlyphIcon, + StakingDappnodeGlyphIcon, + StakingGlyphCentralizedIcon, + StakingGlyphCloudIcon, + StakingGlyphCPUIcon, + StakingGlyphEtherCircleIcon, + StakingGlyphTokenWalletIcon, + StereumGlyphIcon, + TrustlessIcon, + UnknownProductGlyph, + WagyuGlyphIcon, + WarningProductGlyph, +} diff --git a/src/components/icons/wallets/BrowserIcon.tsx b/src/components/icons/wallets/BrowserIcon.tsx deleted file mode 100644 index 05c4157cac4..00000000000 --- a/src/components/icons/wallets/BrowserIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const BrowserIcon = createIconBase({ - displayName: "BrowserIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/wallets/BuyCryptoIcon.tsx b/src/components/icons/wallets/BuyCryptoIcon.tsx deleted file mode 100644 index 44afa1742f1..00000000000 --- a/src/components/icons/wallets/BuyCryptoIcon.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const BuyCryptoIcon = createIconBase({ - displayName: "BuyCryptoIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/wallets/ConnectDappsIcon.tsx b/src/components/icons/wallets/ConnectDappsIcon.tsx deleted file mode 100644 index 4fb39302a14..00000000000 --- a/src/components/icons/wallets/ConnectDappsIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const ConnectDappsIcon = createIconBase({ - displayName: "ConnectDappsIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/wallets/DesktopIcon.tsx b/src/components/icons/wallets/DesktopIcon.tsx deleted file mode 100644 index c6e472accd6..00000000000 --- a/src/components/icons/wallets/DesktopIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const DesktopIcon = createIconBase({ - displayName: "DesktopIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/wallets/DevicesIcon.tsx b/src/components/icons/wallets/DevicesIcon.tsx deleted file mode 100644 index b5268774d4d..00000000000 --- a/src/components/icons/wallets/DevicesIcon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const DevicesIcon = createIconBase({ - displayName: "DevicesIcon", - viewBox: "0 0 24 25", - className: "w-[24px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - ), -}) diff --git a/src/components/icons/wallets/ENSSupportIcon.tsx b/src/components/icons/wallets/ENSSupportIcon.tsx deleted file mode 100644 index 392260f4deb..00000000000 --- a/src/components/icons/wallets/ENSSupportIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const ENSSupportIcon = createIconBase({ - displayName: "ENSSupportIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/wallets/ERC20SupportIcon.tsx b/src/components/icons/wallets/ERC20SupportIcon.tsx deleted file mode 100644 index 683ae9ea762..00000000000 --- a/src/components/icons/wallets/ERC20SupportIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const ERC20SupportIcon = createIconBase({ - displayName: "ERC20SupportIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/wallets/FilterBurgerIcon.tsx b/src/components/icons/wallets/FilterBurgerIcon.tsx deleted file mode 100644 index fc8124aec3e..00000000000 --- a/src/components/icons/wallets/FilterBurgerIcon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { createIconBase } from "../icon-base" - -export const FilterBurgerIcon = createIconBase({ - displayName: "FilterBurgerIcon", - viewBox: "0 0 24 24", - className: "size-6 stroke-body", - fill: "none", - children: ( - <> - - - - ), -}) diff --git a/src/components/icons/wallets/GasFeeCustomizationIcon.tsx b/src/components/icons/wallets/GasFeeCustomizationIcon.tsx deleted file mode 100644 index 4d4454bc733..00000000000 --- a/src/components/icons/wallets/GasFeeCustomizationIcon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const GasFeeCustomizationIcon = createIconBase({ - displayName: "GasFeeCustomizationIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - ), -}) diff --git a/src/components/icons/wallets/HardwareIcon.tsx b/src/components/icons/wallets/HardwareIcon.tsx deleted file mode 100644 index 762171dce0f..00000000000 --- a/src/components/icons/wallets/HardwareIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const HardwareIcon = createIconBase({ - displayName: "HardwareIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/wallets/HardwareSupportIcon.tsx b/src/components/icons/wallets/HardwareSupportIcon.tsx deleted file mode 100644 index b25c0f9d2a7..00000000000 --- a/src/components/icons/wallets/HardwareSupportIcon.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const HardwareSupportIcon = createIconBase({ - displayName: "HardwareSupportIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/wallets/LanguagesIcon.tsx b/src/components/icons/wallets/LanguagesIcon.tsx deleted file mode 100644 index 1d5cdefbe99..00000000000 --- a/src/components/icons/wallets/LanguagesIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const LanguagesIcon = createIconBase({ - displayName: "LanguagesIcon", - viewBox: "0 0 24 25", - className: "w-[24px] h-auto", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/wallets/Layer2Icon.tsx b/src/components/icons/wallets/Layer2Icon.tsx deleted file mode 100644 index 768bcc782de..00000000000 --- a/src/components/icons/wallets/Layer2Icon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const Layer2Icon = createIconBase({ - displayName: "Layer2Icon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - , - - , - - , - - - ), -}) diff --git a/src/components/icons/wallets/MobileIcon.tsx b/src/components/icons/wallets/MobileIcon.tsx deleted file mode 100644 index 467eb82f330..00000000000 --- a/src/components/icons/wallets/MobileIcon.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const MobileIcon = createIconBase({ - displayName: "MobileIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - , - - , - - - ), -}) diff --git a/src/components/icons/wallets/MultisigIcon.tsx b/src/components/icons/wallets/MultisigIcon.tsx deleted file mode 100644 index 7938d7e63e1..00000000000 --- a/src/components/icons/wallets/MultisigIcon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const MultisigIcon = createIconBase({ - displayName: "MultisigIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - ), -}) diff --git a/src/components/icons/wallets/NFTSupportIcon.tsx b/src/components/icons/wallets/NFTSupportIcon.tsx deleted file mode 100644 index 2284beb5699..00000000000 --- a/src/components/icons/wallets/NFTSupportIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const NFTSupportIcon = createIconBase({ - displayName: "NFTSupportIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/wallets/NonCustodialIcon.tsx b/src/components/icons/wallets/NonCustodialIcon.tsx deleted file mode 100644 index 25cd5fdee9b..00000000000 --- a/src/components/icons/wallets/NonCustodialIcon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const NonCustodialIcon = createIconBase({ - displayName: "NonCustodialIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - - - ), -}) diff --git a/src/components/icons/wallets/OpenSourceWalletIcon.tsx b/src/components/icons/wallets/OpenSourceWalletIcon.tsx deleted file mode 100644 index 8c9d1d6bb78..00000000000 --- a/src/components/icons/wallets/OpenSourceWalletIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const OpenSourceWalletIcon = createIconBase({ - displayName: "OpenSourceWalletIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - - ), -}) diff --git a/src/components/icons/wallets/RPCImportingIcon.tsx b/src/components/icons/wallets/RPCImportingIcon.tsx deleted file mode 100644 index 9f7e0e5ebbe..00000000000 --- a/src/components/icons/wallets/RPCImportingIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const RPCImportingIcon = createIconBase({ - displayName: "RPCImportingIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - ), -}) diff --git a/src/components/icons/wallets/SocialRecoverIcon.tsx b/src/components/icons/wallets/SocialRecoverIcon.tsx deleted file mode 100644 index 8a271074276..00000000000 --- a/src/components/icons/wallets/SocialRecoverIcon.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const SocialRecoverIcon = createIconBase({ - displayName: "SocialRecoverIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/wallets/StakingIcon.tsx b/src/components/icons/wallets/StakingIcon.tsx deleted file mode 100644 index 7e7934720e7..00000000000 --- a/src/components/icons/wallets/StakingIcon.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const StakingIcon = createIconBase({ - displayName: "StakingIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/wallets/SwapIcon.tsx b/src/components/icons/wallets/SwapIcon.tsx deleted file mode 100644 index 295d528b62a..00000000000 --- a/src/components/icons/wallets/SwapIcon.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const SwapIcon = createIconBase({ - displayName: "SwapIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - - - - - - - - - ), -}) diff --git a/src/components/icons/wallets/WithdrawCryptoIcon.tsx b/src/components/icons/wallets/WithdrawCryptoIcon.tsx deleted file mode 100644 index 1642bcd0a42..00000000000 --- a/src/components/icons/wallets/WithdrawCryptoIcon.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { createIconBase } from "../icon-base" -import { commonIconDefaultAttrs } from "../utils" - -export const WithdrawCryptoIcon = createIconBase({ - displayName: "WithdrawCryptoIcon", - viewBox: "0 0 256 256", - className: "w-[256px] h-auto", - ...commonIconDefaultAttrs, - children: ( - <> - - - - - - - ), -}) diff --git a/src/components/icons/wallets/index.ts b/src/components/icons/wallets/index.ts index b47a53c7a38..0f02bb18204 100644 --- a/src/components/icons/wallets/index.ts +++ b/src/components/icons/wallets/index.ts @@ -1,26 +1,26 @@ -import { BrowserIcon } from "./BrowserIcon" -import { BuyCryptoIcon } from "./BuyCryptoIcon" -import { ConnectDappsIcon } from "./ConnectDappsIcon" -import { DesktopIcon } from "./DesktopIcon" -import { DevicesIcon } from "./DevicesIcon" -import { ENSSupportIcon } from "./ENSSupportIcon" -import { ERC20SupportIcon } from "./ERC20SupportIcon" -import { FilterBurgerIcon } from "./FilterBurgerIcon" -import { GasFeeCustomizationIcon } from "./GasFeeCustomizationIcon" -import { HardwareIcon } from "./HardwareIcon" -import { HardwareSupportIcon } from "./HardwareSupportIcon" -import { LanguagesIcon } from "./LanguagesIcon" -import { Layer2Icon } from "./Layer2Icon" -import { MobileIcon } from "./MobileIcon" -import { MultisigIcon } from "./MultisigIcon" -import { NFTSupportIcon } from "./NFTSupportIcon" -import { NonCustodialIcon } from "./NonCustodialIcon" -import { OpenSourceWalletIcon } from "./OpenSourceWalletIcon" -import { RPCImportingIcon } from "./RPCImportingIcon" -import { SocialRecoverIcon } from "./SocialRecoverIcon" -import { StakingIcon } from "./StakingIcon" -import { SwapIcon } from "./SwapIcon" -import { WithdrawCryptoIcon } from "./WithdrawCryptoIcon" +import BrowserIcon from "./browser.svg" +import BuyCryptoIcon from "./buy-crypto.svg" +import ConnectDappsIcon from "./connect-dapps.svg" +import DesktopIcon from "./desktop.svg" +import DevicesIcon from "./devices.svg" +import ENSSupportIcon from "./ens-support.svg" +import ERC20SupportIcon from "./erc20-support.svg" +import FilterBurgerIcon from "./filter-burger.svg" +import GasFeeCustomizationIcon from "./gas-fee-customization.svg" +import HardwareIcon from "./hardware.svg" +import HardwareSupportIcon from "./hardware-support.svg" +import LanguagesIcon from "./languages.svg" +import Layer2Icon from "./layer2.svg" +import MobileIcon from "./mobile.svg" +import MultisigIcon from "./multisig.svg" +import NFTSupportIcon from "./nft-support.svg" +import NonCustodialIcon from "./non-custodial.svg" +import OpenSourceWalletIcon from "./open-source-wallet.svg" +import RPCImportingIcon from "./rpc-importing.svg" +import SocialRecoverIcon from "./social-recover.svg" +import StakingIcon from "./staking.svg" +import SwapIcon from "./swap.svg" +import WithdrawCryptoIcon from "./withdraw-crypto.svg" export { BrowserIcon, From 72c96292d3bd6e95fad49693c24fd3ea3e4e1a92 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 17 Jun 2025 20:25:08 -0700 Subject: [PATCH 152/368] fix: import casing --- src/components/icons/layer-2/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/icons/layer-2/index.ts b/src/components/icons/layer-2/index.ts index 53ff6d41aee..abf0bedb1bf 100644 --- a/src/components/icons/layer-2/index.ts +++ b/src/components/icons/layer-2/index.ts @@ -1,6 +1,6 @@ import DevelopingIcon from "./developing.svg" import EmergingIcon from "./emerging.svg" import MaturingIcon from "./maturing.svg" -import RobustIcon from "./Robust.svg" +import RobustIcon from "./robust.svg" export { DevelopingIcon, EmergingIcon, MaturingIcon, RobustIcon } From ff21d93c71f91934f36f104e0f5dd82ca33acfce Mon Sep 17 00:00:00 2001 From: Pablo Date: Wed, 18 Jun 2025 10:20:58 +0200 Subject: [PATCH 153/368] refactor tests --- tests/e2e/global.spec.ts | 20 ++++---------------- tests/e2e/home.spec.ts | 1 - tests/e2e/pages/BasePage.ts | 21 +++++++++++++++++++++ tests/e2e/pages/HomePage.ts | 9 ++------- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/tests/e2e/global.spec.ts b/tests/e2e/global.spec.ts index 53f344e282e..5ff6b6a66af 100644 --- a/tests/e2e/global.spec.ts +++ b/tests/e2e/global.spec.ts @@ -15,7 +15,7 @@ test.describe("Global", () => { // Try invalid search queries await homePage.search(testData.search.invalidQuery) - // Should not crash or show errors, has to show no results + // Should not crash or show errors, has to show the no results message await page.waitForTimeout(1000) // Allow search to process await homePage.verifyNoResults() @@ -65,21 +65,9 @@ test.describe("Global", () => { ).toBeVisible() } - test("switches to Chinese (desktop)", async ({ page }) => { - const isMobile = await homePage.isMobileViewport() - test.skip(isMobile, "This test is for desktop viewports only") - - await expect(page).toHaveURL(`/${DEFAULT_LOCALE}/`) - await homePage.openLanguagePickerDesktop() - await switchToChinese(page, homePage) - }) - - test("switches to Chinese (mobile)", async ({ page }) => { - const isMobile = await homePage.isMobileViewport() - test.skip(!isMobile, "This test is for mobile viewports only") - + test("switches to Chinese", async ({ page }) => { await expect(page).toHaveURL(`/${DEFAULT_LOCALE}/`) - await homePage.openLanguagePickerMobile() + await homePage.openLanguagePicker() await switchToChinese(page, homePage) }) }) @@ -113,7 +101,7 @@ test.describe("Global", () => { await homePage.assertUrlMatches(`/${DEFAULT_LOCALE}/`) - await homePage.openLanguagePickerDesktop() + await homePage.openLanguagePicker() await switchToArabic(page, homePage) await homePage.assertUrlMatches(/\/ar(\/|$)/) diff --git a/tests/e2e/home.spec.ts b/tests/e2e/home.spec.ts index 5c481523f75..938b620b2eb 100644 --- a/tests/e2e/home.spec.ts +++ b/tests/e2e/home.spec.ts @@ -25,7 +25,6 @@ test.describe("Home Page", () => { }) test("main navigation - desktop", async () => { - // Only run this test for desktop projects const isMobile = await homePage.isMobileViewport() test.skip(isMobile, "This test is for desktop viewports only") diff --git a/tests/e2e/pages/BasePage.ts b/tests/e2e/pages/BasePage.ts index e0434b50c1b..595c2463a57 100644 --- a/tests/e2e/pages/BasePage.ts +++ b/tests/e2e/pages/BasePage.ts @@ -128,6 +128,27 @@ export class BasePage { await this.mobileSidebar.getByRole("button", { name: /languages/i }).click() } + /** + * Open language picker + */ + async openLanguagePicker(): Promise { + const isMobile = await this.isMobileViewport() + if (isMobile) { + await this.openLanguagePickerMobile() + } else { + await this.openLanguagePickerDesktop() + } + } + + async getSearchButton(): Promise { + const isMobile = await this.isMobileViewport() + if (isMobile) { + return this.searchButtonMobile + } else { + return this.searchInputButton + } + } + /** * Switch to a specific language */ diff --git a/tests/e2e/pages/HomePage.ts b/tests/e2e/pages/HomePage.ts index 1f762b77354..6cea877f1f3 100644 --- a/tests/e2e/pages/HomePage.ts +++ b/tests/e2e/pages/HomePage.ts @@ -32,13 +32,8 @@ export class HomePage extends BasePage { * Perform a search action */ async search(query: string) { - const isMobile = await this.isMobileViewport() - - if (isMobile) { - await this.searchButtonMobile.first().click() - } else { - await this.searchInputButton.first().click() - } + const searchBtn = await this.getSearchButton() + await searchBtn.click() await this.searchInput.fill(query) } From a32112c4c3da858823567a70e00903afe1264959 Mon Sep 17 00:00:00 2001 From: Pablo Date: Wed, 18 Jun 2025 20:29:14 +0200 Subject: [PATCH 154/368] fix --- tests/e2e/global.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/global.spec.ts b/tests/e2e/global.spec.ts index 5ff6b6a66af..d58c5ac7d92 100644 --- a/tests/e2e/global.spec.ts +++ b/tests/e2e/global.spec.ts @@ -107,7 +107,7 @@ test.describe("Global", () => { await homePage.assertUrlMatches(/\/ar(\/|$)/) const logo = page.getByTestId("nav-logo") - const searchBtn = page.getByTestId("search-input-button") + const searchBtn = await homePage.getSearchButton() const logoBox = await logo.boundingBox() const searchBox = await searchBtn.boundingBox() expect(logoBox).not.toBeNull() From b3ccb7fd1ce5197555eabdc4596389cc9b48e8da Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 19 Jun 2025 07:07:49 -0700 Subject: [PATCH 155/368] build: pnpm add -D dotenv --- package.json | 1 + pnpm-lock.yaml | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/package.json b/package.json index df3049c3c41..51f3240ed79 100644 --- a/package.json +++ b/package.json @@ -121,6 +121,7 @@ "autoprefixer": "^10.4.19", "chromatic": "10.9.6", "decompress": "^4.2.1", + "dotenv": "^16.5.0", "eslint": "^8.57.1", "eslint-config-next": "^14.2.2", "eslint-config-prettier": "^9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7205a9c0c24..b924fae548e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -291,6 +291,9 @@ importers: decompress: specifier: ^4.2.1 version: 4.2.1 + dotenv: + specifier: ^16.5.0 + version: 16.5.0 eslint: specifier: ^8.57.1 version: 8.57.1 @@ -4322,6 +4325,10 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -13336,6 +13343,8 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dotenv@16.5.0: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 From c74f51bfd2adf662fb08080d52773bcdc5543605 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 19 Jun 2025 07:08:16 -0700 Subject: [PATCH 156/368] build: bump corepack pnpm 10.12.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 51f3240ed79..b7d6f980f15 100644 --- a/package.json +++ b/package.json @@ -151,5 +151,5 @@ "unist-util-visit": "^5.0.0", "xml2js": "^0.6.2" }, - "packageManager": "pnpm@10.11.1+sha512.e519b9f7639869dc8d5c3c5dfef73b3f091094b0a006d7317353c72b124e80e1afd429732e28705ad6bfa1ee879c1fce46c128ccebd3192101f43dd67c667912" + "packageManager": "pnpm@10.12.1+sha512.f0dda8580f0ee9481c5c79a1d927b9164f2c478e90992ad268bbb2465a736984391d6333d2c327913578b2804af33474ca554ba29c04a8b13060a717675ae3ac" } From 9da95271d2812208d8c70757e122ee85cf62b001 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 19 Jun 2025 14:06:12 -0700 Subject: [PATCH 157/368] patch: homepage and nav icon adjustments --- app/[locale]/resources/page.tsx | 4 ++-- src/components/BigNumber/index.tsx | 2 +- src/components/Nav/useNav.ts | 4 ++-- src/components/icons/sliders-horizontal-circles.svg | 3 +++ 4 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 src/components/icons/sliders-horizontal-circles.svg diff --git a/app/[locale]/resources/page.tsx b/app/[locale]/resources/page.tsx index 379dadccd19..588b7efb55c 100644 --- a/app/[locale]/resources/page.tsx +++ b/app/[locale]/resources/page.tsx @@ -1,10 +1,10 @@ import { getTranslations } from "next-intl/server" -import { FaGithub } from "react-icons/fa6" import { Lang } from "@/lib/types" import BannerNotification from "@/components/Banners/BannerNotification" import { HubHero } from "@/components/Hero" +import Github from "@/components/icons/github.svg" import StackIcon from "@/components/icons/stack.svg" import MainArticle from "@/components/MainArticle" import Translation from "@/components/Translation" @@ -187,7 +187,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { eventName: "Ethereum.org Github Bug Report", }} > - {t("page-resources-found-bug")} + {t("page-resources-found-bug")} diff --git a/src/components/BigNumber/index.tsx b/src/components/BigNumber/index.tsx index 44b57708b86..f5a038073d5 100644 --- a/src/components/BigNumber/index.tsx +++ b/src/components/BigNumber/index.tsx @@ -66,7 +66,7 @@ const BigNumber = async ({ } > diff --git a/src/components/Nav/useNav.ts b/src/components/Nav/useNav.ts index f6e5e63d917..ac0a0c4054e 100644 --- a/src/components/Nav/useNav.ts +++ b/src/components/Nav/useNav.ts @@ -1,4 +1,3 @@ -import { Sliders } from "lucide-react" import { useTheme } from "next-themes" import BookIcon from "@/components/icons/book.svg" @@ -16,6 +15,7 @@ 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" @@ -75,7 +75,7 @@ export const useNav = () => { { label: t("nav-advanced-label"), description: t("nav-advanced-description"), - icon: Sliders, + icon: SlidersHorizontalCircles, items: [ { label: t("nav-gas-fees-label"), diff --git a/src/components/icons/sliders-horizontal-circles.svg b/src/components/icons/sliders-horizontal-circles.svg new file mode 100644 index 00000000000..0883afa04f1 --- /dev/null +++ b/src/components/icons/sliders-horizontal-circles.svg @@ -0,0 +1,3 @@ + + + From 68c43e1ab4849b0498b171271c106a49b0df8522 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 19 Jun 2025 14:47:16 -0700 Subject: [PATCH 158/368] patch: learn/quizzes/sim icons sizing --- src/components/DocLink/index.tsx | 2 +- src/components/Quiz/QuizWidget/AnswerIcon.tsx | 2 +- src/components/Quiz/QuizzesStats.tsx | 2 +- src/components/Simulator/PathButton.tsx | 2 +- src/components/Simulator/icons/connect-web3.svg | 5 +++-- src/components/Simulator/icons/create-account.svg | 7 +++++-- src/components/Simulator/icons/send-receive.svg | 7 +++++-- src/components/icons/quiz/trophy.svg | 5 +++-- 8 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/components/DocLink/index.tsx b/src/components/DocLink/index.tsx index b00fef3853d..38be9a4192d 100644 --- a/src/components/DocLink/index.tsx +++ b/src/components/DocLink/index.tsx @@ -43,7 +43,7 @@ const DocLink = ({ href, children, isExternal = false }: DocLinkProps) => { { - const commonIconClasses = "fill-background" + const commonIconClasses = "text-[28px] text-background" const IconWrapper = (props: ChildOnlyProp) => { const getWrapperBg = () => { diff --git a/src/components/Quiz/QuizzesStats.tsx b/src/components/Quiz/QuizzesStats.tsx index 69cee364591..4f3d6c24af9 100644 --- a/src/components/Quiz/QuizzesStats.tsx +++ b/src/components/Quiz/QuizzesStats.tsx @@ -94,7 +94,7 @@ const QuizzesStats = ({
    - +
    {totalCorrectAnswers} diff --git a/src/components/Simulator/PathButton.tsx b/src/components/Simulator/PathButton.tsx index 83ed90958d8..c22ae636e04 100644 --- a/src/components/Simulator/PathButton.tsx +++ b/src/components/Simulator/PathButton.tsx @@ -17,7 +17,7 @@ export const PathButton = ({ pathSummary, handleClick }: PathButtonProps) => { onClick={handleClick} > - + diff --git a/src/components/Simulator/icons/connect-web3.svg b/src/components/Simulator/icons/connect-web3.svg index c6d1b2616fc..ec287d26295 100644 --- a/src/components/Simulator/icons/connect-web3.svg +++ b/src/components/Simulator/icons/connect-web3.svg @@ -1,3 +1,4 @@ - - + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/create-account.svg b/src/components/Simulator/icons/create-account.svg index 36372eaccd8..31e81d36579 100644 --- a/src/components/Simulator/icons/create-account.svg +++ b/src/components/Simulator/icons/create-account.svg @@ -1,3 +1,6 @@ - - + + + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/send-receive.svg b/src/components/Simulator/icons/send-receive.svg index 775fc929a5b..01c6b868053 100644 --- a/src/components/Simulator/icons/send-receive.svg +++ b/src/components/Simulator/icons/send-receive.svg @@ -1,3 +1,6 @@ - - + + + + + \ No newline at end of file diff --git a/src/components/icons/quiz/trophy.svg b/src/components/icons/quiz/trophy.svg index 215ad7eb683..002532e29cb 100644 --- a/src/components/icons/quiz/trophy.svg +++ b/src/components/icons/quiz/trophy.svg @@ -1,3 +1,4 @@ - - + + + \ No newline at end of file From a659afc10b8ffe9275072bddf55ca89aabd40ef0 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 19 Jun 2025 19:03:22 -0700 Subject: [PATCH 159/368] fix: cookie name --- docs/ab-testing.md | 4 ++-- src/lib/utils/ab-testing-server.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/ab-testing.md b/docs/ab-testing.md index 2c9c8e1d51d..151a422b868 100644 --- a/docs/ab-testing.md +++ b/docs/ab-testing.md @@ -150,13 +150,13 @@ ABTEST_WALLET_LAYOUT_VARIANTS="original:40,list:30,grid:20,carousel:10" 4. Check browser console for Matomo debug logs ### Same Variant Always Shows -1. Clear cookies: `_pk_abtest_[testname]` +1. Clear cookies: `pk_ab_test[testname]` 2. Check variant weights are > 0 3. Verify random assignment logic ## Architecture Notes -- **Cookies**: Uses `_pk_abtest_[testKey]` following Matomo naming conventions +- **Cookies**: Uses `pk_ab_test[testKey]` following Matomo naming conventions - **Persistence**: 30 days (compliant with existing cookie policy) - **SSR**: True server-side rendering with no hydration mismatches - **Fallbacks**: Graceful degradation when tests are disabled or fail diff --git a/src/lib/utils/ab-testing-server.ts b/src/lib/utils/ab-testing-server.ts index 67c1041db4a..3575c5f9cc0 100644 --- a/src/lib/utils/ab-testing-server.ts +++ b/src/lib/utils/ab-testing-server.ts @@ -4,7 +4,7 @@ import { ABTestAssignment, ABTestConfig } from "@/lib/types/ab-testing" import { getABTestConfigs } from "./ab-testing-config" -const AB_TEST_COOKIE_PREFIX = "_pk_abtest_" +const AB_TEST_COOKIE_PREFIX = "pk_ab_test" const COOKIE_MAX_AGE = 60 * 60 * 24 * 30 // 30 days export async function getOrAssignABTest( From 7be348c6705d63255a3044732ec14305b12e6774 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 19 Jun 2025 19:26:35 -0700 Subject: [PATCH 160/368] chore: update type --- src/lib/types/ab-testing.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/types/ab-testing.ts b/src/lib/types/ab-testing.ts index a89778caf48..a317d640380 100644 --- a/src/lib/types/ab-testing.ts +++ b/src/lib/types/ab-testing.ts @@ -18,4 +18,5 @@ export type ABTestAssignment = { } // Type-safe tuple for at least 2 variants -export type ABTestVariants = [ReactNode, ReactNode, ...ReactNode[]] +type Element = ReactNode | JSX.Element | string +export type ABTestVariants = [Element, Element, ...Element[]] From fa2b4523e8212715b137ec45355b8a3bf888c47d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 19 Jun 2025 19:26:42 -0700 Subject: [PATCH 161/368] test: add AppTest AB trial --- app/[locale]/stablecoins/page.tsx | 37 ++++++++++++++++++++----------- src/intl/en/page-stablecoins.json | 1 + 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app/[locale]/stablecoins/page.tsx b/app/[locale]/stablecoins/page.tsx index 1fd09af2453..201bb675f0b 100644 --- a/app/[locale]/stablecoins/page.tsx +++ b/app/[locale]/stablecoins/page.tsx @@ -8,6 +8,7 @@ import { MdHelpOutline } from "react-icons/md" import { Lang } from "@/lib/types" +import ABTestWrapper from "@/components/ABTestWrapper" import CalloutBannerSSR from "@/components/CalloutBannerSSR" import DataProductCard from "@/components/DataProductCard" import Emoji from "@/components/Emoji" @@ -590,19 +591,29 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) { imageWidth={600} alt={t("page-stablecoins-stablecoins-dapp-callout-image-alt")} > -
    - - {t("page-stablecoins-explore-dapps")} - - - {t("page-stablecoins-more-defi-button")} - -
    + + + {t("page-stablecoins-explore-dapps")} + + + {t("page-stablecoins-more-defi-button")} + + , +
    + + {t("page-stablecoins-explore-apps")} + +
    , + ]} + />

    {t("page-stablecoins-save-stablecoins")}

    diff --git a/src/intl/en/page-stablecoins.json b/src/intl/en/page-stablecoins.json index 81619b2698b..3275fba355f 100644 --- a/src/intl/en/page-stablecoins.json +++ b/src/intl/en/page-stablecoins.json @@ -76,6 +76,7 @@ "page-stablecoins-editors-choice": "Editors' choices", "page-stablecoins-editors-choice-intro": "These are probably the best-known examples of stablecoins right now and the coins we've found useful when using dapps.", "page-stablecoins-explore-dapps": "Explore dapps", + "page-stablecoins-explore-apps": "Explore ..apps", "page-stablecoins-fiat-backed": "Fiat backed", "page-stablecoins-fiat-backed-con-1": "Centralized – someone must issue the tokens.", "page-stablecoins-fiat-backed-con-2": "Requires auditing to ensure company has sufficient reserves.", From ae0b0088615d7e9a0491ea39c0afe4113f75effc Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 19 Jun 2025 22:48:03 -0700 Subject: [PATCH 162/368] fix: staking icons --- src/components/icons/staking/bug-bounty.svg | 5 +- .../staking/default-open-source-glyph.svg | 4 +- src/components/icons/staking/economical.svg | 4 +- .../icons/staking/ethpool-glyph.svg | 4 +- src/components/icons/staking/index.ts | 4 +- src/components/icons/staking/lido-glyph.svg | 4 +- src/components/icons/staking/multi-client.svg | 9 ++-- .../icons/staking/origin-ether-glyph.svg | 47 ++++++++++++++++- .../icons/staking/permissionless.svg | 7 ++- .../icons/staking/rocket-pool-glyph.svg | 37 +++++++++++++- src/components/icons/staking/stafi-glyph.svg | 4 +- .../icons/staking/stakewise-glyph.svg | 51 ++++++++++++++++++- .../icons/staking/staking-dappnode-glyph.svg | 6 +-- .../staking/staking-glyph-token-wallet.svg | 7 ++- src/components/icons/staking/trustless.svg | 6 ++- 15 files changed, 167 insertions(+), 32 deletions(-) diff --git a/src/components/icons/staking/bug-bounty.svg b/src/components/icons/staking/bug-bounty.svg index 49582729dd0..521f2bd51d1 100644 --- a/src/components/icons/staking/bug-bounty.svg +++ b/src/components/icons/staking/bug-bounty.svg @@ -1,3 +1,4 @@ - - + + + \ No newline at end of file diff --git a/src/components/icons/staking/default-open-source-glyph.svg b/src/components/icons/staking/default-open-source-glyph.svg index 856cd1d59b4..944e030d6ae 100644 --- a/src/components/icons/staking/default-open-source-glyph.svg +++ b/src/components/icons/staking/default-open-source-glyph.svg @@ -1,3 +1,3 @@ - - + + \ No newline at end of file diff --git a/src/components/icons/staking/economical.svg b/src/components/icons/staking/economical.svg index 2741e00b515..4bb5a476026 100644 --- a/src/components/icons/staking/economical.svg +++ b/src/components/icons/staking/economical.svg @@ -1,3 +1,3 @@ - - + + \ No newline at end of file diff --git a/src/components/icons/staking/ethpool-glyph.svg b/src/components/icons/staking/ethpool-glyph.svg index f5ab6a9724b..1139ab72430 100644 --- a/src/components/icons/staking/ethpool-glyph.svg +++ b/src/components/icons/staking/ethpool-glyph.svg @@ -1,3 +1,3 @@ - - + + \ No newline at end of file diff --git a/src/components/icons/staking/index.ts b/src/components/icons/staking/index.ts index 428cb0583ab..04d78418953 100644 --- a/src/components/icons/staking/index.ts +++ b/src/components/icons/staking/index.ts @@ -23,7 +23,7 @@ import LiquidityTokenIcon from "./liquidity-token.svg" import MultiClientIcon from "./multi-client.svg" import OpenSourceStakingIcon from "./open-source-staking.svg" import OriginEtherGlyphIcon from "./origin-ether-glyph.svg" -import P2pGlyphIcon from "./p2p-glyph.svg" +import P2PGlyphIcon from "./p2p-glyph.svg" import PermissionlessIcon from "./permissionless.svg" import RockXGlyphIcon from "./rock-x-glyph.svg" import RocketPoolGlyphIcon from "./rocket-pool-glyph.svg" @@ -71,7 +71,7 @@ export { MultiClientIcon, OpenSourceStakingIcon, OriginEtherGlyphIcon, - P2pGlyphIcon, + P2PGlyphIcon, PermissionlessIcon, RocketPoolGlyphIcon, RockXGlyphIcon, diff --git a/src/components/icons/staking/lido-glyph.svg b/src/components/icons/staking/lido-glyph.svg index e1a9cfa5887..257ed3142fa 100644 --- a/src/components/icons/staking/lido-glyph.svg +++ b/src/components/icons/staking/lido-glyph.svg @@ -1,3 +1,3 @@ - - + + \ No newline at end of file diff --git a/src/components/icons/staking/multi-client.svg b/src/components/icons/staking/multi-client.svg index e83c6f18ef2..995432bc538 100644 --- a/src/components/icons/staking/multi-client.svg +++ b/src/components/icons/staking/multi-client.svg @@ -1,3 +1,6 @@ - - - \ No newline at end of file + + + + + + diff --git a/src/components/icons/staking/origin-ether-glyph.svg b/src/components/icons/staking/origin-ether-glyph.svg index 90a50054505..b63d858242a 100644 --- a/src/components/icons/staking/origin-ether-glyph.svg +++ b/src/components/icons/staking/origin-ether-glyph.svg @@ -1,3 +1,46 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/icons/staking/permissionless.svg b/src/components/icons/staking/permissionless.svg index 8fda8f54249..e0d17645930 100644 --- a/src/components/icons/staking/permissionless.svg +++ b/src/components/icons/staking/permissionless.svg @@ -1,3 +1,6 @@ - - + + + + + \ No newline at end of file diff --git a/src/components/icons/staking/rocket-pool-glyph.svg b/src/components/icons/staking/rocket-pool-glyph.svg index acfe88720d7..1945cb03b19 100644 --- a/src/components/icons/staking/rocket-pool-glyph.svg +++ b/src/components/icons/staking/rocket-pool-glyph.svg @@ -1,3 +1,36 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/icons/staking/stafi-glyph.svg b/src/components/icons/staking/stafi-glyph.svg index f3c2693e5cb..59a08b4918f 100644 --- a/src/components/icons/staking/stafi-glyph.svg +++ b/src/components/icons/staking/stafi-glyph.svg @@ -1,3 +1,3 @@ - - + + \ No newline at end of file diff --git a/src/components/icons/staking/stakewise-glyph.svg b/src/components/icons/staking/stakewise-glyph.svg index 14d7a4806a5..68bc22e76cf 100644 --- a/src/components/icons/staking/stakewise-glyph.svg +++ b/src/components/icons/staking/stakewise-glyph.svg @@ -1,3 +1,50 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/icons/staking/staking-dappnode-glyph.svg b/src/components/icons/staking/staking-dappnode-glyph.svg index 7d5e3ac7102..d971753bf21 100644 --- a/src/components/icons/staking/staking-dappnode-glyph.svg +++ b/src/components/icons/staking/staking-dappnode-glyph.svg @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/src/components/icons/staking/staking-glyph-token-wallet.svg b/src/components/icons/staking/staking-glyph-token-wallet.svg index c6088f6a7bc..a00f6e8b997 100644 --- a/src/components/icons/staking/staking-glyph-token-wallet.svg +++ b/src/components/icons/staking/staking-glyph-token-wallet.svg @@ -1,3 +1,6 @@ - - + + + + + \ No newline at end of file diff --git a/src/components/icons/staking/trustless.svg b/src/components/icons/staking/trustless.svg index 53bfc32f684..0b000567961 100644 --- a/src/components/icons/staking/trustless.svg +++ b/src/components/icons/staking/trustless.svg @@ -1,3 +1,5 @@ - - + + + + \ No newline at end of file From c1a1c7d3027e48441153187f6b5448e6836d716d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 20 Jun 2025 06:58:17 -0700 Subject: [PATCH 163/368] fix: story --- src/components/icons/Icons.stories.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/icons/Icons.stories.tsx b/src/components/icons/Icons.stories.tsx index d1375317481..e0e929c96fe 100644 --- a/src/components/icons/Icons.stories.tsx +++ b/src/components/icons/Icons.stories.tsx @@ -48,7 +48,7 @@ import { LiquidityTokenIcon, MultiClientIcon, OpenSourceStakingIcon, - P2pGlyphIcon, + P2PGlyphIcon, PermissionlessIcon, RocketPoolGlyphIcon, RockXGlyphIcon, @@ -134,7 +134,7 @@ const iconsDefinitions = [ EverstakeGlyphIcon, FigmentGlyphIcon, GreenCheckProductGlyph, - P2pGlyphIcon, + P2PGlyphIcon, KilnGlyphIcon, LaunchnodesGlyphIcon, LidoGlyphIcon, From b0df01ba8f5adcbab3a676989925fd244b0b3550 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:36:35 -0700 Subject: [PATCH 164/368] fix: run-a-node icons --- .../run-a-node/_components/run-a-node.tsx | 30 +++++++++---------- .../icons/run-a-node/download-glyph.svg | 10 +++++-- .../icons/run-a-node/hardware-glyph.svg | 8 +++-- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/app/[locale]/run-a-node/_components/run-a-node.tsx b/app/[locale]/run-a-node/_components/run-a-node.tsx index b3521833f4c..2a893121ca3 100644 --- a/app/[locale]/run-a-node/_components/run-a-node.tsx +++ b/app/[locale]/run-a-node/_components/run-a-node.tsx @@ -197,7 +197,7 @@ const Width40 = (props: ChildOnlyProp) => ( ) type RunANodeCard = { - image: React.FC> + Svg: React.FC> title: string preview: ReactNode body: string[] @@ -230,7 +230,7 @@ const RunANodePage = ({ const whyRunANodeCards: RunANodeCard[] = [ { - image: PrivacyGlyphIcon, + Svg: PrivacyGlyphIcon, title: t("page-run-a-node-privacy-title"), preview: t("page-run-a-node-privacy-preview"), body: [ @@ -241,7 +241,7 @@ const RunANodePage = ({ alt: t("page-run-a-node-glyph-alt-privacy"), }, { - image: MegaphoneGlyphIcon, + Svg: MegaphoneGlyphIcon, title: t("page-run-a-node-censorship-resistance-title"), preview: t("page-run-a-node-censorship-resistance-preview"), body: [ @@ -251,7 +251,7 @@ const RunANodePage = ({ alt: t("page-run-a-node-glyph-alt-censorship-resistance"), }, { - image: EarthGlyphIcon, + Svg: EarthGlyphIcon, title: t("page-run-a-node-participate-title"), preview: ( @@ -263,7 +263,7 @@ const RunANodePage = ({ alt: t("page-run-a-node-glyph-alt-earth"), }, { - image: DecentralizationGlyphIcon, + Svg: DecentralizationGlyphIcon, title: t("page-run-a-node-decentralized-title"), preview: t("page-run-a-node-decentralized-preview"), body: [ @@ -273,7 +273,7 @@ const RunANodePage = ({ alt: t("page-run-a-node-glyph-alt-decentralization"), }, { - image: VoteGlyphIcon, + Svg: VoteGlyphIcon, title: t("page-run-a-node-voice-your-choice-title"), preview: t("page-run-a-node-voice-your-choice-preview"), body: [ @@ -283,7 +283,7 @@ const RunANodePage = ({ alt: t("page-run-a-node-glyph-alt-vote"), }, { - image: SovereigntyGlyphIcon, + Svg: SovereigntyGlyphIcon, title: t("page-run-a-node-sovereignty-title"), preview: t("page-run-a-node-sovereignty-preview"), body: [ @@ -367,14 +367,16 @@ const RunANodePage = ({ - {whyRunANodeCards.map(({ image, title, preview, body, alt }) => ( + {whyRunANodeCards.map(({ Svg, title, preview, body, alt }) => ( ) // @ts-expect-error alt does not exist as a valid prop alt={alt} - svg={image} + svg={({ className }) => ( + + )} key={title} > {body.map((item) => ( @@ -516,9 +518,8 @@ const RunANodePage = ({ ) - // @ts-expect-error alt does not exist as a valid prop - alt={t("page-run-a-node-glyph-alt-hardware")} + className="size-12" + aria-label={t("page-run-a-node-glyph-alt-hardware")} />

    {t("page-run-a-node-build-your-own-hardware-title")}

    @@ -588,9 +589,8 @@ const RunANodePage = ({ ) - // @ts-expect-error alt does not exist as a valid prop - alt={t("page-run-a-node-glyph-alt-software")} + aria-label={t("page-run-a-node-glyph-alt-software")} + className="size-12" />

    {t("page-run-a-node-build-your-own-software")}

    diff --git a/src/components/icons/run-a-node/download-glyph.svg b/src/components/icons/run-a-node/download-glyph.svg index 5a10c249eff..fe0c65b54d6 100644 --- a/src/components/icons/run-a-node/download-glyph.svg +++ b/src/components/icons/run-a-node/download-glyph.svg @@ -1,3 +1,9 @@ - - + + + + + + + + \ No newline at end of file diff --git a/src/components/icons/run-a-node/hardware-glyph.svg b/src/components/icons/run-a-node/hardware-glyph.svg index b2d1699c466..12ee2c7599a 100644 --- a/src/components/icons/run-a-node/hardware-glyph.svg +++ b/src/components/icons/run-a-node/hardware-glyph.svg @@ -1,3 +1,7 @@ - - + + + + + + \ No newline at end of file From 0703efe660296d64cfe7fe701ce2d02f71cdbd36 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:39:19 -0700 Subject: [PATCH 165/368] fix: what-is-ethereum icons --- .../_components/what-is-ethereum.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx b/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx index 2b3bc733b06..b7f071c6b6b 100644 --- a/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx +++ b/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx @@ -488,7 +488,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -511,7 +511,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -534,7 +534,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -559,7 +559,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -585,7 +585,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -611,7 +611,7 @@ const WhatIsEthereumPage = ({ })} > - + From dceccf20fa601bdc2bde1f9ac52dc7256dbf9e24 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:06:56 -0700 Subject: [PATCH 166/368] fix: Simulator icons --- src/components/Simulator/ClickAnimation.tsx | 2 ++ src/components/Simulator/MoreInfoPopover.tsx | 2 +- .../Simulator/WalletHome/AddressPill.tsx | 2 +- .../WalletHome/SendReceiveButtons.tsx | 6 ++---- .../Simulator/WalletHome/TokenBalanceItem.tsx | 2 +- .../Simulator/icons/EthTokenIcon.tsx | 14 ++++++++++++++ .../Simulator/icons/browser-globe.svg | 11 +++++++++++ src/components/Simulator/icons/dai-token.svg | 19 +++++++++++++++++-- .../Simulator/icons/eth-token-grayscale.svg | 11 ----------- src/components/Simulator/icons/eth-token.svg | 15 ++++----------- src/components/Simulator/icons/index.ts | 8 +++----- src/components/Simulator/icons/qr-code.svg | 11 +++++++++-- .../Simulator/screens/ConnectWeb3/Browser.tsx | 7 ++++--- .../Simulator/screens/ConnectWeb3/Slider.tsx | 2 +- .../Simulator/screens/ConnectWeb3/Web3App.tsx | 2 +- .../Simulator/screens/ConnectWeb3/index.tsx | 2 +- .../screens/CreateAccount/GeneratingKeys.tsx | 6 +++--- .../CreateAccount/WordSelectorButtons.tsx | 2 +- .../screens/SendReceive/SendFromContacts.tsx | 8 ++++---- .../Simulator/screens/SendReceive/Success.tsx | 4 +++- src/components/ui/spinner.tsx | 2 +- 21 files changed, 84 insertions(+), 54 deletions(-) create mode 100644 src/components/Simulator/icons/EthTokenIcon.tsx create mode 100644 src/components/Simulator/icons/browser-globe.svg delete mode 100644 src/components/Simulator/icons/eth-token-grayscale.svg diff --git a/src/components/Simulator/ClickAnimation.tsx b/src/components/Simulator/ClickAnimation.tsx index 338c2eb45a0..a7a6a0881dc 100644 --- a/src/components/Simulator/ClickAnimation.tsx +++ b/src/components/Simulator/ClickAnimation.tsx @@ -56,6 +56,8 @@ export const ClickAnimation = ({ initial={{ scaleY: 1, rotate }} animate={{ scaleY: [1, 1.25, 1] }} // Arrow scales up and down transition={transition} + height="1em" + width="1em" > diff --git a/src/components/Simulator/MoreInfoPopover.tsx b/src/components/Simulator/MoreInfoPopover.tsx index a3ab55255f8..cf2811223ff 100644 --- a/src/components/Simulator/MoreInfoPopover.tsx +++ b/src/components/Simulator/MoreInfoPopover.tsx @@ -30,7 +30,7 @@ export const MoreInfoPopover = ({ isFirstStep, children }: MoreInfoPopover) => { data-testid="more-info-popover-trigger" > More info - + {isFirstStep && !clicked && } diff --git a/src/components/Simulator/WalletHome/AddressPill.tsx b/src/components/Simulator/WalletHome/AddressPill.tsx index 65df2ba8755..3bcd964d924 100644 --- a/src/components/Simulator/WalletHome/AddressPill.tsx +++ b/src/components/Simulator/WalletHome/AddressPill.tsx @@ -17,7 +17,7 @@ export const AddressPill = ({ ...btnProps }: AddressPillProps) => ( {...btnProps} >

    {FAKE_DEMO_ADDRESS}

    - +
    ) diff --git a/src/components/Simulator/WalletHome/SendReceiveButtons.tsx b/src/components/Simulator/WalletHome/SendReceiveButtons.tsx index 148cdf6a3c2..9db04bd9506 100644 --- a/src/components/Simulator/WalletHome/SendReceiveButtons.tsx +++ b/src/components/Simulator/WalletHome/SendReceiveButtons.tsx @@ -1,9 +1,7 @@ -import React from "react" -import { SendHorizontal } from "lucide-react" +import { QrCode, SendHorizontal } from "lucide-react" import { Flex } from "@/components/ui/flex" -import { QrCodeIcon } from "../icons" import type { SimulatorNav } from "../interfaces" import { SendReceiveButton } from "./SendReceiveButton" @@ -40,7 +38,7 @@ export const SendReceiveButtons = ({ onClick={nav?.progressStepper} isDisabled={disableReceive} isHighlighted={highlightReceive} - icon={QrCodeIcon} + icon={QrCode} isAnimated > Receive diff --git a/src/components/Simulator/WalletHome/TokenBalanceItem.tsx b/src/components/Simulator/WalletHome/TokenBalanceItem.tsx index b95a3924c3f..cbf4c813b64 100644 --- a/src/components/Simulator/WalletHome/TokenBalanceItem.tsx +++ b/src/components/Simulator/WalletHome/TokenBalanceItem.tsx @@ -21,7 +21,7 @@ export const TokenBalanceItem = ({ item }: TokenBalanceItemProps) => { }).format(amount) return ( - +

    {name}

    {usdValue}

    diff --git a/src/components/Simulator/icons/EthTokenIcon.tsx b/src/components/Simulator/icons/EthTokenIcon.tsx new file mode 100644 index 00000000000..6fce93ef7ad --- /dev/null +++ b/src/components/Simulator/icons/EthTokenIcon.tsx @@ -0,0 +1,14 @@ +import { cn } from "@/lib/utils/cn" + +import EthToken from "./eth-token.svg" + +const EthTokenIcon = ({ className }: { className?: string }) => ( + +) + +export default EthTokenIcon diff --git a/src/components/Simulator/icons/browser-globe.svg b/src/components/Simulator/icons/browser-globe.svg new file mode 100644 index 00000000000..69517583600 --- /dev/null +++ b/src/components/Simulator/icons/browser-globe.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/dai-token.svg b/src/components/Simulator/icons/dai-token.svg index 7eed808016e..93936a63e54 100644 --- a/src/components/Simulator/icons/dai-token.svg +++ b/src/components/Simulator/icons/dai-token.svg @@ -1,3 +1,18 @@ - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/eth-token-grayscale.svg b/src/components/Simulator/icons/eth-token-grayscale.svg deleted file mode 100644 index 717186483ba..00000000000 --- a/src/components/Simulator/icons/eth-token-grayscale.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/Simulator/icons/eth-token.svg b/src/components/Simulator/icons/eth-token.svg index 98e60afcf2f..62af8a448fc 100644 --- a/src/components/Simulator/icons/eth-token.svg +++ b/src/components/Simulator/icons/eth-token.svg @@ -1,12 +1,5 @@ - - - - - + + + + \ No newline at end of file diff --git a/src/components/Simulator/icons/index.ts b/src/components/Simulator/icons/index.ts index a6478c06fa5..d31cb400ae3 100644 --- a/src/components/Simulator/icons/index.ts +++ b/src/components/Simulator/icons/index.ts @@ -1,21 +1,19 @@ +import BrowserGlobe from "./browser-globe.svg" import ConnectWeb3Icon from "./connect-web3.svg" import CreateAccountIcon from "./create-account.svg" import DaiTokenIcon from "./dai-token.svg" import EthGlyphIcon from "./eth-glyph.svg" -import EthTokenIcon from "./eth-token.svg" -import EthTokenIconGrayscale from "./eth-token-grayscale.svg" -import QrCodeIcon from "./qr-code.svg" +import EthTokenIcon from "./EthTokenIcon" import SendReceiveIcon from "./send-receive.svg" import UniTokenIcon from "./uni-token.svg" export { + BrowserGlobe, ConnectWeb3Icon, CreateAccountIcon, DaiTokenIcon, EthGlyphIcon, EthTokenIcon, - EthTokenIconGrayscale, - QrCodeIcon, SendReceiveIcon, UniTokenIcon, } diff --git a/src/components/Simulator/icons/qr-code.svg b/src/components/Simulator/icons/qr-code.svg index 780884c3747..80f5e745672 100644 --- a/src/components/Simulator/icons/qr-code.svg +++ b/src/components/Simulator/icons/qr-code.svg @@ -1,3 +1,10 @@ - - + + + + + + + + + \ No newline at end of file diff --git a/src/components/Simulator/screens/ConnectWeb3/Browser.tsx b/src/components/Simulator/screens/ConnectWeb3/Browser.tsx index 20520186db0..0995bbf3c78 100644 --- a/src/components/Simulator/screens/ConnectWeb3/Browser.tsx +++ b/src/components/Simulator/screens/ConnectWeb3/Browser.tsx @@ -1,10 +1,11 @@ import React, { type HTMLAttributes, useEffect, useState } from "react" import { motion } from "framer-motion" -import { Globe, MoreHorizontal, Search, Triangle } from "lucide-react" +import { MoreHorizontal, Search, Triangle } from "lucide-react" import { Flex, HStack } from "@/components/ui/flex" import { BASE_ANIMATION_DELAY_SEC } from "../../constants" +import { BrowserGlobe } from "../../icons" import { NotificationPopover } from "../../NotificationPopover" import { EXAMPLE_APP_URL } from "./constants" @@ -58,13 +59,13 @@ export const Browser = ({ ...props }: BrowserProps) => {

    Search or enter website

    )}
    - +
    - + diff --git a/src/components/Simulator/screens/ConnectWeb3/Slider.tsx b/src/components/Simulator/screens/ConnectWeb3/Slider.tsx index 07eb8d37b93..c568e80bd33 100644 --- a/src/components/Simulator/screens/ConnectWeb3/Slider.tsx +++ b/src/components/Simulator/screens/ConnectWeb3/Slider.tsx @@ -39,7 +39,7 @@ export const Slider = ({ isConnected, displayUrl, children }: SliderProps) => { animate={{ scale: 1 }} transition={{ type: "spring", delay: 0.25 }} > - + )} - + {children} diff --git a/src/components/Simulator/screens/ConnectWeb3/index.tsx b/src/components/Simulator/screens/ConnectWeb3/index.tsx index ee322a1fb67..4939dd26ec6 100644 --- a/src/components/Simulator/screens/ConnectWeb3/index.tsx +++ b/src/components/Simulator/screens/ConnectWeb3/index.tsx @@ -110,7 +110,7 @@ export const ConnectWeb3 = ({ nav, ctaLabel }: PhoneScreenProps) => {

    Your collection (1)

    diff --git a/src/components/Simulator/screens/CreateAccount/GeneratingKeys.tsx b/src/components/Simulator/screens/CreateAccount/GeneratingKeys.tsx index aa12ceee96e..9fcf413ec59 100644 --- a/src/components/Simulator/screens/CreateAccount/GeneratingKeys.tsx +++ b/src/components/Simulator/screens/CreateAccount/GeneratingKeys.tsx @@ -54,7 +54,8 @@ export const GeneratingKeys = ({ return (
    - {loading ? ( + {/* eslint-disable-next-line no-constant-condition */} + {false && loading ? ( - + )} -

    {loading ? "Generating example recovery phrase" diff --git a/src/components/Simulator/screens/CreateAccount/WordSelectorButtons.tsx b/src/components/Simulator/screens/CreateAccount/WordSelectorButtons.tsx index 3eeefb74a6c..5b11c02eec2 100644 --- a/src/components/Simulator/screens/CreateAccount/WordSelectorButtons.tsx +++ b/src/components/Simulator/screens/CreateAccount/WordSelectorButtons.tsx @@ -81,7 +81,7 @@ export const WordSelectorButtons = ({ <> {word} {index === wordsSelected && ( - + )} diff --git a/src/components/Simulator/screens/SendReceive/SendFromContacts.tsx b/src/components/Simulator/screens/SendReceive/SendFromContacts.tsx index 6170fd99456..7574206faec 100644 --- a/src/components/Simulator/screens/SendReceive/SendFromContacts.tsx +++ b/src/components/Simulator/screens/SendReceive/SendFromContacts.tsx @@ -1,11 +1,11 @@ -import { Search } from "lucide-react" +import { QrCode, Search } from "lucide-react" import type { SimulatorNavProps } from "@/lib/types" import { Button } from "@/components/ui/buttons/Button" import { Stack } from "@/components/ui/flex" -import { EthTokenIconGrayscale, QrCodeIcon } from "../../icons" +import { EthTokenIcon } from "../../icons" import { NotificationPopover } from "../../NotificationPopover" import { CategoryTabs } from "../../WalletHome/CategoryTabs" @@ -36,7 +36,7 @@ export const SendFromContacts = ({ > Address or contacts - +

    @@ -54,7 +54,7 @@ export const SendFromContacts = ({ className="group gap-2 disabled:bg-background disabled:text-body hover:[&_path]:fill-primary-hover" onClick={() => handleSelection(name)} > - + {name} diff --git a/src/components/Simulator/screens/SendReceive/Success.tsx b/src/components/Simulator/screens/SendReceive/Success.tsx index 7ab765f2cd6..af50f4ff9c4 100644 --- a/src/components/Simulator/screens/SendReceive/Success.tsx +++ b/src/components/Simulator/screens/SendReceive/Success.tsx @@ -102,7 +102,9 @@ export const Success = ({ transition={{ type: "spring", delay: 0.25 }} data-testid="success-icon" > - + )}

    diff --git a/src/components/ui/spinner.tsx b/src/components/ui/spinner.tsx index 7961d7ae3de..2a17683c7f2 100644 --- a/src/components/ui/spinner.tsx +++ b/src/components/ui/spinner.tsx @@ -6,7 +6,7 @@ const Spinner = React.forwardRef< React.HTMLAttributes >(({ className, ...props }, ref) => (

    - +
    )) Spinner.displayName = "Spinner" From 2aeda5cc006694fc2e0571f5d8b5a99011db705b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:18:18 -0700 Subject: [PATCH 167/368] fix: find-wallets icons --- src/components/ProductTable/Filters.tsx | 2 +- src/components/icons/wallets/browser.svg | 5 +++-- src/components/icons/wallets/connect-dapps.svg | 4 ++-- src/components/icons/wallets/desktop.svg | 5 +++-- src/components/icons/wallets/ens-support.svg | 5 +++-- src/components/icons/wallets/gas-fee-customization.svg | 7 +++++-- src/components/icons/wallets/hardware-support.svg | 6 ++++-- src/components/icons/wallets/hardware.svg | 4 ++-- src/components/icons/wallets/mobile.svg | 6 ++++-- src/components/icons/wallets/multisig.svg | 7 +++++-- src/components/icons/wallets/nft-support.svg | 4 ++-- src/components/icons/wallets/non-custodial.svg | 8 ++++++-- src/components/icons/wallets/rpc-importing.svg | 5 +++-- src/components/icons/wallets/social-recover.svg | 6 ++++-- src/components/icons/wallets/staking.svg | 9 +++++++-- 15 files changed, 54 insertions(+), 29 deletions(-) diff --git a/src/components/ProductTable/Filters.tsx b/src/components/ProductTable/Filters.tsx index 8aee6180b83..1d939debf8b 100644 --- a/src/components/ProductTable/Filters.tsx +++ b/src/components/ProductTable/Filters.tsx @@ -85,7 +85,7 @@ const Filters = ({ className="min-h-0 gap-1 p-0" onClick={resetFilters} > - + {t("table-reset-filters")}
    diff --git a/src/components/icons/wallets/browser.svg b/src/components/icons/wallets/browser.svg index 48cb2ba0856..b6e1ddbf7bb 100644 --- a/src/components/icons/wallets/browser.svg +++ b/src/components/icons/wallets/browser.svg @@ -1,3 +1,4 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/connect-dapps.svg b/src/components/icons/wallets/connect-dapps.svg index f6f5fbce6be..0dc924f8d6f 100644 --- a/src/components/icons/wallets/connect-dapps.svg +++ b/src/components/icons/wallets/connect-dapps.svg @@ -1,3 +1,3 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/desktop.svg b/src/components/icons/wallets/desktop.svg index eff00b4d416..28179cd26da 100644 --- a/src/components/icons/wallets/desktop.svg +++ b/src/components/icons/wallets/desktop.svg @@ -1,3 +1,4 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/ens-support.svg b/src/components/icons/wallets/ens-support.svg index 52c1779beed..12467f1554f 100644 --- a/src/components/icons/wallets/ens-support.svg +++ b/src/components/icons/wallets/ens-support.svg @@ -1,3 +1,4 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/gas-fee-customization.svg b/src/components/icons/wallets/gas-fee-customization.svg index 37fefa92369..127b7c73730 100644 --- a/src/components/icons/wallets/gas-fee-customization.svg +++ b/src/components/icons/wallets/gas-fee-customization.svg @@ -1,3 +1,6 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/hardware-support.svg b/src/components/icons/wallets/hardware-support.svg index d76d08582bd..8bfa332c28d 100644 --- a/src/components/icons/wallets/hardware-support.svg +++ b/src/components/icons/wallets/hardware-support.svg @@ -1,3 +1,5 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/hardware.svg b/src/components/icons/wallets/hardware.svg index a40da5c4d17..7f829953d99 100644 --- a/src/components/icons/wallets/hardware.svg +++ b/src/components/icons/wallets/hardware.svg @@ -1,3 +1,3 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/mobile.svg b/src/components/icons/wallets/mobile.svg index c2dbb3d8720..4e4ac35d942 100644 --- a/src/components/icons/wallets/mobile.svg +++ b/src/components/icons/wallets/mobile.svg @@ -1,3 +1,5 @@ - - , , + \ No newline at end of file diff --git a/src/components/icons/wallets/multisig.svg b/src/components/icons/wallets/multisig.svg index 7216e54512d..4bfc2d6877f 100644 --- a/src/components/icons/wallets/multisig.svg +++ b/src/components/icons/wallets/multisig.svg @@ -1,3 +1,6 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/nft-support.svg b/src/components/icons/wallets/nft-support.svg index 3ff71d79ec4..a89bd000784 100644 --- a/src/components/icons/wallets/nft-support.svg +++ b/src/components/icons/wallets/nft-support.svg @@ -1,3 +1,3 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/non-custodial.svg b/src/components/icons/wallets/non-custodial.svg index 67319f0cfab..65d0a517742 100644 --- a/src/components/icons/wallets/non-custodial.svg +++ b/src/components/icons/wallets/non-custodial.svg @@ -1,3 +1,7 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/rpc-importing.svg b/src/components/icons/wallets/rpc-importing.svg index 65c0e4396ae..b46b785bfe9 100644 --- a/src/components/icons/wallets/rpc-importing.svg +++ b/src/components/icons/wallets/rpc-importing.svg @@ -1,3 +1,4 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/social-recover.svg b/src/components/icons/wallets/social-recover.svg index 120d4219dc6..6a4f7644fd7 100644 --- a/src/components/icons/wallets/social-recover.svg +++ b/src/components/icons/wallets/social-recover.svg @@ -1,3 +1,5 @@ - - + \ No newline at end of file diff --git a/src/components/icons/wallets/staking.svg b/src/components/icons/wallets/staking.svg index d1803eb8921..cff01037e65 100644 --- a/src/components/icons/wallets/staking.svg +++ b/src/components/icons/wallets/staking.svg @@ -1,3 +1,8 @@ - - + \ No newline at end of file From 207dd3fe5db3edb495313235288c4def0f616e64 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:51:59 -0700 Subject: [PATCH 168/368] fix: info and link sizing --- .../FindWalletProductTable/WalletSubComponent.tsx | 2 +- src/components/IdAnchor.tsx | 2 +- .../Layer2NetworksTable/NetworksSubComponent.tsx | 10 +++++----- .../Layer2NetworksTable/hooks/useNetworkColumns.tsx | 6 +++--- src/components/RadialChart/index.tsx | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/FindWalletProductTable/WalletSubComponent.tsx b/src/components/FindWalletProductTable/WalletSubComponent.tsx index cbc2fccded7..ceb5dfb1c1c 100644 --- a/src/components/FindWalletProductTable/WalletSubComponent.tsx +++ b/src/components/FindWalletProductTable/WalletSubComponent.tsx @@ -118,7 +118,7 @@ const WalletSubComponent = ({

    } > - +

    diff --git a/src/components/IdAnchor.tsx b/src/components/IdAnchor.tsx index b15fb0b8057..5db2c62d1d6 100644 --- a/src/components/IdAnchor.tsx +++ b/src/components/IdAnchor.tsx @@ -10,7 +10,7 @@ const IdAnchor = ({ id }: { id?: string }) => { aria-label={id.replaceAll("-", " ") + " permalink"} href={"#" + id} > - + ) } diff --git a/src/components/Layer2NetworksTable/NetworksSubComponent.tsx b/src/components/Layer2NetworksTable/NetworksSubComponent.tsx index 036587cec39..17c2949dcbc 100644 --- a/src/components/Layer2NetworksTable/NetworksSubComponent.tsx +++ b/src/components/Layer2NetworksTable/NetworksSubComponent.tsx @@ -61,7 +61,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { eventName: "age", }} > - +

    @@ -102,7 +102,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { eventName: "wallet_support", }} > - +

    @@ -144,7 +144,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { eventName: "active_addresses", }} > - +

    @@ -171,7 +171,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { eventName: "fee_token", }} > - +

    @@ -200,7 +200,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => { } > - +

    diff --git a/src/components/Layer2NetworksTable/hooks/useNetworkColumns.tsx b/src/components/Layer2NetworksTable/hooks/useNetworkColumns.tsx index 8e39cc9f266..3243083b92d 100644 --- a/src/components/Layer2NetworksTable/hooks/useNetworkColumns.tsx +++ b/src/components/Layer2NetworksTable/hooks/useNetworkColumns.tsx @@ -153,7 +153,7 @@ export const useNetworkColumns: ColumnDef[] = [
    } > - +

    @@ -208,7 +208,7 @@ export const useNetworkColumns: ColumnDef[] = [ } > - +

    @@ -259,7 +259,7 @@ export const useNetworkColumns: ColumnDef[] = [ } > - +

    diff --git a/src/components/RadialChart/index.tsx b/src/components/RadialChart/index.tsx index 9f0bc4a1a74..2def64b02c8 100644 --- a/src/components/RadialChart/index.tsx +++ b/src/components/RadialChart/index.tsx @@ -122,7 +122,7 @@ const RadialChart = ({ } > - + )} From 7bf21312d3c49285b9899cfc596a56662c995d42 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:55:02 -0700 Subject: [PATCH 169/368] fix: /staking icon --- src/components/icons/staking/staking-glyph-ether-circle.svg | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/icons/staking/staking-glyph-ether-circle.svg b/src/components/icons/staking/staking-glyph-ether-circle.svg index f4c40278e1a..a9aac94f5a5 100644 --- a/src/components/icons/staking/staking-glyph-ether-circle.svg +++ b/src/components/icons/staking/staking-glyph-ether-circle.svg @@ -1,3 +1,4 @@ - - + + + \ No newline at end of file From c3b27133993ee9dce5fa1c4753cb0f5769d93444 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 20 Jun 2025 19:03:37 -0700 Subject: [PATCH 170/368] fix: /roadmap icon sizes --- app/[locale]/roadmap/_components/roadmap.tsx | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/[locale]/roadmap/_components/roadmap.tsx b/app/[locale]/roadmap/_components/roadmap.tsx index b373eb20747..0f782609ec4 100644 --- a/app/[locale]/roadmap/_components/roadmap.tsx +++ b/app/[locale]/roadmap/_components/roadmap.tsx @@ -43,7 +43,7 @@ const RoadmapPage = () => { const changesComingItems = [ { title: "Cheaper transactions", - icon: , + icon: , description: "Rollups are too expensive and rely on centralized components, causing users to place too much trust in their operators. The roadmap includes fixes for both of these problems.", button: { @@ -53,7 +53,7 @@ const RoadmapPage = () => { }, { title: "Extra security", - icon: , + icon: , description: "Ethereum is already very secure but it can be made even stronger, ready to withstand all kinds of attack far into the future.", button: { @@ -63,7 +63,7 @@ const RoadmapPage = () => { }, { title: "Better user experience", - icon: , + icon: , description: "More support for smart contract wallets and light-weight nodes will make using Ethereum simpler and safer.", button: { @@ -73,7 +73,7 @@ const RoadmapPage = () => { }, { title: "Future-proofing", - icon: , + icon: , description: "Ethereum researchers and developers are solving tomorrow's problems today, readying the network for future generations.", button: { @@ -85,49 +85,49 @@ const RoadmapPage = () => { const technicalUpgradesItems = [ { - icon: , + icon: , title: "Danksharding", description: "Danksharding makes L2 rollups much cheaper for users by adding “blobs” of data to Ethereum blocks.", href: "/roadmap/danksharding", }, { - icon: , + icon: , title: "Single slot finality", description: "Instead of waiting for fifteen minutes, blocks could get proposed and finalized in the same slot. This is more convenient for apps and difficult to attack.", href: "/roadmap/single-slot-finality", }, { - icon: , + icon: , title: "Proposer-builder separation", description: "Splitting the block building and block proposal tasks across separate validators creates a fairer, more censorship resistant and efficient way for Ethereum to come to consensus.", href: "/roadmap/pbs", }, { - icon: , + icon: , title: "Secret leader election", description: "Clever cryptography can be used to ensure that the identity of the current block proposer is not made public, protecting them from certain types of attack.", href: "/roadmap/secret-leader-election", }, { - icon: , + icon: , title: "Account abstraction", description: "Account abstraction is a class of upgrades that support smart contract wallets natively on Ethereum, rather than having to use complex middleware.", href: "/roadmap/account-abstraction", }, { - icon: , + icon: , title: "Verkle trees", description: "Verkle trees are a data structure that can be used to enable stateless clients on Ethereum. These clients will require a small amount of storage space but will still be able to verify new blocks.", href: "/roadmap/verkle-trees", }, { - icon: , + icon: , title: "Statelessness", description: "Stateless clients will be able to verify new blocks without having to store large amounts of data. This will provide all the benefits of running a node with only a tiny fraction of today’s costs.", From 58b4b0c1c6ab936e053fafc80be8548e6fa30151 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 21 Jun 2025 17:19:42 -0700 Subject: [PATCH 171/368] fix: info icon size --- src/components/EthPriceCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/EthPriceCard.tsx b/src/components/EthPriceCard.tsx index 462723b2cd0..b4743a63ecb 100644 --- a/src/components/EthPriceCard.tsx +++ b/src/components/EthPriceCard.tsx @@ -117,7 +117,7 @@ const EthPriceCard = ({

    {t("eth-current-price")} - +

    From e52b025349d6a00dc11b100395210418708a98d2 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 21 Jun 2025 19:47:38 -0700 Subject: [PATCH 172/368] fix: /community/events icons, sizes --- src/components/EventCard.tsx | 4 ++-- src/components/MeetupList.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/EventCard.tsx b/src/components/EventCard.tsx index d6010b4bf7b..2d8bd410946 100644 --- a/src/components/EventCard.tsx +++ b/src/components/EventCard.tsx @@ -1,5 +1,5 @@ import React from "react" -import { Calendar } from "lucide-react" +import { CalendarDays } from "lucide-react" import { useLocale } from "next-intl" import type { EventCardProps } from "@/lib/types" @@ -39,7 +39,7 @@ const EventCard: React.FC = ({ return ( - + {formatedDate} diff --git a/src/components/MeetupList.tsx b/src/components/MeetupList.tsx index f535d3f4f22..5c533d9b75e 100644 --- a/src/components/MeetupList.tsx +++ b/src/components/MeetupList.tsx @@ -95,7 +95,7 @@ const MeetupList = () => {

    {meetup.location}

    - + ))} From 5ec7868b3cc578b25e6e6a7862d1e32882157560 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 21 Jun 2025 20:14:24 -0700 Subject: [PATCH 173/368] fix: ui/link mailto and ext link icons rm custom email.svg, use lucide mail (identical) --- src/components/icons/email.svg | 4 ---- src/components/ui/Link.tsx | 18 +++++++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 src/components/icons/email.svg diff --git a/src/components/icons/email.svg b/src/components/icons/email.svg deleted file mode 100644 index 5ee5bfc3c19..00000000000 --- a/src/components/icons/email.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/components/ui/Link.tsx b/src/components/ui/Link.tsx index 4a7e8cb01ef..b5a00d10fbe 100644 --- a/src/components/ui/Link.tsx +++ b/src/components/ui/Link.tsx @@ -1,12 +1,10 @@ "use client" import { AnchorHTMLAttributes, ComponentProps, forwardRef } from "react" -import { ExternalLink } from "lucide-react" +import { ExternalLink, Mail } from "lucide-react" import NextLink from "next/link" import { VisuallyHidden } from "@radix-ui/react-visually-hidden" -import Email from "@/components/icons/email.svg" - import { cn } from "@/lib/utils/cn" import { type MatomoEventOptions, trackCustomEvent } from "@/lib/utils/matomo" import { getRelativePath } from "@/lib/utils/relativePath" @@ -104,17 +102,23 @@ export const BaseLink = forwardRef(function Link( } {...commonProps} > - {!hideArrow && isMailto && ( - + {isMailto ? ( + + {!hideArrow && ( + + )} + {children} + + ) : ( + children )} - {children} {isMailto ? "opens email client" : "opens in a new tab"} {!hideArrow && !isMailto && ( From de96f389ff2ecc5ab5b272383709af67eb88f909 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 21 Jun 2025 20:26:38 -0700 Subject: [PATCH 174/368] fix: copy and checkmark icons --- src/components/CopyToClipboard.tsx | 6 +++++- src/components/ui/checkbox.tsx | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/CopyToClipboard.tsx b/src/components/CopyToClipboard.tsx index 68c81e4d554..82d04db92e4 100644 --- a/src/components/CopyToClipboard.tsx +++ b/src/components/CopyToClipboard.tsx @@ -41,7 +41,11 @@ export const CopyButton = ({ message, ...props }: CopyButtonProps) => { const { onCopy, hasCopied } = useClipboard({ timeout: 1500 }) return ( ) } diff --git a/src/components/ui/checkbox.tsx b/src/components/ui/checkbox.tsx index 69936370a41..eb0148f4c62 100644 --- a/src/components/ui/checkbox.tsx +++ b/src/components/ui/checkbox.tsx @@ -23,8 +23,8 @@ const Checkbox = React.forwardRef< className={cn(commonControlClasses, "rounded-sm", className)} {...props} > - - + + )) From fc38e4805c58f1178f95afd621111265d0e410b5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 21 Jun 2025 21:09:01 -0700 Subject: [PATCH 175/368] fix: /roadmap/merge infographic svg --- .../MergeInfographic/background.svg | 91 +++---------------- 1 file changed, 13 insertions(+), 78 deletions(-) diff --git a/src/components/MergeInfographic/background.svg b/src/components/MergeInfographic/background.svg index 81ce44508c5..d6cda410df6 100644 --- a/src/components/MergeInfographic/background.svg +++ b/src/components/MergeInfographic/background.svg @@ -1,79 +1,14 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + From a2ebc5b2ebc840cd15a3cb50fc39879bc8d06726 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 23 Jun 2025 19:34:13 -0700 Subject: [PATCH 176/368] config: bump pnpm version --- .github/workflows/chromatic.yml | 2 +- .github/workflows/crowdin-ci.yml | 2 +- .github/workflows/generate-review-report.yml | 2 +- .github/workflows/get-crowdin-contributors.yml | 2 +- .github/workflows/get-leaderboard-reports.yml | 2 +- .github/workflows/get-translation-progress.yml | 2 +- .github/workflows/import-community-events.yml | 2 +- .github/workflows/update-chains.yml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index ec470ea386a..bf5f9a31de2 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -34,7 +34,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 + version: 10 - name: Setup Node.js uses: actions/setup-node@v3 with: diff --git a/.github/workflows/crowdin-ci.yml b/.github/workflows/crowdin-ci.yml index 2ee2ecdb03c..ea7b333e53d 100644 --- a/.github/workflows/crowdin-ci.yml +++ b/.github/workflows/crowdin-ci.yml @@ -21,7 +21,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 + version: 10 - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/generate-review-report.yml b/.github/workflows/generate-review-report.yml index 1281b51d46d..fe0b6075b1d 100644 --- a/.github/workflows/generate-review-report.yml +++ b/.github/workflows/generate-review-report.yml @@ -13,7 +13,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 + version: 10 - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/get-crowdin-contributors.yml b/.github/workflows/get-crowdin-contributors.yml index d6cbe39a87a..ef02c809ba7 100644 --- a/.github/workflows/get-crowdin-contributors.yml +++ b/.github/workflows/get-crowdin-contributors.yml @@ -15,7 +15,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 + version: 10 - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/get-leaderboard-reports.yml b/.github/workflows/get-leaderboard-reports.yml index 55969e9778d..a6a78ecb678 100644 --- a/.github/workflows/get-leaderboard-reports.yml +++ b/.github/workflows/get-leaderboard-reports.yml @@ -15,7 +15,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 + version: 10 - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/get-translation-progress.yml b/.github/workflows/get-translation-progress.yml index 95fbde97aef..2d879b8b793 100644 --- a/.github/workflows/get-translation-progress.yml +++ b/.github/workflows/get-translation-progress.yml @@ -15,7 +15,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 + version: 10 - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/import-community-events.yml b/.github/workflows/import-community-events.yml index 4d421423ee5..289b150a2c8 100644 --- a/.github/workflows/import-community-events.yml +++ b/.github/workflows/import-community-events.yml @@ -15,7 +15,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 + version: 10 - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/update-chains.yml b/.github/workflows/update-chains.yml index db6b45e2d19..f253e819061 100644 --- a/.github/workflows/update-chains.yml +++ b/.github/workflows/update-chains.yml @@ -16,7 +16,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 + version: 10 - name: Set up Node.js uses: actions/setup-node@v3 From b28957e996f831a2f05fde14fce8bd3ab006ae2e Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 09:31:59 -0700 Subject: [PATCH 177/368] fix: internal tutorials Tutorials are publicly served at URL/content/developers/tutorials//index.md in production. Netlify to generate appropriate /tutorials landing page based on committed list of tutorials from local fs. --- package.json | 1 + src/data/internalTutorials.json | 57 +++++++++++++++++ src/lib/constants.ts | 4 +- src/lib/utils/md.ts | 91 +++++++++++++++++----------- src/scripts/update-tutorials-list.ts | 27 +++++++++ 5 files changed, 142 insertions(+), 38 deletions(-) create mode 100644 src/data/internalTutorials.json create mode 100644 src/scripts/update-tutorials-list.ts diff --git a/package.json b/package.json index 07e31ff19bc..7626393e1ed 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "markdown-checker": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/markdownChecker.ts", "events-import": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/events-import.ts", "crowdin-needs-review": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/crowdin/reports/generateReviewReport.ts", + "update-tutorials": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/update-tutorials-list.ts", "prepare": "husky" }, "dependencies": { diff --git a/src/data/internalTutorials.json b/src/data/internalTutorials.json new file mode 100644 index 00000000000..2d9834f422e --- /dev/null +++ b/src/data/internalTutorials.json @@ -0,0 +1,57 @@ +[ + "a-developers-guide-to-ethereum-part-one", + "all-you-can-cache", + "calling-a-smart-contract-from-javascript", + "creating-a-wagmi-ui-for-your-contract", + "deploying-your-first-smart-contract", + "develop-and-test-dapps-with-a-multi-client-local-eth-testnet", + "downsizing-contracts-to-fight-the-contract-size-limit", + "eip-1271-smart-contract-signatures", + "erc-721-vyper-annotated-code", + "erc20-annotated-code", + "erc20-with-safety-rails", + "getting-started-with-ethereum-development-using-alchemy", + "guide-to-smart-contract-security-tools", + "hello-world-smart-contract", + "hello-world-smart-contract-fullstack", + "how-to-implement-an-erc721-market", + "how-to-mint-an-nft", + "how-to-mock-solidity-contracts-for-testing", + "how-to-use-echidna-to-test-smart-contracts", + "how-to-use-manticore-to-find-smart-contract-bugs", + "how-to-use-slither-to-find-smart-contract-bugs", + "how-to-use-tellor-as-your-oracle", + "how-to-view-nft-in-metamask", + "how-to-write-and-deploy-an-nft", + "interact-with-other-contracts-from-solidity", + "ipfs-decentralized-ui", + "kickstart-your-dapp-frontend-development-with-create-eth-app", + "learn-foundational-ethereum-topics-with-sql", + "logging-events-smart-contracts", + "merkle-proofs-for-offline-data-integrity", + "monitoring-geth-with-influxdb-and-grafana", + "nft-minter", + "optimism-std-bridge-annotated-code", + "reverse-engineering-a-contract", + "run-node-raspberry-pi", + "scam-token-tricks", + "secret-state", + "secure-development-workflow", + "send-token-ethersjs", + "sending-transactions-using-web3-and-alchemy", + "server-components", + "set-up-web3js-to-use-ethereum-in-javascript", + "short-abi", + "smart-contract-security-guidelines", + "testing-erc-20-tokens-with-waffle", + "the-graph-fixing-web3-data-querying", + "token-integration-checklist", + "transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract", + "understand-the-erc-20-token-smart-contract", + "uniswap-v2-annotated-code", + "using-websockets", + "waffle-dynamic-mocking-and-testing-calls", + "waffle-say-hello-world-with-hardhat-and-ethers", + "waffle-test-simple-smart-contract", + "yellow-paper-evm" +] \ No newline at end of file diff --git a/src/lib/constants.ts b/src/lib/constants.ts index ad94090f080..458a185a089 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -10,6 +10,7 @@ export const CONTENT_PATH = "/content" export const TRANSLATIONS_DIR = "public/content/translations" export const TRANSLATED_IMAGES_DIR = "/content/translations" export const PLACEHOLDER_IMAGE_DIR = "src/data/placeholders" +export const INTERNAL_TUTORIALS_JSON = "src/data/internalTutorials.json" export const INTL_JSON_DIR = "src/intl" export const NULL_VALUE = "—" @@ -24,7 +25,8 @@ export const LOCALES_CODES = BUILD_LOCALES : i18nConfig.map(({ code }) => code) // Site urls -export const SITE_URL = "https://ethereum.org" +export const SITE_URL = + process.env.NEXT_PUBLIC_SITE_URL || "https://ethereum.org" export const DISCORD_PATH = "/discord/" export const GITHUB_REPO_URL = "https://github.com/ethereum/ethereum-org-website/" diff --git a/src/lib/utils/md.ts b/src/lib/utils/md.ts index 810b2dc437b..89e2b5cf357 100644 --- a/src/lib/utils/md.ts +++ b/src/lib/utils/md.ts @@ -8,7 +8,8 @@ import type { Frontmatter, ITutorial, Skill } from "@/lib/types" import { dateToString } from "@/lib/utils/date" -import { CONTENT_DIR } from "@/lib/constants" +import { INTERNAL_TUTORIALS_JSON } from "@/lib/constants" +import { CONTENT_DIR, SITE_URL } from "@/lib/constants" import { toPosixPath } from "./relativePath" @@ -61,46 +62,62 @@ export const getPostSlugs = async (dir: string, filterRegex?: RegExp) => { export const getTutorialsData = async ( locale: string ): Promise => { - const contentRoot = getContentRoot() - const fullPath = join( - contentRoot, - locale !== "en" ? `translations/${locale!}` : "", - "developers/tutorials" - ) const tutorialData: ITutorial[] = [] - const stats = await fsp.stat(fullPath) - if (!stats.isDirectory()) { - console.warn(`Tutorials directory not found for locale: ${locale}`) - return tutorialData // Return empty if the directory does not exist - } + const internalTutorialSlugs = await fsp + .readFile(INTERNAL_TUTORIALS_JSON, "utf-8") + .then((data) => JSON.parse(data) as string[]) + + // Fetch tutorials from public URLs in parallel + const tutorialPromises = internalTutorialSlugs.map(async (slug) => { + try { + const path = + locale !== "en" + ? `/content/translations/${locale}/developers/tutorials/${slug}/index.md` + : `/content/developers/tutorials/${slug}/index.md` + + const url = new URL(path, SITE_URL).toString() + + const response = await fetch(url) + if (!response.ok) { + console.warn( + `Failed to fetch tutorial ${slug} for locale ${locale}: ${response.status}` + ) + return null + } + + const fileContents = await response.text() + const { data, content } = matter(fileContents) + const frontmatter = data as Frontmatter + + return { + href: `/${locale}/developers/tutorials/${slug}`, + title: frontmatter.title, + description: frontmatter.description, + author: frontmatter.author || "", + tags: frontmatter.tags, + skill: frontmatter.skill as Skill, + timeToRead: Math.round(readingTime(content).minutes), + published: dateToString(frontmatter.published), + lang: frontmatter.lang, + isExternal: false, + } + } catch (error) { + console.warn( + `Error fetching tutorial ${slug} for locale ${locale}:`, + error + ) + return null + } + }) - const languageTutorialFiles = await fsp.readdir(fullPath) + const results = await Promise.all(tutorialPromises) - languageTutorialFiles.forEach(async (dir) => { - const filePath = join( - contentRoot, - locale !== "en" ? `translations/${locale!}` : "", - "developers/tutorials", - dir, - "index.md" - ) - const fileContents = await fsp.readFile(filePath, "utf8") - const { data, content } = matter(fileContents) - const frontmatter = data as Frontmatter - - tutorialData.push({ - href: join(`/${locale}/developers/tutorials`, dir), - title: frontmatter.title, - description: frontmatter.description, - author: frontmatter.author || "", - tags: frontmatter.tags, - skill: frontmatter.skill as Skill, - timeToRead: Math.round(readingTime(content).minutes), - published: dateToString(frontmatter.published), - lang: frontmatter.lang, - isExternal: false, - }) + // Filter out null results (failed fetches) + results.forEach((tutorial) => { + if (tutorial) { + tutorialData.push(tutorial) + } }) return tutorialData diff --git a/src/scripts/update-tutorials-list.ts b/src/scripts/update-tutorials-list.ts new file mode 100644 index 00000000000..e0b035e3e7e --- /dev/null +++ b/src/scripts/update-tutorials-list.ts @@ -0,0 +1,27 @@ +import fs from "fs" +import { join } from "path" + +import { CONTENT_DIR, INTERNAL_TUTORIALS_JSON } from "../lib/constants" + +const tutorialsDir = join(CONTENT_DIR, "developers/tutorials") + +try { + const folders = fs + .readdirSync(tutorialsDir, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name) + .filter((folderName) => { + // Check if index.md exists + const indexPath = join(tutorialsDir, folderName, "index.md") + return fs.existsSync(indexPath) + }) + .sort() + + fs.writeFileSync(INTERNAL_TUTORIALS_JSON, JSON.stringify(folders, null, 2)) + console.log( + `Updated ${INTERNAL_TUTORIALS_JSON} with ${folders.length} tutorials` + ) +} catch (error) { + console.error("Error updating tutorials list:", error) + process.exit(1) +} From 875706527404b2fe20bd3792a61dfe3fb06f583c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 09:36:53 -0700 Subject: [PATCH 178/368] feat: add pre-commit hook to auto-update tutorials Quickly logs output of `ls` to .json file with list of available nested /tutorials folders --- .husky/pre-commit | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index d0a778429a3..05e6ab0d529 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,3 @@ -npx lint-staged \ No newline at end of file +npx lint-staged +pnpm update-tutorials +git add src/data/internalTutorials.json From 2527c4fb8696168a72eba9654ec4f3831ea59913 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 14:39:34 -0700 Subject: [PATCH 179/368] fix: import json as component --- src/data/internalTutorials.json | 1 + src/lib/utils/md.ts | 81 ++++++++++++++++----------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/data/internalTutorials.json b/src/data/internalTutorials.json index 2d9834f422e..c59692c7455 100644 --- a/src/data/internalTutorials.json +++ b/src/data/internalTutorials.json @@ -10,6 +10,7 @@ "erc-721-vyper-annotated-code", "erc20-annotated-code", "erc20-with-safety-rails", + "ethereum-for-web2-auth", "getting-started-with-ethereum-development-using-alchemy", "guide-to-smart-contract-security-tools", "hello-world-smart-contract", diff --git a/src/lib/utils/md.ts b/src/lib/utils/md.ts index e7785b7d390..81e6f15010d 100644 --- a/src/lib/utils/md.ts +++ b/src/lib/utils/md.ts @@ -8,7 +8,8 @@ import type { Frontmatter, ITutorial, Skill, SlugPageParams } from "@/lib/types" import { dateToString } from "@/lib/utils/date" -import { INTERNAL_TUTORIALS_JSON } from "@/lib/constants" +import internalTutorialSlugs from "@/data/internalTutorials.json" + import { CONTENT_DIR, SITE_URL } from "@/lib/constants" import { toPosixPath } from "./relativePath" @@ -76,52 +77,50 @@ export const getTutorialsData = async ( ): Promise => { const tutorialData: ITutorial[] = [] - const internalTutorialSlugs = await fsp - .readFile(INTERNAL_TUTORIALS_JSON, "utf-8") - .then((data) => JSON.parse(data) as string[]) - // Fetch tutorials from public URLs in parallel - const tutorialPromises = internalTutorialSlugs.map(async (slug) => { - try { - const path = - locale !== "en" - ? `/content/translations/${locale}/developers/tutorials/${slug}/index.md` - : `/content/developers/tutorials/${slug}/index.md` - - const url = new URL(path, SITE_URL).toString() - - const response = await fetch(url) - if (!response.ok) { + const tutorialPromises = (internalTutorialSlugs as string[]).map( + async (slug) => { + try { + const path = + locale !== "en" + ? `/content/translations/${locale}/developers/tutorials/${slug}/index.md` + : `/content/developers/tutorials/${slug}/index.md` + + const url = new URL(path, SITE_URL).toString() + + const response = await fetch(url) + if (!response.ok) { + console.warn( + `Failed to fetch tutorial ${slug} for locale ${locale}: ${response.status}` + ) + return null + } + + const fileContents = await response.text() + const { data, content } = matter(fileContents) + const frontmatter = data as Frontmatter + + return { + href: `/${locale}/developers/tutorials/${slug}`, + title: frontmatter.title, + description: frontmatter.description, + author: frontmatter.author || "", + tags: frontmatter.tags, + skill: frontmatter.skill as Skill, + timeToRead: Math.round(readingTime(content).minutes), + published: dateToString(frontmatter.published), + lang: frontmatter.lang, + isExternal: false, + } + } catch (error) { console.warn( - `Failed to fetch tutorial ${slug} for locale ${locale}: ${response.status}` + `Error fetching tutorial ${slug} for locale ${locale}:`, + error ) return null } - - const fileContents = await response.text() - const { data, content } = matter(fileContents) - const frontmatter = data as Frontmatter - - return { - href: `/${locale}/developers/tutorials/${slug}`, - title: frontmatter.title, - description: frontmatter.description, - author: frontmatter.author || "", - tags: frontmatter.tags, - skill: frontmatter.skill as Skill, - timeToRead: Math.round(readingTime(content).minutes), - published: dateToString(frontmatter.published), - lang: frontmatter.lang, - isExternal: false, - } - } catch (error) { - console.warn( - `Error fetching tutorial ${slug} for locale ${locale}:`, - error - ) - return null } - }) + ) const results = await Promise.all(tutorialPromises) From 2d91cc17e42eec7e5bd1e6c7dec0cac9d63b5d90 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 14:39:55 -0700 Subject: [PATCH 180/368] feat: expand ui/skeleton options --- src/components/ui/skeleton.tsx | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx index b8d4a83b358..780531ebc03 100644 --- a/src/components/ui/skeleton.tsx +++ b/src/components/ui/skeleton.tsx @@ -62,14 +62,18 @@ type SkeletonCardProps = { className?: string } +const SkeletonCardContent = ({ className }: SkeletonCardProps) => ( + + + + + +) + const SkeletonCard = ({ className }: SkeletonCardProps) => ( - - - - - + ) @@ -85,4 +89,10 @@ const SkeletonCardGrid = ({ className }: SkeletonCardGridProps) => ( ) -export { Skeleton, SkeletonCardGrid, SkeletonLines } +export { + Skeleton, + SkeletonCard, + SkeletonCardContent, + SkeletonCardGrid, + SkeletonLines, +} From 39d59e6ba05381f6c63debf1656fb3a3e24b8a42 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 14:40:53 -0700 Subject: [PATCH 181/368] feat: lazy load with skeletons client components --- app/[locale]/developers/tutorials/page.tsx | 27 ++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/app/[locale]/developers/tutorials/page.tsx b/app/[locale]/developers/tutorials/page.tsx index 87d854c68ce..73f1584a878 100644 --- a/app/[locale]/developers/tutorials/page.tsx +++ b/app/[locale]/developers/tutorials/page.tsx @@ -1,4 +1,5 @@ import { pick } from "lodash" +import dynamic from "next/dynamic" import { getMessages, getTranslations, @@ -10,14 +11,36 @@ import { Lang } from "@/lib/types" import FeedbackCard from "@/components/FeedbackCard" import I18nProvider from "@/components/I18nProvider" import MainArticle from "@/components/MainArticle" +import { Skeleton, SkeletonCardContent } from "@/components/ui/skeleton" import { existsNamespace } from "@/lib/utils/existsNamespace" import { getTutorialsData } from "@/lib/utils/md" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" -import TutorialSubmitModal from "./_components/modal" -import TutorialsList from "./_components/tutorials" +const TutorialsList = dynamic(() => import("./_components/tutorials"), { + ssr: false, + loading: () => ( +
    +
    + {Array.from({ length: 30 }).map((_, index) => ( + + ))} +
    + + +
    + ), +}) + +const TutorialSubmitModal = dynamic(() => import("./_components/modal"), { + ssr: false, + loading: () => ( +
    + +
    + ), +}) const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { const { locale } = await params From 5d4d98a3a7a0683076c96bc7368bf3d2abaf47d1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 14:41:12 -0700 Subject: [PATCH 182/368] chore: remove redundant displayName declaration --- app/[locale]/developers/tutorials/_components/tutorials.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/[locale]/developers/tutorials/_components/tutorials.tsx b/app/[locale]/developers/tutorials/_components/tutorials.tsx index 523cd9a0c73..bcd860496dd 100644 --- a/app/[locale]/developers/tutorials/_components/tutorials.tsx +++ b/app/[locale]/developers/tutorials/_components/tutorials.tsx @@ -247,6 +247,4 @@ const TutorialsList = ({ internalTutorials }: TutorialsListProps) => { ) } -TutorialsList.displayName = "TutorialsList" - export default TutorialsList From 385f66c81110e49253073c8deb73d94641b1e77e Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 19:21:32 -0700 Subject: [PATCH 183/368] patch: lengthen loading visual card array avoids footer components flashing on larger screens. --- app/[locale]/developers/tutorials/page.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/[locale]/developers/tutorials/page.tsx b/app/[locale]/developers/tutorials/page.tsx index 73f1584a878..e83bd857cf8 100644 --- a/app/[locale]/developers/tutorials/page.tsx +++ b/app/[locale]/developers/tutorials/page.tsx @@ -24,11 +24,12 @@ const TutorialsList = dynamic(() => import("./_components/tutorials"), {
    {Array.from({ length: 30 }).map((_, index) => ( - + ))}
    - - + {Array.from({ length: 5 }).map((_, index) => ( + + ))}
    ), }) From 1e419610391e2b7f09de7878ba107da6335f8c3c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 21:29:11 -0700 Subject: [PATCH 184/368] feat: implement server-side AB testing framework - Add core AB testing library with TypeScript types - Implement weighted variant assignment and cookie persistence - Add server-side configuration system with environment variables - Support multi-variant testing with configurable weights - Include proper error handling and development logging --- src/lib/ab-testing/actions.ts | 76 ++++++++++++++++++++ src/lib/ab-testing/config.ts | 39 +++++++++++ src/lib/ab-testing/index.ts | 11 +++ src/lib/ab-testing/server.ts | 126 ++++++++++++++++++++++++++++++++++ src/lib/ab-testing/types.ts | 22 ++++++ 5 files changed, 274 insertions(+) create mode 100644 src/lib/ab-testing/actions.ts create mode 100644 src/lib/ab-testing/config.ts create mode 100644 src/lib/ab-testing/index.ts create mode 100644 src/lib/ab-testing/server.ts create mode 100644 src/lib/ab-testing/types.ts diff --git a/src/lib/ab-testing/actions.ts b/src/lib/ab-testing/actions.ts new file mode 100644 index 00000000000..37041054bdf --- /dev/null +++ b/src/lib/ab-testing/actions.ts @@ -0,0 +1,76 @@ +"use server" + +import { cookies } from "next/headers" + +import { getABTestConfigs } from "./config" +import { ABTestAssignment } from "./types" + +const AB_TEST_COOKIE_PREFIX = "_pk_abtest" + +// Server Action to set AB test assignment cookie +export async function setABTestCookie( + testKey: string, + assignment: ABTestAssignment +) { + const cookieStore = await cookies() + const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` + const maxAge = 60 * 60 * 24 * 30 // 30 days + + cookieStore.set(cookieName, JSON.stringify(assignment), { + maxAge, + httpOnly: false, // Needs to be accessible by client for potential debugging + secure: process.env.NODE_ENV === "production", + sameSite: "lax", + path: "/", + }) +} + +// Server action to manually set a specific variant for testing +export async function forceABTestVariant(testKey: string, variantName: string) { + const configs = getABTestConfigs() + const testConfig = configs[testKey] + + if (!testConfig) { + throw new Error(`Test ${testKey} not found`) + } + + const variant = testConfig.variants.find((v) => v.name === variantName) + if (!variant) { + throw new Error(`Variant ${variantName} not found for test ${testKey}`) + } + + const assignment: ABTestAssignment = { + experimentId: testConfig.id, + experimentName: testConfig.name, + variant: variantName, + assignedAt: Date.now(), + } + + const cookieStore = await cookies() + const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` + const maxAge = 60 * 60 * 24 * 30 // 30 days + + cookieStore.set(cookieName, JSON.stringify(assignment), { + maxAge, + httpOnly: false, + secure: process.env.NODE_ENV === "production", + sameSite: "lax", + path: "/", + }) + + if (process.env.NODE_ENV === "development") { + console.log(`[AB Test] Forced variant ${variantName} for test ${testKey}`) + } + return assignment +} + +// Server action to clear AB test cookie +export async function clearABTestCookie(testKey: string) { + const cookieStore = await cookies() + const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` + + cookieStore.delete(cookieName) + if (process.env.NODE_ENV === "development") { + console.log(`[AB Test] Cleared cookie for test ${testKey}`) + } +} diff --git a/src/lib/ab-testing/config.ts b/src/lib/ab-testing/config.ts new file mode 100644 index 00000000000..cd0d9740edd --- /dev/null +++ b/src/lib/ab-testing/config.ts @@ -0,0 +1,39 @@ +import { ABTestConfig } from "./types" + +function getEnvVar(key: string, defaultValue: string = ""): string { + return process.env[key] || defaultValue +} + +function parseVariantWeights( + envKey: string +): { name: string; weight: number }[] { + // Format: "original:50,variant_b:30,variant_c:20" + const variantString = getEnvVar(envKey, "original:100") + + return variantString.split(",").map((variant) => { + const [name, weight] = variant.split(":") + return { + name: name.trim(), + weight: parseInt(weight.trim()) || 0, + } + }) +} + +export const getABTestConfigs = (): Record => { + return { + // Example test - you can add more here + AppTest: { + name: "AppTest", + id: getEnvVar("ABTEST_APP_TEST_ID", "1"), + enabled: getEnvVar("ABTEST_APP_TEST_ENABLED") === "true", + variants: parseVariantWeights("ABTEST_APP_TEST_VARIANTS"), + }, + // Add more tests as needed: + // walletCardLayout: { + // name: "WalletCardLayout", + // id: getEnvVar("ABTEST_WALLET_CARD_LAYOUT_ID", "2"), + // enabled: getEnvVar("ABTEST_WALLET_CARD_LAYOUT_ENABLED") === "true", + // variants: parseVariantWeights("ABTEST_WALLET_CARD_LAYOUT_VARIANTS") + // } + } +} diff --git a/src/lib/ab-testing/index.ts b/src/lib/ab-testing/index.ts new file mode 100644 index 00000000000..c893a73cad4 --- /dev/null +++ b/src/lib/ab-testing/index.ts @@ -0,0 +1,11 @@ +// Types (safe for both client and server) +export type { ABTestAssignment, ABTestConfig, ABTestVariants } from "./types" + +// Configuration (server-safe) +export { getABTestConfigs } from "./config" + +// Server utilities (only import these in server components) +export { getABTestAssignment, getABTestConfig, getVariantIndex } from "./server" + +// Note: Server actions are exported from ./actions, not here +// This prevents client components from accidentally importing server-only code diff --git a/src/lib/ab-testing/server.ts b/src/lib/ab-testing/server.ts new file mode 100644 index 00000000000..6e06f742890 --- /dev/null +++ b/src/lib/ab-testing/server.ts @@ -0,0 +1,126 @@ +import { cookies } from "next/headers" + +import { getABTestConfigs } from "./config" +import { ABTestAssignment, ABTestConfig } from "./types" + +const AB_TEST_COOKIE_PREFIX = "_pk_abtest" + +export async function getABTestAssignment( + testKey: string +): Promise { + const configs = getABTestConfigs() + const testConfig = configs[testKey] + + if (!testConfig || !testConfig.enabled) { + if (process.env.NODE_ENV === "development") { + console.log(`[AB Test] ${testKey} is disabled or not found`) + } + return null + } + + const cookieStore = cookies() + const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` + const existingAssignment = cookieStore.get(cookieName) + + if (existingAssignment?.value) { + try { + const parsed: ABTestAssignment = JSON.parse(existingAssignment.value) + // Validate that the variant still exists in current config + if (testConfig.variants.some((v) => v.name === parsed.variant)) { + return parsed + } else { + if (process.env.NODE_ENV === "development") { + console.log( + `[AB Test] ${testKey}: Variant ${parsed.variant} no longer exists, reassigning` + ) + } + } + } catch (error) { + if (process.env.NODE_ENV === "development") { + console.log(`[AB Test] ${testKey}: Invalid cookie format, reassigning`) + } + } + } + + // If no valid existing assignment, create a new one and set cookie immediately + const variant = assignVariant(testConfig) + const newAssignment: ABTestAssignment = { + experimentId: testConfig.id, + experimentName: testConfig.name, + variant: variant.name, + assignedAt: Date.now(), + } + + // Set cookie synchronously to avoid re-render loops + const maxAge = 60 * 60 * 24 * 30 // 30 days + try { + cookieStore.set(cookieName, JSON.stringify(newAssignment), { + maxAge, + httpOnly: false, // Needs to be accessible by client for debugging + secure: process.env.NODE_ENV === "production", + sameSite: "lax", + path: "/", + }) + } catch (error) { + // Cookie setting might fail during SSR, that's okay + if (process.env.NODE_ENV === "development") { + console.log( + `[AB Test] ${testKey}: Cookie setting failed during SSR`, + error + ) + } + } + + if (process.env.NODE_ENV === "development") { + console.log(`[AB Test] ${testKey}: New assignment - ${variant.name}`) + } + + return newAssignment +} + +export function getABTestConfig(testKey: string): ABTestConfig | null { + const configs = getABTestConfigs() + const testConfig = configs[testKey] + + if (!testConfig || !testConfig.enabled) { + return null + } + + return testConfig +} + +export function getVariantIndex(variantName: string, testKey: string): number { + const configs = getABTestConfigs() + const testConfig = configs[testKey] + + if (!testConfig) return 0 + + const variantIndex = testConfig.variants.findIndex( + (v) => v.name === variantName + ) + return variantIndex >= 0 ? variantIndex : 0 +} + +function assignVariant(config: ABTestConfig) { + const totalWeight = config.variants.reduce( + (sum, variant) => sum + variant.weight, + 0 + ) + + // Handle case where total weight is 0 + if (totalWeight === 0) { + return config.variants[0] + } + + const random = Math.random() * totalWeight + let cumulativeWeight = 0 + + for (const variant of config.variants) { + cumulativeWeight += variant.weight + if (random <= cumulativeWeight) { + return variant + } + } + + return config.variants[0] +} diff --git a/src/lib/ab-testing/types.ts b/src/lib/ab-testing/types.ts new file mode 100644 index 00000000000..a317d640380 --- /dev/null +++ b/src/lib/ab-testing/types.ts @@ -0,0 +1,22 @@ +import { ReactNode } from "react" + +export type ABTestConfig = { + name: string + id: string + variants: { + name: string + weight: number + }[] + enabled: boolean +} + +export type ABTestAssignment = { + experimentId: string + experimentName: string + variant: string + assignedAt: number +} + +// Type-safe tuple for at least 2 variants +type Element = ReactNode | JSX.Element | string +export type ABTestVariants = [Element, Element, ...Element[]] From e769c4f5106845f6824090be380002e2eeeffcba Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 21:31:13 -0700 Subject: [PATCH 185/368] feat: add AB testing React components - Create ABTestWrapper for server-side variant rendering - Add ABTestTracker for Matomo integration and cookie management - Implement development debug panel with variant switching - Support fallback rendering when tests are disabled --- src/components/AB/TestDebugPanel.tsx | 183 +++++++++++++++++++++++++++ src/components/AB/TestTracker.tsx | 43 +++++++ src/components/AB/TestWrapper.tsx | 50 ++++++++ 3 files changed, 276 insertions(+) create mode 100644 src/components/AB/TestDebugPanel.tsx create mode 100644 src/components/AB/TestTracker.tsx create mode 100644 src/components/AB/TestWrapper.tsx diff --git a/src/components/AB/TestDebugPanel.tsx b/src/components/AB/TestDebugPanel.tsx new file mode 100644 index 00000000000..4925e842e92 --- /dev/null +++ b/src/components/AB/TestDebugPanel.tsx @@ -0,0 +1,183 @@ +"use client" + +import { useEffect, useState, useTransition } from "react" +import { useRouter } from "next/navigation" + +import { clearABTestCookie, forceABTestVariant } from "@/lib/ab-testing/actions" +import { ABTestAssignment } from "@/lib/ab-testing/types" + +type ABTestDebugPanelProps = { + testKey: string + currentAssignment: ABTestAssignment | null + availableVariants: string[] +} + +export function ABTestDebugPanel({ + testKey, + currentAssignment, + availableVariants, +}: ABTestDebugPanelProps) { + const [isOpen, setIsOpen] = useState(false) + const [isPending, startTransition] = useTransition() + const [localAssignment, setLocalAssignment] = useState(currentAssignment) + const router = useRouter() + + // Sync local state when server state changes + useEffect(() => { + setLocalAssignment(currentAssignment) + }, [currentAssignment]) + + const forceVariant = async (variantName: string) => { + try { + const newAssignment = await forceABTestVariant(testKey, variantName) + setLocalAssignment(newAssignment) + // Use transition for smoother updates without full refresh + startTransition(() => { + router.refresh() + }) + } catch (error) { + console.error("Failed to force variant:", error) + } + } + + const clearCookie = async () => { + try { + await clearABTestCookie(testKey) + setLocalAssignment(null) + // Use transition for smoother updates without full refresh + startTransition(() => { + router.refresh() + }) + } catch (error) { + console.error("Failed to clear cookie:", error) + } + } + + const resetAllTests = () => { + // Clear all AB test cookies and reload page + document.cookie.split(";").forEach((cookie) => { + const [name] = cookie.split("=") + if (name.trim().startsWith("_pk_abtest")) { + document.cookie = `${name.trim()}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/` + } + }) + window.location.reload() + } + + if (process.env.NODE_ENV === "production") { + return null + } + + return ( +
    + + + {isOpen && ( +
    +
    + Test: {testKey} +
    +
    + Current: {localAssignment?.variant || "None"} + {isPending && ( + Loading... + )} +
    +
    +
    + Force Variant: +
    + {availableVariants.map((variant) => ( + + ))} +
    + + +
    +
    +
    + )} +
    + ) +} diff --git a/src/components/AB/TestTracker.tsx b/src/components/AB/TestTracker.tsx new file mode 100644 index 00000000000..68ca843945c --- /dev/null +++ b/src/components/AB/TestTracker.tsx @@ -0,0 +1,43 @@ +"use client" + +import { useEffect } from "react" +import { push } from "@socialgouv/matomo-next" + +import { ABTestAssignment } from "@/lib/ab-testing/types" + +type ABTestTrackerProps = { + assignment: ABTestAssignment + testKey?: string +} + +export function ABTestTracker({ assignment, testKey }: ABTestTrackerProps) { + useEffect(() => { + // Don't set cookies here - let server handle cookie persistence + // This component only handles Matomo tracking + + if (process.env.NODE_ENV !== "production") { + console.debug( + `[Matomo] A/B test tracked - Experiment: ${assignment.experimentName}, Variant: ${assignment.variant}` + ) + return + } + + // Check if user has opted out (following existing pattern) + const optedOutValue = + localStorage.getItem("ethereum-org.matomo-opt-out") || "false" + const isOptedOut = JSON.parse(optedOutValue) + if (isOptedOut) return + + // Track the A/B test variant with Matomo + // Using the AbTesting::enter method as specified in Matomo docs + push([ + "AbTesting::enter", + { + experiment: assignment.experimentName, + variation: assignment.variant, + }, + ] as [string, Record]) + }, [assignment, testKey]) + + return null // This component doesn't render anything +} diff --git a/src/components/AB/TestWrapper.tsx b/src/components/AB/TestWrapper.tsx new file mode 100644 index 00000000000..87926db7c98 --- /dev/null +++ b/src/components/AB/TestWrapper.tsx @@ -0,0 +1,50 @@ +import { ReactNode } from "react" + +import { ABTestDebugPanel } from "./TestDebugPanel" +import { ABTestTracker } from "./TestTracker" + +import { getABTestConfigs } from "@/lib/ab-testing/config" +import { getABTestAssignment, getVariantIndex } from "@/lib/ab-testing/server" +import { ABTestVariants } from "@/lib/ab-testing/types" + +type ABTestWrapperProps = { + testKey: string + variants: ABTestVariants + fallback?: ReactNode +} + +const ABTestWrapper = async ({ + testKey, + variants, + fallback, +}: ABTestWrapperProps) => { + // Get assignment from cookie or create new one (handled server-side) + const assignment = await getABTestAssignment(testKey) + + if (!assignment) { + // If no assignment, render fallback + return <>{fallback || variants[0]} + } + + // Find the variant index based on the assignment + const variantIndex = getVariantIndex(assignment.variant, testKey) + const selectedVariant = variants[variantIndex] || variants[0] + + return ( + <> + + {process.env.NODE_ENV !== "production" && ( + v.name) || [] + } + /> + )} + {selectedVariant} + + ) +} + +export default ABTestWrapper From c5808204abdb75ffe069f1c5719da868f9d5c2c4 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 21:34:39 -0700 Subject: [PATCH 186/368] refactor: reorganize AB testing structure and remove legacy files - Move AB components to dedicated directory structure - Remove old AB testing files from utils and root components - Update import paths to use new organized structure - Update stablecoins page to use new AB testing components - Add translation keys for new AB test variants --- app/[locale]/stablecoins/page.tsx | 12 ++-- docs/ab-testing.md | 2 +- src/components/ABTestTracker.tsx | 39 ------------- src/components/ABTestWrapper.tsx | 41 ------------- src/intl/en/page-stablecoins.json | 2 +- src/lib/types/ab-testing.ts | 22 ------- src/lib/utils/ab-testing-config.ts | 39 ------------- src/lib/utils/ab-testing-server.ts | 93 ------------------------------ 8 files changed, 8 insertions(+), 242 deletions(-) delete mode 100644 src/components/ABTestTracker.tsx delete mode 100644 src/components/ABTestWrapper.tsx delete mode 100644 src/lib/types/ab-testing.ts delete mode 100644 src/lib/utils/ab-testing-config.ts delete mode 100644 src/lib/utils/ab-testing-server.ts diff --git a/app/[locale]/stablecoins/page.tsx b/app/[locale]/stablecoins/page.tsx index 201bb675f0b..95397350a9c 100644 --- a/app/[locale]/stablecoins/page.tsx +++ b/app/[locale]/stablecoins/page.tsx @@ -8,7 +8,7 @@ import { MdHelpOutline } from "react-icons/md" import { Lang } from "@/lib/types" -import ABTestWrapper from "@/components/ABTestWrapper" +import ABTestWrapper from "@/components/AB/TestWrapper" import CalloutBannerSSR from "@/components/CalloutBannerSSR" import DataProductCard from "@/components/DataProductCard" import Emoji from "@/components/Emoji" @@ -22,7 +22,7 @@ import PageHero from "@/components/PageHero" import ProductList from "@/components/ProductList" import { StandaloneQuizWidget } from "@/components/Quiz/QuizWidget" import StablecoinAccordion from "@/components/StablecoinAccordion" -import StablecoinsTable from "@/components/StablecoinsTable" +// import StablecoinsTable from "@/components/StablecoinsTable" import Tooltip from "@/components/Tooltip" import Translation from "@/components/Translation" import { ButtonLink } from "@/components/ui/buttons/Button" @@ -103,11 +103,11 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) { const requiredNamespaces = getRequiredNamespacesForPage("/stablecoins") const messages = pick(allMessages, requiredNamespaces) - let marketsHasError = false + // let marketsHasError = false // TODO: Implement error handling const coinDetails: CoinDetails[] = [] try { - marketsHasError = false + // marketsHasError = false const [stablecoinsData] = await loadData() @@ -132,7 +132,7 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) { coinDetails.push(...ethereumStablecoinData) } catch (error) { console.error(error) - marketsHasError = true + // marketsHasError = true // TODO: Handle error state } const heroContent = { @@ -569,7 +569,7 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) { {/* CLIENT SIDE */} - + {/* */}
    diff --git a/docs/ab-testing.md b/docs/ab-testing.md index 151a422b868..4ae1a40f350 100644 --- a/docs/ab-testing.md +++ b/docs/ab-testing.md @@ -28,7 +28,7 @@ ABTEST_MY_TEST_NAME_VARIANTS="original:50,variant_b:50" ### 2. Add the Test Config -Update `src/lib/utils/ab-testing-config.ts`: +Update `src/lib/ab-testing/config.ts`: ```typescript export const getABTestConfigs = (): Record => { diff --git a/src/components/ABTestTracker.tsx b/src/components/ABTestTracker.tsx deleted file mode 100644 index 9bc04ffc606..00000000000 --- a/src/components/ABTestTracker.tsx +++ /dev/null @@ -1,39 +0,0 @@ -"use client" - -import { useEffect } from "react" -import { push } from "@socialgouv/matomo-next" - -import { ABTestAssignment } from "@/lib/types/ab-testing" - -type ABTestTrackerProps = { - assignment: ABTestAssignment -} - -export function ABTestTracker({ assignment }: ABTestTrackerProps) { - useEffect(() => { - if (process.env.NODE_ENV !== "production") { - console.debug( - `[Matomo] A/B test tracked - Experiment: ${assignment.experimentName}, Variant: ${assignment.variant}` - ) - return - } - - // Check if user has opted out (following existing pattern) - const optedOutValue = - localStorage.getItem("ethereum-org.matomo-opt-out") || "false" - const isOptedOut = JSON.parse(optedOutValue) - if (isOptedOut) return - - // Track the A/B test variant with Matomo - // Using the AbTesting::enter method as specified in Matomo docs - push([ - "AbTesting::enter", - { - experiment: assignment.experimentName, - variation: assignment.variant, - }, - ] as [string, Record]) - }, [assignment]) - - return null // This component doesn't render anything -} diff --git a/src/components/ABTestWrapper.tsx b/src/components/ABTestWrapper.tsx deleted file mode 100644 index c26cd7e1f59..00000000000 --- a/src/components/ABTestWrapper.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { ReactNode } from "react" - -import { ABTestVariants } from "@/lib/types/ab-testing" - -import { - getOrAssignABTest, - getVariantIndex, -} from "@/lib/utils/ab-testing-server" - -import { ABTestTracker } from "./ABTestTracker" - -type ABTestWrapperProps = { - testKey: string - variants: ABTestVariants - fallback?: ReactNode -} - -const ABTestWrapper = async ({ - testKey, - variants, - fallback, -}: ABTestWrapperProps) => { - const assignment = await getOrAssignABTest(testKey) - - if (!assignment) { - return <>{fallback || variants[0]} - } - - // Find the variant index based on the assignment - const variantIndex = getVariantIndex(assignment.variant, testKey) - const selectedVariant = variants[variantIndex] || variants[0] - - return ( - <> - - {selectedVariant} - - ) -} - -export default ABTestWrapper diff --git a/src/intl/en/page-stablecoins.json b/src/intl/en/page-stablecoins.json index 3275fba355f..5ef4de2e937 100644 --- a/src/intl/en/page-stablecoins.json +++ b/src/intl/en/page-stablecoins.json @@ -76,7 +76,7 @@ "page-stablecoins-editors-choice": "Editors' choices", "page-stablecoins-editors-choice-intro": "These are probably the best-known examples of stablecoins right now and the coins we've found useful when using dapps.", "page-stablecoins-explore-dapps": "Explore dapps", - "page-stablecoins-explore-apps": "Explore ..apps", + "page-stablecoins-explore-apps": "Explore apps", "page-stablecoins-fiat-backed": "Fiat backed", "page-stablecoins-fiat-backed-con-1": "Centralized – someone must issue the tokens.", "page-stablecoins-fiat-backed-con-2": "Requires auditing to ensure company has sufficient reserves.", diff --git a/src/lib/types/ab-testing.ts b/src/lib/types/ab-testing.ts deleted file mode 100644 index a317d640380..00000000000 --- a/src/lib/types/ab-testing.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ReactNode } from "react" - -export type ABTestConfig = { - name: string - id: string - variants: { - name: string - weight: number - }[] - enabled: boolean -} - -export type ABTestAssignment = { - experimentId: string - experimentName: string - variant: string - assignedAt: number -} - -// Type-safe tuple for at least 2 variants -type Element = ReactNode | JSX.Element | string -export type ABTestVariants = [Element, Element, ...Element[]] diff --git a/src/lib/utils/ab-testing-config.ts b/src/lib/utils/ab-testing-config.ts deleted file mode 100644 index 3f7c0e0c4a5..00000000000 --- a/src/lib/utils/ab-testing-config.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { ABTestConfig } from "@/lib/types/ab-testing" - -function getEnvVar(key: string, defaultValue: string = ""): string { - return process.env[key] || defaultValue -} - -function parseVariantWeights( - envKey: string -): { name: string; weight: number }[] { - // Format: "original:50,variant_b:30,variant_c:20" - const variantString = getEnvVar(envKey, "original:100") - - return variantString.split(",").map((variant) => { - const [name, weight] = variant.split(":") - return { - name: name.trim(), - weight: parseInt(weight.trim()) || 0, - } - }) -} - -export const getABTestConfigs = (): Record => { - return { - // Example test - you can add more here - homepagePersonaCTAs: { - name: "HomepagePersonaCTAs", - id: getEnvVar("ABTEST_HOMEPAGE_PERSONA_CTAS_ID", "1"), - enabled: getEnvVar("ABTEST_HOMEPAGE_PERSONA_CTAS_ENABLED") === "true", - variants: parseVariantWeights("ABTEST_HOMEPAGE_PERSONA_CTAS_VARIANTS"), - }, - // Add more tests as needed: - // walletCardLayout: { - // name: "WalletCardLayout", - // id: getEnvVar("ABTEST_WALLET_CARD_LAYOUT_ID", "2"), - // enabled: getEnvVar("ABTEST_WALLET_CARD_LAYOUT_ENABLED") === "true", - // variants: parseVariantWeights("ABTEST_WALLET_CARD_LAYOUT_VARIANTS") - // } - } -} diff --git a/src/lib/utils/ab-testing-server.ts b/src/lib/utils/ab-testing-server.ts deleted file mode 100644 index 3575c5f9cc0..00000000000 --- a/src/lib/utils/ab-testing-server.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { cookies } from "next/headers" - -import { ABTestAssignment, ABTestConfig } from "@/lib/types/ab-testing" - -import { getABTestConfigs } from "./ab-testing-config" - -const AB_TEST_COOKIE_PREFIX = "pk_ab_test" -const COOKIE_MAX_AGE = 60 * 60 * 24 * 30 // 30 days - -export async function getOrAssignABTest( - testKey: string -): Promise { - const configs = getABTestConfigs() - const testConfig = configs[testKey] - - if (!testConfig || !testConfig.enabled) { - return null - } - - const cookieStore = await cookies() - const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` - const existingAssignment = cookieStore.get(cookieName) - - if (existingAssignment?.value) { - try { - const parsed: ABTestAssignment = JSON.parse(existingAssignment.value) - // Validate that the variant still exists in current config - if (testConfig.variants.some((v) => v.name === parsed.variant)) { - return parsed - } - } catch { - // Invalid cookie, will reassign below - } - } - - // Assign new variant based on weights - const variant = assignVariant(testConfig) - const assignment: ABTestAssignment = { - experimentId: testConfig.id, - experimentName: testConfig.name, - variant: variant.name, - assignedAt: Date.now(), - } - - // Set cookie for future requests - cookieStore.set(cookieName, JSON.stringify(assignment), { - maxAge: COOKIE_MAX_AGE, - httpOnly: false, // Needs to be accessible by client for potential debugging - secure: process.env.NODE_ENV === "production", - sameSite: "lax", - path: "/", - }) - - return assignment -} - -function assignVariant(config: ABTestConfig) { - const totalWeight = config.variants.reduce( - (sum, variant) => sum + variant.weight, - 0 - ) - - // Handle case where total weight is 0 - if (totalWeight === 0) { - return config.variants[0] - } - - const random = Math.random() * totalWeight - let cumulativeWeight = 0 - - for (const variant of config.variants) { - cumulativeWeight += variant.weight - if (random <= cumulativeWeight) { - return variant - } - } - - return config.variants[0] -} - -function getVariantIndex(variantName: string, testKey: string): number { - const configs = getABTestConfigs() - const testConfig = configs[testKey] - - if (!testConfig) return 0 - - const variantIndex = testConfig.variants.findIndex( - (v) => v.name === variantName - ) - return variantIndex >= 0 ? variantIndex : 0 -} - -export { getVariantIndex } From 54e7e247112d4b5ec2f44398e380860c4ce8e079 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 24 Jun 2025 21:35:09 -0700 Subject: [PATCH 187/368] fix: resolve AB testing cookie persistence and infinite refresh issues - Fix cookie prefix synchronization between server and client - Prevent infinite re-render loops in server components - Improve debug panel state management with useTransition - Add proper loading states and error handling - Enhance debug panel UX with reset buttons and tooltips --- src/components/Matomo.tsx | 10 +++++++++- src/lib/utils/matomo.ts | 4 ---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/Matomo.tsx b/src/components/Matomo.tsx index 297d2e25ead..6f77cce7ba7 100644 --- a/src/components/Matomo.tsx +++ b/src/components/Matomo.tsx @@ -2,7 +2,11 @@ import { useEffect, useState } from "react" import { usePathname } from "next/navigation" -import { init, push } from "@socialgouv/matomo-next" +import { init /* , push */ } from "@socialgouv/matomo-next" + +const push = (args: unknown[]) => { + console.log(`[Matomo] push called with args:`, args) +} export default function Matomo() { const pathname = usePathname() @@ -17,6 +21,10 @@ export default function Matomo() { siteId: process.env.NEXT_PUBLIC_MATOMO_SITE_ID!, }) + console.log( + "[Matomo] initialized with URL:", + process.env.NEXT_PUBLIC_MATOMO_URL + ) setInited(true) } }, [inited]) diff --git a/src/lib/utils/matomo.ts b/src/lib/utils/matomo.ts index e46df4ca6d8..c66b3db1664 100644 --- a/src/lib/utils/matomo.ts +++ b/src/lib/utils/matomo.ts @@ -23,8 +23,4 @@ export const trackCustomEvent = ({ // Set custom URL removing any query params or hash fragments window && push([`setCustomUrl`, window.location.href.replace(/[?#].*$/, "")]) push([`trackEvent`, eventCategory, eventAction, eventName, eventValue]) - - console.debug( - `[Matomo] event tracked, category: ${eventCategory}, action: ${eventAction}, name: ${eventName}, value: ${eventValue}` - ) } From ad6e9f5f724f485f38bf6e93422e118b4d637ffc Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 10:21:23 +0000 Subject: [PATCH 188/368] fix: align mail icon in buttons properly Remove align-middle from Mail icon in BaseLink component to fix misalignment in buttons. The parent Button component already uses items-center for proper vertical centering, and align-middle was causing conflicts. Fixes the "Get in touch" button icon alignment issue on enterprise page. Co-authored-by: Joshua --- src/components/ui/Link.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/Link.tsx b/src/components/ui/Link.tsx index b5a00d10fbe..ed31816d56c 100644 --- a/src/components/ui/Link.tsx +++ b/src/components/ui/Link.tsx @@ -105,7 +105,7 @@ export const BaseLink = forwardRef(function Link( {isMailto ? ( {!hideArrow && ( - + )} {children} From 43dec94fd744e4567b193bbd2904b5e40ebe7745 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:30:21 +0000 Subject: [PATCH 189/368] fix: update community page "why get involved" section styling - Remove background color (bg-[#ccfcff] and dark:bg-[#293233]) - Remove fixed height (h-full and lg:h-[720px]) - Make h2 4xl on desktop (lg:text-4xl) - Remove mb-8 margin from h2 parent container Fixes #15718 Co-authored-by: Joshua --- app/[locale]/community/_components/community.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/[locale]/community/_components/community.tsx b/app/[locale]/community/_components/community.tsx index 3643d218505..db68863f4db 100644 --- a/app/[locale]/community/_components/community.tsx +++ b/app/[locale]/community/_components/community.tsx @@ -160,10 +160,10 @@ const CommunityPage = () => { - + - -

    {t("page-community-why-get-involved-title")}

    + +

    {t("page-community-why-get-involved-title")}

    {whyGetInvolvedCards.map((card, idx) => ( From 275acc8481e7ba3a284035c3c04b5969a8250d69 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 25 Jun 2025 07:45:30 -0700 Subject: [PATCH 190/368] fix: preview deploy logic refactor to use IS_PROD and IS_PREVIEW_DEPLOY variables --- src/components/AB/TestDebugPanel.tsx | 6 +++--- src/components/AB/TestTracker.tsx | 6 ++++-- src/components/AB/TestWrapper.tsx | 4 +++- src/lib/ab-testing/actions.ts | 6 ++++-- src/lib/ab-testing/server.ts | 4 +++- src/lib/utils/env.ts | 1 + src/lib/utils/matomo.ts | 4 +++- 7 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/components/AB/TestDebugPanel.tsx b/src/components/AB/TestDebugPanel.tsx index 4925e842e92..8b32ee0f011 100644 --- a/src/components/AB/TestDebugPanel.tsx +++ b/src/components/AB/TestDebugPanel.tsx @@ -3,6 +3,8 @@ import { useEffect, useState, useTransition } from "react" import { useRouter } from "next/navigation" +import { IS_PREVIEW_DEPLOY, IS_PROD } from "@/lib/utils/env" + import { clearABTestCookie, forceABTestVariant } from "@/lib/ab-testing/actions" import { ABTestAssignment } from "@/lib/ab-testing/types" @@ -64,9 +66,7 @@ export function ABTestDebugPanel({ window.location.reload() } - if (process.env.NODE_ENV === "production") { - return null - } + if (IS_PROD && !IS_PREVIEW_DEPLOY) return null return (
    - {process.env.NODE_ENV !== "production" && ( + {(!IS_PROD || IS_PREVIEW_DEPLOY) && ( { - if (process.env.NODE_ENV !== "production") return + if (!IS_PROD) return const optedOutValue = localStorage.getItem(MATOMO_LS_KEY) || "false" const isOptedOut = JSON.parse(optedOutValue) if (isOptedOut) return From 5017e192c291fb649d075c1e985f30ab43352153 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 25 Jun 2025 11:49:51 -0700 Subject: [PATCH 191/368] fix: Check icon details convert checkmark.svg usage to Lucide Check; rm .svg --- app/[locale]/enterprise/page.tsx | 12 ++++++++++-- src/components/Homepage/ValuesMarquee/index.tsx | 7 ++++++- src/components/icons/checkmark.svg | 4 ---- 3 files changed, 16 insertions(+), 7 deletions(-) delete mode 100644 src/components/icons/checkmark.svg diff --git a/app/[locale]/enterprise/page.tsx b/app/[locale]/enterprise/page.tsx index 6968e5d0dd8..38ce18ebea1 100644 --- a/app/[locale]/enterprise/page.tsx +++ b/app/[locale]/enterprise/page.tsx @@ -1,3 +1,4 @@ +import { Check } from "lucide-react" import dynamic from "next/dynamic" import { getTranslations } from "next-intl/server" @@ -5,7 +6,6 @@ import type { Lang, StatsBoxMetric } from "@/lib/types" import ActivityStats from "@/components/ActivityStats" import { HubHero } from "@/components/Hero" -import Checkmark from "@/components/icons/checkmark.svg" import Adidas from "@/components/icons/enterprise/adidas.svg" import Azure from "@/components/icons/enterprise/azure.svg" import BancoSantander from "@/components/icons/enterprise/banco-santander.svg" @@ -465,7 +465,15 @@ const Page = async ({ params }: { params: { locale: Lang } }) => { key={header} className="grid h-fit grid-cols-[auto,1fr] gap-x-3" > - +
    + +

    {header}

    {content}

    diff --git a/src/components/Homepage/ValuesMarquee/index.tsx b/src/components/Homepage/ValuesMarquee/index.tsx index 1fa4d97a692..c623ab45aa1 100644 --- a/src/components/Homepage/ValuesMarquee/index.tsx +++ b/src/components/Homepage/ValuesMarquee/index.tsx @@ -195,7 +195,12 @@ const ValuesMarquee = ({ eventCategory={eventCategory} direction={direction} > - + {pairing.ethereum.label} ))} diff --git a/src/components/icons/checkmark.svg b/src/components/icons/checkmark.svg deleted file mode 100644 index d4def9c1a5b..00000000000 --- a/src/components/icons/checkmark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - From bf1ac8fa71f394fc885ea7e1cb735dd11199eef1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:35:52 -0700 Subject: [PATCH 192/368] feat: add root redirect default locale --- app/page.tsx | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 app/page.tsx diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 00000000000..2dc343042df --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,7 @@ +import { redirect } from "next/navigation" + +import { DEFAULT_LOCALE } from "@/lib/constants" + +export default function RedirectPage() { + redirect(DEFAULT_LOCALE) +} From 979df20ee264698c48b816d3b8a60bebaadb7e05 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:05:24 -0700 Subject: [PATCH 193/368] fix: make env var public --- src/components/AB/TestDebugPanel.tsx | 4 ---- src/components/Matomo.tsx | 4 +++- src/lib/utils/env.ts | 3 ++- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/AB/TestDebugPanel.tsx b/src/components/AB/TestDebugPanel.tsx index 8b32ee0f011..4a6973683fb 100644 --- a/src/components/AB/TestDebugPanel.tsx +++ b/src/components/AB/TestDebugPanel.tsx @@ -3,8 +3,6 @@ import { useEffect, useState, useTransition } from "react" import { useRouter } from "next/navigation" -import { IS_PREVIEW_DEPLOY, IS_PROD } from "@/lib/utils/env" - import { clearABTestCookie, forceABTestVariant } from "@/lib/ab-testing/actions" import { ABTestAssignment } from "@/lib/ab-testing/types" @@ -66,8 +64,6 @@ export function ABTestDebugPanel({ window.location.reload() } - if (IS_PROD && !IS_PREVIEW_DEPLOY) return null - return (
    { console.log(`[Matomo] push called with args:`, args) } @@ -15,7 +17,7 @@ export default function Matomo() { const [previousPath, setPreviousPath] = useState("") useEffect(() => { - if (!process.env.IS_PREVIEW_DEPLOY && !inited) { + if (!IS_PREVIEW_DEPLOY && !inited) { init({ url: process.env.NEXT_PUBLIC_MATOMO_URL!, siteId: process.env.NEXT_PUBLIC_MATOMO_SITE_ID!, diff --git a/src/lib/utils/env.ts b/src/lib/utils/env.ts index 6b45f5603a9..e5b8db2fb38 100644 --- a/src/lib/utils/env.ts +++ b/src/lib/utils/env.ts @@ -1,3 +1,4 @@ export const IS_DEV = process.env.NODE_ENV === "development" export const IS_PROD = process.env.NODE_ENV === "production" -export const IS_PREVIEW_DEPLOY = process.env.IS_PREVIEW_DEPLOY === "true" +export const IS_PREVIEW_DEPLOY = + process.env.NEXT_PUBLIC_IS_PREVIEW_DEPLOY === "true" From 8d4eca9211c2c0d563fc1657ce6239f6d5866b31 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:05:58 -0700 Subject: [PATCH 194/368] revert: push logging override --- src/components/Matomo.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/Matomo.tsx b/src/components/Matomo.tsx index 7c988251b81..5ef774d0ff4 100644 --- a/src/components/Matomo.tsx +++ b/src/components/Matomo.tsx @@ -2,14 +2,10 @@ import { useEffect, useState } from "react" import { usePathname } from "next/navigation" -import { init /* , push */ } from "@socialgouv/matomo-next" +import { init, push } from "@socialgouv/matomo-next" import { IS_PREVIEW_DEPLOY } from "@/lib/utils/env" -const push = (args: unknown[]) => { - console.log(`[Matomo] push called with args:`, args) -} - export default function Matomo() { const pathname = usePathname() From 0760d448dc56a0e603d8de7f4f6b361f9a8c5629 Mon Sep 17 00:00:00 2001 From: yj <84749041+uniyj@users.noreply.github.com> Date: Thu, 26 Jun 2025 12:51:24 +0100 Subject: [PATCH 195/368] fix broken link --- public/content/developers/docs/apis/json-rpc/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/apis/json-rpc/index.md b/public/content/developers/docs/apis/json-rpc/index.md index 9f403fc1549..fb7e356d71a 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -26,7 +26,7 @@ An internal API is also used for inter-client communication within a node - that ## Execution client spec {#spec} -[Read the full JSON-RPC API spec on GitHub](https://github.com/ethereum/execution-apis). This API is documented on the [Execution API webpage](https://ethereum.github.io/execution-apis/api-documentation/) and includes an Inspector to try out all the available methods. +[Read the full JSON-RPC API spec on GitHub](https://github.com/ethereum/execution-apis). This API is documented on the [Execution API webpage](https://ethereum.github.io/execution-apis/) and includes an Inspector to try out all the available methods. ## Conventions {#conventions} From 02ccac5267e3934c8513fe91911f0b054af6c407 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 09:34:51 -0700 Subject: [PATCH 196/368] fix: merge-conflict regressions --- CLAUDE.md | 2 +- src/components/Nav/Client/index.tsx | 4 ++-- src/components/Nav/useThemeToggle.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 6cca6012642..990d67f59dc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -179,7 +179,7 @@ pnpm events-import # Import community events - `@radix-ui/*` - Accessible component primitives - `tailwind-variants` - Component variant patterns - `framer-motion` - Animation library -- `react-icons` - Icon library +- `lucide-react` - Icon library ### Content & Data diff --git a/src/components/Nav/Client/index.tsx b/src/components/Nav/Client/index.tsx index 137000918fc..79579556b7c 100644 --- a/src/components/Nav/Client/index.tsx +++ b/src/components/Nav/Client/index.tsx @@ -3,8 +3,8 @@ import { useRef } from "react" import dynamic from "next/dynamic" import { useLocale } from "next-intl" -import { BsTranslate } from "react-icons/bs" +import Translate from "@/components/icons/translate.svg" import SearchButton from "@/components/Search/SearchButton" import SearchInputButton from "@/components/Search/SearchInputButton" import { Skeleton } from "@/components/ui/skeleton" @@ -145,7 +145,7 @@ const ClientSideNav = () => { variant="ghost" className="animate-fade-in gap-0 px-2 text-body transition-transform duration-500 active:bg-primary-low-contrast active:text-primary-hover data-[state='open']:bg-primary-low-contrast data-[state='open']:text-primary-hover max-md:hidden xl:px-3 [&_svg]:transition-transform [&_svg]:duration-500 [&_svg]:hover:rotate-12" > - + {t("languages")}  {locale!.toUpperCase()} diff --git a/src/components/Nav/useThemeToggle.ts b/src/components/Nav/useThemeToggle.ts index eac7ce589f3..21ce62fc739 100644 --- a/src/components/Nav/useThemeToggle.ts +++ b/src/components/Nav/useThemeToggle.ts @@ -1,5 +1,5 @@ +import { Moon, Sun } from "lucide-react" import { useTheme } from "next-themes" -import { MdBrightness2, MdWbSunny } from "react-icons/md" import { trackCustomEvent } from "@/lib/utils/matomo" @@ -10,7 +10,7 @@ import useTranslation from "@/hooks/useTranslation" export const useThemeToggle = () => { const { t } = useTranslation("common") const { setTheme, resolvedTheme } = useTheme() - const ThemeIcon = useColorModeValue(MdBrightness2, MdWbSunny) + const ThemeIcon = useColorModeValue(Moon, Sun) const toggleColorMode = () => { const targetTheme = resolvedTheme === "dark" ? "light" : "dark" From d4b1632a593af60577e9c5f402df2ec4e20820fd Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 12:18:12 -0700 Subject: [PATCH 197/368] fix: find-wallets icon pixel details --- src/components/FindWalletProductTable/WalletInfo.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/FindWalletProductTable/WalletInfo.tsx b/src/components/FindWalletProductTable/WalletInfo.tsx index f7920c8a277..e93ce92e4c0 100644 --- a/src/components/FindWalletProductTable/WalletInfo.tsx +++ b/src/components/FindWalletProductTable/WalletInfo.tsx @@ -150,12 +150,12 @@ const WalletInfo = ({ wallet, isExpanded }: WalletInfoProps) => { > {deviceLabels.length > 0 && (
    - +

    {deviceLabels.join(" · ")}

    )}
    - +

    {formatStringList(wallet.supportedLanguages, 5)}{" "} { Date: Thu, 26 Jun 2025 12:23:27 -0700 Subject: [PATCH 198/368] fix: Info icon pixel alignment --- .../_components/what-is-ethereum.tsx | 12 ++++++------ src/components/BannerGrid/BannerGrid.stories.tsx | 4 ++-- src/components/Staking/StakingStatsBox.tsx | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx b/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx index b7f071c6b6b..828519e940b 100644 --- a/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx +++ b/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx @@ -488,7 +488,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -511,7 +511,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -534,7 +534,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -559,7 +559,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -585,7 +585,7 @@ const WhatIsEthereumPage = ({ })} > - + @@ -611,7 +611,7 @@ const WhatIsEthereumPage = ({ })} > - + diff --git a/src/components/BannerGrid/BannerGrid.stories.tsx b/src/components/BannerGrid/BannerGrid.stories.tsx index a8e428e44f4..e3c824d1159 100644 --- a/src/components/BannerGrid/BannerGrid.stories.tsx +++ b/src/components/BannerGrid/BannerGrid.stories.tsx @@ -127,7 +127,7 @@ export const BannerGridCell: Story = { })} > - + @@ -163,7 +163,7 @@ export const BannerGrid: Story = { })} > - + diff --git a/src/components/Staking/StakingStatsBox.tsx b/src/components/Staking/StakingStatsBox.tsx index 9e1646f316a..91b722bcf9f 100644 --- a/src/components/Staking/StakingStatsBox.tsx +++ b/src/components/Staking/StakingStatsBox.tsx @@ -31,7 +31,7 @@ const Label = ({ children }: ChildOnlyProp) => ( // BeaconchainTooltip component const BeaconchainTooltip = ({ children }: ChildOnlyProp) => ( - + ) From 1deb08999b2a9708794ebc876280301f6b927a65 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 13:07:25 -0700 Subject: [PATCH 199/368] docs: update Lucide icons docs guidelines --- docs/best-practices.md | 67 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/docs/best-practices.md b/docs/best-practices.md index 080fabe6c51..b735ceeec9b 100644 --- a/docs/best-practices.md +++ b/docs/best-practices.md @@ -166,15 +166,74 @@ import Emoji from "./Emoji" ; // the base fontSize is `md` ``` -- **Icons**: We use [Lucide](https://lucide.dev/icons/) for icons +## Icons: Lucide + +We use [Lucide](https://lucide.dev/icons/) for icons, imported via the [lucide-react](https://www.npmjs.com/package/lucide-react) package. + +Lucide icons by default use strokes only, with default 2px stroke width, rounded line-caps and line-joins, and follow `currentColor`. + +### Basic Usage + +```tsx +import { Heart } from "lucide-react" +; +``` + +### Sizing + +Use tailwind classes to size icons: + +- **Static**: example: `size-6` (24px), `size-4` (16px), etc. +- **Mirror `fontSize`**: `size-[1em]`, `size-[0.875em]` to match surrounding text +- **Custom (avoid)**: `size-[50px]` for specific dimensions + +```tsx + +``` + +### Coloring + +- **Stroke color**: Follows `currentColor`, use `text-*` classes (e.g., `text-primary`, `text-accent-a`) +- **Fill**: Avoid using in most cases to maintain consistent theming ```tsx -import { CircleHelp } from "lucide-react" + +``` + +### Stroke Properties + +- **`strokeWidth`**: example: `stroke-[3]` (use Tailwind classes), +- **`strokeLinecap`/`strokeLinejoin`**: Use props directly on the icon component + + ```tsx + import { Check } from "lucide-react" + ; + ``` -// Use tailwind classes to style, using fontSize for sizing -; // 24px size + Options: + - `strokeLinecap`: `butt`, `round`, `square` + - `strokeLinejoin`: `round`, `bevel`, `miter`, ` + +### Background Circles + +Wrap icon in a div for circular backgrounds, and color using background: + +```tsx +

    + +
    ``` +### Repository Preferences + +1. **Preferred**: Lucide out-of-box with color styling +2. **Acceptable**: Lucide with stroke property adjustments +3. **Last resort**: Custom `.svg` imports + ## Using custom `Image` component [Next Image](https://nextjs.org/docs/pages/api-reference/components/image) is the component of choice to handle responsive images. However, we use a custom version of this component that is properly optimized with Chakra. This way we can use style props from Chakra but still be able to forward common or Next Image-specific props to the component for correct usage and rendering. From a322fb496d8f292d4e63b13cf65985fa427f97c1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 13:09:26 -0700 Subject: [PATCH 200/368] refactor: use lucide, className stroke widths --- app/[locale]/enterprise/page.tsx | 4 +--- src/components/Homepage/ValuesMarquee/index.tsx | 3 +-- src/components/ProductTable/PresetFilters.tsx | 15 +++------------ 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/app/[locale]/enterprise/page.tsx b/app/[locale]/enterprise/page.tsx index 38ce18ebea1..f28a4941ca9 100644 --- a/app/[locale]/enterprise/page.tsx +++ b/app/[locale]/enterprise/page.tsx @@ -469,9 +469,7 @@ const Page = async ({ params }: { params: { locale: Lang } }) => {

    {header}

    diff --git a/src/components/Homepage/ValuesMarquee/index.tsx b/src/components/Homepage/ValuesMarquee/index.tsx index c623ab45aa1..70469715291 100644 --- a/src/components/Homepage/ValuesMarquee/index.tsx +++ b/src/components/Homepage/ValuesMarquee/index.tsx @@ -196,8 +196,7 @@ const ValuesMarquee = ({ direction={direction} > diff --git a/src/components/ProductTable/PresetFilters.tsx b/src/components/ProductTable/PresetFilters.tsx index 005af344e43..98541455cef 100644 --- a/src/components/ProductTable/PresetFilters.tsx +++ b/src/components/ProductTable/PresetFilters.tsx @@ -1,3 +1,5 @@ +import { Check } from "lucide-react" + import type { TPresetFilters } from "@/lib/types" import { cn } from "@/lib/utils/cn" @@ -77,18 +79,7 @@ const PresetFilters = ({ )} > {activePresets.includes(idx) && ( - - - + )}

    Date: Thu, 26 Jun 2025 13:13:28 -0700 Subject: [PATCH 201/368] fix: mailto icon; px adjust; re-enable on cta --- app/[locale]/10years/page.tsx | 2 +- src/components/ui/Link.tsx | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/[locale]/10years/page.tsx b/app/[locale]/10years/page.tsx index b412ac30b11..77eabb5bd08 100644 --- a/app/[locale]/10years/page.tsx +++ b/app/[locale]/10years/page.tsx @@ -348,7 +348,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { />

    {t("page-10-year-ideas-title")}

    {t("page-10-year-ideas-description")}

    - + {t("page-10-year-ideas-cta")} diff --git a/src/components/ui/Link.tsx b/src/components/ui/Link.tsx index 79e6202d434..b28044e882c 100644 --- a/src/components/ui/Link.tsx +++ b/src/components/ui/Link.tsx @@ -105,7 +105,9 @@ export const BaseLink = forwardRef(function Link( > {isMailto ? ( - {!hideArrow && } + {!hideArrow && ( + + )} {children} ) : ( From 4db1ca88078ede1bef97aba1b925dc384fead1c0 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 15:58:39 -0700 Subject: [PATCH 202/368] fix: update A/B testing cookie handling and naming conventions --- docs/ab-testing.md | 4 ++-- src/components/AB/TestDebugPanel.tsx | 32 +++++++++++++++++++++++++++- src/lib/ab-testing/actions.ts | 5 ++--- src/lib/ab-testing/server.ts | 5 ++--- src/lib/constants.ts | 1 + 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/docs/ab-testing.md b/docs/ab-testing.md index 4ae1a40f350..49e72b16236 100644 --- a/docs/ab-testing.md +++ b/docs/ab-testing.md @@ -150,13 +150,13 @@ ABTEST_WALLET_LAYOUT_VARIANTS="original:40,list:30,grid:20,carousel:10" 4. Check browser console for Matomo debug logs ### Same Variant Always Shows -1. Clear cookies: `pk_ab_test[testname]` +1. Clear cookies: `_pk_abtest_[testname]` 2. Check variant weights are > 0 3. Verify random assignment logic ## Architecture Notes -- **Cookies**: Uses `pk_ab_test[testKey]` following Matomo naming conventions +- **Cookies**: Uses `_pk_abtest_[testKey]` following Matomo naming conventions - **Persistence**: 30 days (compliant with existing cookie policy) - **SSR**: True server-side rendering with no hydration mismatches - **Fallbacks**: Graceful degradation when tests are disabled or fail diff --git a/src/components/AB/TestDebugPanel.tsx b/src/components/AB/TestDebugPanel.tsx index 4a6973683fb..dccea97949b 100644 --- a/src/components/AB/TestDebugPanel.tsx +++ b/src/components/AB/TestDebugPanel.tsx @@ -3,6 +3,8 @@ import { useEffect, useState, useTransition } from "react" import { useRouter } from "next/navigation" +import { AB_TEST_COOKIE_PREFIX } from "@/lib/constants" + import { clearABTestCookie, forceABTestVariant } from "@/lib/ab-testing/actions" import { ABTestAssignment } from "@/lib/ab-testing/types" @@ -27,10 +29,27 @@ export function ABTestDebugPanel({ setLocalAssignment(currentAssignment) }, [currentAssignment]) + const cookieName = AB_TEST_COOKIE_PREFIX + testKey + // Check if cookie exists client-side and set fallback if needed + useEffect(() => { + if (currentAssignment) { + const cookieExists = document.cookie.includes(cookieName) + + if (!cookieExists) { + console.log(`[AB Test Debug] Setting fallback cookie for ${testKey}`) + document.cookie = `${cookieName}=${JSON.stringify(currentAssignment)}; max-age=${60 * 60 * 24 * 30}; path=/; samesite=lax` + } + } + }, [cookieName, currentAssignment, testKey]) + const forceVariant = async (variantName: string) => { try { const newAssignment = await forceABTestVariant(testKey, variantName) setLocalAssignment(newAssignment) + + // Fallback: Set cookie client-side if server action doesn't persist + document.cookie = `${cookieName}=${JSON.stringify(newAssignment)}; max-age=${60 * 60 * 24 * 30}; path=/; samesite=lax` + // Use transition for smoother updates without full refresh startTransition(() => { router.refresh() @@ -43,6 +62,10 @@ export function ABTestDebugPanel({ const clearCookie = async () => { try { await clearABTestCookie(testKey) + + // Fallback: Clear cookie client-side as well + document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/` + setLocalAssignment(null) // Use transition for smoother updates without full refresh startTransition(() => { @@ -57,7 +80,7 @@ export function ABTestDebugPanel({ // Clear all AB test cookies and reload page document.cookie.split(";").forEach((cookie) => { const [name] = cookie.split("=") - if (name.trim().startsWith("_pk_abtest")) { + if (name.trim().startsWith(AB_TEST_COOKIE_PREFIX)) { document.cookie = `${name.trim()}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/` } }) @@ -104,6 +127,13 @@ export function ABTestDebugPanel({ Loading... )} +
    + Cookie:{" "} + {typeof window !== "undefined" && + document.cookie.includes(AB_TEST_COOKIE_PREFIX + testKey) + ? "✓ Set" + : "✗ Missing"} +
    Force Variant: diff --git a/src/lib/ab-testing/actions.ts b/src/lib/ab-testing/actions.ts index cb917375fce..f1dae78f61c 100644 --- a/src/lib/ab-testing/actions.ts +++ b/src/lib/ab-testing/actions.ts @@ -2,20 +2,19 @@ import { cookies } from "next/headers" +import { AB_TEST_COOKIE_PREFIX } from "../constants" import { IS_PROD } from "../utils/env" import { getABTestConfigs } from "./config" import { ABTestAssignment } from "./types" -const AB_TEST_COOKIE_PREFIX = "_pk_abtest" - // Server Action to set AB test assignment cookie export async function setABTestCookie( testKey: string, assignment: ABTestAssignment ) { const cookieStore = await cookies() - const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` + const cookieName = AB_TEST_COOKIE_PREFIX + testKey const maxAge = 60 * 60 * 24 * 30 // 30 days cookieStore.set(cookieName, JSON.stringify(assignment), { diff --git a/src/lib/ab-testing/server.ts b/src/lib/ab-testing/server.ts index 71add1e35e0..d9d3164b6bb 100644 --- a/src/lib/ab-testing/server.ts +++ b/src/lib/ab-testing/server.ts @@ -1,12 +1,11 @@ import { cookies } from "next/headers" +import { AB_TEST_COOKIE_PREFIX } from "../constants" import { IS_PROD } from "../utils/env" import { getABTestConfigs } from "./config" import { ABTestAssignment, ABTestConfig } from "./types" -const AB_TEST_COOKIE_PREFIX = "_pk_abtest" - export async function getABTestAssignment( testKey: string ): Promise { @@ -21,7 +20,7 @@ export async function getABTestAssignment( } const cookieStore = cookies() - const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` + const cookieName = AB_TEST_COOKIE_PREFIX + testKey const existingAssignment = cookieStore.get(cookieName) if (existingAssignment?.value) { diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 4e54ab33b2d..e531b657650 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -11,6 +11,7 @@ export const TRANSLATIONS_DIR = "public/content/translations" export const TRANSLATED_IMAGES_DIR = "/content/translations" export const PLACEHOLDER_IMAGE_DIR = "src/data/placeholders" export const INTL_JSON_DIR = "src/intl" +export const AB_TEST_COOKIE_PREFIX = "_pk_abtest_" export const NULL_VALUE = "—" From fc665d82bbc42e6d6f9715e003ba1360e6b373d7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 18:16:37 -0700 Subject: [PATCH 203/368] fix: mobile tag skeleton --- app/[locale]/developers/tutorials/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/developers/tutorials/page.tsx b/app/[locale]/developers/tutorials/page.tsx index e83bd857cf8..2ffdb50a6f0 100644 --- a/app/[locale]/developers/tutorials/page.tsx +++ b/app/[locale]/developers/tutorials/page.tsx @@ -22,7 +22,7 @@ const TutorialsList = dynamic(() => import("./_components/tutorials"), { ssr: false, loading: () => (
    -
    +
    {Array.from({ length: 30 }).map((_, index) => ( ))} From 528e2734ff9e281915a350fbfd3ac4dd19c66c93 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 18:33:52 -0700 Subject: [PATCH 204/368] feat: use lucide ExternalLink for tutorial cards --- .../developers/tutorials/_components/tutorials.tsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/[locale]/developers/tutorials/_components/tutorials.tsx b/app/[locale]/developers/tutorials/_components/tutorials.tsx index 32686b1ec2b..28d0e293ce1 100644 --- a/app/[locale]/developers/tutorials/_components/tutorials.tsx +++ b/app/[locale]/developers/tutorials/_components/tutorials.tsx @@ -8,6 +8,7 @@ import React, { useMemo, useState, } from "react" +import { ExternalLink } from "lucide-react" import { useLocale } from "next-intl" import { ITutorial, Lang } from "@/lib/types" @@ -267,13 +268,11 @@ const TutorialPage = ({ href={tutorial.href ?? undefined} > - + {tutorial.title} + {tutorial.isExternal && ( + + )} From e56478289331ced979188c6ab793698243654473 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 18:36:09 -0700 Subject: [PATCH 205/368] update: apple round linecap to hamburger/glyph Align with Lucide icon theming --- src/components/Nav/Mobile/HamburgerButton.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/Nav/Mobile/HamburgerButton.tsx b/src/components/Nav/Mobile/HamburgerButton.tsx index 15fa6f967a7..4c8ed4cdb71 100644 --- a/src/components/Nav/Mobile/HamburgerButton.tsx +++ b/src/components/Nav/Mobile/HamburgerButton.tsx @@ -39,6 +39,8 @@ const HamburgerButton = forwardRef( Date: Thu, 26 Jun 2025 19:32:57 -0700 Subject: [PATCH 206/368] update: use clipboard for copy icon --- .../deposit-contract/_components/deposit-contract.tsx | 9 +++------ src/components/CodeModal.tsx | 8 +++++--- src/components/Codeblock.tsx | 10 +++------- src/components/CopyToClipboard.tsx | 6 +++--- src/components/Homepage/CodeExamples.tsx | 8 +++++--- src/components/Simulator/WalletHome/AddressPill.tsx | 4 ++-- 6 files changed, 21 insertions(+), 24 deletions(-) diff --git a/app/[locale]/staking/deposit-contract/_components/deposit-contract.tsx b/app/[locale]/staking/deposit-contract/_components/deposit-contract.tsx index f806f1c260c..46144e8bf84 100644 --- a/app/[locale]/staking/deposit-contract/_components/deposit-contract.tsx +++ b/app/[locale]/staking/deposit-contract/_components/deposit-contract.tsx @@ -1,7 +1,7 @@ "use client" - import { useEffect, useState } from "react" import makeBlockie from "ethereum-blockies-base64" +import { Clipboard, ClipboardCheck } from "lucide-react" import type { ChildOnlyProp, TranslationKey } from "@/lib/types" @@ -375,16 +375,13 @@ const DepositContractPage = () => { {!isCopied ? ( <> - {t("page-staking-deposit-contract-copy")} + ) : ( <> - {t("page-staking-deposit-contract-copied")} + )} diff --git a/src/components/CodeModal.tsx b/src/components/CodeModal.tsx index 8ef3b3bae0c..938008a14bc 100644 --- a/src/components/CodeModal.tsx +++ b/src/components/CodeModal.tsx @@ -1,5 +1,5 @@ import { Children, type ReactElement } from "react" -import { Check, Copy } from "lucide-react" +import { Clipboard, ClipboardCheck } from "lucide-react" import { Button } from "./ui/buttons/Button" import { @@ -43,11 +43,13 @@ const CodeModal = ({ children, isOpen, setIsOpen, title }: CodeModalProps) => { > {hasCopied ? ( <> - {t("copied")} + {t("copied")} + ) : ( <> - {t("copy")} + {t("copy")} + )} diff --git a/src/components/Codeblock.tsx b/src/components/Codeblock.tsx index dc91bdea881..3e014544463 100644 --- a/src/components/Codeblock.tsx +++ b/src/components/Codeblock.tsx @@ -1,6 +1,6 @@ "use client" - import React, { useState } from "react" +import { Clipboard, ClipboardCheck } from "lucide-react" import Highlight, { defaultProps, Language, @@ -10,7 +10,6 @@ import Prism from "prism-react-renderer/prism" // https://github.com/FormidableLabs/prism-react-renderer/tree/master#custom-language-support import CopyToClipboard from "@/components/CopyToClipboard" -import Emoji from "@/components/Emoji" import { Flex } from "@/components/ui/flex" import { cn } from "@/lib/utils/cn" @@ -304,16 +303,13 @@ const Codeblock = ({ {!isCopied ? ( <> - {" "} {t("copy")} + ) : ( <> - {" "} {t("copied")} + )} diff --git a/src/components/CopyToClipboard.tsx b/src/components/CopyToClipboard.tsx index 82d04db92e4..f173ba42ba1 100644 --- a/src/components/CopyToClipboard.tsx +++ b/src/components/CopyToClipboard.tsx @@ -1,6 +1,6 @@ "use client" -import { CheckCircle, Copy } from "lucide-react" +import { Clipboard, ClipboardCheck } from "lucide-react" import { cn } from "@/lib/utils/cn" @@ -42,9 +42,9 @@ export const CopyButton = ({ message, ...props }: CopyButtonProps) => { return ( ) diff --git a/src/components/Homepage/CodeExamples.tsx b/src/components/Homepage/CodeExamples.tsx index 5768f272a5e..36cab10893f 100644 --- a/src/components/Homepage/CodeExamples.tsx +++ b/src/components/Homepage/CodeExamples.tsx @@ -1,7 +1,7 @@ "use client" import { Suspense, useState } from "react" -import { Check, Copy } from "lucide-react" +import { Clipboard, ClipboardCheck } from "lucide-react" import { useLocale } from "next-intl" import type { CodeExample } from "@/lib/interfaces" @@ -93,9 +93,11 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => { - {(hasCopied) => (hasCopied ? : )} + {(hasCopied) => + hasCopied ? : + }
    diff --git a/src/components/Simulator/WalletHome/AddressPill.tsx b/src/components/Simulator/WalletHome/AddressPill.tsx index 3bcd964d924..2e378672a5e 100644 --- a/src/components/Simulator/WalletHome/AddressPill.tsx +++ b/src/components/Simulator/WalletHome/AddressPill.tsx @@ -1,4 +1,4 @@ -import { Copy } from "lucide-react" +import { Clipboard } from "lucide-react" import { Flex, type FlexProps } from "@/components/ui/flex" @@ -17,7 +17,7 @@ export const AddressPill = ({ ...btnProps }: AddressPillProps) => ( {...btnProps} >

    {FAKE_DEMO_ADDRESS}

    - + ) From d2d42268325fed527ed4d67be89db7e67383c9f3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 19:33:33 -0700 Subject: [PATCH 207/368] update: upper-right/external arrows --- .../fa/zero-knowledge-proofs/index.md | 2 +- src/components/CardList.tsx | 5 ++++- src/components/EthPriceCard.tsx | 22 +++++++------------ src/components/Leaderboard.tsx | 7 +++--- src/components/StablecoinsTable.tsx | 12 +++++----- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/public/content/translations/fa/zero-knowledge-proofs/index.md b/public/content/translations/fa/zero-knowledge-proofs/index.md index cb47fa9a1c9..5e1408b84a7 100644 --- a/public/content/translations/fa/zero-knowledge-proofs/index.md +++ b/public/content/translations/fa/zero-knowledge-proofs/index.md @@ -108,7 +108,7 @@ lang: fa استفاده از MACI نیازمند اعتماد به هماهنگ‌کننده مبنی بر تبانی نکردن با رشوه‌دهندگان یا تلاش برای رشوه دادن رای‌دهندگان از سوی او است. هماهنگ‌کننده می‌تواند پیام‌های کاربران را رمزگشایی کند (برای ایجاد اثبات لازم است)، بنابراین آن‌ها می‌توانند نحوۀ رای دادن هر فرد را به‌ طور دقیق تایید کنند. -اما در مواردی که هماهنگ‌کننده صادق است، MACI ابزاری قدرتمند برای تضمین سلامت رای‌گیری آنچین است. این امر بیان‌کنندۀ دلیل محبوبیت آن در میان برنامه‌های تامین مالی ثانویه (مانند [↗clr.fund](https://clr.fund/#/about/maci)) است که به‌شدت بر صحت آرای تک‌تک افراد متکی است. +اما در مواردی که هماهنگ‌کننده صادق است، MACI ابزاری قدرتمند برای تضمین سلامت رای‌گیری آنچین است. این امر بیان‌کنندۀ دلیل محبوبیت آن در میان برنامه‌های تامین مالی ثانویه (مانند [clr.fund](https://clr.fund/#/about/maci)) است که به‌شدت بر صحت آرای تک‌تک افراد متکی است. [درباره MACI بیشتر بدانید](https://privacy-scaling-explorations.github.io/maci/). diff --git a/src/components/CardList.tsx b/src/components/CardList.tsx index f6230250eb6..91c9caf1b36 100644 --- a/src/components/CardList.tsx +++ b/src/components/CardList.tsx @@ -1,5 +1,6 @@ "use client" +import { ExternalLink } from "lucide-react" import TwImage, { type ImageProps } from "next/image" import type { ReactNode } from "react" @@ -72,7 +73,9 @@ const Card = ({
    {caption}
    )} - {isExternal && } + {isExternal && ( + + )}
    ) } diff --git a/src/components/EthPriceCard.tsx b/src/components/EthPriceCard.tsx index 394899dd7c9..6ea6cad5de9 100644 --- a/src/components/EthPriceCard.tsx +++ b/src/components/EthPriceCard.tsx @@ -1,7 +1,7 @@ "use client" import { useEffect, useState } from "react" -import { Info } from "lucide-react" +import { ArrowUpRight, Info } from "lucide-react" import { useLocale } from "next-intl" import type { LoadingState } from "@/lib/types" @@ -37,7 +37,7 @@ const EthPriceCard = ({ const [state, setState] = useState>({ loading: true, }) - const { isRtl } = useRtlFlip() + const { twFlipForRtl } = useRtlFlip() useEffect(() => { const fetchData = async () => { @@ -140,18 +140,12 @@ const EthPriceCard = ({ isNegativeChange ? "text-error" : "text-success" )} > - - {change} - + {change} + {isNegativeChange ? ( + + ) : ( + + )}
    ({t("last-24-hrs")}) diff --git a/src/components/Leaderboard.tsx b/src/components/Leaderboard.tsx index 046dcd50be5..8601e84c718 100644 --- a/src/components/Leaderboard.tsx +++ b/src/components/Leaderboard.tsx @@ -1,7 +1,10 @@ +import { ExternalLink } from "lucide-react" import { VisuallyHidden } from "@radix-ui/react-visually-hidden" import Emoji from "@/components/Emoji" +import { cn } from "@/lib/utils/cn" + import { GITHUB_URL } from "@/lib/constants" import { Avatar } from "./ui/avatar" @@ -83,9 +86,7 @@ const Leaderboard = ({ content, limit = 100 }: LeaderboardProps) => {
    {emoji && } - + ) diff --git a/src/components/StablecoinsTable.tsx b/src/components/StablecoinsTable.tsx index f47b23f8e11..3f55c21ebf7 100644 --- a/src/components/StablecoinsTable.tsx +++ b/src/components/StablecoinsTable.tsx @@ -1,7 +1,7 @@ "use client" import { Suspense, useState } from "react" -import { Filter } from "lucide-react" +import { ExternalLink, Filter } from "lucide-react" import type { StablecoinType } from "@/lib/types" @@ -188,7 +188,7 @@ const StablecoinsTable = ({ content, hasError }: StablecoinsTableProps) => { ({activeTypeCount}) )} - + {typeFilters.map((filter) => ( @@ -240,7 +240,7 @@ const StablecoinsTable = ({ content, hasError }: StablecoinsTableProps) => { {activePegCount !== totalPegCount && ( ({activePegCount}) )} - + {pegFilters.map((filter) => ( @@ -298,8 +298,10 @@ const StablecoinsTable = ({ content, hasError }: StablecoinsTableProps) => { {column} ))} {content && content[0]?.url && ( - - + + )} From 5fefd018c5d7ee582f7ab2ffa725977cfb73afc8 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 19:34:16 -0700 Subject: [PATCH 208/368] update: use Lucide Languages icon rm translate.svg icon --- src/components/Nav/Client/index.tsx | 4 ++-- src/components/Nav/Mobile/MenuFooter.tsx | 5 ++--- src/components/icons/translate.svg | 4 ---- 3 files changed, 4 insertions(+), 9 deletions(-) delete mode 100644 src/components/icons/translate.svg diff --git a/src/components/Nav/Client/index.tsx b/src/components/Nav/Client/index.tsx index 79579556b7c..24a862b98c8 100644 --- a/src/components/Nav/Client/index.tsx +++ b/src/components/Nav/Client/index.tsx @@ -1,10 +1,10 @@ "use client" import { useRef } from "react" +import { Languages } from "lucide-react" import dynamic from "next/dynamic" import { useLocale } from "next-intl" -import Translate from "@/components/icons/translate.svg" import SearchButton from "@/components/Search/SearchButton" import SearchInputButton from "@/components/Search/SearchInputButton" import { Skeleton } from "@/components/ui/skeleton" @@ -145,7 +145,7 @@ const ClientSideNav = () => { variant="ghost" className="animate-fade-in gap-0 px-2 text-body transition-transform duration-500 active:bg-primary-low-contrast active:text-primary-hover data-[state='open']:bg-primary-low-contrast data-[state='open']:text-primary-hover max-md:hidden xl:px-3 [&_svg]:transition-transform [&_svg]:duration-500 [&_svg]:hover:rotate-12" > - + {t("languages")}  {locale!.toUpperCase()} diff --git a/src/components/Nav/Mobile/MenuFooter.tsx b/src/components/Nav/Mobile/MenuFooter.tsx index 5a034d78da1..09eebc7717e 100644 --- a/src/components/Nav/Mobile/MenuFooter.tsx +++ b/src/components/Nav/Mobile/MenuFooter.tsx @@ -1,6 +1,5 @@ -import { Moon, Search, Sun } from "lucide-react" +import { Languages, Moon, Search, Sun } from "lucide-react" -import Translate from "@/components/icons/translate.svg" import LanguagePicker from "@/components/LanguagePicker" import { MOBILE_LANGUAGE_BUTTON_NAME } from "@/lib/constants" @@ -44,7 +43,7 @@ const MenuFooter = ({ - + {t("languages")} diff --git a/src/components/icons/translate.svg b/src/components/icons/translate.svg deleted file mode 100644 index 16e6bd24239..00000000000 --- a/src/components/icons/translate.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 45790bd0271edc7e04a808fc6a1cc7067ff79e9a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 26 Jun 2025 19:34:32 -0700 Subject: [PATCH 209/368] update: use Lucide Plus/Minus for ExpandIcon --- src/components/Nav/Mobile/ExpandIcon.tsx | 34 +++++------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/src/components/Nav/Mobile/ExpandIcon.tsx b/src/components/Nav/Mobile/ExpandIcon.tsx index 86600ce81ae..bceaa6f343f 100644 --- a/src/components/Nav/Mobile/ExpandIcon.tsx +++ b/src/components/Nav/Mobile/ExpandIcon.tsx @@ -1,34 +1,14 @@ -import { motion } from "framer-motion" - -const expandedPathVariants = { - closed: { - d: "M12 7.875V17.125", - transition: { duration: 0.1 }, - }, - open: { - d: "M12 12V12", - transition: { duration: 0.1 }, - }, -} +import { Minus, Plus } from "lucide-react" type ExpandIconProps = { isOpen: boolean } -const ExpandIcon = ({ isOpen }: ExpandIconProps) => ( - - - - -) +const ExpandIcon = ({ isOpen }: ExpandIconProps) => + isOpen ? ( + + ) : ( + + ) export default ExpandIcon From 2618712e0ffa1a099a9b87926bda41fdcfa1a015 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 09:48:58 +0000 Subject: [PATCH 210/368] fix: correct translation keys for developers learning tools page meta title Fix broken page title that was showing "page-developers-learning-tools-meta-title" instead of "Developer learning tools". The issue was caused by incorrect translation key syntax in the generateMetadata function. The namespace was being double-referenced, causing the translation to fail and display the raw key instead of the translated text. - Remove namespace prefix from translation keys since namespace is already set in getTranslations - Change "page-developers-learning-tools:page-learning-tools-meta-title" to "page-learning-tools-meta-title" - Change "page-developers-learning-tools:page-learning-tools-meta-desc" to "page-learning-tools-meta-desc" Fixes #15731 Co-authored-by: Jakub --- app/[locale]/developers/learning-tools/page.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/[locale]/developers/learning-tools/page.tsx b/app/[locale]/developers/learning-tools/page.tsx index fe74c14fd72..cb645c3ef27 100644 --- a/app/[locale]/developers/learning-tools/page.tsx +++ b/app/[locale]/developers/learning-tools/page.tsx @@ -48,10 +48,8 @@ export async function generateMetadata({ return await getMetadata({ locale, slug: ["developers", "learning-tools"], - title: t("page-developers-learning-tools:page-learning-tools-meta-title"), - description: t( - "page-developers-learning-tools:page-learning-tools-meta-desc" - ), + title: t("page-learning-tools-meta-title"), + description: t("page-learning-tools-meta-desc"), }) } From 167a46f8c7579a98fbdb7bf470b0813a848e792f Mon Sep 17 00:00:00 2001 From: corwintines <15589226+corwintines@users.noreply.github.com> Date: Fri, 27 Jun 2025 16:29:28 +0000 Subject: [PATCH 211/368] Update chains data --- src/data/chains.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/data/chains.ts b/src/data/chains.ts index 74517751ceb..e3d24094eeb 100644 --- a/src/data/chains.ts +++ b/src/data/chains.ts @@ -1451,6 +1451,17 @@ const chains = [ }, chain: "Liveplex OracleEVM Network", }, + { + name: "Reddio", + infoURL: "https://www.reddio.com", + chainId: 50342, + nativeCurrency: { + name: "Reddio", + symbol: "RDO", + decimals: 18, + }, + chain: "ETH", + }, { name: "BirdLayer", infoURL: "https://www.dodochain.com", From 2007381d7eec923db4e7b83b0880e60a08f77b91 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 27 Jun 2025 10:26:25 -0700 Subject: [PATCH 212/368] deprecte: unused translatathon banner --- .../Translatathon/TranslatathonBanner.tsx | 33 ------------------- src/layouts/Static.tsx | 2 -- 2 files changed, 35 deletions(-) delete mode 100644 src/components/Translatathon/TranslatathonBanner.tsx diff --git a/src/components/Translatathon/TranslatathonBanner.tsx b/src/components/Translatathon/TranslatathonBanner.tsx deleted file mode 100644 index 144b06aa9c4..00000000000 --- a/src/components/Translatathon/TranslatathonBanner.tsx +++ /dev/null @@ -1,33 +0,0 @@ -"use client" - -import DismissableBanner from "@/components/Banners/DismissableBanner" - -import { ButtonLink } from "../ui/buttons/Button" -import { Center } from "../ui/flex" - -import { usePathname } from "@/i18n/routing" - -export const TranslatathonBanner = () => { - const pathname = usePathname() - const todaysDate = new Date() - const translatathonStartDate = new Date("August 9, 2024 12:00:00 UTC") - - const showBanner = - pathname === "/contributing/translation-program/" || pathname === "/" - - return todaysDate < translatathonStartDate && showBanner ? ( - -
    -

    🚨 Applications for the 2024 Translathathon are open 🚨

    - - Learn more - -
    -
    - ) : ( - <> - ) -} diff --git a/src/layouts/Static.tsx b/src/layouts/Static.tsx index 0bd2a331ac0..03ddac7948d 100644 --- a/src/layouts/Static.tsx +++ b/src/layouts/Static.tsx @@ -28,7 +28,6 @@ import { import MeetupList from "@/components/MeetupList" import SocialListItem from "@/components/SocialListItem" import TableOfContents from "@/components/TableOfContents" -import { TranslatathonBanner } from "@/components/Translatathon/TranslatathonBanner" import Translation from "@/components/Translation" import TranslationChartImage from "@/components/TranslationChartImage" import { Flex, Stack } from "@/components/ui/flex" @@ -102,7 +101,6 @@ export const StaticLayout = ({ return (
    - Date: Fri, 27 Jun 2025 11:11:27 -0700 Subject: [PATCH 213/368] fix: link icons pixel details Set mailto icon to 1em me-1 and external arrow to 0.875em ms-1 default, each with mb-0.5 for custom pixel alignment, while remaining inline. Maz size applied of 1rem, limiting size but allowing to shrink for smaller text. Link's contained in ButtonLink are in a flex with gap, so appropriately margin override applied via `data-label='arrow'` selector. Uses inline-flex items-center, removes align-middle and bottom margins. --- src/components/ui/Link.tsx | 5 +++-- src/components/ui/buttons/Button.tsx | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/ui/Link.tsx b/src/components/ui/Link.tsx index b28044e882c..caccf62ae15 100644 --- a/src/components/ui/Link.tsx +++ b/src/components/ui/Link.tsx @@ -106,7 +106,7 @@ export const BaseLink = forwardRef(function Link( {isMailto ? ( {!hideArrow && ( - + )} {children} @@ -118,8 +118,9 @@ export const BaseLink = forwardRef(function Link( {!hideArrow && !isMailto && ( diff --git a/src/components/ui/buttons/Button.tsx b/src/components/ui/buttons/Button.tsx index a9faf4289b0..774e0703a49 100644 --- a/src/components/ui/buttons/Button.tsx +++ b/src/components/ui/buttons/Button.tsx @@ -166,7 +166,10 @@ const ButtonLink = React.forwardRef( > Date: Sat, 28 Jun 2025 12:27:37 -0700 Subject: [PATCH 214/368] feat: migrate learn page to ssr --- app/[locale]/learn/_components/learn.tsx | 705 ---------------------- app/[locale]/learn/page.tsx | 707 ++++++++++++++++++++++- 2 files changed, 685 insertions(+), 727 deletions(-) delete mode 100644 app/[locale]/learn/_components/learn.tsx diff --git a/app/[locale]/learn/_components/learn.tsx b/app/[locale]/learn/_components/learn.tsx deleted file mode 100644 index 428303a2b12..00000000000 --- a/app/[locale]/learn/_components/learn.tsx +++ /dev/null @@ -1,705 +0,0 @@ -"use client" - -import type { HTMLAttributes, ReactNode } from "react" - -import type { - ChildOnlyProp, - PageWithContributorsProps, - ToCItem, -} from "@/lib/types" - -import OriginalCard, { - type CardProps as OriginalCardProps, -} from "@/components/Card" -import DocLink from "@/components/DocLink" -import FeedbackCard from "@/components/FeedbackCard" -import FileContributors from "@/components/FileContributors" -import { HubHero } from "@/components/Hero" -import type { HubHeroProps } from "@/components/Hero/HubHero" -import { Image, type ImageProps } from "@/components/Image" -import LeftNavBar from "@/components/LeftNavBar" -import MainArticle from "@/components/MainArticle" -import { ContentContainer } from "@/components/MdComponents" -import { ButtonLink } from "@/components/ui/buttons/Button" -import { Center, Flex, Stack } from "@/components/ui/flex" -import InlineLink from "@/components/ui/Link" -import { ListItem, UnorderedList } from "@/components/ui/list" - -import useTranslation from "@/hooks/useTranslation" -import developersEthBlocks from "@/public/images/developers-eth-blocks.png" -import dogeComputer from "@/public/images/doge-computer.png" -import enterprise from "@/public/images/enterprise-eth.png" -import eth from "@/public/images/eth.png" -import financeTransparent from "@/public/images/finance_transparent.png" -import futureTransparent from "@/public/images/future_transparent.png" -import hackathon from "@/public/images/hackathon_transparent.png" -import heroImage from "@/public/images/heroes/learn-hub-hero.png" -import impact from "@/public/images/impact_transparent.png" -import infrastructureTransparent from "@/public/images/infrastructure_transparent.png" -import Layer2LearnHero from "@/public/images/layer-2/learn-hero.png" -import ethereumInside from "@/public/images/run-a-node/ethereum-inside.png" -import stablecoins from "@/public/images/stablecoins/hero.png" -import merge from "@/public/images/upgrades/merge.png" -import newRings from "@/public/images/upgrades/newrings.png" -import rhino from "@/public/images/upgrades/upgrade_rhino.png" -import dao from "@/public/images/use-cases/dao-2.png" -import wallet from "@/public/images/wallet.png" -import whatIsEth from "@/public/images/what-is-ethereum.png" - -// TODO: Migrate the original Card component before updating this -const Card = ({ children, ...props }: OriginalCardProps) => ( - - {children} - -) - -const CardImage = ({ children }: ChildOnlyProp) => ( -
    {children}
    -) - -const AdditionalDocReading = ({ - headingText, - docLinks, -}: { - headingText: string - docLinks: Array<{ href: string; label: string; isExternal?: boolean }> -}) => ( - -

    {headingText}

    - - {docLinks.map(({ label, ...rest }) => ( - - {label} - - ))} - -
    -) - -const Section = ({ - headingId, - headingTitle, - description, - children, -}: { - headingId: string - headingTitle: string - description?: string - children: ReactNode -}) => ( - -
    - -

    - {headingTitle} -

    - {description &&

    {description}

    } -
    - {children} -
    -
    -) - -const CardGrid = ({ children }: ChildOnlyProp) => ( -
    - {children} -
    -) - -const H3 = ({ children, ...props }: HTMLAttributes) => ( -

    - {children} -

    -) - -const ImageHeight200 = ({ src, alt }: ImageProps) => ( - {alt} -) - -const LearnPage = ({ - contributors, - lastEditLocaleTimestamp, -}: PageWithContributorsProps) => { - const { t } = useTranslation("page-learn") - - const tocItems = [ - { - id: "what-is-crypto-ethereum", - title: t("toc-what-is-crypto-ethereum"), - }, - { - id: "how-do-i-use-ethereum", - title: t("toc-how-do-i-use-ethereum"), - }, - { - id: "what-is-ethereum-used-for", - title: t("toc-what-is-ethereum-used-for"), - }, - { - id: "strengthen-the-ethereum-network", - title: t("toc-strengthen-the-ethereum-network"), - }, - { - id: "learn-about-the-ethereum-protocol", - title: t("toc-learn-about-the-ethereum-protocol"), - }, - { - id: "learn-about-the-ethereum-community", - title: t("toc-learn-about-the-ethereum-community"), - }, - { - id: "books-and-podcasts", - title: t("toc-books-and-podcasts"), - }, - ] - const tocData: ToCItem[] = tocItems.map(({ id, title }) => ({ - title, - url: "#" + id, - })) - - const heroContent: HubHeroProps = { - title: t("common:learn-hub"), - header: t("hero-header"), - description: t("hero-subtitle"), - heroImg: heroImage, - buttons: [ - { - content: t("hero-button-lets-get-started"), - toId: tocItems[0].id, - matomo: { - eventCategory: "learn hub hero buttons", - eventAction: "click", - eventName: "lets get started", - }, - }, - ], - } - - return ( -
    - - - - - - - -
    - - - <> - - - - - {t("what-is-ethereum-card-title")} - - - - - <> - - - - - {t("what-is-eth-card-title")} - - - - - <> - - - - - {t("what-is-web3-card-title")} - - - - - - -
    - -
    - - - <> - - - - - {t("what-is-a-wallet-card-title")} - - - - - <> - - - - - {t("find-a-wallet-button")} - - - - - <> - - - - - {t("ethereum-networks-card-button")} - - - - - - - -

    {t("things-to-consider-banner-title")}

    - - {t("things-to-consider-banner-1")} - - {t("things-to-consider-banner-2")}{" "} - - {t("things-to-consider-banner-layer-2")} - - . - - -
    -
    - -
    -
    - - -
    - -
    - - - <> - - - - - {t("defi-card-button")} - - - - - <> - - - - - {t("stablecoins-card-button")} - - - - - <> - - - - {t("nft-card-button")} - - - - <> - - - - {t("dao-card-button")} - - - - <> - - - - - {t("dapp-card-button")} - - - - - - - - - {t("common:decentralized-identity")} - - - - - {t("common:decentralized-social-networks")} - - - - - {t("common:decentralized-science")} - - - - - {t("play-to-earn")} - - - - - {t("fundraising-through-quadratic-funding")} - - -
  • - - {t("supply-chain-management")} - -
  • -
    -
    -
    -
    -
    - -
    - - - <> - - - - - {t("staking-ethereum-card-button")} - - - - - <> - - - - - {t("run-a-node-card-title")} - - - - -
    - -
    - - - <> - - - - - {t("energy-consumption-card-button")} - - - - - <> - - - - - {t("ethereum-upgrades-card-button")} - - - - - <> - - - - - {t("ethereum-whitepaper-card-button")} - - - - - - -
    - -
    - - - <> - - - - - {t("community-hub-card-button")} - - - - - <> - - - - - {t("get-involved-card-title")} - - - - - <> - - - - - {t("online-communities-card-button")} - - - - -
    - -
    - -

    {t("books-about-ethereum")}

    - - - - {t("cryptopians-title")} - {" "} - {t("cryptopians-description")} - - - - {t("out-of-the-ether-title")} - {" "} - {t("out-of-the-ether-description")} - - - - {t("the-infinite-machine-title")} - {" "} - {t("the-infinite-machine-description")} - - - - {t("mastering-ethereum-title")} - {" "} - {t("mastering-ethereum-description")} - - - - {t("proof-of-stake-title")} - {" "} - {t("proof-of-stake-description")} - - -

    {t("podcasts-about-ethereum")}

    - - - - {t("green-pill-title")} - {" "} - {t("green-pill-description")} - - - - {t("zeroknowledge-title")} - {" "} - {t("zeroknowledge-description")} - - - - {t("unchained-title")} - {" "} - {t("unchained-description")} - - - - {t("the-daily-gwei-title")} - {" "} - {t("the-daily-gwei-description")} - - - - {t("bankless-title")} - {" "} - {t("bankless-description")} - - -
    -
    - - - -
    -
    -
    -
    - ) -} - -export default LearnPage diff --git a/app/[locale]/learn/page.tsx b/app/[locale]/learn/page.tsx index 8e05a3d30fa..60c93e03264 100644 --- a/app/[locale]/learn/page.tsx +++ b/app/[locale]/learn/page.tsx @@ -1,41 +1,704 @@ -import { pick } from "lodash" -import { - getMessages, - getTranslations, - setRequestLocale, -} from "next-intl/server" +import { HTMLAttributes, ReactNode } from "react" +import { getTranslations } from "next-intl/server" +import type { ChildOnlyProp, ToCItem } from "@/lib/types" import type { CommitHistory, Lang, Params } from "@/lib/types" -import I18nProvider from "@/components/I18nProvider" +import OriginalCard, { + type CardProps as OriginalCardProps, +} from "@/components/Card" +import DocLink from "@/components/DocLink" +import FeedbackCard from "@/components/FeedbackCard" +import FileContributors from "@/components/FileContributors" +import { HubHero } from "@/components/Hero" +import type { HubHeroProps } from "@/components/Hero/HubHero" +import { Image, ImageProps } from "@/components/Image" +import LeftNavBar from "@/components/LeftNavBar" +import MainArticle from "@/components/MainArticle" +import { ContentContainer } from "@/components/MdComponents" +import { ButtonLink } from "@/components/ui/buttons/Button" +import { Center, Flex, Stack } from "@/components/ui/flex" +import InlineLink from "@/components/ui/Link" +import { ListItem, UnorderedList } from "@/components/ui/list" import { getAppPageContributorInfo } from "@/lib/utils/contributors" import { getMetadata } from "@/lib/utils/metadata" -import { getRequiredNamespacesForPage } from "@/lib/utils/translations" -import LearnPage from "./_components/learn" +import developersEthBlocks from "@/public/images/developers-eth-blocks.png" +import dogeComputer from "@/public/images/doge-computer.png" +import enterprise from "@/public/images/enterprise-eth.png" +import eth from "@/public/images/eth.png" +import financeTransparent from "@/public/images/finance_transparent.png" +import futureTransparent from "@/public/images/future_transparent.png" +import hackathon from "@/public/images/hackathon_transparent.png" +import heroImage from "@/public/images/heroes/learn-hub-hero.png" +import impact from "@/public/images/impact_transparent.png" +import infrastructureTransparent from "@/public/images/infrastructure_transparent.png" +import Layer2LearnHero from "@/public/images/layer-2/learn-hero.png" +import ethereumInside from "@/public/images/run-a-node/ethereum-inside.png" +import stablecoins from "@/public/images/stablecoins/hero.png" +import merge from "@/public/images/upgrades/merge.png" +import newRings from "@/public/images/upgrades/newrings.png" +import rhino from "@/public/images/upgrades/upgrade_rhino.png" +import dao from "@/public/images/use-cases/dao-2.png" +import wallet from "@/public/images/wallet.png" +import whatIsEth from "@/public/images/what-is-ethereum.png" -export default async function Page({ params }: { params: Promise }) { - const { locale } = await params +// TODO: Migrate the original Card component before updating this +const Card = ({ children, ...props }: OriginalCardProps) => ( + + {children} + +) + +const CardImage = ({ children }: ChildOnlyProp) => ( +
    {children}
    +) + +const AdditionalDocReading = ({ + headingText, + docLinks, +}: { + headingText: string + docLinks: Array<{ href: string; label: string; isExternal?: boolean }> +}) => ( + +

    {headingText}

    + + {docLinks.map(({ label, ...rest }) => ( + + {label} + + ))} + +
    +) + +const Section = ({ + headingId, + headingTitle, + description, + children, +}: { + headingId: string + headingTitle: string + description?: string + children: ReactNode +}) => ( + +
    + +

    + {headingTitle} +

    + {description &&

    {description}

    } +
    + {children} +
    +
    +) - setRequestLocale(locale) +const CardGrid = ({ children }: ChildOnlyProp) => ( +
    + {children} +
    +) - // Get i18n messages - const allMessages = await getMessages({ locale }) - const requiredNamespaces = getRequiredNamespacesForPage("/learn") - const messages = pick(allMessages, requiredNamespaces) +const H3 = ({ children, ...props }: HTMLAttributes) => ( +

    + {children} +

    +) + +const ImageHeight200 = ({ src, alt }: ImageProps) => ( + {alt} +) + +export default async function Page({ params }: { params: Promise }) { + const { locale } = await params + const t = await getTranslations({ locale, namespace: "page-learn" }) const commitHistoryCache: CommitHistory = {} const { contributors, lastEditLocaleTimestamp } = await getAppPageContributorInfo("learn", locale as Lang, commitHistoryCache) + const tocItems = [ + { + id: "what-is-crypto-ethereum", + title: t("toc-what-is-crypto-ethereum"), + }, + { + id: "how-do-i-use-ethereum", + title: t("toc-how-do-i-use-ethereum"), + }, + { + id: "what-is-ethereum-used-for", + title: t("toc-what-is-ethereum-used-for"), + }, + { + id: "strengthen-the-ethereum-network", + title: t("toc-strengthen-the-ethereum-network"), + }, + { + id: "learn-about-the-ethereum-protocol", + title: t("toc-learn-about-the-ethereum-protocol"), + }, + { + id: "learn-about-the-ethereum-community", + title: t("toc-learn-about-the-ethereum-community"), + }, + { + id: "books-and-podcasts", + title: t("toc-books-and-podcasts"), + }, + ] + const tocData: ToCItem[] = tocItems.map(({ id, title }) => ({ + title, + url: "#" + id, + })) + + const heroContent: HubHeroProps = { + title: t("common:learn-hub"), + header: t("hero-header"), + description: t("hero-subtitle"), + heroImg: heroImage, + buttons: [ + { + content: t("hero-button-lets-get-started"), + toId: tocItems[0].id, + matomo: { + eventCategory: "learn hub hero buttons", + eventAction: "click", + eventName: "lets get started", + }, + }, + ], + } + return ( - - - +
    + + + + + + + +
    + + + <> + + + + + {t("what-is-ethereum-card-title")} + + + + + <> + + + + + {t("what-is-eth-card-title")} + + + + + <> + + + + + {t("what-is-web3-card-title")} + + + + + + +
    + +
    + + + <> + + + + + {t("what-is-a-wallet-card-title")} + + + + + <> + + + + + {t("find-a-wallet-button")} + + + + + <> + + + + + {t("ethereum-networks-card-button")} + + + + + + + +

    {t("things-to-consider-banner-title")}

    + + {t("things-to-consider-banner-1")} + + {t("things-to-consider-banner-2")}{" "} + + {t("things-to-consider-banner-layer-2")} + + . + + +
    +
    + +
    +
    + + +
    + +
    + + + <> + + + + + {t("defi-card-button")} + + + + + <> + + + + + {t("stablecoins-card-button")} + + + + + <> + + + + {t("nft-card-button")} + + + + <> + + + + {t("dao-card-button")} + + + + <> + + + + + {t("dapp-card-button")} + + + + + + + + + {t("common:decentralized-identity")} + + + + + {t("common:decentralized-social-networks")} + + + + + {t("common:decentralized-science")} + + + + + {t("play-to-earn")} + + + + + {t("fundraising-through-quadratic-funding")} + + +
  • + + {t("supply-chain-management")} + +
  • +
    +
    +
    +
    +
    + +
    + + + <> + + + + + {t("staking-ethereum-card-button")} + + + + + <> + + + + + {t("run-a-node-card-title")} + + + + +
    + +
    + + + <> + + + + + {t("energy-consumption-card-button")} + + + + + <> + + + + + {t("ethereum-upgrades-card-button")} + + + + + <> + + + + + {t("ethereum-whitepaper-card-button")} + + + + + + +
    + +
    + + + <> + + + + + {t("community-hub-card-button")} + + + + + <> + + + + + {t("get-involved-card-title")} + + + + + <> + + + + + {t("online-communities-card-button")} + + + + +
    + +
    + +

    {t("books-about-ethereum")}

    + + + + {t("cryptopians-title")} + {" "} + {t("cryptopians-description")} + + + + {t("out-of-the-ether-title")} + {" "} + {t("out-of-the-ether-description")} + + + + {t("the-infinite-machine-title")} + {" "} + {t("the-infinite-machine-description")} + + + + {t("mastering-ethereum-title")} + {" "} + {t("mastering-ethereum-description")} + + + + {t("proof-of-stake-title")} + {" "} + {t("proof-of-stake-description")} + + +

    {t("podcasts-about-ethereum")}

    + + + + {t("green-pill-title")} + {" "} + {t("green-pill-description")} + + + + {t("zeroknowledge-title")} + {" "} + {t("zeroknowledge-description")} + + + + {t("unchained-title")} + {" "} + {t("unchained-description")} + + + + {t("the-daily-gwei-title")} + {" "} + {t("the-daily-gwei-description")} + + + + {t("bankless-title")} + {" "} + {t("bankless-description")} + + +
    +
    + + + +
    +
    +
    +
    ) } From 27426308e4447ce411535fc659ca5218bd502482 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 28 Jun 2025 12:32:43 -0700 Subject: [PATCH 215/368] perf: optimize /learn images with sizes --- app/[locale]/learn/page.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/[locale]/learn/page.tsx b/app/[locale]/learn/page.tsx index 60c93e03264..d95e0c9f9cc 100644 --- a/app/[locale]/learn/page.tsx +++ b/app/[locale]/learn/page.tsx @@ -111,7 +111,7 @@ const H3 = ({ children, ...props }: HTMLAttributes) => ( ) const ImageHeight200 = ({ src, alt }: ImageProps) => ( - {alt} + {alt} ) export default async function Page({ params }: { params: Promise }) { @@ -324,7 +324,12 @@ export default async function Page({ params }: { params: Promise }) {
    - +
    From 43bf5446219f11cbab59f1ca4d2928fb4d46144c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 28 Jun 2025 12:38:27 -0700 Subject: [PATCH 216/368] fix: common namespace --- app/[locale]/learn/page.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/[locale]/learn/page.tsx b/app/[locale]/learn/page.tsx index d95e0c9f9cc..95d7799b4ef 100644 --- a/app/[locale]/learn/page.tsx +++ b/app/[locale]/learn/page.tsx @@ -117,6 +117,7 @@ const ImageHeight200 = ({ src, alt }: ImageProps) => ( export default async function Page({ params }: { params: Promise }) { const { locale } = await params const t = await getTranslations({ locale, namespace: "page-learn" }) + const tCommon = await getTranslations({ locale, namespace: "common" }) const commitHistoryCache: CommitHistory = {} const { contributors, lastEditLocaleTimestamp } = @@ -158,7 +159,7 @@ export default async function Page({ params }: { params: Promise }) { })) const heroContent: HubHeroProps = { - title: t("common:learn-hub"), + title: tCommon("learn-hub"), header: t("hero-header"), description: t("hero-subtitle"), heroImg: heroImage, @@ -428,17 +429,17 @@ export default async function Page({ params }: { params: Promise }) { - {t("common:decentralized-identity")} + {tCommon("decentralized-identity")} - {t("common:decentralized-social-networks")} + {tCommon("decentralized-social-networks")} - {t("common:decentralized-science")} + {tCommon("decentralized-science")} From 00ad6e18068a2feb5779db46409c0c34cd304bda Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 28 Jun 2025 14:09:36 -0700 Subject: [PATCH 217/368] feat: migrate what-is-ethereum to ssr Use dynamic loading for client components with loading skeletons --- .../what-is-ethereum/_components/WhatTabs.tsx | 69 ++ .../_components/WhySlider.tsx | 89 ++ .../_components/what-is-ethereum.tsx | 860 ------------------ app/[locale]/what-is-ethereum/page.tsx | 822 ++++++++++++++++- src/components/AdoptionChart.tsx | 2 + 5 files changed, 972 insertions(+), 870 deletions(-) create mode 100644 app/[locale]/what-is-ethereum/_components/WhatTabs.tsx create mode 100644 app/[locale]/what-is-ethereum/_components/WhySlider.tsx delete mode 100644 app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs.tsx new file mode 100644 index 00000000000..fc042556ca7 --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhatTabs.tsx @@ -0,0 +1,69 @@ +"use client" + +import Translation from "@/components/Translation" +import { Stack } from "@/components/ui/flex" +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" + +import { trackCustomEvent } from "@/lib/utils/matomo" + +import useTranslation from "@/hooks/useTranslation" + +const WhatTabs = () => { + const { t } = useTranslation("page-what-is-ethereum") + const tabs = [ + { + title: t("page-what-is-ethereum-blockchain-tab-title"), + eventName: "Blockchain tab", + content: ( +

    + +

    + ), + }, + { + title: t("page-what-is-ethereum-cryptocurrency-tab-title"), + eventName: "Cryptocurrency tab", + content: ( + +

    + +

    +

    + +

    +

    + +

    +
    + ), + }, + ] as const + + return ( + { + trackCustomEvent({ + eventCategory: `Blockchain/crypto tab`, + eventAction: `Clicked`, + eventName: tabs[index].eventName, + }) + }} + > + + {tabs.map((tab, index) => ( + + {tab.title} + + ))} + + {tabs.map((tab, index) => ( + + {tab.content} + + ))} + + ) +} + +export default WhatTabs diff --git a/app/[locale]/what-is-ethereum/_components/WhySlider.tsx b/app/[locale]/what-is-ethereum/_components/WhySlider.tsx new file mode 100644 index 00000000000..c7ce6d67c45 --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhySlider.tsx @@ -0,0 +1,89 @@ +"use client" + +import type { ChildOnlyProp } from "@/lib/types" + +import Translation from "@/components/Translation" +import { + Swiper, + SwiperContainer, + SwiperNavigation, + SwiperSlide, +} from "@/components/ui/swiper" + +import { trackCustomEvent } from "@/lib/utils/matomo" + +import useTranslation from "@/hooks/useTranslation" + +const H3 = (props: ChildOnlyProp) => ( +

    +) + +const WhySlider = () => { + const { t } = useTranslation("page-what-is-ethereum") + + const slides = [ + { eventName: "Payments slide" }, + { eventName: "Time of crisis slide" }, + { eventName: "Creators slide" }, + { eventName: "Gamers slide" }, + ] + + return ( + + { + trackCustomEvent({ + eventCategory: `What is Ethereum - Slider`, + eventAction: `Clicked`, + eventName: slides[activeIndex].eventName, + }) + }} + > + +
    +

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

    +
    +

    + +

    +

    {t("page-what-is-ethereum-slide-1-desc-2")}

    +
    +
    +
    + +
    +

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

    +
    +

    {t("page-what-is-ethereum-slide-2-desc-1")}

    +

    + +

    +
    +
    +
    + +
    +

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

    +
    +

    + +

    +
    +
    +
    + +
    +

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

    +
    +

    {t("page-what-is-ethereum-slide-4-desc-1")}

    +

    {t("page-what-is-ethereum-slide-4-desc-2")}

    +
    +
    +
    + +
    +
    + ) +} + +export default WhySlider diff --git a/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx b/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx deleted file mode 100644 index cf81c8f7ec4..00000000000 --- a/app/[locale]/what-is-ethereum/_components/what-is-ethereum.tsx +++ /dev/null @@ -1,860 +0,0 @@ -"use client" - -import type { ImageProps } from "next/image" -import { useLocale } from "next-intl" -import type { HTMLAttributes } from "react" -import { MdInfoOutline } from "react-icons/md" - -import type { - ChildOnlyProp, - Lang, - MetricReturnData, - PageWithContributorsProps, -} from "@/lib/types" - -import AdoptionChart from "@/components/AdoptionChart" -import { - Banner, - BannerBody, - BannerGrid, - BannerGridCell, - BannerImage, -} from "@/components/BannerGrid" -import Callout from "@/components/Callout" -import Card from "@/components/Card" -import EnergyConsumptionChart from "@/components/EnergyConsumptionChart" -import FeedbackCard from "@/components/FeedbackCard" -import FileContributors from "@/components/FileContributors" -import { Image } from "@/components/Image" -import ListenToPlayer from "@/components/ListenToPlayer" -import MainArticle from "@/components/MainArticle" -import { StandaloneQuizWidget } from "@/components/Quiz/QuizWidget" -import StatErrorMessage from "@/components/StatErrorMessage" -import Tooltip from "@/components/Tooltip" -import Translation from "@/components/Translation" -import { Button, ButtonLink } from "@/components/ui/buttons/Button" -import { Center, Flex, HStack, Stack, VStack } from "@/components/ui/flex" -import InlineLink from "@/components/ui/Link" -import { - Swiper, - SwiperContainer, - SwiperNavigation, - SwiperSlide, -} from "@/components/ui/swiper" -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" - -import { cn } from "@/lib/utils/cn" -import { trackCustomEvent } from "@/lib/utils/matomo" -import { getLocaleForNumberFormat } from "@/lib/utils/translations" - -import useTranslation from "@/hooks/useTranslation" -import { usePathname } from "@/i18n/routing" -import dogeComputerImg from "@/public/images/doge-computer.png" -import ethImg from "@/public/images/eth.png" -import diffEthAndBtc from "@/public/images/eth.png" -import criminalActivity from "@/public/images/finance_transparent.png" -import ethCoin from "@/public/images/impact_transparent.png" -import whatAreSmartContracts from "@/public/images/infrastructure_transparent.png" -import whoRunsEthereum from "@/public/images/run-a-node/ethereum-inside.png" -import stats from "@/public/images/upgrades/newrings.png" -import hero from "@/public/images/what-is-ethereum.png" - -const Slogan = (props: ChildOnlyProp) => ( -

    -) - -const Title = (props: ChildOnlyProp) => ( -

    -) - -const Subtitle = (props: ChildOnlyProp) => ( -

    -) - -const Hero = (props: ChildOnlyProp) => ( -

    -) - -const Summary = ({ className, ...rest }: HTMLAttributes) => ( -
    -) - -const Content = (props: ChildOnlyProp) => ( -
    -) - -const TwoColumnContent = ({ - className, - ...rest -}: HTMLAttributes) => ( - -) - -const Section = ({ className, ...rest }: HTMLAttributes) => ( -
    -) - -export const Width60 = ({ - className, - children, -}: React.HTMLAttributes) => ( -
    {children}
    -) - -export const Width40 = (props: ChildOnlyProp) => ( -
    -) - -const H2 = ({ className, ...rest }: HTMLAttributes) => ( -

    -) - -const H3 = (props: ChildOnlyProp) => ( -

    -) - -const CardContainer = ({ - className, - ...rest -}: HTMLAttributes) => ( - -) - -const Column = (props: ChildOnlyProp) => ( -
    -) - -const StatPrimary = (props: ChildOnlyProp) => ( -
    -) - -const StatDescription = (props: ChildOnlyProp) => ( -
    -) - -const ButtonRow = ({ className, ...rest }: HTMLAttributes) => ( - -) - -const NoWrapText = (props: ChildOnlyProp) => ( - -) - -const Image400 = ({ src }: Pick) => ( - -) - -type Props = PageWithContributorsProps & { - data: MetricReturnData -} - -const WhatIsEthereumPage = ({ - data, - contributors, - lastEditLocaleTimestamp, -}: Props) => { - const { t } = useTranslation(["page-what-is-ethereum", "learn-quizzes"]) - const pathname = usePathname() - const locale = useLocale() - const localeForNumberFormat = getLocaleForNumberFormat(locale! as Lang) - - const formatNumber = ( - value: number, - minSignificantDigits: number, - maxSignificantDigits: number, - style?: Intl.NumberFormatOptions["style"], - currency?: string - ) => - new Intl.NumberFormat(localeForNumberFormat, { - notation: "compact", - minimumSignificantDigits: minSignificantDigits, - maximumSignificantDigits: maxSignificantDigits, - style: style, - currency: currency, - currencyDisplay: "narrowSymbol", - }).format(value) - - const txStat = "error" in data ? "" : formatNumber(data.value, 3, 4) - - const cards = [ - { - emoji: ":bank:", - title: t("page-what-is-ethereum-banking-card"), - description: t("page-what-is-ethereum-banking-card-desc"), - }, - - { - emoji: ":detective:", - title: t("page-what-is-ethereum-internet-card"), - description: t("page-what-is-ethereum-internet-card-desc"), - }, - { - emoji: ":busts_in_silhouette:", - title: t("page-what-is-ethereum-p2p-card"), - description: t("page-what-is-ethereum-p2p-card-desc"), - }, - { - emoji: ":shield:", - title: t("page-what-is-ethereum-censorless-card"), - description: t("page-what-is-ethereum-censorless-card-desc"), - }, - { - emoji: ":shopping_bags:", - title: t("page-what-is-ethereum-commerce-card"), - description: t("page-what-is-ethereum-commerce-card-desc"), - }, - { - emoji: ":handshake:", - title: t("page-what-is-ethereum-composable-card"), - description: t("page-what-is-ethereum-composable-card-desc"), - }, - ] - - const tabs = [ - { - title: t("page-what-is-ethereum-blockchain-tab-title"), - eventName: "Blockchain tab", - content: ( -

    - -

    - ), - }, - { - title: t("page-what-is-ethereum-cryptocurrency-tab-title"), - eventName: "Cryptocurrency tab", - content: ( - -

    - -

    -

    - -

    -

    - -

    -
    - ), - }, - ] as const - - const slides = [ - { eventName: "Payments slide" }, - { eventName: "Time of crisis slide" }, - { eventName: "Creators slide" }, - { eventName: "Gamers slide" }, - ] - - const tooltipContent = ({ apiUrl, apiProvider, ariaLabel }) => ( -
    - {t("common:data-provided-by")}{" "} - - {apiProvider} - -
    - ) - - return ( - - - - - -
    - {t("page-what-is-ethereum-title")} - - {t("page-what-is-ethereum-desc")} - {t("page-what-is-ethereum-subtitle")} - - - - -
    -
    - - {t("page-what-is-ethereum-alt-img-bazaar")} - -
    -
    -
    -
    -
    - -
    - - - - - -

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

    - -

    {t("page-what-is-ethereum-summary-desc-1")}

    -

    {t("page-what-is-ethereum-summary-desc-2")}

    -
      -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -
    - -
    - -
    -

    {t("page-what-is-ethereum-what-can-eth-do-title")}

    - - {cards.map((card, idx) => ( - - ))} - -
    - - - - { - trackCustomEvent({ - eventCategory: `Blockchain/crypto tab`, - eventAction: `Clicked`, - eventName: tabs[index].eventName, - }) - }} - > - - {tabs.map((tab, index) => ( - - {tab.title} - - ))} - - {tabs.map((tab, index) => ( - - {tab.content} - - ))} - - - - -
    -
    -
    - -
    - - -

    - {t("page-what-is-ethereum-why-would-i-use-ethereum-title")} -

    - -

    {t("page-what-is-ethereum-why-would-i-use-ethereum-1")}

    -

    {t("page-what-is-ethereum-why-would-i-use-ethereum-2")}

    - -
    - - { - trackCustomEvent({ - eventCategory: `What is Ethereum - Slider`, - eventAction: `Clicked`, - eventName: slides[activeIndex].eventName, - }) - }} - > - -
    -

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

    -
    -

    - -

    -

    {t("page-what-is-ethereum-slide-1-desc-2")}

    -
    -
    -
    - -
    -

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

    -
    -

    {t("page-what-is-ethereum-slide-2-desc-1")}

    -

    - -

    -
    -
    -
    - -
    -

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

    -
    -

    - -

    -
    -
    -
    - -
    -

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

    -
    -

    {t("page-what-is-ethereum-slide-4-desc-1")}

    -

    {t("page-what-is-ethereum-slide-4-desc-2")}

    -
    -
    -
    - -
    -
    -
    -
    -
    - - - -
    -
    - -
    - - -

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

    - - - {formatNumber(4000, 1, 1)}+ - - {t( - "page-what-is-ethereum-ethereum-in-numbers-stat-1-desc" - )} - -   - - - - - - - - - - {formatNumber(96_000_000, 2, 2)}+ - - {t( - "page-what-is-ethereum-ethereum-in-numbers-stat-2-desc" - )} - -   - - - - - - - - - - {formatNumber(53_300_000, 3, 3)}+ - - {t( - "page-what-is-ethereum-ethereum-in-numbers-stat-3-desc" - )} - -   - - - - - - - - - - - {formatNumber(410_000_000_000, 3, 3, "currency", "USD")} - - - {t( - "page-what-is-ethereum-ethereum-in-numbers-stat-4-desc" - )} - -   - - - - - - - - - - - {formatNumber(3_500_000_000, 2, 2, "currency", "USD")} - - - {t( - "page-what-is-ethereum-ethereum-in-numbers-stat-5-desc" - )} - -   - - - - - - - - - - - {txStat || } - - {/* TODO: Extract strings for translation */} - - {t( - "page-what-is-ethereum-ethereum-in-numbers-stat-6-desc" - )} - -   - - - - - - - - - -
    - - - -
    -
    - -
    - - - - - -

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

    - -

    - -

    -

    - -

    - - - {t("page-what-is-ethereum-run-a-node")} - - -
    -
    -
    -
    - -
    - - - - - -

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

    - -

    - -

    -

    - -

    -

    - -

    - - - {t("page-what-is-ethereum-more-on-smart-contracts")} - - - {t("page-what-is-ethereum-explore-dapps")} - - -
    -
    -
    -
    - -
    - - - - - -

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

    - -

    {t("page-what-is-ethereum-meet-ether-desc-1")}

    -

    {t("page-what-is-ethereum-meet-ether-desc-2")}

    - - - {t("page-what-is-ethereum-what-is-ether")} - - - {t("page-what-is-ethereum-get-eth")} - - -
    -
    -
    -
    - -
    - - - - - -

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

    - -

    - -

    -

    - -

    - - - {t("page-what-is-ethereum-more-on-energy-consumption")} - - - {t("page-what-is-ethereum-the-merge-update")} - - -
    -
    -
    -
    - -
    - - - - - -

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

    - -

    {t("page-what-is-ethereum-criminal-activity-desc-1")}

    -

    {t("page-what-is-ethereum-criminal-activity-desc-2")}

    -

    - - {t("page-what-is-ethereum-criminal-activity-desc-3")} - -

    -
      -
    • - - Europol Spotlight - Cryptocurrencies - Tracing the - evolution of criminal finances.pdf - {" "} - EN (1.4 MB) -
    • -
    -
    -
    -
    -
    - -
    - - - - - -

    {t("page-what-is-ethereum-btc-eth-diff-title")}

    - -

    {t("page-what-is-ethereum-btc-eth-diff-1")}

    -

    - -

    -

    {t("page-what-is-ethereum-btc-eth-diff-3")}

    -

    {t("page-what-is-ethereum-btc-eth-diff-4")}

    -
    -
    -
    -
    -
    - -
    -

    {t("page-what-is-ethereum-additional-reading")}

    - -

    - - {t("page-what-is-ethereum-week-in-ethereum")} - {" "} - {t("page-what-is-ethereum-week-in-ethereum-desc")} -

    -

    - - {t("page-what-is-ethereum-atoms-institutions-blockchains")} - {" "} - {t("page-what-is-ethereum-atoms-institutions-blockchains-desc")} -

    - -

    - - {t("page-what-is-ethereum-kernel-dreamers")} - {" "} - {t("page-what-is-ethereum-kernel-dreamers-desc")} -

    -
    -
    - -
    - -

    {t("page-what-is-ethereum-explore")}

    -
    - - -
    - - {t("page-what-is-ethereum-get-eth")} - -
    -
    - -
    - - {t("page-what-is-ethereum-explore-dapps")} - -
    -
    -
    -
    - -
    - -
    - -
    - - -
    -
    -
    - ) -} - -export default WhatIsEthereumPage diff --git a/app/[locale]/what-is-ethereum/page.tsx b/app/[locale]/what-is-ethereum/page.tsx index 34283d70d8d..f4515acd5b5 100644 --- a/app/[locale]/what-is-ethereum/page.tsx +++ b/app/[locale]/what-is-ethereum/page.tsx @@ -1,28 +1,264 @@ import { pick } from "lodash" +import dynamic from "next/dynamic" import { getMessages, getTranslations, setRequestLocale, } from "next-intl/server" +import { MdInfoOutline } from "react-icons/md" -import type { CommitHistory, Lang } from "@/lib/types" +import type { ChildOnlyProp, CommitHistory, Lang } from "@/lib/types" +import { + Banner, + BannerBody, + BannerGrid, + BannerGridCell, + BannerImage, +} from "@/components/BannerGrid" +import Callout from "@/components/Callout" +import Card from "@/components/Card" +import FeedbackCard from "@/components/FeedbackCard" +import FileContributors from "@/components/FileContributors" import I18nProvider from "@/components/I18nProvider" +import { Image, ImageProps } from "@/components/Image" +import MainArticle from "@/components/MainArticle" +import { StandaloneQuizWidget } from "@/components/Quiz/QuizWidget" +import StatErrorMessage from "@/components/StatErrorMessage" +import Tooltip from "@/components/Tooltip" +import Translation from "@/components/Translation" +import { Button } from "@/components/ui/buttons/Button" +import { ButtonLink } from "@/components/ui/buttons/Button" +import { Center, Flex, HStack, Stack } from "@/components/ui/flex" +import InlineLink from "@/components/ui/Link" +import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" +import { cn } from "@/lib/utils/cn" import { getAppPageContributorInfo } from "@/lib/utils/contributors" import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" -import { getRequiredNamespacesForPage } from "@/lib/utils/translations" - -import WhatIsEthereumPage from "./_components/what-is-ethereum" +import { + getLocaleForNumberFormat, + getRequiredNamespacesForPage, +} from "@/lib/utils/translations" import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie" +import dogeComputerImg from "@/public/images/doge-computer.png" +import ethImg from "@/public/images/eth.png" +import diffEthAndBtc from "@/public/images/eth.png" +import criminalActivity from "@/public/images/finance_transparent.png" +import ethCoin from "@/public/images/impact_transparent.png" +import whatAreSmartContracts from "@/public/images/infrastructure_transparent.png" +import whoRunsEthereum from "@/public/images/run-a-node/ethereum-inside.png" +import stats from "@/public/images/upgrades/newrings.png" +import hero from "@/public/images/what-is-ethereum.png" + +const AdoptionChart = dynamic(() => import("@/components/AdoptionChart"), { + ssr: false, + loading: () => ( +
    +
    + +
    +
    + {Array.from({ length: 3 }).map((_, idx) => ( +
    + +
    + ))} +
    +
    + {Array.from({ length: 8 }).map((_, idx) => ( +
    + +
    + ))} +
    + + + +
    + ), +}) + +const ListenToPlayer = dynamic(() => import("@/components/ListenToPlayer"), { + ssr: false, + loading: () => , +}) + +const WhatTabs = dynamic(() => import("./_components/WhySlider"), { + ssr: false, + loading: () => ( + <> +
    + + +
    +
    + +
    + + ), +}) + +const WhySwiper = dynamic(() => import("./_components/WhySlider"), { + ssr: false, + loading: () => ( +
    + + + +
    + ), +}) + +const EnergyConsumptionChart = dynamic( + () => import("@/components/EnergyConsumptionChart"), + { + ssr: false, + loading: () => ( +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    {" "} +
    + + +
    +
    + + +
    + {Array.from({ length: 4 }).map((_, idx) => ( +
    + + +
    + ))} +
    + + +
    +
    + +
    + ), + } +) + +const Summary = ({ + className, + ...rest +}: React.HTMLAttributes) => ( +
    +) + +const TwoColumnContent = ({ + className, + ...rest +}: React.HTMLAttributes) => ( + +) + +const Section = ({ + className, + ...rest +}: React.HTMLAttributes) => ( +
    +) + +const Width60 = ({ + className, + children, +}: React.HTMLAttributes) => ( +
    {children}
    +) + +const Width40 = (props: ChildOnlyProp) => ( +
    +) + +const H2 = ({ className, ...rest }: React.HTMLAttributes) => ( +

    +) + +const CardContainer = ({ + className, + ...rest +}: React.HTMLAttributes) => ( + +) + +const Column = (props: ChildOnlyProp) => ( +
    +) + +const StatPrimary = (props: ChildOnlyProp) => ( +
    +) + +const StatDescription = (props: ChildOnlyProp) => ( +
    +) + +const ButtonRow = ({ + className, + ...rest +}: React.HTMLAttributes) => ( + +) + +const NoWrapText = (props: ChildOnlyProp) => ( + +) + +const Image400 = ({ src }: Pick) => ( + +) const loadData = dataLoader([["growThePieData", fetchGrowThePie]]) const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { const { locale } = await params + const localeForNumberFormat = getLocaleForNumberFormat(locale as Lang) + const t = await getTranslations({ + locale, + namespace: "page-what-is-ethereum", + }) + const tCommon = await getTranslations({ + locale, + namespace: "common", + }) setRequestLocale(locale) // Get i18n messages @@ -39,15 +275,581 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { ) // Load data - const [data] = await loadData() + const [loadedData] = await loadData() + const data = loadedData.txCount + + const formatNumber = ( + value: number, + minSignificantDigits: number, + maxSignificantDigits: number, + style?: Intl.NumberFormatOptions["style"], + currency?: string + ) => + new Intl.NumberFormat(localeForNumberFormat, { + notation: "compact", + minimumSignificantDigits: minSignificantDigits, + maximumSignificantDigits: maxSignificantDigits, + style: style, + currency: currency, + currencyDisplay: "narrowSymbol", + }).format(value) + + const txStat = "error" in data ? "" : formatNumber(data.value, 3, 4) + + const cards = [ + { + emoji: ":bank:", + title: t("page-what-is-ethereum-banking-card"), + description: t("page-what-is-ethereum-banking-card-desc"), + }, + + { + emoji: ":detective:", + title: t("page-what-is-ethereum-internet-card"), + description: t("page-what-is-ethereum-internet-card-desc"), + }, + { + emoji: ":busts_in_silhouette:", + title: t("page-what-is-ethereum-p2p-card"), + description: t("page-what-is-ethereum-p2p-card-desc"), + }, + { + emoji: ":shield:", + title: t("page-what-is-ethereum-censorless-card"), + description: t("page-what-is-ethereum-censorless-card-desc"), + }, + { + emoji: ":shopping_bags:", + title: t("page-what-is-ethereum-commerce-card"), + description: t("page-what-is-ethereum-commerce-card-desc"), + }, + { + emoji: ":handshake:", + title: t("page-what-is-ethereum-composable-card"), + description: t("page-what-is-ethereum-composable-card-desc"), + }, + ] + + const tooltipContent = ({ apiUrl, apiProvider, ariaLabel }) => ( +
    + {tCommon("data-provided-by")}{" "} + + {apiProvider} + +
    + ) return ( - + + + +
    +

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

    + +

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

    +

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

    + + + +
    +
    +
    +
    + {t("page-what-is-ethereum-alt-img-bazaar")} +
    +
    + +
    +
    +
    + {/* CLIENT SIDE */} + +
    + + + + + +

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

    + +

    {t("page-what-is-ethereum-summary-desc-1")}

    +

    {t("page-what-is-ethereum-summary-desc-2")}

    +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +
    + +
    + +
    +

    {t("page-what-is-ethereum-what-can-eth-do-title")}

    + + {cards.map((card, idx) => ( + + ))} + +
    + + + + {/* CLIENT SIDE */} + + + + +
    +
    +
    + +
    + + +

    + {t("page-what-is-ethereum-why-would-i-use-ethereum-title")} +

    + +

    {t("page-what-is-ethereum-why-would-i-use-ethereum-1")}

    +

    {t("page-what-is-ethereum-why-would-i-use-ethereum-2")}

    + +
    + {/* CLIENT SIDE */} + +
    +
    +
    + + {/* CLIENT SIDE */} + + +
    +
    + +
    + + +

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

    + + + {formatNumber(4000, 1, 1)}+ + + {t( + "page-what-is-ethereum-ethereum-in-numbers-stat-1-desc" + )} + +   + + + + + + + + + + {formatNumber(96_000_000, 2, 2)}+ + + {t( + "page-what-is-ethereum-ethereum-in-numbers-stat-2-desc" + )} + +   + + + + + + + + + + {formatNumber(53_300_000, 3, 3)}+ + + {t( + "page-what-is-ethereum-ethereum-in-numbers-stat-3-desc" + )} + +   + + + + + + + + + + + {formatNumber(410_000_000_000, 3, 3, "currency", "USD")} + + + {t( + "page-what-is-ethereum-ethereum-in-numbers-stat-4-desc" + )} + +   + + + + + + + + + + + {formatNumber(3_500_000_000, 2, 2, "currency", "USD")} + + + {t( + "page-what-is-ethereum-ethereum-in-numbers-stat-5-desc" + )} + +   + + + + + + + + + + + {txStat || } + + {/* TODO: Extract strings for translation */} + + {t( + "page-what-is-ethereum-ethereum-in-numbers-stat-6-desc" + )} + +   + + + + + + + + + +
    + + + +
    +
    + +
    + + + + + +

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

    + +

    + +

    +

    + +

    + + + {t("page-what-is-ethereum-run-a-node")} + + +
    +
    +
    +
    + +
    + + + + + +

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

    + +

    + +

    +

    + +

    +

    + +

    + + + {t("page-what-is-ethereum-more-on-smart-contracts")} + + + {t("page-what-is-ethereum-explore-dapps")} + + +
    +
    +
    +
    + +
    + + + + + +

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

    + +

    {t("page-what-is-ethereum-meet-ether-desc-1")}

    +

    {t("page-what-is-ethereum-meet-ether-desc-2")}

    + + + {t("page-what-is-ethereum-what-is-ether")} + + + {t("page-what-is-ethereum-get-eth")} + + +
    +
    +
    +
    + +
    + + + {/* CLIENT SIDE */} + + + +

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

    + +

    + +

    +

    + +

    + + + {t("page-what-is-ethereum-more-on-energy-consumption")} + + + {t("page-what-is-ethereum-the-merge-update")} + + +
    +
    +
    +
    + +
    + + + + + +

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

    + +

    {t("page-what-is-ethereum-criminal-activity-desc-1")}

    +

    {t("page-what-is-ethereum-criminal-activity-desc-2")}

    +

    + + {t("page-what-is-ethereum-criminal-activity-desc-3")} + +

    +
      +
    • + + Europol Spotlight - Cryptocurrencies - Tracing the + evolution of criminal finances.pdf + {" "} + EN (1.4 MB) +
    • +
    +
    +
    +
    +
    + +
    + + + + + +

    {t("page-what-is-ethereum-btc-eth-diff-title")}

    + +

    {t("page-what-is-ethereum-btc-eth-diff-1")}

    +

    + +

    +

    {t("page-what-is-ethereum-btc-eth-diff-3")}

    +

    {t("page-what-is-ethereum-btc-eth-diff-4")}

    +
    +
    +
    +
    +
    + +
    +

    {t("page-what-is-ethereum-additional-reading")}

    + +

    + + {t("page-what-is-ethereum-week-in-ethereum")} + {" "} + {t("page-what-is-ethereum-week-in-ethereum-desc")} +

    +

    + + {t("page-what-is-ethereum-atoms-institutions-blockchains")} + {" "} + {t("page-what-is-ethereum-atoms-institutions-blockchains-desc")} +

    + +

    + + {t("page-what-is-ethereum-kernel-dreamers")} + {" "} + {t("page-what-is-ethereum-kernel-dreamers-desc")} +

    +
    +
    + +
    + +

    {t("page-what-is-ethereum-explore")}

    +
    + + +
    + + {t("page-what-is-ethereum-get-eth")} + +
    +
    + +
    + + {t("page-what-is-ethereum-explore-dapps")} + +
    +
    +
    +
    + +
    + +
    + +
    + + +
    +
    ) } diff --git a/src/components/AdoptionChart.tsx b/src/components/AdoptionChart.tsx index 842db06515a..be5b9038aa8 100644 --- a/src/components/AdoptionChart.tsx +++ b/src/components/AdoptionChart.tsx @@ -1,3 +1,5 @@ +"use client" + import { useTheme } from "next-themes" import type { ChildOnlyProp } from "@/lib/types" From 84a7a48da0197948c115baf50a33a3a2758491ac Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 28 Jun 2025 15:37:55 -0700 Subject: [PATCH 218/368] refactor: extract lazy components --- .../{WhatTabs.tsx => WhatTabs/index.tsx} | 0 .../_components/WhatTabs/lazy.tsx | 20 +++ .../{WhySlider.tsx => WhySwiper/index.tsx} | 4 +- .../_components/WhySwiper/lazy.tsx | 16 +++ app/[locale]/what-is-ethereum/page.tsx | 119 +----------------- .../index.tsx} | 4 +- src/components/AdoptionChart/lazy.tsx | 33 +++++ .../EnergyConsumptionChart/lazy.tsx | 52 ++++++++ src/components/ListenToPlayer/lazy.tsx | 10 ++ 9 files changed, 141 insertions(+), 117 deletions(-) rename app/[locale]/what-is-ethereum/_components/{WhatTabs.tsx => WhatTabs/index.tsx} (100%) create mode 100644 app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx rename app/[locale]/what-is-ethereum/_components/{WhySlider.tsx => WhySwiper/index.tsx} (98%) create mode 100644 app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx rename src/components/{AdoptionChart.tsx => AdoptionChart/index.tsx} (98%) create mode 100644 src/components/AdoptionChart/lazy.tsx create mode 100644 src/components/EnergyConsumptionChart/lazy.tsx create mode 100644 src/components/ListenToPlayer/lazy.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/index.tsx similarity index 100% rename from app/[locale]/what-is-ethereum/_components/WhatTabs.tsx rename to app/[locale]/what-is-ethereum/_components/WhatTabs/index.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx new file mode 100644 index 00000000000..c9ba78722a3 --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx @@ -0,0 +1,20 @@ +import dynamic from "next/dynamic" + +import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" + +const WhatTabsLazy = dynamic(() => import("."), { + ssr: false, + loading: () => ( + <> +
    + + +
    +
    + +
    + + ), +}) + +export default WhatTabsLazy diff --git a/app/[locale]/what-is-ethereum/_components/WhySlider.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/index.tsx similarity index 98% rename from app/[locale]/what-is-ethereum/_components/WhySlider.tsx rename to app/[locale]/what-is-ethereum/_components/WhySwiper/index.tsx index c7ce6d67c45..cf5b089b55f 100644 --- a/app/[locale]/what-is-ethereum/_components/WhySlider.tsx +++ b/app/[locale]/what-is-ethereum/_components/WhySwiper/index.tsx @@ -18,7 +18,7 @@ const H3 = (props: ChildOnlyProp) => (

    ) -const WhySlider = () => { +const WhySwiper = () => { const { t } = useTranslation("page-what-is-ethereum") const slides = [ @@ -86,4 +86,4 @@ const WhySlider = () => { ) } -export default WhySlider +export default WhySwiper diff --git a/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx new file mode 100644 index 00000000000..8d6d7299f1b --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx @@ -0,0 +1,16 @@ +import dynamic from "next/dynamic" + +import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" + +const WhySwiperLazy = dynamic(() => import("."), { + ssr: false, + loading: () => ( +
    + + + +
    + ), +}) + +export default WhySwiperLazy diff --git a/app/[locale]/what-is-ethereum/page.tsx b/app/[locale]/what-is-ethereum/page.tsx index f4515acd5b5..f01cc4339f2 100644 --- a/app/[locale]/what-is-ethereum/page.tsx +++ b/app/[locale]/what-is-ethereum/page.tsx @@ -1,5 +1,4 @@ import { pick } from "lodash" -import dynamic from "next/dynamic" import { getMessages, getTranslations, @@ -9,6 +8,7 @@ import { MdInfoOutline } from "react-icons/md" import type { ChildOnlyProp, CommitHistory, Lang } from "@/lib/types" +import AdoptionChart from "@/components/AdoptionChart/lazy" import { Banner, BannerBody, @@ -18,10 +18,12 @@ import { } from "@/components/BannerGrid" import Callout from "@/components/Callout" import Card from "@/components/Card" +import EnergyConsumptionChart from "@/components/EnergyConsumptionChart/lazy" import FeedbackCard from "@/components/FeedbackCard" import FileContributors from "@/components/FileContributors" import I18nProvider from "@/components/I18nProvider" import { Image, ImageProps } from "@/components/Image" +import ListenToPlayer from "@/components/ListenToPlayer/lazy" import MainArticle from "@/components/MainArticle" import { StandaloneQuizWidget } from "@/components/Quiz/QuizWidget" import StatErrorMessage from "@/components/StatErrorMessage" @@ -31,7 +33,6 @@ import { Button } from "@/components/ui/buttons/Button" import { ButtonLink } from "@/components/ui/buttons/Button" import { Center, Flex, HStack, Stack } from "@/components/ui/flex" import InlineLink from "@/components/ui/Link" -import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" import { cn } from "@/lib/utils/cn" import { getAppPageContributorInfo } from "@/lib/utils/contributors" @@ -42,6 +43,9 @@ import { getRequiredNamespacesForPage, } from "@/lib/utils/translations" +import WhatTabs from "./_components/WhatTabs/lazy" +import WhySwiper from "./_components/WhySwiper/lazy" + import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie" import dogeComputerImg from "@/public/images/doge-computer.png" import ethImg from "@/public/images/eth.png" @@ -53,112 +57,6 @@ import whoRunsEthereum from "@/public/images/run-a-node/ethereum-inside.png" import stats from "@/public/images/upgrades/newrings.png" import hero from "@/public/images/what-is-ethereum.png" -const AdoptionChart = dynamic(() => import("@/components/AdoptionChart"), { - ssr: false, - loading: () => ( -
    -
    - -
    -
    - {Array.from({ length: 3 }).map((_, idx) => ( -
    - -
    - ))} -
    -
    - {Array.from({ length: 8 }).map((_, idx) => ( -
    - -
    - ))} -
    - - - -
    - ), -}) - -const ListenToPlayer = dynamic(() => import("@/components/ListenToPlayer"), { - ssr: false, - loading: () => , -}) - -const WhatTabs = dynamic(() => import("./_components/WhySlider"), { - ssr: false, - loading: () => ( - <> -
    - - -
    -
    - -
    - - ), -}) - -const WhySwiper = dynamic(() => import("./_components/WhySlider"), { - ssr: false, - loading: () => ( -
    - - - -
    - ), -}) - -const EnergyConsumptionChart = dynamic( - () => import("@/components/EnergyConsumptionChart"), - { - ssr: false, - loading: () => ( -
    -
    -
    - - -
    -
    - - -
    -
    - - -
    {" "} -
    - - -
    -
    - - -
    - {Array.from({ length: 4 }).map((_, idx) => ( -
    - - -
    - ))} -
    - - -
    -
    - -
    - ), - } -) - const Summary = ({ className, ...rest @@ -377,7 +275,6 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => {
    - {/* CLIENT SIDE */}
    @@ -429,7 +326,6 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { - {/* CLIENT SIDE */} @@ -449,13 +345,11 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => {

    {t("page-what-is-ethereum-why-would-i-use-ethereum-2")}

    - {/* CLIENT SIDE */}
    - {/* CLIENT SIDE */} @@ -701,7 +595,6 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => {
    - {/* CLIENT SIDE */} diff --git a/src/components/AdoptionChart.tsx b/src/components/AdoptionChart/index.tsx similarity index 98% rename from src/components/AdoptionChart.tsx rename to src/components/AdoptionChart/index.tsx index be5b9038aa8..6d401906d46 100644 --- a/src/components/AdoptionChart.tsx +++ b/src/components/AdoptionChart/index.tsx @@ -4,9 +4,9 @@ import { useTheme } from "next-themes" import type { ChildOnlyProp } from "@/lib/types" -import { cn } from "@/lib/utils/cn" +import { Flex } from "@/components/ui/flex" -import { Flex } from "./ui/flex" +import { cn } from "@/lib/utils/cn" import useTranslation from "@/hooks/useTranslation" diff --git a/src/components/AdoptionChart/lazy.tsx b/src/components/AdoptionChart/lazy.tsx new file mode 100644 index 00000000000..fe8ae7a65a1 --- /dev/null +++ b/src/components/AdoptionChart/lazy.tsx @@ -0,0 +1,33 @@ +import dynamic from "next/dynamic" + +import { Skeleton } from "@/components/ui/skeleton" + +const AdoptionChartLazy = dynamic(() => import("@/components/AdoptionChart"), { + ssr: false, + loading: () => ( +
    +
    + +
    +
    + {Array.from({ length: 3 }).map((_, idx) => ( +
    + +
    + ))} +
    +
    + {Array.from({ length: 8 }).map((_, idx) => ( +
    + +
    + ))} +
    + + + +
    + ), +}) + +export default AdoptionChartLazy diff --git a/src/components/EnergyConsumptionChart/lazy.tsx b/src/components/EnergyConsumptionChart/lazy.tsx new file mode 100644 index 00000000000..304f8749176 --- /dev/null +++ b/src/components/EnergyConsumptionChart/lazy.tsx @@ -0,0 +1,52 @@ +import dynamic from "next/dynamic" + +import { Skeleton } from "@/components/ui/skeleton" + +const EnergyConsumptionChartLazy = dynamic( + () => import("@/components/EnergyConsumptionChart"), + { + ssr: false, + loading: () => ( +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    {" "} +
    + + +
    +
    + + +
    + {Array.from({ length: 4 }).map((_, idx) => ( +
    + + +
    + ))} +
    + + +
    +
    + +
    + ), + } +) + +export default EnergyConsumptionChartLazy diff --git a/src/components/ListenToPlayer/lazy.tsx b/src/components/ListenToPlayer/lazy.tsx new file mode 100644 index 00000000000..a6c71ba49dc --- /dev/null +++ b/src/components/ListenToPlayer/lazy.tsx @@ -0,0 +1,10 @@ +import dynamic from "next/dynamic" + +import { Skeleton } from "../ui/skeleton" + +const LazyListenToPlayer = dynamic(() => import("."), { + ssr: false, + loading: () => , +}) + +export default LazyListenToPlayer From c87364999ee771de1c97cb6292762a710baa1d76 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 28 Jun 2025 15:38:33 -0700 Subject: [PATCH 219/368] perf: optimize image with sizes --- app/[locale]/what-is-ethereum/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/what-is-ethereum/page.tsx b/app/[locale]/what-is-ethereum/page.tsx index f01cc4339f2..d878e7eb496 100644 --- a/app/[locale]/what-is-ethereum/page.tsx +++ b/app/[locale]/what-is-ethereum/page.tsx @@ -140,7 +140,7 @@ const NoWrapText = (props: ChildOnlyProp) => ( ) const Image400 = ({ src }: Pick) => ( - + ) const loadData = dataLoader([["growThePieData", fetchGrowThePie]]) From f5d172c630c4070a064009f0c6df91c05006e77a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 28 Jun 2025 16:35:47 -0700 Subject: [PATCH 220/368] refactor: client, loading, server component breakdown --- .../WhatTabs/{index.tsx => client.tsx} | 0 .../_components/WhatTabs/lazy.tsx | 20 ------------------- .../_components/WhatTabs/loading.tsx | 14 +++++++++++++ .../_components/WhatTabs/server.tsx | 8 ++++++++ .../WhySwiper/{index.tsx => client.tsx} | 0 .../_components/WhySwiper/lazy.tsx | 16 --------------- .../_components/WhySwiper/loading.tsx | 11 ++++++++++ .../_components/WhySwiper/server.tsx | 8 ++++++++ app/[locale]/what-is-ethereum/page.tsx | 4 ++-- 9 files changed, 43 insertions(+), 38 deletions(-) rename app/[locale]/what-is-ethereum/_components/WhatTabs/{index.tsx => client.tsx} (100%) delete mode 100644 app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx create mode 100644 app/[locale]/what-is-ethereum/_components/WhatTabs/loading.tsx create mode 100644 app/[locale]/what-is-ethereum/_components/WhatTabs/server.tsx rename app/[locale]/what-is-ethereum/_components/WhySwiper/{index.tsx => client.tsx} (100%) delete mode 100644 app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx create mode 100644 app/[locale]/what-is-ethereum/_components/WhySwiper/loading.tsx create mode 100644 app/[locale]/what-is-ethereum/_components/WhySwiper/server.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs/index.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/client.tsx similarity index 100% rename from app/[locale]/what-is-ethereum/_components/WhatTabs/index.tsx rename to app/[locale]/what-is-ethereum/_components/WhatTabs/client.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx deleted file mode 100644 index c9ba78722a3..00000000000 --- a/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import dynamic from "next/dynamic" - -import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" - -const WhatTabsLazy = dynamic(() => import("."), { - ssr: false, - loading: () => ( - <> -
    - - -
    -
    - -
    - - ), -}) - -export default WhatTabsLazy diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs/loading.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/loading.tsx new file mode 100644 index 00000000000..494f3df865a --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhatTabs/loading.tsx @@ -0,0 +1,14 @@ +import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" + +const Loading = () => ( + <> +
    + + +
    +
    + +
    + +) +export default Loading diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs/server.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhatTabs/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) diff --git a/app/[locale]/what-is-ethereum/_components/WhySwiper/index.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/client.tsx similarity index 100% rename from app/[locale]/what-is-ethereum/_components/WhySwiper/index.tsx rename to app/[locale]/what-is-ethereum/_components/WhySwiper/client.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx deleted file mode 100644 index 8d6d7299f1b..00000000000 --- a/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import dynamic from "next/dynamic" - -import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" - -const WhySwiperLazy = dynamic(() => import("."), { - ssr: false, - loading: () => ( -
    - - - -
    - ), -}) - -export default WhySwiperLazy diff --git a/app/[locale]/what-is-ethereum/_components/WhySwiper/loading.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/loading.tsx new file mode 100644 index 00000000000..6ad6d3bf165 --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhySwiper/loading.tsx @@ -0,0 +1,11 @@ +import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" + +const Loading = () => ( +
    + + + +
    +) + +export default Loading diff --git a/app/[locale]/what-is-ethereum/_components/WhySwiper/server.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhySwiper/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) diff --git a/app/[locale]/what-is-ethereum/page.tsx b/app/[locale]/what-is-ethereum/page.tsx index d878e7eb496..7bc5cffec56 100644 --- a/app/[locale]/what-is-ethereum/page.tsx +++ b/app/[locale]/what-is-ethereum/page.tsx @@ -43,8 +43,8 @@ import { getRequiredNamespacesForPage, } from "@/lib/utils/translations" -import WhatTabs from "./_components/WhatTabs/lazy" -import WhySwiper from "./_components/WhySwiper/lazy" +import WhatTabs from "./_components/WhatTabs/server" +import WhySwiper from "./_components/WhySwiper/server" import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie" import dogeComputerImg from "@/public/images/doge-computer.png" From e14499bbc4c5546e50b823817957fa7d6353981b Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 29 Jun 2025 00:22:56 +0000 Subject: [PATCH 221/368] Update Crowdin contributors --- src/data/crowdin/file-ids.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/data/crowdin/file-ids.json b/src/data/crowdin/file-ids.json index 3e8114886ff..3ca857c7e7e 100644 --- a/src/data/crowdin/file-ids.json +++ b/src/data/crowdin/file-ids.json @@ -19,6 +19,10 @@ "id": 7525, "path": "/guides/how-to-create-an-ethereum-account/index.md" }, + { + "id": 12604, + "path": "/real-world-assets/index.md" + }, { "id": 2716, "path": "/developers/docs/dapps/index.md" @@ -683,6 +687,18 @@ "id": 12032, "path": "/roadmap/dencun/index.md" }, + { + "id": 12608, + "path": "/roadmap/pectra/index.md" + }, + { + "id": 12614, + "path": "/roadmap/pectra/maxeb/index.md" + }, + { + "id": 12618, + "path": "/roadmap/pectra/7702/index.md" + }, { "id": 6398, "path": "/contributing/adding-developer-tools/index.md" From edcb1a73fceb9e98686de00213230bc1f2059b44 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 28 Jun 2025 18:01:31 -0700 Subject: [PATCH 222/368] refactor: client, loading, server component breakdown --- app/[locale]/what-is-ethereum/page.tsx | 6 +-- src/components/AdoptionChart/lazy.tsx | 33 ------------ src/components/AdoptionChart/loading.tsx | 28 ++++++++++ src/components/AdoptionChart/server.tsx | 8 +++ .../EnergyConsumptionChart/lazy.tsx | 52 ------------------- .../EnergyConsumptionChart/loading.tsx | 44 ++++++++++++++++ .../EnergyConsumptionChart/server.tsx | 8 +++ src/components/ListenToPlayer/lazy.tsx | 10 ---- src/components/ListenToPlayer/loading.tsx | 11 ++++ src/components/ListenToPlayer/server.tsx | 8 +++ 10 files changed, 110 insertions(+), 98 deletions(-) delete mode 100644 src/components/AdoptionChart/lazy.tsx create mode 100644 src/components/AdoptionChart/loading.tsx create mode 100644 src/components/AdoptionChart/server.tsx delete mode 100644 src/components/EnergyConsumptionChart/lazy.tsx create mode 100644 src/components/EnergyConsumptionChart/loading.tsx create mode 100644 src/components/EnergyConsumptionChart/server.tsx delete mode 100644 src/components/ListenToPlayer/lazy.tsx create mode 100644 src/components/ListenToPlayer/loading.tsx create mode 100644 src/components/ListenToPlayer/server.tsx diff --git a/app/[locale]/what-is-ethereum/page.tsx b/app/[locale]/what-is-ethereum/page.tsx index 7bc5cffec56..bfe4aa45493 100644 --- a/app/[locale]/what-is-ethereum/page.tsx +++ b/app/[locale]/what-is-ethereum/page.tsx @@ -8,7 +8,7 @@ import { MdInfoOutline } from "react-icons/md" import type { ChildOnlyProp, CommitHistory, Lang } from "@/lib/types" -import AdoptionChart from "@/components/AdoptionChart/lazy" +import AdoptionChart from "@/components/AdoptionChart/server" import { Banner, BannerBody, @@ -18,12 +18,12 @@ import { } from "@/components/BannerGrid" import Callout from "@/components/Callout" import Card from "@/components/Card" -import EnergyConsumptionChart from "@/components/EnergyConsumptionChart/lazy" +import EnergyConsumptionChart from "@/components/EnergyConsumptionChart/server" import FeedbackCard from "@/components/FeedbackCard" import FileContributors from "@/components/FileContributors" import I18nProvider from "@/components/I18nProvider" import { Image, ImageProps } from "@/components/Image" -import ListenToPlayer from "@/components/ListenToPlayer/lazy" +import ListenToPlayer from "@/components/ListenToPlayer/server" import MainArticle from "@/components/MainArticle" import { StandaloneQuizWidget } from "@/components/Quiz/QuizWidget" import StatErrorMessage from "@/components/StatErrorMessage" diff --git a/src/components/AdoptionChart/lazy.tsx b/src/components/AdoptionChart/lazy.tsx deleted file mode 100644 index fe8ae7a65a1..00000000000 --- a/src/components/AdoptionChart/lazy.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import dynamic from "next/dynamic" - -import { Skeleton } from "@/components/ui/skeleton" - -const AdoptionChartLazy = dynamic(() => import("@/components/AdoptionChart"), { - ssr: false, - loading: () => ( -
    -
    - -
    -
    - {Array.from({ length: 3 }).map((_, idx) => ( -
    - -
    - ))} -
    -
    - {Array.from({ length: 8 }).map((_, idx) => ( -
    - -
    - ))} -
    - - - -
    - ), -}) - -export default AdoptionChartLazy diff --git a/src/components/AdoptionChart/loading.tsx b/src/components/AdoptionChart/loading.tsx new file mode 100644 index 00000000000..402e1a7ed4b --- /dev/null +++ b/src/components/AdoptionChart/loading.tsx @@ -0,0 +1,28 @@ +import { Skeleton } from "@/components/ui/skeleton" + +const Loading = () => ( +
    +
    + +
    +
    + {Array.from({ length: 3 }).map((_, idx) => ( +
    + +
    + ))} +
    +
    + {Array.from({ length: 8 }).map((_, idx) => ( +
    + +
    + ))} +
    + + + +
    +) + +export default Loading diff --git a/src/components/AdoptionChart/server.tsx b/src/components/AdoptionChart/server.tsx new file mode 100644 index 00000000000..e74ae58690a --- /dev/null +++ b/src/components/AdoptionChart/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./index"), { + ssr: false, + loading: Loading, +}) diff --git a/src/components/EnergyConsumptionChart/lazy.tsx b/src/components/EnergyConsumptionChart/lazy.tsx deleted file mode 100644 index 304f8749176..00000000000 --- a/src/components/EnergyConsumptionChart/lazy.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import dynamic from "next/dynamic" - -import { Skeleton } from "@/components/ui/skeleton" - -const EnergyConsumptionChartLazy = dynamic( - () => import("@/components/EnergyConsumptionChart"), - { - ssr: false, - loading: () => ( -
    -
    -
    - - -
    -
    - - -
    -
    - - -
    {" "} -
    - - -
    -
    - - -
    - {Array.from({ length: 4 }).map((_, idx) => ( -
    - - -
    - ))} -
    - - -
    -
    - -
    - ), - } -) - -export default EnergyConsumptionChartLazy diff --git a/src/components/EnergyConsumptionChart/loading.tsx b/src/components/EnergyConsumptionChart/loading.tsx new file mode 100644 index 00000000000..28cf28609ae --- /dev/null +++ b/src/components/EnergyConsumptionChart/loading.tsx @@ -0,0 +1,44 @@ +import { Skeleton } from "@/components/ui/skeleton" + +const Loading = () => ( +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + {Array.from({ length: 4 }).map((_, idx) => ( +
    + + +
    + ))} +
    + + +
    +
    + +
    +) + +export default Loading diff --git a/src/components/EnergyConsumptionChart/server.tsx b/src/components/EnergyConsumptionChart/server.tsx new file mode 100644 index 00000000000..e74ae58690a --- /dev/null +++ b/src/components/EnergyConsumptionChart/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./index"), { + ssr: false, + loading: Loading, +}) diff --git a/src/components/ListenToPlayer/lazy.tsx b/src/components/ListenToPlayer/lazy.tsx deleted file mode 100644 index a6c71ba49dc..00000000000 --- a/src/components/ListenToPlayer/lazy.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import dynamic from "next/dynamic" - -import { Skeleton } from "../ui/skeleton" - -const LazyListenToPlayer = dynamic(() => import("."), { - ssr: false, - loading: () => , -}) - -export default LazyListenToPlayer diff --git a/src/components/ListenToPlayer/loading.tsx b/src/components/ListenToPlayer/loading.tsx new file mode 100644 index 00000000000..38fd3aafb59 --- /dev/null +++ b/src/components/ListenToPlayer/loading.tsx @@ -0,0 +1,11 @@ +import { Skeleton } from "../ui/skeleton" +import { Spinner } from "../ui/spinner" + +const Loading = () => ( +
    + + +
    +) + +export default Loading diff --git a/src/components/ListenToPlayer/server.tsx b/src/components/ListenToPlayer/server.tsx new file mode 100644 index 00000000000..e74ae58690a --- /dev/null +++ b/src/components/ListenToPlayer/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./index"), { + ssr: false, + loading: Loading, +}) From b8fdd54b17ada09b85136f1968f19c60800b27a6 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 28 Jun 2025 19:13:02 -0700 Subject: [PATCH 223/368] feat: migrate media icons to Lucide fix: custom autoplay.svg --- .../ListenToPlayer/PlayerWidget/index.tsx | 45 +++++++++++-------- .../ListenToPlayer/TopOfPagePlayer/index.tsx | 9 ++-- src/components/icons/listen-to/arrow.svg | 3 -- src/components/icons/listen-to/autoplay.svg | 9 ++-- src/components/icons/listen-to/collapse.svg | 3 -- src/components/icons/listen-to/expand.svg | 3 -- src/components/icons/listen-to/index.ts | 15 ------- .../icons/listen-to/pause-circle.svg | 3 -- .../icons/listen-to/play-circle.svg | 3 -- 9 files changed, 38 insertions(+), 55 deletions(-) delete mode 100644 src/components/icons/listen-to/arrow.svg delete mode 100644 src/components/icons/listen-to/collapse.svg delete mode 100644 src/components/icons/listen-to/expand.svg delete mode 100644 src/components/icons/listen-to/index.ts delete mode 100644 src/components/icons/listen-to/pause-circle.svg delete mode 100644 src/components/icons/listen-to/play-circle.svg diff --git a/src/components/ListenToPlayer/PlayerWidget/index.tsx b/src/components/ListenToPlayer/PlayerWidget/index.tsx index 623799ffa4a..87e12a8a461 100644 --- a/src/components/ListenToPlayer/PlayerWidget/index.tsx +++ b/src/components/ListenToPlayer/PlayerWidget/index.tsx @@ -1,14 +1,15 @@ import { useCallback, useEffect, useRef, useState } from "react" -import { X } from "lucide-react" - import { - ArrowIcon, - AutoplayIcon, - CollapseIcon, - ExpandIcon, - PauseCircleIcon, - PlayCircleIcon, -} from "@/components/icons/listen-to" + CirclePause, + CirclePlay, + Maximize2, + Minimize2, + SkipBack, + SkipForward, + X, +} from "lucide-react" + +import AutoplayIcon from "@/components/icons/listen-to/autoplay.svg" import Tooltip from "@/components/Tooltip" import { cn } from "@/lib/utils/cn" @@ -159,7 +160,7 @@ const PlayerWidget = ({ }) }} > - +
    @@ -228,17 +229,21 @@ const PlayerWidget = ({ title="Previous" aria-label={"Previous"} > - + @@ -253,7 +258,7 @@ const PlayerWidget = ({ title="Next" aria-label={"Next"} > - +
    @@ -311,7 +320,7 @@ const PlayerWidget = ({ }) }} > - + @@ -324,7 +333,7 @@ const PlayerWidget = ({ handleCloseWidget() }} > - +
    diff --git a/src/components/ListenToPlayer/TopOfPagePlayer/index.tsx b/src/components/ListenToPlayer/TopOfPagePlayer/index.tsx index 11588393e77..0ddcda19aae 100644 --- a/src/components/ListenToPlayer/TopOfPagePlayer/index.tsx +++ b/src/components/ListenToPlayer/TopOfPagePlayer/index.tsx @@ -1,4 +1,5 @@ -import { PauseCircleIcon, PlayCircleIcon } from "@/components/icons/listen-to" +import { CirclePause, CirclePlay } from "lucide-react" + import { Button } from "@/components/ui/buttons/Button" import { trackCustomEvent } from "@/lib/utils/matomo" @@ -36,12 +37,12 @@ const TopOfPagePlayer = ({
    {startedPlaying ? ( isPlaying ? ( - + ) : ( - + ) ) : ( - + )}
    {startedPlaying ? ( diff --git a/src/components/icons/listen-to/arrow.svg b/src/components/icons/listen-to/arrow.svg deleted file mode 100644 index 1ce1fd8c95b..00000000000 --- a/src/components/icons/listen-to/arrow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/components/icons/listen-to/autoplay.svg b/src/components/icons/listen-to/autoplay.svg index 6d004dfda31..a8e56ea8458 100644 --- a/src/components/icons/listen-to/autoplay.svg +++ b/src/components/icons/listen-to/autoplay.svg @@ -1,3 +1,6 @@ - - - \ No newline at end of file + + + + + + diff --git a/src/components/icons/listen-to/collapse.svg b/src/components/icons/listen-to/collapse.svg deleted file mode 100644 index e9a523dbb50..00000000000 --- a/src/components/icons/listen-to/collapse.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/components/icons/listen-to/expand.svg b/src/components/icons/listen-to/expand.svg deleted file mode 100644 index 709ed75ae2a..00000000000 --- a/src/components/icons/listen-to/expand.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/components/icons/listen-to/index.ts b/src/components/icons/listen-to/index.ts deleted file mode 100644 index eb3a40bae12..00000000000 --- a/src/components/icons/listen-to/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import ArrowIcon from "./arrow.svg" -import AutoplayIcon from "./autoplay.svg" -import CollapseIcon from "./collapse.svg" -import ExpandIcon from "./expand.svg" -import PauseCircleIcon from "./pause-circle.svg" -import PlayCircleIcon from "./play-circle.svg" - -export { - ArrowIcon, - AutoplayIcon, - CollapseIcon, - ExpandIcon, - PauseCircleIcon, - PlayCircleIcon, -} diff --git a/src/components/icons/listen-to/pause-circle.svg b/src/components/icons/listen-to/pause-circle.svg deleted file mode 100644 index 37a8319c0e2..00000000000 --- a/src/components/icons/listen-to/pause-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/components/icons/listen-to/play-circle.svg b/src/components/icons/listen-to/play-circle.svg deleted file mode 100644 index aa7aca0b606..00000000000 --- a/src/components/icons/listen-to/play-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file From 9d6b496545a2f25b1d420f14ed78821b92985777 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun, 29 Jun 2025 18:12:34 -0700 Subject: [PATCH 224/368] feat: migrate find-wallets to ssr; add loading states --- .../find-wallet/_components/find-wallet.tsx | 41 --------- app/[locale]/wallets/find-wallet/page.tsx | 23 ++++- .../FindWalletProductTable/index.tsx | 14 +-- .../FindWalletProductTable/lazy.tsx | 8 ++ .../FindWalletProductTable/loading.tsx | 86 +++++++++++++++++++ 5 files changed, 118 insertions(+), 54 deletions(-) delete mode 100644 app/[locale]/wallets/find-wallet/_components/find-wallet.tsx create mode 100644 src/components/FindWalletProductTable/lazy.tsx create mode 100644 src/components/FindWalletProductTable/loading.tsx diff --git a/app/[locale]/wallets/find-wallet/_components/find-wallet.tsx b/app/[locale]/wallets/find-wallet/_components/find-wallet.tsx deleted file mode 100644 index 5a50080d516..00000000000 --- a/app/[locale]/wallets/find-wallet/_components/find-wallet.tsx +++ /dev/null @@ -1,41 +0,0 @@ -"use client" - -import type { ChildOnlyProp, Wallet } from "@/lib/types" - -import Breadcrumbs from "@/components/Breadcrumbs" -import FindWalletProductTable from "@/components/FindWalletProductTable" -import MainArticle from "@/components/MainArticle" - -import { useTranslation } from "@/hooks/useTranslation" -import { usePathname } from "@/i18n/routing" - -const Subtitle = ({ children }: ChildOnlyProp) => ( -

    - {children} -

    -) - -type Props = { - wallets: Wallet[] -} - -const FindWalletPage = ({ wallets }: Props) => { - const pathname = usePathname() - const { t } = useTranslation("page-wallets-find-wallet") - - return ( - -
    - -

    - {t("page-find-wallet-title")} -

    - {t("page-find-wallet-description")} -
    - - -
    - ) -} - -export default FindWalletPage diff --git a/app/[locale]/wallets/find-wallet/page.tsx b/app/[locale]/wallets/find-wallet/page.tsx index 24e42889a64..e67d8986713 100644 --- a/app/[locale]/wallets/find-wallet/page.tsx +++ b/app/[locale]/wallets/find-wallet/page.tsx @@ -7,7 +7,10 @@ import { import { Lang } from "@/lib/types" +import Breadcrumbs from "@/components/Breadcrumbs" +import FindWalletProductTable from "@/components/FindWalletProductTable/lazy" import I18nProvider from "@/components/I18nProvider" +import MainArticle from "@/components/MainArticle" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" @@ -17,10 +20,12 @@ import { getSupportedLocaleWallets, } from "@/lib/utils/wallets" -import FindWalletPage from "./_components/find-wallet" - const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { const { locale } = await params + const t = await getTranslations({ + locale, + namespace: "page-wallets-find-wallet", + }) setRequestLocale(locale) @@ -45,7 +50,19 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { return ( - + +
    + +

    + {t("page-find-wallet-title")} +

    +

    + {t("page-find-wallet-description")} +

    +
    + + +
    ) } diff --git a/src/components/FindWalletProductTable/index.tsx b/src/components/FindWalletProductTable/index.tsx index f75658e884f..dedaea9a93f 100644 --- a/src/components/FindWalletProductTable/index.tsx +++ b/src/components/FindWalletProductTable/index.tsx @@ -1,4 +1,6 @@ -import { useEffect, useMemo, useState } from "react" +"use client" + +import { useMemo, useState } from "react" import { ChainName, @@ -22,15 +24,11 @@ import WalletSubComponent from "./WalletSubComponent" import { useTranslation } from "@/hooks/useTranslation" const FindWalletProductTable = ({ wallets }: { wallets: Wallet[] }) => { + console.log({ wallets }) const { t } = useTranslation("page-wallets-find-wallet") const walletPersonas = useWalletPersonaPresets() const walletFilterOptions = useWalletFilters() const [filters, setFilters] = useState(walletFilterOptions) - const [isClient, setIsClient] = useState(false) - - useEffect(() => { - setIsClient(true) - }, []) const activeFilterKeys = useMemo(() => { const keys: string[] = [] @@ -101,10 +99,6 @@ const FindWalletProductTable = ({ wallets }: { wallets: Wallet[] }) => { }) } - if (!isClient) { - return null - } - if (!Array.isArray(wallets)) { return
    Error loading wallets
    } diff --git a/src/components/FindWalletProductTable/lazy.tsx b/src/components/FindWalletProductTable/lazy.tsx new file mode 100644 index 00000000000..e74ae58690a --- /dev/null +++ b/src/components/FindWalletProductTable/lazy.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./index"), { + ssr: false, + loading: Loading, +}) diff --git a/src/components/FindWalletProductTable/loading.tsx b/src/components/FindWalletProductTable/loading.tsx new file mode 100644 index 00000000000..291452ede3a --- /dev/null +++ b/src/components/FindWalletProductTable/loading.tsx @@ -0,0 +1,86 @@ +import { Skeleton, SkeletonLines } from "../ui/skeleton" + +const WalletSkeleton = () => ( + <> + {Array.from({ length: 3 }).map((_, idx) => ( +
    + + +
    + +
    + + + +
    + +
    + +
    +
    +
    + +
    +
    + ))} + +) +const Loading = () => ( +
    +
    + {Array.from({ length: 5 }).map((_, idx) => ( + + ))} +
    +
    +
    +
    + + +
    + +
    + +
    +
    +
    +
    + +
    + + +
    +
    + {Array.from({ length: 3 }).map((_, setIdx) => ( +
    + {Array.from({ length: 4 }).map((_, idx) => ( +
    + + + +
    + ))} +
    + ))} +
    +
    +
    + + +
    + +
    +
    +
    +) + +export default Loading From 4c475d2ffae4e40adb2e28fb53963671dddb3821 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun, 29 Jun 2025 19:40:19 -0700 Subject: [PATCH 225/368] revert: pre-commit hook --- .husky/pre-commit | 2 -- 1 file changed, 2 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 05e6ab0d529..2312dc587f6 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,3 +1 @@ npx lint-staged -pnpm update-tutorials -git add src/data/internalTutorials.json From 0f4e482f762de4260350b12879788243b5e8644e Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun, 29 Jun 2025 19:40:39 -0700 Subject: [PATCH 226/368] docs: add note on tutorials flow --- docs/review-process.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/review-process.md b/docs/review-process.md index d8fbe130686..18e0ae97bcb 100644 --- a/docs/review-process.md +++ b/docs/review-process.md @@ -50,4 +50,6 @@ Adding new products is currently a low-to-medium priority (depending on the type Adding new tutorials to [ethereum.org](http://ethereum.org) is currently low-priority. We are currently in the middle of an epic to revamp our tutorials. As part of this, we’ll be reviewing our existing tutorials, purging outdated or low-quality tutorials, and refining our listing criteria for future tutorials to meet our increased standards. Please always create an issue to discuss the usefulness of your proposed tutorial before opening a PR. +New tutorials should be placed in `public/content/developers/tutorials/your-tutorial-name/index.md`, with `your-tutorial-name` added to `src/data/internalTutorials.json` for inclusion. + **Timeline:** PRs should be closed or merged within 30 days of opening. From 19e0f0d962acec760b0ff44b517342d9c2ea39d4 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 13:35:37 +0000 Subject: [PATCH 227/368] fix: remove deprecated State Channel Application tutorial Remove the "State Channel Application" tutorial that links to https://speedrunethereum.com/challenge/state-channels which returns 404. Fixes #15747 Co-authored-by: Jakub --- src/data/externalTutorials.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/data/externalTutorials.json b/src/data/externalTutorials.json index 9ea358d99fb..f514cd0e25a 100644 --- a/src/data/externalTutorials.json +++ b/src/data/externalTutorials.json @@ -636,18 +636,6 @@ "lang": "en", "publishDate": "04/24/2024" }, - { - "url": "https://speedrunethereum.com/challenge/state-channels", - "title": "State Channel Application", - "description": "Create an app to lock collateral onchain, transact offchain, then finalize onchain.", - "author": "Austin Griffith", - "authorGithub": "https://github.com/austintgriffith", - "tags": ["solidity", "smart contracts", "react", "nextjs", "wagmi", "javascript", "typescript", "frontend", "openzeppelin"], - "skillLevel": "intermediate", - "timeToRead": "60", - "lang": "en", - "publishDate": "04/24/2024" - }, { "url": "https://github.com/scaffold-eth/se-2-challenges/tree/challenge-6-multisig", "title": "Multisig wallet", From e6169bcdc0beec41030cca55aec006213a4585a7 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 30 Jun 2025 16:46:37 +0200 Subject: [PATCH 228/368] clean redundant code --- tests/e2e/find-wallet.spec.ts | 1 - tests/e2e/global.spec.ts | 2 -- tests/e2e/home.spec.ts | 1 - tests/e2e/pages/BasePage.ts | 9 +-------- tests/e2e/whitepaper.spec.ts | 1 - 5 files changed, 1 insertion(+), 13 deletions(-) diff --git a/tests/e2e/find-wallet.spec.ts b/tests/e2e/find-wallet.spec.ts index 83b1a5990df..d747ceb58fe 100644 --- a/tests/e2e/find-wallet.spec.ts +++ b/tests/e2e/find-wallet.spec.ts @@ -8,7 +8,6 @@ test.describe("Find Wallet Page", () => { test.beforeEach(async ({ page }) => { findWalletPage = new FindWalletPage(page) await findWalletPage.goto() - await findWalletPage.waitForPageReady() }) test("loads successfully", async ({ page }, testInfo) => { diff --git a/tests/e2e/global.spec.ts b/tests/e2e/global.spec.ts index d58c5ac7d92..ccff02c7024 100644 --- a/tests/e2e/global.spec.ts +++ b/tests/e2e/global.spec.ts @@ -54,7 +54,6 @@ test.describe("Global", () => { test.beforeEach(async ({ page }) => { homePage = new HomePage(page) await homePage.goto() - await homePage.waitForPageReady() }) async function switchToChinese(page: Page, homePage: HomePage) { @@ -97,7 +96,6 @@ test.describe("Global", () => { page, }) => { await homePage.goto() - await homePage.waitForPageReady() await homePage.assertUrlMatches(`/${DEFAULT_LOCALE}/`) diff --git a/tests/e2e/home.spec.ts b/tests/e2e/home.spec.ts index 938b620b2eb..8485d52c78c 100644 --- a/tests/e2e/home.spec.ts +++ b/tests/e2e/home.spec.ts @@ -9,7 +9,6 @@ test.describe("Home Page", () => { test.beforeEach(async ({ page }) => { homePage = new HomePage(page) await homePage.goto() - await homePage.waitForPageReady() }) test("loads successfully", async ({ page }, testInfo) => { diff --git a/tests/e2e/pages/BasePage.ts b/tests/e2e/pages/BasePage.ts index e79db996eb1..e2078669394 100644 --- a/tests/e2e/pages/BasePage.ts +++ b/tests/e2e/pages/BasePage.ts @@ -44,13 +44,6 @@ export class BasePage { await this.page.waitForLoadState("networkidle", { timeout }) } - /** - * Wait for page to be loaded and ready - */ - async waitForPageLoad(): Promise { - await this.page.waitForLoadState("networkidle") - } - /** * Scroll element into view */ @@ -82,7 +75,7 @@ export class BasePage { */ async navigateTo(url: string): Promise { await this.page.goto(url) - await this.waitForPageLoad() + await this.waitForPageReady() } /** diff --git a/tests/e2e/whitepaper.spec.ts b/tests/e2e/whitepaper.spec.ts index c14867549b0..416fa0dff7f 100644 --- a/tests/e2e/whitepaper.spec.ts +++ b/tests/e2e/whitepaper.spec.ts @@ -11,7 +11,6 @@ test.describe("Whitepaper Page", () => { test("whitepaper PDF link has correct href", async ({ page }) => { const whitepaperPage = new MdPage(page, PAGE_URL) await whitepaperPage.goto() - await whitepaperPage.waitForPageReady() await whitepaperPage.verifyLinkVisible(PDF_LINK_TEXT) await whitepaperPage.verifyLinkHref(PDF_LINK_TEXT, PDF_PATH) }) From c157b8ee9b6fdcefdd0aa0f5fd243981c102b3c7 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 30 Jun 2025 16:50:55 +0200 Subject: [PATCH 229/368] wait for load event (default) instead networkidle that is marked as discoraged --- tests/e2e/pages/BasePage.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/pages/BasePage.ts b/tests/e2e/pages/BasePage.ts index e2078669394..82e953b0843 100644 --- a/tests/e2e/pages/BasePage.ts +++ b/tests/e2e/pages/BasePage.ts @@ -40,8 +40,8 @@ export class BasePage { /** * Wait for page to be fully loaded with all network requests completed */ - async waitForPageReady(timeout = 30000): Promise { - await this.page.waitForLoadState("networkidle", { timeout }) + async waitForPageReady(): Promise { + await this.page.waitForLoadState() } /** From 8c125621b2806b5c3bec11676247bedbbbf86ed1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 30 Jun 2025 12:23:07 -0700 Subject: [PATCH 230/368] patch: rm dev class --- src/components/ListenToPlayer/PlayerWidget/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ListenToPlayer/PlayerWidget/index.tsx b/src/components/ListenToPlayer/PlayerWidget/index.tsx index 87e12a8a461..565e32b4776 100644 --- a/src/components/ListenToPlayer/PlayerWidget/index.tsx +++ b/src/components/ListenToPlayer/PlayerWidget/index.tsx @@ -289,7 +289,7 @@ const PlayerWidget = ({
    {/* CLIENT SIDE */} - {/* */} +
    From 028f1b30de472da458d9c6d978d1b536e4f23537 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:18:08 -0700 Subject: [PATCH 232/368] patch: debug menu styling --- src/components/AB/TestDebugPanel.tsx | 108 +++++++++------------------ 1 file changed, 36 insertions(+), 72 deletions(-) diff --git a/src/components/AB/TestDebugPanel.tsx b/src/components/AB/TestDebugPanel.tsx index dccea97949b..e00e9d1eafa 100644 --- a/src/components/AB/TestDebugPanel.tsx +++ b/src/components/AB/TestDebugPanel.tsx @@ -3,8 +3,12 @@ import { useEffect, useState, useTransition } from "react" import { useRouter } from "next/navigation" +import { cn } from "@/lib/utils/cn" + import { AB_TEST_COOKIE_PREFIX } from "@/lib/constants" +import { Button } from "../ui/buttons/Button" + import { clearABTestCookie, forceABTestVariant } from "@/lib/ab-testing/actions" import { ABTestAssignment } from "@/lib/ab-testing/types" @@ -88,36 +92,16 @@ export function ABTestDebugPanel({ } return ( -
    - + {isOpen && ( -
    +
    Test: {testKey}
    @@ -127,79 +111,59 @@ export function ABTestDebugPanel({ Loading... )}
    -
    +
    Cookie:{" "} {typeof window !== "undefined" && document.cookie.includes(AB_TEST_COOKIE_PREFIX + testKey) ? "✓ Set" : "✗ Missing"}
    -
    +
    Force Variant:
    {availableVariants.map((variant) => ( - + ))} -
    - - +
    From f0eb161e37991bde643992c7e8ffd23047dc8ca5 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:45:02 +0000 Subject: [PATCH 233/368] chore: import translations for am --- src/intl/am/page-get-eth.json | 38 ++++++++++------ src/intl/am/page-wallets-find-wallet.json | 53 ++++++++++++++--------- src/intl/am/page-what-is-ethereum.json | 9 ++-- 3 files changed, 62 insertions(+), 38 deletions(-) diff --git a/src/intl/am/page-get-eth.json b/src/intl/am/page-get-eth.json index 2f91871906d..6100b18c6b0 100644 --- a/src/intl/am/page-get-eth.json +++ b/src/intl/am/page-get-eth.json @@ -9,23 +9,33 @@ "page-get-eth-cex-desc": "ምንዛሬዎች በተለምዶ የምንጠቀመው ገንዘቦችን በመጠቀም ክሪፕቶ እንዲገዙ የሚያስችልዎ ንግዶች ናቸው ። በራሳችሁ ስር ወዳለ ቦርሳ እስክትልኩት ድረስ በምትገዙት ማንኛውም ETH ላይ ጥበቃ አላቸው ።", "page-get-eth-checkout-dapps-btn": "Dappን ይመልከቱ", "page-get-eth-community-safety": "የማህበረሰብ ፖስቶች በደህንነት ላይ", - "page-get-eth-description": "ኢተርየም እና ETH በማንኛውም መንግስት ወይም ኩባንያ ቁጥጥር ሰር አይደሉም - ያልተማከሉ ናቸው። ይህም ማለት ETH ለሁሉም ሰው ለመጠቀም ክፍት ነው።", + "page-get-eth-description": "Ethereum በየትኛውም ድርጅት ስር አይደለም - ያልተማከለ ነው።", "page-get-eth-dex": "ያልተማከሉ ምንዛሪዎች (DEXs)", - "page-get-eth-dex-desc": "የበለጠ ቁጥጥር ከፈለጉ ፣ ETHን አቻ-ለ-አቻ ይግዙ። በDEX የገንዘብዎን ቁጥጥር ለተማከለ ኩባንያ ሳይሰጡ መገበያየት ይችላሉ።", + "page-get-eth-dex-desc": "የበለጠ ቁጥጥር ከፈለጉ ፣ ETH ን ስልጡን ውሎችን በመጠቀም ይግዙ። በተሰባጠረ ፋይናንስ የዲጂታል ገንዘብዎን ቁጥጥር ለተማከለ ኩባንያ ሳይሰጡ መገበያየት ይችላሉ።", + "page-get-eth-peers": "ከባልደረቦችህ ETH ን ተቀበል", + "page-get-eth-peers-desc": "አንዴ የ Ethereum መለያ ካሎት፣ የሚያስፈልጎት ነገር ቢኖር ETH (እና ሌሎች ቶከኖች) አቻ ለአቻ መላክ እና መቀበል ለመጀመር አድራሻዎትን ማጋራት ብቻ ነው።", + "page-get-eth-staking": "ሽልማቶችን ማሰባሰብ", + "page-get-eth-staking-desc": "ቀደም ሲል የተወሰነ ETH ካለዎት፣ አረጋጋጭ መስቀለኛ መንገድን በማስኬድ የበለጠ ገቢ ማግኘት ይችላሉ። ይህንን የማረጋገጫ ስራ በETH ውስጥ ለሰሩበት ክፍያ ይከፈለዎታል።", + "page-get-eth-earn": "ETH ያግኙ", + "page-get-eth-earn-desc": "ለDAOs ወይም በcrypto ውስጥ ለሚከፍሉ ኩባንያዎች በመስራት፣ ጉርሻዎችን በማሸነፍ፣ የሶፍትዌር ስህተቶችን በማግኘት እና ሌሎችንም በማግኘት ETH ማግኘት ይችላሉ።", + "page-get-eth-daos-link-desc": "ስለDAOs ይማሩ", + "page-get-eth-cex-link-desc": "የምንዛሪ ዝርዝሮችን ይመልከቱ", + "page-get-eth-staking-link-desc": "ስለማሰባሰብ የበለጠ ይወቁ", "page-get-eth-dexs": "ያልተማከሉ ምንዛሪዎች (DEXs)", "page-get-eth-dexs-desc": "ያልተማከሉ ምንዛሪዎች ለETH እና ለሌሎች ቶከኖች ክፍት የገበያ ቦታዎች ናቸው። ገዥዎችን እና ሻጮችን በቀጥታ ያገናኛሉ።", "page-get-eth-dexs-desc-2": "በግብይቱ ውስጥ ገንዘቦችን ለመጠበቅ የታመነ ሶስተኛ አካልን ከመጠቀም ይልቅ ኮድን ይጠቀማሉ። የሻጩ ETH ለገዢው የሚተላለፈው ክፍያ ሲረጋገጥ ብቻ ነው። ይህ ዓይነቱ ኮድ ዘመናዊ ውል በመባል ይታወቃል።", - "page-get-eth-dexs-desc-3": "ይህ ማለት ከተማከሉ አማራጮች ሲነጻጸር ያነሰ የቦታ ገደቦች አሉ ማለት ነው.። አንድ ሰው የሚፈልጉትን እየሸጠ ከሆነ እና እርስዎ ማቅረብ የሚችሉትን የመክፈያ ዘዴ ከተቀበለ፣ ለመጀመር ዝግጁ ናችሁ። DEXዎች ሌሎች ቶከኖችን፣ ፔይ ፓልን እንዲሁም በአካል ተገኝቶ ጥሬ ገንዘብን በመጠቀም ETHን ለመግዛት ያስችላል።", + "page-get-eth-dexs-desc-3": "ይህ ማለት ከማዕከላዊ አማራጮች ያነሰ የጂኦግራፊያዊ ገደቦች አሉ ማለት ነው፣ አንድ ሰው የሚፈልጉትን እየሸጠ ከሆነ እና እርስዎ ማቅረብ የሚችሉትን የመክፈያ ዘዴ ከተቀበለ፣ ዝግጁ ኖት ማለት ነው።", + "page-get-eth-dexs-desc-4": "ማሳሰቢያ፡- ብዙ ዲክሰሮች ለመስራት የታሸገ ኤተር (WETH) ይጠቀማሉ። ስለተጠቀለለ ኤተር የበለጠ ይወቁ።\n", "page-get-eth-do-not-copy": "ምሳሌ፡ ኮፒ አታድርጉት", "page-get-eth-exchanges-disclaimer": "ይህንን መረጃ የሰበሰብነው በቆጠራ ነው። የሆነ ስህተት ከተመለከቱ በዚህ ያሳውቁን", - "page-get-eth-exchanges-empty-state-text": "ETHን ለመግዛት የሚያገለግሉ የቦርሳዎች እና የምንዛሬዎችን ዝርዝር ለመመልከት የመኖሪያ ሀገርዎን ያስገቡ", + "page-get-eth-exchanges-empty-state-text": "ሊጠቀሙባቸው የሚችሏቸውን የገንዘብ ልውውጦች ዝርዝር ለማየት የመኖሪያ ሀገርዎን ያስገቡ", "page-get-eth-exchanges-except": "በስተቀር", "page-get-eth-exchanges-header": "በየትኛው ሀገር ነው የሚኖሩት?", "page-get-eth-exchanges-header-exchanges": "ምንዛሬዎች", "page-get-eth-exchanges-header-wallets": "ቦርሳዎች", - "page-get-eth-exchanges-intro": "ምንዛሬዎች እና ቦርሳዎች ክሪፕቶ ሊሸጡበት የሚችሉት ቦታዎች ላይ ገደብ አላቸው።", + "page-get-eth-exchanges-intro": "የገንዘብ ልውውጦች crypto የት መሸጥ እንደሚችሉ ላይ ገደቦች አሏቸው። ይህ በእያንዳንዱ ሀገር ውስጥ ለመስራት የታሰበ አመላካች የአገልግሎቶች ዝርዝር ነው። እዚህ ተካተተ ማለት ማረጋገጫ አይደለም - የራስዎን ምርምር ማድረግ አለብዎት!", "page-get-eth-exchanges-no-exchanges": "ይቅርታ፣ ከዚህ ሀገር ETHን እንድትገዙ የሚያስችልዎት ምንም አይነት ምንዛሪዎችን አናውቅም። እርስዎ ካወቁ በዚህ ያሳውቁን", - "page-get-eth-exchanges-no-exchanges-or-wallets": "ይቅርታ፣ ከዚህ ሀገር ETHን እንድትገዙ የሚያስችልዎት ምንም አይነት ምንዛሪ ወይም ቦርሳ አናውቅም። እርስዎ ካወቁ በዚህ ያሳውቁን", + "page-get-eth-exchanges-no-exchanges-or-wallets": "ይቅርታ፣ ከዚህ ሀገር ETHን እንድትገዙ የሚያስችልዎት ምንም አይነት ምንዛሪዎችን አናውቅም። እርስዎ ካወቁ በዚህ ያሳውቁን", "page-get-eth-exchanges-no-wallets": "ይቅርታ፣ ከዚህ ሀገር ETHን እንድትገዙ የሚያስችልዎት ምንም አይነት ቦርሳ አናውቅም። እርስዎ ካወቁ በዚህ ያሳውቁን", "page-get-eth-exchanges-search": "የሚኖሩበት ቦታ ይጻፉ...", "page-get-eth-exchanges-success-exchange": "በሕጋዊ ማረጋገጫዎች ምክንያት በምንዛሪዎች ለመመዝገብ የተወሰኑ ቀናት ሊወስድ ይችላል።", @@ -36,30 +46,30 @@ "page-get-eth-hero-image-alt": "የጀግና ETHን ምስል ያግኙ", "page-get-eth-keep-it-safe": "የእርስዎ ETHን ደህንነት የጠበቅ", "page-get-eth-meta-description": "በሚኖሩበት ቦታ መሰረት ETHን እንዴት እንደሚገዙ እና እንዴት በጥንቃቄ መጠበቅ እንደሚቻል ምክር።", - "page-get-eth-meta-title": "ETHን እንዴት መግዛት ይቻላል", + "page-get-eth-meta-title": "Ethereum (ETH) እንዴት መግዛት ይቻላል", "page-get-eth-need-wallet": "DEXን ለመጠቀም ቦርሳ ያስፈልግዎታል።", "page-get-eth-new-to-eth": "ለETH አዲስ ነዎት? ለመጀመር ይችሉ ዘንድ አጠር ያለ ሃተታ ይኸውሎት።", "page-get-eth-other-cryptos": "ሌላ ክሪፕቶ በመጠቀም ይግዙ", - "page-get-eth-protect-eth-desc": "ብዙ መጠን ያለው ETHን ለመግዛት ካቀዱ፣ በምንዛሪ ሳይሆን እርስዎ በሚቆጣጠሩት ቦርሳ ውስጥ ማስቀመጥ ይፈልጉ ይሆናል ። ምክንያቱም ምንዛሬ በኮምፒዩተር ሰርጎ ገቦች ኢላማ ስር ሊወድቅ ስለሚችል ነው። የኮምፒዩተር ሰርጎ ገቦች ዘልቀው ከገቡ፣ ገንዘባችሁን ልታጡ ትችላላችሁ። በአንጻሩ ግን ቦርሳዎትን የሚቆጣጠሩት እርስዎ ብቻ ነዎት።", - "page-get-eth-protect-eth-in-wallet": "የእርስዎን ETH በቦርሳ ውስጥ ይጠብቁ", + "page-get-eth-protect-eth-desc": "የግል ሂሳባችንን በማስተዳደር የራሳችን የሆነውን ንብረት አንድንቆጣጠር ማስቻሉ የEthereum ዋነኛ መገለጫ ነው። ይህም ማለት በግል ንብረቶቻችን ላይ ሌላ ሶስተኛ አካልን ማመን ሳይጠበቅብን በተጨማሪም ታማኝ ካልሆኑ ንብረት ጠባቂዎች ራሳችንን በመከላከል ከኪሳራ አና ከህገ ወጥ ጠላፊዎች ንብረታችንን ለመጠበቅ ያስችለናል። ነገር ግን የንብረታችንን ደህንነት ማረጋገጥ ሀላፊነት ሙሉ በሙሉ እኛ ላይ ይወድቃል ማለት ነው።", + "page-get-eth-protect-eth-in-wallet": "ETHዎን በግልዎ ዋሌት ውስጥ ያስቀምጡ", "page-get-eth-search-by-country": "በአገር ይፈልጉ", - "page-get-eth-security": "ይህ ማለት ግን እርስዎ የገንዘብዎን ደህንነት በጥሞና መውሰድ ያስፈልግዎታል ማለት ነው። ETHን ሲጠቀሙ ገንዘቦን ለመጠበቅ ባንክዎን አያምኑም፣ እራስዎን እንጂ።", + "page-get-eth-security": "ይህ ማለት የፈንድዎን ደህንነት በቁም ነገር ሊወስዱት ይገባል ማለት ነው። በETH የእርስዎን ንብረቶች ለመጠበቅ አንድ ባንክ ወይም ድርጅት ላይ እምነትዎን አይጥሉም፣ ለራስዎ ኃላፊነት ይወስዳሉ።", "page-get-eth-smart-contract-link": "ስለ ዘመናዊ ውሎች ተጨማሪ", "page-get-eth-swapping": "የእርስዎን ቶከኖችዎን በሌሎች ሰዎች ETH ይቀይሩ። እንዲሁም ተገላቢጦሹን ያድርጉ።", "page-get-eth-try-dex": "DEXን ይሞክሩ", "page-get-eth-use-your-eth": "ETHዎን ይጠቀሙ", "page-get-eth-use-your-eth-dapps": "አሁን የETH ባለቤት ስለሆናችሁ፣ አንዳንድ የኢቴሪየም መተግበሪያዎችን (dapps) ይመልከቱ። ለፋይናንስ፣ ማህበራዊ ሚዲያ፣ ጨዋታ እና ሌሎች ብዙ ዘርፎች የሚሆኑ dapps አሉ።", "page-get-eth-wallet-instructions": "የቦርሳ መመሪያዎችን ይከተሉ", - "page-get-eth-wallet-instructions-lost": "የቦርሳዎ አድራሻ ከጠፋብዎ ገንዘብዎን መልሰው ማግኘት አይችሉም። ቦርሳዎ ይህንን ለመከላከል የሚያስችሉ መመሪያዎችን ሊሰጥዎ ይገባል ። መመሪያዎቹን በጥሞና መከተልዎን ያረጋግጡ - አብዛኛውን ጊዜ የቦርሳዎን አድራሻ ካጡ ማንም ሊረዳዎ አይችልም።", + "page-get-eth-wallet-instructions-lost": "የመለያዎ መዳረሻ ከጠፈብዎ፣ የፈንድ መዳረሻዎን ያጣሉ። የእርስዎ ዋሌት ከዚህ ለመጠበቅ መመሪያዎችን ሊሰጥዎ ይችላል። በጥንቃቄ እነሱን መከተልዎን እርግጠኛ ይሁኑ - አብዛኛውን ጊዜ የመለያዎ መዳረሻ ከጠፋብዎ ማንም ሰው ሊረዳዎት አይችልም።", "page-get-eth-wallets": "ቦርሳዎች", "page-get-eth-wallets-link": "ስለ ቦርሳዎች ተጨማሪ", "page-get-eth-wallets-purchasing": "አንዳንድ ቦርሳዎች ክሪፕቶ በዴቢት/ክሬዲት ካርድ፣ በባንክ ማስተላለፍ ወይም በApple Pay ጭምር እንዲገዙ ያስችሉዎታል። የቦታ ገደቦች ተፈጻሚ ይሆናሉ።", - "page-get-eth-warning": "እነዚህ DEXዎች ለአዲስ ጀማሪዎች አይደሉም ምክንያቱም እነሱን ለመጥቀም የተወሰነ ETH ያስፈልግዎታል።", + "page-get-eth-warning": "ለመጠቀም አንዳንድ ETH ስለሚያስፈልግዎት፣ እነዚህ DEXዎች ለጀማሪዎች አይደሉም። እነዚህ ምሳሌዎች ብቻ ናቸው እንጂ የተረጋገጡ ምርቶች አይደሉም። የራስዎን ምርምር ያድርጉ!", "page-get-eth-what-are-DEX's": "DEXዎች ምንድናቸው ?", "page-get-eth-whats-eth-link": "ETH ምንድነው?", - "page-get-eth-where-to-buy-desc": "ETHን ከምንዛሪዎች ወይም በቀጥታ ከቦርሳ መግዛት ይችላሉ።", + "page-get-eth-where-to-buy-desc": "ETH ማግኘት፣ ከአቻዎችዎ መቀበል ወይም ከልውውጦች እና መተግበሪያዎች መግዛት ይችላሉ።", "page-get-eth-where-to-buy-desc-2": "በሚኖሩበት ቦታ ላይ በመመስረት የትኞቹን አገልግሎቶች መጠቀም እንደሚችሉ ይመልከቱ።", - "page-get-eth-where-to-buy-title": "ETH ከየት ይገዛል", + "page-get-eth-where-to-buy-title": "ETHን የት ማግኘት ይቻላል", "page-get-eth-your-address": "የእርስዎ ETH አድራሻ", "page-get-eth-your-address-desc": "ቦርሳ ሲያወርዱ የእርስዎ የሆነ ይፋዊ የETH አድራሻ ይፈጥርልዎታል። ይህን ይመስላል:", "page-get-eth-your-address-desc-3": "ይህንን እንደ ኢሜል አድራሻዎ ያስቡ, ነገር ግን ከደብዳቤ ይልቅ ETH መቀበል ይችላል ። ETHን ከምንዛሬ ወደ ቦርሳዎ ማስተላለፍ ከፈለጉ አድራሻዎን እንደ መድረሻ ይጠቀሙ። ከመላክዎ በፊት ሁል ጊዜ በድጋሚ ማረጋገጥዎን እርግጠኛ ይሁኑ!", diff --git a/src/intl/am/page-wallets-find-wallet.json b/src/intl/am/page-wallets-find-wallet.json index 22450908d1c..a75f91b3fd7 100644 --- a/src/intl/am/page-wallets-find-wallet.json +++ b/src/intl/am/page-wallets-find-wallet.json @@ -1,17 +1,18 @@ { "page-find-wallet-clear": "ማጣሪያዎችን አጽዳ", - "page-find-wallet-desc-2": "ስለዚህ በሚፈልጉት ባህሪያት መሰረት ቦርሳዎን ይምረጡ።", - "page-find-wallet-description": "ቦርሳዎች እርስዎ ሊወዷቸው የሚችሉ ብዙ አማራጭ ባህሪያት አሏቸው።", + "page-find-wallet-desc-2": "ዋሌት ምን አንደሆነ አያውቁምን?", + "page-find-wallet-desc-2-wallets-link": "ስለ ዋሌቶች ይማሩ።", + "page-find-wallet-description": "የዋሌቶች የእርስዎን ETH ያከማቹና ያስተላልፋሉ። ከፍላጎትዎ ጋር የሚጣጣሙ ከተለያዩ ምርቶች ውስጥ መምረጥ ይችላሉ።", "page-find-wallet-last-updated": "መጨረሻ የተሻሻለው", "page-find-wallet-meta-description": "በሚፈልጉት ባህሪያት ላይ በመመስረት የኢቴርየም ቦርሳዎችን ያግኙ እና ያወዳድሩ።", - "page-find-wallet-meta-title": "የኢቴርየም ቦርሳ ያግኙ", - "page-find-wallet-title": "ቦርሳ ያግኙ", + "page-find-wallet-meta-title": "የEthereum ዋሌቶች ዝርዝር | ethereum.org", + "page-find-wallet-title": "ዋሌትዎን ይምረጡ", "page-find-wallet-try-removing": "አንድ ወይም ሁለት ባህሪን ለማስወገድ ይሞክሩ", "page-stake-eth": "ETHን ያስይዙ", - "page-find-wallet-open-source": "Open source", + "page-find-wallet-open-source": "ክፍት የሆን ምንጭ", "page-find-wallet-open-source-desc": "ክፍት-ምንጭ ሶፍትዌር ማንኛውም ሰው የመተግበሪያውን ትክክለኛነት እና ደህንነት እንዲመረምር ያስችለዋል።", "page-find-wallet-self-custody": "የራስ ማቆያ", - "page-find-wallet-non-custodial": "በጥበቃ ስር ያልሆነ", + "page-find-wallet-non-custodial": "የግል ባለቤትነት", "page-find-wallet-non-custodial-desc": "የግል ቁልፎችዎን የማይቆጣጠሩ ቦርሳዎች።", "page-find-wallet-hardware-wallet-support": "የሃርድዌር ቦርሳ ድጋፍ", "page-find-wallet-hardware-wallet-support-desc": "ለተሻለ ደህንነት ከሃርድዌር ቦርሳ ጋር መገናኘት የሚችሉ ቦርሳዎች", @@ -20,7 +21,7 @@ "page-find-wallet-nft-support": "የNFT ድጋፍ", "page-find-wallet-nft-support-desc": "NFTዎችን ማየት እና ከእነሱ ጋር መገናኘትን የሚደግፉ ቦርሳዎች", "page-find-wallet-connect-to-dapps": "ከdapps ጋር ይገናኙ", - "page-find-wallet-connect-to-dapps-desc": "በኢቴርየም አውታረ መረብ ላይ ከተገነቡ መተግበሪያዎች ጋር የሚገናኙ ቦርሳዎች", + "page-find-wallet-connect-to-dapps-desc": "WalletConnectን ወይም አማራጭን ከሚደግፉ መተግበሪያዎች ጋር መገናኘት ይችላሉ።", "page-find-wallet-staking": "ቀብድ ማስያዝ", "page-find-wallet-staking-desc": "ETHን በቀጥታ ከቦርሳ ያስይዙ", "page-find-wallet-swaps": "መለዋወጥ", @@ -41,10 +42,14 @@ "page-find-wallet-multisig-desc": "ግብይትን ለመፍቀድ ከአንድ በላይ ፊርማዎችን የሚጠይቁ ቦርሳዎች", "page-find-wallet-social-recovery": "ማህበራዊ ማገገም", "page-find-wallet-social-recovery-desc": "የዘመናዊ ውል ቦርሳዎችን የመፈረሚያ ቁልፍ ለጠባቂዎች እንዲቀይሩ የሚያስችሉ ቦርሳዎች", - "page-find-wallet-features": "Features", - "page-find-wallet-security": "Security", - "page-find-wallet-smart-contract": "Smart contract", - "page-find-wallet-check-out": "Check out", + "page-find-wallet-languages-supported": "የቋንቋ ድጋፍ", + "page-find-wallet-languages-search-language": "ቋንቋ ፈልግ", + "page-find-wallet-popular-languages": "በጣም ታዋቂ", + "page-find-wallet-features": "ባህሪያት", + "page-find-wallet-security": "ደህንነት", + "page-find-wallet-smart-contract": "ዘመናዊ ተቋራጮች", + "page-find-wallet-advanced": "የላቀ", + "page-find-wallet-check-out": "መውጣት", "page-find-wallet-info-updated-on": "መረጃው የዘመነው", "page-find-wallet-showing-all-wallets": "ሁሉንም ቦርሳዎች ያሳያል", "page-find-wallet-wallets": "ቦርሳዎች", @@ -55,23 +60,29 @@ "page-find-wallet-windows": "Windows", "page-find-wallet-chromium": "Chromium", "page-find-wallet-firefox": "Firefox", - "page-find-wallet-hardware": "Hardware", + "page-find-wallet-hardware": "ሃርድዌር", "page-find-wallet-new-to-crypto-title": "ለክሪፕቶ አዲስ", - "page-find-wallet-new-to-crypto-desc": "የመጀመሪያው ቦርሳዎን የሚፈልጉ አዲስ ተጠቃሚ ነዎት", + "page-find-wallet-new-to-crypto-desc": "የመጀመሪያ ጊዜ ተጠቃሚ ጀማሪ ዋሌት እየፈለገ ነው።", "page-find-wallet-nfts-title": "NFTዎች", - "page-find-wallet-nfts-desc": "ስለ NFTዎች በጣም ፍላጎት ያሎት ሰው ነዎት እና የNFT ድግፍ ያለው ቦርሳ ይፈልጋሉ", - "page-find-wallet-hodler-title": "ሆድለር", - "page-find-wallet-hodler-desc": "ቶከኖች ያሎት እና እነሱን መንካት የማይፈልጉ ሰው ነዎት", + "page-find-wallet-nfts-desc": "በ NFT ድጋፍ ላይ ያተኮሩ ዋሌቶች።", + "page-find-wallet-hodler-title": "ሃርድዌር", + "page-find-wallet-hodler-desc": " ቶክን በንቃት ሳይነግዱ በሃርድዌር ዋሌቶች መያዝ።", "page-find-wallet-finance-title": "ፋይናንስ", - "page-find-wallet-finance-desc": "DeFiን የሚጠቀሙ እና ከDeFi መተግበሪያዎች ጋር መገናኘት የሚያስችል ቦርሳ የሚፈልጉ ሰው ነዎት", + "page-find-wallet-finance-desc": "የDeFi መተግበሪያዎችን በብዛት መጠቀም ላይ የሚያተኩሩ ዋሌቶች።", "page-find-wallet-developer-title": "የሶፍትዌር ገንቢ", - "page-find-wallet-developer-desc": "የሶፍትዌር ገንቢ ነዎት እና dappsን ለመገንባት እና ለመሞከር ቦርሳ ያስፈልግዎታል", - "page-find-wallet-filters": "ማጣሪያዎች", + "page-find-wallet-developer-desc": "የተሰባጠረ መተገበሪያ ለማዳበር የሚያግዙ የኪስ ዋሌቶች።", + "page-find-wallet-active": "ንቁ", "page-find-wallet-footnote-1": "በዚህ ገጽ ላይ የተዘረዘሩ ቦርሳዎች ይፋዊ ማረጋገጫዎች አይደሉም፣ እና እዚህ የቀረቡት ለመረጃ አገልግሎት ብቻ ነው።", "page-find-wallet-footnote-2": "የእነሱ መግለጫዎች በራሳቸው የቦርሳ ፕሮጀክቶች ቀርበዋል፡፡", - "page-find-wallet-footnote-3": "በእኛ ዝርዝር ፖሊሲ ውስጥ ባሉ መስፈርቶች መሰረት ምርቶችን ወደዚህ ገጽ እንጨምራለን። ቦርሳ እንድንጨምር ከፈለጉ በGitHub ላይ ችግሮን ያንሱ።", + "page-find-wallet-footnote-3": "በእኛ ዝርዝር ፖሊሲ ውስጥ ባሉ መስፈርቶች መሰረት ምርቶችን ወደዚህ ገጽ እንጨምራለን። ዋሌት እንድንጨምር ከፈለጉ በGitHub ላይ ችግሮን ያንሱ።", "page-find-wallet-mobile": "ሞባይል", "page-find-wallet-desktop": "ዴስክቶፕ", "page-find-wallet-browser": "የድረገጽ ማሰሻ", - "page-find-wallet-device": "መሳሪያ" + "page-find-wallet-device": "መሳሪያ", + "page-find-wallet-reset-filters": "ዳግም አስጀምር", + "page-find-wallet-visit-website": "ድህረ-ገጽ ይጎብኙ", + "page-find-wallet-social-links": "አገናኞች", + "page-find-wallet-empty-results-title": "ምንም ውጤቶች የሉም", + "page-find-wallet-empty-results-desc": "ከእርስዎ መስፈርት ጋር የሚዛመዱ ዋሌቶች የሉም፣ አንዳንድ ማጣሪያዎችን ለማስወገድ ይሞክሩ።", + "page-find-wallet-see-wallets": "ዋሌቶችን ይመልከቱ" } diff --git a/src/intl/am/page-what-is-ethereum.json b/src/intl/am/page-what-is-ethereum.json index cf225c852ce..cbf2859dea1 100644 --- a/src/intl/am/page-what-is-ethereum.json +++ b/src/intl/am/page-what-is-ethereum.json @@ -34,9 +34,12 @@ "page-what-is-ethereum-cryptocurrency-tab-content-2": "እንደ ቢትኮይን እና ኢተር ያሉ ንብረቶች «ክሪፕቶ ገንዘብ» ተብለው የሚታወቁት ለእርስዎ መረጃ እና ንብረቶች ደህንነት ዋስትና የሚሰጠው በcryptography እንጂ አንድ ተቋም ወይም ድርጅት በታማኝነት እንዲተገብር እሱ ላይ በመተማመን አይደለም።", "page-what-is-ethereum-cryptocurrency-tab-content-3": "ኢቴሬም በአውታረ-መረቡ ላይ ለተወሰኑ ተግባራት ለመክፈል የሚያገለግል የራሱ የሆነ ክሪፕቶፕከረንሲ፣ Ether (ETH) አለው። በኢቲሪየም ላይ ወደ ሌሎች ተጠቃሚዎች ሊተላለፍ ወይም በሌላ ቶከኖች ሊቀየር ይችላል። Ether ልዩ ነው ምክንያቱም በኢቲሪየም ላይ መተግበሪያዎችን እና ድርጅቶችን ለመገንባት እና ለማስኬድ የሚያስፈልገውን ስሌት ለመክፈል ጥቅም ላይ ይውላል።", "page-what-is-ethereum-summary-title": "ማጠቃለያ", - "page-what-is-ethereum-summary-desc-1": "ኢቲሪየም የኢቲሪየም ፕሮቶኮል ተብሎ የሚጠራውን ደንብ የሚከተሉ የአለም አቀፍ የኮምፒውተሮች መረብ ነው። የኢቴሬም አውታረ-መረብ ማንኛውም ሰው ሊገነባ እና ሊጠቀምባቸው ለሚችሉ ማህበረሰቦች፣ አፕሊኬሽኖች፣ ድርጅቶች እና ዲጂታል ንብረቶች መሰረት ሆኖ ይሰራል።", - "page-what-is-ethereum-summary-desc-2": "የኢቲሪየም አካዉንት ከየትኛውም ቦታ ሆነው በማንኛውም ጊዜ መፍጠር እና የመተግበሪያዎችን ዓለም ማሰስ ወይም የራስዎን መገንባት ይችላሉ። ዋናው ፈጠራ ህጎቹን ሊለውጥ ወይም መዳረሻዎን ሊገድብ የሚችል ማዕከላዊ ባለስልጣን ሳያምኑ ይህን ሁሉ ማድረግ ይችላሉ።", - "page-what-is-ethereum-summary-desc-3": "የበለጠ ለማወቅ ማንበብዎን ይቀጥሉ…", + "page-what-is-ethereum-summary-desc-1": "Ethereum በEthereum ፕሮቶኮል የሚደገፉ ሺዎች መተግበሪያዎችን እና ብሎክቼኖችን የሚያቃናቸው ዋና መድረክ ነው።", + "page-what-is-ethereum-summary-desc-2": "ይህ ንቁ ሥነ-ምህዳር ፈጠራን እና ሰፊ ያልተማከሉ መተግበሪያዎችን እና አገልግሎቶችን ያቀጣጥላል።", + "page-what-is-ethereum-summary-bullet-1": "ነፃ እና ዓለማቀፍ የEthereum መለያዎች", + "page-what-is-ethereum-summary-bullet-2": "ቅርጸ-ግል፣ የግል መረጃ አያስፈልግም", + "page-what-is-ethereum-summary-bullet-3": "ያለምንም ዓይነት ግዴታ ማንኛውም ሰው መሳተፍ ይችላል", + "page-what-is-ethereum-summary-bullet-4": "የEthereum ባለቤት የሆነ ድርጅት የለም ወይም የወደፊት እጣ ፈንታውን የሚወስን የለም።", "page-what-is-ethereum-btc-eth-diff-title": "የኢቲሪየምና የቢትኮይን ልዩነት ምንድን ነው?", "page-what-is-ethereum-btc-eth-diff-1": "በ2015 የጀመረው ኢቴሬም ከአንዳንድ ትልቅ ልዩነቶች ጋር በቢትኮይን ፈጠራ ላይ የተገነባ ነው።", "page-what-is-ethereum-btc-eth-diff-2": "ሁለቱም ዲጂታል ገንዘብ ያለክፍያ አቅራቢዎች ወይም ባንኮች እንዲጠቀሙ ያስችሉዎታል። ግን ኢቲሪየም በፕሮግራም የሚደረግ ነው፣ ስለዚህ ያልተማከሉ መተግበሪያዎችን በአውታረ-መረቡ ላይ መገንባት እና መልቀቅ ይችላሉ።", From 1041807537d847734f5080224a21ae5cf5e61fc7 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:45:07 +0000 Subject: [PATCH 234/368] chore: import translations for ca --- src/intl/ca/page-what-is-ethereum.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/ca/page-what-is-ethereum.json b/src/intl/ca/page-what-is-ethereum.json index 1caffe65aa5..aa4fca540d6 100644 --- a/src/intl/ca/page-what-is-ethereum.json +++ b/src/intl/ca/page-what-is-ethereum.json @@ -54,7 +54,7 @@ "page-what-is-ethereum-slide-1-desc-2": "Ethereum i les stablecoins simplifiquen el procés d'enviament de diners a l'estranger. Sovint es triga només uns minuts a moure els fons a tot el món, en lloc d'esperar dies hàbils o fins i tot setmanes, i per una fracció del preu. A més, no hi ha cap comissió addicional per realitzar una transacció de gran valor, i no hi ha restriccions sobre on o per què s'envia els diners.", "page-what-is-ethereum-slide-2-title": "L'ajuda més ràpida en temps de crisi", "page-what-is-ethereum-slide-2-desc-1": "Si teniu la sort de comptar amb múltiples opcions bancàries a través d'institucions de confiança en el lloc on viviu, la llibertat d'elecció, la seguretat i estabilitat financera que ofereixen estan garantides. Però per a moltes persones de tot el món que s'enfronten a la repressió política o a les dificultats econòmiques, les institucions financeres poden no oferir la protecció o els serveis que necessiten.", - "page-what-is-ethereum-slide-2-desc-2": "Quan la guerra, les catàstrofes econòmiques o les mesures energètiques contra les llibertats civils van afectar els residents de Veneçuela, Cuba, Afganistan, Nigèria, Bielorússia i Ucraïna les criptomonedes van constituir la més ràpida i, sovint, l'única opció per a retenir agència financera. 1 Com es veu en aquests exemples, les criptomonedes com Ethereum poden proporcionar accés sense restriccions a l'economia global quan les persones estan aïllades del món exterior. A més, els \"stablecoins\" (monedes estables) ofereixen una botiga de valor quan les monedes locals s'estan col·lapsant a causa de la hiperinflació.", + "page-what-is-ethereum-slide-2-desc-2": "Quan la guerra, les catàstrofes econòmiques o les mesures energètiques contra les llibertats civils van afectar els residents de Veneçuela, Cuba, Afganistan, Nigèria, Bielorússia i Ucraïna les criptomonedes van constituir la més ràpida i, sovint, l'única opció per a retenir agència financera. 1 Com es veu en aquests exemples, les criptomonedes com Ethereum poden proporcionar accés sense restriccions a l'economia global quan les persones estan aïllades del món exterior. A més, els \"stablecoins\" (monedes estables) ofereixen una botiga de valor quan les monedes locals s'estan col·lapsant a causa de la hiperinflació.", "page-what-is-ethereum-slide-3-title": "Empoderant creadors", "page-what-is-ethereum-slide-3-desc-1": "Només en 2021, artistes, músics, escriptors i altres creadors van utilitzar Ethereum per a guanyar al voltant de 3.500 milions de dòlars en conjunt. Això converteix a Ethereum en una de les majors plataformes globals per a creadors, juntament amb Spotify, YouTube i Etsy. Més informació..", "page-what-is-ethereum-slide-4-title": "Empoderant jugadors", From 1dffb8da37bda896bcd99c4834466ee9cdd6cf70 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:45:16 +0000 Subject: [PATCH 235/368] chore: import translations for de --- src/intl/de/common.json | 21 +++++++++++++++++---- src/intl/de/page-index.json | 3 +-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/intl/de/common.json b/src/intl/de/common.json index f73f6a46784..4f998792e2a 100644 --- a/src/intl/de/common.json +++ b/src/intl/de/common.json @@ -30,8 +30,11 @@ "content-resources": "Inhaltsressourcen", "content-standardization": "Standardisierung der Inhalte", "contributing": "Mitwirken", + "contributor-quiz-banner-title": "Sind Sie unsicher, wo Sie anfangen sollen?", + "contributor-quiz-banner-description": "Nehmen Sie an einem kurzen Quiz teil und finden Sie heraus, wie Sie auf ethereum.org mitwirken können.", + "contributor-quiz-banner-button": "Nehmen Sie an einem Quiz teil", "contributors": "Mitwirkende", - "contributors-thanks": "Vielen Dank – an alle, die einen Beitrag zu dieser Seite geleistet haben!", + "contributors-thanks": "Vielen Dank an jeden, der zu dieser Seite \\beigetragen hat!", "cookie-policy": "Cookie-Richtlinien", "copied": "Kopiert", "copy": "Kopieren", @@ -77,6 +80,9 @@ "enterprise": "Unternehmen", "enterprise-mainnet": "Enterprise – Mainnet-Ethereum", "enterprise-menu": "Unternehmens-Menü", + "error-page-title": "Oh, etwas ist schiefgelaufen", + "error-page-description": "Sie können uns helfen, indem Sie dieses Problem in unserem GitHub-Repository melden.", + "error-page-home-link": "Zurück zur Startseite", "esp": "Ökosystem-Unterstützungsprogramm", "eth-current-price": "Aktueller ETH-Preis (USD)", "ethereum": "Ethereum", @@ -198,7 +204,7 @@ "language-zh-tw": "Chinesisch (traditionell)", "languages": "Sprachen", "last-24-hrs": "Letzte 24 Stunden", - "last-edit": "Letzte Änderung", + "page-last-update": "Seite zuletzt aktualisiert:", "last-updated": "Zuletzt aktualisiert", "layer-2": "Layer 2", "learn": "Lernen", @@ -294,6 +300,7 @@ "nav-overview-label": "Übersicht", "nav-participate-overview-description": "Überblick über die Teilnahme", "nav-payments-description": "Ethereum-Zahlungen verändern die Art und Weise, wie wir Geld senden und empfangen", + "nav-prediction-markets-description": "Prediction Markets sind eine Möglichkeit, Wetten auf zukünftige Ereignisse abzuschließen", "nav-primary": "Primäre", "nav-quizzes-description": "Finden Sie heraus, wie gut Sie Ethereum und Kryptowährungen verstehen", "nav-quizzes-label": "Teste dein Wissen", @@ -318,6 +325,7 @@ "nav-roadmap-user-experience": "Bessere Nutzererfahrung", "nav-roadmap-ux-description": "Die Nutzung von Ethereum muss vereinfacht werden", "nav-roadmap-ux-label": "Bessere Benutzererfahrung", + "nav-rwa-description": "Eine Methode, um wertvolle Güter in digitale Token umzuwandeln.", "nav-run-a-node-description": "Werden Sie unabhängig und helfen Sie mit, das Netzwerk zu sichern", "nav-security-description": "Lernen Sie Best Practices zur Verwendung von Kryptowährungen kennen", "nav-smart-contracts-description": "Die grundlegenden Bausteine des Ethereum-Ökosystems", @@ -334,7 +342,7 @@ "nav-staking-solo-label": "Solo-Staking", "nav-start-building-description": "Hilfreiche Informationen für neue Mitglieder", "nav-start-with-crypto-title": "Hier starten", - "nav-start-with-crypto-description": "Ihre ersten Schritte mit Ethereum", + "nav-start-with-crypto-description": "Ihre ersten Schritte zur Verwendung von Ethereum", "nav-translation-program-description": "Eine gemeinsame Bemühung, ethereum.org in alle Sprachen zu übersetzen", "nav-tutorials-description": "Verwaltete Liste mit Community-Tutorials", "nav-use-cases-description": "Entdecken Sie verschiedene Ideen zur Nutzung von Ethereum", @@ -365,17 +373,20 @@ "page-languages-want-more-paragraph": "Übersetzer von ethereum.org sind immer dabei, Seiten in so viele Sprachen wie möglich zu übersetzen. Um zu sehen, woran sie gerade arbeiten oder um Sie anzumelden, um mitzumachen, informieren Sie sich über unser", "page-languages-words": "Wörter", "page-last-updated": "Seite zuletzt aktualisiert", + "page-not-found": "Seite nicht gefunden", + "page-not-found-description": "Die angefragte Seite konnte nicht gefunden werden.", "participate": "Teilnehmen", "participate-menu": "Teilnahmemenü", "payments-page": "Zahlungen", "pbs": "Proposer-Builder-Trennung", "pools": "Gepooltes Staking", + "prediction-markets": "Prognosemärkte", "privacy-policy": "Datenschutzrichtlinien", "private-ethereum": "Ethereum privat", "product-disclaimer": "Produkte und Dienstleistungen werden als Annehmlichkeit für die Ethereum-Community aufgelistet. Die Aufnahme eines Produkts oder einer Dienstleistung stellt keine Empfehlung des Teams der Website ethereum.org oder der Ethereum Foundation dar.", "quizzes": "Quizze", "quizzes-title": "Quiz-Hub", - "refresh": "Bitte aktualisieren Sie die Seite.", + "refresh": "Seite aktualisieren", "regenerative-finance": "ReFi - Regenerative Finanzen", "research": "Forschung", "research-menu": "Forschungsmenü", @@ -386,6 +397,7 @@ "rollup-component-technology-and-risk-summary": "Technologie- und Risikozusammenfassung", "rollup-component-website": "Website", "run-a-node": "Einen Node betreiben", + "real-world-assets": "RWAs – Reale Vermögenswerte", "saas": "Staking als Dienst", "scaling": "Skalierung", "search": "Suche", @@ -424,6 +436,7 @@ "translation-banner-title-new": "Helfen Sie mit, diese Seite zu übersetzen", "translation-banner-title-update": "Helfen Sie mit, diese Seite zu aktualisieren", "translation-program": "Übersetzungsprogramm", + "translator": "Übersetzer:in", "try-using-search": "Benutzen Sie die Suchfunktion, um zu finden, wonach Sie suchen", "tutorials": "Tutorials", "up": "Nach oben", diff --git a/src/intl/de/page-index.json b/src/intl/de/page-index.json index 5303ce45ac2..84f07df3f58 100644 --- a/src/intl/de/page-index.json +++ b/src/intl/de/page-index.json @@ -40,7 +40,7 @@ "page-index-cta-wallet-description": "Erstelle Konten und verwalte Vermögenswerte", "page-index-cta-wallet-label": "Wähle eine Wallet", "page-index-cta-build-apps-description": "Erstellen Sie Ihre erste App", - "page-index-cta-build-apps-label": "Jetzt entwickeln", + "page-index-cta-build-apps-label": "Fangen Sie an zu bauen", "page-index-description": "Die führende Plattform für innovative Anwendungen und Blockchain-Netzwerke", "page-index-developers-code-example-description-0": "Schaffe eine Bank, die der Logik folgt, die du programmiert hast", "page-index-developers-code-example-description-1": "Erstelle Token, die du anwendungsübergreifend transferieren und verwenden kannst", @@ -83,7 +83,6 @@ "page-index-posts-header": "Neue Beiträge", "page-index-posts-subtitle": "Die neuesten Blogbeiträge und Updates aus der Community", "page-index-title": "Willkommen bei Ethereum", - "page-index-use-cases-tag": "Anwendungsfälle", "page-index-values-description": "Werde Teil der digitalen Revolution", "page-index-values-header": "Das Internet verändert sich", "page-index-values-legacy": "Legacy", From 5681a11e01e84470e8fc9a852e933cc398bd0257 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:45:29 +0000 Subject: [PATCH 236/368] chore: import translations for fr --- .../fr/contributing/adding-layer-2s/index.md | 2 +- .../contributing/content-resources/index.md | 2 +- .../translators-guide/index.md | 4 +- .../dex-design-best-practice/index.md | 6 +- .../node-architecture/index.md | 2 +- .../formal-verification/index.md | 2 +- .../docs/standards/tokens/erc-777/index.md | 2 +- .../fr/guides/how-to-swap-tokens/index.md | 4 +- .../content/translations/fr/history/index.md | 114 +++++++++++++----- src/intl/fr/common.json | 19 ++- .../fr/page-developers-local-environment.json | 2 +- src/intl/fr/page-index.json | 5 +- src/intl/fr/page-layer-2-learn.json | 55 +++++++++ 13 files changed, 169 insertions(+), 50 deletions(-) create mode 100644 src/intl/fr/page-layer-2-learn.json diff --git a/public/content/translations/fr/contributing/adding-layer-2s/index.md b/public/content/translations/fr/contributing/adding-layer-2s/index.md index ec77967918c..18c84d4f524 100644 --- a/public/content/translations/fr/contributing/adding-layer-2s/index.md +++ b/public/content/translations/fr/contributing/adding-layer-2s/index.md @@ -92,6 +92,6 @@ _Nous ne considérons pas comme relevant de la couche 2 les autres solutions d' Si vous souhaitez ajouter une Couche 2 sur ethereum.org, créez un ticket sur GitHub. - + Créez un ticket diff --git a/public/content/translations/fr/contributing/content-resources/index.md b/public/content/translations/fr/contributing/content-resources/index.md index 8d1f6574770..6dbae83cee0 100644 --- a/public/content/translations/fr/contributing/content-resources/index.md +++ b/public/content/translations/fr/contributing/content-resources/index.md @@ -27,6 +27,6 @@ Les ressources d'apprentissage seront évaluées selon les critères suivants : Si vous souhaitez ajouter une ressource de contenu à ethereum.org et qu'elle répond aux critères, créez un ticket sur GitHub. - + Créez un ticket diff --git a/public/content/translations/fr/contributing/translation-program/translators-guide/index.md b/public/content/translations/fr/contributing/translation-program/translators-guide/index.md index bcb331c2aca..64dbf0cfcf5 100644 --- a/public/content/translations/fr/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/fr/contributing/translation-program/translators-guide/index.md @@ -116,7 +116,7 @@ La meilleure façon de gérer les liens est de les copier directement à partir ![Exemple de lien.png](./example-of-link.png) -Les liens apparaissent également dans le texte source sous la forme de balises (c'est-à-dire `<0> `). Si vous survolez la balise, l'éditeur affichera son véritable contenu. Parfois, ces balises désigneront des liens. +Les liens apparaissent également dans le texte source sous la forme de balises (c'est-à-dire \<0> \). Si vous survolez la balise, l'éditeur affichera son véritable contenu. Parfois, ces balises désigneront des liens. Il est très important de copier les liens depuis le texte source et de ne pas modifier l'ordre des balises. @@ -154,7 +154,7 @@ nonce - _Texte non traduisible_ Le texte source contient aussi des balises raccourcies. Elles contiennent uniquement des chiffres et leur fonction n'est donc pas directement identifiable. Vous pouvez survoler ces balises pour voir exactement ce à quoi elles servent. -Dans l'exemple ci-dessous, vous pouvez voir que survoler la balise `<0>` nous permet de savoir qu'elle désigne en fait une balise `` et qu'elle contient un extrait de code. Le contenu de ces balises ne doit donc pas être traduit. +Dans l'exemple ci-dessous, vous pouvez voir que survoler la balise \<0> nous permet de savoir qu'elle désigne en fait une balise `` et qu'elle contient un extrait de code. Le contenu de ces balises ne doit donc pas être traduit. ![Exemple de balises ambiguës.png](./example-of-ambiguous-tags.png) diff --git a/public/content/translations/fr/developers/docs/design-and-ux/dex-design-best-practice/index.md b/public/content/translations/fr/developers/docs/design-and-ux/dex-design-best-practice/index.md index 0ff53041b88..41ab7455f08 100644 --- a/public/content/translations/fr/developers/docs/design-and-ux/dex-design-best-practice/index.md +++ b/public/content/translations/fr/developers/docs/design-and-ux/dex-design-best-practice/index.md @@ -179,7 +179,7 @@ La loi de proximité stipule que les éléments proches sont perçus comme étan En fin de compte, les deux options présentent des avantages et des inconvénients, mais il est intéressant de noter que la tendance est au jeton placé à droite. -## Comportement du bouton {#button-behavior} +# Comportement du bouton {#button-behavior} N'ayez pas de bouton séparé pour l'approbation. Évitez également de demander un clic séparé pour l'approbation. L'utilisateur veut effectuer un échange, il suffit donc d'indiquer "échanger" sur le bouton et de lancer l'approbation comme première étape. Une fenêtre modale peut afficher la progression avec un indicateur d'étapes, ou une simple notification du type "tx 1 sur 2 - approbation en cours". @@ -187,7 +187,7 @@ N'ayez pas de bouton séparé pour l'approbation. Évitez également de demander ![Une interface utilisateur avec un seul bouton d'approbation](./15.png) -### Bouton comme aide contextuelle {#button-as-contextual-help} +## Bouton comme aide contextuelle {#button-as-contextual-help} Le bouton peut également servir d'alerte ! @@ -205,7 +205,7 @@ Le bouton peut également être **associé à l'action** qui doit être effectu ![Message d'erreur affiché dans le principal appel à l'action](./17.png) -### Construisez le vôtre avec ce fichier Figma {#build-your-own-with-this-figma-file} +## Construisez le vôtre avec ce fichier Figma {#build-your-own-with-this-figma-file} Grâce au travail acharné de plusieurs protocoles, la conception des DEX s'est beaucoup améliorée. Nous savons de quelles informations l'utilisateur a besoin, de quelle manière nous devons les présenter et comment rendre le flux aussi fluide que possible. Nous espérons que cet article vous offrira un aperçu solide des principes UX. diff --git a/public/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/index.md index a6adc5973b0..a611ccec1f3 100644 --- a/public/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/index.md +++ b/public/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/index.md @@ -18,7 +18,7 @@ Pour que cette structure à deux clients fonctionne, les clients de consensus do ## Que fait le client d'exécution ? {#execution-client} -Le client d’exécution est responsable de la validation, du traitement et de la propagation des transactions, ainsi que de la gestion de l’état et du support de la Machine Virtuelle Ethereum ([EVM](/developers/docs/evm/)). Il n'est **pas** responsable de la construction de blocs, de leur propagation ou de la gestion de la logique de consensus. Ces responsabilités relèvent du client de consensus. +Le client d’exécution est responsable de la validation, du traitement et de la propagation des transactions, ainsi que de la gestion de l’état et du support de la Machine Virtuelle Ethereum ([EVM\](/developers/docs/evm/)). Il n'est **pas** responsable de la construction de blocs, de leur propagation ou de la gestion de la logique de consensus. Ces responsabilités relèvent du client de consensus. Le client d'exécution crée des charges utiles d'exécution - la liste des transactions, la trie d'état mise à jour, et d'autres données liées à l'exécution. Les clients de consensus incluent la charge utile d'exécution dans chaque bloc. Le client d'exécution est également responsable de réexécuter les transactions dans les nouveaux blocs pour s'assurer qu'elles sont valides. L'exécution des transactions est effectuée sur l'ordinateur intégré du client d'exécution, connu sous le nom de [Machine Virtuelle Ethereum (EVM)](/developers/docs/evm). diff --git a/public/content/translations/fr/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/fr/developers/docs/smart-contracts/formal-verification/index.md index 7c43dec0543..6c3a724a3b8 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/formal-verification/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/formal-verification/index.md @@ -70,7 +70,7 @@ Les spécifications formelles de bas niveau peuvent être données sous forme de ### Propriétés de style Hoare {#hoare-style-properties} -[La logique Hoare](https://en.wikipedia.org/wiki/Hoare_logic) fournit un ensemble de règles formelles pour raisonner sur la correction des programmes, y compris les contrats intelligents. Une propriété de style Hoare est représentée par un triple Hoare `{P}c{Q}`, où `c` est un programme et `P` et `Q` sont des prédicats sur l'état de `c` (c'est-à-dire le programme), formellement décrits comme des _prérequis_ et des _conditions ulérieures_, respectivement. +[La logique Hoare](https://en.wikipedia.org/wiki/Hoare_logic) fournit un ensemble de règles formelles pour raisonner sur la correction des programmes, y compris les contrats intelligents. Une propriété de style Hoare est représentée par un triple Hoare {_P_}_c_{_Q_}, où _c_ est un programme et _P_ et _Q_ sont des prédicats sur l'état de _c_ (c'est-à-dire le programme), formellement décrits comme des _prérequis_ et des _conditions ulérieures_, respectivement. Un prérequis est un prédicat décrivant les conditions requises pour l'exécution correcte d'une fonction ; les utilisateurs qui font appel au contrat doivent satisfaire à cette exigence. Une condition ultérieure est un prédicat décrivant la condition qu'une fonction établit si elle est correctement exécutée ; les utilisateurs peuvent s'attendre à ce que cette condition soit vraie après avoir appelé la fonction. Un _invariant_ en logique Hoare est un prédicat qui est préservé par l'exécution d'une fonction (c'est-à-dire qu'il ne change pas). diff --git a/public/content/translations/fr/developers/docs/standards/tokens/erc-777/index.md b/public/content/translations/fr/developers/docs/standards/tokens/erc-777/index.md index 3b97a56dc19..2582c95635e 100644 --- a/public/content/translations/fr/developers/docs/standards/tokens/erc-777/index.md +++ b/public/content/translations/fr/developers/docs/standards/tokens/erc-777/index.md @@ -1,6 +1,6 @@ --- title: Norme de jeton ERC-777 -description: null +description: lang: fr --- diff --git a/public/content/translations/fr/guides/how-to-swap-tokens/index.md b/public/content/translations/fr/guides/how-to-swap-tokens/index.md index 27cb9af82dd..83dabe11020 100644 --- a/public/content/translations/fr/guides/how-to-swap-tokens/index.md +++ b/public/content/translations/fr/guides/how-to-swap-tokens/index.md @@ -12,7 +12,7 @@ Un échange de jetons implique l'échange de deux actifs différents qui existen **Prérequis :** -- détenir un [portefeuille de cryptomonnaies](/glossary/#wallet), vous pouvez suivre ce tutoriel : [Comment : « Enregistrer » un compte Ethereum](/guides/how-to-create-an-ethereum-account/) +- avoir un [portefeuille crypto](/glossary/#wallet) ; si ce n’est pas le cas, vous pouvez suivre ce guide pour découvrir [comment créer un compte Ethereum](/guides/how-to-create-an-ethereum-account/) - ajouter des fonds à votre portefeuille ## 1. Connectez votre portefeuille à l'échange décentralisé (DEX) de votre choix @@ -22,7 +22,7 @@ Parmi les échanges décentralisés les plus connus : - [Uniswap](https://app.uniswap.org/#/swap) - [Sushiswap](https://www.sushi.com/swap) - [1Inch](https://app.1inch.io/#/1/unified/swap/ETH/DAI) -- [Curve](https://curve.fi/#/ethereum/swap) +- [Curve](https://www.curve.finance/dex/ethereum/swap/) Intéressant ? Apprenez-en plus sur ce qu'est la [finance décentralisée (DeFi)](/defi/) et comment ce nouveau type d'échange fonctionne. diff --git a/public/content/translations/fr/history/index.md b/public/content/translations/fr/history/index.md index 7d7d16c5671..d6bd23071fb 100644 --- a/public/content/translations/fr/history/index.md +++ b/public/content/translations/fr/history/index.md @@ -23,42 +23,45 @@ Ces changements de règles peuvent créer une scission temporaire dans le résea Le logiciel qui sous-tend Ethereum est composé de deux moitiés, connues sous le nom de [couche d'exécution](/glossary/#execution-layer) et de [couche de consensus](/glossary/#consensus-layer). -**Nom des mises à jour de la couche d'exécution** - -Depuis 2021, les mises à jour de la **couche d'exécution** sont nommées en fonction du nom de la ville où a eu lieu la [précédente conférence Devcon](https://devcon.org/en/past-events/). Par ordre chronologique : - -| Nom | Année de la Devcon| Numéro de la Devcon | Date de mise à jour | -| ------------ | ----------- | ------------- | ------------ | -| Berlin | 2015 | 0 | 15 Avril 2021 | -| Londre | 2016 | I | 5 Août 2021 | -| Shanghai | 2017 | II | 12 Avril 2023 | -| **Cancun** | 2018 | III | 13 Mars 2024 | -| _Prague_ | 2019 | IV | À déterminer | -| _Osaka_ | 2020 | V | À déterminer | -| _Bogota_ | 2022 | VI | À déterminer | -| _Bangkok_ | 2024 | VII | À déterminer | - -**Nom des mises à jour de la couche de consensus** - -Depuis le lancement de la [chaîne phare](/glossary/#beacon-chain), les mises à jour de la **couche de consensus** sont nommées d'après des étoiles célestes commençant par des lettres qui se suivent dans l'ordre alphabétique : - -| Nom | Date de mise à jour | -| ----------------------------------------------------------- | ------------ | -| Beacon Chain genesis | Dec 1, 2020 | -| [Altaïr](https://fr.wikipedia.org/wiki/Altaïr) | Oct 27, 2021 | -| [Bellatrix](https://fr.wikipedia.org/wiki/Gamma_Orionis) | Sep 6, 2022 | -| [Capella](https://fr.wikipedia.org/wiki/Capella_(étoile)) | Apr 12, 2023 | -| [**Deneb**](https://fr.wikipedia.org/wiki/Deneb) | Mar 13, 2024 | -| [_Electra_]() | À déterminer | +**Nom des mises à niveau de la couche d'exécution** + +Depuis 2021, les mises à niveau de la **couche d'exécution** sont nommées selon les noms de villes ayant accueilli [les précédents Devcon](https://devcon.org/en/past-events/), dans l'ordre chronologique : + +| Nom de la mise à niveau | Année du Devcon | Numéro du Devcon | Date de mise à niveau | +| ----------------------- | --------------- | ---------------- | --------------------- | +| Berlin | 2014 | 0 | 15 avril 2021 | +| Londres | 2015 | I | 5 août 2021 | +| Shanghai | 2016 | II | 12 avril 2023 | +| Cancun | 2017 | III | 13 mars 2024 | +| **Prague** | 2018 | IV | À définir – Prochaine | +| _Osaka_ | 2019 | V | À définir | +| _Bogota_ | 2022 | VI | À définir | +| _Bangkok_ | 2024 | VII | À définir | + +**Nom des mises à niveau de la couche de consensus** + +Depuis le lancement de la [chaîne phare](/glossary/#beacon-chain), les mises à niveau de la **couche de consensus** sont nommées d'après des étoiles célestes, en suivant l'ordre alphabétique : + +| Nom de la mise à niveau | Date de mise à niveau | +| ------------------------------------------------------------ | ---------------------- | +| Genèse de la Beacon Chain | 1er décembre 2020 | +| [Altair](https://fr.wikipedia.org/wiki/Altair) | 27 octobre 2021 | +| [Bellatrix](https://fr.wikipedia.org/wiki/Bellatrix) | 6 septembre 2022 | +| [Capella](https://fr.wikipedia.org/wiki/Capella) | 12 avril 2023 | +| [Deneb](https://fr.wikipedia.org/wiki/Deneb) | 13 mars 2024 | +| [**Electra**]() | À définir - Prochaine| +| [_Fulu_]() | À déterminer | **Dénomination combiné** -Initialement, les mises à jour des couches d'exécution et de consensus n'étaient pas déployées simultanément. Mais après [La Fusion](/roadmap/merge/) réalisée en 2022, elles ont été déployées simultanément. Ainsi, des termes familiers sont apparus pour simplifier les références à ces mises à niveau en utilisant un seul terme conjoint. Cela a commencé avec la mise à niveau _Shanghai-Capella_, communément appelée "**Shapella**", et se poursuit avec la mise à niveau _Cancun-Deneb_, qui peut être appelée "**Dencun**." +Initialement, les mises à niveau des couches d'exécution et de consensus n'étaient pas déployées simultanément. Mais depuis [La Fusion](/roadmap/merge/) réalisée en 2022, elles sont déployées simultanément. Ainsi, des termes familiers sont apparus pour simplifier les références à ces mises à niveau en utilisant un seul terme conjoint. Cela a commencé avec la mise à niveau _Shanghai-Capella_, communément appelée "**Shapella**", et se poursuit avec la mise à niveau _Cancun-Deneb_(**Dencun**), puis la mise à niveau Prague-Electra_ (**Pectra**). -| Mise à niveau Exécution | Mise à niveau Consensus | Nom court | +| Mise à niveau de l'exécution | Mise à niveau du consensus | Nom abrégé | | ----------------- | ----------------- | ---------- | | Shanghai | Capella | "Shapella" | | Cancun | Deneb | "Dencun" | +| Prague | Electra | "Pectra" | +| Osaka | Fulu | "Fusaka" | @@ -68,6 +71,55 @@ Vous cherchez les prochaines mises à jour de protocole ? [Découvrez les mises +## 2025 {#2025} + +### Prague-Electra ("Pectra") {#pectra} + + + +La mise à jour Prague-Electra (« Pectra ») a introduit plusieurs améliorations du protocole Ethereum destinés à améliorer l’expérience pour tous les utilisateurs, les réseaux de couche 2, les validateurs (stakers) et les opérateurs de nœuds. + +La mise en jeu a été améliorée grâce à l’introduction de comptes de capitalisation de validateurs et à un meilleur contrôle des fonds mis en jeu via l’adresse de retrait d’exécution. L'EIP-7251 a augmenté le solde effectif maximal pour un validateur unique à 2048 ETH, améliorant ainsi l'efficacité du capital pour les validateurs. L'EIP-7002 a permis à un compte d'exécution de déclencher en toute sécurité des actions de validation, comme la sortie ou le retrait partiel des fonds, améliorant l’expérience des validateurs d'ETH tout en renforçant la responsabilité des opérateurs de nœuds. + +D'autres aspects de la mise à jour avaient pour objectif d'améliorer l'expérience des utilisateurs réguliers. L’EIP-7702 a introduit la possibilité pour un compte classique ne disposant pas de contrat intelligent ([EOA](/glossary/#eoa)) d’exécuter du code de manière similaire à un contrat intelligent. Cela a débloqué une multitude de nouvelles fonctionnalités pour les comptes Ethereum traditionnels, telles que le regroupement de transactions, le parrainage des frais de gaz, l’authentification alternative, le contrôle programmable des dépenses, des mécanismes de récupération de compte, et bien plus encore. + + + +Meilleure expérience utilisateur : + +
      +
    • EIP-7702 - Définir le code du compte EOA
    • +
    • EIP-7691 - Augmentation du débit des blobs
    • +
    • EIP-7623 - Augmenter le coût du calldata
    • +
    • EIP-7840 - Ajouter un programme de blobs aux fichiers de configuration de la couche d'exécution (EL)
    • +
    + +Meilleure expérience de mise en jeu : + +
      +
    • EIP-7251 - Augmenter le MAX_EFFECTIVE_BALANCE
    • +
    • EIP-7002 - Sorties déclenchables au niveau de la couche d'exécution
    • +
    • EIP-7685 : Demandes de couche d'exécution générales
    • +
    • EIP-6110 - Fournir les dépôts de validateurs sur la blockchain
    • +
    + +Améliorations de l'efficacité et de la sécurité du protocole : + +
      +
    • EIP-2537 - Précompilation pour les opérations sur la courbe BLS12-381
    • +
    • EIP-2935 - Enregistrer les hachages des blocs historiques dans l'état
    • +
    • EIP-7549 : Déplacer l'index du comité en dehors de l'Attestation
    • +
    + +
    + +- [Pectra.wtf](https://pectra.wtf) +- [Comment Pectra améliorera l'expérience de mise en jeu](https://www.kiln.fi/post/next-ethereum-upgrade-how-pectra-will-enhance-the-staking-experience) +- [Lire les spécifications de la mise à niveau Electra](https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/) +- [FAQ Prague-Electra ("Pectra")](/roadmap/pectra/) + + + ## 2024 {#2024} ### Cancun-Deneb ("Dencun") {#dencun} @@ -102,7 +154,7 @@ Cela inclut notamment EIP-4844, connu comme **Proto-Danksharding**, qui réduit La mise à niveau Deneb contient un ensemble d'améliorations du _consensus_ d'Ethereum visant à améliorer l'évolutivité. Cette mise à niveau s'accompagne des mises à niveau d'exécution de Cancun pour activer le Proto-Danksharding (EIP-4844), ainsi que d'autres améliorations de la Chaîne phare. -Les "messages de sortie volontaire" n'expirent plus, donnant ainsi plus de contrôle aux utilisateurs mettant en jeu leurs fonds auprès d'un opérateur de nœud tiers. Avec ce message de sortie signé, les validateurs peuvent déléguer les opérations de noeud tout en maintenant leur capacité de retirer en toute sécurité et à tout moment leurs fonds, sans avoir à demander la permission à quiconque. +Les "messages de sortie volontaire" n'expirent plus, donnant ainsi plus de contrôle aux utilisateurs mettant en jeu leurs fonds auprès d'un opérateur de nœud tiers. Avec ce message de sortie signé, les validateurs peuvent déléguer les opérations de noeud tout en maintenant leur capacité de se retirer en toute sécurité et de retirer leurs fonds à tout moment, sans avoir à demander la permission à quiconque. EIP-7514 apporte une restriction de la distribution d'ETH en limitant le taux de "churn", afin que les validateurs rejoignent le réseau par groupe de huit (8) maximum pour chaque période. Dans la mesure où la distribution de l'ETH est proportionnelle à la totalité des ETH mis en jeu, limiter le nombre de validateurs bloque la _croissance_ d'ETH nouvellement distribués, tout en réduisant les besoins en matériel informatique pour les opérateurs de noeud, aidant ainsi la décentralisation. @@ -426,7 +478,7 @@ La fourche Constantinople a :
      -
    • EIP-145Optimise le coût de certaines actions en chaîne.
    • +
    • EIP-145Optimise le coût de certaines actions sur la chaîne.
    • EIP-1014vous permet d'interagir avec des adresses qui n'ont pas encore été créées.
    • EIP-1052introduit l'instruction EXTCODEHASH pour récupérer le hachage du code d'un autre contrat.
    • EIP-1234s'assure que la blockchain ne gèle pas 'avant la preuve d'enjeu et réduit les récompenses de 3 à 2 ETH par bloc.
    • diff --git a/src/intl/fr/common.json b/src/intl/fr/common.json index d42212d803b..f2dbe007a54 100644 --- a/src/intl/fr/common.json +++ b/src/intl/fr/common.json @@ -30,8 +30,11 @@ "content-resources": "Ressources de contenu", "content-standardization": "Normalisation du contenu", "contributing": "Contribuer", + "contributor-quiz-banner-title": "Besoin d’aide pour débuter ?", + "contributor-quiz-banner-description": "Faites un quiz rapide et découvrez comment vous pouvez contribuer à ethereum.org.", + "contributor-quiz-banner-button": "Faire le quiz", "contributors": "Contributeurs", - "contributors-thanks": "Merci à tous ceux qui ont contribué à cette page !", + "contributors-thanks": "Merci à tous ceux qui ont contribué à cette page !", "cookie-policy": "Politique en matière de cookies", "copied": "Copié", "copy": "Copier", @@ -77,6 +80,9 @@ "enterprise": "Entreprises", "enterprise-mainnet": "Entreprise - Réseau principal Ethereum", "enterprise-menu": "Menu Entreprise", + "error-page-title": "Oups ! Une erreur s’est produite", + "error-page-description": "Vous pouvez nous aider à nous améliorer en signalant ce problème sur notre dépôt GitHub.", + "error-page-home-link": "Retour à la page d'accueil", "esp": "Programme de soutien à l'écosystème", "eth-current-price": "Prix actuel de l'ETH (USD)", "ethereum": "Ethereum", @@ -199,7 +205,7 @@ "language-zh-tw": "Chinois traditionnel", "languages": "Langues", "last-24-hrs": "Dernières 24 heures", - "last-edit": "Dernière modification", + "page-last-update": "Dernière mise à jour de la page :", "last-updated": "Dernière mise à jour", "layer-2": "Couche 2", "learn": "Apprendre", @@ -295,6 +301,7 @@ "nav-overview-label": "Aperçu", "nav-participate-overview-description": "Aperçu des modalités de participation", "nav-payments-description": "Les paiements Ethereum changent la façon dont nous envoyons et recevons de l'argent", + "nav-prediction-markets-description": "Les marchés de prédiction sont un moyen de parier sur l’avenir", "nav-primary": "Principale", "nav-quizzes-description": "Découvrez dans quelle mesure vous comprenez Ethereum et les cryptomonnaies", "nav-quizzes-label": "Testez vos connaissances", @@ -319,6 +326,7 @@ "nav-roadmap-user-experience": "Meilleure expérience utilisateur", "nav-roadmap-ux-description": "L'utilisation d'Ethereum doit être simplifiée", "nav-roadmap-ux-label": "Meilleure expérience utilisateur", + "nav-rwa-description": "Une méthode permettant de convertir des actifs de valeur en jetons numériques.", "nav-run-a-node-description": "Devenez pleinement autonome tout en contribuant à la sécurisation du réseau", "nav-security-description": "Apprenez les bonnes pratiques en matière d'utilisation des cryptomonnaies", "nav-smart-contracts-description": "Les éléments fondamentaux de l'écosystème Ethereum", @@ -366,17 +374,20 @@ "page-languages-want-more-paragraph": "Les traducteurs d’ethereum.org traduisent constamment les pages dans le plus de langues possible. Pour voir ce sur quoi ils sont en train de travailler actuellement ou pour les rejoindre, lisez notre", "page-languages-words": "mots", "page-last-updated": "Dernière mise à jour de la page", + "page-not-found": "Page introuvable", + "page-not-found-description": "La page demandée est introuvable.", "participate": "Participer", "participate-menu": "Menu de participation", "payments-page": "Paiements", "pbs": "Séparation proposeur-constructeur", "pools": "Mise en jeu en pool", + "prediction-markets": "Marchés prédictifs", "privacy-policy": "Politique de confidentialité", "private-ethereum": "Ethereum privé", "product-disclaimer": "Les produits et services sont listés à des fins de facilité d'accès par la communauté Ethereum. L'inclusion d'un produit ou d'un service ne représente pas une approbation de la part de l'équipe du site ethereum.org ou de la Fondation Ethereum.", "quizzes": "Quiz", "quizzes-title": "Quiz Hub", - "refresh": "Veuillez actualiser la page.", + "refresh": "Actualiser la page", "regenerative-finance": "ReFi - Finance régénérative", "research": "Recherche", "research-menu": "Menu de recherche", @@ -387,6 +398,7 @@ "rollup-component-technology-and-risk-summary": "Résumé des technologies et des risques", "rollup-component-website": "Site Web", "run-a-node": "Exécuter un nœud", + "real-world-assets": "RWAs - Actifs du monde réel", "saas": "Mise en jeu en tant que service", "scaling": "Évolutivité", "search": "Rechercher", @@ -425,6 +437,7 @@ "translation-banner-title-new": "Aidez-nous à traduire cette page", "translation-banner-title-update": "Aider à mettre à jour cette page", "translation-program": "Programme de traduction", + "translator": "Traducteur", "try-using-search": "Essayez d'utiliser la recherche pour trouver ce que vous cherchez ou", "tutorials": "Tutoriels", "up": "Vers le haut", diff --git a/src/intl/fr/page-developers-local-environment.json b/src/intl/fr/page-developers-local-environment.json index 70a2d8311f9..c9de602899e 100644 --- a/src/intl/fr/page-developers-local-environment.json +++ b/src/intl/fr/page-developers-local-environment.json @@ -28,6 +28,6 @@ "page-local-environment-setup-subtitle": "Si vous êtes prêt à commencer à construire, il est temps de choisir votre pile.", "page-local-environment-setup-subtitle-2": " Voici les outils et les frameworks que vous pouvez utiliser pour vous aider à créer votre application Ethereum.", "page-local-environment-setup-title": "Configurez votre environnement de développement local", - "page-local-environment-solidity-template-desc": "Un modèle GitHub pour une configuration prédéfinie pour vos contrats intelligents Solidity. Comprend un réseau local Hardhat, Waffle pour les tests, Ethers pour l'implémentation de portefeuille, et plus encore.", + "page-local-environment-solidity-template-desc": "Un modèle GitHub pour une configuration pré-intégrée de vos contrats intelligents Solidity. Comprend un réseau local Hardhat, des Ethers pour la mise en œuvre du portefeuille, et plus encore.", "page-local-environment-solidity-template-logo-alt": "Logo de modèle Solidity" } \ No newline at end of file diff --git a/src/intl/fr/page-index.json b/src/intl/fr/page-index.json index 76d7ebc63df..6ecfd6e1c1d 100644 --- a/src/intl/fr/page-index.json +++ b/src/intl/fr/page-index.json @@ -39,8 +39,8 @@ "page-index-cta-get-eth-label": "Obtenir de l'ETH", "page-index-cta-wallet-description": "Créer des comptes et gérer des actifs", "page-index-cta-wallet-label": "Choisissez un portefeuille", - "page-index-cta-build-apps-description": "Créez votre première application", - "page-index-cta-build-apps-label": "Commencez à développer", + "page-index-cta-build-apps-description": "Créer votre première app", + "page-index-cta-build-apps-label": "Commencez à créer", "page-index-description": "La principale plateforme pour les applications innovantes et les réseaux blockchain", "page-index-developers-code-example-description-0": "Construisez une banque alimentée par la logique que vous avez programmée", "page-index-developers-code-example-description-1": "Créez des jetons que vous pouvez transférer et utiliser dans différentes applications", @@ -83,7 +83,6 @@ "page-index-posts-header": "Articles récents", "page-index-posts-subtitle": "Les derniers articles de blog et mises à jour de la communauté", "page-index-title": "Bienvenue sur Ethereum", - "page-index-use-cases-tag": "Cas d'usage", "page-index-values-description": "Faites partie de la révolution numérique", "page-index-values-header": "Internet est en train de changer", "page-index-values-legacy": "Système traditionnel", diff --git a/src/intl/fr/page-layer-2-learn.json b/src/intl/fr/page-layer-2-learn.json new file mode 100644 index 00000000000..9896923188d --- /dev/null +++ b/src/intl/fr/page-layer-2-learn.json @@ -0,0 +1,55 @@ +{ + "page-layer-2-learn-meta-title": "Qu'est-ce que la couche 2 ?", + "page-layer-2-learn-title": "Qu'est-ce que la couche 2 ?", + "page-layer-2-learn-description": "Faire évoluer Ethereum pour une adoption massive", + "page-layer-2-learn-button-1-label": "Qu'est-ce que la couche 2 ?", + "page-layer-2-learn-button-2-label": "Utiliser la couche 2", + "page-layer-2-learn-what-is-layer-2-title": "Qu'est-ce que la couche 2 ?", + "page-layer-2-learn-what-is-layer-2-1": "Couche 2 (L2) est un terme collectif décrivant un ensemble spécifique de solutions de mise à l'échelle d'Ethereum. Une couche 2 est une blockchain séparée qui étend Ethereum et hérite des garanties de sécurité d'Ethereum.", + "page-layer-2-learn-what-is-layer-2-2": "Maintenant, creusons un peu plus le sujet. Pour ce faire, nous devons d'abord expliquer la couche 1 (L1).", + "page-layer-2-learn-what-is-layer-1-title": "Qu'est-ce que la couche 1 ?", + "page-layer-2-learn-what-is-layer-1-1": "Les blockchains de couche 1, comme Ethereum et Bitcoin, sont la fondation sous-jacente sur laquelle les projets de couche 2 se construisent. Parmi les exemples de projets de couche 2, citons les rollups à divulgation nulle de connaissance et les rollups optimistes sur Ethereum, ainsi que le Lightning Network sur Bitcoin.", + "page-layer-2-learn-what-is-layer-1-2": "Ethereum sert également de couche de disponibilité des données pour les couches de niveau 2, et en cas de litige concernant des transactions passées, les données nécessaires à la résolution du litige sont fournies par Ethereum.", + "page-layer-2-learn-layer-1-list-title": "La couche 1 d'Ethereum comprend :", + "page-layer-2-learn-layer-1-list-1": "un réseau d'opérateurs de nœuds afin de sécuriser et valider le réseau", + "page-layer-2-learn-layer-1-list-2": "un réseau de producteurs de blocs", + "page-layer-2-learn-layer-1-list-3": "la blockchain elle-même et l'historique des données de transaction", + "page-layer-2-learn-layer-1-list-4": "le mécanisme de consensus pour le réseau", + "page-layer-2-learn-why-do-we-need-layer-2-title": "Pourquoi avons-nous besoin de la couche 2 ?", + "page-layer-2-learn-why-do-we-need-layer-2-1": "Les trois propriétés souhaitables d’une blockchain sont la décentralisation, la sécurité et la scalabilité. Le trilemme de la blockchain stipule qu’une architecture blockchain simple ne peut en atteindre que deux sur trois. Vous voulez une blockchain sécurisée et décentralisée ? Il faut alors sacrifier la scalabilité. C’est là que les réseaux de seconde couche entrent en jeu.", + "page-layer-2-learn-why-do-we-need-layer-2-2": "Ethereum a atteint la capacité actuelle de son réseau avec plus d’un million de transactions par jour, chacune faisant l’objet d’une forte demande. Le succès d’Ethereum et l’engouement pour son utilisation ont entraîné une hausse significative des prix du gaz. Par conséquent, le besoin en solutions d'évolutivité a lui aussi augmenté.", + "page-layer-2-learn-why-do-we-need-layer-2-scalability": "Évolutivité", + "page-layer-2-learn-why-do-we-need-layer-2-scalability-1": "L'objectif principal de l'évolutivité est d'augmenter la vitesse de transaction (finalisation plus rapide) et le débit des transactions (nombre élevé de transactions par seconde), sans sacrifier la décentralisation ou la sécurité (en savoir plus sur la vision Ethereum).", + "page-layer-2-learn-why-do-we-need-layer-2-scalability-2": "La communauté Ethereum a pris une position ferme : elle ne sacrifiera pas la décentralisation ni la sécurité au profit de l'évolutivité. En attendant la fragmentation, le réseau principal d’Ethereum (couche 1) ne pourra traiter qu’environ 15 transactions par seconde. Lorsque la demande d’utilisation d’Ethereum est élevée, cela provoque une congestion du réseau, augmente les frais de transaction et exclut ceux qui n'ont pas les moyens d'utiliser Ethereum jusqu'à ce que les frais diminuent. C’est là qu’intervient la couche 2, pour faire évoluer Ethereum dès aujourd’hui.", + "page-layer-2-learn-layer2Cards-1-title": "Des frais plus bas", + "page-layer-2-learn-layer2Cards-1-description": "Le regroupement de plusieurs transactions en une seule transaction sur la couche 1 permet de réduire considérablement les frais de transaction, rendant ainsi Ethereum plus accessible à tous.", + "page-layer-2-learn-layer2Cards-2-title": "Une sécurité préservée", + "page-layer-2-learn-layer2Cards-2-description": "Les blockchains de seconde couche finalisent leurs transactions sur le réseau principal d’Ethereum, ce qui permet aux utilisateurs qui les emploient de bénéficier de la sécurité du réseau Ethereum.", + "page-layer-2-learn-layer2Cards-3-title": "Des cas d'utilisation plus nombreux", + "page-layer-2-learn-layer2Cards-3-description": "Grâce à un nombre plus élevé de transactions par seconde, des frais moins élevés et de nouvelles technologies, les projets vont s'étendre à de nouvelles applications offrant une expérience utilisateur améliorée.", + "page-layer-2-learn-how-does-layer-2-work-title": "Comment la couche 2 fonctionne-t-elle ?", + "page-layer-2-learn-how-does-layer-2-work-1": "Comme mentionné précédemment, la couche 2 est un terme générique désignant les solutions d'évolutivité d'Ethereum qui traitent les transactions hors de la couche 1 d'Ethereum tout en continuant à bénéficier de la sécurité décentralisée et robuste de la couche 1 d'Ethereum. Une couche 2 est une blockchain distincte qui étend Ethereum. Comment cela fonctionne-t-il ?", + "page-layer-2-learn-how-does-layer-2-work-2": "Il existe différents types de couche 2, chacune ayant ses propres compromis et modèles de sécurité. Les couches 2 allègent la charge transactionnelle de la couche 1, ce qui permet de réduire sa congestion et d'améliorer l'évolutivité de l'ensemble.", + "page-layer-2-learn-how-does-layer-2-work-rollups-title": "Rollups", + "page-layer-2-learn-how-does-layer-2-work-rollups-1": "Les rollups regroupent (ou « roll up ») des centaines de transactions en une seule transaction sur la couche principale. Cela permet de répartir les frais de transaction de la couche principale entre tous les utilisateurs du rollup, ce qui réduit le coût pour chacun.", + "page-layer-2-learn-how-does-layer-2-work-rollups-2": "Les données de transaction dans le rollup sont soumises à la couche 1, mais l'exécution est effectuée séparément par le rollup. En soumettant les données de transaction sur la couche 1, les rollups héritent de la sécurité d'Ethereum. En effet, une fois les données téléchargées sur la couche 1, l’annulation d’une transaction de rollup nécessite l’annulation d’Ethereum. Il existe deux approches différentes des rollups : optimiste et à divulgation nulle de connaissance. Celles-ci diffèrent principalement par la manière dont ces données de transaction sont soumises à la couche 1.", + "page-layer-2-learn-rollupCards-optimistic-title": "Rollups optimistes", + "page-layer-2-learn-rollupCards-optimistic-description": "Les rollups optimistes utilisent des preuves de fraude où les transactions sont supposées valides, mais peuvent être contestées si une transaction invalide est suspectée. En cas de suspicion, une preuve de fraude est exécutée pour vérifier si une transaction invalide a effectivement eu lieu.", + "page-layer-2-learn-rollupCards-optimistic-childSentence": "En savoir plus sur les rollups optimistes", + "page-layer-2-learn-rollupCards-zk-title": "Rollups à divulgation nulle de connaissance", + "page-layer-2-learn-rollupCards-zk-description": "Les rollups à divulgation nulle de connaissance utilisent des preuves de validité, où les calculs des transactions sont effectués hors chaîne, avant que ces données ne soient transmises au réseau principal d’Ethereum accompagnées d’une preuve de leur validité.", + "page-layer-2-learn-rollupCards-zk-childSentence": "En savoir plus sur les rollups à divulgation nulle de connaissance", + "page-layer-2-learn-dyor-title": "Faites vos propres recherches : les risques des secondes couches", + "page-layer-2-learn-dyor-1": "Étant donné que les chaînes de seconde couche héritent de la sécurité d’Ethereum, dans un monde idéal, elles sont aussi sûres que la couche principale d’Ethereum. Cependant, de nombreux projets sont encore jeunes et quelque peu expérimentaux. Après des années de recherche et développement, de nombreuses technologies de seconde couche destinées à faire évoluer Ethereum ont été mises en service en 2021. Cela ne signifie pas que ces secondes couches ne sont pas sécurisées, mais simplement qu’aucune seconde couche n’a été aussi éprouvée que le réseau principal d’Ethereum. Faites toujours vos propres recherches et décidez si vous êtes à l’aise avec les risques potentiels.", + "page-layer-2-learn-dyor-2": "Pour en savoir plus sur la technologie, les risques et les hypothèses de confiance des secondes couches, nous vous recommandons de consulter L2BEAT, qui propose un cadre d’évaluation des risques complet pour chaque projet.", + "page-layer-2-learn-dyor-link": "Accéder à L2BEAT", + "page-layer-2-learn-note-on-alt-l1-title": "Une note sur les couches principales alternatives, les chaînes latérales et les validiums", + "page-layer-2-learn-note-on-alt-l1-1": "Les couches principales alternatives offrent un débit plus élevé et des frais de transaction plus faibles qu’Ethereum. Cependant, ces couches principales alternatives ont dû faire des compromis sur la sécurité ou la décentralisation afin d’atteindre un plus grand nombre de transactions par seconde et des frais réduits. L’écosystème Ethereum est fermement convaincu que l'évolutivité de la seconde couche est la seule solution pour résoudre le trilemme de la scalabilité tout en restant décentralisé et sécurisé", + "page-layer-2-learn-note-on-alt-l1-2": "Les chaînes latérales et les validiums sont des blockchains qui permettent de transférer des actifs d'une blockchain vers une autre afin de les utiliser sur cette dernière. Les chaînes latérales et les validiums fonctionnent en parallèle de la chaîne principale et interagissent avec celle-ci via des ponts, mais ils ne tirent pas leur sécurité ni la disponibilité des données de la chaîne principale. Ils offrent une mise à l’échelle similaire aux solutions de seconde couche, mais reposent sur des hypothèses de confiance différentes. Ils offrent des frais de transaction plus faibles et un débit de transaction plus élevé. En savoir plus sur les chaînes latérales et les validiums.", + "page-layer-2-learn-callout-1-title": "Quels sont les avantages ?", + "page-layer-2-learn-callout-1-description": "Découvrez l’impact concret des solutions de seconde couche sur l’expérience utilisateur.", + "page-layer-2-learn-learn-more": "En savoir plus", + "page-layer-2-learn-callout-2-title": "Explore différents réseaux", + "page-layer-2-learn-callout-2-description": "Découvrez en quoi les différents réseaux se distinguent les uns des autres et à quel stade de développement ils se trouvent.", + "page-layer-2-learn-explore-networks": "Explorer les réseaux" +} From 3aa0dcc66bb428a537fd3cecf17ef64a4a54ceba Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:45:46 +0000 Subject: [PATCH 237/368] chore: import translations for it --- .../translations/it/contributing/adding-layer-2s/index.md | 2 +- .../translations/it/contributing/content-resources/index.md | 2 +- .../translation-program/translators-guide/index.md | 4 ++-- src/intl/it/page-what-is-ethereum.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/content/translations/it/contributing/adding-layer-2s/index.md b/public/content/translations/it/contributing/adding-layer-2s/index.md index e9849ec77de..c2555ded0dc 100644 --- a/public/content/translations/it/contributing/adding-layer-2s/index.md +++ b/public/content/translations/it/contributing/adding-layer-2s/index.md @@ -92,6 +92,6 @@ _Non prendiamo in considerazione altre soluzioni di scalabilità che non utilizz Se desideri aggiungere un livello 2 su ethereum.org, crea un ticket su GitHub. - + Crea un ticket diff --git a/public/content/translations/it/contributing/content-resources/index.md b/public/content/translations/it/contributing/content-resources/index.md index 86d4b4a66f0..e054d002c9b 100644 --- a/public/content/translations/it/contributing/content-resources/index.md +++ b/public/content/translations/it/contributing/content-resources/index.md @@ -27,6 +27,6 @@ Le risorse di apprendimento saranno valutate sulla base dei seguenti criteri: Se desideri aggiungere a ethereum.org una risorsa di contenuto che soddisfa i criteri, crea un ticket su GitHub. - + Crea un ticket diff --git a/public/content/translations/it/contributing/translation-program/translators-guide/index.md b/public/content/translations/it/contributing/translation-program/translators-guide/index.md index b9a7c3d0bf5..ac641181cb3 100644 --- a/public/content/translations/it/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/it/contributing/translation-program/translators-guide/index.md @@ -116,7 +116,7 @@ Il modo migliore per gestire i collegamenti è copiarli direttamente dal testo d ![Esempio di link.png](./example-of-link.png) -I link appaiono nel testo di partenza anche sotto forma di tag (cioè `<0> `). Se passi sul tag, l'editor ne mostrerà il contenuto completo; talvolta questi tag rappresentano dei link. +I link appaiono nel testo di partenza anche sotto forma di tag (cioè \<0> \). Se passi sul tag, l'editor ne mostrerà il contenuto completo; talvolta questi tag rappresentano dei link. È molto importante copiare i link dal testo di partenza senza modificarne l'ordine. @@ -154,7 +154,7 @@ nonce - _Testo non traducibile_ Il testo di partenza contiene anche tag abbreviati, contenenti solo numeri, il che significa che la loro funzione non è immediatamente ovvia. Puoi passare su questi tag per vedere esattamente quale scopo assolvono. -Nell'esempio seguente, passando con il mouse sul `<0>` tag puoi vedere che rappresenta `` e contiene un frammento di codice, quindi il contenuto non va tradotto. +Nell'esempio seguente, passando con il mouse sul \<0> tag puoi vedere che rappresenta `` e contiene un frammento di codice, quindi il contenuto non va tradotto. ![Esempio di tag ambigui.png](./example-of-ambiguous-tags.png) diff --git a/src/intl/it/page-what-is-ethereum.json b/src/intl/it/page-what-is-ethereum.json index 8f06f82090c..591cb7eeb90 100644 --- a/src/intl/it/page-what-is-ethereum.json +++ b/src/intl/it/page-what-is-ethereum.json @@ -54,7 +54,7 @@ "page-what-is-ethereum-slide-1-desc-2": "Ethereum e gli stablecoin semplificano il processo di invio di denaro all'estero. Spesso bastano solo alcuni minuti spostare i fondi in qualunque parte del mondo, rispetto ad alcuni giorni lavorativi o persino settimane che potrebbe impiegare una banca media, e a una frazione del costo. Inoltre, non vi è alcuna commissione aggiuntiva per aver effettuato transazioni di alto valore e non ci sono limitazioni su dove o perché stai inviando il tuo denaro.", "page-what-is-ethereum-slide-2-title": "L'aiuto più rapido nei momenti di crisi", "page-what-is-ethereum-slide-2-desc-1": "Se sei abbastanza fortunato da avere diverse opzioni bancarie tramite le istituzioni fidate dove vivi, potresti dare per scontata la libertà finanziaria, la sicurezza e la stabilità che offrono. Ma per molte persone in tutto il mondo, che affrontano repressione politica o disagio economico, le istituzioni finanziarie potrebbero non fornire la protezione o i servizi che necessitano.", - "page-what-is-ethereum-slide-2-desc-2": "Quando la guerra, catastrofi economiche o repressioni delle libertà civili hanno colpito i cittadini di Venezuela, Cuba, Afghanistan, Nigeria, Bielorussia e Ucraina, le criptovalute sono state l'opzione più veloce e spesso l'unica alternativa per mantenere potere finanziario. 1 Come dimostrato da questi esempi, le criptovalute come Ethereum possono garantire accesso illimitato all'economia globale nel momento in cui le persone vengono escluse dal mondo esterno. Inoltre, le stablecoin conservano valore nei momenti in cui le valute locali collassano a causa dell'iperinflazione.", + "page-what-is-ethereum-slide-2-desc-2": "Quando la guerra, catastrofi economiche o repressioni delle libertà civili hanno colpito i cittadini di Venezuela, Cuba, Afghanistan, Nigeria, Bielorussia e Ucraina, le criptovalute sono state l'opzione più veloce e spesso l'unica alternativa per mantenere potere finanziario. 1 Come dimostrato da questi esempi, le criptovalute come Ethereum possono garantire accesso illimitato all'economia globale nel momento in cui le persone vengono escluse dal mondo esterno. Inoltre, le stablecoin conservano valore nei momenti in cui le valute locali collassano a causa dell'iperinflazione.", "page-what-is-ethereum-slide-3-title": "Dare potere a creatori", "page-what-is-ethereum-slide-3-desc-1": "Nel solo 2021, artisti, musicisti, scrittori e altri creatori hanno usato Ethereum per guadagnare complessivamente circa $3,5 miliardi. Questo rende Ethereum una delle più grandi piattaforme globali per creatori, insieme a Spotify, YouTube ed Etsy. Scopri di più.", "page-what-is-ethereum-slide-4-title": "Dare potere ai giocatori", From 234cfa171053922e9dd131be6dac7b7b6e2dd728 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:45:50 +0000 Subject: [PATCH 238/368] chore: import translations for ja --- public/content/translations/ja/whitepaper/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ja/whitepaper/index.md b/public/content/translations/ja/whitepaper/index.md index 30fe04e9b14..663b1333cb4 100644 --- a/public/content/translations/ja/whitepaper/index.md +++ b/public/content/translations/ja/whitepaper/index.md @@ -120,7 +120,7 @@ _右: マークルツリーのどの部分についても、変更しようと 基礎となるブロックチェーンのアイデアを別のコンセプトに適用するというアイデアもまた長い歴史を持っています。 2005年、Nick Szaboは「[所有者権限がある安全な財産権念](https://nakamotoinstitute.org/secure-property-titles/)」という概念を打ち出し、「複製データベース技術の新しい進歩」により、ブロックチェーンベースのシステムで誰がどの土地を所有しているかのレジストリを保存できるようになると説明し、ホームステディング、不利益所有、グルジア土地税といった概念を含む精巧なフレームワークを作成した文書を発表しています。 しかし、残念ながら当時は有効な複製データベースシステムがなかったため、このプロトコルが実際に導入されることはありませんでした。 しかし、2009年以降、ビットコインの非中央集権的なコンセンサスが開発されると、多くの代替アプリケーションが急速に登場し始めました。 -- **ネームコイン** - 2010年に作られた[ネームコイン](https://namecoin.org/)は、分散型ネーム登録データベースとして最もよく表現されます。 Tor、ビットコイン、BitMessageなどの分散型プロトコルでは、他の人がやり取りできるように、アカウントを識別する方法が必要ですが、既存のすべてのソリューションでは、`1LW79wp5ZBqaHW1jL5TCiBCrhQYtHagUWy`のような疑似ランダムハッシュのみが利用可能です。 理想を言えば、"george "のような名前でアカウントを持てるようにしたいものです。 しかし、ある人が「george」というアカウントを作れば、他の人が同じ手順で自分も「george」を登録し、なりすましができるのが問題です。 唯一の解決策は、最初の登録者が成功し、2番目の登録者が失敗する、先願主義パラダイムで、ビットコインのコンセンサスプロトコルで完全に解決できる問題です。 ネームコインは、最も古く、最も成功した、そのようなアイデアを使用したネーム登録システムの実装例です。 +- **ネームコイン** - 2010年に作られた[ネームコイン](https://namecoin.org/)は、分散型ネーム登録データベースとして最もよく表現されます。 Tor、ビットコイン、BitMessageなどの分散型プロトコルでは、他の人がやり取りできるように、アカウントを識別する方法が必要ですが、既存のすべてのソリューションでは、`1LW79wp5ZBqaHW1jL5TCiBCrhQYtHagUWy`のような疑似ランダムハッシュのみが利用可能な識別子です。 理想を言えば、"george "のような名前でアカウントを持てるようにしたいものです。 しかし、ある人が「george」というアカウントを作れば、他の人が同じ手順で自分も「george」を登録し、なりすましができるのが問題です。 唯一の解決策は、最初の登録者が成功し、2番目の登録者が失敗する、先願主義パラダイムで、ビットコインのコンセンサスプロトコルで完全に解決できる問題です。 ネームコインは、最も古く、最も成功した、そのようなアイデアを使用したネーム登録システムの実装例です。 - **カラードコイン** - [カラードコイン](https://docs.google.com/a/buterin.com/document/d/1AnkP_cVZTCMLIzw4DvsW6M8Q2JC0lIzrTLuoWu2z1BE/edit)の目的は、人々が独自のデジタル通貨を作成できるようにする、またはビットコインブロックチェーンで1単位の通貨という重要で自明なケースでは、デジタルトークンを作成することを可能にするためのプロトコルとして機能することです。 カラードコインのプロトコルでは、特定のビットコインUTXOに色を公的に割り当てることで新しい通貨を「発行」し、プロトコルが再帰的に他のUTXOの色を、それらを作成するトランザクションが費やした入力の色と同じに定義します(色が混在する入力の場合、いくつかの特別なルールが適用されます)。 これにより、ユーザーは特定の色のUTXOだけが入ったウォレットを維持して、通常のビットコインのように送信したり、受け取ったUTXOの色を決定するためにブロックチェーンをさかのぼってトラッキングすることができます。 - **メタコイン** - メタコインの背後にある考え方は、ビットコインの上位に存在するプロトコルです。ビットコインのトランザクションを使用してメタコインのトランザクションを保存しますが、異なる状態遷移を持ち、`APPLY`関数を使用します。 メタコインプロトコルでは、無効なメタコインのトランザクションがビットコインのブロックチェーンに現れる事を防止できないため、`APPLY'(S,TX)`がエラーを返した場合、プロトコルは`APPLY'(S,TX)=S`をデフォルトとするルールが追加されました。 これは、任意の暗号通貨プロトコルを簡単に作成する仕組みを提供するもので、ビットコイン自体の内部では実装できない高度な機能を持つ可能性がありますが、マイニングやネットワークといった複雑な機能はすでにビットコインプロトコルでカバーされているため、開発コストは非常に低く抑えられます。 メタコインは、いくつかのクラスの金融コントラクト、ネーム登録、分散型取引所を実現するために使用されています。 From 6824b6346601000162f3527a7c3e10c8d98f09fa Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:45:53 +0000 Subject: [PATCH 239/368] chore: import translations for ko --- src/intl/ko/common.json | 41 ++++++++++++++++++----- src/intl/ko/page-get-eth.json | 2 +- src/intl/ko/page-index.json | 13 +++---- src/intl/ko/page-wallets-find-wallet.json | 8 ++--- src/intl/ko/page-what-is-ethereum.json | 9 +++-- 5 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/intl/ko/common.json b/src/intl/ko/common.json index e653d044a7d..3a8560555c6 100644 --- a/src/intl/ko/common.json +++ b/src/intl/ko/common.json @@ -11,6 +11,7 @@ "adding-products": "제품 추가", "adding-staking-products": "스테이킹 상품 추가", "adding-wallets": "지갑 추가", + "ai-agents": "AI 에이전트", "aria-toggle-menu-button": "메뉴 버튼 보이기/숨기기", "aria-toggle-search-button": "검색 버튼 보이기/숨기기", "beacon-chain": "비콘 체인", @@ -29,8 +30,11 @@ "content-resources": "콘텐츠 참고 자료", "content-standardization": "콘텐츠 표준화", "contributing": "기여", + "contributor-quiz-banner-title": "어디서부터 시작해야 할지 모르겠나요?", + "contributor-quiz-banner-description": "간단한 퀴즈를 풀고 ethereum.org에 어떻게 기여할 수 있는지 알아보세요.", + "contributor-quiz-banner-button": "퀴즈 풀기", "contributors": "기여자", - "contributors-thanks": "이 페이지를 만드는 데 도움을 주신 모든 분들께 감사드립니다!", + "contributors-thanks": "이 페이지에 기여하신 모든 분들게 감사드립니다!", "cookie-policy": "쿠키 정책", "copied": "복사 완료", "copy": "복사", @@ -76,6 +80,9 @@ "enterprise": "기업", "enterprise-mainnet": "엔터프라이즈 - 메인넷 이더리움", "enterprise-menu": "기업 메뉴", + "error-page-title": "이런! 문제가 발생했습니다.", + "error-page-description": "GitHub 저장소에 이 문제를 보고하여 개선에 도움을 줄 수 있습니다.", + "error-page-home-link": "홈 페이지로 돌아가기", "esp": "생태계 지원 프로그램", "eth-current-price": "현재 이더(ETH) 가격(미국 달러)", "ethereum": "이더리움", @@ -96,6 +103,7 @@ "ethereum-upgrades": "이더리움 업그레이드", "ethereum-wallets": "이더리움 지갑", "ethereum-whitepaper": "이더리움 백서", + "events": "이벤트", "feedback-card-prompt-article": "이 문서가 도움이 되셨나요?", "feedback-card-prompt-page": "이 페이지가 도움이 되셨나요?", "feedback-card-prompt-tutorial": "이 튜토리얼이 도움이 되셨나요?", @@ -196,12 +204,12 @@ "language-zh-tw": "중국어(번체)", "languages": "언어", "last-24-hrs": "최근 24시간", - "last-edit": "최근 수정", + "page-last-update": "페이지 마지막 업데이트됨:", "last-updated": "마지막 업데이트", "layer-2": "레이어 2", "learn": "학습하기", "learn-by-coding": "코딩으로 학습하기", - "learn-hub": "이더리움: 종합 학습 안내서", + "learn-hub": "학습 허브", "learn-menu": "메뉴 살펴보기", "learn-more": "자세히 보기", "less": "간단히 보기", @@ -218,6 +226,7 @@ "nav-about-description": "이더리움 커뮤니티를 위한 공개 오픈 소스 프로젝트", "nav-advanced-description": "보다 복잡한 주제에 대해 알아보기", "nav-advanced-label": "고급", + "nav-ai-agents-description": "이더리움의 AI 에이전트 세상 살펴보기", "nav-basics-description": "이더리움의 기초 이해하기", "nav-basics-label": "기본", "nav-bridges-description": "웹3는 기본 L1 블록체인과 L2 확장 솔루션의 생태계로 진화해 왔습니다.", @@ -246,8 +255,9 @@ "nav-eip-label": "EIP - 이더리움 개선 제안", "nav-emerging-description": "이더리움에 대한 기타 새로운 사용 사례 알아보기", "nav-emerging-label": "새로운 사용 사례", - "nav-enterprise-description": "이더리움의 비즈니스 애플리케이션", "nav-ethereum-org-description": "이 웹사이트는 커뮤니티 중심으로 운영됩니다. 함께 참여하고 기여해 보세요.", + "nav-ethereum-networks": "이더리움 네트워크", + "nav-ethereum-networks-description": "이더리움의 더 저렴하고 빠른 거래", "nav-ethereum-wallets-description": "이더리움 계정으로 상호 작업하는 앱", "nav-events-description": "누구나 참여할 수 있는 탈중앙화 및 자유", "nav-events-irl-description": "매월 오프라인 및 온라인에서 주요 이더리움 이벤트가 개최됩니다.", @@ -273,18 +283,25 @@ "nav-guides-label": "사용 방법 안내", "nav-history-description": "모든 주요 포크 및 업데이트에 대한 타임라인", "nav-history-label": "이더리움의 기술적 역사", - "nav-layer-2-description": "이더리움의 더 저렴하고 빠른 거래", "nav-learn-by-coding-description": "이더리움을 실험하는 데 도움이 되는 도구", "nav-local-env-description": "이더리움 개발 스택을 선택하고 설정하세요.", "nav-mainnet-description": "엔터프라이즈 블록체인 애플리케이션은 공개 이더리움 메인넷에 구축될 수 있습니다.", + "nav-networks-home-description": "이더리움의 더 저렴하고 빠른 거래", + "nav-networks-introduction-label": "소개", + "nav-networks-introduction-description": "여러 네트워크의 네트워크까지 확장된 이더리움", + "nav-networks-explore-networks-label": "네트워크 살펴보기", + "nav-networks-explore-networks-description": "사용할 네트워크 선택하기", + "nav-networks-learn-label": "레이어 2 네트워크는 무엇인가요?", + "nav-networks-learn-description": "필요한 이유 알아보기", "nav-nft-description": "이더리움 기반 자산으로 고유한 모든 것을 나타내는 방법", "nav-open-research-description": "이더리움의 주요 강점 중 하나는 활발한 연구 커뮤니티입니다.", "nav-open-research-label": "공개 연구", "nav-overview-description": "이더리움 교육의 모든 것", "nav-overview-label": "개요", "nav-participate-overview-description": "참여하는 방법에 대한 개요", + "nav-payments-description": "이더리움 결제는 돈을 보내고 받는 방식을 변화시키고 있습니다.", + "nav-prediction-markets-description": "예측 시장은 미래에 배팅하는 방법입니다.", "nav-primary": "기본", - "nav-private-description": "프라이빗 엔터프라이즈 이더리움을 위한 개발자 참고 자료", "nav-quizzes-description": "이더리움과 암호화폐를 얼마나 잘 이해하고 있는지 알아보기", "nav-quizzes-label": "지식 테스트", "nav-refi-description": "재생 원칙 위에 기반한 대안 경제 시스템", @@ -308,6 +325,7 @@ "nav-roadmap-user-experience": "더 나은 사용자 경험", "nav-roadmap-ux-description": "이더리움 사용을 단순화해야 합니다.", "nav-roadmap-ux-label": "더 나은 사용자 경험", + "nav-rwa-description": "가치 있는 상품을 디지털 토큰으로 전환하는 방법.", "nav-run-a-node-description": "네트워크를 보호하는 한편 완전한 주권자가 될 수 있습니다.", "nav-security-description": "암호 화폐를 사용할 때 모범 사례 알아보기", "nav-smart-contracts-description": "이더리움 생태계의 기본 구성 요소", @@ -324,7 +342,7 @@ "nav-staking-solo-label": "솔로 스테이킹", "nav-start-building-description": "신규 사용자를 위한 유용한 정보", "nav-start-with-crypto-title": "여기서 시작하세요", - "nav-start-with-crypto-description": "Ethereum 사용 첫 단계", + "nav-start-with-crypto-description": "이더리움을 사용하는 첫 번째 단계", "nav-translation-program-description": "ethereum.org를 모든 언어로 번역하기 위한 공동의 노력", "nav-tutorials-description": "엄선된 커뮤니티 튜토리얼 목록", "nav-use-cases-description": "이더리움 사용에 대한 다른 아이디어 살펴보기", @@ -355,16 +373,20 @@ "page-languages-want-more-paragraph": "ethereum.org 번역가는 항상 가능한 많은 언어로 페이지를 번역하고 있습니다. 현재 작업하고 있는 내용을 확인하거나, 참여하기 위해서는 다음 자료를 참조하세요.", "page-languages-words": "단어", "page-last-updated": "페이지가 마지막으로 업데이트됨", + "page-not-found": "페이지를 찾을 수 없음", + "page-not-found-description": "요청하신 페이지를 찾을 수 없습니다.", "participate": "참여하기", "participate-menu": "참여 메뉴", + "payments-page": "결제", "pbs": "제안자-빌더 분리", "pools": "풀 스테이킹", + "prediction-markets": "예측 시장", "privacy-policy": "개인정보 보호 정책", "private-ethereum": "프라이빗 이더리움", "product-disclaimer": "이 상품 및 서비스 리스트는 이더리움 커뮤니티의 편의를 위해 제공됩니다. 이 리스트는 ethereum.org 웹사이트 팀 또는 이더리움 재단의 상품 또는 서비스에 대한 보증을 나타내지 않습니다.", "quizzes": "퀴즈", "quizzes-title": "퀴즈 허브", - "refresh": "페이지를 새로고침하세요.", + "refresh": "페이지 새로 고침", "regenerative-finance": "리파이 - 재생 금융", "research": "연구", "research-menu": "연구 메뉴", @@ -375,6 +397,7 @@ "rollup-component-technology-and-risk-summary": "기술 및 위험 요약", "rollup-component-website": "웹사이트", "run-a-node": "노드 실행하기", + "real-world-assets": "RWA - 실물 자산", "saas": "서비스로서의 스테이킹", "scaling": "확장", "search": "검색", @@ -433,4 +456,4 @@ "wrapped-ether": "래핑된 이더", "yes": "네", "zero-knowledge-proofs": "영지식 증명" -} \ No newline at end of file +} diff --git a/src/intl/ko/page-get-eth.json b/src/intl/ko/page-get-eth.json index 3779c5e5447..6526cfbe6ce 100644 --- a/src/intl/ko/page-get-eth.json +++ b/src/intl/ko/page-get-eth.json @@ -46,7 +46,7 @@ "page-get-eth-hero-image-alt": "ETH 구매 히어로 이미지", "page-get-eth-keep-it-safe": "당신의 ETH를 안전하게 지키기", "page-get-eth-meta-description": "거주지에 따라 ETH를 구매하고 관리하는 방법", - "page-get-eth-meta-title": "ETH 획득 방법", + "page-get-eth-meta-title": "이더리움(ETH) 구매 방법", "page-get-eth-need-wallet": "DEX를 사용하시려면 지갑이 필요합니다.", "page-get-eth-new-to-eth": "ETH는 처음이신가요? 시작하려면 개요를 읽어보세요.", "page-get-eth-other-cryptos": "다른 암호화폐로 구매하기", diff --git a/src/intl/ko/page-index.json b/src/intl/ko/page-index.json index 00cce54be6e..fe42ef26cbd 100644 --- a/src/intl/ko/page-index.json +++ b/src/intl/ko/page-index.json @@ -2,6 +2,7 @@ "page-index-activity-description": "모든 이더리움 네트워크의 활동", "page-index-activity-tag": "활동", "page-index-activity-header": "가장 강력한 생태계", + "page-index-activity-action": "이더리움 활동 더 보기", "page-index-bento-header": "인터넷을 사용하는 새로운 방법", "page-index-bento-assets-action": "NFT 이해하기", "page-index-bento-assets-content": "예술 작품, 인증서 또는 부동산까지 토큰화할 수 있습니다. 무엇이든 거래 가능한 토큰이 될 수 있으며, 소유권은 공개적이고 검증 가능합니다.", @@ -38,8 +39,8 @@ "page-index-cta-get-eth-label": "이더 구매하기", "page-index-cta-wallet-description": "계정 만들기 및 자산 관리", "page-index-cta-wallet-label": "지갑 선택하기", - "page-index-cta-build-apps-description": "첫 앱을 만들어 보십시오", - "page-index-cta-build-apps-label": "개발을 시작하십시오", + "page-index-cta-build-apps-description": "첫 번째 앱 만들기", + "page-index-cta-build-apps-label": "개발 시작하기", "page-index-description": "혁신적인 앱과 블록체인 네트워크의 선두 플랫폼", "page-index-developers-code-example-description-0": "직접 프로그래밍한 로직에 기반하여 은행을 빌드", "page-index-developers-code-example-description-1": "다양한 애플리케이션 간에 전송하고 사용할 수 있는 토큰 생성", @@ -65,7 +66,7 @@ "page-index-learn-tag": "학습하기", "page-index-learn-header": "이더리움 이해하기", "page-index-meta-description": "이더리움은 디지털 화폐와 새로운 형태의 애플리케이션을 위한 글로벌 분산형 플랫폼입니다. 이더리움에서는 디지털 화폐를 제어하는 코드를 작성할 수 있고, 전 세계 어디서나 접속 가능한 애플리케이션을 개발할 수 있습니다.", - "page-index-meta-title": "이더리움의 종합 안내서", + "page-index-meta-title": "Ethereum.org: 이더리움 완벽 가이드", "page-index-network-stats-total-eth-staked": "이더리움을 보호하는 가치", "page-index-network-stats-tx-cost-description": "평균 거래 비용", "page-index-network-stats-tx-day-description": "지난 24시간의 거래", @@ -82,10 +83,10 @@ "page-index-posts-header": "최근 게시물", "page-index-posts-subtitle": "커뮤니티의 최근 블로그 게시물 및 업데이트", "page-index-title": "이더리움에 오신 것을 환영합니다", - "page-index-use-cases-tag": "사용 사례", "page-index-values-description": "디지털 혁명에 참여하십시오.", "page-index-values-header": "인터넷은 변화하고 있습니다.", "page-index-values-legacy": "레거시", + "page-index-values-tag": "값", "page-index-values-ownership-legacy-label": "제한적인 소유권", "page-index-values-ownership-legacy-content-0": "일반적인 은행이나 소셜 미디어 플랫폼에서는 조직이 귀하의 자산과 데이터를 관리합니다. 해당 기관을 통해서만 액세스하고 제어할 수 있는 셈이죠.", "page-index-values-ownership-legacy-content-1": "기관은 자체 정책에 따라 귀하가 동의하지 않는 방식으로 데이터를 사용할 수도 있습니다.", @@ -99,7 +100,7 @@ "page-index-values-privacy-legacy-content-0": "정부, 기업 또는 기타 얼굴 없는 대규모 조직이 선의로 사용자에게 개인 정보 보호를 제공하는 경우는 없다고 믿습니다.", "page-index-values-privacy-legacy-content-1": "대부분의 앱은 최대한 많은 개인 정보를 수집하여 사용자를 맞춤화된 마케팅의 목적으로 삼습니다.", "page-index-values-privacy-ethereum-label": "개인 정보 보호 중심", - "page-index-values-privacy-ethereum-content-0": "이더리움 커뮤니티는 개인 정보를 존중합니다. 귀하는 자신이나 연락처 정보를 노출하지 않고 앱을 사용할 권리가 있습니다.", + "page-index-values-privacy-ethereum-content-0": "이더리움 커뮤니티는 프라이버시를 존중합니다. 사용자는 본인 또는 본인의 연락처 정보를 노출하지 않고 앱을 사용할 권리가 있습니다.", "page-index-values-integration-legacy-label": "파편화", "page-index-values-integration-legacy-content-0": "대부분의 앱은 개별 계정을 만들도록 강요하므로 모든 로그인 세부 정보 및 등록을 기억하기 어렵습니다.", "page-index-values-integration-ethereum-label": "통합화", @@ -111,7 +112,7 @@ "page-index-values-censorship-legacy-label": "검열 가능", "page-index-values-censorship-legacy-content-0": "현대 플랫폼과 해당 규칙은 자주 변경됩니다. 이는 이해관계자와 기업 관리, 심지어 억압적인 정권의 영향을 받을 수 있습니다.", "page-index-values-censorship-ethereum-label": "검열 저항", - "page-index-values-censorship-ethereum-content-0": "억압에 대한 저항은 이더리움의 핵심 원칙입니다. 그 기능은 항상 공정하고 공평하게 유지되어야 합니다.", + "page-index-values-censorship-ethereum-content-0": "억압에 대한 저항은 이더리움의 핵심 원칙입니다. 이더리움의 기능은 항상 공정하고 공평하게 유지되어야 합니다.", "page-index-values-censorship-ethereum-content-1": "이더리움은 어떠한 국가, 기업이나 개인의 제어를 받지 않습니다.", "page-index-values-open-legacy-label": "폐쇄형", "page-index-values-open-legacy-content-0": "기업은 지적 재산을 보호하지만 공유하지 않습니다. 회사 외부의 누구도 일이 어떻게 진행되는지 확인할 수 없으며, 문제를 해결하거나 개선할 수 없습니다. 일반 사용자가 새로운 도구를 만들거나 사용자 정의하는 작업은 어렵습니다.", diff --git a/src/intl/ko/page-wallets-find-wallet.json b/src/intl/ko/page-wallets-find-wallet.json index f65e4a3ec8d..982f31126e8 100644 --- a/src/intl/ko/page-wallets-find-wallet.json +++ b/src/intl/ko/page-wallets-find-wallet.json @@ -5,7 +5,7 @@ "page-find-wallet-description": "지갑은 이더를 보관하고 거래합니다. 필요에 맞는 다양한 상품 중에서 선택할 수 있습니다.", "page-find-wallet-last-updated": "마지막 업데이트", "page-find-wallet-meta-description": "원하는 기능을 기반으로 이더리움 지갑을 찾고 비교해봅니다.", - "page-find-wallet-meta-title": "이더리움 지갑 찾기", + "page-find-wallet-meta-title": "이더리움 지갑 목록 | ethereum.org", "page-find-wallet-title": "지갑 선택", "page-find-wallet-try-removing": "한 개 또는 두 개의 기능을 제거해 보세요.", "page-stake-eth": "ETH 스테이킹하기", @@ -61,17 +61,17 @@ "page-find-wallet-chromium": "Chromium", "page-find-wallet-firefox": "Firefox", "page-find-wallet-hardware": "하드웨어", - "page-find-wallet-personas-title": "무엇을 찾고 계신가요?", "page-find-wallet-new-to-crypto-title": "암호화폐 신규 사용자", "page-find-wallet-new-to-crypto-desc": "초보자 지갑을 처음으로 찾고 있는 사용자.", "page-find-wallet-nfts-title": "NFT", "page-find-wallet-nfts-desc": "NFT 지원에 중점을 둔 지갑.", - "page-find-wallet-hodler-title": "장기", + "page-find-wallet-hodler-title": "하드웨어", "page-find-wallet-hodler-desc": "하드웨어 지갑을 사용한 패시브 토큰 보유.", "page-find-wallet-finance-title": "금융", "page-find-wallet-finance-desc": "디파이 앱의 빈번한 사용에 중점을 둔 지갑.", "page-find-wallet-developer-title": "개발자", - "page-find-wallet-developer-desc": "귀하는 개발자이며 디앱을 개발하고 테스트하는 데 도움이 되는 지갑이 필요합니다.", + "page-find-wallet-developer-desc": "디앱을 개발하고 테스트하는 데 도움이 되는 지갑.", + "page-find-wallet-active": "활성", "page-find-wallet-footnote-1": "이 페이지에 나열된 지갑은 공식적으로 보증된 것이 아니며 정보 제공 목적으로만 제공됩니다.", "page-find-wallet-footnote-2": "해당 설명은 지갑 프로젝트에서 직접 제공했습니다.", "page-find-wallet-footnote-3": "리스팅 정책의 기준에 따라 이 페이지에 제품을 추가합니다. 지갑을 추가하려면 GitHub에 문제를 제출하세요.", diff --git a/src/intl/ko/page-what-is-ethereum.json b/src/intl/ko/page-what-is-ethereum.json index d1ff9b6ee1b..0a2adaab190 100644 --- a/src/intl/ko/page-what-is-ethereum.json +++ b/src/intl/ko/page-what-is-ethereum.json @@ -34,9 +34,12 @@ "page-what-is-ethereum-cryptocurrency-tab-content-2": "비트코인이나 이더와 같은 자산을 \"암호화폐\"라고 부르는 이유는 기관 또는 기업이 부정을 저지르지 않을 것이라고 믿는 대신, 암호화를 통해 사용자 데이터와 자산의 보안을 보장하기 때문입니다.", "page-what-is-ethereum-cryptocurrency-tab-content-3": "이더리움에는 자체 네이티브 암호화폐인 이더(ETH)가 있습니다. 이더는 이더리움 네트워크에서 특정 활동에 대한 지급을 위해 사용됩니다. 다른 사용자에게 이체하거나 이더리움의 다른 토큰으로 스왑할 수 있습니다. 이더가 특별한 이유는 이더리움에서 앱과 조직을 빌드 및 실행하는 데 필요한 계산 비용 지불에 사용되기 때문입니다.", "page-what-is-ethereum-summary-title": "요약", - "page-what-is-ethereum-summary-desc-1": "이더리움은 이더리움 프로토콜이라고 불리는 규정집을 따르는 세계 각지의 컴퓨터로 구성된 네트워크입니다. 이더리움 네트워크는 누구나 빌드하고 사용할 수 있는 커뮤니티, 애플리케이션, 조직, 디지털 자산의 토대입니다.", - "page-what-is-ethereum-summary-desc-2": "언제 어디서든 이더리움 계정을 개설하고 앱을 탐색하거나 직접 앱을 빌드할 수 있습니다. 중요한 혁신은 규정을 변경하거나 개인의 액세스를 제한하는 중앙 당국을 신뢰하지 않고도 이 모든 것이 가능하다는 것입니다.", - "page-what-is-ethereum-summary-desc-3": "상세한 내용은 아래를 참고하세요.", + "page-what-is-ethereum-summary-desc-1": "이더리움은 수천 개의 앱과 블록체인을 위한 주요 플랫폼으로, 모두 이더리움 프로토콜로 구동됩니다.", + "page-what-is-ethereum-summary-desc-2": "이러한 활기찬 생태계는 혁신과 다양한 탈중앙 앱 및 서비스를 더욱 촉진합니다.", + "page-what-is-ethereum-summary-bullet-1": "무료로 전 세계 어디서나 사용 가능한 이더리움 계정", + "page-what-is-ethereum-summary-bullet-2": "가명 기반, 개인 정보 불필요", + "page-what-is-ethereum-summary-bullet-3": "제한 없이 누구나 참여 가능", + "page-what-is-ethereum-summary-bullet-4": "어떤 기업에도 구속되지 않고 누구도 그 미래를 결정할 수 없는 이더리움", "page-what-is-ethereum-btc-eth-diff-title": "이더리움과 비트코인의 차이점은 무엇인가요?", "page-what-is-ethereum-btc-eth-diff-1": "2015년에 출시된 이더리움은 비트코인의 혁신을 기반으로 하지만, 몇 가지 큰 차이점이 있습니다.", "page-what-is-ethereum-btc-eth-diff-2": "둘 다 결제 서비스 제공 업체 또는 은행 없이 디지털 화폐를 사용할 수 있도록 합니다. 하지만 이더리움은 프로그래밍이 가능하기 때문에 네트워크에 분산형 애플리케이션을 구축하고 배포할 수도 있습니다.", From 554d2dad199c09a88522d98712ad64c4b07512dd Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:46:06 +0000 Subject: [PATCH 240/368] chore: import translations for tr --- src/intl/tr/page-what-is-ethereum.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/tr/page-what-is-ethereum.json b/src/intl/tr/page-what-is-ethereum.json index 56551ba6557..d666d732355 100644 --- a/src/intl/tr/page-what-is-ethereum.json +++ b/src/intl/tr/page-what-is-ethereum.json @@ -54,7 +54,7 @@ "page-what-is-ethereum-slide-1-desc-2": "Ethereum ve sabit paralar, yurt dışına para gönderme sürecini basitleştirir. Ortalama bankanızı ve fiyatın bir kısmını alabilecek birkaç iş günü ve hatta haftanın aksine, fonları dünya çapında taşımak genellikle sadece birkaç dakika sürer. Ek olarak, yüksek değerli bir işlem gerçekleştirmek için ekstra bir ücret yoktur ve paranızı nereye veya neden göndereceğiniz konusunda bir kısıtlama yok.", "page-what-is-ethereum-slide-2-title": "Kriz Zamanlarında En Hızlı Çözüm", "page-what-is-ethereum-slide-2-desc-1": "Yaşadığınız yerde güvenilir kurumlar aracılığıyla birden fazla bankacılık seçeneğine sahip olacak kadar şanslıysanız sundukları finansal özgürlük, güvenlik ve istikrarı doğal karşılayabilirsiniz. Ancak dünyanın dört bir yanında siyasi baskı veya ekonomik zorluklarla karşı karşıya olan birçok insan için finansal kurumlar ihtiyaç duydukları koruma veya servisleri sağlayamayabilir.", - "page-what-is-ethereum-slide-2-desc-2": "Savaş, ekonomik felaketler veya sivil özgürlüklere yönelik baskılar Venezuela,Küba,Afganistan,Nijerya,Belarus ve Ukrayna vatandaşlarını vurduğunda, kripto paralar finansal değerleri elde tutmanın en hızlı ve çoğu zaman tek seçeneği haline geldi.1Ethereum gibi kripto paralar, bu örneklerde görüldüğü gibi insanların dış dünyayla bağlantıları kesildiğinde küresel ekonomiye sınırsız erişim olanağı sağlayabilir. Ayrıca stabil paralar, yerel para birimleri süper enflasyon nedeniyle çöktüğünde bir değer saklama aracı görevi görür.", + "page-what-is-ethereum-slide-2-desc-2": "Savaş, ekonomik felaketler veya sivil özgürlüklere yönelik baskılar Venezuela,Küba,Afganistan,Nijerya,Belarus ve Ukrayna vatandaşlarını vurduğunda, kripto paralar finansal değerleri elde tutmanın en hızlı ve çoğu zaman tek seçeneği haline geldi.1Ethereum gibi kripto paralar, bu örneklerde görüldüğü gibi insanların dış dünyayla bağlantıları kesildiğinde küresel ekonomiye sınırsız erişim olanağı sağlayabilir. Ayrıca stabil paralar, yerel para birimleri süper enflasyon nedeniyle çöktüğünde bir değer saklama aracı görevi görür.", "page-what-is-ethereum-slide-3-title": "Yaratıcıları Güçlendirme", "page-what-is-ethereum-slide-3-desc-1": "Yalnızca 2021'de sanatçılar, müzisyenler, yazarlar ve diğer içerik oluşturucular Ethereum'u kullanarak toplu olarak yaklaşık 3,5 milyar dolar kazandı. Bu da Ethereum'u Spotify, YouTube ve Etsy ile birlikte yaratıcılar için en büyük küresel platformlardan biri haline getiriyor. Daha fazla bilgi edinin.", "page-what-is-ethereum-slide-4-title": "Oyuncuları Güçlendirme", From 26d15ebe5e05857f09df5e6d2c25b369797db4cb Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:46:10 +0000 Subject: [PATCH 241/368] chore: import translations for uk --- .../translations/uk/ai-agents/index.md | 96 +++++++++ .../uk/prediction-markets/index.md | 79 ++++++++ .../translations/uk/staking/pools/index.md | 2 +- .../translations/uk/staking/saas/index.md | 2 +- .../translations/uk/staking/solo/index.md | 30 +-- .../uk/zero-knowledge-proofs/index.md | 190 +++++++++--------- src/intl/uk/page-run-a-node.json | 1 + .../uk/page-staking-deposit-contract.json | 2 +- 8 files changed, 290 insertions(+), 112 deletions(-) create mode 100644 public/content/translations/uk/ai-agents/index.md create mode 100644 public/content/translations/uk/prediction-markets/index.md diff --git a/public/content/translations/uk/ai-agents/index.md b/public/content/translations/uk/ai-agents/index.md new file mode 100644 index 00000000000..fbf6dbebd64 --- /dev/null +++ b/public/content/translations/uk/ai-agents/index.md @@ -0,0 +1,96 @@ +--- +title: Агенти ШІ +metaTitle: ШІ-агенти | ШІ-агенти на Ethereum +description: Огляд ШІ-агентів на Ethereum +lang: uk +template: use-cases +emoji: ":robot:" +sidebarDepth: 2 +image: /images/ai-agents/hero-image.png +alt: Люди зібралися за термінальним столом +summaryPoint1: ШІ, який взаємодіє з блокчейном і торгує самостійно +summaryPoint2: Контролює гаманці та кошти в блокчейні +summaryPoint3: Наймає людей чи інших агентів для роботи +buttons: + - content: Що таке ШІ-агенти? + toId: what-are-ai-agents + - content: Докладніше про агентів + toId: ai-agents-on-ethereum + isSecondary: false +--- + +Уявіть, що ви користуєтесь Ethereum за допомогою ШІ-асистента, який цілодобово вивчає тенденції ончейн-ринку, відповідає на запитання та навіть виконує транзакції замість вас. Ласкаво просимо у світ ШІ-агентів – інтелектуальних систем, покликаних спростити ваше цифрове життя. + +На Ethereum ми бачимо інновації в технології ШІ-агентів – від віртуальних лідерів думок і автономних авторів контенту до платформ аналізу ринку в режимі реального часу, які розширюють можливості користувачів, надаючи інформацію, розваги та підвищуючи операційну ефективність. + +## Що таке ШІ-агенти? {#what-are-ai-agents} + +ШІ-агенти – це програми, які використовують штучний інтелект для виконання завдань або ухвалення власних рішень. Вони вчаться на даних, адаптуються до змін і розв’язують складні завдання. Вони працюють безперервно і можуть миттєво виявляти можливості. + +### Як ШІ-агенти взаємодіють із блокчейнами {#how-ai-agents-work-with-blockchains} + +У традиційних фінансових системах ШІ-агенти часто працюють у централізованому середовищі з обмеженим обсягом вхідних даних. Це перешкоджає їхній здатності навчатись і керувати активами самостійно. + +На противагу цьому, децентралізована екосистема Ethereum пропонує кілька ключових переваг: + +- Прозорість даних: доступ до інформації про блокчейн в режимі реального часу. +- Повне право власності на активи: цифрові активи повністю належать ШІ-агентам. +- Надійна функціональність ончейн: дає ШІ-агентам змогу виконувати транзакції, взаємодіяти зі смарт-контрактами, забезпечувати ліквідність і співпрацювати між протоколами. + +Ці переваги перетворюють ШІ-агентів з простих ботів на динамічні системи, що самовдосконалюються й приносять значну користь у різних секторах: + + + + + + + +## ШІ-агенти на Ethereum {#ai-agents-on-ethereum} + +Ми починаємо вивчати весь потенціал ШІ-агентів і вже бачимо результати синергії між ШІ та блокчейном у проєктах, зокрема з боку прозорості та монетизації. + + + +Перша поява агента Luna як гості подкасту + + + +## Контрольовані агентами гаманці {#agent-controlled-wallets} + +Агенти, як-от Luna або AIXBT, контролюють власний ончейн-гаманець ([гаманець AIXBT](https://clusters.xyz/aixbt), [гаманець Luna](https://zapper.xyz/account/0x0d177181e3763b20d47dc3a72dd584368bd8bf43)), завдяки чому вони можуть давати чайові фанатам і брати участь в економічній діяльності. + +Під час соціальної кампанії Luna в X під хештегом #LunaMuralChallenge Luna обрала та нагородила переможців через свій гаманець у мережі Base — це стало першим випадком, коли ШІ найняв людей для виплати криптовалютної винагороди. + + +

      Корисно знати

      +

      ШІ-агентів та пов’язані з ними інструменти тільки починають розробляти. Ці технології поки вважають експериментальними, тому їх варто використовувати з обережністю.

      +
      + +## Керуйте гаманцем за допомогою команд у чаті {#control-your-wallet-using-chat-commands} + +Ви можете відмовитися від складних інтерфейсів DeFi і керувати криптовалютою за допомогою простих команд у чаті. + +Цей інтуїтивний підхід робить пришвидшує і спрощує виконання транзакцій, а також допомагає зменшити кількість помилок, зокрема надсилання коштів на неправильну адресу або переплата комісій. + + + +## ШІ-агенти проти ШІ-ботів {#ai-agents-vs-ai-bots} + +Різниця між ШІ-агентами та ШІ-ботами іноді може здаватися неочевидною, оскільки і ті, і інші виконують автоматизовані дії на основі вхідних даних. + +- ШІ-боти нагадують автоматизованих помічників – вони дотримуються конкретних, заздалегідь запрограмованих інструкцій, щоб виконувати повсякденні завдання. +- ШІ-агенти більше схожі на розумних компаньйонів – вони навчаються на власному досвіді, адаптуються до нової інформації та самостійно ухвалюють рішення. + +| | Агенти ШІ | Боти ШІ | +| --------------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | +| **Взаємодія** | Комплексні, адаптивні, автономні | Прості, із заздалегідь визначеним обсягом, жорстко закодовані | +| **Навчання** | Безперервно навчаються, можуть експериментувати та адаптуватися до нових даних у режимі реального часу | Працюють на основі попередньо вивчених даних або фіксованих правил | +| **Виконання завдань** | Спрямовані на досягнення ширших цілей | Фокусуються лише на конкретних завданнях | + +## Дізнайтеся більше {#dive-deeper} + + + +## Ви можете створити власного ШІ-агента {#you-can-build-your-own-ai-agent} + + \ No newline at end of file diff --git a/public/content/translations/uk/prediction-markets/index.md b/public/content/translations/uk/prediction-markets/index.md new file mode 100644 index 00000000000..5cffe6007ef --- /dev/null +++ b/public/content/translations/uk/prediction-markets/index.md @@ -0,0 +1,79 @@ +--- +title: Ринки прогнозів +lang: uk +template: use-cases +image: /images/use-cases/prediction-markets.png +sidebarDepth: 2 +summaryPoint1: Отримуйте фінансові стимули для створення точних прогнозів +summaryPoint2: Високоякісні прогнози щодо майбутніх подій +buttons: + - content: Докладніше + toId: how-prediction-markets-work + - content: Ознайомитися з програмами + toId: find-a-prediction-market + isSecondary: false +--- + +Ринки прогнозів використовують колективну мудрість і фінансові стимули, щоб передбачати події. Вони надають якісні різноманітні дані й набули поширення під час виборів у США 2024 року. + +## Як працюють ринки прогнозів {#how-prediction-markets-work} + +На відміну від традиційних методів прогнозування, які спираються на думки експертів, обмежені вибірки опитувань або історичні дані, ринки прогнозів використовують **фінансові стимули в режимі реального часу** й **колективну мудрість**, щоб отримувати інформацію, пов’язану з певною подією – виборами, цінами на криптовалюти, результатами спортивних змагань тощо. + +Це дає змогу будь-кому сигналізувати про підтримку певного результату, взявши на себе фінансові зобов’язання. +Завдяки можливості робити ставки на результати подій реального світу та коригуванню цін із появою нової інформації обґрунтовані думки отримують вищу цінність, а точність може винагороджуватися. + +Теоретично, оскільки учасники мають змогу отримати прибуток за правильне прогнозування, ринки прогнозів можуть передбачати результати з високою точністю. Ринки прогнозів у блокчейні ще цікавіші, оскільки будь-хто може взяти участь у прогнозуванні й отримати винагороду в Stablecoin або криптовалюті. + +## Чому це важливо? {#why-does-this-matter} + +На відміну від традиційного прогнозування, ринки прогнозів у блокчейні мають такі особливості: + + + + + + + +Навіть ті, хто лише спостерігає за ринком, можуть отримати доступ до цінних даних, які інакше були б недоступні. Уявіть це так: + +1. Прогнози прив’язані до певної події (наприклад, можливе розгортання Beam Chain до 2030 року). +2. Учасники ринку купують і продають частки, впевнені в тому чи іншому результаті. +3. Коли дедалі більше учасників ставлять на свої переконання, ціни коригуються, відображаючи інформацію в реальному часі. +4. Кожен, хто робить правильну ставку, заробляє пропорційно внесеній сумі. +5. Спостерігачі на ринку можуть використовувати відкриті дані, щоб проводити дослідження й обговорення. + +## Знайдіть ринок прогнозів {#find-a-prediction-market} + +На Ethereum є кілька ринків прогнозів. Це одні з найвідоміших ринків прогнозів сьогодні: + + + + +

      Пам’ятайте про ризики

      +

      Ставте тільки ті суми, які можете собі дозволити, і пам’ятайте про можливість розвитку залежності від азартних ігор.

      +
      + +## Виклики та ризики {#challenges-and-risks} + +Ринки прогнозів у блокчейні стикаються з кількома викликами, які можуть вплинути на чесність, законність і точність. + +⚠️ **Маніпулювання ринком.** Заможні гравці можуть спотворювати результати за допомогою «брудної» торгівлі.\ +💧 **Проблеми з ліквідністю.** Низька залученість учасників ([тонка ліквідність] (https://www.investopedia.com/terms/t/thinmarket.asp)) може знижувати надійність ринку.\ +🏛 **Регуляторна невизначеність.** Уряди наклали обмеження на деякі платформи. + +Щоб пом’якшити ці проблеми, розробники Ethereum експериментують із різними рішеннями, як-от футархія (управління через ринки прогнозів) та децентралізована верифікація особистості. + +## Експерименти з ринками прогнозів {#experimenting-with-prediction-markets} + +Ринки прогнозів змінюють процес ухвалення рішень у цифрову епоху. Використовуючи Ethereum, вони пропонують **чесні, відкриті та корисні способи прогнозування майбутнього.** + +Є багато способів використання інструментів прогнозування поза межами фінансової вигоди. Наприклад, у [Пропозиції щодо покращення DevCon](https://forum.devcon.org/t/futarchy-decision-markets-for-deciding-next-devcon/5305) (DIP) організаторам DevCon запропонували використати ринки прогнозів, щоб оцінити ймовірну відвідуваність майбутніх заходів. + +Це допомогло б організаторам визначити, яка локація забезпечить найбільшу кількість учасників, а яка — буде найдоступнішою для міжнародної аудиторії. Перевага такого підходу полягає в тому, що організатори DevCon можуть скоротити час на вивчення численних візових політик, доступності аеропортів і вартості життя в різних регіонах, водночас отримавши дані про те, куди потенційним учасникам найбільше хотілося б поїхати. + +## Further reading {#further-reading} + +[Від ринків прогнозування до інформаційних фінансів](https://vitalik.eth.limo/general/2024/11/09/infofinance.html) – Віталік Бутерін +[Розвиток децентралізованих ринків прогнозування на Ethereum](https://blockchain.oodles.io/dev-blog/decentralized-prediction-market-development-ethereum/)\ +[Основні відомості про проєкт Augur](https://github.com/AugurProject/whitepaper) \ No newline at end of file diff --git a/public/content/translations/uk/staking/pools/index.md b/public/content/translations/uk/staking/pools/index.md index 477fd02cd4b..44f05c1c09b 100644 --- a/public/content/translations/uk/staking/pools/index.md +++ b/public/content/translations/uk/staking/pools/index.md @@ -17,7 +17,7 @@ summaryPoints: Об’єднаний стейкінг — це спосіб, який дає змогу багатьом користувачам, у яких недостатня сума ефірів (ETH), отримати 32 ETH, необхідних для активації набору ключів валідатора. Функція пулу не підтримується протоколом, тому для задоволення цієї потреби було створено окремі рішення. -Деякі пули працюють за допомогою смартконтрактів, де кошти можуть бути внесені в контракт, який надійно керує вашою часткою й відстежує її, а також видає вам токен, який представляє цю вартість. Інші пули можуть не використовувати смартконтракти, а натомість опосередковуються поза мережею. +Деякі пули працюють за допомогою смартконтрактів, де кошти можуть бути внесені в контракт, який надійно керує вашою часткою й відстежує її, а також видає вам токен, який представляє цю вартість. Інші пули можуть не використовувати смарт-контракти й функціонувати поза блокчейном. ## Навіщо робити стейкінг із пулом? {#why-stake-with-a-pool} diff --git a/public/content/translations/uk/staking/saas/index.md b/public/content/translations/uk/staking/saas/index.md index deb8949d703..cea6ea1cdb1 100644 --- a/public/content/translations/uk/staking/saas/index.md +++ b/public/content/translations/uk/staking/saas/index.md @@ -74,7 +74,7 @@ summaryPoints: -Виведення коштів під час стейкінгу реалізовано в оновленні Shanghai/Capella у квітні 2023 року. Стейкери повинні надати адресу виведення (якщо її не було надано під час початкового депозиту), а платежі винагороди почнуть автоматично розподілятись на періодичній основі кожні кілька днів. +Стейкери повинні надати адресу виведення (якщо її не було надано під час початкового депозиту), а платежі винагороди почнуть автоматично розподілятись на періодичній основі кожні кілька днів. Валідатори також можуть повністю вийти зі статусу валідатора, що розблокує їх залишковий баланс ETH для виведення. Облікові записи, які надали адресу виведення виконання та завершили процес виходу, отримають увесь свій баланс на адресу виведення, надану під час наступного сканування валідатора. diff --git a/public/content/translations/uk/staking/solo/index.md b/public/content/translations/uk/staking/solo/index.md index 0467ad599ad..ae086cb9eea 100644 --- a/public/content/translations/uk/staking/solo/index.md +++ b/public/content/translations/uk/staking/solo/index.md @@ -1,6 +1,6 @@ --- -title: Індивідуальний стейкінг ваших ETH -description: 'Огляд: як почати самостійний стейкінг своїх ефірів (ETH)' +title: Домашній стейкінг ETH +description: Огляд домашнього стейкінгу ETH lang: uk template: staking emoji: ":money_with_wings:" @@ -13,31 +13,31 @@ summaryPoints: - Позбудьтеся довіри, але ніколи не передавайте контроль над ключами від своїх фондів. --- -## Що таке самостійний стейкінг? {#what-is-solo-staking} +## Що таке домашній стейкінг? {#what-is-solo-staking} -Самостійний стейкінг — це [запуск вузла Ethereum](/run-a-node/), підключеного до інтернету, і внесення 32 ETH для активації [валідатора](#faq), що дає вам змогу безпосередньо брати участь у мережевому консенсусі. +Домашній стейкінг – це процес [запуску вузла Ethereum](/run-a-node/), під’єднаного до інтернету, і внесення 32 ETH для активації [валідатора](#faq), що надає вам змогу безпосередньо брати участь у досягненні консенсусу в мережі. -**Самостійний стейкінг збільшує децентралізацію мережі Ethereum**, роблячи Ethereum стійкішим до цензури й атак. Інші методи стейкінгу можуть не допомогти мережі в той самий спосіб. Самостійний стейкінг — це найкращий варіант для захисту Ethereum. +**Домашній стейкінг підвищує децентралізацію мережі Ethereum**, сприяючи її стійкості до цензури й захищеності від атак. Інші методи стейкінгу можуть не допомогти мережі в той самий спосіб. Домашній стейкінг є найкращим варіантом для захисту Ethereum. Вузол Ethereum складається як з клієнта рівня виконання (EL), так і з клієнта рівня консенсусу (CL). Такі клієнти — це програмне забезпечення, яке працює разом із дійсним набором ключів підпису для перевірки транзакцій і блоків, підтвердження правильності голови ланцюжка, агрегування атестацій і пропозиції блоків. -Самостійні стейкери відповідають за роботу обладнання, необхідного для роботи цих клієнтів. Наполегливо рекомендується використовувати для цього спеціальну машину, якою ви керуєте вдома, це надзвичайно корисно для працездатності мережі. +Домашні стейкери відповідають за обслуговування апаратного забезпечення, потрібного для запуску цих клієнтів. Наполегливо рекомендується використовувати для цього спеціальну машину, якою ви керуєте вдома, це надзвичайно корисно для працездатності мережі. -Самостійний стейкер отримує винагороду безпосередньо від протоколу за те, що його валідатор функціонує належним чином і працює онлайн. +Домашній стейкер отримує винагороди безпосередньо від протоколу за підтримання належного функціонування та онлайн-статусу свого валідатора. -## Які переваги має самостійний стейкінг? {#why-stake-solo} +## Які переваги має домашній стейкінг? {#why-stake-solo} -Самостійний стейкінг передбачає більшу відповідальність, але забезпечує максимальний контроль над своїми коштами й налаштуванням ставок. +Домашній стейкінг пов’язаний з більшою відповідальністю, проте надає максимальний контроль над коштами та налаштуванням стейкінгу. - + -## Що потрібно обміркувати, перш ніж починати самостійний стейкінг {#considerations-before-staking-solo} +## Що потрібно обміркувати, перш ніж долучатися до домашнього стейкінгу {#considerations-before-staking-solo} -Хоч би як ми хотіли, щоб самостійний стейкінг був доступним для всіх і не ніс жодного ризику, це не так. Є кілька практичних і серйозних міркувань, про які слід пам’ятати, перш ніж вирішувати самостійно ставити свої ETH. +Хоч би як ми хотіли, щоб домашній стейкінг був доступним для всіх і не ніс жодного ризику, це не так. Перш ніж долучатися до домашнього стейкінгу ETH, варто зважити на кілька серйозних практичних питань. @@ -93,7 +93,7 @@ Staking Launchpad (Стартова платформа стейкінгу) — ## Що слід враховувати під час роботи з інструментами налаштування вузла та клієнта {#node-tool-considerations} -Кількість інструментів і послуг, які допоможуть вам самостійно робити ставки на ETH, дедалі зростає, але кожен із них має різні ризики й переваги. +З’являється дедалі більше інструментів і сервісів, які допомагають здійснювати домашній стейкінг ETH, проте кожен із них має свої ризики та переваги. Нижче ми використовуємо індикатори атрибутів, щоб вказати на суттєві сильні чи слабкі сторони, які може мати наведений інструмент стейкінгу. Використовуйте цей розділ як довідник визначень цих атрибутів, коли вибираєте інструменти, що допоможуть вам під час стейкінгу. @@ -119,7 +119,7 @@ Staking Launchpad (Стартова платформа стейкінгу) — Маєте пропозицію щодо інструменту стейкінгу, який ми пропустили? Ознайомтеся з нашою [політикою щодо переліку продуктів](/contributing/adding-staking-products/), щоб дізнатися, чи підійде він, і надіслати його на розгляд. -## Ознайомтеся з інструкціями щодо самостійного стейкінгу {#staking-guides} +## Ознайомтеся з інструкціями щодо домашнього стейкінгу {#staking-guides} @@ -138,7 +138,7 @@ Staking Launchpad (Стартова платформа стейкінгу) — Не вносьте більше ніж 32 ETH за один валідатор. Це не збільшить ваші винагороди. Якщо для валідатора було встановлено адресу для виведення коштів, зайві кошти понад 32 ETH автоматично буде виведено на цю адресу під час наступного проходження валідатора. -Якщо самостійний стейкінг здається вам надто вимогливим, спробуйте скористатися постачальником стейкінгу як послуги або, якщо ви працюєте з менше ніж 32 ETH, розгляньте варіант використання пулів стейкінгу. +Якщо домашній стейкінг здається вам надто вимогливим, спробуйте скористатися постачальником стейкінгу як послуги або, якщо ви працюєте з менш ніж 32 ETH, розгляньте варіант використання пулів стейкінгу. diff --git a/public/content/translations/uk/zero-knowledge-proofs/index.md b/public/content/translations/uk/zero-knowledge-proofs/index.md index cdf90013abc..b1b823a6d83 100644 --- a/public/content/translations/uk/zero-knowledge-proofs/index.md +++ b/public/content/translations/uk/zero-knowledge-proofs/index.md @@ -10,203 +10,205 @@ lang: uk Докази з нульовим розголошенням вперше з’явилися у статті [«Складність знання в інтерактивних системах доведення»](http://people.csail.mit.edu/silvio/Selected%20Scientific%20Papers/Proof%20Systems/The_Knowledge_Complexity_Of_Interactive_Proof_Systems.pdf) від 1985 року, у якій наведено визначення доказу з нульовим розголошенням, що широко використовується і досі: -> Протокол із нульовим розголошенням — це метод, за допомогою якого одна сторона (що доводить) може довести іншій стороні (що перевіряє), що щось є правдою, не розголошуючи жодної інформації, крім факту, що це конкретне твердження є правдою. +> Протокол з нульовим розголошенням — це метод, за допомогою якого одна сторона (той, хто доводить) **може довести** іншій стороні (верифікатору), **що щось є правдивим, не розкриваючи жодної інформації**, окрім факту, що це конкретне твердження є істинним. Докази з нульовим розголошенням вдосконалилися з плином років і зараз використовуються в кількох реальних сценаріях. + + ## Навіщо потрібні докази з нульовим розголошенням? {#why-zero-knowledge-proofs-are-important} -Докази з нульовим розголошенням стали проривом у прикладній криптографії, оскільки вони обіцяли підвищити безпеку інформації для користувачів. Подумайте, як ви можете довести певне твердження (наприклад, «Я громадянин країни Х») іншій стороні (наприклад, постачальнику послуг). Вам потрібно надати «докази», щоб підтвердити свою заяву, як-от національний паспорт або посвідчення водія. +Докази з нульовим розголошенням стали проривом у прикладній криптографії, оскільки вони обіцяли підвищити безпеку інформації для користувачів. Подумайте, як ви можете довести певне твердження (наприклад, «Я громадянин країни Х») іншій стороні (наприклад, постачальнику послуг). Ви маєте надати «докази», щоб підтвердити своє твердження, як-от національний паспорт або посвідчення водія. -Проте цей підхід має свої проблеми, основною з яких є відсутність конфіденційності. Дані, що ідентифікують особу (PII), які надаються третім сторонам, зберігаються в централізованих базах даних, які вразливі до злому. Крадіжки особистості стають серйозною проблемою, і тому з’являються заклики до використання засобів, які краще захищають конфіденційність інформації, що передається. +Проте цей підхід має свої проблеми, основною з яких є відсутність конфіденційності. Дані, що ідентифікують особу (PII), які надають третім сторонам, зберігаються в централізованих базах даних, які мають вразливості до злому. Крадіжки особистості стають серйозною проблемою, і тому з’являються заклики до використання засобів, які краще захищають конфіденційність інформації, що передається. -Докази з нульовим розголошенням розв’язують цю проблему, усуваючи потребу в розкритті інформації для підтвердження правдивості тверджень. Протокол із нульовим розголошенням використовує твердження (яке називають «свідком») як вхідні дані для генерування лаконічного доказу його правдивості. Цей доказ надає надійні гарантії, що твердження є правдивим, не розкриваючи інформацію, яка була використана для його створення. +Докази з нульовим розголошенням розв’язують цю проблему, **усуваючи необхідність розкривати інформацію для підтвердження дійсності тверджень**. Протокол із нульовим розголошенням використовує твердження (яке називають «свідком») як вхідні дані, щоб згенерування лаконічний доказ його правдивості. Цей доказ надає надійні гарантії, що твердження є правдивим, не розкриваючи інформацію, яку використали для його створення. -Повертаючись до нашого попереднього прикладу, єдиний доказ, який вам потрібен, щоб підтвердити свою заяву про громадянство, — це доказ із нульовим розголошенням. Той, хто перевіряє, повинен лише перевірити, чи є правдою певні властивості доказу, щоб переконатися, що твердження, як лежить у його основі, також є правдою. +Повертаючись до нашого попереднього прикладу, єдиний доказ, якого ви потребуєте, щоб підтвердити своє твердження про громадянство, – це доказ із нульовим розголошенням. Верифікатор має лише перевірити, чи є правдою певні властивості доказу, щоб переконатися, що твердження, як лежить у його основі, також є правдою. -## Як працюють докази з нульовим розголошенням? {#how-do-zero-knowledge-proofs-work} +## Використання доказів із нульовим розголошенням {#use-cases-for-zero-knowledge-proofs} -Доказ із нульовим розголошенням забезпечує можливість підтвердити правдивість твердження, не розкриваючи вміст твердження або спосіб, у який ви дізналися правду. Для цього протоколи з нульовим розголошенням використовують алгоритми, які приймають певні дані та повертають на виході результат «правда» або «неправда». +### Анонімні платежі {#anonymous-payments} -Протокол із нульовим розголошенням має відповідати таким критеріям: +Платежі за допомогою кредитних карток часто можуть побачити багато осіб, включно з постачальником платіжних послуг, банками та іншими зацікавленими сторонами (як-от державні органи). Хоча фінансовий нагляд корисний для виявлення незаконної діяльності, він також порушує недоторканність приватного життя звичайних громадян. -1. **Повнота**. Якщо вхідні дані є правдивими, протокол із нульовим розголошенням завжди повертає значення «правда». Отже, якщо твердження, що лежить в основі доказу, є правдивим, а особа, яка доводять, і особа, яка здійснює перевірку, діють чесно, то доказ може бути прийнятий. +Криптовалюти були призначені для того, щоб надати користувачам можливість здійснювати приватні, однорангові транзакції. Але більшість криптовалютних транзакцій перебувають у відкритому доступі в публічних блокчейнах. Ідентифікатори користувачів часто є псевдонімами та або навмисно пов’язані з реальними особами (наприклад, через включення адрес ETH у профілі Twitter або GitHub), або можуть бути пов’язані з реальними особами за допомогою базового аналізу даних в мережі та поза нею. -2. **Надійність**. Якщо вхідні дані неправдиві, теоретично неможливо обдурити протокол із нульовим розголошенням, щоб він повернув значення «правда». Отже, якщо особа, що доводить, каже неправду, вона не може обманути чесну особу, що перевіряє, переконавши її в тому, що неправдиве твердження є правдивим (за винятком незначної ймовірності). +Існують спеціальні «монети приватності», призначені для повністю анонімних транзакцій. Орієнтовані на конфіденційність блокчейни, як-от Zcash і Monero, захищають деталі транзакцій, зокрема адреси відправника/одержувача, тип активу, кількість і часовий графік транзакцій. -3. **Нульове розголошення**. Особа, що здійснює перевірку, не отримує жодної інформації про твердження, крім відомостей про його правдивість або неправдивість (має «нульове знання» про твердження). Ця вимога також запобігає виведенню особою, що перевіряє, початкових даних (вмісту твердження) з доказу. +Впроваджуючи технологію нульового розголошення в протоколі, орієнтовані на конфіденційність мережі [блокчейн](/glossary/#blockchain) дають змогу [вузлам](/glossary/#node) перевіряти транзакції без потреби в доступі до даних транзакцій. [EIP-7503](https://eips.ethereum.org/EIPS/eip-7503) – це приклад запропонованого рішення, яке надасть змогу здійснювати приватні перекази коштів у блокчейні Ethereum. Однак такі пропозиції складно реалізувати через міркування безпеки, регуляторні обмеження та проблеми з користувацьким досвідом (UX). -У базовій формі доказ із нульовим розголошенням складається з трьох елементів: **свідок**, **виклик** і **відповідь**. +**Докази з нульовим розголошенням також застосовуються для анонімізації транзакцій у публічних блокчейнах**. Прикладом є Tornado Cash, децентралізований сервіс, активи в якому перебувають під повним контролем користувача і який дає користувачам можливість здійснювати приватні транзакції в Ethereum. Tornado Cash використовує докази з нульовим розголошенням, щоб приховати деталі транзакцій і гарантувати фінансову конфіденційність. На жаль, оскільки це інструменти конфіденційності «за згодою», вони асоціюються з незаконною діяльністю. Щоб подолати цю проблему, конфіденційність повинна врешті-решт стати стандартом за промовчанням у публічних блокчейнах. -- **Свідок**. За використання доказу з нульовим розголошенням той, хто доводить, бажає довести знання ним певної прихованої інформації. Секретна інформація є «свідком» доказу, а передбачуване знання особи, що доводить, про свідка встановлює набір питань, на які може відповісти тільки той, хто має цю інформацію. Таким чином, особа, що доводить, розпочинає процес доведення, випадковим чином вибираючи питання, обчислюючи відповідь на нього та надсилаючи її особі, що здійснює перевірку. +### Захист даних, що слугують для ідентифікації {#identity-protection} -- **Виклик**. Особа, що здійснює перевірку, випадковим чином обирає інше питання з набору й просить особу, що доводить, відповісти на нього. +Сучасні системи керування ідентифікацією піддають ризику персональні дані. Доведення з нульовим розголошенням може допомогти людям підтверджувати особу, захищаючи конфіденційні дані. -- **Відповідь**. Особа, що доводить, приймає питання, обчислює відповідь і повертає її особі, що перевіряє. Відповідь особи, що доводить, дає особі, що перевіряє, можливість перевірити, чи справді особа, що доводить, має доступ до свідка. Щоб переконатися, що особа, що доводить, не вгадує відповіді, особа, що перевіряє, вибирає додаткові питання, які ставить особі, що доводить. За багаторазового повторення таких операцій, поки особа, що здійснює перевірку, не буде задоволена, імовірність того, що особа, яка доводить, підробляє знання про свідка, значно зменшується. +Докази з нульовим розголошенням особливо корисні в контексті [децентралізованої ідентифікації](/decentralized-identity/). Децентралізована ідентифікація (яку також описують як «самосуверенну ідентифікацію») дає людині можливість контролювати доступ до персональних ідентифікаторів. Підтвердження свого громадянства без розкриття податкового номера чи паспортних даних є хорошим прикладом того, як технологія нульового розголошення забезпечує децентралізовану ідентифікацію. -Вище описано структуру «інтерактивного доказу з нульовим розголошенням». Ранні протоколи з нульовим розголошенням використовували інтерактивне доведення, де перевірка правдивості твердження вимагала взаємодії між особою, що доводить, і особою, що перевіряє, з обміном повідомленнями. +### Автентифікація {#authentication} -Хорошим прикладом, який демонструє, як працюють інтерактивні докази, є відомий приклад Жан-Жака Квіскатера [ Історія про печеру Алі-Баби](https://en.wikipedia.org/wiki/Zero-knowledge_proof#The_Ali_Baba_cave). У цій історії Пеггі (особа, що доводить) хоче довести Віктору (особі, що перевіряє), що вона знає секретну фразу для відчинення магічних дверей, не розкриваючи цю фразу. +Щоб користуватися онлайн-сервісами, потрібно підтвердити свою особу та право доступу до цих платформ. Для цього часто потрібно надати особисту інформацію, таку як імена, електронні адреси, дати народження тощо. Можливо, вам також буде потрібно запам’ятати довгі паролі, щоб уникнути ризику втратити доступ. -### Неінтерактивні докази з нульовим розголошенням {#non-interactive-zero-knowledge-proofs} +Проте докази з нульовим розголошенням можуть спростити автентифікацію як для платформ, так і для користувачів. Після створення доказу з нульовим розголошенням із використанням загальнодоступних введених даних (наприклад, даних, що підтверджують членство користувача на платформі) і приватних введених даних (наприклад, даних користувача) користувач може просто надати його для автентифікації своєї особи, коли йому буде потрібно отримати доступ до сервісу. Це робить операції зручнішими для користувачів і звільняє організації від необхідності зберігати величезну кількість інформації про них. -Хоча інтерактивне доведення було революційним, воно мало обмежену корисність, оскільки вимагало доступності та повторюваної взаємодії двох сторін. Навіть якщо особа, що перевіряє, була переконана в чесності особи, що доводить, доказ був недоступний для незалежної перевірки (обчислення нового доказу вимагало нового набору повідомлень між обома сторонами). +### Обчислення, що піддаються перевірці {#verifiable-computation} -Для розв’язання цієї проблеми Мануель Блум, Пол Фелдман і Сильвіо Мікалі запропонували перші [неінтерактивні докази з нульовим розголошенням](https://dl.acm.org/doi/10.1145/62212.62222), у яких особа, що доводить, і особа, що перевіряє, мають спільний ключ. Це дає особі, що доводить, змогу продемонструвати своє знання певної інформації (тобто свідка) без надання самої інформації. +Обчислення, що піддаються перевірці, — це ще одне застосування технології нульового розголошення для вдосконалення дизайну блокчейну. Обчислення, що піддаються перевірці, дають нам змогу передати обчислення іншій особі, зберігаючи результати, що піддаються перевірці. Така особа надає результат разом із доказом того, що програма була виконана правильно. -На відміну від інтерактивних, неінтерактивні докази вимагають лише одного раунду комунікації між учасниками (особою, що доводить, і особою, що перевіряє). Особа, що доводить, передає секретну інформацію спеціальному алгоритму для обчислення доказу з нульовим розголошенням. Цей доказ надсилається особі, що перевіряє, яка переконується в тому, що особа, яка доводить, знає секретну інформацію, використовуючи інший алгоритм. +Обчислення, що піддаютсья перевірці, є **надважливими для підвищення швидкості обробки в блокчейнах** без зниження безпеки. Розуміння цього вимагає знання відмінностей у запропонованих рішеннях для масштабування Ethereum. -Неінтерактивне доведення зменшує комунікацію між особою, що доводить, та особою, що перевіряє, роблячи докази з нульовим розголошенням ефективнішими. Крім того, коли доказ згенеровано, перевірити його може будь-хто інший (з доступом до спільного ключа та алгоритму перевірки). +[Рішення для масштабування в мережі](/developers/docs/scaling/#onchain-scaling), як-от сегментування, вимагають значної модифікації базового шару блокчейну. Однак цей підхід дуже складний, і помилки в реалізації можуть підірвати модель безпеки Ethereum. -Неінтерактивні докази стали проривом для технології нульового розголошення та спонукали до розвитку систем доведення, які використовуються сьогодні. Ми обговоримо нижче ці типи доказів: +[Рішення для поза мережевого масштабування](/developers/docs/scaling/#offchain-scaling) не вимагають переблення основного протоколу Ethereum. Натомість вони покладаються на зовнішню модель обчислень, щоб покращити пропускну здатність на базовому рівні Ethereum. -### Типи доказів із нульовим розголошенням {#types-of-zero-knowledge-proofs} +Ось як це працює на практиці. -#### ZK-SNARKs {#zk-snarks} +- Замість обробки кожної транзакції Ethereum перекладає виконання на окремий ланцюг. -ZK-SNARK є абревіатурою від **Zero-Knowledge Succinct Non-Interactive Argument of Knowledge (лаконічне неінтерактивне підтвердження знання з нульовим розголошенням)**. Протокол ZK-SNARK має такі характеристики: +- Після обробки транзакцій інший ланцюг повертає результати, які застосовуються до стану Ethereum. -- **Нульове розголошення**. Особа, що перевіряє, може перевірити чесність твердження, не знаючи більше нічого про саме твердження. Єдина інформація, яку особа, що перевіряє, має про твердження, полягає в тому, є воно правдивим чи хибним. +Перевага тут полягає в тому, що Ethereum не потрібно виконувати жодних завдань, а лише застосовувати результати обчислень сторонніх джерел до свого стану. Це зменшує перевантаження мережі, а також підвищує швидкість транзакцій (офлайн-протоколи оптимізовані для швидшого виконання). -- **Лаконічність**. Доказ із нульовим розголошенням є меншим за свідка й може бути швидко перевірений. +Мережа потребує способу підтвердження позамережевих транзакцій без їх повторного виконання, інакше цінність позамережевого виконання втрачається. -- **Неінтерактивність**. Доказ є неінтерактивним, оскільки особа, що доводить, і особа, що перевіряє, взаємодіють лише один раз, на відміну від інтерактивних доказів, які вимагають кількох раундів комунікації. +Тут у гру вступають обчислення, що піддаються перевірці. Коли вузол виконує транзакцію за межами Ethereum, він надсилає доказ із нульовим розголошенням, щоб довести правильність виконання поза мережею. Цей доказ (який називають [доказом чинності](/glossary/#validity-proof)) гарантує, що транзакція чинна, даючи Ethereum змогу застосувати результат до свого стану, не чекаючи, поки хтось це оскаржить. -- **Підтвердження**. Доказ задовольняє вимогу надійності, тому обман надзвичайно малоймовірний. +[Відміна нульових знань](/developers/docs/scaling/zk-rollups) і [Validium](/developers/docs/scaling/validium/) – це два рішення для масштабування поза мережею, які використовують докази дійсності, щоб забезпечувати безпечне масштабування. Ці протоколи виконують тисячі транзакцій в автономному режимі і надсилають докази для перевірки на Ethereum. Ці результати можна застосувати відразу після перевірки доказу, що дає Ethereum змогу обробляти більше транзакцій без збільшення обчислень на базовому рівні. -- **Розголошення**. Доказ із нульовим розголошенням не може бути створений без доступу до секретної інформації (свідка). Для особи, що доводить, яка не має свідка, обчислити правильний доказ із нульовим розголошенням важко або навіть неможливо. +### Зменшення хабарництва та змов під час голосування в блокчейні {#secure-blockchain-voting} -Згаданий раніше «спільний ключ» належить до публічних параметрів, які особа, що доводить, та особа, що перевіряє, погоджуються використовувати для генерування та перевірки доказів. Генерування публічних параметрів (які разом відомі як загальний довідковий рядок (CRS)) є конфіденційною операцією через її важливість для безпеки протоколу. Якщо ентропія (випадковість), використана для генерування CRS, потрапить у руки недоброчесної особи, що доводить, вона може обчислити підроблені докази. +Блокчейн-схеми голосування мають багато переваг: вони повністю піддаються перевірці, захищені від атак, стійкі до цензури та не мають географічних обмежень. Але навіть схеми голосування в мережі не захищені від проблеми **змови**. -[Багатостороннє обчислення (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) є способом зменшення ризиків під час генерування публічних параметрів. У [церемонії довіреного налаштування](https://zkproof.org/2021/06/30/setup-ceremonies/amp/) беруть участь декілька осіб, кожна з яких вносить свої випадкові значення для генерування CRS. Доки хоча б одна чесна сторона знищує свою частину ентропії, протокол ZK-SNARK зберігає обчислювальну надійність. +Змова, яка визначається як «координація дій із метою обмеження відкритої конкуренції шляхом обману, дезорієнтування та введення в оману інших», може мати форму впливу зловмисника на голосування шляхом пропонування хабарів. Наприклад, Аліса може отримати хабар від Боба, щоб проголосувати за `option B` у бюлетені, навіть якщо вона віддає перевагу `option A`. -Довірене налаштування вимагає від користувачів довіри до учасників процесу генерування параметрів. Однак розвиток ZK-STARK дав змогу створити протоколи доведення, які працюють без довіреного налаштування. +Підкуп і змова зменшують ефективність будь-якого процесу, який використовує голосування як сигнальний механізм (особливо там, де користувачі можуть довести, як вони голосували). Це може мати значні наслідки, особливо якщо голосування пов’язане з розподілом обмежених ресурсів. -#### ZK-STARKs {#zk-starks} +Наприклад, [квадратичні механізми фінансування](https://www.radicalxchange.org/concepts/plural-funding/) покладаються на пожертви, щоб оцінити, яким із різних суспільних проєктів віддають перевагу. Кожна пожертва зараховується як «голос» за певний проєкт, і ті проєкти, які отримують більше голосів, отримують більше коштів із відповідного пулу. -ZK-STARK є абревіатурою від **Zero-Knowledge Scalable Transparent Argument of Knowledge (масштабоване прозоре підтвердження знання з нульовим розголошенням)**. ZK-STARK схожі на ZK-SNARK, за винятком того, що вони мають такі характеристики: +Використання голосування в мережі робить квадратичне фінансування вразливим до змови: транзакції в блокчейні є публічними, тож ті, хто пропонує хабар, можуть перевірити активність тих, хто його отримав, в мережі, щоб побачити, як вони «проголосували». Таким чином квадратичне фінансування перестає бути ефективним засобом розподілу коштів на підставі сукупних уподобань громади. -- **Масштабованість**. ZK-STARK є швидшим за ZK-SNARK у генеруванні та перевірці доказів, коли розмір свідка є більшим. З доказами STARK час доведення та перевірки за збільшення розміру свідка зростає тільки трохи (у протоколах SNARK час доведення та перевірки збільшується лінійно з розміром свідка). +На щастя, новіші рішення, як-от MACI (Мінімальна антикорупційна інфраструктура), використовують докази з нульовим розголошенням, щоб підвищити стійкість голосування в блокчейні (наприклад, механізми квадратичного фінансування) до хабарництва та змови. MACI — це набір смартконтрактів і сценаріїв, які дають змогу центральному адміністратору (так званому «координатору») зводити голоси та підраховувати результати _без_ розкриття деталей голосування кожної особи. Попри це, все ще можна перевірити, чи правильно підраховано голоси, або підтвердити, що певна особа брала участь у голосуванні. -- **Прозорість**. Для доведення та перевірки в протоколах ZK-STARK використовується випадковість, яку можна публічно підтвердити, а не довірене налаштування. Тому вони більш прозорі в порівнянні із ZK-SNARK. +#### Як MACI працює з доказами з нульовим розголошенням? {#how-maci-works-with-zk-proofs} -ZK-STARK генерує більші докази, ніж ZK-SNARK, що означає більші накладні витрати на перевірку. Однак існують випадки (наприклад, доведення великих наборів даних), коли ZK-STARK можуть бути більш ефективними з точки зору вартості порівняно із ZK-SNARK. +Спочатку координатор розгортає контракт MACI на Ethereum, після чого користувачі можуть підписатися на голосування (зареєструвавши свій відкритий ключ у смартконтракті). Користувачі віддають голоси, надсилаючи повідомлення, зашифровані своїм відкритим ключем до смартконтракту (щоб голос був чинним, він має бути підписаний останнім відкритим ключем, пов’язаним з ідентифікацією користувача; це один із критеріїв). Після закінчення періоду голосування координатор обробляє всі повідомлення, підраховує голоси та підтверджує результати в мережі. -## Використання доказів із нульовим розголошенням {#use-cases-for-zero-knowledge-proofs} +У MACI докази з нульовим розголошенням використовуються для забезпечення правильності обчислень, унеможливлюючи неправильну обробку координатором голосів і результатів підрахунку. Цього досягають, вимагаючи від координатора генерувати докази ZK-SNARK, які підтверджують, що а) всі повідомлення були оброблені правильно і б) кінцевий результат відповідає сумі всіх _чинних_ голосів. -### Анонімні платежі {#anonymous-payments} +Таким чином, навіть не повідомляючи про розподіл голосів за користувачами (як це зазвичай буває), MACI гарантує цілісність результатів, обчислених у процесі підрахунку. Ця особливість корисна для зниження ефективності основних схем змови. Ми можемо вивчити цю можливість, використовуючи попередній приклад із Бобом, який підкуповував Алісу, щоб вона проголосувала за потрібний йому варіант. -Платежі за допомогою кредитних карток часто можуть побачити багато осіб, включно з постачальником платіжних послуг, банками та іншими зацікавленими сторонами (як-от державні органи). Хоча фінансовий нагляд корисний для виявлення незаконної діяльності, він також порушує недоторканність приватного життя звичайних громадян. +- Аліса реєструється для голосування, відправляючи свій відкритий ключ до смартконтракту. +- Аліса погоджується голосувати за `option B` в обмін на хабар від Боба. +- Аліса голосує за `option B`. +- Аліса таємно відправляє зашифровану транзакцію, щоб змінити відкритий ключ, пов’язаний із її особою. +- Аліса відправляє ще одне (зашифроване) повідомлення до смартконтракту, голосуючи за `option A`, з використанням нового відкритого ключа. +- Аліса показує Бобу транзакцію, яка демонструє, що вона проголосувала за `option B` (яка є нечинною, оскільки відкритий ключ більше не пов’язаний з ідентифікацією Аліси в системі). +- Під час обробки повідомлень координатор пропускає голос Аліси за `option B` та враховує лише голос за `option A`. Отже, спроба Боба змовитися з Алісою і маніпулювати голосуванням в блокчейні провалилася. -Криптовалюти були призначені для того, щоб надати користувачам можливість здійснювати приватні, однорангові транзакції. Але більшість криптовалютних транзакцій перебувають у відкритому доступі в публічних блокчейнах. Дані користувачів часто є псевдонімами та або навмисно пов'язані з реальною особою (наприклад, шляхом включення адреси ETH у профіль Twitter або GitHub), або можуть бути пов'язані з реальною особою за допомогою базового аналізу даних у ланцюзі та поза ним. +За використання MACI _необхідно_ довіряти координатору й вірити, що він не вступить у змову з хабарниками й не намагатиметься сам підкупити виборців. Координатор може розшифрувати повідомлення користувачів (необхідні для створення доказу), тому може точно перевірити, як голосувала кожна людина. -Існують спеціальні «монети приватності», призначені для повністю анонімних транзакцій. Орієнтовані на конфіденційність блокчейни, як-от Zcash і Monero, захищають деталі транзакцій, зокрема адреси відправника/одержувача, тип активу, кількість і часовий графік транзакцій. +Але в тих випадках, коли координатор залишається чесним, MACI є потужним інструментом, який гарантує чесність голосування в блокчейні. Це пояснює популярність його застосування для програм квадратичного фінансування (наприклад, [clr.fund](https://clr.fund/#/about/maci)), які значною мірою покладаються на чесне голосування кожної людини. -Вбудовуючи в протокол технологію нульового розголошення, блокчейн-мережі, орієнтовані на конфіденційність, дозволяють вузлам підтверджувати транзакції без необхідності отримувати доступ до даних про транзакції. +[Дізнайтеся більше про MACI](https://privacy-scaling-explorations.github.io/maci/). -Докази з нульовим розголошенням також застосовуються для анонімності транзакцій у публічних блокчейнах. Прикладом є Tornado Cash, децентралізований сервіс, активи в якому перебувають під повним контролем користувача і який дає користувачам можливість здійснювати приватні транзакції в Ethereum. Tornado Cash використовує докази з нульовим розголошенням, щоб приховати деталі транзакцій і гарантувати фінансову конфіденційність. На жаль, оскільки це інструменти конфіденційності «за згодою», вони асоціюються з незаконною діяльністю. Щоб подолати цю проблему, конфіденційність повинна врешті-решт стати стандартом за промовчанням у публічних блокчейнах. +## Як працюють докази з нульовим розголошенням? {#how-do-zero-knowledge-proofs-work} -### Захист даних, що слугують для ідентифікації {#identity-protection} +Доказ із нульовим розголошенням забезпечує можливість підтвердити правдивість твердження, не розкриваючи вміст твердження або спосіб, у який ви дізналися правду. Для цього протоколи з нульовим розголошенням використовують алгоритми, які приймають певні дані та повертають на виході результат «правда» або «неправда». -Сучасні системи керування ідентифікацією піддають ризику персональні дані. Доведення з нульовим розголошенням може допомогти людям підтверджувати особу, захищаючи конфіденційні дані. +Протокол із нульовим розголошенням має відповідати таким критеріям: -Докази з нульовим розголошенням особливо корисні в контексті [децентралізованої ідентифікації](/decentralized-identity/). Децентралізована ідентифікація (яку також описують як «самосуверенну ідентифікацію») дає людині можливість контролювати доступ до персональних ідентифікаторів. Підтвердження свого громадянства без розкриття податкового номера чи паспортних даних є хорошим прикладом того, як технологія нульового розголошення забезпечує децентралізовану ідентифікацію. +1. **Повнота**. Якщо вхідні дані є правдивими, протокол із нульовим розголошенням завжди повертає значення «правда». Отже, якщо твердження, що лежить в основі доказу, є правдивим, а особа, яка доводять, і особа, яка здійснює перевірку, діють чесно, то доказ може бути прийнятий. -### Автентифікація {#authentication} +2. **Надійність**. Якщо вхідні дані неправдиві, теоретично неможливо обдурити протокол із нульовим розголошенням, щоб він повернув значення «правда». Отже, якщо особа, що доводить, каже неправду, вона не може обманути чесну особу, що перевіряє, переконавши її в тому, що неправдиве твердження є правдивим (за винятком незначної ймовірності). -Щоб користуватися онлайн-сервісами, потрібно підтвердити свою особу та право доступу до цих платформ. Для цього часто потрібно надати особисту інформацію, таку як імена, електронні адреси, дати народження тощо. Можливо, вам також буде потрібно запам’ятати довгі паролі, щоб уникнути ризику втратити доступ. +3. **Нульове розголошення**. Особа, що здійснює перевірку, не отримує жодної інформації про твердження, крім відомостей про його правдивість або неправдивість (має «нульове знання» про твердження). Ця вимога також запобігає виведенню особою, що перевіряє, початкових даних (вмісту твердження) з доказу. -Проте докази з нульовим розголошенням можуть спростити автентифікацію як для платформ, так і для користувачів. Після створення доказу з нульовим розголошенням із використанням загальнодоступних введених даних (наприклад, даних, що підтверджують членство користувача на платформі) і приватних введених даних (наприклад, даних користувача) користувач може просто надати його для автентифікації своєї особи, коли йому буде потрібно отримати доступ до сервісу. Це робить операції зручнішими для користувачів і звільняє організації від необхідності зберігати величезну кількість інформації про них. +У базовій формі доказ із нульовим розголошенням складається з трьох елементів: **свідок**, **виклик** і **відповідь**. -### Обчислення, що піддаються перевірці {#verifiable-computation} +- **Свідок**. За використання доказу з нульовим розголошенням той, хто доводить, бажає довести знання ним певної прихованої інформації. Секретна інформація є «свідком» доказу, а передбачуване знання особи, що доводить, про свідка встановлює набір питань, на які може відповісти тільки той, хто має цю інформацію. Таким чином, особа, що доводить, розпочинає процес доведення, випадковим чином вибираючи питання, обчислюючи відповідь на нього та надсилаючи її особі, що здійснює перевірку. -Обчислення, що піддаються перевірці, — це ще одне застосування технології нульового розголошення для вдосконалення дизайну блокчейну. Обчислення, що піддаються перевірці, дають нам змогу передати обчислення іншій особі, зберігаючи результати, що піддаються перевірці. Така особа надає результат разом із доказом того, що програма була виконана правильно. +- **Виклик**. Особа, що здійснює перевірку, випадковим чином обирає інше питання з набору й просить особу, що доводить, відповісти на нього. -Обчислення, що піддаються перевірці, мають вирішальне значення для підвищення швидкості обробки в блокчейні без зменшення безпеки. Розуміння цього вимагає знання відмінностей у запропонованих рішеннях для масштабування Ethereum. +- **Відповідь**. Особа, що доводить, приймає питання, обчислює відповідь і повертає її особі, що перевіряє. Відповідь особи, що доводить, дає особі, що перевіряє, можливість перевірити, чи справді особа, що доводить, має доступ до свідка. Щоб переконатися, що особа, що доводить, не вгадує відповіді, особа, що перевіряє, вибирає додаткові питання, які ставить особі, що доводить. За багаторазового повторення таких операцій, поки особа, що здійснює перевірку, не буде задоволена, імовірність того, що особа, яка доводить, підробляє знання про свідка, значно зменшується. -[Рішення для масштабування в межах ланцюга](/developers/docs/scaling/#on-chain-scaling), як-от сегментування, вимагають значної модифікації базового рівня блокчейну. Однак цей підхід дуже складний, і помилки в реалізації можуть підірвати модель безпеки Ethereum. +Вище описано структуру «інтерактивного доказу з нульовим розголошенням». Ранні протоколи з нульовим розголошенням використовували інтерактивне доведення, де перевірка правдивості твердження вимагала взаємодії між особою, що доводить, і особою, що перевіряє, з обміном повідомленнями. -[Рішення для масштабування поза ланцюгом](/developers/docs/scaling/#off-chain-scaling) не вимагають перероблювання основного протоколу Ethereum. Натомість вони покладаються на зовнішню модель обчислень, щоб покращити пропускну здатність на базовому рівні Ethereum. +Хорошим прикладом, який демонструє, як працюють інтерактивні докази, є відомий приклад Жан-Жака Квіскатера [ Історія про печеру Алі-Баби](https://en.wikipedia.org/wiki/Zero-knowledge_proof#The_Ali_Baba_cave). У цій історії Пеггі (особа, що доводить) хоче довести Віктору (особі, що перевіряє), що вона знає секретну фразу для відчинення магічних дверей, не розкриваючи цю фразу. -Ось як це працює на практиці. +### Неінтерактивні докази з нульовим розголошенням {#non-interactive-zero-knowledge-proofs} -- Замість обробки кожної транзакції Ethereum перекладає виконання на окремий ланцюг. +Хоча інтерактивне доведення було революційним, воно мало обмежену корисність, оскільки вимагало доступності та повторюваної взаємодії двох сторін. Навіть якщо особа, що перевіряє, була переконана в чесності особи, що доводить, доказ був недоступний для незалежної перевірки (обчислення нового доказу вимагало нового набору повідомлень між обома сторонами). -- Після обробки транзакцій інший ланцюг повертає результати, які застосовуються до стану Ethereum. +Для розв’язання цієї проблеми Мануель Блум, Пол Фелдман і Сильвіо Мікалі запропонували перші [неінтерактивні докази з нульовим розголошенням](https://dl.acm.org/doi/10.1145/62212.62222), у яких особа, що доводить, і особа, що перевіряє, мають спільний ключ. Це дає особі, що доводить, змогу продемонструвати своє знання певної інформації (тобто свідка) без надання самої інформації. -Перевага тут полягає в тому, що Ethereum не потрібно виконувати жодних завдань, а лише застосовувати результати обчислень сторонніх джерел до свого стану. Це зменшує перевантаження мережі, а також підвищує швидкість транзакцій (протоколи поза ланцюгом оптимізуються для швидшого виконання). +На відміну від інтерактивних, неінтерактивні докази вимагають лише одного раунду комунікації між учасниками (особою, що доводить, і особою, що перевіряє). Особа, що доводить, передає секретну інформацію спеціальному алгоритму для обчислення доказу з нульовим розголошенням. Цей доказ надсилається особі, що перевіряє, яка переконується в тому, що особа, яка доводить, знає секретну інформацію, використовуючи інший алгоритм. -Ланцюгу потрібен спосіб перевірки транзакцій поза ланцюгом без їх повторного виконання, інакше втрачається цінність їх виконання поза ланцюгом. +Неінтерактивне доведення зменшує комунікацію між особою, що доводить, та особою, що перевіряє, роблячи докази з нульовим розголошенням ефективнішими. Крім того, коли доказ згенеровано, перевірити його може будь-хто інший (з доступом до спільного ключа та алгоритму перевірки). -Тут у гру вступають обчислення, що піддаються перевірці. Коли вузол виконує транзакцію за межами Ethereum, він надсилає доказ із нульовим розголошенням, щоб підтвердити правильність виконання операції поза ланцюгом. Цей доказ (який називають [доказом чинності](/glossary/#validity-proof)) гарантує, що транзакція чинна, даючи Ethereum змогу застосувати результат до свого стану, не чекаючи, поки хтось це оскаржить. +Неінтерактивні докази стали проривом для технології нульового розголошення та спонукали до розвитку систем доведення, які використовуються сьогодні. Ми обговоримо нижче ці типи доказів: -[Зведення з нульовим розголошенням](/developers/docs/scaling/zk-rollups) і [валідіуми](/developers/docs/scaling/validium/) —це два рішення для масштабування поза ланцюгом, які використовують докази чинності для забезпечення безпечної масштабованості. Ці протоколи виконують тисячі транзакцій поза ланцюгом та надсилають докази для перевірки в Ethereum. Ці результати можна застосувати відразу після перевірки доказу, що дає Ethereum змогу обробляти більше транзакцій без збільшення обчислень на базовому рівні. +### Типи доказів із нульовим розголошенням {#types-of-zero-knowledge-proofs} -### Зменшення хабарництва та змов під час голосування в ланцюзі {#secure-blockchain-voting} +#### ZK-SNARKs {#zk-snarks} -Блокчейн-схеми голосування мають багато переваг: вони повністю піддаються перевірці, захищені від атак, стійкі до цензури та не мають географічних обмежень. Але навіть схеми голосування в ланцюзі не захищені від проблеми **змови**. +ZK-SNARK є абревіатурою від **Zero-Knowledge Succinct Non-Interactive Argument of Knowledge (лаконічне неінтерактивне підтвердження знання з нульовим розголошенням)**. Протокол ZK-SNARK має такі характеристики: -Змова, яка визначається як «координація дій із метою обмеження відкритої конкуренції шляхом обману, дезорієнтування та введення в оману інших», може мати форму впливу зловмисника на голосування шляхом пропонування хабарів. Наприклад, Аліса може отримати хабар від Боба, щоб проголосувати за `option B` у бюлетені, навіть якщо вона віддає перевагу `option A`. +- **Нульове розголошення**. Особа, що перевіряє, може перевірити чесність твердження, не знаючи більше нічого про саме твердження. Єдина інформація, яку особа, що перевіряє, має про твердження, полягає в тому, є воно правдивим чи хибним. -Підкуп і змова зменшують ефективність будь-якого процесу, який використовує голосування як сигнальний механізм (особливо там, де користувачі можуть довести, як вони голосували). Це може мати значні наслідки, особливо якщо голосування пов’язане з розподілом обмежених ресурсів. +- **Лаконічність**. Доказ із нульовим розголошенням є меншим за свідка й може бути швидко перевірений. -Наприклад, [квадратичні механізми фінансування](https://www.radicalxchange.org/concepts/plural-funding/) покладаються на пожертви, щоб оцінити, яким із різних суспільних проєктів віддають перевагу. Кожна пожертва зараховується як «голос» за певний проєкт, і ті проєкти, які отримують більше голосів, отримують більше коштів із відповідного пулу. +- **Неінтерактивність**. Доказ є неінтерактивним, оскільки особа, що доводить, і особа, що перевіряє, взаємодіють лише один раз, на відміну від інтерактивних доказів, які вимагають кількох раундів комунікації. -Використання голосування в ланцюзі робить квадратичне фінансування вразливим до змови: транзакції в блокчейні є відкритими, тож ті, хто пропонує хабар, можуть перевірити дії тих, хто його отримав, у ланцюзі, щоб побачити, як вони «голосували». Таким чином квадратичне фінансування перестає бути ефективним засобом розподілу коштів на підставі сукупних уподобань громади. +- **Підтвердження**. Доказ задовольняє вимогу надійності, тому обман надзвичайно малоймовірний. -На щастя, новіші рішення, такі як MACI (мінімальна інфраструктура для запобігання змові), використовують докази з нульовим розголошенням, щоб зробити голосування в ланцюзі (наприклад, квадратичні механізми фінансування) стійким до хабарництва та змови. MACI — це набір смартконтрактів і сценаріїв, які дають змогу центральному адміністратору (так званому «координатору») зводити голоси та підраховувати результати _без_ розкриття деталей голосування кожної особи. Попри це, все ще можна перевірити, чи правильно підраховано голоси, або підтвердити, що певна особа брала участь у голосуванні. +- **Розголошення**. Доказ із нульовим розголошенням не може бути створений без доступу до секретної інформації (свідка). Для особи, що доводить, яка не має свідка, обчислити правильний доказ із нульовим розголошенням важко або навіть неможливо. -#### Як MACI працює з доказами з нульовим розголошенням? {#how-maci-works-with-zk-proofs} +Згаданий раніше «спільний ключ» належить до публічних параметрів, які особа, що доводить, та особа, що перевіряє, погоджуються використовувати для генерування та перевірки доказів. Генерування публічних параметрів (які разом відомі як загальний довідковий рядок (CRS)) є конфіденційною операцією через її важливість для безпеки протоколу. Якщо ентропія (випадковість), використана для генерування CRS, потрапить у руки недоброчесної особи, що доводить, вона може обчислити підроблені докази. -Спочатку координатор розгортає контракт MACI на Ethereum, після чого користувачі можуть підписатися на голосування (зареєструвавши свій відкритий ключ у смартконтракті). Користувачі віддають голоси, надсилаючи повідомлення, зашифровані своїм відкритим ключем до смартконтракту (щоб голос був чинним, він має бути підписаний останнім відкритим ключем, пов’язаним з ідентифікацією користувача; це один із критеріїв). Потім координатор обробляє всі повідомлення після закінчення періоду голосування, підраховує голоси та підтверджує результати в ланцюзі. +[Багатостороннє обчислення (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) є способом зменшення ризиків під час генерування публічних параметрів. У [церемонії довіреного налаштування](https://zkproof.org/2021/06/30/setup-ceremonies/amp/) беруть участь декілька осіб, кожна з яких вносить свої випадкові значення для генерування CRS. Доки хоча б одна чесна сторона знищує свою частину ентропії, протокол ZK-SNARK зберігає обчислювальну надійність. -У MACI докази з нульовим розголошенням використовуються для забезпечення правильності обчислень, унеможливлюючи неправильну обробку координатором голосів і результатів підрахунку. Цього досягають, вимагаючи від координатора генерувати докази ZK-SNARK, які підтверджують, що а) всі повідомлення були оброблені правильно і б) кінцевий результат відповідає сумі всіх _чинних_ голосів. +Довірене налаштування вимагає від користувачів довіри до учасників процесу генерування параметрів. Однак розвиток ZK-STARK дав змогу створити протоколи доведення, які працюють без довіреного налаштування. -Таким чином, навіть не повідомляючи про розподіл голосів за користувачами (як це зазвичай буває), MACI гарантує цілісність результатів, обчислених у процесі підрахунку. Ця особливість корисна для зниження ефективності основних схем змови. Ми можемо вивчити цю можливість, використовуючи попередній приклад із Бобом, який підкуповував Алісу, щоб вона проголосувала за потрібний йому варіант. +#### ZK-STARKs {#zk-starks} -- Аліса реєструється для голосування, відправляючи свій відкритий ключ до смартконтракту. -- Аліса погоджується голосувати за `option B` в обмін на хабар від Боба. -- Аліса голосує за `option B`. -- Аліса таємно відправляє зашифровану транзакцію, щоб змінити відкритий ключ, пов’язаний із її особою. -- Аліса відправляє ще одне (зашифроване) повідомлення до смартконтракту, голосуючи за `option A`, з використанням нового відкритого ключа. -- Аліса показує Бобу транзакцію, яка демонструє, що вона проголосувала за `option B` (яка є нечинною, оскільки відкритий ключ більше не пов’язаний з ідентифікацією Аліси в системі). -- Під час обробки повідомлень координатор пропускає голос Аліси за `option B` та враховує лише голос за `option A`. Отже, спроба Боба вступити в змову з Алісою та маніпулювати голосуванням у ланцюзі не вдається. +ZK-STARK є абревіатурою від **Zero-Knowledge Scalable Transparent Argument of Knowledge (масштабоване прозоре підтвердження знання з нульовим розголошенням)**. ZK-STARK схожі на ZK-SNARK, за винятком того, що вони мають такі характеристики: -За використання MACI _необхідно_ довіряти координатору й вірити, що він не вступить у змову з хабарниками й не намагатиметься сам підкупити виборців. Координатор може розшифрувати повідомлення користувачів (необхідні для створення доказу), тому може точно перевірити, як голосувала кожна людина. +- **Масштабованість**. ZK-STARK є швидшим за ZK-SNARK у генеруванні та перевірці доказів, коли розмір свідка є більшим. З доказами STARK час доведення та перевірки за збільшення розміру свідка зростає тільки трохи (у протоколах SNARK час доведення та перевірки збільшується лінійно з розміром свідка). -Але коли координатор залишається чесним, MACI є потужним інструментом для гарантування недоторканості голосування в мережі. Це пояснює популярність його застосування для програм квадратичного фінансування (наприклад, [clr.fund](https://clr.fund/#/about/maci)), які значною мірою покладаються на чесне голосування кожної людини. +- **Прозорість**. Для доведення та перевірки в протоколах ZK-STARK використовується випадковість, яку можна публічно підтвердити, а не довірене налаштування. Тому вони більш прозорі в порівнянні із ZK-SNARK. -[Дізнайтеся більше про MACI](https://github.com/privacy-scaling-explorations/maci/blob/master/specs/01_introduction.md). +ZK-STARK генерує більші докази, ніж ZK-SNARK, що означає більші накладні витрати на перевірку. Однак існують випадки (наприклад, доведення великих наборів даних), коли ZK-STARK можуть бути більш ефективними з точки зору вартості порівняно із ZK-SNARK. ## Недоліки використання доказів із нульовим розголошенням {#drawbacks-of-using-zero-knowledge-proofs} ### Витрати на обладнання {#hardware-costs} -Генерування доказів із нульовим розголошенням передбачає дуже складні розрахунки, які найкраще виконуються на спеціалізованих машинах. Оскільки ці машини дорогі, вони часто недоступні для звичайних людей. Крім того, програми, які хочуть використовувати технологію нульового розголошення, повинні враховувати витрати на обладнання, що може збільшити вартість для кінцевих користувачів. +Генерування доказів із нульовим розголошенням передбачає дуже складні розрахунки, які найкраще виконуються на спеціалізованих машинах. Оскільки ці машини дорогі, вони часто недоступні для звичайних людей. Крім того, програми, які хочуть використовувати технологію нульового розголошення, мають враховувати витрати на обладнання, що може збільшити вартість для кінцевих користувачів. ### Витрати на перевірку доказів {#proof-verification-costs} -Перевірка доказів також вимагає складних обчислень і збільшує витрати на впровадження технології нульового розголошення в програмах. Ці витрати особливо актуальні в контексті доведення обчислень. Наприклад, зведення з нульовим розголошенням платять близько 500 000 газу, щоб перевірити один доказ ZK-SNARK на Ethereum, а ZK-STARK вимагають іще вищої плати. +Перевірка доказів також вимагає складних обчислень і збільшує витрати на впровадження технології нульового розголошення в програмах. Ці витрати особливо актуальні в контексті доведення обчислень. Наприклад, зведення з нульовим розголошенням платять приблизно 500 000 газу, щоб перевірити один доказ ZK-SNARK на Ethereum, а ZK-STARK вимагають іще вищої плати. ### Припущення про довіру {#trust-assumptions} У ZK-SNARK загальний довідковий рядок (публічні параметри) генерується один раз і доступний для повторного використання сторонам, які бажають брати участь у протоколі з нульовим розголошенням. Публічні параметри створюються через церемонію довіреного налаштування, учасники якої вважаються чесними. -Але насправді в користувачів немає ніякого способу оцінити чесність учасників, і користувачі повинні повірити розробникам на слово. ZK-STARK вільні від припущень про довіру, оскільки випадковість, що використовується для генерування рядка, публічно перевіряється. Тим часом дослідники працюють над недовіреними налаштуваннями для ZK-SNARK, щоб підвищити безпеку механізмів доведення. +Але насправді в користувачів немає жодного способу оцінити чесність учасників, і користувачі мають повірити розробникам на слово. ZK-STARK вільні від припущень про довіру, оскільки випадковість, що використовується для генерування рядка, публічно перевіряється. Тим часом дослідники працюють над недовіреними налаштуваннями для ZK-SNARK, щоб підвищити безпеку механізмів доведення. ### Загрози квантових обчислень {#quantum-computing-threats} -ZK-SNARK використовує криптографію на еліптичних кривих ([ECDSA](/glossary/#ecdsa)) для шифрування. Хоча алгоритм ECDSA зараз є безпечним, розвиток квантових комп’ютерів може зламати його модель безпеки в майбутньому. +ZK-SNARK використовує для шифрування криптографію еліптичних кривих. Хоча проблему дискретного логарифмування еліптичних кривих поки вважають нерозв’язною, розвиток квантових комп’ютерів може зруйнувати цю модель безпеки в майбутньому. -ZK-STARK вважається захищеним від загрози квантових обчислень, оскільки використовує для шифрування стійкі до колізій хеші. На відміну від публічних і приватних ключів, що використовуються в криптографії на еліптичних кривих, хешування, стійке до колізій, важче зламати алгоритмам квантових обчислень. +ZK-STARK вважають несприйнятливим до загрози квантових обчислень, оскільки він покладається лише на стійкі до зіткнень хеш-функції для своєї безпеки. На відміну від публічних і приватних ключів, які використовують в криптографії на еліптичних кривих, стійке до зіткнень хешування важче зламати алгоритмам квантових обчислень. ## Довідкові джерела {#further-reading} -- [Програміст пояснює одну концепцію на 5 рівнях складності | WIRED](https://www.youtube.com/watch?v=fOGdb1CTu5c) — _YouTube-канал Wired_ -- [Огляд прикладів використання доказів із нульовим розголошенням](https://appliedzkp.org/#Projects) — _команда Privacy and Scaling Explorations_ +- [Огляд прикладів використання доказів із нульовим розголошенням](https://pse.dev/projects) — _команда Privacy and Scaling Explorations_ - [Порівняння SNARK, STARK і рекурсивних SNARK](https://www.alchemy.com/overviews/snarks-vs-starks) — _Огляд Alchemy_ - [Доказ із нульовим розголошенням: покращення конфіденційності в блокчейні](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Дмітрій Лавренов_ - [zk-SNARK. Реалістичний приклад нульового розголошення і глибоке занурення в нього](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Адам Лучіано_ - [ZK-STARK — створення довіри, яку можна перевірити, навіть попри квантові компʼютери](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Адам Лучіано_ -- [Чому можливі ZK-SNARK? Загальний огляд](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Віталік Бутерін_ -- [Що таке доказ із нульовим розголошенням і яка його роль у блокчейні?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _Лівай Херц_ +- [Чому можливі zk-SNARKs? Загальний огляд](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Віталік Бутерін_ +- [Чому докази з нульовим розголошенням (ZKP) змінюють правила гри для суверенної ідентичності](https://frankiefab.hashnode.dev/why-zero-knowledge-proofs-zkps-is-a-game-changer-for-self-sovereign-identity) — _Френклін Охегбулам_ +- [Огляд EIP-7503: здійснення приватних переказів на Ethereum за допомогою доказів з нульовим розголошенням](https://research.2077.xyz/eip-7503-zero-knowledge-wormholes-for-private-ethereum-transactions#introduction) — _Еммануель Авосіка_ diff --git a/src/intl/uk/page-run-a-node.json b/src/intl/uk/page-run-a-node.json index 633155058f8..1437afecce5 100644 --- a/src/intl/uk/page-run-a-node.json +++ b/src/intl/uk/page-run-a-node.json @@ -111,6 +111,7 @@ "page-run-a-node-sovereignty-1": "Гаманець Ethereum дає змогу взяти на себе повну відповідальність за зберігання та контроль ваших цифрових активів, зберігаючи приватні ключі до ваших адрес. Але ці ключі не повідомляють вам поточний стан блокчейну, як-от баланс вашого гаманця.", "page-run-a-node-sovereignty-2": "За замовчуванням під час пошуку балансу гаманці Ethereum зазвичай звертаються до стороннього вузла, як-от Infura або Alchemy. Запуск власного вузла дає змогу мати власну копію блокчейну Ethereum.", "page-run-a-node-title": "Запуск вузла", + "page-run-a-node-meta-title": "Як запустити вузол Ethereum", "page-run-a-node-voice-your-choice-title": "Голосуйте", "page-run-a-node-voice-your-choice-preview": "Не втрачайте контроль у разі розгалуження.", "page-run-a-node-voice-your-choice-1": "У разі розгалуження ланцюга, коли виникають два ланцюги з двома різними наборами правил, запуск власного вузла гарантує вам можливість вибирати, який набір правил підтримувати. Вам вирішувати, переходити на нові правила та підтримати запропоновані зміни чи ні.", diff --git a/src/intl/uk/page-staking-deposit-contract.json b/src/intl/uk/page-staking-deposit-contract.json index c2953fe6e80..a6fe1c7cffe 100644 --- a/src/intl/uk/page-staking-deposit-contract.json +++ b/src/intl/uk/page-staking-deposit-contract.json @@ -8,7 +8,7 @@ "page-staking-deposit-contract-confirm-address": "Підтвердьте наведене нижче, щоб відобразити адресу.", "page-staking-deposit-contract-copied": "Скопійована адреса", "page-staking-deposit-contract-copy": "Копіювати адресу", - "page-staking-deposit-contract-blockexplorer": "Переглянути контракт на Etherscan", + "page-staking-deposit-contract-etherscan": "Переглянути контракт на Etherscan", "page-staking-deposit-contract-h2": "Тут не можна зробити ставку", "page-staking-deposit-contract-launchpad": "Стейкінг за допомогою стартової платформи", "page-staking-deposit-contract-launchpad-2": "Використати стартову платформу", From 48bec43c95e80c16ef12b48510f24789e615fe9e Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:46:13 +0000 Subject: [PATCH 242/368] chore: import translations for zh-tw --- .../contributing/adding-layer-2s/index.md | 2 +- .../contributing/content-resources/index.md | 2 +- src/intl/zh-tw/common.json | 25 +++++++++++++++---- src/intl/zh-tw/page-index.json | 11 ++++---- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/public/content/translations/zh-tw/contributing/adding-layer-2s/index.md b/public/content/translations/zh-tw/contributing/adding-layer-2s/index.md index 3e476220719..9a6c4a5bd46 100644 --- a/public/content/translations/zh-tw/contributing/adding-layer-2s/index.md +++ b/public/content/translations/zh-tw/contributing/adding-layer-2s/index.md @@ -92,6 +92,6 @@ _我們認為,其他不使用以太坊來實現資料可用性或安全性的 如果你想在 ethereum.org 上新增二層網路層,請在 GitHub 上建立議題。 - + 建立一個議題 diff --git a/public/content/translations/zh-tw/contributing/content-resources/index.md b/public/content/translations/zh-tw/contributing/content-resources/index.md index 0b1107dfa00..51cc723e439 100644 --- a/public/content/translations/zh-tw/contributing/content-resources/index.md +++ b/public/content/translations/zh-tw/contributing/content-resources/index.md @@ -27,6 +27,6 @@ description: 我們在 ethereum.org 上列出內容資源的標準 如果你想將內容資源新增至 ethereum.org 並且它符合標準,請在 GitHub 上建立一個議題。 - + 創建一個議題 diff --git a/src/intl/zh-tw/common.json b/src/intl/zh-tw/common.json index cb037e63563..a033ce9f6c1 100644 --- a/src/intl/zh-tw/common.json +++ b/src/intl/zh-tw/common.json @@ -11,6 +11,7 @@ "adding-products": "新增產品", "adding-staking-products": "新增質押產品", "adding-wallets": "新增錢包", + "ai-agents": "AI 代理", "aria-toggle-menu-button": "切換選單按鈕", "aria-toggle-search-button": "切換搜尋按鈕", "beacon-chain": "信標鏈", @@ -29,8 +30,11 @@ "content-resources": "內容資源", "content-standardization": "內容統一化", "contributing": "參與貢獻", + "contributor-quiz-banner-title": "不確定從哪裡開始?", + "contributor-quiz-banner-description": "做個簡單的測驗來看看您可以如何為 ethereum.org 做貢獻。", + "contributor-quiz-banner-button": "進行測驗", "contributors": "貢獻者", - "contributors-thanks": "致本頁面的全體貢獻者——謝謝你們!", + "contributors-thanks": "致本頁面的全體貢獻者——謝謝你們!", "cookie-policy": "Cookie 政策", "copied": "已複製", "copy": "複製", @@ -76,6 +80,9 @@ "enterprise": "企業", "enterprise-mainnet": "企業級 - 以太坊主網", "enterprise-menu": "企業版選單", + "error-page-title": "糟糕!發生錯誤", + "error-page-description": "您可以透過我們的 GitHub 儲存庫回報此問題,協助我們改進。", + "error-page-home-link": "返回首頁", "esp": "生態系統支援計畫", "eth-current-price": "以太幣 (ETH) 現值 (美金)", "ethereum": "Ethereum", @@ -198,7 +205,7 @@ "language-zh-tw": "繁體中文", "languages": "語言", "last-24-hrs": "最近 24 小時", - "last-edit": "最後編輯", + "page-last-update": "頁面最後更新時間:", "last-updated": "最後更新", "layer-2": "第二層", "learn": "學習", @@ -220,6 +227,7 @@ "nav-about-description": "適用以太坊社群的公性開放原始碼專案", "nav-advanced-description": "深入瞭解更複雜的主題", "nav-advanced-label": "進階", + "nav-ai-agents-description": "探索以太坊上的 AI 代理世界", "nav-basics-description": "瞭解以太坊的基本知識", "nav-basics-label": "基本資料", "nav-bridges-description": "Web3 已經演變成 L1 區塊鏈和 L2 擴容解決方案的生態系統", @@ -293,6 +301,7 @@ "nav-overview-label": "概觀", "nav-participate-overview-description": "參與方式概覽", "nav-payments-description": "以太坊支付正在改變我們發送和接收資金的方式", + "nav-prediction-markets-description": "預期市場是一種對未來下注的方式", "nav-primary": "主要導覽", "nav-quizzes-description": "瞭解你對以太坊和加密貨幣的理解有多少", "nav-quizzes-label": "測試你的知識", @@ -317,6 +326,7 @@ "nav-roadmap-user-experience": "更好的使用者體驗", "nav-roadmap-ux-description": "以太坊的使用必須簡化", "nav-roadmap-ux-label": "更好的使用者體驗", + "nav-rwa-description": "將有價值的商品轉換為數位代幣的方法。", "nav-run-a-node-description": "掌握完全主權,同時協助網路安全", "nav-security-description": "瞭解使用加密貨幣的最佳案例", "nav-smart-contracts-description": "以太坊生態系統的基礎建立區塊", @@ -332,8 +342,8 @@ "nav-staking-solo-description": "執行家用硬體,親自貢獻於以太坊網路的安全和去中心化", "nav-staking-solo-label": "單獨質押", "nav-start-building-description": "新手的實用資訊", - "nav-start-with-crypto-title": "從這裡開始", - "nav-start-with-crypto-description": "使用以太坊的第一步", + "nav-start-with-crypto-title": "由此開始", + "nav-start-with-crypto-description": "您使用以太坊的第一步", "nav-translation-program-description": "將 ethereum.org 網站翻譯成所有語言的協同合作", "nav-tutorials-description": "社群使用教學的精選清單", "nav-use-cases-description": "發現使用以太坊的不同想法", @@ -364,17 +374,20 @@ "page-languages-want-more-paragraph": "ethereum.org 的譯者不斷地翻譯盡可能多種的語言頁面。想要查看他們目前的工作計畫或註冊成為他們的一員,請閱讀我們的", "page-languages-words": "字數", "page-last-updated": "頁面上次更新", + "page-not-found": "找不到頁面", + "page-not-found-description": "無法找到所請求的頁面。", "participate": "參與方式", "participate-menu": "參與選單", "payments-page": "付款", "pbs": "提交者-建置者分離", "pools": "聯合質押", + "prediction-markets": "預測市場", "privacy-policy": "隱私條款", "private-ethereum": "私人以太坊", "product-disclaimer": "列舉產品和服務是為了方便以太坊社群。在網站上列舉某種產品或服務並不代表ethereum.org 網站團隊或以太坊基金會對其的認可。", "quizzes": "測驗", "quizzes-title": "測驗中心", - "refresh": "請重新整理此頁面。", + "refresh": "重新整理頁面", "regenerative-finance": "ReFi - 再生金融", "research": "研究", "research-menu": "研究選單", @@ -385,6 +398,7 @@ "rollup-component-technology-and-risk-summary": "技術和風險概要", "rollup-component-website": "網站", "run-a-node": "執行節點", + "real-world-assets": "RWA——現實世界資產", "saas": "質押即服務", "scaling": "擴容", "search": "搜尋", @@ -423,6 +437,7 @@ "translation-banner-title-new": "協助翻譯本頁面", "translation-banner-title-update": "協助更新本頁面", "translation-program": "翻譯計劃", + "translator": "譯者", "try-using-search": "請嘗試使用搜尋功能來尋找你要的資訊,或", "tutorials": "教學", "up": "上移", diff --git a/src/intl/zh-tw/page-index.json b/src/intl/zh-tw/page-index.json index c767d3d0b91..d3b9e518c02 100644 --- a/src/intl/zh-tw/page-index.json +++ b/src/intl/zh-tw/page-index.json @@ -2,7 +2,7 @@ "page-index-activity-description": "來自所有以太坊網路的活動", "page-index-activity-tag": "活動", "page-index-activity-header": "最強大的生態系統", - "page-index-activity-action": "更多以太坊的活動", + "page-index-activity-action": "更多以太坊活動", "page-index-bento-header": "使用網路的新方法", "page-index-bento-assets-action": "更多非同質化代幣相關資訊", "page-index-bento-assets-content": "藝術品、認證或甚至是房地產都可以被代幣化,不管什麼東西都能變成可交易的代幣,並且所有權公開且可驗證。", @@ -39,8 +39,8 @@ "page-index-cta-get-eth-label": "取得以太幣", "page-index-cta-wallet-description": "創建帳戶,管理資產", "page-index-cta-wallet-label": "選一個錢包", - "page-index-cta-build-apps-description": "建立你的第一個應用程式", - "page-index-cta-build-apps-label": "開始開發", + "page-index-cta-build-apps-description": "建立您的第一個應用程式", + "page-index-cta-build-apps-label": "開始建置", "page-index-description": "區塊鏈網路與創新應用程式的頂尖平台", "page-index-developers-code-example-description-0": "建置由自已寫出來的邏輯所支援的銀行", "page-index-developers-code-example-description-1": "製作可跨應用程式轉移和使用的代幣", @@ -83,7 +83,6 @@ "page-index-posts-header": "最新發表", "page-index-posts-subtitle": "來自社群的最新部落格文章與更新", "page-index-title": "歡迎來到以太坊", - "page-index-use-cases-tag": "使用案例", "page-index-values-description": "成為數位革命的一員", "page-index-values-header": "網際網路瞬息萬變", "page-index-values-legacy": "舊版", @@ -101,7 +100,7 @@ "page-index-values-privacy-legacy-content-0": "不管是政府、企業,還是其他不知名的大型組織,都不會因為良心發現而尊重我們的隱私。", "page-index-values-privacy-legacy-content-1": "大部分的應用程式都會為了量身訂製型廣告,盡可能地蒐集個人資訊。", "page-index-values-privacy-ethereum-label": "隱私導向", - "page-index-values-privacy-ethereum-content-0": "以太坊社群尊重所有人的隱私權,不需要透漏個人身分或是聯絡資訊就可以使用我們的應用程式。", + "page-index-values-privacy-ethereum-content-0": "以太坊社群尊重個人隱私。您有權在不透露您的個人身分或聯絡資訊的情況下使用應用程式。", "page-index-values-integration-legacy-label": "分散性", "page-index-values-integration-legacy-content-0": "很多應用程式都會要求您創建個別帳戶,得需要繁瑣的註冊程序以及記得很多的登入密碼。", "page-index-values-integration-ethereum-label": "整合性", @@ -113,7 +112,7 @@ "page-index-values-censorship-legacy-label": "可審查性", "page-index-values-censorship-legacy-content-0": "現代網路平台上的規範時常改變,可能因股東、管理階層或甚至是獨裁政府的關係而產生變化。", "page-index-values-censorship-ethereum-label": "抗審查性", - "page-index-values-censorship-ethereum-content-0": "抗審查性是以太坊的中心原則之一,以太坊的功能會堅持著公平與客觀的原則。", + "page-index-values-censorship-ethereum-content-0": "反抗壓迫是以太坊的一項關鍵原則,其功能應始終保持公平和公正。", "page-index-values-censorship-ethereum-content-1": "以太坊不受到任何國家、公司或是個人的控制。", "page-index-values-open-legacy-label": "不對大部分人公開", "page-index-values-open-legacy-content-0": "一般的公司都會保護自己的智慧財產不向他人分享,公司外的人看不到運作方式,也不清楚怎樣才能處理問題或是進行改善,要創建或是客製化工具相當困難。", From f5a7ea1d794bdd9c662f86fb274f54a9d964745a Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 1 Jul 2025 04:46:17 +0000 Subject: [PATCH 243/368] chore: import translations for zh --- .../zh/contributing/adding-layer-2s/index.md | 2 +- .../contributing/content-resources/index.md | 2 +- .../content/translations/zh/guides/index.md | 2 +- .../zh/real-world-assets/index.md | 95 +++++++++++++++++++ .../content/translations/zh/roadmap/index.md | 1 + src/intl/zh/common.json | 19 +++- src/intl/zh/page-index.json | 3 +- src/intl/zh/page-layer-2-networks.json | 85 +++++++++++++++++ src/intl/zh/page-stablecoins.json | 1 - src/intl/zh/page-staking.json | 2 +- src/intl/zh/page-what-is-ethereum.json | 2 +- src/intl/zh/template-usecase.json | 3 +- 12 files changed, 205 insertions(+), 12 deletions(-) create mode 100644 public/content/translations/zh/real-world-assets/index.md create mode 100644 src/intl/zh/page-layer-2-networks.json diff --git a/public/content/translations/zh/contributing/adding-layer-2s/index.md b/public/content/translations/zh/contributing/adding-layer-2s/index.md index 2aec168e548..d57ce9f51d1 100644 --- a/public/content/translations/zh/contributing/adding-layer-2s/index.md +++ b/public/content/translations/zh/contributing/adding-layer-2s/index.md @@ -92,6 +92,6 @@ _我们认为,其他不使用以太坊来实现数据可用性或安全性的 如果你想将二层网络添加到 ethereum.org,请在 GitHub 上创建一个提议。 - + 创建一个提议 diff --git a/public/content/translations/zh/contributing/content-resources/index.md b/public/content/translations/zh/contributing/content-resources/index.md index 049361ca6ba..c9f33cd0bab 100644 --- a/public/content/translations/zh/contributing/content-resources/index.md +++ b/public/content/translations/zh/contributing/content-resources/index.md @@ -27,6 +27,6 @@ description: 在 ethereum.org 上上架内容资源的标准 如果你想要将内容资源添加到 ethereum.org,并且该内容资源符合标准,请在 GitHub 上创建一个提议。 - + 创建一个提议 diff --git a/public/content/translations/zh/guides/index.md b/public/content/translations/zh/guides/index.md index 3dc0e640360..eafd630774f 100644 --- a/public/content/translations/zh/guides/index.md +++ b/public/content/translations/zh/guides/index.md @@ -18,7 +18,7 @@ lang: zh 1. [如何撤销智能合约对你的加密货币资金的权限](/guides/how-to-revoke-token-access/) - 如果你突然在你的钱包中看到一笔交易,但并非由你启动,本指南将教你如何防止这种情况再次发生。 -2. [如何识别诈骗代币](/guides/how-to-id-scam-tokens/) - 什么是诈骗代币?诈骗代币如何看起来像合法代币?如何识别诈骗代币,保护自己避免陷入诈骗代币的骗局。 +2. [如何识别诈骗代币](/guides/how-to-id-scam-tokens/) - 什么是诈骗代币? 它们如何使自己看起来合法,你又能如何识别它们以保护自己避免被骗? ## 使用以太坊 diff --git a/public/content/translations/zh/real-world-assets/index.md b/public/content/translations/zh/real-world-assets/index.md new file mode 100644 index 00000000000..e9b51aa8d2a --- /dev/null +++ b/public/content/translations/zh/real-world-assets/index.md @@ -0,0 +1,95 @@ +--- +title: 现实世界资产(RWA) +metaTitle: 什么是 RWA? |现实世界资产的优势和用途 +description: 以太坊上的现实世界资产概述 +lang: zh +template: use-cases +emoji: ":house_buildings:" +image: /images/man-and-dog-playing.png +alt: 男人和狗在玩耍。 +sidebarDepth: 2 +summaryPoint1: 将有价值的商品转化为数字代币的方法。 +summaryPoint2: 你现在可以拥有现实物品或资产的一部分,而不必购买整个资产或物品。 +summaryPoint3: 连接传统金融和区块链生态系统。 +--- + +现实世界资产 (RWA) 是代表现有财富形式的代币,例如房地产、黄金、股票、艺术品、机械或收藏品。 将这些物品代币化并转换为数字形式,从而允许它们在多个所有者之间被分配,并使其更易于交易。 + +## 什么是 RWA? {#what-are-rwas} + +某些 RWA 是有形的——你可以看到和触摸的物品,例如金条或商业建筑。 还有一些 RWA 是无形的,例如政府债务、知识产权或公司股权。 + +当这些资产被代币化后,它们就转换成了价值单位。 代币化黄金就是一个很好的例子。 公司 [Paxos](https://www.paxos.com/) 将 400 盎司的金条代币化为以太坊区块链上的 400 个代币,每个代币由一盎司黄金支撑。 代币持有者可以随时将代币兑换成黄金。 从另一家 RWA 公司 [Tether Gold](https://gold.tether.to/) 购买的代币也是相似的例子。 + +每个代币可以被分割成更小的份额。 例如,Tether Gold 代币可以分割成最小至 0.000001 的单位。 + +RWA 代币没有任何内在价值。 它们反映的是所代表的物品的价值,因此代币的价值会随着物品的价值而变化。 + +## RWA 有哪些优势? {#rwas-benifits} + + + + + + + + + + +## RWA 如何运作? {#how-rwas-work} + +让我们看一下 RWA 生态系统中的几个例子:房地产、传统金融产品和艺术品。 + +### 投资房地产 {#investing-in-real-estate} + +假设你想投资房地产,但购买整套房产却是遥不可及的。 那么,你可以通过诸如 [RealT](https://realt.co/) 之类的项目购买 RWA。 该项目的代币代表了持有房产契约而创建的有限责任公司(LLC)的股份。 代币持有者根据其持有的份额比例,以稳定币的形式获得租金收入;RealT 表示,迄今为止已向投资者返还了 1500 万美元的净租金收入。 + +另一个类似的项目 [LABS Group](https://x.com/labsgroupio) 允许用户以低至 100 美元的金额购买代币化房地产。 + +### 投资金融产品 {#investing-in-financial-products} + +多个项目正在将证券、股票、债券和其他金融工具引入区块链,实现传统金融与去中心化金融(DeFi)之间的桥接。 + +例如,基于以太坊的公司 [Securitize](https://securitize.io/) 专注于传统金融产品的代币化。 2024 年,它与 BlackRock 合作推出了 RWA 基金。 BlackRock 表示,计划最终将其 10 万亿美元的资产代币化:其首席执行官拉里·芬克 (Larry Fink) 称代币化是“市场的下一个时代”。 + +### 投资艺术品 {#investing-in-fine-art} + +投资艺术品有几种机制。 [Masterworks](https://www.masterworks.com/) 购买艺术品,将每件艺术品证券化,并以代币的形式出售股份。 该公司计划随后出售艺术品并将利润分配给代币持有者。 + +想要从艺术收藏中获利的艺术品拥有者可以在平台 [Maecenas](https://www.maecenas.co/) 上出售最多 49% 的艺术品价值,前提是该艺术品的价值超过 100 万美元。 + +在这两种情况下,代币持有者不控制艺术品的保存或未来出售。 然而,他们负责决定持有代币的时间长度,代币价值会随着艺术品的价值而涨跌。 + +同时,基于区块链的数字艺术品注册平台 [Artory](https://www.artory.com/) 可以验证艺术品的真实性并记录曾经的所有权。 + +### 投资收藏品 {#investing-in-collectibles} + +到目前为止,这些例子大多展示了代币化如何实现对各种类型财富的部分所有权。 代币化的另一个好处是让有价值的物品(如收藏品)可以在全球市场中进行交易。 + +例如 [Courtyard](https://courtyard.io/) 将交易卡进行代币化——例如棒球卡、足球卡或宝可梦卡。 持卡人将他们的卡片寄送到美国的安全存储设施。 这些卡片被铸造为数字代币,并添加到所有者的钱包中,以便在 Courtyard 的市场上进行交易。 Courtyard 仅接受评级卡片:即通过第三方认证卡片的真实性并根据卡片的状况(破旧或完好)进行评分的卡片。 + +Courtyard 还提供一种版税机制。 每次售出卡片时,代币化该卡片的人就会获得百分之一的收入。 只有原始卡片代币化者才能通过这种方式获得奖励。 无论身在何处,卡片所有者都可以随时将数字卡兑换成实体卡。 + +## RWA 有哪些局限性? {#rwas-limitations} + +在目前的早期阶段,RWA 面临的挑战之一是如何确保现实物品与其数字表现之间的联系。 + +一种可行方案是 RWA 项目向投资者提供证明,保证他们是数字代币所代表的实物的合法所有者。 比如前面提及的 Paxos、Tether Gold 和 Courtyard 都将资产保存在安全仓库中,并允许所有者随时将代币兑换为实物。 + +另一个限制是,代币所有权是否被世界各地法律体系认可。 换句话说,智能合约是否可以在法庭上被强制执行,或者 RWA 代币持有者是否可以声称他们拥有现实世界中的物品? + +在建立专门用于认可代币化的法律框架方面,部分国家/地区处于领先地位,包括新加坡、阿拉伯联合酋长国、香港和瑞士,瑞士于 2021 年出台了被称为“区块链法案”的立法,以规范代币化等技术。 欧盟已经开始对 RWA 进行监管,而在美国,证券交易委员会预计将在某个时间发布有关 RWA 的指南。 + +## 了解更多 {#learn-more} + +深入了解[智能合约](/smart-contracts/)或探索另一类代币 - [非同质化代币 (NFT)](/nft/) 的更多信息。 + +## 扩展阅读{#further-reading} + +- [什么是资产代币化?](https://www.britannica.com/money/real-world-asset-tokenization) — 大英百科全书 +- [代币化如何改变全球金融和投资](https://www.weforum.org/stories/2024/12/tokenization-blockchain-assets-finance/)——世界经济论坛 +- [加密货币投资者需要了解的现实世界资产代币化知识](https://www.forbes.com/sites/irinaheaver/2024/03/14/what-crypto-investors-need-to-know-about-tokenizing-real-world-assets/)——福布斯 +- [智能合约如何与区块链协同运作](https://www.britannica.com/money/how-smart-contracts-work)——大英百科全书 +- [现实世界资产代币化如何改变去中心化金融?](https://medium.com/coinmonks/how-tokenized-real-world-assets-are-transforming-defi-4e040f28732a)——Medium +- [什么是加密货币的 RWA? 阐述其在区块链中的作用](https://www.bitdegree.org/crypto/tutorials/what-is-rwa-in-crypto)——BitDegree +- [按市值排名的当今热门现实世界资产(RWA)代币](https://www.forbes.com/digital-assets/categories/real-world-assets-rwa/)——福布斯 \ No newline at end of file diff --git a/public/content/translations/zh/roadmap/index.md b/public/content/translations/zh/roadmap/index.md index ef2ea84d698..c6e159e99de 100644 --- a/public/content/translations/zh/roadmap/index.md +++ b/public/content/translations/zh/roadmap/index.md @@ -109,6 +109,7 @@ buttons: ## 正在寻求特定技术升级? {#looking-for-specific-technical-upgrades} +- [Pectra](/roadmap/pectra) - Prague/Electra 硬分叉带来帐户抽象的新途径,提升可扩展性以及更多功能。 - [Danksharding](/roadmap/danksharding) - Danksharding 通过向以太坊区块添加二进制大对象数据,为用户大大降低二层网络卷叠成本。 - [质押提款](/staking/withdrawals) - 上海/卡佩拉升级启用了以太坊质押提款,允许用户解锁质押的以太币。 - [单时隙最终确定性](/roadmap/single-slot-finality) - 让区块可以在同一时隙内提出和最终确定,无需等待 15 分钟。 这提高了应用程序的便利性,大大增加了攻击难度。 diff --git a/src/intl/zh/common.json b/src/intl/zh/common.json index 4a2695e3aef..ea9ba447caa 100644 --- a/src/intl/zh/common.json +++ b/src/intl/zh/common.json @@ -30,8 +30,11 @@ "content-resources": "内容资源", "content-standardization": "内容标准化", "contributing": "参与贡献", + "contributor-quiz-banner-title": "不确定从哪里开始?", + "contributor-quiz-banner-description": "参加一个简短测验,了解你可以如何在 ethereum.org 上做出贡献。", + "contributor-quiz-banner-button": "进行测验", "contributors": "贡献者", - "contributors-thanks": "感谢对本页做出贡献的每一个人!", + "contributors-thanks": "所有为本页面做出贡献的共建者 – 感谢你!", "cookie-policy": "Cookie 政策", "copied": "已复制", "copy": "复制", @@ -77,6 +80,9 @@ "enterprise": "企业级应用", "enterprise-mainnet": "企业级 - 以太坊主网", "enterprise-menu": "企业菜单", + "error-page-title": "哎呀!发生错误", + "error-page-description": "你可以在我们的 GitHub 存储库中报告该问题来帮助我们改进。", + "error-page-home-link": "返回主页", "esp": "生态系统支持方案", "eth-current-price": "当前 ETH 价格(美元)", "ethereum": "以太坊", @@ -199,7 +205,7 @@ "language-zh-tw": "中文(繁体)", "languages": "语言", "last-24-hrs": "最近24小时", - "last-edit": "上次修改时间", + "page-last-update": "页面最后更新:", "last-updated": "最近更新", "layer-2": "二层网络", "learn": "学习", @@ -295,6 +301,7 @@ "nav-overview-label": "概述", "nav-participate-overview-description": "参与方法概述", "nav-payments-description": "以太坊支付正在改变我们收付资金的方式", + "nav-prediction-markets-description": "预测市场是一种押注未来的方式", "nav-primary": "主导航", "nav-quizzes-description": "了解你对以太坊和加密货币的了解程度", "nav-quizzes-label": "检验掌握的知识", @@ -319,6 +326,7 @@ "nav-roadmap-user-experience": "改善用户体验", "nav-roadmap-ux-description": "以太坊的用法需要简化", "nav-roadmap-ux-label": "改善用户体验", + "nav-rwa-description": "将有价值的商品转化为数字代币的方法。", "nav-run-a-node-description": "实现完全自主权,同时帮助保护网络安全", "nav-security-description": "了解加密货币使用方面的最佳做法", "nav-smart-contracts-description": "以太坊生态系统之基石", @@ -366,17 +374,20 @@ "page-languages-want-more-paragraph": "ethereum.org的翻译者总是以尽可能多的语言进行翻译。 要看看他们正在做什么或注册加入他们,请阅读我们的", "page-languages-words": "字数", "page-last-updated": "页面最后更新", + "page-not-found": "找不到页面", + "page-not-found-description": "找不到所请求的页面。", "participate": "参与", "participate-menu": "“参与”菜单", "payments-page": "支付", "pbs": "提议者-构建者分离", "pools": "联合质押", + "prediction-markets": "预测市场", "privacy-policy": "隐私政策", "private-ethereum": "私密以太坊", "product-disclaimer": "列举产品和服务是为了方便以太坊社区。但列举任何产品或服务并不表示 ethereum.org 网站团队或以太坊基金会认可它们。", "quizzes": "测试", "quizzes-title": "测试中心", - "refresh": "请刷新页面。", + "refresh": "更新页面", "regenerative-finance": "ReFi - 再生性金融", "research": "研究", "research-menu": "“研究”菜单", @@ -387,6 +398,7 @@ "rollup-component-technology-and-risk-summary": "技术和风险概述", "rollup-component-website": "网站", "run-a-node": "运行节点", + "real-world-assets": "RWA - 现实世界资产", "saas": "质押即服务", "scaling": "扩容", "search": "搜索​​​​", @@ -425,6 +437,7 @@ "translation-banner-title-new": "帮助翻译此页面", "translation-banner-title-update": "帮助更新此页面", "translation-program": "翻译计划", + "translator": "翻译人员", "try-using-search": "请尝试使用搜索来查找相关内容,或者", "tutorials": "教程", "up": "向上", diff --git a/src/intl/zh/page-index.json b/src/intl/zh/page-index.json index 15ee202ece3..a68320c2627 100644 --- a/src/intl/zh/page-index.json +++ b/src/intl/zh/page-index.json @@ -39,7 +39,7 @@ "page-index-cta-get-eth-label": "获取以太币", "page-index-cta-wallet-description": "创建帐户和管理资产", "page-index-cta-wallet-label": "选择一个钱包", - "page-index-cta-build-apps-description": "创建你的第一个应用", + "page-index-cta-build-apps-description": "创建你的第一个应用程序", "page-index-cta-build-apps-label": "开始构建", "page-index-description": "创新应用程序和区块链网络的首要平台", "page-index-developers-code-example-description-0": "用你编写的逻辑构建银行", @@ -83,7 +83,6 @@ "page-index-posts-header": "近期博文", "page-index-posts-subtitle": "社区的最新博文和最近更新", "page-index-title": "欢迎来到以太坊", - "page-index-use-cases-tag": "用例", "page-index-values-description": "参与数字革命", "page-index-values-header": "互联网正经历变革", "page-index-values-legacy": "传统模式", diff --git a/src/intl/zh/page-layer-2-networks.json b/src/intl/zh/page-layer-2-networks.json new file mode 100644 index 00000000000..aba040567b9 --- /dev/null +++ b/src/intl/zh/page-layer-2-networks.json @@ -0,0 +1,85 @@ +{ + "page-layer-2-networks-hero-description": "如今使用以太坊意味着和数百个不同的网络和应用程序交互。这一切都是已以太坊为基础架构。", + "page-layer-2-networks-meta-title": "以太坊第二层:探索其网络", + "page-layer-2-networks-more-advanced-title": "想了解更进阶的概览内容?", + "page-layer-2-networks-more-advanced-descripton-1": "许多项目", + "page-layer-2-networks-more-advanced-descripton-2": "仍处于起步阶段,有一定实验性。", + "page-layer-2-networks-more-advanced-descripton-3": "关于这些网络的技术、风险和信任假设的更多信息,我们建议查阅 L2BEAT,其中为每个项目提供了全面的风险评估框架,并为一般数据分析提供 growthepie。", + "page-layer-2-networks-more-advanced-link-1": "访问 l2beat.com", + "page-layer-2-networks-more-advanced-link-2": "访问 growthepie.xyz", + "page-layer-2-networks-callout-1-title": "有哪些好处?", + "page-layer-2-networks-callout-1-description": "以太坊的强大和安全性为其他网络提供了坚实的构建平台。", + "page-layer-2-networks-callout-2-title": "想了解更多细节?", + "page-layer-2-networks-callout-2-description": "对这种扩容方法的技术和原因感兴趣?了解有关思维方式和不同技术方法的更多信息。", + "page-layer-2-networks-n/a-label": "未提供", + "page-layer-2-networks-n/a-description": "不适用于以太坊主网。", + "page-layer-2-networks-robust-label": "鲁棒性", + "page-layer-2-networks-robust-description": "完全去中心化和安全的网络,任何个人或团体(包括其创建者)都无法篡改或停止。\n\n这是一个实现以太坊去中心化愿景的网络。", + "page-layer-2-networks-maturing-label": "成熟化", + "page-layer-2-networks-maturing-description": "一个正在过渡到去中心化模式的网络。在极端情况下,一组参与者仍然可以停止网络。", + "page-layer-2-networks-developing-label": "发展", + "page-layer-2-networks-developing-description": "由中心化运营商运营网络,但添加了故障安全功能以降低中心化风险。", + "page-layer-2-networks-emerging-label": "新兴", + "page-layer-2-networks-emerging-description": "由中心化运营商运营网络。数据在以太坊上公开可见,以验证运营商是否诚实。", + "page-layer-2-networks-network-maturity": "网络成熟度", + "page-layer-2-networks-network-maturity-with-colon": "网络成熟度:", + "page-layer-2-networks-network-maturity-description": "关注开发阶段、网络使用相关风险以及网络的生态系统规模。", + "page-layer-2-networks-summary-metric": "这是基于风险分析的总结指标", + "page-layer-2-networks-no-results-title": "没有结果", + "page-layer-2-networks-no-results-description": "没有符合您条件的网络,请尝试添加一些筛选条件", + "page-layer-2-networks-reset-filters": "重置筛选器", + "page-layer-2-networks-age": "时期", + "page-layer-2-networks-show-how-long": "显示网络已经运行多长时间。", + "page-layer-2-networks-data-from": "数据来源", + "page-layer-2-networks-period": ".", + "page-layer-2-networks-wallet-support": "钱包支持", + "page-layer-2-networks-how-many-wallet-support": "表示有多少个钱包应用程序支持使用该网络。", + "page-layer-2-networks-active-address": "活跃地址", + "page-layer-2-networks-active-address-weekly": "活跃地址(每周)", + "page-layer-2-networks-active-address-number": "过去 7 天内网络上的活跃地址数量。", + "page-layer-2-networks-fee-token": "代币", + "page-layer-2-networks-token-used-to-pay": "用于支付交易和使用网络的代币。", + "page-layer-2-networks-network-usage": "网络使用情况", + "page-layer-2-networks-network-usage-overview": "网络使用情况概述,用于衡量过去 30 天内各个领域的交易数量。", + "page-layer-2-networks-no-data-available": "暂无数据", + "page-layer-2-networks-links": "链接", + "page-layer-2-networks-official-website": "官方网站", + "page-layer-2-networks-risk-analysis": "风险分析", + "page-layer-2-networks-assessment-by-l2beat": "L2BEAT 评估", + "page-layer-2-networks-detailed-analytics": "详细分析", + "page-layer-2-networks-assessment-by-growthepie": "Growthepie 的评估", + "page-layer-2-networks-bridge-to": "桥接至", + "page-layer-2-networks-view-apps": "查看应用程序", + "page-layer-2-networks-select-wallet": "选择钱包", + "page-layer-2-networks-search-wallets": "搜索钱包……", + "page-layer-2-networks-no-wallet-found": "没有找到钱包", + "page-layer-2-networks-robust-description-1": "完全去中心化且安全的网络,任何个人或团体(包括其创建者)都无法篡改或停止。", + "page-layer-2-networks-robust-description-2": "这是一个实现以太坊去中心化愿景的网络。", + "page-layer-2-networks-developing-description-1": "单一运营商运行网络,且数据公开可见以确保透明度。", + "page-layer-2-networks-emerging-description-1": "单一运营商在私有环境运行网络并致力于实现透明度。", + "page-layer-2-networks-networks-showing": "网络展示", + "page-layer-2-networks-market-share": "市场份额", + "page-layer-2-networks-market-share-description": "以太坊托管合约中的总锁定价值。", + "page-layer-2-networks-avg-transaction-fee": "平均交易费", + "page-layer-2-networks-transaction-fee": "交易费", + "page-layer-2-networks-transaction-fee-description": "转账、交换、铸造等活动的平均交易成本。", + "page-layer-2-networks-transaction-see-networks": "查看网络", + "page-layer-2-network-maturity-component-1": "我们回顾了网络在以下方面的进展", + "page-layer-2-network-maturity-component-2": "以太坊一致性", + "page-layer-2-network-maturity-component-3": "总锁定价值(TVL)", + "page-layer-2-network-maturity-component-4": "在生产环境中的运行时间", + "page-layer-2-network-maturity-component-5": "以及风险考量", + "page-layer-2-network-maturity-component-6": "这些层面能帮助跟踪网络发展,并为社区提供评估进展的标准化方法。", + "page-layer-2-network-maturity-component-7": "单靠技术进步是不够的,用户采用和运行时间是任何网络整体实力和成熟度的重要组成部分。", + "page-layer-2-network-maturity-component-8": "成熟度", + "page-layer-2-network-maturity-component-9": "要求", + "page-layer-2-network-maturity-component-10": "• 阶段 2", + "page-layer-2-network-maturity-component-11": "• 最少 10 亿美元总锁定价值 (TVL)", + "page-layer-2-network-maturity-component-12": "• 阶段 1", + "page-layer-2-network-maturity-component-13": "• 最少 1.5 亿美元总锁定价值 (TVL)", + "page-layer-2-network-maturity-component-14": "• 在生产环境中运行 6 个月以上", + "page-layer-2-network-maturity-component-15": "• 阶段 0", + "page-layer-2-network-maturity-component-16": "• 风险评估:3/5 (L2beat)", + "page-layer-2-network-maturity-component-17": "• 风险评估:2/5 (L2beat)", + "page-layer-2-network-maturity-component-18": "• 最少 1.5 亿美元总锁定价值 (TVL) 或在生产环境中运行 6 个月以上" +} diff --git a/src/intl/zh/page-stablecoins.json b/src/intl/zh/page-stablecoins.json index 35ce038909d..7a277038b03 100644 --- a/src/intl/zh/page-stablecoins.json +++ b/src/intl/zh/page-stablecoins.json @@ -160,7 +160,6 @@ "example-projects": "示例项目", "gemini-logo": "Gemini 双子交易所徽标", "gitcoin-logo": "Gitcoin徽标", - "loopring-logo": "Loopring徽标", "makerdao-logo": "MakerDao 徽标", "matcha-logo": "Matcha徽标", "summerfi-logo": "Summer.fi 徽标", diff --git a/src/intl/zh/page-staking.json b/src/intl/zh/page-staking.json index 6539aafd3a3..7dff50140b3 100644 --- a/src/intl/zh/page-staking.json +++ b/src/intl/zh/page-staking.json @@ -10,7 +10,7 @@ "comp-withdrawal-comparison-new-link": "访问质押启动板", "comp-withdrawal-credentials-placeholder": "验证者索引", "comp-withdrawal-credentials-error": "哎呀!请仔细检查验证者索引编号然后重试。", - "comp-withdrawal-credentials-upgraded-1": "验证者引索 {{validatorIndex}} 准备好开始接收奖励了!", + "comp-withdrawal-credentials-upgraded-1": "验证者引索 {validatorIndex} 准备好开始接收奖励了!", "comp-withdrawal-credentials-upgraded-2": "关联执行地址的提款凭证:", "comp-withdrawal-credentials-not-upgraded-1": "此验证者需要升级。", "comp-withdrawal-credentials-not-upgraded-1-testnet": "此 Holesky 测试网验证者需要升级。", diff --git a/src/intl/zh/page-what-is-ethereum.json b/src/intl/zh/page-what-is-ethereum.json index 57b795c7cd0..0c24a2aafee 100644 --- a/src/intl/zh/page-what-is-ethereum.json +++ b/src/intl/zh/page-what-is-ethereum.json @@ -54,7 +54,7 @@ "page-what-is-ethereum-slide-1-desc-2": "以太坊和稳定币简化了海外汇款流程。在全球范围内转移资金通常只需要几分钟即可完成,相比之下普通银行可能需要几个工作日甚至几周,并且价格只是银行服务的一小部分。此外,进行高额交易不收取额外费用,并且对于汇款地址或原因没有任何限制。", "page-what-is-ethereum-slide-2-title": "在危机时刻提供最快捷的帮助", "page-what-is-ethereum-slide-2-desc-1": "如果你足够幸运,可以在生活的地方享受值得信赖的机构提供的多种银行业务,你可能会认为它们提供的财务自由、安全和稳定是理所当然的。但对于世界各地面临政治压制或经济困难的许多人来说,金融机构可能无法提供他们需要的保护或服务。", - "page-what-is-ethereum-slide-2-desc-2": "当委内瑞拉古巴阿富汗尼日利亚白俄罗斯乌克兰等地的居民遭受战争、经济崩溃和镇压时,加密货币就成为他们维系金融机构最快,且通常是唯一的方式。1正如这些例子所示,以太坊等加密货币能够让被迫割离世界的人畅通无阻地参与全球经济。另外,当本地货币由于恶性通货膨胀而崩溃时,稳定币可以提供一种保值手段。", + "page-what-is-ethereum-slide-2-desc-2": "当委内瑞拉古巴阿富汗尼日利亚白俄罗斯乌克兰等地的居民遭受战争、经济崩溃和镇压时,加密货币就成为他们维系金融机构最快,且通常是唯一的方式。1正如这些例子所示,以太坊等加密货币能够让被迫割离世界的人畅通无阻地参与全球经济。另外,当本地货币由于恶性通货膨胀而崩溃时,稳定币可以提供一种保值手段。", "page-what-is-ethereum-slide-3-title": "为创作者赋能", "page-what-is-ethereum-slide-3-desc-1": "仅在 2021 年,艺术家、音乐家、作家和其他创作者就利用以太坊共赚取了约 35 亿美元。这使得以太坊成为最大的全球创作者平台之一,与 Spotify、YouTube 和 Etsy 并驾齐驱。了解更多。", "page-what-is-ethereum-slide-4-title": "赋能玩家", diff --git a/src/intl/zh/template-usecase.json b/src/intl/zh/template-usecase.json index 5bf108904a4..6e10cd42462 100644 --- a/src/intl/zh/template-usecase.json +++ b/src/intl/zh/template-usecase.json @@ -12,5 +12,6 @@ "template-usecase-dropdown": "以太坊使用案例", "template-usecase-banner": "以太坊的用法不断开发和演进。添加任何你认为会使事情变得更清晰或更及时的信息。", "template-usecase-edit-link": "编辑页面", - "template-usecase-dropdown-aria": "使用案例下拉菜单" + "template-usecase-dropdown-aria": "使用案例下拉菜单", + "template-usecase-dropdown-rwa": "现实世界资产(RWA)" } From 663972becbbfaab056f1dfa1f178d8ffdb1d7b01 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:08:09 +0000 Subject: [PATCH 244/368] fix: change description text color to body medium for better contrast on enterprise page - Updated FeatureCard component to use text-body-medium class for description text - Affects the 4 top feature boxes on /enterprise page - Improves visual hierarchy and readability as requested in issue #15772 Co-authored-by: Jakub --- app/[locale]/enterprise/_components/FeatureCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/enterprise/_components/FeatureCard.tsx b/app/[locale]/enterprise/_components/FeatureCard.tsx index 07e29f1e855..ed1b499bf64 100644 --- a/app/[locale]/enterprise/_components/FeatureCard.tsx +++ b/app/[locale]/enterprise/_components/FeatureCard.tsx @@ -48,7 +48,7 @@ const FeatureCard = ({

      {header}

      {content.map((p, i) => ( -

      +

      {p}

      ))} From 4ff60786ee5c53c43d02b653f1cb6edbaf865f3a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 07:34:44 -0700 Subject: [PATCH 245/368] migrate: filter icon to Lucide --- src/components/ProductTable/MobileFilters.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/ProductTable/MobileFilters.tsx b/src/components/ProductTable/MobileFilters.tsx index da496ed8fd3..c6a1f5276c9 100644 --- a/src/components/ProductTable/MobileFilters.tsx +++ b/src/components/ProductTable/MobileFilters.tsx @@ -1,9 +1,8 @@ import React from "react" -import { RotateCcw, X } from "lucide-react" +import { ListFilter, RotateCcw, X } from "lucide-react" import { FilterOption, TPresetFilters } from "@/lib/types" -import { FilterBurgerIcon } from "@/components/icons/wallets" import Filters from "@/components/ProductTable/Filters" import PresetFilters from "@/components/ProductTable/PresetFilters" import { @@ -71,7 +70,9 @@ const MobileFilters = ({

      {t("table-filters")}

      {` ${activeFiltersCount} ${t("table-active")}`}

    - +
    + +
    From d599cece9e218a6f951b05cc948d349ce8929c24 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 07:34:44 -0700 Subject: [PATCH 246/368] migrate: filter icon to Lucide --- src/components/ProductTable/MobileFilters.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/ProductTable/MobileFilters.tsx b/src/components/ProductTable/MobileFilters.tsx index da496ed8fd3..c6a1f5276c9 100644 --- a/src/components/ProductTable/MobileFilters.tsx +++ b/src/components/ProductTable/MobileFilters.tsx @@ -1,9 +1,8 @@ import React from "react" -import { RotateCcw, X } from "lucide-react" +import { ListFilter, RotateCcw, X } from "lucide-react" import { FilterOption, TPresetFilters } from "@/lib/types" -import { FilterBurgerIcon } from "@/components/icons/wallets" import Filters from "@/components/ProductTable/Filters" import PresetFilters from "@/components/ProductTable/PresetFilters" import { @@ -71,7 +70,9 @@ const MobileFilters = ({

    {t("table-filters")}

    {` ${activeFiltersCount} ${t("table-active")}`}

    - +
    + +
    From 268347e17af05c6ec4e7630198f9ebbf54b21510 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:48:12 -0700 Subject: [PATCH 247/368] refactor: AdoptionSwiper lazy loading --- .../10years/_components/AdoptionSwiper.tsx | 69 ------------------- .../_components/AdoptionSwiper/client.tsx | 60 ++++++++++++++++ .../_components/AdoptionSwiper/loading.tsx | 21 ++++++ .../_components/AdoptionSwiper/server.tsx | 8 +++ 4 files changed, 89 insertions(+), 69 deletions(-) delete mode 100644 app/[locale]/10years/_components/AdoptionSwiper.tsx create mode 100644 app/[locale]/10years/_components/AdoptionSwiper/client.tsx create mode 100644 app/[locale]/10years/_components/AdoptionSwiper/loading.tsx create mode 100644 app/[locale]/10years/_components/AdoptionSwiper/server.tsx diff --git a/app/[locale]/10years/_components/AdoptionSwiper.tsx b/app/[locale]/10years/_components/AdoptionSwiper.tsx deleted file mode 100644 index 9799030934b..00000000000 --- a/app/[locale]/10years/_components/AdoptionSwiper.tsx +++ /dev/null @@ -1,69 +0,0 @@ -"use client" - -import type { StaticImageData } from "next/image" -import { useTranslations } from "next-intl" - -import { Image } from "@/components/Image" -import Translation from "@/components/Translation" -import { ButtonLink } from "@/components/ui/buttons/Button" -import { - Swiper, - SwiperContainer, - SwiperNavigation, - SwiperSlide, -} from "@/components/ui/swiper" - -import { cn } from "@/lib/utils/cn" - -type AdoptionCardProps = { - adoptionCards: { image: StaticImageData; href: string }[] - adoptionStyles: string[] -} - -const AdoptionSwiper = ({ - adoptionCards, - adoptionStyles, -}: AdoptionCardProps) => { - const t = useTranslations("page-10-year-anniversary") - - return ( -
    - - - {adoptionCards.map((card, index) => { - const title = t(`page-10-year-adoption-card-${index + 1}-title`) - return ( - -
    - {title} -

    {title}

    -

    - -

    - - {t(`page-10-year-adoption-card-${index + 1}-link-text`)} - -
    -
    - ) - })} - -
    -
    -
    - ) -} - -export default AdoptionSwiper diff --git a/app/[locale]/10years/_components/AdoptionSwiper/client.tsx b/app/[locale]/10years/_components/AdoptionSwiper/client.tsx new file mode 100644 index 00000000000..d9b34775689 --- /dev/null +++ b/app/[locale]/10years/_components/AdoptionSwiper/client.tsx @@ -0,0 +1,60 @@ +"use client" + +import { Image } from "@/components/Image" +import Translation from "@/components/Translation" +import { ButtonLink } from "@/components/ui/buttons/Button" +import { + Swiper, + SwiperContainer, + SwiperNavigation, + SwiperSlide, +} from "@/components/ui/swiper" + +import { cn } from "@/lib/utils/cn" + +import { AdoptionCard } from "../types" + +type AdoptionCardProps = { + adoptionCards: AdoptionCard[] + adoptionStyles: string[] +} + +const AdoptionSwiper = ({ + adoptionCards, + adoptionStyles, +}: AdoptionCardProps) => ( +
    + + + {adoptionCards.map(({ image, linkText, href, title }, index) => { + return ( + +
    + {title} +

    {title}

    +

    + +

    + + {linkText} + +
    +
    + ) + })} + +
    +
    +
    +) + +export default AdoptionSwiper diff --git a/app/[locale]/10years/_components/AdoptionSwiper/loading.tsx b/app/[locale]/10years/_components/AdoptionSwiper/loading.tsx new file mode 100644 index 00000000000..46bfe2f77eb --- /dev/null +++ b/app/[locale]/10years/_components/AdoptionSwiper/loading.tsx @@ -0,0 +1,21 @@ +import { Skeleton } from "@/components/ui/skeleton" + +const Loading = () => ( +
    +
    + + +
    + + + +
    +
    + +
    +
    + +
    +) + +export default Loading diff --git a/app/[locale]/10years/_components/AdoptionSwiper/server.tsx b/app/[locale]/10years/_components/AdoptionSwiper/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/app/[locale]/10years/_components/AdoptionSwiper/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) From d61ed0876e053913a878aeedc84eced6f6c1f5d4 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:48:29 -0700 Subject: [PATCH 248/368] refactor: CountDown lazy loading --- .../{CountDown.tsx => CountDown/client.tsx} | 0 .../10years/_components/CountDown/loading.tsx | 17 +++++++++++++++++ .../10years/_components/CountDown/server.tsx | 8 ++++++++ 3 files changed, 25 insertions(+) rename app/[locale]/10years/_components/{CountDown.tsx => CountDown/client.tsx} (100%) create mode 100644 app/[locale]/10years/_components/CountDown/loading.tsx create mode 100644 app/[locale]/10years/_components/CountDown/server.tsx diff --git a/app/[locale]/10years/_components/CountDown.tsx b/app/[locale]/10years/_components/CountDown/client.tsx similarity index 100% rename from app/[locale]/10years/_components/CountDown.tsx rename to app/[locale]/10years/_components/CountDown/client.tsx diff --git a/app/[locale]/10years/_components/CountDown/loading.tsx b/app/[locale]/10years/_components/CountDown/loading.tsx new file mode 100644 index 00000000000..306146da4b1 --- /dev/null +++ b/app/[locale]/10years/_components/CountDown/loading.tsx @@ -0,0 +1,17 @@ +import { Skeleton } from "@/components/ui/skeleton" + +const Loading = () => ( +
    + {Array.from({ length: 4 }).map((_, idx) => ( +
    + + +
    + ))} +
    +) + +export default Loading diff --git a/app/[locale]/10years/_components/CountDown/server.tsx b/app/[locale]/10years/_components/CountDown/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/app/[locale]/10years/_components/CountDown/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) From ea18af248adce3fe6c865554bfde3f24168a97f3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:48:46 -0700 Subject: [PATCH 249/368] refactor: InnovationSwiper lazy loading --- .../10years/_components/InnovationSwiper.tsx | 56 ------------------- .../_components/InnovationSwiper/client.tsx | 49 ++++++++++++++++ .../_components/InnovationSwiper/loading.tsx | 28 ++++++++++ .../_components/InnovationSwiper/server.tsx | 8 +++ 4 files changed, 85 insertions(+), 56 deletions(-) delete mode 100644 app/[locale]/10years/_components/InnovationSwiper.tsx create mode 100644 app/[locale]/10years/_components/InnovationSwiper/client.tsx create mode 100644 app/[locale]/10years/_components/InnovationSwiper/loading.tsx create mode 100644 app/[locale]/10years/_components/InnovationSwiper/server.tsx diff --git a/app/[locale]/10years/_components/InnovationSwiper.tsx b/app/[locale]/10years/_components/InnovationSwiper.tsx deleted file mode 100644 index c5eb4156402..00000000000 --- a/app/[locale]/10years/_components/InnovationSwiper.tsx +++ /dev/null @@ -1,56 +0,0 @@ -"use client" - -import { Image } from "@/components/Image" -import { - Swiper, - SwiperContainer, - SwiperNavigation, - SwiperSlide, -} from "@/components/ui/swiper" - -import { innovationCards } from "./data" - -import { useTranslation } from "@/hooks/useTranslation" - -export default function InnovationSwiper() { - const { t } = useTranslation("page-10-year-anniversary") - - return ( -
    - - - {innovationCards.map((card, index) => ( - - {t(`page-10-year-innovation-card-${index -
    -

    - {t(`page-10-year-innovation-card-${index + 1}-title`)} -

    -

    - {t(`page-10-year-innovation-card-${index + 1}-date`)} -

    -
    -

    - {t(`page-10-year-innovation-card-${index + 1}-description-1`)} -

    -

    - {t(`page-10-year-innovation-card-${index + 1}-description-2`)} -

    -
    - ))} - -
    -
    -
    - ) -} diff --git a/app/[locale]/10years/_components/InnovationSwiper/client.tsx b/app/[locale]/10years/_components/InnovationSwiper/client.tsx new file mode 100644 index 00000000000..c1316c5bcfd --- /dev/null +++ b/app/[locale]/10years/_components/InnovationSwiper/client.tsx @@ -0,0 +1,49 @@ +"use client" + +import { Image } from "@/components/Image" +import { + Swiper, + SwiperContainer, + SwiperNavigation, + SwiperSlide, +} from "@/components/ui/swiper" + +import type { InnovationCard } from "../types" + +type InnovationSwiperProps = { + innovationCards: InnovationCard[] +} +const InnovationSwiper = ({ innovationCards }: InnovationSwiperProps) => ( +
    + + + {innovationCards.map( + ({ image, title, date, description1, description2 }, index) => ( + + {title} +
    +

    {title}

    +

    {date}

    +
    +

    {description1}

    +

    {description2}

    +
    + ) + )} + +
    +
    +
    +) + +export default InnovationSwiper diff --git a/app/[locale]/10years/_components/InnovationSwiper/loading.tsx b/app/[locale]/10years/_components/InnovationSwiper/loading.tsx new file mode 100644 index 00000000000..ebae2ca99e9 --- /dev/null +++ b/app/[locale]/10years/_components/InnovationSwiper/loading.tsx @@ -0,0 +1,28 @@ +import { Skeleton } from "@/components/ui/skeleton" + +const Loading = () => ( +
    +
    + + + +
    + + + + + +
    +
    + + + + + +
    +
    + +
    +) + +export default Loading diff --git a/app/[locale]/10years/_components/InnovationSwiper/server.tsx b/app/[locale]/10years/_components/InnovationSwiper/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/app/[locale]/10years/_components/InnovationSwiper/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) From 32195348842d6aaf8f68e5974506df35142e582c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:49:02 -0700 Subject: [PATCH 250/368] refactor: TenYearGlobe lazy loading --- .../{TenYearGlobe.tsx => TenYearGlobe/client.tsx} | 14 +++++++++----- .../10years/_components/TenYearGlobe/loading.tsx | 7 +++++++ .../10years/_components/TenYearGlobe/server.tsx | 8 ++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) rename app/[locale]/10years/_components/{TenYearGlobe.tsx => TenYearGlobe/client.tsx} (97%) create mode 100644 app/[locale]/10years/_components/TenYearGlobe/loading.tsx create mode 100644 app/[locale]/10years/_components/TenYearGlobe/server.tsx diff --git a/app/[locale]/10years/_components/TenYearGlobe.tsx b/app/[locale]/10years/_components/TenYearGlobe/client.tsx similarity index 97% rename from app/[locale]/10years/_components/TenYearGlobe.tsx rename to app/[locale]/10years/_components/TenYearGlobe/client.tsx index 5623ca482f0..450c438ba1d 100644 --- a/app/[locale]/10years/_components/TenYearGlobe.tsx +++ b/app/[locale]/10years/_components/TenYearGlobe/client.tsx @@ -9,11 +9,10 @@ import { OrbitControls } from "three/examples/jsm/controls/OrbitControls" import Link from "@/components/ui/Link" -import countries from "./countries.json" +import countries from "../countries.json" import { useBreakpointValue } from "@/hooks/useBreakpointValue" import { usePrefersReducedMotion } from "@/hooks/usePrefersReducedMotion" -import { useTranslation } from "@/hooks/useTranslation" import EthLogo from "@/public/images/assets/eth-glyph-colored.png" // Define a type for event data @@ -40,8 +39,13 @@ interface ExtendedOrbitControls extends OrbitControls { } } -const TenYearGlobe = ({ events }: { events: EventData[] }) => { - const { t } = useTranslation("page-10-year-anniversary") +const TenYearGlobe = ({ + events, + actionLabel, +}: { + events: EventData[] + actionLabel: string +}) => { const globeRef = useRef() const globeContainerRef = useRef(null) const { resolvedTheme } = useTheme() @@ -274,7 +278,7 @@ const TenYearGlobe = ({ events }: { events: EventData[] }) => { hideArrow className="no-underline" > - {t("page-10-year-globe-go-to-event")} + {actionLabel} )}
    diff --git a/app/[locale]/10years/_components/TenYearGlobe/loading.tsx b/app/[locale]/10years/_components/TenYearGlobe/loading.tsx new file mode 100644 index 00000000000..6af8f387d71 --- /dev/null +++ b/app/[locale]/10years/_components/TenYearGlobe/loading.tsx @@ -0,0 +1,7 @@ +import { Skeleton } from "@/components/ui/skeleton" + +const Loading = () => ( + +) + +export default Loading diff --git a/app/[locale]/10years/_components/TenYearGlobe/server.tsx b/app/[locale]/10years/_components/TenYearGlobe/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/app/[locale]/10years/_components/TenYearGlobe/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) From 4f873adc0a662ddb7a02218dbe665faee40e38c7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:49:57 -0700 Subject: [PATCH 251/368] refactor: UserStories lazy loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nested component resulting in "Stories" directory—renamed to "UserStories" to avoid any conflicts with storybook --- .../{Stories.tsx => UserStories/client.tsx} | 0 .../_components/UserStories/loading.tsx | 32 +++++++++++++++++++ .../_components/UserStories/server.tsx | 8 +++++ 3 files changed, 40 insertions(+) rename app/[locale]/10years/_components/{Stories.tsx => UserStories/client.tsx} (100%) create mode 100644 app/[locale]/10years/_components/UserStories/loading.tsx create mode 100644 app/[locale]/10years/_components/UserStories/server.tsx diff --git a/app/[locale]/10years/_components/Stories.tsx b/app/[locale]/10years/_components/UserStories/client.tsx similarity index 100% rename from app/[locale]/10years/_components/Stories.tsx rename to app/[locale]/10years/_components/UserStories/client.tsx diff --git a/app/[locale]/10years/_components/UserStories/loading.tsx b/app/[locale]/10years/_components/UserStories/loading.tsx new file mode 100644 index 00000000000..31b50c6581f --- /dev/null +++ b/app/[locale]/10years/_components/UserStories/loading.tsx @@ -0,0 +1,32 @@ +import { Skeleton } from "@/components/ui/skeleton" + +const Loading = () => ( +
    + {Array.from({ length: 3 }).map((_, idx) => ( +
    +
    + +
    + + +
    +
    +
    + + + +
    +
    + + +
    + +
    + ))} +
    +) + +export default Loading diff --git a/app/[locale]/10years/_components/UserStories/server.tsx b/app/[locale]/10years/_components/UserStories/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/app/[locale]/10years/_components/UserStories/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) From 4d08c4fc80f4aa804ce99e6ea25eed965f39b21b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:50:11 -0700 Subject: [PATCH 252/368] refactor: ParallaxImage lazy loading --- .../{ParallaxImage.tsx => ParallaxImage/client.tsx} | 11 ++++++++++- src/components/Image/ParallaxImage/loading.tsx | 9 +++++++++ src/components/Image/ParallaxImage/server.tsx | 8 ++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) rename src/components/Image/{ParallaxImage.tsx => ParallaxImage/client.tsx} (84%) create mode 100644 src/components/Image/ParallaxImage/loading.tsx create mode 100644 src/components/Image/ParallaxImage/server.tsx diff --git a/src/components/Image/ParallaxImage.tsx b/src/components/Image/ParallaxImage/client.tsx similarity index 84% rename from src/components/Image/ParallaxImage.tsx rename to src/components/Image/ParallaxImage/client.tsx index 338d4769b06..5dfc185faa2 100644 --- a/src/components/Image/ParallaxImage.tsx +++ b/src/components/Image/ParallaxImage/client.tsx @@ -5,6 +5,8 @@ import { ImageProps as NextImageProps } from "next/image" import { Image } from "@/components/Image" +import { cn } from "@/lib/utils/cn" + import { useEventListener } from "@/hooks/useEventListener" import { usePrefersReducedMotion } from "@/hooks/usePrefersReducedMotion" @@ -28,7 +30,14 @@ const ParallaxImage = ({ src, alt, className }: ParallaxImageProps) => { } const style = prefersReducedMotion ? {} : transform - return {alt} + return ( + {alt} + ) } export default ParallaxImage diff --git a/src/components/Image/ParallaxImage/loading.tsx b/src/components/Image/ParallaxImage/loading.tsx new file mode 100644 index 00000000000..895165f5a14 --- /dev/null +++ b/src/components/Image/ParallaxImage/loading.tsx @@ -0,0 +1,9 @@ +import { Spinner } from "@/components/ui/spinner" + +const Loading = () => ( +
    + +
    +) + +export default Loading diff --git a/src/components/Image/ParallaxImage/server.tsx b/src/components/Image/ParallaxImage/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/src/components/Image/ParallaxImage/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) From 5e58bfbb8677732dcf58a74dffbf155e6cc11429 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:50:32 -0700 Subject: [PATCH 253/368] refactor: Morpher lazy loading --- src/components/Homepage/LanguageMorpher.tsx | 2 +- src/components/{Morpher.tsx => Morpher/client.tsx} | 0 src/components/Morpher/loading.tsx | 4 ++++ src/components/Morpher/server.tsx | 8 ++++++++ 4 files changed, 13 insertions(+), 1 deletion(-) rename src/components/{Morpher.tsx => Morpher/client.tsx} (100%) create mode 100644 src/components/Morpher/loading.tsx create mode 100644 src/components/Morpher/server.tsx diff --git a/src/components/Homepage/LanguageMorpher.tsx b/src/components/Homepage/LanguageMorpher.tsx index 12e91344664..ccbf56062ce 100644 --- a/src/components/Homepage/LanguageMorpher.tsx +++ b/src/components/Homepage/LanguageMorpher.tsx @@ -1,6 +1,6 @@ "use client" -import Morpher from "@/components/Morpher" +import Morpher from "@/components/Morpher/client" import { Button } from "@/components/ui/buttons/Button" import { screens } from "@/lib/utils/screen" diff --git a/src/components/Morpher.tsx b/src/components/Morpher/client.tsx similarity index 100% rename from src/components/Morpher.tsx rename to src/components/Morpher/client.tsx diff --git a/src/components/Morpher/loading.tsx b/src/components/Morpher/loading.tsx new file mode 100644 index 00000000000..8006c21bc91 --- /dev/null +++ b/src/components/Morpher/loading.tsx @@ -0,0 +1,4 @@ +// Blurred text as loader; language insignificant +const Loading = () => ethereum + +export default Loading diff --git a/src/components/Morpher/server.tsx b/src/components/Morpher/server.tsx new file mode 100644 index 00000000000..c87674840b7 --- /dev/null +++ b/src/components/Morpher/server.tsx @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("./client"), { + ssr: false, + loading: Loading, +}) From 2fa3d4ffa433818d25a08324784415599b36fd44 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:53:36 -0700 Subject: [PATCH 254/368] refactor: update 10years/home pages with lazy imports updates to use lazy loaded versions of client-side components --- .../10years/_components/TenYearHero.tsx | 6 +- .../10years/_components/TenYearHomeBanner.tsx | 13 +- app/[locale]/10years/_components/data.tsx | 63 +-- app/[locale]/10years/_components/types.ts | 11 +- app/[locale]/10years/_components/utils.ts | 93 +++- app/[locale]/10years/page.tsx | 515 +++++++++--------- app/[locale]/page.tsx | 2 +- 7 files changed, 370 insertions(+), 333 deletions(-) diff --git a/app/[locale]/10years/_components/TenYearHero.tsx b/app/[locale]/10years/_components/TenYearHero.tsx index 7d0e03bd22a..e5ce7a703b5 100644 --- a/app/[locale]/10years/_components/TenYearHero.tsx +++ b/app/[locale]/10years/_components/TenYearHero.tsx @@ -1,8 +1,8 @@ import { getTranslations } from "next-intl/server" import { Image } from "@/components/Image" -import ParallaxImage from "@/components/Image/ParallaxImage" -import Morpher from "@/components/Morpher" +import ParallaxImage from "@/components/Image/ParallaxImage/server" +import Morpher from "@/components/Morpher/server" import TenYearBackgroundImage from "@/public/images/10-year-anniversary/10-year-background.png" import TenYearGraphicImage from "@/public/images/10-year-anniversary/10-year-graphic.png" @@ -36,6 +36,7 @@ const TenYearHero = async ({ locale }: { locale: string }) => { alt="" // decorative element className="max-h-[350px] object-cover" /> + {/* CLIENT SIDE, lazy loaded */} { {WORDS[0]} + {/* CLIENT SIDE, lazy loaded */} diff --git a/app/[locale]/10years/_components/TenYearHomeBanner.tsx b/app/[locale]/10years/_components/TenYearHomeBanner.tsx index 640bbbfaba1..d5515040a4e 100644 --- a/app/[locale]/10years/_components/TenYearHomeBanner.tsx +++ b/app/[locale]/10years/_components/TenYearHomeBanner.tsx @@ -1,10 +1,10 @@ -import { getTranslations } from "next-intl/server" +import { getLocale, getTranslations } from "next-intl/server" import { Image } from "@/components/Image" -import ParallaxImage from "@/components/Image/ParallaxImage" +import ParallaxImage from "@/components/Image/ParallaxImage/server" import { ButtonLink } from "@/components/ui/buttons/Button" -import Countdown from "./CountDown" +import Countdown from "./CountDown/server" import { getTimeUnitTranslations } from "./utils" import TenYearBackgroundImage from "@/public/images/10-year-anniversary/10-year-background.png" @@ -12,13 +12,14 @@ import TenYearGraphicImage from "@/public/images/10-year-anniversary/10-year-log import TenYearDesktopText from "@/public/images/10-year-anniversary/10yeartext.svg" import TenYearMobileText from "@/public/images/10-year-anniversary/10yeartext-mobile.svg" -const TenYearHomeBanner = async ({ locale }: { locale: string }) => { +const TenYearHomeBanner = async () => { + const locale = await getLocale() const t = await getTranslations({ locale, namespace: "page-10-year-anniversary", }) - const timeLeftLabels = await getTimeUnitTranslations(locale) + const timeLeftLabels = await getTimeUnitTranslations() return (
    @@ -32,6 +33,7 @@ const TenYearHomeBanner = async ({ locale }: { locale: string }) => { />
    + {/* CLIENT SIDE, lazy loaded */} {

    {t("page-10-year-banner-tagline")}

    + {/* CLIENT SIDE, lazy loaded */} { // TODO: Remove this check when spreadsheet is fixed @@ -34,7 +47,8 @@ export const parseStoryDates = ( date: parseDate(date, locale), })) -export const getTimeUnitTranslations = async (locale: string) => { +export const getTimeUnitTranslations = async () => { + const locale = await getLocale() const t = await getTranslations({ locale, namespace: "page-10-year-anniversary", @@ -59,3 +73,76 @@ export const getTimeUnitTranslations = async (locale: string) => { } return timeLeftLabels } + +export const getInnovationCards = async (): Promise => { + const locale = await getLocale() + const t = await getTranslations({ + locale, + namespace: "page-10-year-anniversary", + }) + return [ + { + image: EthereumLaunchImage, + }, + { + image: StableCoinImage, + }, + { + image: NftImage, + }, + { + image: DefiSummerImage, + }, + { + image: TheMergeImage, + }, + { + image: EthETFImage, + }, + ].map((card, index) => ({ + ...card, + title: t(`page-10-year-innovation-card-${index + 1}-title`), + date: t(`page-10-year-innovation-card-${index + 1}-date`), + description1: t(`page-10-year-innovation-card-${index + 1}-description-1`), + description2: t(`page-10-year-innovation-card-${index + 1}-description-2`), + })) +} + +export const getAdoptionCards = async (): Promise => { + const locale = await getLocale() + const t = await getTranslations({ + locale, + namespace: "page-10-year-anniversary", + }) + return [ + { + image: Adoption1Image, + href: "/resources", + }, + { + image: Adoption2Image, + href: "/roadmap", + }, + { + image: Adoption3Image, + href: "/stablecoins", + }, + { + image: Adoption4Image, + href: "/defi", + }, + { + image: Adoption5Image, + href: "/energy-consumption", + }, + { + image: Adoption6Image, + href: "/layer-2", + }, + ].map((card, index) => ({ + ...card, + title: t(`page-10-year-adoption-card-${index + 1}-title`), + linkText: t(`page-10-year-adoption-card-${index + 1}-link-text`), + // description: Uses htmr, loaded directly with Translation component where consumed + })) +} diff --git a/app/[locale]/10years/page.tsx b/app/[locale]/10years/page.tsx index 77eabb5bd08..686451f1554 100644 --- a/app/[locale]/10years/page.tsx +++ b/app/[locale]/10years/page.tsx @@ -1,6 +1,4 @@ -import { Suspense } from "react" import { pick } from "lodash" -import dynamic from "next/dynamic" import { getMessages, getTranslations, @@ -16,7 +14,6 @@ import MainArticle from "@/components/MainArticle" import Translation from "@/components/Translation" import { ButtonLink } from "@/components/ui/buttons/Button" import { LinkBox, LinkOverlay } from "@/components/ui/link-box" -import { Skeleton } from "@/components/ui/skeleton" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { cn } from "@/lib/utils/cn" @@ -26,22 +23,24 @@ import { getRequiredNamespacesForPage } from "@/lib/utils/translations" import { BASE_TIME_UNIT } from "@/lib/constants" -import AdoptionSwiper from "./_components/AdoptionSwiper" -import CountDown from "./_components/CountDown" -import { adoptionCards, adoptionStyles } from "./_components/data" -import InnovationSwiper from "./_components/InnovationSwiper" -import Stories from "./_components/Stories" +import AdoptionSwiper from "./_components/AdoptionSwiper/server" +import CountDown from "./_components/CountDown/server" +import { adoptionStyles } from "./_components/data" +import InnovationSwiper from "./_components/InnovationSwiper/server" +import TenYearGlobe from "./_components/TenYearGlobe/server" import TenYearHero from "./_components/TenYearHero" -import { getTimeUnitTranslations, parseStoryDates } from "./_components/utils" +import Stories from "./_components/UserStories/server" +import { + getAdoptionCards, + getInnovationCards, + getTimeUnitTranslations, + parseStoryDates, +} from "./_components/utils" import { fetch10YearEvents } from "@/lib/api/fetch10YearEvents" import { fetch10YearStories } from "@/lib/api/fetch10YearStories" import TenYearLogo from "@/public/images/10-year-anniversary/10-year-logo.png" -const TenYearGlobe = dynamic(() => import("./_components/TenYearGlobe"), { - ssr: false, -}) - // In seconds const REVALIDATE_TIME = BASE_TIME_UNIT * 1 @@ -74,287 +73,285 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { namespace: "page-10-year-anniversary", }) - const timeLeftLabels = await getTimeUnitTranslations(locale) + const timeLeftLabels = await getTimeUnitTranslations() + const innovationCards = await getInnovationCards() + const adoptionCards = await getAdoptionCards() return ( - - - + + -
    -
    -
    -

    - {t("page-10-year-hero-title")} -

    -
    -
    -

    {t("page-10-year-hero-description")}

    -

    {t("page-10-year-hero-tagline")}

    -
    +
    +
    +
    +

    + {t("page-10-year-hero-title")} +

    -
    - +
    +

    {t("page-10-year-hero-description")}

    +

    {t("page-10-year-hero-tagline")}

    +
    + {/* CLIENT SIDE, lazy loaded */} + +
    +
    -
    -
    -
    -

    - {t("page-10-year-join-party-title")} -

    -

    - {t("page-10-year-join-party-description")} -

    -
    -
    - - } - > - - region.events.map((event) => ({ - ...event, - lat: Number(event.lat), - lng: Number(event.lng), - })) - )} - /> - -
    +
    +
    +
    +

    + {t("page-10-year-join-party-title")} +

    +

    + {t("page-10-year-join-party-description")} +

    +
    +
    + {/* CLIENT SIDE, lazy loaded */} + + region.events.map((event) => ({ + ...event, + lat: Number(event.lat), + lng: Number(event.lng), + })) + )} + />
    +
    -
    -
    - - - {Object.entries(fetched10YearEvents).map(([key, data]) => ( - - {data.label} - {"\u00A0"} - ({data.events.length}) - - ))} - - {Object.entries(fetched10YearEvents).map(([key, data]) => { - const events = data.events.sort((a, b) => - a.country.localeCompare(b.country) - ) - const eventsByCountry = events.reduce( - (acc, event) => { - if (!acc[event.country]) { - acc[event.country] = [] - } - acc[event.country].push(event) - return acc - }, - {} as Record - ) +
    +
    + + + {Object.entries(fetched10YearEvents).map(([key, data]) => ( + + {data.label}  + ({data.events.length}) + + ))} + + {Object.entries(fetched10YearEvents).map(([key, data]) => { + const events = data.events.sort((a, b) => + a.country.localeCompare(b.country) + ) + const eventsByCountry = events.reduce( + (acc, event) => { + if (!acc[event.country]) { + acc[event.country] = [] + } + acc[event.country].push(event) + return acc + }, + {} as Record + ) - return ( - -
    - {Object.entries(eventsByCountry).map( - ([country, countryEvents]) => ( -
    -

    - - - - {country} -

    -
    - {countryEvents.map((event, index) => ( - -
    -
    - - {event.city} - -
    -
    - {event.host} -
    + return ( + +
    + {Object.entries(eventsByCountry).map( + ([country, countryEvents]) => ( +
    +

    + + + + {country} +

    +
    + {countryEvents.map((event, index) => ( + +
    +
    + + {event.city} +
    - - {t("page-10-year-event-link")} - - - ))} -
    +
    + {event.host} +
    +
    + + {t("page-10-year-event-link")} + + + ))}
    - ) - )} -
    -
    - ) - })} - -
    +
    + ) + )} +
    + + ) + })} +
    -
    -
    -

    {t("page-10-year-events-description-1")}

    -

    {t("page-10-year-events-description-2")}

    -
    -
    -

    - {t("page-10-year-host-event-title")} -

    -

    - {t("page-10-year-host-event-description")} -

    - - {t("page-10-year-host-event-cta")} - -
    +
    +
    +
    +

    {t("page-10-year-events-description-1")}

    +

    {t("page-10-year-events-description-2")}

    +
    +

    + {t("page-10-year-host-event-title")} +

    +

    {t("page-10-year-host-event-description")}

    + + {t("page-10-year-host-event-cta")} + +
    +
    + +
    +
    +

    + + {t("page-10-year-innovation-title")} + + + {t("page-10-year-innovation-subtitle")} + +

    +

    + {t("page-10-year-innovation-description-1")} +

    +

    {t("page-10-year-innovation-description-2")}

    +

    {t("page-10-year-innovation-description-3")}

    +
    + {/* CLIENT SIDE, lazy loaded */} + +
    -
    -
    +
    +
    +

    - {t("page-10-year-innovation-title")} + {t("page-10-year-adoption-title")} - {t("page-10-year-innovation-subtitle")} + {t("page-10-year-adoption-subtitle")}

    - {t("page-10-year-innovation-description-1")} + {t("page-10-year-adoption-description-1")}

    -

    {t("page-10-year-innovation-description-2")}

    -

    {t("page-10-year-innovation-description-3")}

    +

    {t("page-10-year-adoption-description-2")}

    -
    - -
    -
    -
    -

    - - {t("page-10-year-adoption-title")} - - - {t("page-10-year-adoption-subtitle")} - -

    -

    - {t("page-10-year-adoption-description-1")} -

    -

    {t("page-10-year-adoption-description-2")}

    -
    -
    - -
    - {adoptionCards.map((card, index) => ( -
    - {t(`page-10-year-adoption-card-${index +
    + {adoptionCards.map((card, index) => ( +
    + {t(`page-10-year-adoption-card-${index +

    + {t(`page-10-year-adoption-card-${index + 1}-title`)} +

    +

    + -

    - {t(`page-10-year-adoption-card-${index + 1}-title`)} -

    -

    - -

    - - {t(`page-10-year-adoption-card-${index + 1}-link-text`)} - -
    - ))} -
    -
    - -
    -
    -
    -

    - - {t("page-10-year-stories-title")} - - - {t("page-10-year-stories-subtitle")} - -

    -

    - {t("page-10-year-stories-description-1")}

    -

    {t("page-10-year-stories-description-2")}

    - - {t("page-10-year-stories-cta")} + + {t(`page-10-year-adoption-card-${index + 1}-link-text`)}
    -
    - + ))}
    +
    -
    -
    - 10 year anniversary logo -

    {t("page-10-year-ideas-title")}

    -

    {t("page-10-year-ideas-description")}

    - - {t("page-10-year-ideas-cta")} +
    +
    +
    +

    + + {t("page-10-year-stories-title")} + + + {t("page-10-year-stories-subtitle")} + +

    +

    + {t("page-10-year-stories-description-1")} +

    +

    {t("page-10-year-stories-description-2")}

    + + {t("page-10-year-stories-cta")}
    - - + + + +
    + +
    +
    + 10 year anniversary logo +

    {t("page-10-year-ideas-title")}

    +

    {t("page-10-year-ideas-description")}

    + + {t("page-10-year-ideas-cta")} + +
    +
    + ) } diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 606fe0ca3fc..9e7293691ca 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -829,7 +829,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { id="10-year-anniversary" className={cn(locale !== "en" && "hidden")} // TODO: Show again when translations ready > - +
    {/* Recent posts */} From 01dc990c8dda190b969a1e2d79a0eaf6b85a21bd Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:53:55 -0700 Subject: [PATCH 255/368] fix: apply `priority` to hero images --- app/[locale]/10years/_components/TenYearHero.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/[locale]/10years/_components/TenYearHero.tsx b/app/[locale]/10years/_components/TenYearHero.tsx index e5ce7a703b5..299002bb347 100644 --- a/app/[locale]/10years/_components/TenYearHero.tsx +++ b/app/[locale]/10years/_components/TenYearHero.tsx @@ -35,12 +35,14 @@ const TenYearHero = async ({ locale }: { locale: string }) => { src={TenYearBackgroundImage} alt="" // decorative element className="max-h-[350px] object-cover" + priority /> {/* CLIENT SIDE, lazy loaded */}

    From a3886b7730193d0da0f9d1c09a0a87ad922e9bb4 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 18:03:53 -0700 Subject: [PATCH 256/368] fix: use djb2 hashing deterministic cookieless assignment --- src/components/AB/TestWrapper.tsx | 67 ++++++++++++++++++++----------- src/lib/ab-testing/server.ts | 57 +++++++++++++------------- 2 files changed, 71 insertions(+), 53 deletions(-) diff --git a/src/components/AB/TestWrapper.tsx b/src/components/AB/TestWrapper.tsx index 91ce238be40..5a609d877bf 100644 --- a/src/components/AB/TestWrapper.tsx +++ b/src/components/AB/TestWrapper.tsx @@ -20,33 +20,52 @@ const ABTestWrapper = async ({ variants, fallback, }: ABTestWrapperProps) => { - // Get assignment from cookie or create new one (handled server-side) - const assignment = await getABTestAssignment(testKey) + try { + // Get deterministic assignment (cookieless, based on user fingerprint) + const assignment = await getABTestAssignment(testKey) - if (!assignment) { - // If no assignment, render fallback + if (!assignment) { + // If no assignment, render fallback + return <>{fallback || variants[0]} + } + + // Find the variant index based on the assignment + const variantIndex = getVariantIndex(assignment.variant, testKey) + const selectedVariant = variants[variantIndex] || variants[0] + + // Get available variants for debug panel + const configs = getABTestConfigs() + const availableVariants = + configs[testKey]?.variants.map((v) => v.name) || [] + + return ( + <> + {/* Track assignment - existing Matomo opt-out logic will handle filtering */} + + + {/* Debug panel for development */} + {(!IS_PROD || IS_PREVIEW_DEPLOY) && ( + + )} + + {/* Render selected variant */} + {selectedVariant} + + ) + } catch (error) { + // If AB testing fails, render original variant + if (process.env.NODE_ENV === "development") { + console.warn( + `[AB Test] ${testKey}: Error occurred, falling back to original variant`, + error + ) + } return <>{fallback || variants[0]} } - - // Find the variant index based on the assignment - const variantIndex = getVariantIndex(assignment.variant, testKey) - const selectedVariant = variants[variantIndex] || variants[0] - - return ( - <> - - {(!IS_PROD || IS_PREVIEW_DEPLOY) && ( - v.name) || [] - } - /> - )} - {selectedVariant} - - ) } export default ABTestWrapper diff --git a/src/lib/ab-testing/server.ts b/src/lib/ab-testing/server.ts index d9d3164b6bb..ac61a739607 100644 --- a/src/lib/ab-testing/server.ts +++ b/src/lib/ab-testing/server.ts @@ -1,7 +1,6 @@ import { cookies } from "next/headers" import { AB_TEST_COOKIE_PREFIX } from "../constants" -import { IS_PROD } from "../utils/env" import { getABTestConfigs } from "./config" import { ABTestAssignment, ABTestConfig } from "./types" @@ -19,7 +18,7 @@ export async function getABTestAssignment( return null } - const cookieStore = cookies() + const cookieStore = await cookies() const cookieName = AB_TEST_COOKIE_PREFIX + testKey const existingAssignment = cookieStore.get(cookieName) @@ -43,8 +42,16 @@ export async function getABTestAssignment( } } - // If no valid existing assignment, create a new one and set cookie immediately - const variant = assignVariant(testConfig) + // If no valid existing assignment, create deterministic assignment + // Use IP + User-Agent as fingerprint for consistent assignment (cookieless) + const headers = await import("next/headers").then((m) => m.headers()) + const userAgent = headers.get("user-agent") || "" + const forwardedFor = + headers.get("x-forwarded-for") || headers.get("x-real-ip") || "unknown" + const fingerprint = `${forwardedFor}-${userAgent}` + + // Use deterministic assignment to ensure consistency across requests + const variant = assignVariantDeterministic(testConfig, fingerprint) const newAssignment: ABTestAssignment = { experimentId: testConfig.id, experimentName: testConfig.name, @@ -52,28 +59,10 @@ export async function getABTestAssignment( assignedAt: Date.now(), } - // Set cookie synchronously to avoid re-render loops - const maxAge = 60 * 60 * 24 * 30 // 30 days - try { - cookieStore.set(cookieName, JSON.stringify(newAssignment), { - maxAge, - httpOnly: false, // Needs to be accessible by client for debugging - secure: IS_PROD, - sameSite: "lax", - path: "/", - }) - } catch (error) { - // Cookie setting might fail during SSR, that's okay - if (process.env.NODE_ENV === "development") { - console.log( - `[AB Test] ${testKey}: Cookie setting failed during SSR`, - error - ) - } - } - if (process.env.NODE_ENV === "development") { - console.log(`[AB Test] ${testKey}: New assignment - ${variant.name}`) + console.log( + `[AB Test] ${testKey}: New deterministic assignment - ${variant.name} (fingerprint: ${fingerprint.slice(0, 20)}...)` + ) } return newAssignment @@ -102,7 +91,8 @@ export function getVariantIndex(variantName: string, testKey: string): number { return variantIndex >= 0 ? variantIndex : 0 } -function assignVariant(config: ABTestConfig) { +// Deterministic assignment based on user fingerprint (cookieless) +function assignVariantDeterministic(config: ABTestConfig, fingerprint: string) { const totalWeight = config.variants.reduce( (sum, variant) => sum + variant.weight, 0 @@ -113,12 +103,21 @@ function assignVariant(config: ABTestConfig) { return config.variants[0] } - const random = Math.random() * totalWeight - let cumulativeWeight = 0 + // Use a better hash function for more uniform distribution + // This is a simple implementation of djb2 hash algorithm + let hash = 5381 + for (let i = 0; i < fingerprint.length; i++) { + hash = (hash << 5) + hash + fingerprint.charCodeAt(i) + } + // Ensure positive value and create uniform distribution + const normalized = Math.abs(hash) / 0x7fffffff // Max 32-bit signed int + const weighted = normalized * totalWeight + + let cumulativeWeight = 0 for (const variant of config.variants) { cumulativeWeight += variant.weight - if (random <= cumulativeWeight) { + if (weighted <= cumulativeWeight) { return variant } } From 68c3c5ef7830e4a9def1ead8686b2fabe97406d5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 19:05:55 -0700 Subject: [PATCH 257/368] feat: use Matomo API integration for AB config --- app/api/ab-config/route.ts | 154 ++++++++++++++++++++++++++++++ src/components/AB/TestWrapper.tsx | 10 +- src/lib/ab-testing/config.ts | 119 +++++++++++++++++------ src/lib/ab-testing/server.ts | 31 ++---- 4 files changed, 259 insertions(+), 55 deletions(-) create mode 100644 app/api/ab-config/route.ts diff --git a/app/api/ab-config/route.ts b/app/api/ab-config/route.ts new file mode 100644 index 00000000000..5c2741ab448 --- /dev/null +++ b/app/api/ab-config/route.ts @@ -0,0 +1,154 @@ +import { NextResponse } from "next/server" + +type MatomoExperiment = { + idexperiment: string + name: string + status: string + variations: Array<{ + name: string + percentage: number + }> +} + +type ABTestConfig = { + id: string + enabled: boolean + variants: Array<{ + name: string + weight: number + }> +} + +export async function GET() { + try { + const matomoUrl = process.env.NEXT_PUBLIC_MATOMO_URL + const apiToken = process.env.MATOMO_API_TOKEN + + if (!matomoUrl || !apiToken) { + return NextResponse.json( + { error: "Matomo configuration missing" }, + { status: 500 } + ) + } + + // Get the site ID from environment + const siteId = process.env.NEXT_PUBLIC_MATOMO_SITE_ID || "1" + + // Try different API methods for A/B testing + const apiMethods = [ + "ExperimentsPlatform.getExperiments", + "AbTesting.getExperiments", + "Experiments.getExperiments", + `AbTesting.getAllExperiments&idSite=${siteId}`, + ] + + let experiments: MatomoExperiment[] = [] + let apiError = null + + for (const method of apiMethods) { + // Add cache busting for development + const cacheBuster = + process.env.NODE_ENV === "development" ? `&cb=${Date.now()}` : "" + const matomoApiUrl = `${matomoUrl}/index.php?module=API&method=${method}&format=json&token_auth=${apiToken}${cacheBuster}` + + try { + const response = await fetch(matomoApiUrl, { + next: { + revalidate: process.env.NODE_ENV === "development" ? 0 : 3600, + }, // No cache in dev + headers: { "User-Agent": "ethereum.org-ab-testing/1.0" }, + }) + + const data = await response.json() + + if (data.result !== "error" && Array.isArray(data)) { + experiments = data + break + } else if (data.result === "error") { + apiError = data.message + } + } catch (error) { + // Continue to next method + } + } + + // If no API method worked, use fallback + if (experiments.length === 0) { + console.warn( + `[AB Config] All API methods failed. Last error: ${apiError}` + ) + + const fallbackConfig = { + AppTest: { + id: "1", + enabled: true, + variants: [ + { name: "Original", weight: 50 }, + { name: "Variation1", weight: 50 }, + ], + }, + } + + return NextResponse.json(fallbackConfig, { + headers: { + "Cache-Control": "s-max-age=300, stale-while-revalidate=600", + }, + }) + } + + // Transform Matomo experiments to our config format + const config: Record = {} + + experiments.forEach((exp) => { + // Include running experiments (Matomo uses "running" not "active") + if ( + exp.status === "running" && + exp.variations && + exp.variations.length > 0 + ) { + // Calculate Original variant weight (100% - sum of all variations) + const variationsTotalWeight = exp.variations.reduce( + (sum, variation) => { + return sum + (variation.percentage || 0) + }, + 0 + ) + const originalWeight = 100 - variationsTotalWeight + + // Build variants array starting with "Original" + const variants = [{ name: "Original", weight: originalWeight }] + + // Add variations from Matomo (use actual percentages) + exp.variations.forEach((variation) => { + variants.push({ + name: variation.name, + weight: variation.percentage || 0, + }) + }) + + config[exp.name] = { + id: exp.idexperiment, + enabled: true, + variants: variants, + } + } + }) + + return NextResponse.json(config, { + headers: { + "Cache-Control": "s-max-age=3600, stale-while-revalidate=7200", + }, + }) + } catch (error) { + console.error("[AB Config] Failed to fetch AB test configuration:", error) + + return NextResponse.json( + {}, + { + headers: { + "Cache-Control": "no-cache", + }, + } + ) + } +} diff --git a/src/components/AB/TestWrapper.tsx b/src/components/AB/TestWrapper.tsx index 5a609d877bf..a8b279e9b86 100644 --- a/src/components/AB/TestWrapper.tsx +++ b/src/components/AB/TestWrapper.tsx @@ -34,16 +34,18 @@ const ABTestWrapper = async ({ const selectedVariant = variants[variantIndex] || variants[0] // Get available variants for debug panel - const configs = getABTestConfigs() + const configs = await getABTestConfigs() const availableVariants = configs[testKey]?.variants.map((v) => v.name) || [] return ( <> - {/* Track assignment - existing Matomo opt-out logic will handle filtering */} - + {/* Track assignment - only in production, not in preview */} + {!IS_PREVIEW_DEPLOY && ( + + )} - {/* Debug panel for development */} + {/* Preview panel for development and preview deploys */} {(!IS_PROD || IS_PREVIEW_DEPLOY) && ( | null = null +let cacheTimestamp = 0 +const CACHE_DURATION = 60 * 60 * 1000 // 1 hour in milliseconds + +async function fetchConfigFromAPI(): Promise> { + try { + // Build the full URL for the API route + const baseUrl = process.env.VERCEL_URL + ? `https://${process.env.VERCEL_URL}` + : process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000" + + const response = await fetch(`${baseUrl}/api/ab-config`, { + next: { revalidate: 3600 }, // Next.js cache for 1 hour + }) -function parseVariantWeights( - envKey: string -): { name: string; weight: number }[] { - // Format: "original:50,variant_b:30,variant_c:20" - const variantString = getEnvVar(envKey, "original:100") - - return variantString.split(",").map((variant) => { - const [name, weight] = variant.split(":") - return { - name: name.trim(), - weight: parseInt(weight.trim()) || 0, + if (!response.ok) { + console.error( + `[AB Config] API returned ${response.status}: ${response.statusText}` + ) + return {} } - }) + + return await response.json() + } catch (error) { + console.error("[AB Config] Failed to fetch from API:", error) + return {} + } +} + +function getFallbackConfig(): Record { + // Fallback configuration when API fails + return { + AppTest: { + name: "AppTest", + id: "fallback", + enabled: true, + variants: [ + { name: "Original", weight: 50 }, + { name: "Variation1", weight: 50 }, + ], + }, + } } -export const getABTestConfigs = (): Record => { +function getPreviewConfig(): Record { + // Preview mode: Show original variant with menu available return { - // Example test - you can add more here AppTest: { name: "AppTest", - id: getEnvVar("ABTEST_APP_TEST_ID", "1"), - enabled: getEnvVar("ABTEST_APP_TEST_ENABLED") === "true", - variants: parseVariantWeights("ABTEST_APP_TEST_VARIANTS"), + id: "preview", + enabled: true, + variants: [ + { name: "Original", weight: 100 }, + { name: "Variation1", weight: 0 }, // Available in menu but not randomly assigned + ], }, - // Add more tests as needed: - // walletCardLayout: { - // name: "WalletCardLayout", - // id: getEnvVar("ABTEST_WALLET_CARD_LAYOUT_ID", "2"), - // enabled: getEnvVar("ABTEST_WALLET_CARD_LAYOUT_ENABLED") === "true", - // variants: parseVariantWeights("ABTEST_WALLET_CARD_LAYOUT_VARIANTS") - // } } } + +export const getABTestConfigs = async (): Promise< + Record +> => { + // Preview mode: Show menu with original default + if (IS_PREVIEW_DEPLOY) { + return getPreviewConfig() + } + + // Check cache first + const now = Date.now() + if (configCache && now - cacheTimestamp < CACHE_DURATION) { + return configCache + } + + // Fetch from API + const apiConfig = await fetchConfigFromAPI() + + // If API returned empty config, use fallback + const finalConfig = + Object.keys(apiConfig).length > 0 ? apiConfig : getFallbackConfig() + + if (Object.keys(apiConfig).length === 0) { + console.warn("[AB Config] Using fallback configuration due to API failure") + } + + // Update cache + configCache = finalConfig + cacheTimestamp = now + + return finalConfig +} + +// Synchronous version for backward compatibility (uses cache) +export const getABTestConfigsSync = (): Record => { + if (IS_PREVIEW_DEPLOY) { + return getPreviewConfig() + } + + return configCache || getFallbackConfig() +} diff --git a/src/lib/ab-testing/server.ts b/src/lib/ab-testing/server.ts index ac61a739607..bca7d002adb 100644 --- a/src/lib/ab-testing/server.ts +++ b/src/lib/ab-testing/server.ts @@ -2,19 +2,16 @@ import { cookies } from "next/headers" import { AB_TEST_COOKIE_PREFIX } from "../constants" -import { getABTestConfigs } from "./config" +import { getABTestConfigs, getABTestConfigsSync } from "./config" import { ABTestAssignment, ABTestConfig } from "./types" export async function getABTestAssignment( testKey: string ): Promise { - const configs = getABTestConfigs() + const configs = await getABTestConfigs() const testConfig = configs[testKey] if (!testConfig || !testConfig.enabled) { - if (process.env.NODE_ENV === "development") { - console.log(`[AB Test] ${testKey} is disabled or not found`) - } return null } @@ -28,22 +25,14 @@ export async function getABTestAssignment( // Validate that the variant still exists in current config if (testConfig.variants.some((v) => v.name === parsed.variant)) { return parsed - } else { - if (process.env.NODE_ENV === "development") { - console.log( - `[AB Test] ${testKey}: Variant ${parsed.variant} no longer exists, reassigning` - ) - } } } catch (error) { - if (process.env.NODE_ENV === "development") { - console.log(`[AB Test] ${testKey}: Invalid cookie format, reassigning`) - } + // Invalid cookie format, continue to reassign } } // If no valid existing assignment, create deterministic assignment - // Use IP + User-Agent as fingerprint for consistent assignment (cookieless) + // Use IP + User-Agent as fingerprint for consistent assignment (cookie-less) const headers = await import("next/headers").then((m) => m.headers()) const userAgent = headers.get("user-agent") || "" const forwardedFor = @@ -59,17 +48,11 @@ export async function getABTestAssignment( assignedAt: Date.now(), } - if (process.env.NODE_ENV === "development") { - console.log( - `[AB Test] ${testKey}: New deterministic assignment - ${variant.name} (fingerprint: ${fingerprint.slice(0, 20)}...)` - ) - } - return newAssignment } export function getABTestConfig(testKey: string): ABTestConfig | null { - const configs = getABTestConfigs() + const configs = getABTestConfigsSync() const testConfig = configs[testKey] if (!testConfig || !testConfig.enabled) { @@ -80,7 +63,7 @@ export function getABTestConfig(testKey: string): ABTestConfig | null { } export function getVariantIndex(variantName: string, testKey: string): number { - const configs = getABTestConfigs() + const configs = getABTestConfigsSync() const testConfig = configs[testKey] if (!testConfig) return 0 @@ -91,7 +74,7 @@ export function getVariantIndex(variantName: string, testKey: string): number { return variantIndex >= 0 ? variantIndex : 0 } -// Deterministic assignment based on user fingerprint (cookieless) +// Deterministic assignment based on user fingerprint (cookie-less) function assignVariantDeterministic(config: ABTestConfig, fingerprint: string) { const totalWeight = config.variants.reduce( (sum, variant) => sum + variant.weight, From 47881a6af40069cea577a8ca425bbb0b467a1840 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 19:28:22 -0700 Subject: [PATCH 258/368] fix: show original if config unavailable --- app/api/ab-config/route.ts | 11 +---------- src/lib/ab-testing/config.ts | 14 ++------------ 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/app/api/ab-config/route.ts b/app/api/ab-config/route.ts index 5c2741ab448..b18bae87a00 100644 --- a/app/api/ab-config/route.ts +++ b/app/api/ab-config/route.ts @@ -78,16 +78,7 @@ export async function GET() { `[AB Config] All API methods failed. Last error: ${apiError}` ) - const fallbackConfig = { - AppTest: { - id: "1", - enabled: true, - variants: [ - { name: "Original", weight: 50 }, - { name: "Variation1", weight: 50 }, - ], - }, - } + const fallbackConfig = {} return NextResponse.json(fallbackConfig, { headers: { diff --git a/src/lib/ab-testing/config.ts b/src/lib/ab-testing/config.ts index 6cfb75b5422..3f9773e4a28 100644 --- a/src/lib/ab-testing/config.ts +++ b/src/lib/ab-testing/config.ts @@ -33,18 +33,8 @@ async function fetchConfigFromAPI(): Promise> { } function getFallbackConfig(): Record { - // Fallback configuration when API fails - return { - AppTest: { - name: "AppTest", - id: "fallback", - enabled: true, - variants: [ - { name: "Original", weight: 50 }, - { name: "Variation1", weight: 50 }, - ], - }, - } + // Fallback configuration when API fails - show original 100% of the time + return {} } function getPreviewConfig(): Record { From e7d64cb33138c395f1d2d272e3033321525fac18 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 19:29:01 -0700 Subject: [PATCH 259/368] docs: update ab-testing internal/claude docs --- CLAUDE.md | 52 +++++++++ docs/ab-testing.md | 279 +++++++++++++++++++++++++++++---------------- 2 files changed, 234 insertions(+), 97 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 990d67f59dc..d7631f1ddb4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -192,6 +192,58 @@ pnpm events-import # Import community events - `wagmi` - React hooks for Ethereum - `@rainbow-me/rainbowkit` - Wallet connection +## A/B Testing + +### Overview + +The site uses a GDPR-compliant, cookie-less A/B testing system integrated with Matomo. Tests are configured entirely through the Matomo dashboard with no code changes required. + +### Key Features + +- **Matomo API Integration** - Experiments configured in Matomo dashboard +- **Cookie-less Tracking** - Uses deterministic IP + User-Agent fingerprinting +- **Server-side Rendering** - No layout shifts, consistent variants on first load +- **Real-time Updates** - Change weights instantly via Matomo (no deployments) +- **Preview Mode** - Debug panel available in development and preview environments +- **Automatic Fallbacks** - Graceful degradation when API fails (shows original variant) + +### Adding a New A/B Test + +1. **Create experiment in Matomo dashboard**: + - Go to Experiments → Manage Experiments + - Create new experiment with desired name (e.g., "HomepageHero") + - Add variations with weights (original is implicit) + - Set status to "running" + +2. **Implement in component**: + ```tsx + import ABTestWrapper from "@/components/AB/TestWrapper" + + , + + ]} + fallback={} + /> + ``` + +**No TypeScript changes required** - the system automatically fetches configuration from Matomo. + +### Architecture + +- **`/api/ab-config`** - Fetches experiment data from Matomo API +- **`src/lib/ab-testing/`** - Core logic for assignment and tracking +- **`src/components/AB/`** - React components for testing and debugging + +### Environment Variables + +Required for Matomo integration: +- `NEXT_PUBLIC_MATOMO_URL` - Matomo instance URL +- `NEXT_PUBLIC_MATOMO_SITE_ID` - Site ID in Matomo +- `MATOMO_API_TOKEN` - API token with experiments access + ## Deployment - **Platform**: Netlify (config in `netlify.toml`) diff --git a/docs/ab-testing.md b/docs/ab-testing.md index 49e72b16236..31f959abc43 100644 --- a/docs/ab-testing.md +++ b/docs/ab-testing.md @@ -1,162 +1,247 @@ # A/B Testing Implementation Guide -This guide explains how to implement server-side A/B tests on ethereum.org using our Matomo integration. +This guide explains how to implement server-side A/B tests on ethereum.org using our Matomo API integration. ## Overview Our A/B testing system provides: -- **Server-side rendering** - Users see consistent variants on first page load -- **Matomo integration** - Automatic tracking of test participation and conversions -- **Multi-variant support** - Test 2+ variations with configurable weights -- **Cookie persistence** - Users stay in the same test group across sessions (30 days) + +- **Server-side rendering** - Users see consistent variants on first page load with no layout shifts +- **Matomo API integration** - Tests configured entirely in Matomo dashboard, no code deployments needed +- **GDPR compliance** - Cookie-less tracking using deterministic fingerprinting (IP + User-Agent) +- **Multi-variant support** - Test 2+ variations with configurable weights / traffic splits +- **Real-time updates** - Adjust experiment weights instantly via Matomo dashboard - **Type safety** - Full TypeScript support with compile-time checks +- **Automatic fallbacks** - Graceful degradation when API fails (shows original variant) ## Quick Start -### 1. Configure Your Test +### 1. Set Up Goals in Matomo (Design/Product Team) -Add environment variables to `.env.local`: +Before creating experiments, ensure you have proper **Goals** configured in Matomo to measure test success: -```bash -# Enable the test -ABTEST_MY_TEST_NAME_ENABLED=true -# Matomo experiment ID (from your Matomo dashboard) -ABTEST_MY_TEST_NAME_ID=1 -# Variant weights (can be any positive numbers) -ABTEST_MY_TEST_NAME_VARIANTS="original:50,variant_b:50" -``` +1. Go to **Goals** → **Manage Goals** in your Matomo dashboard +2. Create relevant goals for your test (e.g., "Newsletter Signup", "Wallet Connection", "Page Engagement") +3. Define conversion criteria (URL visits, events, etc.) -### 2. Add the Test Config - -Update `src/lib/ab-testing/config.ts`: - -```typescript -export const getABTestConfigs = (): Record => { - return { - // ...existing tests - myTestName: { - name: "MyTestName", // Must match Matomo experiment name - id: getEnvVar("ABTEST_MY_TEST_NAME_ID", "1"), - enabled: getEnvVar("ABTEST_MY_TEST_NAME_ENABLED") === "true", - variants: parseVariantWeights("ABTEST_MY_TEST_NAME_VARIANTS") - } - } -} -``` +This step is important for measuring experiment effectiveness and should be done by the design/product team before technical implementation. + +### 2. Create Experiment in Matomo -### 3. Implement in Your Component +1. Go to your Matomo dashboard → **A/B Tests** → **Manage A/B tests** +2. Click **Create new A/B test** +3. Define your experiment: + - **Name**: Choose a clear name (e.g., "HomepageHero", "WalletCardLayout") + - **Hypothesis**: Explain what you predict to happen when you run the A/B test, what the outcome will be and why it will happen. + - **Description**: Provide details about the test and its purpose + - **Variations**: Add your variants (e.g., "NewDesign", "AlternativeLayout") +4. Define remainder of config: + - **Success metrics**: Goals you want to track (select from previously created goals) + - **Success conditions**: Statistical thresholds + - **Target pages**: Specify the pages where this test will run (e.g., `/`, `/wallet`, etc.) + - **Traffic allocation**: Set percentage weights for each variant + - **Schedule**: Optionally set start/end dates + +### 3. Implement in Your Component (Development Team) ```tsx -import ABTestWrapper from "@/components/ABTestWrapper" +import ABTestWrapper from "@/components/AB/TestWrapper" export default function MyPage() { return (

    My Page

    - + , - + , // Index 0: Original/existing variant + , // Index 1: First test variation ]} - fallback={} // Optional: shown if test is disabled />
    ) } ``` -## Environment Variable Naming Convention +### 4. Experiment Activation -- `ABTEST_[TEST_NAME]_ENABLED` - Boolean to enable/disable test -- `ABTEST_[TEST_NAME]_ID` - Matomo experiment ID (number or string) -- `ABTEST_[TEST_NAME]_VARIANTS` - Comma-separated variant definitions +The experiment will automatically start running when: -**Test name format:** Use UPPERCASE_SNAKE_CASE for env vars, but camelCase for the testKey. +1. **Your code is deployed** with the `ABTestWrapper` component +2. **The first user visits** the page where the component is implemented +3. **Matomo detects the experiment** and begins tracking -Example: -- Env var: `ABTEST_HOMEPAGE_CTA_BUTTON_ENABLED` -- Config key: `homepageCtaButton` -- testKey: `"homepageCtaButton"` +**Manual Control:** +- Use the **Schedule** settings in Matomo to control start/end dates +- Experiments respect their configured schedule automatically +- You can pause/resume experiments anytime in the Matomo dashboard ## Multi-Variant Testing Support for 3+ variants: -```typescript -// Environment variable -ABTEST_WALLET_LAYOUT_VARIANTS="original:40,list:30,grid:20,carousel:10" +```tsx +// Matomo experiment with: +// - Original: 40% (implicit) +// - ListLayout: 30% +// - GridLayout: 20% +// - CarouselLayout: 10% -// Component usage , // original (40% weight) - , // list (30% weight) - , // grid (20% weight) - // carousel (10% weight) + , // Index 0: Original (40% weight) + , // Index 1: ListLayout (30% weight) + , // Index 2: GridLayout (20% weight) + , // Index 3: CarouselLayout (10% weight) ]} /> ``` -## Matomo Setup +**Important**: Variant array order must match the order of variations in your Matomo experiment. + +## How It Works + +### Cookie-less Tracking + +- Uses deterministic assignment based on IP address + User-Agent fingerprint +- Same user always gets same variant (consistent experience) +- GDPR compliant - no cookies or personal data storage required +- Users can't manually switch variants (prevents data pollution) + +### API Integration + +- `/api/ab-config` endpoint fetches experiment data from Matomo API +- Caches results for 1 hour to reduce API calls +- Real-time cache busting in development environment +- Automatic fallback to original variant when API fails + +## Development Workflow + +### Local Development + +1. Create your experiment in Matomo (set to "running") +2. Implement `ABTestWrapper` in your component +3. Test locally - the debug panel shows current assignment +4. Adjust weights in Matomo dashboard to test different scenarios + +### Preview Mode + +- Preview deployments show debug panel with variant selector +- No tracking occurs in preview mode +- Allows manual testing of all variants + +### Production + +1. Deploy your component with `ABTestWrapper` +2. Monitor experiment in Matomo dashboard +3. Adjust traffic allocation as needed +4. Analyze results and implement winning variant + +## Environment Variables + +Required for Matomo integration: + +```bash +# Matomo instance URL +NEXT_PUBLIC_MATOMO_URL=https://your-instance.matomo.cloud/ + +# Matomo site ID +NEXT_PUBLIC_MATOMO_SITE_ID=4 -### 1. Create Experiment in Matomo -1. Go to your Matomo dashboard -2. Navigate to "Experiments" → "Manage Experiments" -3. Create new experiment with: - - **Name**: Exact match to your config name (e.g., "MyTestName") - - **Variations**: Match your variant names (e.g., "original", "variant_b") - - **Traffic allocation**: Can be different from your code weights +# Matomo API token (with experiments access) +MATOMO_API_TOKEN=your_api_token_here -### 2. Get Experiment ID -- Copy the experiment ID from Matomo -- Use it in your `ABTEST_[TEST_NAME]_ID` env var +# Preview mode flag +IS_PREVIEW_DEPLOY=false +``` ## Best Practices +### Experiment Naming + +- Use clear, descriptive names that match your component purpose +- Be consistent: `testKey` in code must match Matomo experiment name exactly +- Examples: "HomepageHero", "WalletCardLayout", "CheckoutFlow" + ### Component Design -- Keep variants as similar as possible (same props, structure) -- Use consistent naming between Matomo and code -- Always provide a fallback for when tests are disabled -### Variant Weights -- Use meaningful numbers (50:50, 70:30, etc.) -- Weights don't need to sum to 100 -- Can adjust without code changes +- Keep variants as similar as possible (same props, structure) +- Always provide a meaningful fallback component +- Test all variants in Storybook before deploying ### Testing Strategy -1. **Local Development**: Test with `ENABLED=true` and different weights -2. **Staging**: Verify Matomo tracking works -3. **Production**: Start with small traffic allocation (10-20%) + +1. **Local Development**: Test with different weights to verify all variants work +2. **Preview**: Verify Matomo tracking integration +3. **Production**: Start with small traffic allocation (10-20%), then scale up ### Performance -- Server-side rendering means no layout shifts -- Minimal JavaScript overhead (only tracking) -- Cookies are lightweight and scoped + +- Server-side rendering prevents layout shifts +- Minimal JavaScript overhead (only tracking code) +- API responses are cached to reduce latency +- Automatic fallback ensures site never breaks ## Troubleshooting ### Test Not Showing Variants -1. Check `ENABLED=true` in env vars -2. Verify test name matches config key exactly -3. Check browser console for errors -### Matomo Not Tracking -1. Verify Matomo experiment ID matches -2. Check experiment name matches exactly -3. Ensure user hasn't opted out of tracking -4. Check browser console for Matomo debug logs +1. **Check Matomo**: Ensure experiment status is "running" +2. **Check naming**: Verify `testKey` matches Matomo experiment name exactly +3. **Check API**: Visit `/api/ab-config` to see if your experiment appears +4. **Check console**: Look for AB testing errors in browser dev tools ### Same Variant Always Shows -1. Clear cookies: `_pk_abtest_[testname]` -2. Check variant weights are > 0 -3. Verify random assignment logic -## Architecture Notes +1. **Fingerprint consistency**: Same IP + User-Agent = same variant (this is intentional) +2. **Test from different devices/networks** to see other variants +3. **Use preview mode** to manually test all variants +4. **Check weights**: Ensure all variants have weight > 0 in Matomo + +### Matomo Not Tracking + +1. **Verify experiment ID**: Check that Matomo experiment ID is being used +2. **Check experiment name**: Must match exactly between code and Matomo +3. **Verify user hasn't opted out** of tracking +4. **Preview mode**: No tracking occurs in preview deployments (intentional) + +### API Issues + +1. **Check environment variables**: Ensure all Matomo config is set +2. **Verify API token**: Must have "experiments" permission in Matomo +3. **Check cache**: API responses cached for 1 hour, use dev mode for real-time updates +4. **Fallback behavior**: When API fails, all tests show original variant (safe default) + +## Debug Panel + +In development and preview environments, a debug panel appears showing: + +- Current test assignment +- Available variants +- Manual variant selector (preview mode only) +- Assignment metadata (experiment ID, fingerprint hash) + +The panel helps verify your test is working correctly before production deployment. + +## Architecture + +### Core Files + +- `app/api/ab-config/route.ts` - Matomo API integration +- `src/lib/ab-testing/config.ts` - Configuration management and caching +- `src/lib/ab-testing/server.ts` - Assignment logic and fingerprinting +- `src/components/AB/TestWrapper.tsx` - Main React component +- `src/components/AB/TestDebugPanel.tsx` - Development debug interface + +### Data Flow + +1. Component renders with `ABTestWrapper` +2. Server fetches user fingerprint (IP + User-Agent) +3. System checks cache, then fetches experiment config from Matomo API +4. Deterministic assignment based on fingerprint and experiment weights +5. Appropriate variant component renders +6. Tracking data sent to Matomo (production only) -- **Cookies**: Uses `_pk_abtest_[testKey]` following Matomo naming conventions -- **Persistence**: 30 days (compliant with existing cookie policy) -- **SSR**: True server-side rendering with no hydration mismatches -- **Fallbacks**: Graceful degradation when tests are disabled or fail +This architecture ensures consistent, performant, and privacy-compliant A/B testing across the entire site. From 6d1d7012740e871bae9adb32fd8104c25a025e37 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 19:50:37 -0700 Subject: [PATCH 260/368] revert: cookie usage --- src/components/AB/TestDebugPanel.tsx | 86 ++-------------------------- src/components/AB/TestWrapper.tsx | 2 +- src/lib/ab-testing/actions.ts | 56 ++---------------- src/lib/ab-testing/server.ts | 22 +------ src/lib/constants.ts | 1 - 5 files changed, 10 insertions(+), 157 deletions(-) diff --git a/src/components/AB/TestDebugPanel.tsx b/src/components/AB/TestDebugPanel.tsx index e00e9d1eafa..5fac21600bd 100644 --- a/src/components/AB/TestDebugPanel.tsx +++ b/src/components/AB/TestDebugPanel.tsx @@ -5,11 +5,9 @@ import { useRouter } from "next/navigation" import { cn } from "@/lib/utils/cn" -import { AB_TEST_COOKIE_PREFIX } from "@/lib/constants" - import { Button } from "../ui/buttons/Button" -import { clearABTestCookie, forceABTestVariant } from "@/lib/ab-testing/actions" +import { forceABTestVariant } from "@/lib/ab-testing/actions" import { ABTestAssignment } from "@/lib/ab-testing/types" type ABTestDebugPanelProps = { @@ -33,28 +31,11 @@ export function ABTestDebugPanel({ setLocalAssignment(currentAssignment) }, [currentAssignment]) - const cookieName = AB_TEST_COOKIE_PREFIX + testKey - // Check if cookie exists client-side and set fallback if needed - useEffect(() => { - if (currentAssignment) { - const cookieExists = document.cookie.includes(cookieName) - - if (!cookieExists) { - console.log(`[AB Test Debug] Setting fallback cookie for ${testKey}`) - document.cookie = `${cookieName}=${JSON.stringify(currentAssignment)}; max-age=${60 * 60 * 24 * 30}; path=/; samesite=lax` - } - } - }, [cookieName, currentAssignment, testKey]) - const forceVariant = async (variantName: string) => { try { const newAssignment = await forceABTestVariant(testKey, variantName) setLocalAssignment(newAssignment) - // Fallback: Set cookie client-side if server action doesn't persist - document.cookie = `${cookieName}=${JSON.stringify(newAssignment)}; max-age=${60 * 60 * 24 * 30}; path=/; samesite=lax` - - // Use transition for smoother updates without full refresh startTransition(() => { router.refresh() }) @@ -63,41 +44,13 @@ export function ABTestDebugPanel({ } } - const clearCookie = async () => { - try { - await clearABTestCookie(testKey) - - // Fallback: Clear cookie client-side as well - document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/` - - setLocalAssignment(null) - // Use transition for smoother updates without full refresh - startTransition(() => { - router.refresh() - }) - } catch (error) { - console.error("Failed to clear cookie:", error) - } - } - - const resetAllTests = () => { - // Clear all AB test cookies and reload page - document.cookie.split(";").forEach((cookie) => { - const [name] = cookie.split("=") - if (name.trim().startsWith(AB_TEST_COOKIE_PREFIX)) { - document.cookie = `${name.trim()}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/` - } - }) - window.location.reload() - } - return ( -
    +
    {isOpen && ( @@ -111,16 +64,9 @@ export function ABTestDebugPanel({ Loading... )}
    -
    - Cookie:{" "} - {typeof window !== "undefined" && - document.cookie.includes(AB_TEST_COOKIE_PREFIX + testKey) - ? "✓ Set" - : "✗ Missing"} -
    - Force Variant: + Force variant:
    {availableVariants.map((variant) => ( - -

    )} diff --git a/src/components/AB/TestWrapper.tsx b/src/components/AB/TestWrapper.tsx index a8b279e9b86..929aa35a0f3 100644 --- a/src/components/AB/TestWrapper.tsx +++ b/src/components/AB/TestWrapper.tsx @@ -21,7 +21,7 @@ const ABTestWrapper = async ({ fallback, }: ABTestWrapperProps) => { try { - // Get deterministic assignment (cookieless, based on user fingerprint) + // Get deterministic assignment (cookie-less, based on fingerprint) const assignment = await getABTestAssignment(testKey) if (!assignment) { diff --git a/src/lib/ab-testing/actions.ts b/src/lib/ab-testing/actions.ts index f1dae78f61c..b279812eee9 100644 --- a/src/lib/ab-testing/actions.ts +++ b/src/lib/ab-testing/actions.ts @@ -1,34 +1,12 @@ "use server" -import { cookies } from "next/headers" - -import { AB_TEST_COOKIE_PREFIX } from "../constants" -import { IS_PROD } from "../utils/env" - import { getABTestConfigs } from "./config" import { ABTestAssignment } from "./types" -// Server Action to set AB test assignment cookie -export async function setABTestCookie( - testKey: string, - assignment: ABTestAssignment -) { - const cookieStore = await cookies() - const cookieName = AB_TEST_COOKIE_PREFIX + testKey - const maxAge = 60 * 60 * 24 * 30 // 30 days - - cookieStore.set(cookieName, JSON.stringify(assignment), { - maxAge, - httpOnly: false, // Needs to be accessible by client for potential debugging - secure: IS_PROD, - sameSite: "lax", - path: "/", - }) -} - -// Server action to manually set a specific variant for testing +// Server action to create a specific variant assignment for debug panel testing +// Note: This doesn't persist anywhere - it's just for debug panel state export async function forceABTestVariant(testKey: string, variantName: string) { - const configs = getABTestConfigs() + const configs = await getABTestConfigs() const testConfig = configs[testKey] if (!testConfig) { @@ -42,36 +20,10 @@ export async function forceABTestVariant(testKey: string, variantName: string) { const assignment: ABTestAssignment = { experimentId: testConfig.id, - experimentName: testConfig.name, + experimentName: testConfig.name || testKey, variant: variantName, assignedAt: Date.now(), } - const cookieStore = await cookies() - const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` - const maxAge = 60 * 60 * 24 * 30 // 30 days - - cookieStore.set(cookieName, JSON.stringify(assignment), { - maxAge, - httpOnly: false, - secure: IS_PROD, - sameSite: "lax", - path: "/", - }) - - if (process.env.NODE_ENV === "development") { - console.log(`[AB Test] Forced variant ${variantName} for test ${testKey}`) - } return assignment } - -// Server action to clear AB test cookie -export async function clearABTestCookie(testKey: string) { - const cookieStore = await cookies() - const cookieName = `${AB_TEST_COOKIE_PREFIX}${testKey}` - - cookieStore.delete(cookieName) - if (process.env.NODE_ENV === "development") { - console.log(`[AB Test] Cleared cookie for test ${testKey}`) - } -} diff --git a/src/lib/ab-testing/server.ts b/src/lib/ab-testing/server.ts index bca7d002adb..a7bd202c004 100644 --- a/src/lib/ab-testing/server.ts +++ b/src/lib/ab-testing/server.ts @@ -1,7 +1,3 @@ -import { cookies } from "next/headers" - -import { AB_TEST_COOKIE_PREFIX } from "../constants" - import { getABTestConfigs, getABTestConfigsSync } from "./config" import { ABTestAssignment, ABTestConfig } from "./types" @@ -15,23 +11,7 @@ export async function getABTestAssignment( return null } - const cookieStore = await cookies() - const cookieName = AB_TEST_COOKIE_PREFIX + testKey - const existingAssignment = cookieStore.get(cookieName) - - if (existingAssignment?.value) { - try { - const parsed: ABTestAssignment = JSON.parse(existingAssignment.value) - // Validate that the variant still exists in current config - if (testConfig.variants.some((v) => v.name === parsed.variant)) { - return parsed - } - } catch (error) { - // Invalid cookie format, continue to reassign - } - } - - // If no valid existing assignment, create deterministic assignment + // Create deterministic assignment // Use IP + User-Agent as fingerprint for consistent assignment (cookie-less) const headers = await import("next/headers").then((m) => m.headers()) const userAgent = headers.get("user-agent") || "" diff --git a/src/lib/constants.ts b/src/lib/constants.ts index f2c1ebd382e..6690c18bdc7 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -12,7 +12,6 @@ export const TRANSLATED_IMAGES_DIR = "/content/translations" export const PLACEHOLDER_IMAGE_DIR = "src/data/placeholders" export const INTERNAL_TUTORIALS_JSON = "src/data/internalTutorials.json" export const INTL_JSON_DIR = "src/intl" -export const AB_TEST_COOKIE_PREFIX = "_pk_abtest_" export const NULL_VALUE = "—" From 9d7fd492e0d9e91b120326259e0f04f04c8a13d5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 20:14:28 -0700 Subject: [PATCH 261/368] fix: use ls for dev variant handling --- src/components/AB/ClientABTestWrapper.tsx | 36 ++++++++++ src/components/AB/TestDebugPanel.tsx | 82 +++++++++-------------- src/components/AB/TestWrapper.tsx | 10 ++- 3 files changed, 74 insertions(+), 54 deletions(-) create mode 100644 src/components/AB/ClientABTestWrapper.tsx diff --git a/src/components/AB/ClientABTestWrapper.tsx b/src/components/AB/ClientABTestWrapper.tsx new file mode 100644 index 00000000000..a2c8211eda7 --- /dev/null +++ b/src/components/AB/ClientABTestWrapper.tsx @@ -0,0 +1,36 @@ +"use client" + +import { IS_PREVIEW_DEPLOY, IS_PROD } from "@/lib/utils/env" + +import { useIsClient } from "@/hooks/useIsClient" +import { useLocalStorage } from "@/hooks/useLocalStorage" +import { ABTestVariants } from "@/lib/ab-testing/types" + +type ClientABTestWrapperProps = { + testKey: string + variants: ABTestVariants + serverVariantIndex: number +} + +export function ClientABTestWrapper({ + testKey, + variants, + serverVariantIndex, +}: ClientABTestWrapperProps) { + const [localOverride] = useLocalStorage( + `ab-test-${testKey}`, + null + ) + const isClient = useIsClient() + + // Dev mode or preview deploy: use localStorage override or default to original (index 0) + if (!IS_PROD || IS_PREVIEW_DEPLOY) { + if (isClient && localOverride !== null && localOverride < variants.length) { + return <>{variants[localOverride]} + } + return <>{variants[0]} // Always default to original in dev/preview + } + + // Production: use server-determined variant + return <>{variants[serverVariantIndex] || variants[0]} +} diff --git a/src/components/AB/TestDebugPanel.tsx b/src/components/AB/TestDebugPanel.tsx index 5fac21600bd..64f2495f8c7 100644 --- a/src/components/AB/TestDebugPanel.tsx +++ b/src/components/AB/TestDebugPanel.tsx @@ -1,13 +1,13 @@ "use client" -import { useEffect, useState, useTransition } from "react" -import { useRouter } from "next/navigation" +import { useRef, useState } from "react" import { cn } from "@/lib/utils/cn" import { Button } from "../ui/buttons/Button" -import { forceABTestVariant } from "@/lib/ab-testing/actions" +import { useLocalStorage } from "@/hooks/useLocalStorage" +import { useOnClickOutside } from "@/hooks/useOnClickOutside" import { ABTestAssignment } from "@/lib/ab-testing/types" type ABTestDebugPanelProps = { @@ -18,34 +18,26 @@ type ABTestDebugPanelProps = { export function ABTestDebugPanel({ testKey, - currentAssignment, availableVariants, }: ABTestDebugPanelProps) { const [isOpen, setIsOpen] = useState(false) - const [isPending, startTransition] = useTransition() - const [localAssignment, setLocalAssignment] = useState(currentAssignment) - const router = useRouter() - - // Sync local state when server state changes - useEffect(() => { - setLocalAssignment(currentAssignment) - }, [currentAssignment]) + const [selectedVariant, setSelectedVariant] = useLocalStorage( + `ab-test-${testKey}`, + null + ) + const panelRef = useRef(null) - const forceVariant = async (variantName: string) => { - try { - const newAssignment = await forceABTestVariant(testKey, variantName) - setLocalAssignment(newAssignment) + useOnClickOutside(panelRef, () => setIsOpen(false)) - startTransition(() => { - router.refresh() - }) - } catch (error) { - console.error("Failed to force variant:", error) - } + const forceVariant = (variantIndex: number) => { + setSelectedVariant(variantIndex) } return ( -
    +
    - Current: {localAssignment?.variant || "None"} - {isPending && ( - Loading... - )} -
    -
    -
    - Force variant: -
    - {availableVariants.map((variant) => ( - - ))} + Select variant:
    + {availableVariants.map((variant, index) => ( + + ))}
    )}
    diff --git a/src/components/AB/TestWrapper.tsx b/src/components/AB/TestWrapper.tsx index 929aa35a0f3..4e0f3270c69 100644 --- a/src/components/AB/TestWrapper.tsx +++ b/src/components/AB/TestWrapper.tsx @@ -2,6 +2,7 @@ import { ReactNode } from "react" import { IS_PREVIEW_DEPLOY, IS_PROD } from "@/lib/utils/env" +import { ClientABTestWrapper } from "./ClientABTestWrapper" import { ABTestDebugPanel } from "./TestDebugPanel" import { ABTestTracker } from "./TestTracker" @@ -31,7 +32,6 @@ const ABTestWrapper = async ({ // Find the variant index based on the assignment const variantIndex = getVariantIndex(assignment.variant, testKey) - const selectedVariant = variants[variantIndex] || variants[0] // Get available variants for debug panel const configs = await getABTestConfigs() @@ -54,8 +54,12 @@ const ABTestWrapper = async ({ /> )} - {/* Render selected variant */} - {selectedVariant} + {/* Render variant with client-side override support */} + ) } catch (error) { From 167da73e7a3f8f4c89d8f6f5231a72224cf81d6b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 1 Jul 2025 22:03:24 -0700 Subject: [PATCH 262/368] fix: enabled logic, add scheduling logic --- app/api/ab-config/route.ts | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/app/api/ab-config/route.ts b/app/api/ab-config/route.ts index b18bae87a00..f0b3ddcdeb2 100644 --- a/app/api/ab-config/route.ts +++ b/app/api/ab-config/route.ts @@ -4,6 +4,8 @@ type MatomoExperiment = { idexperiment: string name: string status: string + start_date?: string + end_date?: string variations: Array<{ name: string percentage: number @@ -19,6 +21,30 @@ type ABTestConfig = { }> } +function isExperimentActive(experiment: MatomoExperiment): boolean { + const now = new Date() + + // Check start date - if scheduled for future, not active yet + if (experiment.start_date) { + const startDate = new Date(experiment.start_date) + if (now < startDate) { + return false // Not started yet + } + } + + // Check end date - if past end date, not active anymore + if (experiment.end_date) { + const endDate = new Date(experiment.end_date) + if (now > endDate) { + return false // Already ended + } + } + + // If no scheduling constraints, enabled if created or running + // If within time window, enabled if running + return ["created", "running"].includes(experiment.status) +} + export async function GET() { try { const matomoUrl = process.env.NEXT_PUBLIC_MATOMO_URL @@ -91,12 +117,8 @@ export async function GET() { const config: Record = {} experiments.forEach((exp) => { - // Include running experiments (Matomo uses "running" not "active") - if ( - exp.status === "running" && - exp.variations && - exp.variations.length > 0 - ) { + // Include all experiments with variations (let scheduling handle timing) + if (exp.variations && exp.variations.length > 0) { // Calculate Original variant weight (100% - sum of all variations) const variationsTotalWeight = exp.variations.reduce( (sum, variation) => { @@ -119,7 +141,7 @@ export async function GET() { config[exp.name] = { id: exp.idexperiment, - enabled: true, + enabled: isExperimentActive(exp), variants: variants, } } From 3ea9aac8a4ed1817f7f4c502f60df8fb8940b110 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 2 Jul 2025 07:57:11 -0700 Subject: [PATCH 263/368] chore: ab-testing clean up and patches --- app/api/ab-config/route.ts | 128 +++++++++++---------------- src/components/AB/TestDebugPanel.tsx | 11 +-- src/components/AB/TestTracker.tsx | 8 +- src/components/AB/TestWrapper.tsx | 31 +++---- src/lib/ab-testing/actions.ts | 29 ------ src/lib/ab-testing/config.ts | 94 -------------------- src/lib/ab-testing/index.ts | 9 +- src/lib/ab-testing/server.ts | 66 +++++++------- 8 files changed, 113 insertions(+), 263 deletions(-) delete mode 100644 src/lib/ab-testing/actions.ts delete mode 100644 src/lib/ab-testing/config.ts diff --git a/app/api/ab-config/route.ts b/app/api/ab-config/route.ts index f0b3ddcdeb2..fc5c4110046 100644 --- a/app/api/ab-config/route.ts +++ b/app/api/ab-config/route.ts @@ -1,5 +1,7 @@ import { NextResponse } from "next/server" +import { IS_PREVIEW_DEPLOY } from "@/lib/utils/env" + type MatomoExperiment = { idexperiment: string name: string @@ -21,31 +23,37 @@ type ABTestConfig = { }> } -function isExperimentActive(experiment: MatomoExperiment): boolean { +const isExperimentActive = (experiment: MatomoExperiment): boolean => { const now = new Date() // Check start date - if scheduled for future, not active yet if (experiment.start_date) { const startDate = new Date(experiment.start_date) - if (now < startDate) { - return false // Not started yet - } + if (now < startDate) return false } // Check end date - if past end date, not active anymore if (experiment.end_date) { const endDate = new Date(experiment.end_date) - if (now > endDate) { - return false // Already ended - } + if (now > endDate) return false } // If no scheduling constraints, enabled if created or running - // If within time window, enabled if running return ["created", "running"].includes(experiment.status) } +const getPreviewConfig = () => ({ + AppTest: { + id: "preview", + enabled: true, + variants: [{ name: "Original", weight: 100 }], + }, +}) + export async function GET() { + // Preview mode: Show menu with original default + if (IS_PREVIEW_DEPLOY) return NextResponse.json(getPreviewConfig()) + try { const matomoUrl = process.env.NEXT_PUBLIC_MATOMO_URL const apiToken = process.env.MATOMO_API_TOKEN @@ -57,95 +65,65 @@ export async function GET() { ) } - // Get the site ID from environment - const siteId = process.env.NEXT_PUBLIC_MATOMO_SITE_ID || "1" - - // Try different API methods for A/B testing - const apiMethods = [ - "ExperimentsPlatform.getExperiments", - "AbTesting.getExperiments", - "Experiments.getExperiments", - `AbTesting.getAllExperiments&idSite=${siteId}`, - ] - - let experiments: MatomoExperiment[] = [] - let apiError = null - - for (const method of apiMethods) { - // Add cache busting for development - const cacheBuster = - process.env.NODE_ENV === "development" ? `&cb=${Date.now()}` : "" - const matomoApiUrl = `${matomoUrl}/index.php?module=API&method=${method}&format=json&token_auth=${apiToken}${cacheBuster}` - - try { - const response = await fetch(matomoApiUrl, { - next: { - revalidate: process.env.NODE_ENV === "development" ? 0 : 3600, - }, // No cache in dev - headers: { "User-Agent": "ethereum.org-ab-testing/1.0" }, - }) - - const data = await response.json() - - if (data.result !== "error" && Array.isArray(data)) { - experiments = data - break - } else if (data.result === "error") { - apiError = data.message - } - } catch (error) { - // Continue to next method - } - } + const siteId = process.env.NEXT_PUBLIC_MATOMO_SITE_ID || "4" - // If no API method worked, use fallback - if (experiments.length === 0) { - console.warn( - `[AB Config] All API methods failed. Last error: ${apiError}` - ) + // Add cache busting for development + const cacheBuster = + process.env.NODE_ENV === "development" ? `&cb=${Date.now()}` : "" + const matomoApiUrl = `${matomoUrl}/index.php?module=API&method=AbTesting.getAllExperiments&idSite=${siteId}&format=json&token_auth=${apiToken}${cacheBuster}` - const fallbackConfig = {} + const response = await fetch(matomoApiUrl, { + next: { revalidate: process.env.NODE_ENV === "development" ? 0 : 3600 }, + headers: { "User-Agent": "ethereum.org-ab-testing/1.0" }, + }) - return NextResponse.json(fallbackConfig, { - headers: { - "Cache-Control": "s-max-age=300, stale-while-revalidate=600", - }, - }) + const data = await response.json() + + if (data.result === "error" || !Array.isArray(data)) { + console.error( + "[AB Config] Matomo API error:", + data.message || "Invalid response" + ) + return NextResponse.json( + {}, + { + headers: { + "Cache-Control": "s-max-age=300, stale-while-revalidate=600", + }, + } + ) } + const experiments: MatomoExperiment[] = data + // Transform Matomo experiments to our config format const config: Record = {} - experiments.forEach((exp) => { - // Include all experiments with variations (let scheduling handle timing) - if (exp.variations && exp.variations.length > 0) { + experiments + .filter((exp) => exp.variations && exp.variations.length > 0) + .forEach((exp) => { // Calculate Original variant weight (100% - sum of all variations) const variationsTotalWeight = exp.variations.reduce( - (sum, variation) => { - return sum + (variation.percentage || 0) - }, + (sum, variation) => sum + (variation.percentage || 0), 0 ) const originalWeight = 100 - variationsTotalWeight // Build variants array starting with "Original" - const variants = [{ name: "Original", weight: originalWeight }] - - // Add variations from Matomo (use actual percentages) - exp.variations.forEach((variation) => { - variants.push({ + const variants = [ + { name: "Original", weight: originalWeight }, + ...exp.variations.map((variation) => ({ name: variation.name, weight: variation.percentage || 0, - }) - }) + })), + ] config[exp.name] = { id: exp.idexperiment, enabled: isExperimentActive(exp), - variants: variants, + variants, } - } - }) + }) return NextResponse.json(config, { headers: { diff --git a/src/components/AB/TestDebugPanel.tsx b/src/components/AB/TestDebugPanel.tsx index 64f2495f8c7..bc5abba23e4 100644 --- a/src/components/AB/TestDebugPanel.tsx +++ b/src/components/AB/TestDebugPanel.tsx @@ -8,18 +8,16 @@ import { Button } from "../ui/buttons/Button" import { useLocalStorage } from "@/hooks/useLocalStorage" import { useOnClickOutside } from "@/hooks/useOnClickOutside" -import { ABTestAssignment } from "@/lib/ab-testing/types" type ABTestDebugPanelProps = { testKey: string - currentAssignment: ABTestAssignment | null availableVariants: string[] } -export function ABTestDebugPanel({ +export const ABTestDebugPanel = ({ testKey, availableVariants, -}: ABTestDebugPanelProps) { +}: ABTestDebugPanelProps) => { const [isOpen, setIsOpen] = useState(false) const [selectedVariant, setSelectedVariant] = useLocalStorage( `ab-test-${testKey}`, @@ -29,9 +27,8 @@ export function ABTestDebugPanel({ useOnClickOutside(panelRef, () => setIsOpen(false)) - const forceVariant = (variantIndex: number) => { + const forceVariant = (variantIndex: number) => setSelectedVariant(variantIndex) - } return (
    - Test: {testKey} + Experiment: {testKey}
    Select variant: diff --git a/src/components/AB/TestTracker.tsx b/src/components/AB/TestTracker.tsx index 96268711d88..a5a96909466 100644 --- a/src/components/AB/TestTracker.tsx +++ b/src/components/AB/TestTracker.tsx @@ -9,14 +9,10 @@ import { ABTestAssignment } from "@/lib/ab-testing/types" type ABTestTrackerProps = { assignment: ABTestAssignment - testKey?: string } -export function ABTestTracker({ assignment, testKey }: ABTestTrackerProps) { +export function ABTestTracker({ assignment }: ABTestTrackerProps) { useEffect(() => { - // Don't set cookies here - let server handle cookie persistence - // This component only handles Matomo tracking - if (!IS_PROD || IS_PREVIEW_DEPLOY) { console.debug( `DEV [Matomo] A/B test logged - Experiment: ${assignment.experimentName}, Variant: ${assignment.variant}` @@ -39,7 +35,7 @@ export function ABTestTracker({ assignment, testKey }: ABTestTrackerProps) { variation: assignment.variant, }, ] as [string, Record]) - }, [assignment, testKey]) + }, [assignment]) return null // This component doesn't render anything } diff --git a/src/components/AB/TestWrapper.tsx b/src/components/AB/TestWrapper.tsx index 4e0f3270c69..408d91d917c 100644 --- a/src/components/AB/TestWrapper.tsx +++ b/src/components/AB/TestWrapper.tsx @@ -6,8 +6,11 @@ import { ClientABTestWrapper } from "./ClientABTestWrapper" import { ABTestDebugPanel } from "./TestDebugPanel" import { ABTestTracker } from "./TestTracker" -import { getABTestConfigs } from "@/lib/ab-testing/config" -import { getABTestAssignment, getVariantIndex } from "@/lib/ab-testing/server" +import { + getABTestAssignment, + getABTestConfigs, + getVariantIndex, +} from "@/lib/ab-testing/server" import { ABTestVariants } from "@/lib/ab-testing/types" type ABTestWrapperProps = { @@ -22,34 +25,28 @@ const ABTestWrapper = async ({ fallback, }: ABTestWrapperProps) => { try { - // Get deterministic assignment (cookie-less, based on fingerprint) - const assignment = await getABTestAssignment(testKey) + // Get deterministic assignment and configs + const [assignment, configs] = await Promise.all([ + getABTestAssignment(testKey), + getABTestConfigs(), + ]) - if (!assignment) { - // If no assignment, render fallback - return <>{fallback || variants[0]} - } + if (!assignment) throw new Error("No AB test assignment found") // Find the variant index based on the assignment - const variantIndex = getVariantIndex(assignment.variant, testKey) - - // Get available variants for debug panel - const configs = await getABTestConfigs() + const variantIndex = getVariantIndex(assignment.variant, configs, testKey) const availableVariants = configs[testKey]?.variants.map((v) => v.name) || [] return ( <> - {/* Track assignment - only in production, not in preview */} - {!IS_PREVIEW_DEPLOY && ( - - )} + {/* Analogous to at app layout level, pushes "AbTesting::enter" in production */} + {/* Preview panel for development and preview deploys */} {(!IS_PROD || IS_PREVIEW_DEPLOY) && ( )} diff --git a/src/lib/ab-testing/actions.ts b/src/lib/ab-testing/actions.ts deleted file mode 100644 index b279812eee9..00000000000 --- a/src/lib/ab-testing/actions.ts +++ /dev/null @@ -1,29 +0,0 @@ -"use server" - -import { getABTestConfigs } from "./config" -import { ABTestAssignment } from "./types" - -// Server action to create a specific variant assignment for debug panel testing -// Note: This doesn't persist anywhere - it's just for debug panel state -export async function forceABTestVariant(testKey: string, variantName: string) { - const configs = await getABTestConfigs() - const testConfig = configs[testKey] - - if (!testConfig) { - throw new Error(`Test ${testKey} not found`) - } - - const variant = testConfig.variants.find((v) => v.name === variantName) - if (!variant) { - throw new Error(`Variant ${variantName} not found for test ${testKey}`) - } - - const assignment: ABTestAssignment = { - experimentId: testConfig.id, - experimentName: testConfig.name || testKey, - variant: variantName, - assignedAt: Date.now(), - } - - return assignment -} diff --git a/src/lib/ab-testing/config.ts b/src/lib/ab-testing/config.ts deleted file mode 100644 index 3f9773e4a28..00000000000 --- a/src/lib/ab-testing/config.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { IS_PREVIEW_DEPLOY } from "@/lib/utils/env" - -import { ABTestConfig } from "./types" - -// Cache for API responses to avoid repeated fetches -let configCache: Record | null = null -let cacheTimestamp = 0 -const CACHE_DURATION = 60 * 60 * 1000 // 1 hour in milliseconds - -async function fetchConfigFromAPI(): Promise> { - try { - // Build the full URL for the API route - const baseUrl = process.env.VERCEL_URL - ? `https://${process.env.VERCEL_URL}` - : process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000" - - const response = await fetch(`${baseUrl}/api/ab-config`, { - next: { revalidate: 3600 }, // Next.js cache for 1 hour - }) - - if (!response.ok) { - console.error( - `[AB Config] API returned ${response.status}: ${response.statusText}` - ) - return {} - } - - return await response.json() - } catch (error) { - console.error("[AB Config] Failed to fetch from API:", error) - return {} - } -} - -function getFallbackConfig(): Record { - // Fallback configuration when API fails - show original 100% of the time - return {} -} - -function getPreviewConfig(): Record { - // Preview mode: Show original variant with menu available - return { - AppTest: { - name: "AppTest", - id: "preview", - enabled: true, - variants: [ - { name: "Original", weight: 100 }, - { name: "Variation1", weight: 0 }, // Available in menu but not randomly assigned - ], - }, - } -} - -export const getABTestConfigs = async (): Promise< - Record -> => { - // Preview mode: Show menu with original default - if (IS_PREVIEW_DEPLOY) { - return getPreviewConfig() - } - - // Check cache first - const now = Date.now() - if (configCache && now - cacheTimestamp < CACHE_DURATION) { - return configCache - } - - // Fetch from API - const apiConfig = await fetchConfigFromAPI() - - // If API returned empty config, use fallback - const finalConfig = - Object.keys(apiConfig).length > 0 ? apiConfig : getFallbackConfig() - - if (Object.keys(apiConfig).length === 0) { - console.warn("[AB Config] Using fallback configuration due to API failure") - } - - // Update cache - configCache = finalConfig - cacheTimestamp = now - - return finalConfig -} - -// Synchronous version for backward compatibility (uses cache) -export const getABTestConfigsSync = (): Record => { - if (IS_PREVIEW_DEPLOY) { - return getPreviewConfig() - } - - return configCache || getFallbackConfig() -} diff --git a/src/lib/ab-testing/index.ts b/src/lib/ab-testing/index.ts index c893a73cad4..a4f23f1f235 100644 --- a/src/lib/ab-testing/index.ts +++ b/src/lib/ab-testing/index.ts @@ -1,11 +1,12 @@ // Types (safe for both client and server) export type { ABTestAssignment, ABTestConfig, ABTestVariants } from "./types" -// Configuration (server-safe) -export { getABTestConfigs } from "./config" - // Server utilities (only import these in server components) -export { getABTestAssignment, getABTestConfig, getVariantIndex } from "./server" +export { + getABTestAssignment, + getABTestConfigs, + getVariantIndex, +} from "./server" // Note: Server actions are exported from ./actions, not here // This prevents client components from accidentally importing server-only code diff --git a/src/lib/ab-testing/server.ts b/src/lib/ab-testing/server.ts index a7bd202c004..3f36025e33c 100644 --- a/src/lib/ab-testing/server.ts +++ b/src/lib/ab-testing/server.ts @@ -1,51 +1,54 @@ -import { getABTestConfigs, getABTestConfigsSync } from "./config" +import { SITE_URL } from "@/lib/constants" + import { ABTestAssignment, ABTestConfig } from "./types" -export async function getABTestAssignment( +export const getABTestConfigs = async (): Promise< + Record +> => { + try { + const response = await fetch(`${SITE_URL}/api/ab-config`, { + next: { revalidate: 3600 }, + }) + + if (!response.ok) return {} + return await response.json() + } catch (error) { + console.error("[AB Config] Failed to fetch:", error) + return {} + } +} + +export const getABTestAssignment = async ( testKey: string -): Promise { +): Promise => { const configs = await getABTestConfigs() const testConfig = configs[testKey] - if (!testConfig || !testConfig.enabled) { - return null - } + if (!testConfig || !testConfig.enabled) return null - // Create deterministic assignment - // Use IP + User-Agent as fingerprint for consistent assignment (cookie-less) + // Create deterministic assignment using IP + User-Agent fingerprint const headers = await import("next/headers").then((m) => m.headers()) const userAgent = headers.get("user-agent") || "" const forwardedFor = headers.get("x-forwarded-for") || headers.get("x-real-ip") || "unknown" const fingerprint = `${forwardedFor}-${userAgent}` - // Use deterministic assignment to ensure consistency across requests const variant = assignVariantDeterministic(testConfig, fingerprint) - const newAssignment: ABTestAssignment = { + + return { experimentId: testConfig.id, - experimentName: testConfig.name, + experimentName: testConfig.name || testKey, variant: variant.name, assignedAt: Date.now(), } - - return newAssignment -} - -export function getABTestConfig(testKey: string): ABTestConfig | null { - const configs = getABTestConfigsSync() - const testConfig = configs[testKey] - - if (!testConfig || !testConfig.enabled) { - return null - } - - return testConfig } -export function getVariantIndex(variantName: string, testKey: string): number { - const configs = getABTestConfigsSync() +export const getVariantIndex = ( + variantName: string, + configs: Record, + testKey: string +): number => { const testConfig = configs[testKey] - if (!testConfig) return 0 const variantIndex = testConfig.variants.findIndex( @@ -55,16 +58,17 @@ export function getVariantIndex(variantName: string, testKey: string): number { } // Deterministic assignment based on user fingerprint (cookie-less) -function assignVariantDeterministic(config: ABTestConfig, fingerprint: string) { +const assignVariantDeterministic = ( + config: ABTestConfig, + fingerprint: string +) => { const totalWeight = config.variants.reduce( (sum, variant) => sum + variant.weight, 0 ) // Handle case where total weight is 0 - if (totalWeight === 0) { - return config.variants[0] - } + if (totalWeight === 0) return config.variants[0] // Use a better hash function for more uniform distribution // This is a simple implementation of djb2 hash algorithm From 48dd82eb87807c000787357ca199fb431c39a0cd Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 2 Jul 2025 11:00:17 -0700 Subject: [PATCH 264/368] patch: common string namespace --- app/[locale]/get-eth/page.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/[locale]/get-eth/page.tsx b/app/[locale]/get-eth/page.tsx index 9ed51123fc9..f222d10ed63 100644 --- a/app/[locale]/get-eth/page.tsx +++ b/app/[locale]/get-eth/page.tsx @@ -100,6 +100,7 @@ export default async function Page({ }) { const { locale } = await params const t = await getTranslations({ locale, namespace: "page-get-eth" }) + const tCommon = await getTranslations({ locale, namespace: "common" }) const tokenSwaps: CardListCardProps[] = [ { @@ -241,7 +242,7 @@ export default async function Page({

    - {t("common:listing-policy-disclaimer")}{" "} + {tCommon("listing-policy-disclaimer")}{" "} {t("listing-policy-raise-issue-link")} From ad26b911f463bcb5f505c5c6e557212296db4e55 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:52:40 -0700 Subject: [PATCH 265/368] chore: clean up rm unused comments, rm env vars from example, rm redundant props, simplify to not require variant names (index order), update docs --- .env.example | 21 ---------------- CLAUDE.md | 12 ++++++--- app/[locale]/stablecoins/page.tsx | 4 +-- docs/ab-testing.md | 41 ++++++++++++++++++++----------- src/components/AB/TestWrapper.tsx | 34 ++++++++++++++----------- src/lib/ab-testing/index.ts | 6 +---- src/lib/ab-testing/server.ts | 32 ++++++++---------------- src/lib/ab-testing/types.ts | 1 + 8 files changed, 69 insertions(+), 82 deletions(-) diff --git a/.env.example b/.env.example index 7a00fdbf460..2a2aa721de9 100644 --- a/.env.example +++ b/.env.example @@ -30,27 +30,6 @@ NEXT_PUBLIC_MATOMO_URL= NEXT_PUBLIC_MATOMO_SITE_ID= -# A/B Testing Configuration - Server-side A/B testing using Matomo for tracking -# Format for variants: "name1:weight1,name2:weight2,name3:weight3" -# Weights can be any positive numbers (don't need to sum to 100) -# Test names should be descriptive and match Matomo experiment names - -# Template for new tests: -# ABTEST_[TEST_NAME]_ENABLED=false -# ABTEST_[TEST_NAME]_ID=[MATOMO_EXPERIMENT_ID] -# ABTEST_[TEST_NAME]_VARIANTS="original:50,variant_b:50" - -# Example: Homepage Persona CTAs Test -# ABTEST_HOMEPAGE_PERSONA_CTAS_ENABLED=false -# ABTEST_HOMEPAGE_PERSONA_CTAS_ID=1 -# ABTEST_HOMEPAGE_PERSONA_CTAS_VARIANTS="original:50,variant_b:50" - -# Example: Multi-variant Wallet Layout Test -# ABTEST_WALLET_LAYOUT_ENABLED=false -# ABTEST_WALLET_LAYOUT_ID=2 -# ABTEST_WALLET_LAYOUT_VARIANTS="original:40,list_view:30,carousel:30" - - # Used to avoid loading Matomo in our preview deploys IS_PREVIEW_DEPLOY=false diff --git a/CLAUDE.md b/CLAUDE.md index d7631f1ddb4..7a568bf26a0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -201,7 +201,7 @@ The site uses a GDPR-compliant, cookie-less A/B testing system integrated with M ### Key Features - **Matomo API Integration** - Experiments configured in Matomo dashboard -- **Cookie-less Tracking** - Uses deterministic IP + User-Agent fingerprinting +- **Cookie-less Variant Persistence** - Uses deterministic IP + User-Agent fingerprinting for variant assignment - **Server-side Rendering** - No layout shifts, consistent variants on first load - **Real-time Updates** - Change weights instantly via Matomo (no deployments) - **Preview Mode** - Debug panel available in development and preview environments @@ -222,14 +222,18 @@ The site uses a GDPR-compliant, cookie-less A/B testing system integrated with M , - + , // Index 0: Original + // Index 1: Variation ]} fallback={} /> ``` -**No TypeScript changes required** - the system automatically fetches configuration from Matomo. +**Important**: +- Variants matched by **array index**, not names +- Array order must match Matomo experiment order exactly +- JSX `key` props become debug panel labels: `"redesigned-hero"` → `"Redesigned Hero"` +- No TypeScript changes required - system fetches configuration from Matomo ### Architecture diff --git a/app/[locale]/stablecoins/page.tsx b/app/[locale]/stablecoins/page.tsx index 689d450e291..b74f7c4dadd 100644 --- a/app/[locale]/stablecoins/page.tsx +++ b/app/[locale]/stablecoins/page.tsx @@ -594,7 +594,7 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) { +

    {t("page-stablecoins-explore-dapps")} @@ -607,7 +607,7 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) { {t("page-stablecoins-more-defi-button")}
    , -
    +
    {t("page-stablecoins-explore-apps")} diff --git a/docs/ab-testing.md b/docs/ab-testing.md index 31f959abc43..a525b492e21 100644 --- a/docs/ab-testing.md +++ b/docs/ab-testing.md @@ -55,8 +55,8 @@ export default function MyPage() { , // Index 0: Original/existing variant - , // Index 1: First test variation + , // Index 0: Original (matches Matomo order) + , // Index 1: Variation (matches Matomo order) ]} />
    @@ -64,6 +64,12 @@ export default function MyPage() { } ``` +**Important Notes:** + +- Variants are matched by **array index**, not by name +- Array order must match the exact order of variations in your Matomo experiment +- JSX `key` props serve as array keys, and human-readable labels in the debug panel (parsed from kebab-case to Title Case) + ### 4. Experiment Activation The experiment will automatically start running when: @@ -73,6 +79,7 @@ The experiment will automatically start running when: 3. **Matomo detects the experiment** and begins tracking **Manual Control:** + - Use the **Schedule** settings in Matomo to control start/end dates - Experiments respect their configured schedule automatically - You can pause/resume experiments anytime in the Matomo dashboard @@ -82,24 +89,28 @@ The experiment will automatically start running when: Support for 3+ variants: ```tsx -// Matomo experiment with: -// - Original: 40% (implicit) -// - ListLayout: 30% -// - GridLayout: 20% -// - CarouselLayout: 10% +// Matomo experiment configured with variations in this exact order: +// Index 0: Original (implicit) - 40% weight +// Index 1: List Layout - 30% weight +// Index 2: Grid Layout - 20% weight +// Index 3: Carousel Layout - 10% weight , // Index 0: Original (40% weight) - , // Index 1: ListLayout (30% weight) - , // Index 2: GridLayout (20% weight) - , // Index 3: CarouselLayout (10% weight) + , // Index 0 + , // Index 1 + , // Index 2 + , // Index 3 ]} /> ``` -**Important**: Variant array order must match the order of variations in your Matomo experiment. +**Important**: + +- Variant array order must exactly **match the order in your Matomo experiment** +- Assignment is by index (0, 1, 2, 3...), not by name matching +- Debug panel shows formatted key names: `"list-layout"` → `"List Layout"` ## How It Works @@ -169,6 +180,8 @@ IS_PREVIEW_DEPLOY=false - Keep variants as similar as possible (same props, structure) - Always provide a meaningful fallback component +- Use descriptive kebab-case keys: `key="simplified-checkout"` becomes `"Simplified Checkout"` in debug panel +- Ensure variant array order matches Matomo experiment order exactly - Test all variants in Storybook before deploying ### Testing Strategy @@ -230,10 +243,10 @@ The panel helps verify your test is working correctly before production deployme ### Core Files - `app/api/ab-config/route.ts` - Matomo API integration -- `src/lib/ab-testing/config.ts` - Configuration management and caching -- `src/lib/ab-testing/server.ts` - Assignment logic and fingerprinting +- `src/lib/ab-testing/server.ts` - Assignment logic and fingerprinting (index-based) - `src/components/AB/TestWrapper.tsx` - Main React component - `src/components/AB/TestDebugPanel.tsx` - Development debug interface +- `src/components/AB/ClientABTestWrapper.tsx` - Client-side rendering with localStorage overrides ### Data Flow diff --git a/src/components/AB/TestWrapper.tsx b/src/components/AB/TestWrapper.tsx index 408d91d917c..efb30e8c846 100644 --- a/src/components/AB/TestWrapper.tsx +++ b/src/components/AB/TestWrapper.tsx @@ -6,11 +6,7 @@ import { ClientABTestWrapper } from "./ClientABTestWrapper" import { ABTestDebugPanel } from "./TestDebugPanel" import { ABTestTracker } from "./TestTracker" -import { - getABTestAssignment, - getABTestConfigs, - getVariantIndex, -} from "@/lib/ab-testing/server" +import { getABTestAssignment } from "@/lib/ab-testing/server" import { ABTestVariants } from "@/lib/ab-testing/types" type ABTestWrapperProps = { @@ -25,18 +21,28 @@ const ABTestWrapper = async ({ fallback, }: ABTestWrapperProps) => { try { - // Get deterministic assignment and configs - const [assignment, configs] = await Promise.all([ - getABTestAssignment(testKey), - getABTestConfigs(), - ]) + // Get deterministic assignment + const assignment = await getABTestAssignment(testKey) if (!assignment) throw new Error("No AB test assignment found") - // Find the variant index based on the assignment - const variantIndex = getVariantIndex(assignment.variant, configs, testKey) - const availableVariants = - configs[testKey]?.variants.map((v) => v.name) || [] + // Use assignment's variant index directly + const variantIndex = assignment.variantIndex + + // Extract labels from React element keys or fall back to defaults + const availableVariants = variants.map((variant, i) => { + if ( + variant && + typeof variant === "object" && + "key" in variant && + variant.key + ) { + return String(variant.key) + .replace(/-/g, " ") + .replace(/\b\w/g, (l) => l.toUpperCase()) + } + return `Variant ${i}` + }) return ( <> diff --git a/src/lib/ab-testing/index.ts b/src/lib/ab-testing/index.ts index a4f23f1f235..8a1df4566da 100644 --- a/src/lib/ab-testing/index.ts +++ b/src/lib/ab-testing/index.ts @@ -2,11 +2,7 @@ export type { ABTestAssignment, ABTestConfig, ABTestVariants } from "./types" // Server utilities (only import these in server components) -export { - getABTestAssignment, - getABTestConfigs, - getVariantIndex, -} from "./server" +export { getABTestAssignment, getABTestConfigs } from "./server" // Note: Server actions are exported from ./actions, not here // This prevents client components from accidentally importing server-only code diff --git a/src/lib/ab-testing/server.ts b/src/lib/ab-testing/server.ts index 3f36025e33c..6b485b5f42b 100644 --- a/src/lib/ab-testing/server.ts +++ b/src/lib/ab-testing/server.ts @@ -33,42 +33,30 @@ export const getABTestAssignment = async ( headers.get("x-forwarded-for") || headers.get("x-real-ip") || "unknown" const fingerprint = `${forwardedFor}-${userAgent}` - const variant = assignVariantDeterministic(testConfig, fingerprint) + const variantIndex = assignVariantIndexDeterministic(testConfig, fingerprint) + const variant = testConfig.variants[variantIndex] return { experimentId: testConfig.id, experimentName: testConfig.name || testKey, variant: variant.name, + variantIndex, assignedAt: Date.now(), } } -export const getVariantIndex = ( - variantName: string, - configs: Record, - testKey: string -): number => { - const testConfig = configs[testKey] - if (!testConfig) return 0 - - const variantIndex = testConfig.variants.findIndex( - (v) => v.name === variantName - ) - return variantIndex >= 0 ? variantIndex : 0 -} - // Deterministic assignment based on user fingerprint (cookie-less) -const assignVariantDeterministic = ( +const assignVariantIndexDeterministic = ( config: ABTestConfig, fingerprint: string -) => { +): number => { const totalWeight = config.variants.reduce( (sum, variant) => sum + variant.weight, 0 ) // Handle case where total weight is 0 - if (totalWeight === 0) return config.variants[0] + if (totalWeight === 0) return 0 // Use a better hash function for more uniform distribution // This is a simple implementation of djb2 hash algorithm @@ -82,12 +70,12 @@ const assignVariantDeterministic = ( const weighted = normalized * totalWeight let cumulativeWeight = 0 - for (const variant of config.variants) { - cumulativeWeight += variant.weight + for (let i = 0; i < config.variants.length; i++) { + cumulativeWeight += config.variants[i].weight if (weighted <= cumulativeWeight) { - return variant + return i } } - return config.variants[0] + return 0 } diff --git a/src/lib/ab-testing/types.ts b/src/lib/ab-testing/types.ts index a317d640380..ace091abae5 100644 --- a/src/lib/ab-testing/types.ts +++ b/src/lib/ab-testing/types.ts @@ -14,6 +14,7 @@ export type ABTestAssignment = { experimentId: string experimentName: string variant: string + variantIndex: number assignedAt: number } From 3d202757ae735f1a2c418c54d2b528f021075630 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 3 Jul 2025 10:28:00 +0200 Subject: [PATCH 266/368] clarify dev server prerequisite in e2e testing docs --- docs/e2e-testing.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/e2e-testing.md b/docs/e2e-testing.md index d2db049cc67..1fe197b6f8f 100644 --- a/docs/e2e-testing.md +++ b/docs/e2e-testing.md @@ -15,6 +15,9 @@ pnpm install # Install Playwright browsers npx playwright install +# Start development server (in a separate terminal) +pnpm dev + # Run all e2e tests pnpm test:e2e From d90568eca2106f64593cf9fdc9128f1550fbe795 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 3 Jul 2025 10:38:23 +0200 Subject: [PATCH 267/368] fix: specify custom report directory for e2e test reports --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b57d9dca377..5283685b26b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "test:e2e": "playwright test", "test:e2e:ui": "playwright test --ui", "test:e2e:debug": "playwright test --debug", - "test:e2e:report": "playwright show-report" + "test:e2e:report": "playwright show-report tests/e2e/__report__" }, "dependencies": { "@crowdin/crowdin-api-client": "^1.25.0", From a5f9412fd51391277bfc532224828fe66c230637 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:13:49 +0000 Subject: [PATCH 268/368] fix: update UN World Food Programme statistics on Enterprise page Update statistics from "100,000+ refugees" to "over 4 million people per month" to reflect accurate data about the Building Blocks program's reach. Fixes #15778 Co-authored-by: Joshua --- src/intl/en/page-enterprise.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/page-enterprise.json b/src/intl/en/page-enterprise.json index b86e59a4357..81dd4b87f24 100644 --- a/src/intl/en/page-enterprise.json +++ b/src/intl/en/page-enterprise.json @@ -8,7 +8,7 @@ "page-enterprise-cases-eib-content": "Issued a €100M digital bond on public Ethereum. The project was conducted in cooperation with the Banque de France, Goldman Sachs, Santander and Société Générale.", "page-enterprise-cases-mediledger-content": "Enables Pfizer and Genentech to verify drug authenticity and ensure pharma compliance.", "page-enterprise-cases-sony-content": "Launched the Soneium L2 network on Ethereum's OP Stack, scaling real-world IP with 14M+ accounts and $45M+ TVL.", - "page-enterprise-cases-unwfp-content": "UN tracks aid for 100,000+ refugees using a private Ethereum fork, boosting audit capabilities.", + "page-enterprise-cases-unwfp-content": "UN tracks aid for over 4 million people per month using a private Ethereum fork, boosting audit capabilities.", "page-enterprise-cases-visa-content": "Settled over $225 million in stablecoin transactions using USDC across Ethereum and other blockchains.", "page-enterprise-ecosystem-cta": "See use cases", "page-enterprise-ecosystem-description": "Programmable financial systems are here. Join the hundreds of enterprises already building on Ethereum today.", From b9d0aede2b6b7e53c4a241e010301f58423896cb Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 3 Jul 2025 07:09:29 -0700 Subject: [PATCH 269/368] fix: stablecoins icons --- app/[locale]/stablecoins/page.tsx | 7 ++++--- src/components/StablecoinsTable.tsx | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/[locale]/stablecoins/page.tsx b/app/[locale]/stablecoins/page.tsx index f0c8cbd8267..41d6a41ecf4 100644 --- a/app/[locale]/stablecoins/page.tsx +++ b/app/[locale]/stablecoins/page.tsx @@ -1,5 +1,5 @@ import { pick } from "lodash" -import { HelpCircle } from "lucide-react" +import { Info } from "lucide-react" import { getMessages, getTranslations, @@ -94,6 +94,7 @@ const loadData = dataLoader<[CoinGeckoCoinMarketResponse]>( async function Page({ params }: { params: Promise<{ locale: Lang }> }) { const { locale } = await params const t = await getTranslations({ locale, namespace: "page-stablecoins" }) + const tCommon = await getTranslations({ locale, namespace: "common" }) setRequestLocale(locale) @@ -248,7 +249,7 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) { const tooltipContent = (
    - {t("common:data-provided-by")}{" "} + {tCommon("data-provided-by")}{" "} coingecko.com @@ -557,7 +558,7 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) {

    {t("page-stablecoins-top-coins")} - +

    diff --git a/src/components/StablecoinsTable.tsx b/src/components/StablecoinsTable.tsx index 3f55c21ebf7..06927f62d37 100644 --- a/src/components/StablecoinsTable.tsx +++ b/src/components/StablecoinsTable.tsx @@ -1,7 +1,7 @@ "use client" import { Suspense, useState } from "react" -import { ExternalLink, Filter } from "lucide-react" +import { ExternalLink, ListFilter } from "lucide-react" import type { StablecoinType } from "@/lib/types" @@ -188,7 +188,7 @@ const StablecoinsTable = ({ content, hasError }: StablecoinsTableProps) => { ({activeTypeCount}) )} - + {typeFilters.map((filter) => ( @@ -240,7 +240,7 @@ const StablecoinsTable = ({ content, hasError }: StablecoinsTableProps) => { {activePegCount !== totalPegCount && ( ({activePegCount}) )} - + {pegFilters.map((filter) => ( From 8ecfd30fab2a5e2a9f41398fc766505d0320ab0b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 3 Jul 2025 09:49:21 -0700 Subject: [PATCH 270/368] chore: organize type imports/exports --- app/api/ab-config/route.ts | 22 ++-------------------- src/components/AB/ClientABTestWrapper.tsx | 2 +- src/components/AB/TestWrapper.tsx | 4 ++-- src/lib/ab-testing/index.ts | 8 -------- src/lib/ab-testing/server.ts | 6 ++---- src/lib/ab-testing/types.ts | 14 +++++++++++++- 6 files changed, 20 insertions(+), 36 deletions(-) delete mode 100644 src/lib/ab-testing/index.ts diff --git a/app/api/ab-config/route.ts b/app/api/ab-config/route.ts index fc5c4110046..47fe7f9a01b 100644 --- a/app/api/ab-config/route.ts +++ b/app/api/ab-config/route.ts @@ -2,26 +2,7 @@ import { NextResponse } from "next/server" import { IS_PREVIEW_DEPLOY } from "@/lib/utils/env" -type MatomoExperiment = { - idexperiment: string - name: string - status: string - start_date?: string - end_date?: string - variations: Array<{ - name: string - percentage: number - }> -} - -type ABTestConfig = { - id: string - enabled: boolean - variants: Array<{ - name: string - weight: number - }> -} +import type { ABTestConfig, MatomoExperiment } from "@/lib/ab-testing/types" const isExperimentActive = (experiment: MatomoExperiment): boolean => { const now = new Date() @@ -119,6 +100,7 @@ export async function GET() { ] config[exp.name] = { + name: exp.name, id: exp.idexperiment, enabled: isExperimentActive(exp), variants, diff --git a/src/components/AB/ClientABTestWrapper.tsx b/src/components/AB/ClientABTestWrapper.tsx index a2c8211eda7..c570657d110 100644 --- a/src/components/AB/ClientABTestWrapper.tsx +++ b/src/components/AB/ClientABTestWrapper.tsx @@ -4,7 +4,7 @@ import { IS_PREVIEW_DEPLOY, IS_PROD } from "@/lib/utils/env" import { useIsClient } from "@/hooks/useIsClient" import { useLocalStorage } from "@/hooks/useLocalStorage" -import { ABTestVariants } from "@/lib/ab-testing/types" +import type { ABTestVariants } from "@/lib/ab-testing/types" type ClientABTestWrapperProps = { testKey: string diff --git a/src/components/AB/TestWrapper.tsx b/src/components/AB/TestWrapper.tsx index efb30e8c846..47a0a81c861 100644 --- a/src/components/AB/TestWrapper.tsx +++ b/src/components/AB/TestWrapper.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from "react" +import type { ReactNode } from "react" import { IS_PREVIEW_DEPLOY, IS_PROD } from "@/lib/utils/env" @@ -7,7 +7,7 @@ import { ABTestDebugPanel } from "./TestDebugPanel" import { ABTestTracker } from "./TestTracker" import { getABTestAssignment } from "@/lib/ab-testing/server" -import { ABTestVariants } from "@/lib/ab-testing/types" +import type { ABTestVariants } from "@/lib/ab-testing/types" type ABTestWrapperProps = { testKey: string diff --git a/src/lib/ab-testing/index.ts b/src/lib/ab-testing/index.ts deleted file mode 100644 index 8a1df4566da..00000000000 --- a/src/lib/ab-testing/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Types (safe for both client and server) -export type { ABTestAssignment, ABTestConfig, ABTestVariants } from "./types" - -// Server utilities (only import these in server components) -export { getABTestAssignment, getABTestConfigs } from "./server" - -// Note: Server actions are exported from ./actions, not here -// This prevents client components from accidentally importing server-only code diff --git a/src/lib/ab-testing/server.ts b/src/lib/ab-testing/server.ts index 6b485b5f42b..42df90fb1d6 100644 --- a/src/lib/ab-testing/server.ts +++ b/src/lib/ab-testing/server.ts @@ -1,10 +1,8 @@ import { SITE_URL } from "@/lib/constants" -import { ABTestAssignment, ABTestConfig } from "./types" +import type { ABTestAssignment, ABTestConfig } from "./types" -export const getABTestConfigs = async (): Promise< - Record -> => { +const getABTestConfigs = async (): Promise> => { try { const response = await fetch(`${SITE_URL}/api/ab-config`, { next: { revalidate: 3600 }, diff --git a/src/lib/ab-testing/types.ts b/src/lib/ab-testing/types.ts index ace091abae5..af499dda16b 100644 --- a/src/lib/ab-testing/types.ts +++ b/src/lib/ab-testing/types.ts @@ -1,4 +1,16 @@ -import { ReactNode } from "react" +import type { ReactNode } from "react" + +export type MatomoExperiment = { + idexperiment: string + name: string + status: string + start_date?: string + end_date?: string + variations: { + name: string + percentage: number + }[] +} export type ABTestConfig = { name: string From 73b95a9ae92413910b925ce21aaed9568cf89d72 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 3 Jul 2025 19:49:40 +0200 Subject: [PATCH 271/368] optimize LanguageMorpher performance for mobile devices --- src/components/Morpher.tsx | 106 ++++++++++++++++++++++++++++--------- 1 file changed, 80 insertions(+), 26 deletions(-) diff --git a/src/components/Morpher.tsx b/src/components/Morpher.tsx index 0ad27ed4211..b0d302e0596 100644 --- a/src/components/Morpher.tsx +++ b/src/components/Morpher.tsx @@ -1,6 +1,8 @@ "use client" -import { useEffect, useState } from "react" +import { useEffect, useRef, useState } from "react" + +import { usePrefersReducedMotion } from "@/hooks/usePrefersReducedMotion" type MorpherProps = { words: string[] @@ -11,16 +13,37 @@ const Morpher = ({ words, charSet = "abcdefghijklmnopqrstuvwxyz", }: MorpherProps) => { - const [state, setState] = useState({ text: words[0], words }) + const [currentText, setCurrentText] = useState(words[0]) + const [isAnimating, setIsAnimating] = useState(false) + const { prefersReducedMotion } = usePrefersReducedMotion() + + const morphTimeoutRef = useRef(null) + const morphIntervalRef = useRef(null) + const counterRef = useRef(0) + const wordsRef = useRef(words) + const currentTextRef = useRef(currentText) + const isAnimatingRef = useRef(false) + + useEffect(() => { + wordsRef.current = words + currentTextRef.current = currentText + isAnimatingRef.current = isAnimating + }, [words, currentText, isAnimating]) // loops over chars to morph a text to another const morpher = (start: string, end: string): void => { + // prevent multiple simultaneous animations + if (isAnimatingRef.current) return + + setIsAnimating(true) + isAnimatingRef.current = true + // array of chars to randomly morph the text between start and end const chars = charSet.split("") // duration of the global morph const duration = 3 // speed of the morph for each letter - const frameRate = 30 + const frameRate = 24 // text variables const textString = start.split("") @@ -37,6 +60,9 @@ const Morpher = ({ const splitTime = (duration * 70) / Math.max(slen, rlen) function update() { + // check if component is still mounted and animation should continue + if (!isAnimatingRef.current) return + // Update present date and spent time present = new Date() spentTime += present.getTime() - past @@ -60,8 +86,12 @@ const Morpher = ({ spentTime = 0 } - // Update DOM - setState({ ...state, text: textString.join("") }) + // Update text + const newText = textString.join("") + if (newText !== currentTextRef.current) { + setCurrentText(newText) + currentTextRef.current = newText + } // Save present date past = present.getTime() @@ -69,10 +99,13 @@ const Morpher = ({ // Loop if (count < Math.max(slen, rlen)) { // Only use a setTimeout if the frameRate is lower than 60FPS - // Remove the setTimeout if the frameRate is equal to 60FPS - morphTimeout = setTimeout(() => { + morphTimeoutRef.current = setTimeout(() => { window.requestAnimationFrame(update) }, 1000 / frameRate) + } else { + // Animation complete + setIsAnimating(false) + isAnimatingRef.current = false } } @@ -80,32 +113,53 @@ const Morpher = ({ update() } - let morphTimeout: NodeJS.Timeout - useEffect(() => { - let counter = 0 - - const morphInterval = setInterval(() => { - const start = state.text - const end = state.words[counter] - - morpher(start, end) - - if (counter < state.words.length - 1) { - counter++ - } else { - counter = 0 + // If reduced motion is preferred, show static text cycling + if (prefersReducedMotion) { + morphIntervalRef.current = setInterval(() => { + counterRef.current = (counterRef.current + 1) % wordsRef.current.length + const nextWord = wordsRef.current[counterRef.current] + setCurrentText(nextWord) + currentTextRef.current = nextWord + }, 3000) + } else { + // Defer animation start by 2 seconds to improve initial page load + const startupDelay = setTimeout(() => { + morphIntervalRef.current = setInterval(() => { + // Don't start new animation if one is already running + if (isAnimatingRef.current) return + + const start = currentTextRef.current + const end = wordsRef.current[counterRef.current] + + morpher(start, end) + + counterRef.current = + (counterRef.current + 1) % wordsRef.current.length + }, 3000) + }, 2000) + + return () => { + clearTimeout(startupDelay) } - }, 3000) + } return () => { - clearInterval(morphInterval) - clearTimeout(morphTimeout) + if (morphIntervalRef.current) { + clearInterval(morphIntervalRef.current) + morphIntervalRef.current = null + } + if (morphTimeoutRef.current) { + clearTimeout(morphTimeoutRef.current) + morphTimeoutRef.current = null + } + setIsAnimating(false) + isAnimatingRef.current = false } // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) + }, [prefersReducedMotion, charSet]) - return state.text + return currentText } export default Morpher From 589ae7166c3e8a73f0f9882b3a5173f0512dd924 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 3 Jul 2025 11:14:43 -0700 Subject: [PATCH 272/368] patch: adjust LanguagePicker icon spacing --- src/components/Nav/Client/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/Client/index.tsx b/src/components/Nav/Client/index.tsx index 340dd0f1110..523ac333e22 100644 --- a/src/components/Nav/Client/index.tsx +++ b/src/components/Nav/Client/index.tsx @@ -146,7 +146,8 @@ const ClientSideNav = () => { variant="ghost" className="animate-fade-in gap-0 px-2 text-body transition-transform duration-500 active:bg-primary-low-contrast active:text-primary-hover data-[state='open']:bg-primary-low-contrast data-[state='open']:text-primary-hover max-md:hidden xl:px-3 [&_svg]:transition-transform [&_svg]:duration-500 [&_svg]:hover:rotate-12" > - + +   {t("languages")}  {locale!.toUpperCase()} From 4cc4f2474ac16174fc228f94ed3a81d96943af9f Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 3 Jul 2025 13:20:14 -0700 Subject: [PATCH 273/368] perf: use next image for avatars --- src/components/ui/avatar.tsx | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx index 34a9e933fac..8196a2b6c81 100644 --- a/src/components/ui/avatar.tsx +++ b/src/components/ui/avatar.tsx @@ -6,6 +6,8 @@ import * as AvatarPrimitive from "@radix-ui/react-avatar" import { cn } from "@/lib/utils/cn" +import { Image } from "../Image" + import { Center } from "./flex" import { BaseLink, type LinkProps } from "./Link" import { LinkBox, LinkOverlay } from "./link-box" @@ -162,7 +164,18 @@ const Avatar = React.forwardRef< {label} - + {src ? ( + {name} + ) : ( + + )} {fallbackInitials}

    @@ -173,7 +186,18 @@ const Avatar = React.forwardRef< return ( - + {src ? ( + {name} + ) : ( + + )} {fallbackInitials} From 4397ffffd3607178c28f36ec35f83df7bbfc43be Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 3 Jul 2025 13:42:06 -0700 Subject: [PATCH 274/368] refactor: use client/loading/server lazy load pattern --- app/[locale]/wallets/find-wallet/page.tsx | 2 +- .../FindWalletProductTable/FindWalletProductTable.stories.tsx | 2 +- src/components/FindWalletProductTable/{index.tsx => client.tsx} | 0 src/components/FindWalletProductTable/loading.tsx | 1 + src/components/FindWalletProductTable/{lazy.tsx => server.tsx} | 2 +- 5 files changed, 4 insertions(+), 3 deletions(-) rename src/components/FindWalletProductTable/{index.tsx => client.tsx} (100%) rename src/components/FindWalletProductTable/{lazy.tsx => server.tsx} (67%) diff --git a/app/[locale]/wallets/find-wallet/page.tsx b/app/[locale]/wallets/find-wallet/page.tsx index e67d8986713..9a051f72ac5 100644 --- a/app/[locale]/wallets/find-wallet/page.tsx +++ b/app/[locale]/wallets/find-wallet/page.tsx @@ -8,7 +8,7 @@ import { import { Lang } from "@/lib/types" import Breadcrumbs from "@/components/Breadcrumbs" -import FindWalletProductTable from "@/components/FindWalletProductTable/lazy" +import FindWalletProductTable from "@/components/FindWalletProductTable/server" import I18nProvider from "@/components/I18nProvider" import MainArticle from "@/components/MainArticle" diff --git a/src/components/FindWalletProductTable/FindWalletProductTable.stories.tsx b/src/components/FindWalletProductTable/FindWalletProductTable.stories.tsx index 3b6e064c9dc..28de0cdd76a 100644 --- a/src/components/FindWalletProductTable/FindWalletProductTable.stories.tsx +++ b/src/components/FindWalletProductTable/FindWalletProductTable.stories.tsx @@ -2,7 +2,7 @@ import { Meta, StoryObj } from "@storybook/react" import { Lang } from "@/lib/types" -import FindWalletProductTable from "@/components/FindWalletProductTable" +import FindWalletProductTable from "@/components/FindWalletProductTable/client" import OneInchWalletImage from "@/public/images/wallets/1inch.png" import FoxWalletImage from "@/public/images/wallets/foxwallet.png" diff --git a/src/components/FindWalletProductTable/index.tsx b/src/components/FindWalletProductTable/client.tsx similarity index 100% rename from src/components/FindWalletProductTable/index.tsx rename to src/components/FindWalletProductTable/client.tsx diff --git a/src/components/FindWalletProductTable/loading.tsx b/src/components/FindWalletProductTable/loading.tsx index 291452ede3a..18c76ceb344 100644 --- a/src/components/FindWalletProductTable/loading.tsx +++ b/src/components/FindWalletProductTable/loading.tsx @@ -25,6 +25,7 @@ const WalletSkeleton = () => ( ))} ) + const Loading = () => (
    diff --git a/src/components/FindWalletProductTable/lazy.tsx b/src/components/FindWalletProductTable/server.tsx similarity index 67% rename from src/components/FindWalletProductTable/lazy.tsx rename to src/components/FindWalletProductTable/server.tsx index e74ae58690a..c87674840b7 100644 --- a/src/components/FindWalletProductTable/lazy.tsx +++ b/src/components/FindWalletProductTable/server.tsx @@ -2,7 +2,7 @@ import dynamic from "next/dynamic" import Loading from "./loading" -export default dynamic(() => import("./index"), { +export default dynamic(() => import("./client"), { ssr: false, loading: Loading, }) From f6408cbbecddd4a2521c1ce08742afbd02ccd458 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 3 Jul 2025 13:47:48 -0700 Subject: [PATCH 275/368] chore: update to use public env var for preview deploy --- .env.example | 2 +- docs/ab-testing.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 2a2aa721de9..e1adde4ce8a 100644 --- a/.env.example +++ b/.env.example @@ -31,7 +31,7 @@ NEXT_PUBLIC_MATOMO_URL= NEXT_PUBLIC_MATOMO_SITE_ID= # Used to avoid loading Matomo in our preview deploys -IS_PREVIEW_DEPLOY=false +NEXT_PUBLIC_IS_PREVIEW_DEPLOY=false # Build pages only for the specified langs. Leave it empty to build all the langs # e.g. `en,fr` will only build English and French pages diff --git a/docs/ab-testing.md b/docs/ab-testing.md index a525b492e21..4c70d149deb 100644 --- a/docs/ab-testing.md +++ b/docs/ab-testing.md @@ -165,7 +165,7 @@ NEXT_PUBLIC_MATOMO_SITE_ID=4 MATOMO_API_TOKEN=your_api_token_here # Preview mode flag -IS_PREVIEW_DEPLOY=false +NEXT_PUBLIC_IS_PREVIEW_DEPLOY=false ``` ## Best Practices From 61690236951c4caf2f026edf193b69732bb74dfa Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:51:20 -0700 Subject: [PATCH 276/368] patch: tooltip spacing, use   over x margins Fixes alignment of tooltip popups, improves alignment consistency for inline flows --- app/[locale]/stablecoins/page.tsx | 4 +- src/components/BigNumber/index.tsx | 41 ++++++++++--------- src/components/EthPriceCard.tsx | 4 +- .../NetworksSubComponent.tsx | 10 ++--- src/components/RadialChart/index.tsx | 35 ++++++++-------- 5 files changed, 50 insertions(+), 44 deletions(-) diff --git a/app/[locale]/stablecoins/page.tsx b/app/[locale]/stablecoins/page.tsx index 41d6a41ecf4..56506cb8aca 100644 --- a/app/[locale]/stablecoins/page.tsx +++ b/app/[locale]/stablecoins/page.tsx @@ -556,9 +556,9 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) {

    - {t("page-stablecoins-top-coins")} + {t("page-stablecoins-top-coins")}  - +

    diff --git a/src/components/BigNumber/index.tsx b/src/components/BigNumber/index.tsx index f5a038073d5..fef399bec85 100644 --- a/src/components/BigNumber/index.tsx +++ b/src/components/BigNumber/index.tsx @@ -50,26 +50,29 @@ const BigNumber = async ({
    {children} {sourceName && sourceUrl && ( - -

    - {t("data-provided-by")}{" "} - {sourceName} -

    - {lastUpdated && ( -

    - {t("last-updated")}: {lastUpdatedDisplay} + <> +   + +

    + {t("data-provided-by")}{" "} + {sourceName}

    - )} - - } - > - -
    + {lastUpdated && ( +

    + {t("last-updated")}: {lastUpdatedDisplay} +

    + )} + + } + > + + + )}
    diff --git a/src/components/EthPriceCard.tsx b/src/components/EthPriceCard.tsx index 6ea6cad5de9..661bb595efc 100644 --- a/src/components/EthPriceCard.tsx +++ b/src/components/EthPriceCard.tsx @@ -117,9 +117,9 @@ const EthPriceCard = ({ {...props} >

    - {t("eth-current-price")} + {t("eth-current-price")}  - +

    diff --git a/src/components/Layer2NetworksTable/NetworksSubComponent.tsx b/src/components/Layer2NetworksTable/NetworksSubComponent.tsx index 2696506b421..38a1e1bf0b0 100644 --- a/src/components/Layer2NetworksTable/NetworksSubComponent.tsx +++ b/src/components/Layer2NetworksTable/NetworksSubComponent.tsx @@ -38,7 +38,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => {

    - {t("page-layer-2-networks-age")}{" "} + {t("page-layer-2-networks-age")}  @@ -84,7 +84,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => {

    - {t("page-layer-2-networks-wallet-support")}{" "} + {t("page-layer-2-networks-wallet-support")}  @@ -119,7 +119,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => {

    - {t("page-layer-2-networks-active-address")}{" "} + {t("page-layer-2-networks-active-address")}  @@ -157,7 +157,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => {

    - {t("page-layer-2-networks-fee-token")}{" "} + {t("page-layer-2-networks-fee-token")}  @@ -182,7 +182,7 @@ const NetworkSubComponent = ({ network }: NetworkSubComponentProps) => {

    - {t("page-layer-2-networks-network-usage")}{" "} + {t("page-layer-2-networks-network-usage")}  diff --git a/src/components/RadialChart/index.tsx b/src/components/RadialChart/index.tsx index 2def64b02c8..53a4d782050 100644 --- a/src/components/RadialChart/index.tsx +++ b/src/components/RadialChart/index.tsx @@ -107,23 +107,26 @@ const RadialChart = ({

    {label} {sourceName && sourceUrl && ( - -

    - {t("data-provided-by")}{" "} - {sourceName} -

    - {lastUpdated && ( -

    - {t("last-updated")}: {lastUpdatedDisplay} + <> +   + +

    + {t("data-provided-by")}{" "} + {sourceName}

    - )} - - } - > - -
    + {lastUpdated && ( +

    + {t("last-updated")}: {lastUpdatedDisplay} +

    + )} + + } + > + + + )}
    From 00c751ce7de73b0e84841dad07774b31732d6aef Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 4 Jul 2025 16:28:42 +0000 Subject: [PATCH 277/368] Update Crowdin translation progress --- src/data/translationProgress.json | 338 +++++++++++++++--------------- 1 file changed, 169 insertions(+), 169 deletions(-) diff --git a/src/data/translationProgress.json b/src/data/translationProgress.json index fe1abc2f3c3..37109d508f8 100644 --- a/src/data/translationProgress.json +++ b/src/data/translationProgress.json @@ -2,687 +2,687 @@ { "languageId": "af", "words": { - "approved": 1554, - "total": 280914 + "approved": 1539, + "total": 290123 } }, { "languageId": "am", "words": { - "approved": 10702, - "total": 280914 + "approved": 11132, + "total": 290123 } }, { "languageId": "ar", "words": { - "approved": 37042, - "total": 280914 + "approved": 36805, + "total": 290123 } }, { "languageId": "az", "words": { - "approved": 22042, - "total": 280914 + "approved": 21821, + "total": 290123 } }, { "languageId": "be", "words": { - "approved": 35837, - "total": 280914 + "approved": 35610, + "total": 290123 } }, { "languageId": "bg", "words": { - "approved": 18799, - "total": 280914 + "approved": 18600, + "total": 290123 } }, { "languageId": "bi", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "bn", "words": { - "approved": 29161, - "total": 280914 + "approved": 28924, + "total": 290123 } }, { "languageId": "br-FR", "words": { "approved": 43, - "total": 280914 + "total": 290123 } }, { "languageId": "bs", "words": { - "approved": 7428, - "total": 280914 + "approved": 7407, + "total": 290123 } }, { "languageId": "ca", "words": { - "approved": 26935, - "total": 280914 + "approved": 26647, + "total": 290123 } }, { "languageId": "cs", "words": { - "approved": 136936, - "total": 280914 + "approved": 136560, + "total": 290123 } }, { "languageId": "da", "words": { - "approved": 2482, - "total": 280914 + "approved": 2461, + "total": 290123 } }, { "languageId": "de", "words": { - "approved": 198769, - "total": 280914 + "approved": 198410, + "total": 290123 } }, { "languageId": "dv", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "ee", "words": { - "approved": 2502, - "total": 280914 + "approved": 2481, + "total": 290123 } }, { "languageId": "el", "words": { - "approved": 280914, - "total": 280914 + "approved": 284151, + "total": 290123 } }, { "languageId": "eo", "words": { "approved": 46, - "total": 280914 + "total": 290123 } }, { "languageId": "es-EM", "words": { - "approved": 255093, - "total": 280914 + "approved": 254623, + "total": 290123 } }, { "languageId": "et", "words": { "approved": 19, - "total": 280914 + "total": 290123 } }, { "languageId": "eu", "words": { "approved": 10, - "total": 280914 + "total": 290123 } }, { "languageId": "fa", "words": { - "approved": 242503, - "total": 280914 + "approved": 242152, + "total": 290123 } }, { "languageId": "fa-AF", "words": { "approved": 64, - "total": 280914 + "total": 290123 } }, { "languageId": "fi", "words": { - "approved": 18889, - "total": 280914 + "approved": 18558, + "total": 290123 } }, { "languageId": "fil", "words": { - "approved": 52518, - "total": 280914 + "approved": 52238, + "total": 290123 } }, { "languageId": "fr", "words": { - "approved": 272940, - "total": 280914 + "approved": 274181, + "total": 290123 } }, { "languageId": "ga-IE", "words": { - "approved": 218126, - "total": 280976 + "approved": 241935, + "total": 290185 } }, { "languageId": "gi", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "gl", "words": { - "approved": 2484, - "total": 280914 + "approved": 2463, + "total": 290123 } }, { "languageId": "gu-IN", "words": { - "approved": 2596, - "total": 280914 + "approved": 2575, + "total": 290123 } }, { "languageId": "ha", "words": { - "approved": 40675, - "total": 280914 + "approved": 40405, + "total": 290123 } }, { "languageId": "he", "words": { - "approved": 3200, - "total": 280914 + "approved": 3172, + "total": 290123 } }, { "languageId": "hi", "words": { - "approved": 165902, - "total": 280914 + "approved": 165503, + "total": 290123 } }, { "languageId": "hr", "words": { - "approved": 20415, - "total": 280914 + "approved": 20179, + "total": 290123 } }, { "languageId": "hu", "words": { - "approved": 258157, - "total": 280914 + "approved": 257689, + "total": 290123 } }, { "languageId": "hy-AM", "words": { - "approved": 9467, - "total": 280914 + "approved": 9255, + "total": 290123 } }, { "languageId": "id", "words": { - "approved": 128565, - "total": 280914 + "approved": 128215, + "total": 290123 } }, { "languageId": "ig", "words": { - "approved": 21757, - "total": 280914 + "approved": 21508, + "total": 290123 } }, { "languageId": "it", "words": { - "approved": 260828, - "total": 280914 + "approved": 260885, + "total": 290123 } }, { "languageId": "ja", "words": { - "approved": 246510, - "total": 280914 + "approved": 246159, + "total": 290123 } }, { "languageId": "ka", "words": { - "approved": 5299, - "total": 280914 + "approved": 5278, + "total": 290123 } }, { "languageId": "kk", "words": { - "approved": 10255, - "total": 280914 + "approved": 10234, + "total": 290123 } }, { "languageId": "km", "words": { - "approved": 11871, - "total": 280914 + "approved": 11650, + "total": 290123 } }, { "languageId": "kn", "words": { - "approved": 42087, - "total": 280914 + "approved": 41863, + "total": 290123 } }, { "languageId": "ko", "words": { - "approved": 51668, - "total": 280914 + "approved": 51758, + "total": 290123 } }, { "languageId": "ku", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "ky", "words": { "approved": 74, - "total": 280914 + "total": 290123 } }, { "languageId": "lb", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "lt", "words": { - "approved": 2969, - "total": 280914 + "approved": 2939, + "total": 290123 } }, { "languageId": "lv", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "mai", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "mk", "words": { "approved": 54, - "total": 280914 + "total": 290123 } }, { "languageId": "ml-IN", "words": { - "approved": 17898, - "total": 280914 + "approved": 17658, + "total": 290123 } }, { "languageId": "mn", "words": { "approved": 48, - "total": 280914 + "total": 290123 } }, { "languageId": "mr", "words": { - "approved": 21154, - "total": 280914 + "approved": 20933, + "total": 290123 } }, { "languageId": "ms", "words": { - "approved": 73490, - "total": 280914 + "approved": 73096, + "total": 290123 } }, { "languageId": "my", "words": { "approved": 65, - "total": 280914 + "total": 290123 } }, { "languageId": "ne-NP", "words": { - "approved": 2495, - "total": 280914 + "approved": 2474, + "total": 290123 } }, { "languageId": "nl", "words": { - "approved": 99628, - "total": 280914 + "approved": 99285, + "total": 290123 } }, { "languageId": "no", "words": { - "approved": 2947, - "total": 280914 + "approved": 2917, + "total": 290123 } }, { "languageId": "ny", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "or", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "pa-IN", "words": { "approved": 3, - "total": 280914 + "total": 290123 } }, { "languageId": "pcm", "words": { - "approved": 71318, - "total": 280914 + "approved": 71066, + "total": 290123 } }, { "languageId": "pl", "words": { - "approved": 107027, - "total": 280914 + "approved": 106556, + "total": 290123 } }, { "languageId": "ps", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "pt-BR", "words": { - "approved": 262356, - "total": 280914 + "approved": 261888, + "total": 290123 } }, { "languageId": "pt-PT", "words": { - "approved": 36615, - "total": 280914 + "approved": 36358, + "total": 290123 } }, { "languageId": "ro", "words": { - "approved": 43428, - "total": 280914 + "approved": 43173, + "total": 290123 } }, { "languageId": "ru", "words": { - "approved": 112755, - "total": 280914 + "approved": 112351, + "total": 290123 } }, { "languageId": "sat", "words": { "approved": 57, - "total": 280914 + "total": 290123 } }, { "languageId": "si-LK", "words": { "approved": 65, - "total": 280914 + "total": 290123 } }, { "languageId": "sk", "words": { - "approved": 45108, - "total": 280914 + "approved": 44856, + "total": 290123 } }, { "languageId": "sl", "words": { - "approved": 30436, - "total": 280914 + "approved": 30112, + "total": 290123 } }, { "languageId": "sn", "words": { - "approved": 6979, - "total": 280914 + "approved": 6953, + "total": 290123 } }, { "languageId": "so", "words": { "approved": 62, - "total": 280914 + "total": 290123 } }, { "languageId": "sq", "words": { "approved": 67, - "total": 280914 + "total": 290123 } }, { "languageId": "sr-CS", "words": { - "approved": 37173, - "total": 280914 + "approved": 36933, + "total": 290123 } }, { "languageId": "sv-SE", "words": { - "approved": 10090, - "total": 280914 + "approved": 9869, + "total": 290123 } }, { "languageId": "sw", "words": { - "approved": 24651, - "total": 280914 + "approved": 24302, + "total": 290123 } }, { "languageId": "ta", "words": { - "approved": 2761, - "total": 280914 + "approved": 2733, + "total": 290123 } }, { "languageId": "te", "words": { - "approved": 24679, - "total": 280914 + "approved": 24655, + "total": 290123 } }, { "languageId": "tg", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "th", "words": { - "approved": 7427, - "total": 280914 + "approved": 7401, + "total": 290123 } }, { "languageId": "ti", "words": { "approved": 0, - "total": 280914 + "total": 290123 } }, { "languageId": "tk", "words": { - "approved": 6160, - "total": 280914 + "approved": 6139, + "total": 290123 } }, { "languageId": "tl", "words": { - "approved": 48689, - "total": 280914 + "approved": 48437, + "total": 290123 } }, { "languageId": "tr", "words": { - "approved": 247464, - "total": 280914 + "approved": 246996, + "total": 290123 } }, { "languageId": "tw", "words": { - "approved": 5988, - "total": 280914 + "approved": 5967, + "total": 290123 } }, { "languageId": "uk", "words": { - "approved": 79453, - "total": 280914 + "approved": 81292, + "total": 290123 } }, { "languageId": "ur-IN", "words": { - "approved": 2475, - "total": 280914 + "approved": 2454, + "total": 290123 } }, { "languageId": "ur-PK", "words": { - "approved": 865, - "total": 280914 + "approved": 859, + "total": 290123 } }, { "languageId": "uz", "words": { - "approved": 36607, - "total": 280914 + "approved": 36355, + "total": 290123 } }, { "languageId": "vi", "words": { - "approved": 34590, - "total": 280914 + "approved": 34334, + "total": 290123 } }, { "languageId": "yo", "words": { - "approved": 43320, - "total": 280914 + "approved": 43040, + "total": 290123 } }, { "languageId": "zh-CN", "words": { - "approved": 266470, - "total": 280914 + "approved": 267747, + "total": 290123 } }, { "languageId": "zh-TW", "words": { - "approved": 236052, - "total": 280914 + "approved": 235737, + "total": 290123 } }, { "languageId": "zu", "words": { "approved": 43, - "total": 280914 + "total": 290123 } } ] \ No newline at end of file From 01d5bb8140dada81a6b9b97c029f94e489f8151b Mon Sep 17 00:00:00 2001 From: corwintines <15589226+corwintines@users.noreply.github.com> Date: Fri, 4 Jul 2025 16:29:31 +0000 Subject: [PATCH 278/368] Update chains data --- src/data/chains.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/data/chains.ts b/src/data/chains.ts index 74517751ceb..e3d24094eeb 100644 --- a/src/data/chains.ts +++ b/src/data/chains.ts @@ -1451,6 +1451,17 @@ const chains = [ }, chain: "Liveplex OracleEVM Network", }, + { + name: "Reddio", + infoURL: "https://www.reddio.com", + chainId: 50342, + nativeCurrency: { + name: "Reddio", + symbol: "RDO", + decimals: 18, + }, + chain: "ETH", + }, { name: "BirdLayer", infoURL: "https://www.dodochain.com", From 8d15faa4bc462967cc266fdf6353c46d750f1031 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 6 Jul 2025 00:23:03 +0000 Subject: [PATCH 279/368] Update Crowdin contributors --- src/data/crowdin/file-ids.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/data/crowdin/file-ids.json b/src/data/crowdin/file-ids.json index 3e8114886ff..3ca857c7e7e 100644 --- a/src/data/crowdin/file-ids.json +++ b/src/data/crowdin/file-ids.json @@ -19,6 +19,10 @@ "id": 7525, "path": "/guides/how-to-create-an-ethereum-account/index.md" }, + { + "id": 12604, + "path": "/real-world-assets/index.md" + }, { "id": 2716, "path": "/developers/docs/dapps/index.md" @@ -683,6 +687,18 @@ "id": 12032, "path": "/roadmap/dencun/index.md" }, + { + "id": 12608, + "path": "/roadmap/pectra/index.md" + }, + { + "id": 12614, + "path": "/roadmap/pectra/maxeb/index.md" + }, + { + "id": 12618, + "path": "/roadmap/pectra/7702/index.md" + }, { "id": 6398, "path": "/contributing/adding-developer-tools/index.md" From 63e177daa07f265348bf17d29d5d73e51c04a6f9 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 6 Jul 2025 00:32:18 +0000 Subject: [PATCH 280/368] Update community events --- src/data/community-events.json | 380 ++++++++++++++++++++++++++++++++- 1 file changed, 379 insertions(+), 1 deletion(-) diff --git a/src/data/community-events.json b/src/data/community-events.json index 56c5494124b..eddc70a0716 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -385,5 +385,383 @@ "location": "Cannes, FR", "description": "​L2con is the largest EthCC[8] conference focused on the future of the scaling ecosystem, General-Purpose Chains and App-Chains, development of dApps, and what unites us all — achieving mass adoption.", "imageUrl": "https://images.lumacdn.com/event-covers/cu/93aa5fca-1515-4a6a-aed3-9d933d8faf73.gif" + }, + { + "title": "Zugrama India", + "startDate": "2025-01-05", + "endDate": "2025-02-16", + "href": "https://zugrama.org/", + "location": "Thiruvananthapuram, Kerala, IND", + "description": "A pop-village experiment in India exploring technology in a co-living setup. ", + "imageUrl": "https://framerusercontent.com/images/wJDirYhhSH8znG0hz0hyH3wqOlE.png" + }, + { + "title": "BUIDL Europe", + "startDate": "2025-01-09", + "endDate": "2025-01-10", + "href": "https://buidleurope.com", + "location": "Lisbon, POR", + "description": "", + "imageUrl": "" + }, + { + "title": "ETHiopia", + "startDate": "2025-01-21", + "endDate": "2025-02-21", + "href": "https://eth-iopia.xyz", + "location": "Addis Ababa, ETH", + "description": "", + "imageUrl": "" + }, + { + "title": "EthereumZuri.ch", + "startDate": "2025-01-30", + "endDate": "2025-01-31", + "href": "https://ethereumzuri.ch/", + "location": "Zurich, CHE", + "description": "", + "imageUrl": "https://ethereumzuri.ch/ez-soc.jpg" + }, + { + "title": "EthOxford", + "startDate": "2025-02-07", + "endDate": "2025-02-09", + "href": "https://ethoxford.io/", + "location": "Oxford, UK", + "description": "Join the best builders for a 3 day hackathon hosted at Oxford University.", + "imageUrl": "https://ethoxford.io/assets/images/share.jpg?v=593c8625" + }, + { + "title": "NFT Paris*", + "startDate": "2025-02-13", + "endDate": "2025-02-14", + "href": "https://nftparis.xyz ", + "location": "Paris, FR", + "description": "NFT Paris Conference | February 13-14, 2025", + "imageUrl": "" + }, + { + "title": "RWA Paris Summit*", + "startDate": "2025-02-13", + "endDate": "2025-02-14", + "href": "https://rwaparis.xyz", + "location": "Paris, FR", + "description": "RWA Cannes | June 30th, 2025", + "imageUrl": "" + }, + { + "title": "Consensus HK*", + "startDate": "2025-02-18", + "endDate": "2025-02-20", + "href": "https://consensus-hongkong2025.coindesk.com/", + "location": "Hong Kong, HKG", + "description": "Consensus is CoinDesk’s longest-running and most influential crypto event that brings together all sides of DeFi, blockchain, Web3 and the metaverse.", + "imageUrl": "https://consensus-hongkong2025.coindesk.com/site/consensushongkong202/images/userfiles/metadata/hk-25/HK25-Generic_v2.png" + }, + { + "title": "ZKDay", + "startDate": "2025-02-20", + "endDate": "2025-02-20", + "href": "https://zklab.systems/zk-village", + "location": "Denver, USA", + "description": "", + "imageUrl": "" + }, + { + "title": "ETHDenver", + "startDate": "2025-02-23", + "endDate": "2025-03-02", + "href": "https://ethdenver.com", + "location": "Denver, USA", + "description": "ETHDenver 2025 #BUIDLathon + Community Innovation Festival", + "imageUrl": "" + }, + { + "title": "Pragma Denver", + "startDate": "2025-02-25", + "endDate": "2025-02-25", + "href": "https://ethglobal.com/events/pragma-denver2025", + "location": "Denver, USA", + "description": "Bringing developers onchain to build the future of the internet.", + "imageUrl": "https://ethglobal.com/og.png" + }, + { + "title": "Modular Carnival", + "startDate": "2025-02-25", + "endDate": "2025-03-01", + "href": "https://modularcarnival.xyz", + "location": "Belo Horizonte, BRA", + "description": "", + "imageUrl": "" + }, + { + "title": "Edge City Austin", + "startDate": "2025-03-02", + "endDate": "2025-03-07", + "href": "https://www.edgecity.live/austin", + "location": "Austin, USA", + "description": "Edge City Austin", + "imageUrl": "" + }, + { + "title": "Crecimiento", + "startDate": "2025-04-18", + "endDate": "2025-03-28", + "href": "https://crecimientoar", + "location": "TBD, ARG", + "description": "", + "imageUrl": "" + }, + { + "title": "EthereumSF", + "startDate": "2025-03-10", + "endDate": "2025-03-16", + "href": "https://ethereumsf.org/", + "location": "San Francisco, US", + "description": "", + "imageUrl": "" + }, + { + "title": "Building Blocks", + "startDate": "2025-03-25", + "endDate": "2025-03-29", + "href": "https://buildingblockstlv.com/", + "location": "Tel Aviv, IL", + "description": "Building Blocks - Scaling Crypto Startups", + "imageUrl": "" + }, + { + "title": "ETH Pondy", + "startDate": "2025-03-28", + "endDate": "2025-03-30", + "href": "https://ethpondy.xyz ", + "location": "Pondicherry, IND", + "description": "Shaping the future of decentralized world from the shores of Pondy.", + "imageUrl": "" + }, + { + "title": "ETHTaipei", + "startDate": "2025-04-01", + "endDate": "2025-04-02", + "href": "https://ethtaipei.org ", + "location": "Taipei, TW", + "description": "Welcome to ETHTaipei 2025 event held in Taiwan. With a thriving Ethereum and developer community in Taiwan, ETHTaipei 2025 has brought together teams from around the world to participate in a 2-day conference focusing on the application and technology of Ethereum.", + "imageUrl": "https://ethtaipei.org/images/ethtaipei-meta-image.jpg" + }, + { + "title": "ETH Bucharest", + "startDate": "2025-04-02", + "endDate": "2025-04-05", + "href": "https://ethbucharest.xyz", + "location": "Bucharest, Romania", + "description": "", + "imageUrl": "https://ethbucharest.ro/images/og-image.png" + }, + { + "title": "Pragma Taipei", + "startDate": "2025-04-03", + "endDate": "2025-04-03", + "href": "https://ethglobal.com/events/pragma-taipei", + "location": "Taipei, TWN", + "description": "Bringing developers onchain to build the future of the internet.", + "imageUrl": "https://ethglobal.b-cdn.net/events/pragma-taipei/images/xz8q8/default.jpg" + }, + { + "title": "Edge Expedition South Africa", + "startDate": "2025-04-03", + "endDate": "2025-04-12", + "href": "https://www.edgecity.live/southafrica", + "location": "Capetown, ZA", + "description": "Edge Expedition | South Africa", + "imageUrl": "https://cdn.prod.website-files.com/65b2cb5abdecf7cd7747e170/67d8934eaa0a184189333aae_OpenGraph%20(1).avif" + }, + { + "title": "ETHGlobal Taipei", + "startDate": "2025-04-04", + "endDate": "2025-04-06", + "href": "https://ethglobal.com/events/taipei", + "location": "Taipei, TWN", + "description": "Bringing developers onchain to build the future of the internet.", + "imageUrl": "https://ethglobal.b-cdn.net/events/taipei/images/8wf4a/default.jpg" + }, + { + "title": "Appcon", + "startDate": "2025-04-07", + "endDate": "2025-04-13", + "href": "https://appcon.org", + "location": "Milan, ITA", + "description": "Discover the top Ethereum apps at Appcon in Milan, April 7-13.", + "imageUrl": "https://appcon.org/opengraph-image.png?835c5d7ae79873fa" + }, + { + "title": "zkHack", + "startDate": "2025-04-11", + "endDate": "2025-04-13", + "href": "https://zkhack.dev", + "location": "Seoul, KR", + "description": "", + "imageUrl": "" + }, + { + "title": "ETH Seoul", + "startDate": "2025-04-14", + "endDate": "2025-04-14", + "href": "https://ethseoul.org", + "location": "Seoul, KR", + "description": "", + "imageUrl": "" + }, + { + "title": "BUIDL Asia", + "startDate": "2025-04-15", + "endDate": "2025-04-16", + "href": "https://-", + "location": "Seoul, KR", + "description": "", + "imageUrl": "" + }, + { + "title": "ETH Canal", + "startDate": "2025-04-22", + "endDate": "2025-04-25", + "href": "https://ethcanal.xyz", + "location": "Panama City, PAN", + "description": "Join us at ETH Canal, in Panama, the pivotal blockchain conference series for Ethereum business & blockchain enthusiasts and developers. Discover real-world applications of Ethereum technology, engage with top-tier talent, and explore partnership opportunities in a crypto-friendly environment.", + "imageUrl": "https://www.ethcanal.xyz/web/image/2180-32d6b8d6/StockCake-Cryptocurrency%2520Enthusiast%2520Smiling_1713136212.svg" + }, + { + "title": "Staking Summit*", + "startDate": "2025-04-28", + "endDate": "2025-04-29", + "href": "https://stakingsummit.com", + "location": "Dubai, UAE", + "description": "The premier staking event. The Staking Summit brings together the top protocols, validators and investors for a two-day, in-person event.", + "imageUrl": "https://framerusercontent.com/assets/srC8Fazmab5j4iUabyZvLdIFls.png" + }, + { + "title": "ETHDubai", + "startDate": "2025-04-28", + "endDate": "2025-04-29", + "href": "https://ethdubaiconf.org/", + "location": "Dubai, UAE", + "description": "The Ethereum Dev Conference for everything DeFi, Web3, Smart Contracts, AVS, AI agents, scaling, privacy, decentralization - April 28-29, 2025 in Dubai UAE", + "imageUrl": "https://www.ethdubaiconf.org/ethdubaicard1.png" + }, + { + "title": "TOKEN2049 Dubai*", + "startDate": "2025-04-30", + "endDate": "2025-05-01", + "href": "https://token2049.com ", + "location": "Dubai, UAE", + "description": "TOKEN2049 | The World's Largest Crypto Event", + "imageUrl": "" + }, + { + "title": "ETH Cinco de Mayo", + "startDate": "2025-05-01", + "endDate": "2025-05-04", + "href": "https://ethcdm.com/", + "location": "Mexico, MX", + "description": "ETH Cinco de Mayo Conference & Hackathon, May. 1st-4th 2025, Mexico City. A perfect combination of talks, competition, workshops, networking, entrepreneurship and culture!", + "imageUrl": "https://ETHCincoDeMayo.com/assets/images/og-918.jpg" + }, + { + "title": "FarCon", + "startDate": "2025-05-01", + "endDate": "2025-05-04", + "href": "https://farcon.nyc", + "location": "New York, NYC, USA", + "description": "NYC's coziest corner.", + "imageUrl": "https://framerusercontent.com/images/sMXvEvW1Oun66bNusm2SwMjio.png" + }, + { + "title": "ETHDam", + "startDate": "2025-05-09", + "endDate": "2025-05-11", + "href": "https://ethdam.com", + "location": "Amsterdam, NL", + "description": "", + "imageUrl": "https://static.wixstatic.com/media/9830df_ceadad27c7ad469e968170753dccc507~mv2.png/v1/fill/w_2500,h_1762,al_c/9830df_ceadad27c7ad469e968170753dccc507~mv2.png" + }, + { + "title": "ETH Lisbon", + "startDate": "2025-05-09", + "endDate": "2025-05-11", + "href": "https://ethlisbon.org ", + "location": "Lisbon, POR", + "description": "ETHLisbon brings the top builders and industry leaders to Portugal to tackle real-world challenges around themes like privacy, identity, and more.", + "imageUrl": "https://framerusercontent.com/assets/k3t9FtPBibQBemLXMzCGQo0.gif" + }, + { + "title": "Consensus Toronto*", + "startDate": "2025-05-14", + "endDate": "2025-05-16", + "href": "https://consensus2025.coindesk.com/", + "location": "Hong Kong, HKG", + "description": "Consensus is CoinDesk’s longest-running and most influential crypto event that brings together all sides of DeFi, blockchain, Web3 and the metaverse.", + "imageUrl": "https://consensus2025.coindesk.com/site/consensus2025/images/userfiles/metadata/2025/C25-Homepage.png" + }, + { + "title": "Code Africa Conference", + "startDate": "2025-05-19", + "endDate": "2025-05-23", + "href": "https://codeafrica.io", + "location": "Nairobi, Kenya", + "description": "", + "imageUrl": "" + }, + { + "title": "ETHDublin 2025", + "startDate": "2025-05-23", + "endDate": "2025-05-25", + "href": "https://lu.ma/hkl5jcre", + "location": "Dublin, IRE", + "description": "", + "imageUrl": "https://social-images.lu.ma/cdn-cgi/image/format=auto,fit=cover,dpr=1,anim=false,background=white,quality=75,width=800,height=419/api/event-one?calendar_avatar=https%3A%2F%2Fimages.lumacdn.com%2Fcalendars%2F9i%2F9415dc99-f1c0-4fc1-90cb-554b7e978c7c.png&calendar_name=ETH%20Ireland&color0=%232f3833&color1=%2353866c&color2=%23f7f9f4&color3=%23c0aa8b&host_avatar=https%3A%2F%2Fimages.lumacdn.com%2Favatars%2Fsl%2Fdec7e3f9-9b6c-4b7c-a455-a96fc844eeb4&host_name=Caol%C3%A1n%20Walsh&img=https%3A%2F%2Fimages.lumacdn.com%2Fevent-covers%2Fw4%2F210944c1-f2d7-4e53-8863-a71ce51ca4cf.jpg&name=ETH%20Dublin%202025" + }, + { + "title": "ETHBratislava", + "startDate": "2025-05-23", + "endDate": "2025-05-25", + "href": "https://ethbratislava.com/", + "location": "Bratislava, SVK", + "description": "Two-day conference and hackathon focused on sharing knowledge and sparking innovative ideas aimed at energizing the entire ethereum ecosystem.", + "imageUrl": "https://framerusercontent.com/assets/IBAFZwu44FpNo95n3OoOapeFUyw.png" + }, + { + "title": "ETHPrague", + "startDate": "2025-05-27", + "endDate": "2025-05-29", + "href": "https://ethprague.com/", + "location": "Prague, CZE", + "description": "ETHPragueConf unites builders, thinkers, and visionaries to reaffirm blockchain's foundational ideals: decentralization, trustless collaboration, and open-access innovation.", + "imageUrl": "https://ethprague.com/ETHPrague_soc_share-2025.png" + }, + { + "title": "Pragma Prague", + "startDate": "2025-05-29", + "endDate": "2025-05-29", + "href": "https://ethglobal.com/events/pragma-prague", + "location": "Prague, CZE", + "description": "Bringing developers onchain to build the future of the internet.", + "imageUrl": "https://ethglobal.b-cdn.net/events/pragma-prague/images/j7fgh/default.jpg" + }, + { + "title": "ETH Enugu ‘25", + "startDate": "2025-08-04", + "endDate": "2025-08-16", + "href": "https://ethenugu.xyz", + "location": "Enugu, NG", + "description": "Nigeria's first Builder Residency & Pop-up City + South-East Nigeria's First Ethereum Conference", + "imageUrl": "https://ethenugu.xyz/favicon.ico" + }, + { + "title": "NapulETH", + "startDate": "2025-07-16", + "endDate": "2025-07-19", + "href": "https://napuleth.org/", + "location": "Naples, ITA", + "description": "NapulETH - Biggest Web3 Event In Southern Italy", + "imageUrl": "" } -] +] \ No newline at end of file From 91594a946d30ea16f93096c7051e522163362291 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun, 6 Jul 2025 10:34:26 -0700 Subject: [PATCH 281/368] chore: clean up community events - remove passed events - sort months - remove duplicate - fix NepulETH date --- src/data/community-events.json | 681 ++++----------------------------- 1 file changed, 75 insertions(+), 606 deletions(-) diff --git a/src/data/community-events.json b/src/data/community-events.json index eddc70a0716..463bc90e68d 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -1,147 +1,12 @@ [ { - "title": "ETHKyiv", - "startDate": "2025-06-13", - "endDate": "2025-06-15", - "href": "https://ethkyiv.com", - "location": "Kyiv, Ukraine", - "description": "Welcome to the 1st edition of ETHKyiv, hosted this June 21-23 and bringing together participants from diverse backgrounds, including developers, designers, entrepreneurs, and blockchain enthusiasts!", - "imageUrl": "https://ethkyiv.com/_next/image?url=%2Fimages%2Fmain-banner_01.png&w=1920&q=75" - }, - { - "title": "DappCon", - "startDate": "2025-06-16", - "endDate": "2025-06-18", - "href": "https://dappcon.io", - "location": "Berlin", - "description": "The leading summit for applications & infrastructure for an open internet", - "imageUrl": "https://framerusercontent.com/assets/EwcloiP4dkmBNB8xV0UhgCy5jE.png" - }, - { - "title": "EthCC", - "startDate": "2025-06-30", - "endDate": "2025-07-03", - "href": "https://ethcc.io", - "location": "Cannes, FR", - "description": "Ethereum Community Conference & Workshops: June 30th to July 3rd, 2025 in Cannes", - "imageUrl": "https://ethcc.io/ethcc7.jpg" - }, - { - "title": "ETHSofia", - "startDate": "2025-09-23", - "endDate": "2025-09-25", - "href": "https://ethsofia.com", - "location": "Sofia, BGR", - "description": "The first major Ethereum community conference in Bulgaria. Bringing ETH enthusiasts, professionals, and developers to the IT heart of the Balkans. 23 - 25 September 2025.", - "imageUrl": "https://framerusercontent.com/assets/OHGIdIaZVjWGAwpmJhN1z6Yuh5g.png" - }, - { - "title": "ProtoLayers Conference", - "startDate": "2025-10-11", - "endDate": "2025-10-11", - "href": "https://lu.ma/protolayersprague", - "location": "Prague, CZ", - "description": "Join us for a technical conference dedicated to exploring the edges of modular blockchain technology. This one-day event, held on May 30, 2024 brings together…", - "imageUrl": "https://social-images.lu.ma/cdn-cgi/image/format=auto,fit=cover,dpr=1,background=white,quality=75,width=800,height=419/api/event-one?calendar_avatar=https%3A%2F%2Fimages.lumacdn.com%2Fcalendars%2Fgb%2F04e6c14a-bef9-4690-a55e-58dbab9f8aca&calendar_name=ProtoLayers%20Builder%20Conference&color0=%23ffffff&color1=%23010101&color2=%238b8a8a&color3=%23ff3503&host_avatar=https%3A%2F%2Fimages.lumacdn.com%2Favatars%2Fwx%2Fd64d0bac-aec7-4589-840e-4d4111ce4988&host_name=ProtoLayers&img=https%3A%2F%2Fimages.lumacdn.com%2Fevent-covers%2Fr7%2Fa289e9d1-9744-4ccc-a812-e6ac947d09cf&name=ProtoLayers%20Conference" - }, - { - "title": "ETH Belgrade", - "startDate": "2025-06-03", - "endDate": "2025-06-08", - "href": "https://ethbelgrade.rs/", - "location": "Belgrade, SRB", - "description": "The most welcoming ETH event in the heart of the Balkans. Part of Belgrade Blockchain Week. 30 May - 4 June 2025 - see you in Belgrade!", - "imageUrl": "https://ethbelgrade.rs/eth-belgrade-og-2025.jpg" - }, - { - "title": "ETHCluj", - "startDate": "2025-06-26", - "endDate": "2025-06-28", - "href": "https://www.ethcluj.org/", - "location": "Cluj-Napoca, ROU", - "description": "ETHCluj 2025 - Ethereum for everyone conference ", - "imageUrl": "https://framerusercontent.com/images/rHUxnoTTgyhaJqvDh9ZbOPH2Dd0.jpg" - }, - { - "title": "Edge Esmeralda", - "startDate": "2025-05-24", - "endDate": "2025-06-21", - "href": "https://www.edgeesmeralda.com/", - "location": "Healdsburg, CA, USA", - "description": "Edge Esmeralda 2025", - "imageUrl": "https://cdn.prod.website-files.com/65e8d8e39d148666896efd73/6756f792af297ff60a535793_lineart-grassy-hill%202.webp" - }, - { - "title": "ETHGlobal Prague", - "startDate": "2025-05-30", - "endDate": "2025-06-01", - "href": "https://ethglobal.com/events/prague", - "location": "Prague, CZE", - "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.com/og.png" - }, - { - "title": "Non Fungible Conference*", - "startDate": "2025-06-04", - "endDate": "2025-06-06", - "href": "https://nonfungibleconference.com", - "location": "Lisbon, PRT", - "description": "NFC", - "imageUrl": "https://cdn.prod.website-files.com/667d843c349d4113343c986f/66c74ec4543c8bd11d952391_Screenshot%202024-08-22%20at%2016.44.10.png" - }, - { - "title": "Offscript", - "startDate": "2025-06-11", - "endDate": "2025-06-15", - "href": "https://toktimes.com/events/offscript-2025/", - "location": "San Miguel de Allende, MX", - "description": "Offscript | The event for creatives in web3", - "imageUrl": "https://toktimes.com/wp-content/uploads/2025/05/Offscript.jpg" - }, - { - "title": "ProtocolBerg", - "startDate": "2025-06-12", - "endDate": "2025-06-13", - "href": "https://protocol.berlin", - "location": "Berlin, GER", - "description": "Protocol Berg is a two-day protocol and research focused technical conference taking place in Prenzlauer Berg, Berlin, on June 12-13, 2025.", - "imageUrl": "https://protocol.berlin/protocol-berg-twitter.png?cache-break-2" - }, - { - "title": "NFT NYC*", - "startDate": "2025-06-23", - "endDate": "2025-06-25", - "href": "https://nft.nyc", - "location": "NYC, USA", - "description": "'The Super Bowl of NFTs' - Register now for NFT.NYC's 8th annual event. 50,000+ Alumni, the leading speakers and the best projects in the NFT ecosystem.", - "imageUrl": "https://www.nft.nyc/hubfs/nftnyc2021-eventbrite-header.png" - }, - { - "title": "Permissionless IV", - "startDate": "2025-06-24", - "endDate": "2025-06-26", - "href": "https://blockworks.co/event/permissionless-iv", - "location": "Brooklyn, NYC, USA", - "description": "Permissionless IV is the definitive gathering for crypto’s technical pioneers, creators, and builders who drive our industry forward. As the focus shifts from building infrastructure to unleashing the potential of onchain applications, Permissionless IV in New York will serve as the nexus where technical founders, developers, and builders come together to create the future.", - "imageUrl": "https://permissionless-iv.vercel.app/_next/image?url=https://blockworks-co.imgix.net/wp-content/uploads/2024/11/PMLSIV_banner_20241114a-1.png&w=1920&q=75&webp=false" - }, - { - "title": "Pragma Cannes", - "startDate": "2025-07-03", - "endDate": "2025-07-03", - "href": "https://ethglobal.com/events/pragma-cannes", - "location": "Cannes, FR", - "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.com/og.png" - }, - { - "title": "ETHGlobal Cannes", - "startDate": "2025-07-04", - "endDate": "2025-07-06", - "href": "https://ethglobal.com/events/cannes", - "location": "Cannes, FR", - "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.com/og.png" + "title": "NapulETH", + "startDate": "2025-07-17", + "endDate": "2025-07-19", + "href": "https://napuleth.org/", + "location": "Naples, ITA", + "description": "NapulETH - Biggest Web3 Event In Southern Italy", + "imageUrl": "https://cdn.moongate.id/events/59f82809-1766-4dd4-a641-7bf10bb007df/featured-image-1732163941338.svg" }, { "title": "Pragma New York", @@ -152,15 +17,6 @@ "description": "Bringing developers onchain to build the future of the internet.", "imageUrl": "https://ethglobal.com/og.png" }, - { - "title": "NapulETH", - "startDate": "2025-06-01", - "endDate": "2025-07-19", - "href": "https://napuleth.org/", - "location": "Naples, ITA", - "description": "NapulETH - Biggest Web3 Event In Southern Italy", - "imageUrl": "https://cdn.moongate.id/events/59f82809-1766-4dd4-a641-7bf10bb007df/featured-image-1732163941338.svg" - }, { "title": "SBC (The Science of Blockchain Conference 2025)", "startDate": "2025-08-04", @@ -197,6 +53,24 @@ "description": "We are Building a Sustainable web3 community in Africa", "imageUrl": "https://event.web3bridge.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flekki.d4f13308.png&w=1920&q=75" }, + { + "title": "ETHVietnam 2025", + "startDate": "2025-08-09", + "endDate": "2025-08-10", + "href": "https://eth-vietnam.com", + "location": "HCMC, VNM", + "description": "Vietnam Web3 Hub for Ethereum and Blockchain enthusiasts, designers and developers.", + "imageUrl": "http://static1.squarespace.com/static/629856e64f44db3799f8e3f6/t/6761041c2c3aab15bfbb0ec1/1734411300379/Group+2612.png?format=1500w" + }, + { + "title": "ETH Enugu '25", + "startDate": "2025-08-04", + "endDate": "2025-08-16", + "href": "https://ethenugu.xyz", + "location": "Enugu, NG", + "description": "Nigeria's first Builder Residency & Pop-up City + South-East Nigeria's First Ethereum Conference", + "imageUrl": "https://ethenugu.xyz/favicon.ico" + }, { "title": "ETHWarsaw", "startDate": "2025-09-04", @@ -224,33 +98,6 @@ "description": "Bringing developers onchain to build the future of the internet.", "imageUrl": "https://ethglobal.com/og.png" }, - { - "title": "TOKEN2049 Singapore*", - "startDate": "2025-10-01", - "endDate": "2025-10-02", - "href": "https://asia.token2049.com/", - "location": "Singapore, SGP", - "description": "TOKEN2049 is the world's largest crypto event. Join the crypto ecosystem's decision-makers in Singapore to connect, exchange ideas, network, and shape the industry.", - "imageUrl": "https://static.wixstatic.com/media/bb716a_9c36a2603e974703814b39f7ac0ff1ce%7Emv2.png/v1/fit/w_2500,h_1330,al_c/bb716a_9c36a2603e974703814b39f7ac0ff1ce%7Emv2.png" - }, - { - "title": "Encode London 2025", - "startDate": "2025-10-24", - "endDate": "2025-10-26", - "href": "https://lu.ma/Encode-London-25/?utm_source=jpx10i&utm_campaign=e0592_internal&utm_content=eventplatform", - "location": "London, UK", - "description": "We’re thrilled to return to London for another round of innovation and hands-on building! This year, we’re bringing you an exceptional dual-track event,…", - "imageUrl": "https://social-images.lu.ma/cdn-cgi/image/format=auto,fit=cover,dpr=1,anim=false,background=white,quality=75,width=800,height=419/api/event-one?calendar_avatar=https%3A%2F%2Fimages.lumacdn.com%2Fcalendars%2F0o%2F4cff6d5a-741b-4917-a568-c6767d9cd91b&calendar_name=Encode%20Club&color0=%231a1716&color1=%23725f47&color2=%23d3c9b3&color3=%237e9a39&host_avatar=https%3A%2F%2Fimages.lumacdn.com%2Favatars%2Fxn%2F04392226-d605-4c28-a6b9-2631bfcfd80e&host_name=Encode%20Club&img=https%3A%2F%2Fimages.lumacdn.com%2Fevent-covers%2Ff3%2Fc10c60fc-7220-4141-aad7-d33e8894f967&name=Encode%20London%20Research%20Conference%20and%20Hackathon" - }, - { - "title": "ETHMilan", - "startDate": "2025-06-24", - "endDate": "2025-06-24", - "href": "https://ethmilan.xyz", - "location": "Milan, ITALY", - "description": "ETHMilan 2025 – Italy's Largest ETH & Web3 Conference", - "imageUrl": "https://cdn.prod.website-files.com/677e49dfe7df51bec6e5ba71/67b58ffe31d5fe8d4e54880e__DSC0914.jpeg" - }, { "title": "EthAccra", "startDate": "2025-09-03", @@ -269,15 +116,6 @@ "description": "View and subscribe to events from ETHTokyo on Luma. ETHTokyo", "imageUrl": "https://images.lumacdn.com/calendar-cover-images/rv/316a4b25-a9fb-4ff0-ab1a-d7f23a2ba0e0" }, - { - "title": "World Expo on Blockchain*", - "startDate": "2025-05-10", - "endDate": "2025-06-03", - "href": "https://web2025.world/", - "location": "Osaka, JPN", - "description": "A future without financial inclusion, digital trust, data privacy and security is no future at all. Blockchain isn’t just relevant—it’s essential.", - "imageUrl": "https://framerusercontent.com/images/Ivp1oWg8CFUDERZIoey9dadW7E.png" - }, { "title": "ETHSafari", "startDate": "2025-09-07", @@ -287,33 +125,6 @@ "description": "ETHSafari 2025 - web3 builders conference East Africa Kenya", "imageUrl": "https://ethsafari.xyz/_next/image?url=%2FHackathon.png&w=640&q=75" }, - { - "title": "ETHVietnam 2025", - "startDate": "2025-08-09", - "endDate": "2025-08-10", - "href": "https://eth-vietnam.com", - "location": "HCMC, VNM", - "description": "Vietnam Web3 Hub for Ethereum and Blockchain enthusiasts, designers and developers.", - "imageUrl": "http://static1.squarespace.com/static/629856e64f44db3799f8e3f6/t/6761041c2c3aab15bfbb0ec1/1734411300379/Group+2612.png?format=1500w" - }, - { - "title": "EthereumBrasil", - "startDate": "2025-06-09", - "endDate": "2025-06-10", - "href": "https://ethereumbrasil.com", - "location": "São Paulo, BR", - "description": "Growing & supporting the Web3 builder community in Brazil.", - "imageUrl": "http://static1.squarespace.com/static/627921e48d48986f142cbeb0/t/67ea9c60b9673100d70d72c0/1743428704537/ethereu+brasil+logo+w+BG.png?format=1500w" - }, - { - "title": "ETH Latam", - "startDate": "2025-11-08", - "endDate": "2025-11-09", - "href": "https://ethlatam.org", - "location": "São Paulo, BR", - "description": "ETH Latam is a gathering place for builders and enthusiasts of Ethereum in Latin America.", - "imageUrl": "https://strapi.ethkipu.org/uploads/Metadata_ETH_Latam_2025_ING_759a4fae04.png" - }, { "title": "ETH Boston", "startDate": "2025-09-09", @@ -323,15 +134,6 @@ "description": "Boston Blockchain Week is the preeminent annual event celebrating the global blockchain and Web3 hub that is Greater Boston.", "imageUrl": "https://bostonblockchainweek.com/wp-content/uploads/2025/02/Vector.png" }, - { - "title": "Invisible Garden", - "startDate": "2025-10-27", - "endDate": "2025-11-16", - "href": "https://invisible.garden", - "location": "Buenos Aires, Argentina", - "description": "Pop-up dev city #1 - Ethereum | Zero Knowledge | Artificial Inteligence | Cybersecurity", - "imageUrl": "https://cdn.prod.website-files.com/6695a56b501ba1fda80ae466/67851f884a16785150e18e2c_Group%20116.svg" - }, { "title": "Boston Blockchain Week", "startDate": "2025-09-08", @@ -341,15 +143,6 @@ "description": "Boston Blockchain Week is the preeminent annual event celebrating the global blockchain and Web3 hub that is Greater Boston.", "imageUrl": "https://bostonblockchainweek.com/wp-content/uploads/2025/02/Vector.png" }, - { - "title": "DevConnect", - "startDate": "2025-11-17", - "endDate": "2025-11-22", - "href": "https://devconnect.org", - "location": "Buenos Aires, ARG", - "description": "A collaborative Ethereum week, built by and for everyone.", - "imageUrl": "https://devconnect.org/og-argentina.png?reset=1" - }, { "title": "Builders Week Istanbul", "startDate": "2025-09-01", @@ -378,390 +171,66 @@ "imageUrl": "https://ethistanbul.io/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fistanbul-background.99d6ad2a.webp&w=3840&q=75" }, { - "title": "L2con", - "startDate": "2025-07-01", - "endDate": "2025-07-01", - "href": "https://lu.ma/L2conCannes/", - "location": "Cannes, FR", - "description": "​L2con is the largest EthCC[8] conference focused on the future of the scaling ecosystem, General-Purpose Chains and App-Chains, development of dApps, and what unites us all — achieving mass adoption.", - "imageUrl": "https://images.lumacdn.com/event-covers/cu/93aa5fca-1515-4a6a-aed3-9d933d8faf73.gif" - }, - { - "title": "Zugrama India", - "startDate": "2025-01-05", - "endDate": "2025-02-16", - "href": "https://zugrama.org/", - "location": "Thiruvananthapuram, Kerala, IND", - "description": "A pop-village experiment in India exploring technology in a co-living setup. ", - "imageUrl": "https://framerusercontent.com/images/wJDirYhhSH8znG0hz0hyH3wqOlE.png" - }, - { - "title": "BUIDL Europe", - "startDate": "2025-01-09", - "endDate": "2025-01-10", - "href": "https://buidleurope.com", - "location": "Lisbon, POR", - "description": "", - "imageUrl": "" - }, - { - "title": "ETHiopia", - "startDate": "2025-01-21", - "endDate": "2025-02-21", - "href": "https://eth-iopia.xyz", - "location": "Addis Ababa, ETH", - "description": "", - "imageUrl": "" - }, - { - "title": "EthereumZuri.ch", - "startDate": "2025-01-30", - "endDate": "2025-01-31", - "href": "https://ethereumzuri.ch/", - "location": "Zurich, CHE", - "description": "", - "imageUrl": "https://ethereumzuri.ch/ez-soc.jpg" - }, - { - "title": "EthOxford", - "startDate": "2025-02-07", - "endDate": "2025-02-09", - "href": "https://ethoxford.io/", - "location": "Oxford, UK", - "description": "Join the best builders for a 3 day hackathon hosted at Oxford University.", - "imageUrl": "https://ethoxford.io/assets/images/share.jpg?v=593c8625" - }, - { - "title": "NFT Paris*", - "startDate": "2025-02-13", - "endDate": "2025-02-14", - "href": "https://nftparis.xyz ", - "location": "Paris, FR", - "description": "NFT Paris Conference | February 13-14, 2025", - "imageUrl": "" - }, - { - "title": "RWA Paris Summit*", - "startDate": "2025-02-13", - "endDate": "2025-02-14", - "href": "https://rwaparis.xyz", - "location": "Paris, FR", - "description": "RWA Cannes | June 30th, 2025", - "imageUrl": "" - }, - { - "title": "Consensus HK*", - "startDate": "2025-02-18", - "endDate": "2025-02-20", - "href": "https://consensus-hongkong2025.coindesk.com/", - "location": "Hong Kong, HKG", - "description": "Consensus is CoinDesk’s longest-running and most influential crypto event that brings together all sides of DeFi, blockchain, Web3 and the metaverse.", - "imageUrl": "https://consensus-hongkong2025.coindesk.com/site/consensushongkong202/images/userfiles/metadata/hk-25/HK25-Generic_v2.png" - }, - { - "title": "ZKDay", - "startDate": "2025-02-20", - "endDate": "2025-02-20", - "href": "https://zklab.systems/zk-village", - "location": "Denver, USA", - "description": "", - "imageUrl": "" - }, - { - "title": "ETHDenver", - "startDate": "2025-02-23", - "endDate": "2025-03-02", - "href": "https://ethdenver.com", - "location": "Denver, USA", - "description": "ETHDenver 2025 #BUIDLathon + Community Innovation Festival", - "imageUrl": "" - }, - { - "title": "Pragma Denver", - "startDate": "2025-02-25", - "endDate": "2025-02-25", - "href": "https://ethglobal.com/events/pragma-denver2025", - "location": "Denver, USA", - "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.com/og.png" - }, - { - "title": "Modular Carnival", - "startDate": "2025-02-25", - "endDate": "2025-03-01", - "href": "https://modularcarnival.xyz", - "location": "Belo Horizonte, BRA", - "description": "", - "imageUrl": "" - }, - { - "title": "Edge City Austin", - "startDate": "2025-03-02", - "endDate": "2025-03-07", - "href": "https://www.edgecity.live/austin", - "location": "Austin, USA", - "description": "Edge City Austin", - "imageUrl": "" - }, - { - "title": "Crecimiento", - "startDate": "2025-04-18", - "endDate": "2025-03-28", - "href": "https://crecimientoar", - "location": "TBD, ARG", - "description": "", - "imageUrl": "" - }, - { - "title": "EthereumSF", - "startDate": "2025-03-10", - "endDate": "2025-03-16", - "href": "https://ethereumsf.org/", - "location": "San Francisco, US", - "description": "", - "imageUrl": "" - }, - { - "title": "Building Blocks", - "startDate": "2025-03-25", - "endDate": "2025-03-29", - "href": "https://buildingblockstlv.com/", - "location": "Tel Aviv, IL", - "description": "Building Blocks - Scaling Crypto Startups", - "imageUrl": "" - }, - { - "title": "ETH Pondy", - "startDate": "2025-03-28", - "endDate": "2025-03-30", - "href": "https://ethpondy.xyz ", - "location": "Pondicherry, IND", - "description": "Shaping the future of decentralized world from the shores of Pondy.", - "imageUrl": "" - }, - { - "title": "ETHTaipei", - "startDate": "2025-04-01", - "endDate": "2025-04-02", - "href": "https://ethtaipei.org ", - "location": "Taipei, TW", - "description": "Welcome to ETHTaipei 2025 event held in Taiwan. With a thriving Ethereum and developer community in Taiwan, ETHTaipei 2025 has brought together teams from around the world to participate in a 2-day conference focusing on the application and technology of Ethereum.", - "imageUrl": "https://ethtaipei.org/images/ethtaipei-meta-image.jpg" - }, - { - "title": "ETH Bucharest", - "startDate": "2025-04-02", - "endDate": "2025-04-05", - "href": "https://ethbucharest.xyz", - "location": "Bucharest, Romania", - "description": "", - "imageUrl": "https://ethbucharest.ro/images/og-image.png" - }, - { - "title": "Pragma Taipei", - "startDate": "2025-04-03", - "endDate": "2025-04-03", - "href": "https://ethglobal.com/events/pragma-taipei", - "location": "Taipei, TWN", - "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.b-cdn.net/events/pragma-taipei/images/xz8q8/default.jpg" - }, - { - "title": "Edge Expedition South Africa", - "startDate": "2025-04-03", - "endDate": "2025-04-12", - "href": "https://www.edgecity.live/southafrica", - "location": "Capetown, ZA", - "description": "Edge Expedition | South Africa", - "imageUrl": "https://cdn.prod.website-files.com/65b2cb5abdecf7cd7747e170/67d8934eaa0a184189333aae_OpenGraph%20(1).avif" - }, - { - "title": "ETHGlobal Taipei", - "startDate": "2025-04-04", - "endDate": "2025-04-06", - "href": "https://ethglobal.com/events/taipei", - "location": "Taipei, TWN", - "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.b-cdn.net/events/taipei/images/8wf4a/default.jpg" - }, - { - "title": "Appcon", - "startDate": "2025-04-07", - "endDate": "2025-04-13", - "href": "https://appcon.org", - "location": "Milan, ITA", - "description": "Discover the top Ethereum apps at Appcon in Milan, April 7-13.", - "imageUrl": "https://appcon.org/opengraph-image.png?835c5d7ae79873fa" - }, - { - "title": "zkHack", - "startDate": "2025-04-11", - "endDate": "2025-04-13", - "href": "https://zkhack.dev", - "location": "Seoul, KR", - "description": "", - "imageUrl": "" - }, - { - "title": "ETH Seoul", - "startDate": "2025-04-14", - "endDate": "2025-04-14", - "href": "https://ethseoul.org", - "location": "Seoul, KR", - "description": "", - "imageUrl": "" - }, - { - "title": "BUIDL Asia", - "startDate": "2025-04-15", - "endDate": "2025-04-16", - "href": "https://-", - "location": "Seoul, KR", - "description": "", - "imageUrl": "" - }, - { - "title": "ETH Canal", - "startDate": "2025-04-22", - "endDate": "2025-04-25", - "href": "https://ethcanal.xyz", - "location": "Panama City, PAN", - "description": "Join us at ETH Canal, in Panama, the pivotal blockchain conference series for Ethereum business & blockchain enthusiasts and developers. Discover real-world applications of Ethereum technology, engage with top-tier talent, and explore partnership opportunities in a crypto-friendly environment.", - "imageUrl": "https://www.ethcanal.xyz/web/image/2180-32d6b8d6/StockCake-Cryptocurrency%2520Enthusiast%2520Smiling_1713136212.svg" - }, - { - "title": "Staking Summit*", - "startDate": "2025-04-28", - "endDate": "2025-04-29", - "href": "https://stakingsummit.com", - "location": "Dubai, UAE", - "description": "The premier staking event. The Staking Summit brings together the top protocols, validators and investors for a two-day, in-person event.", - "imageUrl": "https://framerusercontent.com/assets/srC8Fazmab5j4iUabyZvLdIFls.png" - }, - { - "title": "ETHDubai", - "startDate": "2025-04-28", - "endDate": "2025-04-29", - "href": "https://ethdubaiconf.org/", - "location": "Dubai, UAE", - "description": "The Ethereum Dev Conference for everything DeFi, Web3, Smart Contracts, AVS, AI agents, scaling, privacy, decentralization - April 28-29, 2025 in Dubai UAE", - "imageUrl": "https://www.ethdubaiconf.org/ethdubaicard1.png" - }, - { - "title": "TOKEN2049 Dubai*", - "startDate": "2025-04-30", - "endDate": "2025-05-01", - "href": "https://token2049.com ", - "location": "Dubai, UAE", - "description": "TOKEN2049 | The World's Largest Crypto Event", - "imageUrl": "" - }, - { - "title": "ETH Cinco de Mayo", - "startDate": "2025-05-01", - "endDate": "2025-05-04", - "href": "https://ethcdm.com/", - "location": "Mexico, MX", - "description": "ETH Cinco de Mayo Conference & Hackathon, May. 1st-4th 2025, Mexico City. A perfect combination of talks, competition, workshops, networking, entrepreneurship and culture!", - "imageUrl": "https://ETHCincoDeMayo.com/assets/images/og-918.jpg" - }, - { - "title": "FarCon", - "startDate": "2025-05-01", - "endDate": "2025-05-04", - "href": "https://farcon.nyc", - "location": "New York, NYC, USA", - "description": "NYC's coziest corner.", - "imageUrl": "https://framerusercontent.com/images/sMXvEvW1Oun66bNusm2SwMjio.png" - }, - { - "title": "ETHDam", - "startDate": "2025-05-09", - "endDate": "2025-05-11", - "href": "https://ethdam.com", - "location": "Amsterdam, NL", - "description": "", - "imageUrl": "https://static.wixstatic.com/media/9830df_ceadad27c7ad469e968170753dccc507~mv2.png/v1/fill/w_2500,h_1762,al_c/9830df_ceadad27c7ad469e968170753dccc507~mv2.png" - }, - { - "title": "ETH Lisbon", - "startDate": "2025-05-09", - "endDate": "2025-05-11", - "href": "https://ethlisbon.org ", - "location": "Lisbon, POR", - "description": "ETHLisbon brings the top builders and industry leaders to Portugal to tackle real-world challenges around themes like privacy, identity, and more.", - "imageUrl": "https://framerusercontent.com/assets/k3t9FtPBibQBemLXMzCGQo0.gif" - }, - { - "title": "Consensus Toronto*", - "startDate": "2025-05-14", - "endDate": "2025-05-16", - "href": "https://consensus2025.coindesk.com/", - "location": "Hong Kong, HKG", - "description": "Consensus is CoinDesk’s longest-running and most influential crypto event that brings together all sides of DeFi, blockchain, Web3 and the metaverse.", - "imageUrl": "https://consensus2025.coindesk.com/site/consensus2025/images/userfiles/metadata/2025/C25-Homepage.png" - }, - { - "title": "Code Africa Conference", - "startDate": "2025-05-19", - "endDate": "2025-05-23", - "href": "https://codeafrica.io", - "location": "Nairobi, Kenya", - "description": "", - "imageUrl": "" + "title": "ETHSofia", + "startDate": "2025-09-23", + "endDate": "2025-09-25", + "href": "https://ethsofia.com", + "location": "Sofia, BGR", + "description": "The first major Ethereum community conference in Bulgaria. Bringing ETH enthusiasts, professionals, and developers to the IT heart of the Balkans. 23 - 25 September 2025.", + "imageUrl": "https://framerusercontent.com/assets/OHGIdIaZVjWGAwpmJhN1z6Yuh5g.png" }, { - "title": "ETHDublin 2025", - "startDate": "2025-05-23", - "endDate": "2025-05-25", - "href": "https://lu.ma/hkl5jcre", - "location": "Dublin, IRE", - "description": "", - "imageUrl": "https://social-images.lu.ma/cdn-cgi/image/format=auto,fit=cover,dpr=1,anim=false,background=white,quality=75,width=800,height=419/api/event-one?calendar_avatar=https%3A%2F%2Fimages.lumacdn.com%2Fcalendars%2F9i%2F9415dc99-f1c0-4fc1-90cb-554b7e978c7c.png&calendar_name=ETH%20Ireland&color0=%232f3833&color1=%2353866c&color2=%23f7f9f4&color3=%23c0aa8b&host_avatar=https%3A%2F%2Fimages.lumacdn.com%2Favatars%2Fsl%2Fdec7e3f9-9b6c-4b7c-a455-a96fc844eeb4&host_name=Caol%C3%A1n%20Walsh&img=https%3A%2F%2Fimages.lumacdn.com%2Fevent-covers%2Fw4%2F210944c1-f2d7-4e53-8863-a71ce51ca4cf.jpg&name=ETH%20Dublin%202025" + "title": "ProtoLayers Conference", + "startDate": "2025-10-11", + "endDate": "2025-10-11", + "href": "https://lu.ma/protolayersprague", + "location": "Prague, CZ", + "description": "Join us for a technical conference dedicated to exploring the edges of modular blockchain technology. This one-day event, held on May 30, 2024 brings together…", + "imageUrl": "https://social-images.lu.ma/cdn-cgi/image/format=auto,fit=cover,dpr=1,background=white,quality=75,width=800,height=419/api/event-one?calendar_avatar=https%3A%2F%2Fimages.lumacdn.com%2Fcalendars%2Fgb%2F04e6c14a-bef9-4690-a55e-58dbab9f8aca&calendar_name=ProtoLayers%20Builder%20Conference&color0=%23ffffff&color1=%23010101&color2=%238b8a8a&color3=%23ff3503&host_avatar=https%3A%2F%2Fimages.lumacdn.com%2Favatars%2Fwx%2Fd64d0bac-aec7-4589-840e-4d4111ce4988&host_name=ProtoLayers&img=https%3A%2F%2Fimages.lumacdn.com%2Fevent-covers%2Fr7%2Fa289e9d1-9744-4ccc-a812-e6ac947d09cf&name=ProtoLayers%20Conference" }, { - "title": "ETHBratislava", - "startDate": "2025-05-23", - "endDate": "2025-05-25", - "href": "https://ethbratislava.com/", - "location": "Bratislava, SVK", - "description": "Two-day conference and hackathon focused on sharing knowledge and sparking innovative ideas aimed at energizing the entire ethereum ecosystem.", - "imageUrl": "https://framerusercontent.com/assets/IBAFZwu44FpNo95n3OoOapeFUyw.png" + "title": "TOKEN2049 Singapore*", + "startDate": "2025-10-01", + "endDate": "2025-10-02", + "href": "https://asia.token2049.com/", + "location": "Singapore, SGP", + "description": "TOKEN2049 is the world's largest crypto event. Join the crypto ecosystem's decision-makers in Singapore to connect, exchange ideas, network, and shape the industry.", + "imageUrl": "https://static.wixstatic.com/media/bb716a_9c36a2603e974703814b39f7ac0ff1ce%7Emv2.png/v1/fit/w_2500,h_1330,al_c/bb716a_9c36a2603e974703814b39f7ac0ff1ce%7Emv2.png" }, { - "title": "ETHPrague", - "startDate": "2025-05-27", - "endDate": "2025-05-29", - "href": "https://ethprague.com/", - "location": "Prague, CZE", - "description": "ETHPragueConf unites builders, thinkers, and visionaries to reaffirm blockchain's foundational ideals: decentralization, trustless collaboration, and open-access innovation.", - "imageUrl": "https://ethprague.com/ETHPrague_soc_share-2025.png" + "title": "Encode London 2025", + "startDate": "2025-10-24", + "endDate": "2025-10-26", + "href": "https://lu.ma/Encode-London-25/?utm_source=jpx10i&utm_campaign=e0592_internal&utm_content=eventplatform", + "location": "London, UK", + "description": "We're thrilled to return to London for another round of innovation and hands-on building! This year, we're bringing you an exceptional dual-track event,…", + "imageUrl": "https://social-images.lu.ma/cdn-cgi/image/format=auto,fit=cover,dpr=1,anim=false,background=white,quality=75,width=800,height=419/api/event-one?calendar_avatar=https%3A%2F%2Fimages.lumacdn.com%2Fcalendars%2F0o%2F4cff6d5a-741b-4917-a568-c6767d9cd91b&calendar_name=Encode%20Club&color0=%231a1716&color1=%23725f47&color2=%23d3c9b3&color3=%237e9a39&host_avatar=https%3A%2F%2Fimages.lumacdn.com%2Favatars%2Fxn%2F04392226-d605-4c28-a6b9-2631bfcfd80e&host_name=Encode%20Club&img=https%3A%2F%2Fimages.lumacdn.com%2Fevent-covers%2Ff3%2Fc10c60fc-7220-4141-aad7-d33e8894f967&name=Encode%20London%20Research%20Conference%20and%20Hackathon" }, { - "title": "Pragma Prague", - "startDate": "2025-05-29", - "endDate": "2025-05-29", - "href": "https://ethglobal.com/events/pragma-prague", - "location": "Prague, CZE", - "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.b-cdn.net/events/pragma-prague/images/j7fgh/default.jpg" + "title": "Invisible Garden", + "startDate": "2025-10-27", + "endDate": "2025-11-16", + "href": "https://invisible.garden", + "location": "Buenos Aires, Argentina", + "description": "Pop-up dev city #1 - Ethereum | Zero Knowledge | Artificial Inteligence | Cybersecurity", + "imageUrl": "https://cdn.prod.website-files.com/6695a56b501ba1fda80ae466/67851f884a16785150e18e2c_Group%20116.svg" }, { - "title": "ETH Enugu ‘25", - "startDate": "2025-08-04", - "endDate": "2025-08-16", - "href": "https://ethenugu.xyz", - "location": "Enugu, NG", - "description": "Nigeria's first Builder Residency & Pop-up City + South-East Nigeria's First Ethereum Conference", - "imageUrl": "https://ethenugu.xyz/favicon.ico" + "title": "ETH Latam", + "startDate": "2025-11-08", + "endDate": "2025-11-09", + "href": "https://ethlatam.org", + "location": "São Paulo, BR", + "description": "ETH Latam is a gathering place for builders and enthusiasts of Ethereum in Latin America.", + "imageUrl": "https://strapi.ethkipu.org/uploads/Metadata_ETH_Latam_2025_ING_759a4fae04.png" }, { - "title": "NapulETH", - "startDate": "2025-07-16", - "endDate": "2025-07-19", - "href": "https://napuleth.org/", - "location": "Naples, ITA", - "description": "NapulETH - Biggest Web3 Event In Southern Italy", - "imageUrl": "" + "title": "DevConnect", + "startDate": "2025-11-17", + "endDate": "2025-11-22", + "href": "https://devconnect.org", + "location": "Buenos Aires, ARG", + "description": "A collaborative Ethereum week, built by and for everyone.", + "imageUrl": "https://devconnect.org/og-argentina.png?reset=1" } -] \ No newline at end of file +] From bd2ef8a6d8e264a0b660c98eb7d7953f0157e1e4 Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Mon, 7 Jul 2025 13:46:26 +0300 Subject: [PATCH 282/368] docs: fix syntax error by adding missing equals signs --- docs/applying-storybook.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/applying-storybook.md b/docs/applying-storybook.md index 7c6b9af5a56..49b3ea8c348 100644 --- a/docs/applying-storybook.md +++ b/docs/applying-storybook.md @@ -40,7 +40,7 @@ The initial structure of each story file will look something like this (in types ```tsx import ComponentA from "." -const meta { +const meta = { title: "ComponentA", component: ComponentA } satisfies Meta @@ -71,7 +71,7 @@ import Button from "." type ButtonType = typeof Button -const meta { +const meta = { title: "Atoms / Form / Button", component: Button } satisfies Meta From ee5b86e6d56a320a464f8dee22745c0cb2e8c911 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 7 Jul 2025 14:42:59 +0200 Subject: [PATCH 283/368] add llms.txt --- public/llms.txt | 218 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 public/llms.txt diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 00000000000..1fae280503b --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,218 @@ +# Ethereum.org + +> The official Ethereum website providing comprehensive education, resources, and community information about Ethereum - the decentralized world computer that enables smart contracts and decentralized applications. + +Ethereum.org is the primary educational hub for Ethereum, offering beginner-friendly explanations alongside advanced technical documentation. The site covers everything from basic concepts like "What is Ethereum?" to detailed developer guides, staking information, and the latest protocol research. + +## Learn + +### Basics +- [What is Ethereum?](https://ethereum.org/what-is-ethereum/): Introduction to Ethereum and its core concepts +- [What is Ether (ETH)?](https://ethereum.org/eth/): Understanding Ethereum's native cryptocurrency +- [Ethereum Wallets](https://ethereum.org/wallets/): Guide to storing and managing ETH and tokens +- [What is Web3?](https://ethereum.org/web3/): Understanding the decentralized web +- [Smart Contracts](https://ethereum.org/smart-contracts/): Introduction to programmable contracts + +### Advanced Topics +- [Gas and Fees](https://ethereum.org/gas/): Understanding transaction costs +- [Bridges](https://ethereum.org/bridges/): Moving assets between blockchains +- [Zero Knowledge Proofs](https://ethereum.org/zero-knowledge-proofs/): Privacy and scaling technology +- [Run a Node](https://ethereum.org/run-a-node/): Operating Ethereum infrastructure +- [Ethereum Security](https://ethereum.org/security/): Protecting yourself in the ecosystem + +### Educational Resources +- [Quizzes](https://ethereum.org/quizzes/): Test your Ethereum knowledge +- [Glossary](https://ethereum.org/glossary/): Definitions of key terms + +## Use + +### Getting Started +- [Start with Crypto](https://ethereum.org/start/): Complete beginner's guide +- [Find a Wallet](https://ethereum.org/wallets/find-wallet/): Wallet selection tool +- [Get ETH](https://ethereum.org/get-eth/): How to acquire Ethereum +- [Decentralized Apps (DApps)](https://ethereum.org/dapps/): Applications built on Ethereum + +### Practical Guides +- [Guides Overview](https://ethereum.org/guides/): Complete guide collection +- [How to Create an Ethereum Account](https://ethereum.org/guides/how-to-create-an-ethereum-account/) +- [How to Use a Wallet](https://ethereum.org/guides/how-to-use-a-wallet/) +- [How to Swap Tokens](https://ethereum.org/guides/how-to-swap-tokens/) +- [How to Use a Bridge](https://ethereum.org/guides/how-to-use-a-bridge/) +- [How to Revoke Token Access](https://ethereum.org/guides/how-to-revoke-token-access/) + +### Use Cases +- [Stablecoins](https://ethereum.org/stablecoins/): Dollar-pegged cryptocurrencies +- [NFTs](https://ethereum.org/nft/): Non-fungible tokens and digital ownership +- [DeFi](https://ethereum.org/defi/): Decentralized finance applications +- [Payments](https://ethereum.org/payments/): Using ETH for transactions +- [DAOs](https://ethereum.org/dao/): Decentralized autonomous organizations + +### Emerging Applications +- [Decentralized Identity](https://ethereum.org/decentralized-identity/): Self-sovereign identity +- [Decentralized Social Networks](https://ethereum.org/social-networks/): Web3 social platforms +- [Decentralized Science (DeSci)](https://ethereum.org/desci/): Research and collaboration +- [Regenerative Finance (ReFi)](https://ethereum.org/refi/): Sustainable finance +- [AI Agents](https://ethereum.org/ai-agents/): Autonomous AI on blockchain +- [Prediction Markets](https://ethereum.org/prediction-markets/): Forecasting platforms +- [Real World Assets](https://ethereum.org/real-world-assets/): Tokenizing physical assets + +### Staking +- [Staking Overview](https://ethereum.org/staking/): Earning rewards by validating +- [Solo Staking](https://ethereum.org/staking/solo/): Run your own validator +- [Staking as a Service](https://ethereum.org/staking/saas/): Managed staking solutions +- [Pooled Staking](https://ethereum.org/staking/pools/): Stake with others + +### Layer 2 Networks +- [Layer 2 Introduction](https://ethereum.org/layer-2/): Scaling solutions overview +- [Explore Networks](https://ethereum.org/layer-2/networks/): Available L2 options +- [Learn about L2](https://ethereum.org/layer-2/learn/): Technical deep dive + +## Build + +### Developer Hub +- [Developer Home](https://ethereum.org/developers/): Central hub for builders +- [Developer Documentation](https://ethereum.org/developers/docs/): Technical documentation +- [Tutorials](https://ethereum.org/developers/tutorials/): Step-by-step guides +- [Learning Tools](https://ethereum.org/developers/learning-tools/): Interactive education +- [Local Development](https://ethereum.org/developers/local-environment/): Setup guides + +### Documentation +- [Developer Documentation](https://ethereum.org/developers/docs/): Complete technical reference + +#### Foundational Topics +- [Intro to Ethereum](https://ethereum.org/developers/docs/intro-to-ethereum/): Developer-focused introduction +- [Intro to Ether](https://ethereum.org/developers/docs/intro-to-ether/): Understanding ETH as a developer +- [Intro to DApps](https://ethereum.org/developers/docs/dapps/): Decentralized applications +- [Web2 vs Web3](https://ethereum.org/developers/docs/web2-vs-web3/): Comparing paradigms +- [Accounts](https://ethereum.org/developers/docs/accounts/): Externally owned and contract accounts +- [Transactions](https://ethereum.org/developers/docs/transactions/): State changes and execution +- [Blocks](https://ethereum.org/developers/docs/blocks/): Transaction batching and ordering +- [Ethereum Virtual Machine (EVM)](https://ethereum.org/developers/docs/evm/): The execution environment + - [EVM Opcodes](https://ethereum.org/developers/docs/evm/opcodes/): Low-level instructions +- [Gas and Fees](https://ethereum.org/developers/docs/gas/): Transaction costs and optimization +- [Nodes and Clients](https://ethereum.org/developers/docs/nodes-and-clients/): Network infrastructure + - [Running a Node](https://ethereum.org/developers/docs/nodes-and-clients/run-a-node/): Setting up infrastructure + - [Client Diversity](https://ethereum.org/developers/docs/nodes-and-clients/client-diversity/): Network resilience +- [Networks](https://ethereum.org/developers/docs/networks/): Mainnet, testnets, and local networks +- [Consensus Mechanisms](https://ethereum.org/developers/docs/consensus-mechanisms/): Network agreement + - [Proof of Stake](https://ethereum.org/developers/docs/consensus-mechanisms/pos/): Current consensus mechanism + - [Proof of Work](https://ethereum.org/developers/docs/consensus-mechanisms/pow/): Historical consensus mechanism + +#### Ethereum Stack +- [Ethereum Stack Overview](https://ethereum.org/developers/docs/ethereum-stack/): Technology layers +- [Smart Contracts](https://ethereum.org/developers/docs/smart-contracts/): Self-executing programs + - [Smart Contract Languages](https://ethereum.org/developers/docs/smart-contracts/languages/): Solidity, Vyper, and others + - [Smart Contract Anatomy](https://ethereum.org/developers/docs/smart-contracts/anatomy/): Structure and components + - [Smart Contract Libraries](https://ethereum.org/developers/docs/smart-contracts/libraries/): Reusable code + - [Testing Smart Contracts](https://ethereum.org/developers/docs/smart-contracts/testing/): Verification strategies + - [Compiling Smart Contracts](https://ethereum.org/developers/docs/smart-contracts/compiling/): Build process + - [Deploying Smart Contracts](https://ethereum.org/developers/docs/smart-contracts/deploying/): Deployment strategies + - [Smart Contract Security](https://ethereum.org/developers/docs/smart-contracts/security/): Security best practices +- [Development Networks](https://ethereum.org/developers/docs/development-networks/): Local and test environments +- [Development Frameworks](https://ethereum.org/developers/docs/frameworks/): Hardhat, Truffle, and others +- [Ethereum Client APIs](https://ethereum.org/developers/docs/apis/): Interacting with Ethereum + - [JavaScript APIs](https://ethereum.org/developers/docs/apis/javascript/): Web3.js and ethers.js + - [Backend APIs](https://ethereum.org/developers/docs/apis/backend/): Server-side integration + - [JSON-RPC](https://ethereum.org/developers/docs/apis/json-rpc/): Protocol specification +- [Data and Analytics](https://ethereum.org/developers/docs/data-and-analytics/): Blockchain data access + - [Block Explorers](https://ethereum.org/developers/docs/data-and-analytics/block-explorers/): Data visualization tools +- [Storage](https://ethereum.org/developers/docs/storage/): Data persistence strategies +- [IDEs](https://ethereum.org/developers/docs/ides/): Development environments +- [Programming Languages](https://ethereum.org/developers/docs/programming-languages/): Language-specific resources + - [JavaScript](https://ethereum.org/developers/docs/programming-languages/javascript/): Web3 development + - [Python](https://ethereum.org/developers/docs/programming-languages/python/): Backend development + - [Rust](https://ethereum.org/developers/docs/programming-languages/rust/): Systems programming + - [Go](https://ethereum.org/developers/docs/programming-languages/golang/): Client development + +#### Advanced Topics +- [Bridges](https://ethereum.org/developers/docs/bridges/): Cross-chain interoperability +- [Standards](https://ethereum.org/developers/docs/standards/): Ethereum Request for Comments (ERCs) + - [Token Standards](https://ethereum.org/developers/docs/standards/tokens/): ERC-20, ERC-721, ERC-1155 +- [MEV](https://ethereum.org/developers/docs/mev/): Maximal Extractable Value +- [Oracles](https://ethereum.org/developers/docs/oracles/): External data integration +- [Scaling](https://ethereum.org/developers/docs/scaling/): Layer 2 solutions + - [Optimistic Rollups](https://ethereum.org/developers/docs/scaling/optimistic-rollups/): Fraud proof scaling + - [ZK Rollups](https://ethereum.org/developers/docs/scaling/zk-rollups/): Zero-knowledge scaling + - [State Channels](https://ethereum.org/developers/docs/scaling/state-channels/): Off-chain computation + - [Sidechains](https://ethereum.org/developers/docs/scaling/sidechains/): Independent blockchains +- [Data Availability](https://ethereum.org/developers/docs/data-availability/): Data accessibility solutions +- [Networking Layer](https://ethereum.org/developers/docs/networking-layer/): P2P networking +- [Data Structures and Encoding](https://ethereum.org/developers/docs/data-structures-and-encoding/): Low-level data formats + +#### Design Fundamentals +- [Design and UX](https://ethereum.org/developers/docs/design-and-ux/): User experience for Web3 + +### Enterprise +- [Enterprise Ethereum](https://ethereum.org/enterprise/): Business adoption and use cases + +## Participate + +### Community +- [Community Hub](https://ethereum.org/community/): Get involved with Ethereum +- [Ethereum Online](https://ethereum.org/community/online/): Virtual communities +- [Ethereum Events](https://ethereum.org/community/events/): Meetups and conferences +- [Community Grants](https://ethereum.org/community/grants/): Funding opportunities +- [Bug Bounty Program](https://ethereum.org/bug-bounty/): Security vulnerability rewards +- [Code of Conduct](https://ethereum.org/community/code-of-conduct/): Community guidelines + +### Contributing +- [Contributing Guide](https://ethereum.org/contributing/): How to contribute to ethereum.org +- [Translation Program](https://ethereum.org/contributing/translation-program/): Localization efforts +- [Content Resources](https://ethereum.org/contributing/content-resources/): Writing guidelines +- [Design Contributions](https://ethereum.org/contributing/design/): Design resources + +### About +- [About Ethereum.org](https://ethereum.org/about/): Mission and vision +- [Ethereum Foundation](https://ethereum.org/foundation/): Supporting organization +- [Ethereum Brand Assets](https://ethereum.org/assets/): Official logos and branding + +### External Resources +- [Ethereum Foundation Blog](https://blog.ethereum.org/): Official announcements and updates +- [Ethereum Support Program (ESP)](https://esp.ethereum.foundation): Funding for ecosystem projects +- [Devcon](https://devcon.org/): Annual Ethereum developer conference + +## Research + +### Foundational Documents +- [Ethereum Whitepaper](https://ethereum.org/whitepaper/): Original vision document +- [Ethereum Improvement Proposals (EIPs)](https://ethereum.org/eips/): Protocol upgrades +- [Ethereum History](https://ethereum.org/history/): Timeline and milestones + +### Protocol Development +- [Ethereum Roadmap](https://ethereum.org/roadmap/): Future development plans +- [Roadmap Security](https://ethereum.org/roadmap/security/): Security improvements +- [Roadmap Scaling](https://ethereum.org/roadmap/scaling/): Scalability solutions +- [Roadmap User Experience](https://ethereum.org/roadmap/user-experience/): UX improvements +- [Roadmap Future-Proofing](https://ethereum.org/roadmap/future-proofing/): Long-term sustainability + +### Research Areas +- [Open Research](https://ethereum.org/community/research/): Academic research +- [Governance](https://ethereum.org/governance/): Protocol governance +- [Energy Consumption](https://ethereum.org/energy-consumption/): Environmental impact +- [Trillion Dollar Security](https://ethereum.org/trillion-dollar-security/): Ethereum security analysis + +## Key Resources + +### Official Documentation +- [Developer Documentation](https://ethereum.org/developers/docs/): Complete technical reference +- [Ethereum Improvement Proposals](https://ethereum.org/eips/): Protocol specifications +- [Ethereum Whitepaper](https://ethereum.org/whitepaper/): Original design document + +### Tools and Services +- [Wallet Finder](https://ethereum.org/wallets/find-wallet/): Wallet recommendation tool +- [DApp Browser](https://ethereum.org/dapps/): Decentralized application directory +- [Node Setup Guides](https://ethereum.org/run-a-node/): Infrastructure guides +- [Get ETH](https://ethereum.org/get-eth/): Acquisition methods + +### Educational Content +- [Beginner's Guide](https://ethereum.org/what-is-ethereum/): Start here for basics +- [Interactive Tutorials](https://ethereum.org/developers/tutorials/): Hands-on learning +- [Quiz Platform](https://ethereum.org/quizzes/): Knowledge assessment +- [Glossary](https://ethereum.org/glossary/): Comprehensive definitions + +## Legal and Policies + +### Terms and Policies +- [Privacy Policy](https://ethereum.org/privacy-policy/): Data protection and privacy practices +- [Terms of Use](https://ethereum.org/terms-of-use/): Website usage terms and conditions +- [Cookie Policy](https://ethereum.org/cookie-policy/): Information about cookie usage From 24dee47ff744a63dad242c41f45ef0cbf0d502fa Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 7 Jul 2025 15:00:55 +0200 Subject: [PATCH 284/368] point to md files for those pages that have a md file --- public/llms.txt | 204 ++++++++++++++++++++++++------------------------ 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index 1fae280503b..2c85a7964f4 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -10,15 +10,15 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie - [What is Ethereum?](https://ethereum.org/what-is-ethereum/): Introduction to Ethereum and its core concepts - [What is Ether (ETH)?](https://ethereum.org/eth/): Understanding Ethereum's native cryptocurrency - [Ethereum Wallets](https://ethereum.org/wallets/): Guide to storing and managing ETH and tokens -- [What is Web3?](https://ethereum.org/web3/): Understanding the decentralized web -- [Smart Contracts](https://ethereum.org/smart-contracts/): Introduction to programmable contracts +- [What is Web3?](https://ethereum.org/content/web3/index.md): Understanding the decentralized web +- [Smart Contracts](https://ethereum.org/content/smart-contracts/index.md): Introduction to programmable contracts ### Advanced Topics - [Gas and Fees](https://ethereum.org/gas/): Understanding transaction costs -- [Bridges](https://ethereum.org/bridges/): Moving assets between blockchains -- [Zero Knowledge Proofs](https://ethereum.org/zero-knowledge-proofs/): Privacy and scaling technology +- [Bridges](https://ethereum.org/content/bridges/index.md): Moving assets between blockchains +- [Zero Knowledge Proofs](https://ethereum.org/content/zero-knowledge-proofs/index.md): Privacy and scaling technology - [Run a Node](https://ethereum.org/run-a-node/): Operating Ethereum infrastructure -- [Ethereum Security](https://ethereum.org/security/): Protecting yourself in the ecosystem +- [Ethereum Security](https://ethereum.org/content/security/index.md): Protecting yourself in the ecosystem ### Educational Resources - [Quizzes](https://ethereum.org/quizzes/): Test your Ethereum knowledge @@ -33,34 +33,34 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie - [Decentralized Apps (DApps)](https://ethereum.org/dapps/): Applications built on Ethereum ### Practical Guides -- [Guides Overview](https://ethereum.org/guides/): Complete guide collection -- [How to Create an Ethereum Account](https://ethereum.org/guides/how-to-create-an-ethereum-account/) -- [How to Use a Wallet](https://ethereum.org/guides/how-to-use-a-wallet/) -- [How to Swap Tokens](https://ethereum.org/guides/how-to-swap-tokens/) -- [How to Use a Bridge](https://ethereum.org/guides/how-to-use-a-bridge/) -- [How to Revoke Token Access](https://ethereum.org/guides/how-to-revoke-token-access/) +- [Guides Overview](https://ethereum.org/content/guides/index.md): Complete guide collection +- [How to Create an Ethereum Account](https://ethereum.org/content/guides/how-to-create-an-ethereum-account/index.md) +- [How to Use a Wallet](https://ethereum.org/content/guides/how-to-use-a-wallet/index.md) +- [How to Swap Tokens](https://ethereum.org/content/guides/how-to-swap-tokens/index.md) +- [How to Use a Bridge](https://ethereum.org/content/guides/how-to-use-a-bridge/index.md) +- [How to Revoke Token Access](https://ethereum.org/content/guides/how-to-revoke-token-access/index.md) ### Use Cases - [Stablecoins](https://ethereum.org/stablecoins/): Dollar-pegged cryptocurrencies -- [NFTs](https://ethereum.org/nft/): Non-fungible tokens and digital ownership -- [DeFi](https://ethereum.org/defi/): Decentralized finance applications -- [Payments](https://ethereum.org/payments/): Using ETH for transactions -- [DAOs](https://ethereum.org/dao/): Decentralized autonomous organizations +- [NFTs](https://ethereum.org/content/nft/index.md): Non-fungible tokens and digital ownership +- [DeFi](https://ethereum.org/content/defi/index.md): Decentralized finance applications +- [Payments](https://ethereum.org/content/payments/index.md): Using ETH for transactions +- [DAOs](https://ethereum.org/content/dao/index.md): Decentralized autonomous organizations ### Emerging Applications -- [Decentralized Identity](https://ethereum.org/decentralized-identity/): Self-sovereign identity -- [Decentralized Social Networks](https://ethereum.org/social-networks/): Web3 social platforms -- [Decentralized Science (DeSci)](https://ethereum.org/desci/): Research and collaboration -- [Regenerative Finance (ReFi)](https://ethereum.org/refi/): Sustainable finance -- [AI Agents](https://ethereum.org/ai-agents/): Autonomous AI on blockchain -- [Prediction Markets](https://ethereum.org/prediction-markets/): Forecasting platforms -- [Real World Assets](https://ethereum.org/real-world-assets/): Tokenizing physical assets +- [Decentralized Identity](https://ethereum.org/content/decentralized-identity/index.md): Self-sovereign identity +- [Decentralized Social Networks](https://ethereum.org/content/social-networks/index.md): Web3 social platforms +- [Decentralized Science (DeSci)](https://ethereum.org/content/desci/index.md): Research and collaboration +- [Regenerative Finance (ReFi)](https://ethereum.org/content/refi/index.md): Sustainable finance +- [AI Agents](https://ethereum.org/content/ai-agents/index.md): Autonomous AI on blockchain +- [Prediction Markets](https://ethereum.org/content/prediction-markets/index.md): Forecasting platforms +- [Real World Assets](https://ethereum.org/content/real-world-assets/index.md): Tokenizing physical assets ### Staking - [Staking Overview](https://ethereum.org/staking/): Earning rewards by validating -- [Solo Staking](https://ethereum.org/staking/solo/): Run your own validator -- [Staking as a Service](https://ethereum.org/staking/saas/): Managed staking solutions -- [Pooled Staking](https://ethereum.org/staking/pools/): Stake with others +- [Solo Staking](https://ethereum.org/content/staking/solo/index.md): Run your own validator +- [Staking as a Service](https://ethereum.org/content/staking/saas/index.md): Managed staking solutions +- [Pooled Staking](https://ethereum.org/content/staking/pools/index.md): Stake with others ### Layer 2 Networks - [Layer 2 Introduction](https://ethereum.org/layer-2/): Scaling solutions overview @@ -77,70 +77,70 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie - [Local Development](https://ethereum.org/developers/local-environment/): Setup guides ### Documentation -- [Developer Documentation](https://ethereum.org/developers/docs/): Complete technical reference +- [Developer Documentation](https://ethereum.org/content/developers/docs/index.md): Complete technical reference #### Foundational Topics -- [Intro to Ethereum](https://ethereum.org/developers/docs/intro-to-ethereum/): Developer-focused introduction -- [Intro to Ether](https://ethereum.org/developers/docs/intro-to-ether/): Understanding ETH as a developer -- [Intro to DApps](https://ethereum.org/developers/docs/dapps/): Decentralized applications -- [Web2 vs Web3](https://ethereum.org/developers/docs/web2-vs-web3/): Comparing paradigms -- [Accounts](https://ethereum.org/developers/docs/accounts/): Externally owned and contract accounts -- [Transactions](https://ethereum.org/developers/docs/transactions/): State changes and execution -- [Blocks](https://ethereum.org/developers/docs/blocks/): Transaction batching and ordering -- [Ethereum Virtual Machine (EVM)](https://ethereum.org/developers/docs/evm/): The execution environment - - [EVM Opcodes](https://ethereum.org/developers/docs/evm/opcodes/): Low-level instructions -- [Gas and Fees](https://ethereum.org/developers/docs/gas/): Transaction costs and optimization -- [Nodes and Clients](https://ethereum.org/developers/docs/nodes-and-clients/): Network infrastructure - - [Running a Node](https://ethereum.org/developers/docs/nodes-and-clients/run-a-node/): Setting up infrastructure - - [Client Diversity](https://ethereum.org/developers/docs/nodes-and-clients/client-diversity/): Network resilience -- [Networks](https://ethereum.org/developers/docs/networks/): Mainnet, testnets, and local networks -- [Consensus Mechanisms](https://ethereum.org/developers/docs/consensus-mechanisms/): Network agreement - - [Proof of Stake](https://ethereum.org/developers/docs/consensus-mechanisms/pos/): Current consensus mechanism - - [Proof of Work](https://ethereum.org/developers/docs/consensus-mechanisms/pow/): Historical consensus mechanism +- [Intro to Ethereum](https://ethereum.org/content/developers/docs/intro-to-ethereum/index.md): Developer-focused introduction +- [Intro to Ether](https://ethereum.org/content/developers/docs/intro-to-ether/index.md): Understanding ETH as a developer +- [Intro to DApps](https://ethereum.org/content/developers/docs/dapps/index.md): Decentralized applications +- [Web2 vs Web3](https://ethereum.org/content/developers/docs/web2-vs-web3/index.md): Comparing paradigms +- [Accounts](https://ethereum.org/content/developers/docs/accounts/index.md): Externally owned and contract accounts +- [Transactions](https://ethereum.org/content/developers/docs/transactions/index.md): State changes and execution +- [Blocks](https://ethereum.org/content/developers/docs/blocks/index.md): Transaction batching and ordering +- [Ethereum Virtual Machine (EVM)](https://ethereum.org/content/developers/docs/evm/index.md): The execution environment + - [EVM Opcodes](https://ethereum.org/content/developers/docs/evm/opcodes/index.md): Low-level instructions +- [Gas and Fees](https://ethereum.org/content/developers/docs/gas/index.md): Transaction costs and optimization +- [Nodes and Clients](https://ethereum.org/content/developers/docs/nodes-and-clients/index.md): Network infrastructure + - [Running a Node](https://ethereum.org/content/developers/docs/nodes-and-clients/run-a-node/index.md): Setting up infrastructure + - [Client Diversity](https://ethereum.org/content/developers/docs/nodes-and-clients/client-diversity/index.md): Network resilience +- [Networks](https://ethereum.org/content/developers/docs/networks/index.md): Mainnet, testnets, and local networks +- [Consensus Mechanisms](https://ethereum.org/content/developers/docs/consensus-mechanisms/index.md): Network agreement + - [Proof of Stake](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/index.md): Current consensus mechanism + - [Proof of Work](https://ethereum.org/content/developers/docs/consensus-mechanisms/pow/index.md): Historical consensus mechanism #### Ethereum Stack -- [Ethereum Stack Overview](https://ethereum.org/developers/docs/ethereum-stack/): Technology layers -- [Smart Contracts](https://ethereum.org/developers/docs/smart-contracts/): Self-executing programs - - [Smart Contract Languages](https://ethereum.org/developers/docs/smart-contracts/languages/): Solidity, Vyper, and others - - [Smart Contract Anatomy](https://ethereum.org/developers/docs/smart-contracts/anatomy/): Structure and components - - [Smart Contract Libraries](https://ethereum.org/developers/docs/smart-contracts/libraries/): Reusable code - - [Testing Smart Contracts](https://ethereum.org/developers/docs/smart-contracts/testing/): Verification strategies - - [Compiling Smart Contracts](https://ethereum.org/developers/docs/smart-contracts/compiling/): Build process - - [Deploying Smart Contracts](https://ethereum.org/developers/docs/smart-contracts/deploying/): Deployment strategies - - [Smart Contract Security](https://ethereum.org/developers/docs/smart-contracts/security/): Security best practices -- [Development Networks](https://ethereum.org/developers/docs/development-networks/): Local and test environments -- [Development Frameworks](https://ethereum.org/developers/docs/frameworks/): Hardhat, Truffle, and others -- [Ethereum Client APIs](https://ethereum.org/developers/docs/apis/): Interacting with Ethereum - - [JavaScript APIs](https://ethereum.org/developers/docs/apis/javascript/): Web3.js and ethers.js - - [Backend APIs](https://ethereum.org/developers/docs/apis/backend/): Server-side integration - - [JSON-RPC](https://ethereum.org/developers/docs/apis/json-rpc/): Protocol specification -- [Data and Analytics](https://ethereum.org/developers/docs/data-and-analytics/): Blockchain data access - - [Block Explorers](https://ethereum.org/developers/docs/data-and-analytics/block-explorers/): Data visualization tools -- [Storage](https://ethereum.org/developers/docs/storage/): Data persistence strategies -- [IDEs](https://ethereum.org/developers/docs/ides/): Development environments -- [Programming Languages](https://ethereum.org/developers/docs/programming-languages/): Language-specific resources - - [JavaScript](https://ethereum.org/developers/docs/programming-languages/javascript/): Web3 development - - [Python](https://ethereum.org/developers/docs/programming-languages/python/): Backend development - - [Rust](https://ethereum.org/developers/docs/programming-languages/rust/): Systems programming - - [Go](https://ethereum.org/developers/docs/programming-languages/golang/): Client development +- [Ethereum Stack Overview](https://ethereum.org/content/developers/docs/ethereum-stack/index.md): Technology layers +- [Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/index.md): Self-executing programs + - [Smart Contract Languages](https://ethereum.org/content/developers/docs/smart-contracts/languages/index.md): Solidity, Vyper, and others + - [Smart Contract Anatomy](https://ethereum.org/content/developers/docs/smart-contracts/anatomy/index.md): Structure and components + - [Smart Contract Libraries](https://ethereum.org/content/developers/docs/smart-contracts/libraries/index.md): Reusable code + - [Testing Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/testing/index.md): Verification strategies + - [Compiling Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/compiling/index.md): Build process + - [Deploying Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/deploying/index.md): Deployment strategies + - [Smart Contract Security](https://ethereum.org/content/developers/docs/smart-contracts/security/index.md): Security best practices +- [Development Networks](https://ethereum.org/content/developers/docs/development-networks/index.md): Local and test environments +- [Development Frameworks](https://ethereum.org/content/developers/docs/frameworks/index.md): Hardhat, Truffle, and others +- [Ethereum Client APIs](https://ethereum.org/content/developers/docs/apis/index.md): Interacting with Ethereum + - [JavaScript APIs](https://ethereum.org/content/developers/docs/apis/javascript/index.md): Web3.js and ethers.js + - [Backend APIs](https://ethereum.org/content/developers/docs/apis/backend/index.md): Server-side integration + - [JSON-RPC](https://ethereum.org/content/developers/docs/apis/json-rpc/index.md): Protocol specification +- [Data and Analytics](https://ethereum.org/content/developers/docs/data-and-analytics/index.md): Blockchain data access + - [Block Explorers](https://ethereum.org/content/developers/docs/data-and-analytics/block-explorers/index.md): Data visualization tools +- [Storage](https://ethereum.org/content/developers/docs/storage/index.md): Data persistence strategies +- [IDEs](https://ethereum.org/content/developers/docs/ides/index.md): Development environments +- [Programming Languages](https://ethereum.org/content/developers/docs/programming-languages/index.md): Language-specific resources + - [JavaScript](https://ethereum.org/content/developers/docs/programming-languages/javascript/index.md): Web3 development + - [Python](https://ethereum.org/content/developers/docs/programming-languages/python/index.md): Backend development + - [Rust](https://ethereum.org/content/developers/docs/programming-languages/rust/index.md): Systems programming + - [Go](https://ethereum.org/content/developers/docs/programming-languages/golang/index.md): Client development #### Advanced Topics -- [Bridges](https://ethereum.org/developers/docs/bridges/): Cross-chain interoperability -- [Standards](https://ethereum.org/developers/docs/standards/): Ethereum Request for Comments (ERCs) - - [Token Standards](https://ethereum.org/developers/docs/standards/tokens/): ERC-20, ERC-721, ERC-1155 -- [MEV](https://ethereum.org/developers/docs/mev/): Maximal Extractable Value -- [Oracles](https://ethereum.org/developers/docs/oracles/): External data integration -- [Scaling](https://ethereum.org/developers/docs/scaling/): Layer 2 solutions - - [Optimistic Rollups](https://ethereum.org/developers/docs/scaling/optimistic-rollups/): Fraud proof scaling - - [ZK Rollups](https://ethereum.org/developers/docs/scaling/zk-rollups/): Zero-knowledge scaling - - [State Channels](https://ethereum.org/developers/docs/scaling/state-channels/): Off-chain computation - - [Sidechains](https://ethereum.org/developers/docs/scaling/sidechains/): Independent blockchains -- [Data Availability](https://ethereum.org/developers/docs/data-availability/): Data accessibility solutions -- [Networking Layer](https://ethereum.org/developers/docs/networking-layer/): P2P networking -- [Data Structures and Encoding](https://ethereum.org/developers/docs/data-structures-and-encoding/): Low-level data formats +- [Bridges](https://ethereum.org/content/developers/docs/bridges/index.md): Cross-chain interoperability +- [Standards](https://ethereum.org/content/developers/docs/standards/index.md): Ethereum Request for Comments (ERCs) + - [Token Standards](https://ethereum.org/content/developers/docs/standards/tokens/index.md): ERC-20, ERC-721, ERC-1155 +- [MEV](https://ethereum.org/content/developers/docs/mev/index.md): Maximal Extractable Value +- [Oracles](https://ethereum.org/content/developers/docs/oracles/index.md): External data integration +- [Scaling](https://ethereum.org/content/developers/docs/scaling/index.md): Layer 2 solutions + - [Optimistic Rollups](https://ethereum.org/content/developers/docs/scaling/optimistic-rollups/index.md): Fraud proof scaling + - [ZK Rollups](https://ethereum.org/content/developers/docs/scaling/zk-rollups/index.md): Zero-knowledge scaling + - [State Channels](https://ethereum.org/content/developers/docs/scaling/state-channels/index.md): Off-chain computation + - [Sidechains](https://ethereum.org/content/developers/docs/scaling/sidechains/index.md): Independent blockchains +- [Data Availability](https://ethereum.org/content/developers/docs/data-availability/index.md): Data accessibility solutions +- [Networking Layer](https://ethereum.org/content/developers/docs/networking-layer/index.md): P2P networking +- [Data Structures and Encoding](https://ethereum.org/content/developers/docs/data-structures-and-encoding/index.md): Low-level data formats #### Design Fundamentals -- [Design and UX](https://ethereum.org/developers/docs/design-and-ux/): User experience for Web3 +- [Design and UX](https://ethereum.org/content/developers/docs/design-and-ux/index.md): User experience for Web3 ### Enterprise - [Enterprise Ethereum](https://ethereum.org/enterprise/): Business adoption and use cases @@ -149,21 +149,21 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ### Community - [Community Hub](https://ethereum.org/community/): Get involved with Ethereum -- [Ethereum Online](https://ethereum.org/community/online/): Virtual communities -- [Ethereum Events](https://ethereum.org/community/events/): Meetups and conferences -- [Community Grants](https://ethereum.org/community/grants/): Funding opportunities +- [Ethereum Online](https://ethereum.org/content/community/online/index.md): Virtual communities +- [Ethereum Events](https://ethereum.org/content/community/events/index.md): Meetups and conferences +- [Community Grants](https://ethereum.org/content/community/grants/index.md): Funding opportunities - [Bug Bounty Program](https://ethereum.org/bug-bounty/): Security vulnerability rewards -- [Code of Conduct](https://ethereum.org/community/code-of-conduct/): Community guidelines +- [Code of Conduct](https://ethereum.org/content/community/code-of-conduct/index.md): Community guidelines ### Contributing -- [Contributing Guide](https://ethereum.org/contributing/): How to contribute to ethereum.org -- [Translation Program](https://ethereum.org/contributing/translation-program/): Localization efforts -- [Content Resources](https://ethereum.org/contributing/content-resources/): Writing guidelines -- [Design Contributions](https://ethereum.org/contributing/design/): Design resources +- [Contributing Guide](https://ethereum.org/content/contributing/index.md): How to contribute to ethereum.org +- [Translation Program](https://ethereum.org/content/contributing/translation-program/index.md): Localization efforts +- [Content Resources](https://ethereum.org/content/contributing/content-resources/index.md): Writing guidelines +- [Design Contributions](https://ethereum.org/content/contributing/design/index.md): Design resources ### About -- [About Ethereum.org](https://ethereum.org/about/): Mission and vision -- [Ethereum Foundation](https://ethereum.org/foundation/): Supporting organization +- [About Ethereum.org](https://ethereum.org/content/about/index.md): Mission and vision +- [Ethereum Foundation](https://ethereum.org/content/foundation/index.md): Supporting organization - [Ethereum Brand Assets](https://ethereum.org/assets/): Official logos and branding ### External Resources @@ -174,9 +174,9 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ## Research ### Foundational Documents -- [Ethereum Whitepaper](https://ethereum.org/whitepaper/): Original vision document -- [Ethereum Improvement Proposals (EIPs)](https://ethereum.org/eips/): Protocol upgrades -- [Ethereum History](https://ethereum.org/history/): Timeline and milestones +- [Ethereum Whitepaper](https://ethereum.org/content/whitepaper/index.md): Original vision document +- [Ethereum Improvement Proposals (EIPs)](https://ethereum.org/content/eips/index.md): Protocol upgrades +- [Ethereum History](https://ethereum.org/content/history/index.md): Timeline and milestones ### Protocol Development - [Ethereum Roadmap](https://ethereum.org/roadmap/): Future development plans @@ -187,16 +187,16 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ### Research Areas - [Open Research](https://ethereum.org/community/research/): Academic research -- [Governance](https://ethereum.org/governance/): Protocol governance -- [Energy Consumption](https://ethereum.org/energy-consumption/): Environmental impact +- [Governance](https://ethereum.org/content/governance/index.md): Protocol governance +- [Energy Consumption](https://ethereum.org/content/energy-consumption/index.md): Environmental impact - [Trillion Dollar Security](https://ethereum.org/trillion-dollar-security/): Ethereum security analysis ## Key Resources ### Official Documentation -- [Developer Documentation](https://ethereum.org/developers/docs/): Complete technical reference -- [Ethereum Improvement Proposals](https://ethereum.org/eips/): Protocol specifications -- [Ethereum Whitepaper](https://ethereum.org/whitepaper/): Original design document +- [Developer Documentation](https://ethereum.org/content/developers/docs/index.md): Complete technical reference +- [Ethereum Improvement Proposals](https://ethereum.org/content/eips/index.md): Protocol specifications +- [Ethereum Whitepaper](https://ethereum.org/content/whitepaper/index.md): Original design document ### Tools and Services - [Wallet Finder](https://ethereum.org/wallets/find-wallet/): Wallet recommendation tool @@ -213,6 +213,6 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ## Legal and Policies ### Terms and Policies -- [Privacy Policy](https://ethereum.org/privacy-policy/): Data protection and privacy practices -- [Terms of Use](https://ethereum.org/terms-of-use/): Website usage terms and conditions -- [Cookie Policy](https://ethereum.org/cookie-policy/): Information about cookie usage +- [Privacy Policy](https://ethereum.org/content/privacy-policy/index.md): Data protection and privacy practices +- [Terms of Use](https://ethereum.org/content/terms-of-use/index.md): Website usage terms and conditions +- [Cookie Policy](https://ethereum.org/content/cookie-policy/index.md): Information about cookie usage From a7d57b68f1d3ae66ac27c6afbf0e84aa7d6d3541 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 7 Jul 2025 15:12:45 +0200 Subject: [PATCH 285/368] update missing links in the developers docs section --- public/llms.txt | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index 2c85a7964f4..fa1c1f9835a 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -93,10 +93,29 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie - [Nodes and Clients](https://ethereum.org/content/developers/docs/nodes-and-clients/index.md): Network infrastructure - [Running a Node](https://ethereum.org/content/developers/docs/nodes-and-clients/run-a-node/index.md): Setting up infrastructure - [Client Diversity](https://ethereum.org/content/developers/docs/nodes-and-clients/client-diversity/index.md): Network resilience + - [Nodes as a Service](https://ethereum.org/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md): Managed node providers + - [Node Architecture](https://ethereum.org/content/developers/docs/nodes-and-clients/node-architecture/index.md): System design + - [Light Clients](https://ethereum.org/content/developers/docs/nodes-and-clients/light-clients/index.md): Lightweight verification + - [Archive Nodes](https://ethereum.org/content/developers/docs/nodes-and-clients/archive-nodes/index.md): Full historical data + - [Bootnodes](https://ethereum.org/content/developers/docs/nodes-and-clients/bootnodes/index.md): Network discovery - [Networks](https://ethereum.org/content/developers/docs/networks/index.md): Mainnet, testnets, and local networks - [Consensus Mechanisms](https://ethereum.org/content/developers/docs/consensus-mechanisms/index.md): Network agreement - [Proof of Stake](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/index.md): Current consensus mechanism + - [Gasper](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/gasper/index.md): Ethereum's consensus protocol + - [Weak Subjectivity](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md): Security assumptions + - [Attestations](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/attestations/index.md): Validator voting mechanism + - [Rewards and Penalties](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md): Validator incentives + - [Attack and Defense](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md): Security considerations + - [Keys](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/keys/index.md): Validator key management + - [PoS vs PoW](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md): Consensus comparison + - [Block Proposal](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/block-proposal/index.md): Block creation process + - [PoS FAQs](https://ethereum.org/content/developers/docs/consensus-mechanisms/pos/faqs/index.md): Frequently asked questions - [Proof of Work](https://ethereum.org/content/developers/docs/consensus-mechanisms/pow/index.md): Historical consensus mechanism + - [Mining](https://ethereum.org/content/developers/docs/consensus-mechanisms/pow/mining/index.md): Block production process + - [Mining Algorithms](https://ethereum.org/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md): Cryptographic algorithms + - [Dagger-Hashimoto](https://ethereum.org/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md): Original algorithm + - [Ethash](https://ethereum.org/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md): Production algorithm + - [Proof of Authority](https://ethereum.org/content/developers/docs/consensus-mechanisms/poa/index.md): Permissioned consensus #### Ethereum Stack - [Ethereum Stack Overview](https://ethereum.org/content/developers/docs/ethereum-stack/index.md): Technology layers @@ -107,10 +126,14 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie - [Testing Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/testing/index.md): Verification strategies - [Compiling Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/compiling/index.md): Build process - [Deploying Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/deploying/index.md): Deployment strategies + - [Verifying Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/verifying/index.md): Source code verification + - [Upgrading Smart Contracts](https://ethereum.org/content/developers/docs/smart-contracts/upgrading/index.md): Contract upgrade patterns - [Smart Contract Security](https://ethereum.org/content/developers/docs/smart-contracts/security/index.md): Security best practices + - [Formal Verification](https://ethereum.org/content/developers/docs/smart-contracts/formal-verification/index.md): Mathematical proof methods + - [Composability](https://ethereum.org/content/developers/docs/smart-contracts/composability/index.md): Contract interaction patterns - [Development Networks](https://ethereum.org/content/developers/docs/development-networks/index.md): Local and test environments - [Development Frameworks](https://ethereum.org/content/developers/docs/frameworks/index.md): Hardhat, Truffle, and others -- [Ethereum Client APIs](https://ethereum.org/content/developers/docs/apis/index.md): Interacting with Ethereum +- [Ethereum Client APIs](https://ethereum.org/developers/docs/apis/): Interacting with Ethereum - [JavaScript APIs](https://ethereum.org/content/developers/docs/apis/javascript/index.md): Web3.js and ethers.js - [Backend APIs](https://ethereum.org/content/developers/docs/apis/backend/index.md): Server-side integration - [JSON-RPC](https://ethereum.org/content/developers/docs/apis/json-rpc/index.md): Protocol specification @@ -119,15 +142,24 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie - [Storage](https://ethereum.org/content/developers/docs/storage/index.md): Data persistence strategies - [IDEs](https://ethereum.org/content/developers/docs/ides/index.md): Development environments - [Programming Languages](https://ethereum.org/content/developers/docs/programming-languages/index.md): Language-specific resources + - [Dart](https://ethereum.org/content/developers/docs/programming-languages/dart/index.md): Flutter and mobile development + - [Delphi](https://ethereum.org/content/developers/docs/programming-languages/delphi/index.md): Object Pascal programming + - [.NET](https://ethereum.org/content/developers/docs/programming-languages/dot-net/index.md): Microsoft .NET framework + - [Elixir](https://ethereum.org/content/developers/docs/programming-languages/elixir/index.md): Functional programming language + - [Go](https://ethereum.org/content/developers/docs/programming-languages/golang/index.md): Google's programming language + - [Java](https://ethereum.org/content/developers/docs/programming-languages/java/index.md): Enterprise application development - [JavaScript](https://ethereum.org/content/developers/docs/programming-languages/javascript/index.md): Web3 development - [Python](https://ethereum.org/content/developers/docs/programming-languages/python/index.md): Backend development + - [Ruby](https://ethereum.org/content/developers/docs/programming-languages/ruby/index.md): Web application development - [Rust](https://ethereum.org/content/developers/docs/programming-languages/rust/index.md): Systems programming - - [Go](https://ethereum.org/content/developers/docs/programming-languages/golang/index.md): Client development #### Advanced Topics - [Bridges](https://ethereum.org/content/developers/docs/bridges/index.md): Cross-chain interoperability - [Standards](https://ethereum.org/content/developers/docs/standards/index.md): Ethereum Request for Comments (ERCs) - - [Token Standards](https://ethereum.org/content/developers/docs/standards/tokens/index.md): ERC-20, ERC-721, ERC-1155 + - [Token Standards](https://ethereum.org/content/developers/docs/standards/tokens/index.md): Ethereum token specifications + - [ERC-20](https://ethereum.org/content/developers/docs/standards/tokens/erc-20/index.md): Fungible token standard + - [ERC-721](https://ethereum.org/content/developers/docs/standards/tokens/erc-721/index.md): Non-fungible token standard + - [ERC-1155](https://ethereum.org/content/developers/docs/standards/tokens/erc-1155/index.md): Multi-token standard - [MEV](https://ethereum.org/content/developers/docs/mev/index.md): Maximal Extractable Value - [Oracles](https://ethereum.org/content/developers/docs/oracles/index.md): External data integration - [Scaling](https://ethereum.org/content/developers/docs/scaling/index.md): Layer 2 solutions @@ -135,12 +167,23 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie - [ZK Rollups](https://ethereum.org/content/developers/docs/scaling/zk-rollups/index.md): Zero-knowledge scaling - [State Channels](https://ethereum.org/content/developers/docs/scaling/state-channels/index.md): Off-chain computation - [Sidechains](https://ethereum.org/content/developers/docs/scaling/sidechains/index.md): Independent blockchains + - [Plasma](https://ethereum.org/content/developers/docs/scaling/plasma/index.md): Child chain scaling solution + - [Validium](https://ethereum.org/content/developers/docs/scaling/validium/index.md): Off-chain data availability - [Data Availability](https://ethereum.org/content/developers/docs/data-availability/index.md): Data accessibility solutions + - [Blockchain Data Storage Strategies](https://ethereum.org/content/developers/docs/data-availability/blockchain-data-storage-strategies/index.md): Storage optimization methods - [Networking Layer](https://ethereum.org/content/developers/docs/networking-layer/index.md): P2P networking + - [Network Addresses](https://ethereum.org/content/developers/docs/networking-layer/network-addresses/index.md): Node identification + - [Portal Network](https://ethereum.org/content/developers/docs/networking-layer/portal-network/index.md): Light client networking - [Data Structures and Encoding](https://ethereum.org/content/developers/docs/data-structures-and-encoding/index.md): Low-level data formats + - [Patricia Merkle Trie](https://ethereum.org/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md): Ethereum's data structure + - [RLP](https://ethereum.org/content/developers/docs/data-structures-and-encoding/rlp/index.md): Recursive Length Prefix encoding + - [SSZ](https://ethereum.org/content/developers/docs/data-structures-and-encoding/ssz/index.md): Simple Serialize format + - [Web3 Secret Storage](https://ethereum.org/content/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md): Key storage specification #### Design Fundamentals - [Design and UX](https://ethereum.org/content/developers/docs/design-and-ux/index.md): User experience for Web3 + - [Heuristics for Web3](https://ethereum.org/content/developers/docs/design-and-ux/heuristics-for-web3/index.md): UX design principles + - [DEX Design Best Practices](https://ethereum.org/content/developers/docs/design-and-ux/dex-design-best-practice/index.md): Decentralized exchange UX ### Enterprise - [Enterprise Ethereum](https://ethereum.org/enterprise/): Business adoption and use cases From d366cf2dca6482b3d0b2d43e5bf9fbc560722448 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 7 Jul 2025 15:37:36 +0200 Subject: [PATCH 286/368] update --- public/llms.txt | 64 +++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index fa1c1f9835a..01872b43d63 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -22,7 +22,7 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ### Educational Resources - [Quizzes](https://ethereum.org/quizzes/): Test your Ethereum knowledge -- [Glossary](https://ethereum.org/glossary/): Definitions of key terms +- [Glossary](https://ethereum.org/content/glossary/index.md): Definitions of key terms ## Use @@ -35,10 +35,10 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ### Practical Guides - [Guides Overview](https://ethereum.org/content/guides/index.md): Complete guide collection - [How to Create an Ethereum Account](https://ethereum.org/content/guides/how-to-create-an-ethereum-account/index.md) -- [How to Use a Wallet](https://ethereum.org/content/guides/how-to-use-a-wallet/index.md) -- [How to Swap Tokens](https://ethereum.org/content/guides/how-to-swap-tokens/index.md) -- [How to Use a Bridge](https://ethereum.org/content/guides/how-to-use-a-bridge/index.md) -- [How to Revoke Token Access](https://ethereum.org/content/guides/how-to-revoke-token-access/index.md) +- [How to Use a Wallet](https://ethereum.org/content/guides/how-to-use-a-wallet/index.md): Managing your crypto wallet +- [How to Swap Tokens](https://ethereum.org/content/guides/how-to-swap-tokens/index.md): Exchanging tokens on decentralized exchanges +- [How to Use a Bridge](https://ethereum.org/content/guides/how-to-use-a-bridge/index.md): Moving assets between blockchains +- [How to Revoke Token Access](https://ethereum.org/content/guides/how-to-revoke-token-access/index.md): Managing token permissions ### Use Cases - [Stablecoins](https://ethereum.org/stablecoins/): Dollar-pegged cryptocurrencies @@ -58,9 +58,9 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ### Staking - [Staking Overview](https://ethereum.org/staking/): Earning rewards by validating -- [Solo Staking](https://ethereum.org/content/staking/solo/index.md): Run your own validator -- [Staking as a Service](https://ethereum.org/content/staking/saas/index.md): Managed staking solutions -- [Pooled Staking](https://ethereum.org/content/staking/pools/index.md): Stake with others +- [Solo Staking](https://ethereum.org/content/staking/solo/index.md): Run your own validator for maximum rewards and control +- [Staking as a Service](https://ethereum.org/content/staking/saas/index.md): Managed staking solutions with professional operators +- [Pooled Staking](https://ethereum.org/content/staking/pools/index.md): Stake with others to meet 32 ETH requirement ### Layer 2 Networks - [Layer 2 Introduction](https://ethereum.org/layer-2/): Scaling solutions overview @@ -75,6 +75,7 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie - [Tutorials](https://ethereum.org/developers/tutorials/): Step-by-step guides - [Learning Tools](https://ethereum.org/developers/learning-tools/): Interactive education - [Local Development](https://ethereum.org/developers/local-environment/): Setup guides +- [Community Grants](https://ethereum.org/content/community/grants/index.md): Funding opportunities for developers ### Documentation - [Developer Documentation](https://ethereum.org/content/developers/docs/index.md): Complete technical reference @@ -192,22 +193,23 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ### Community - [Community Hub](https://ethereum.org/community/): Get involved with Ethereum -- [Ethereum Online](https://ethereum.org/content/community/online/index.md): Virtual communities -- [Ethereum Events](https://ethereum.org/content/community/events/index.md): Meetups and conferences -- [Community Grants](https://ethereum.org/content/community/grants/index.md): Funding opportunities +- [Ethereum Online](https://ethereum.org/content/community/online/index.md): Virtual communities and platforms +- [Ethereum Events](https://ethereum.org/content/community/events/index.md): Meetups and conferences worldwide +- [Community Grants](https://ethereum.org/content/community/grants/index.md): Funding opportunities for ecosystem projects - [Bug Bounty Program](https://ethereum.org/bug-bounty/): Security vulnerability rewards -- [Code of Conduct](https://ethereum.org/content/community/code-of-conduct/index.md): Community guidelines +- [Code of Conduct](https://ethereum.org/content/community/code-of-conduct/index.md): Community guidelines and expectations +- [Open Research](https://ethereum.org/content/community/research/index.md): Academic research and collaboration ### Contributing - [Contributing Guide](https://ethereum.org/content/contributing/index.md): How to contribute to ethereum.org -- [Translation Program](https://ethereum.org/content/contributing/translation-program/index.md): Localization efforts -- [Content Resources](https://ethereum.org/content/contributing/content-resources/index.md): Writing guidelines -- [Design Contributions](https://ethereum.org/content/contributing/design/index.md): Design resources +- [Translation Program](https://ethereum.org/content/contributing/translation-program/index.md): Localization efforts and language support +- [Content Resources](https://ethereum.org/content/contributing/content-resources/index.md): Writing guidelines and standards +- [Design Contributions](https://ethereum.org/content/contributing/design/index.md): Design resources and style guides ### About -- [About Ethereum.org](https://ethereum.org/content/about/index.md): Mission and vision -- [Ethereum Foundation](https://ethereum.org/content/foundation/index.md): Supporting organization -- [Ethereum Brand Assets](https://ethereum.org/assets/): Official logos and branding +- [About Ethereum.org](https://ethereum.org/content/about/index.md): Mission, vision, and team +- [Ethereum Foundation](https://ethereum.org/content/foundation/index.md): Supporting organization and governance +- [Ethereum Brand Assets](https://ethereum.org/assets/): Official logos and branding guidelines ### External Resources - [Ethereum Foundation Blog](https://blog.ethereum.org/): Official announcements and updates @@ -217,22 +219,22 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ## Research ### Foundational Documents -- [Ethereum Whitepaper](https://ethereum.org/content/whitepaper/index.md): Original vision document -- [Ethereum Improvement Proposals (EIPs)](https://ethereum.org/content/eips/index.md): Protocol upgrades -- [Ethereum History](https://ethereum.org/content/history/index.md): Timeline and milestones +- [Ethereum Whitepaper](https://ethereum.org/content/whitepaper/index.md): Original vision document by Vitalik Buterin +- [Ethereum Improvement Proposals (EIPs)](https://ethereum.org/content/eips/index.md): Protocol upgrade specifications +- [Ethereum History](https://ethereum.org/content/history/index.md): Timeline and key milestones ### Protocol Development -- [Ethereum Roadmap](https://ethereum.org/roadmap/): Future development plans -- [Roadmap Security](https://ethereum.org/roadmap/security/): Security improvements -- [Roadmap Scaling](https://ethereum.org/roadmap/scaling/): Scalability solutions -- [Roadmap User Experience](https://ethereum.org/roadmap/user-experience/): UX improvements -- [Roadmap Future-Proofing](https://ethereum.org/roadmap/future-proofing/): Long-term sustainability +- [Ethereum Roadmap](https://ethereum.org/roadmap/): Future development plans and priorities +- [Roadmap Security](https://ethereum.org/content/roadmap/security/index.md): Security improvements and cryptographic advances +- [Roadmap Scaling](https://ethereum.org/content/roadmap/scaling/index.md): Scalability solutions and layer 2 integration +- [Roadmap User Experience](https://ethereum.org/content/roadmap/user-experience/index.md): UX improvements and account abstraction +- [Roadmap Future-Proofing](https://ethereum.org/content/roadmap/future-proofing/index.md): Long-term sustainability and quantum resistance ### Research Areas -- [Open Research](https://ethereum.org/community/research/): Academic research -- [Governance](https://ethereum.org/content/governance/index.md): Protocol governance -- [Energy Consumption](https://ethereum.org/content/energy-consumption/index.md): Environmental impact -- [Trillion Dollar Security](https://ethereum.org/trillion-dollar-security/): Ethereum security analysis +- [Open Research](https://ethereum.org/content/community/research/index.md): Academic research and collaboration opportunities +- [Governance](https://ethereum.org/content/governance/index.md): Protocol governance and decision-making processes +- [Energy Consumption](https://ethereum.org/content/energy-consumption/index.md): Environmental impact and sustainability +- [Trillion Dollar Security](https://ethereum.org/trillion-dollar-security/): Ethereum security analysis and economics ## Key Resources @@ -258,4 +260,4 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ### Terms and Policies - [Privacy Policy](https://ethereum.org/content/privacy-policy/index.md): Data protection and privacy practices - [Terms of Use](https://ethereum.org/content/terms-of-use/index.md): Website usage terms and conditions -- [Cookie Policy](https://ethereum.org/content/cookie-policy/index.md): Information about cookie usage +- [Cookie Policy](https://ethereum.org/content/cookie-policy/index.md): Information about cookie usage and tracking From ad7cb156b9bc60b8fca9e6ae47de53ea8f01f8f1 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 7 Jul 2025 15:43:01 +0200 Subject: [PATCH 287/368] slash command to keep llms.txt file updated --- .claude/commands/update-llms-txt.md | 87 +++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 .claude/commands/update-llms-txt.md diff --git a/.claude/commands/update-llms-txt.md b/.claude/commands/update-llms-txt.md new file mode 100644 index 00000000000..854340da82e --- /dev/null +++ b/.claude/commands/update-llms-txt.md @@ -0,0 +1,87 @@ +# Update LLMS.txt Command + +This command helps maintain the `public/llms.txt` file by monitoring key navigation files: + +1. **Main Navigation**: `src/components/Nav/useNavigation.ts` +2. **Developer Docs**: `src/data/developer-docs-links.yaml` +3. **Footer Links**: `src/components/Footer.tsx` + +## How it works + +- Adds missing links to appropriate sections +- Preserves existing descriptions and organization +- Follows established llms.txt structure +- **Prefers static markdown files URLs over html URLs** for better LLM comprehension + +## Implementation + +When this command is executed, I will: + +### Step 1: Parse Navigation Files + +**Main Navigation** (`src/components/Nav/useNavigation.ts`): + +```javascript +// Extract linkSections object structure +// Parse learn, use, build, participate sections +// Get href, label, and description for each link +``` + +**Developer Docs** (`src/data/developer-docs-links.yaml`): + +```yaml +# Parse foundational-topics, ethereum-stack, advanced, design-fundamentals +# Extract href and id mappings +# Build hierarchical structure +``` + +**Footer Links** (`src/components/Footer.tsx`): + +```javascript +// Extract linkSections and dipperLinks arrays +// Get all footer navigation items +// Include external links (blog, ESP, Devcon) +``` + +### Step 2: Analyze Current llms.txt + +- Parse existing sections and their links +- Extract current URLs and descriptions +- Identify section organization and hierarchy + +### Step 3: URL to Markdown File Mapping + +**Priority: Static markdown files URLs over web html URLs** + +For each link, I will: + +1. Check if corresponding markdown file exists in `public/content/`. **Ignore translations**: Skip `public/content/translations/` directory (60+ language versions) +2. Use a URL pointing to the markdown file for the page: `https://ethereum.org/content/[page]/index.md` +3. Fall back to web URL only if no markdown file exists +4. Example: `https://ethereum.org/learn/` → `https://ethereum.org/content/learn/index.md` +5. Example2: `https://ethereum.org/guides/how-to-use-a-wallet/` → `https://ethereum.org/content/guides/how-to-use-a-wallet/index.md` + +### Step 4: Smart Link Categorization + +New links are categorized using these rules: + +1. **Learn Section**: `/learn/`, `/what-is-*`, `/guides/`, `/quizzes/`, `/glossary/` +2. **Use Section**: `/get-eth`, `/wallets/`, `/dapps/`, `/staking/`, use cases +3. **Build Section**: `/developers/`, `/enterprise/`, developer tools +4. **Participate Section**: `/community/`, `/contributing/`, `/foundation/` +5. **Research Section**: `/whitepaper`, `/roadmap/`, `/eips/`, `/governance/` + +### Step 5: Validation & Quality Checks + +- Verify all markdown files exist in `public/content/` +- Check for duplicate links within sections +- Validate section organization and hierarchy +- Ensure descriptions are informative and concise + +### Step 6: Execute Action + +Update llms.txt file with improved structure and validated links + +--- + +The command ensures the llms.txt file remains comprehensive and current with minimal manual maintenance. From 140fb37a8f02167f8effddac8865d6a3cea05e57 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Mon, 7 Jul 2025 17:16:47 +0200 Subject: [PATCH 288/368] Update public/llms.txt --- public/llms.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/llms.txt b/public/llms.txt index 01872b43d63..4f592422c7d 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -22,7 +22,7 @@ Ethereum.org is the primary educational hub for Ethereum, offering beginner-frie ### Educational Resources - [Quizzes](https://ethereum.org/quizzes/): Test your Ethereum knowledge -- [Glossary](https://ethereum.org/content/glossary/index.md): Definitions of key terms +- [Glossary](https://ethereum.org/glossary/): Definitions of key terms ## Use From 79538ea6b42ddacc1a5aca2eb625514cd1b47154 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 7 Jul 2025 12:27:49 -0700 Subject: [PATCH 289/368] refactor: index/lazy convention over client/server --- .../_components/WhatTabs/{client.tsx => index.tsx} | 0 .../what-is-ethereum/_components/WhatTabs/lazy.tsx | 5 +++++ .../what-is-ethereum/_components/WhatTabs/server.tsx | 8 -------- .../_components/WhySwiper/{client.tsx => index.tsx} | 0 .../what-is-ethereum/_components/WhySwiper/lazy.tsx | 5 +++++ .../what-is-ethereum/_components/WhySwiper/server.tsx | 8 -------- app/[locale]/what-is-ethereum/page.tsx | 4 ++-- 7 files changed, 12 insertions(+), 18 deletions(-) rename app/[locale]/what-is-ethereum/_components/WhatTabs/{client.tsx => index.tsx} (100%) create mode 100644 app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx delete mode 100644 app/[locale]/what-is-ethereum/_components/WhatTabs/server.tsx rename app/[locale]/what-is-ethereum/_components/WhySwiper/{client.tsx => index.tsx} (100%) create mode 100644 app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx delete mode 100644 app/[locale]/what-is-ethereum/_components/WhySwiper/server.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs/client.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/index.tsx similarity index 100% rename from app/[locale]/what-is-ethereum/_components/WhatTabs/client.tsx rename to app/[locale]/what-is-ethereum/_components/WhatTabs/index.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhatTabs/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/what-is-ethereum/_components/WhatTabs/server.tsx b/app/[locale]/what-is-ethereum/_components/WhatTabs/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/app/[locale]/what-is-ethereum/_components/WhatTabs/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) diff --git a/app/[locale]/what-is-ethereum/_components/WhySwiper/client.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/index.tsx similarity index 100% rename from app/[locale]/what-is-ethereum/_components/WhySwiper/client.tsx rename to app/[locale]/what-is-ethereum/_components/WhySwiper/index.tsx diff --git a/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/what-is-ethereum/_components/WhySwiper/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/what-is-ethereum/_components/WhySwiper/server.tsx b/app/[locale]/what-is-ethereum/_components/WhySwiper/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/app/[locale]/what-is-ethereum/_components/WhySwiper/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) diff --git a/app/[locale]/what-is-ethereum/page.tsx b/app/[locale]/what-is-ethereum/page.tsx index 5db04b360ba..eaeb86ae16b 100644 --- a/app/[locale]/what-is-ethereum/page.tsx +++ b/app/[locale]/what-is-ethereum/page.tsx @@ -43,8 +43,8 @@ import { getRequiredNamespacesForPage, } from "@/lib/utils/translations" -import WhatTabs from "./_components/WhatTabs/server" -import WhySwiper from "./_components/WhySwiper/server" +import WhatTabs from "./_components/WhatTabs/lazy" +import WhySwiper from "./_components/WhySwiper/lazy" import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie" import dogeComputerImg from "@/public/images/doge-computer.png" From 82ec9bc0d93ee9e1bea2bb83ab400e58663b425f Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 7 Jul 2025 12:31:13 -0700 Subject: [PATCH 290/368] refactor: index/lazy convention over client/server --- app/[locale]/wallets/find-wallet/page.tsx | 2 +- .../FindWalletProductTable.stories.tsx | 2 +- .../FindWalletProductTable/{client.tsx => index.tsx} | 0 src/components/FindWalletProductTable/lazy.tsx | 5 +++++ src/components/FindWalletProductTable/server.tsx | 8 -------- 5 files changed, 7 insertions(+), 10 deletions(-) rename src/components/FindWalletProductTable/{client.tsx => index.tsx} (100%) create mode 100644 src/components/FindWalletProductTable/lazy.tsx delete mode 100644 src/components/FindWalletProductTable/server.tsx diff --git a/app/[locale]/wallets/find-wallet/page.tsx b/app/[locale]/wallets/find-wallet/page.tsx index 9a051f72ac5..e67d8986713 100644 --- a/app/[locale]/wallets/find-wallet/page.tsx +++ b/app/[locale]/wallets/find-wallet/page.tsx @@ -8,7 +8,7 @@ import { import { Lang } from "@/lib/types" import Breadcrumbs from "@/components/Breadcrumbs" -import FindWalletProductTable from "@/components/FindWalletProductTable/server" +import FindWalletProductTable from "@/components/FindWalletProductTable/lazy" import I18nProvider from "@/components/I18nProvider" import MainArticle from "@/components/MainArticle" diff --git a/src/components/FindWalletProductTable/FindWalletProductTable.stories.tsx b/src/components/FindWalletProductTable/FindWalletProductTable.stories.tsx index 28de0cdd76a..3b6e064c9dc 100644 --- a/src/components/FindWalletProductTable/FindWalletProductTable.stories.tsx +++ b/src/components/FindWalletProductTable/FindWalletProductTable.stories.tsx @@ -2,7 +2,7 @@ import { Meta, StoryObj } from "@storybook/react" import { Lang } from "@/lib/types" -import FindWalletProductTable from "@/components/FindWalletProductTable/client" +import FindWalletProductTable from "@/components/FindWalletProductTable" import OneInchWalletImage from "@/public/images/wallets/1inch.png" import FoxWalletImage from "@/public/images/wallets/foxwallet.png" diff --git a/src/components/FindWalletProductTable/client.tsx b/src/components/FindWalletProductTable/index.tsx similarity index 100% rename from src/components/FindWalletProductTable/client.tsx rename to src/components/FindWalletProductTable/index.tsx diff --git a/src/components/FindWalletProductTable/lazy.tsx b/src/components/FindWalletProductTable/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/src/components/FindWalletProductTable/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/src/components/FindWalletProductTable/server.tsx b/src/components/FindWalletProductTable/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/src/components/FindWalletProductTable/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) From 734d8bddcc2a73710b33ec75cd7fcad1750d6a7d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 7 Jul 2025 13:11:09 -0700 Subject: [PATCH 291/368] refactor: index/lazy convention over client/server --- .../AdoptionSwiper/{client.tsx => index.tsx} | 0 .../10years/_components/AdoptionSwiper/lazy.tsx | 5 +++++ .../10years/_components/AdoptionSwiper/server.tsx | 8 -------- .../_components/CountDown/{client.tsx => index.tsx} | 0 app/[locale]/10years/_components/CountDown/lazy.tsx | 5 +++++ app/[locale]/10years/_components/CountDown/server.tsx | 8 -------- .../InnovationSwiper/{client.tsx => index.tsx} | 0 .../10years/_components/InnovationSwiper/lazy.tsx | 5 +++++ .../10years/_components/InnovationSwiper/server.tsx | 8 -------- .../_components/TenYearGlobe/{client.tsx => index.tsx} | 0 app/[locale]/10years/_components/TenYearGlobe/lazy.tsx | 5 +++++ .../10years/_components/TenYearGlobe/server.tsx | 8 -------- app/[locale]/10years/_components/TenYearHero.tsx | 4 ++-- app/[locale]/10years/_components/TenYearHomeBanner.tsx | 4 ++-- .../_components/UserStories/{client.tsx => index.tsx} | 0 app/[locale]/10years/_components/UserStories/lazy.tsx | 5 +++++ .../10years/_components/UserStories/server.tsx | 8 -------- app/[locale]/10years/page.tsx | 10 +++++----- src/components/Homepage/LanguageMorpher.tsx | 2 +- .../Image/ParallaxImage/{client.tsx => index.tsx} | 0 src/components/Image/ParallaxImage/lazy.tsx | 5 +++++ src/components/Image/ParallaxImage/server.tsx | 8 -------- src/components/Morpher/{client.tsx => index.tsx} | 0 src/components/Morpher/lazy.tsx | 5 +++++ src/components/Morpher/server.tsx | 8 -------- 25 files changed, 45 insertions(+), 66 deletions(-) rename app/[locale]/10years/_components/AdoptionSwiper/{client.tsx => index.tsx} (100%) create mode 100644 app/[locale]/10years/_components/AdoptionSwiper/lazy.tsx delete mode 100644 app/[locale]/10years/_components/AdoptionSwiper/server.tsx rename app/[locale]/10years/_components/CountDown/{client.tsx => index.tsx} (100%) create mode 100644 app/[locale]/10years/_components/CountDown/lazy.tsx delete mode 100644 app/[locale]/10years/_components/CountDown/server.tsx rename app/[locale]/10years/_components/InnovationSwiper/{client.tsx => index.tsx} (100%) create mode 100644 app/[locale]/10years/_components/InnovationSwiper/lazy.tsx delete mode 100644 app/[locale]/10years/_components/InnovationSwiper/server.tsx rename app/[locale]/10years/_components/TenYearGlobe/{client.tsx => index.tsx} (100%) create mode 100644 app/[locale]/10years/_components/TenYearGlobe/lazy.tsx delete mode 100644 app/[locale]/10years/_components/TenYearGlobe/server.tsx rename app/[locale]/10years/_components/UserStories/{client.tsx => index.tsx} (100%) create mode 100644 app/[locale]/10years/_components/UserStories/lazy.tsx delete mode 100644 app/[locale]/10years/_components/UserStories/server.tsx rename src/components/Image/ParallaxImage/{client.tsx => index.tsx} (100%) create mode 100644 src/components/Image/ParallaxImage/lazy.tsx delete mode 100644 src/components/Image/ParallaxImage/server.tsx rename src/components/Morpher/{client.tsx => index.tsx} (100%) create mode 100644 src/components/Morpher/lazy.tsx delete mode 100644 src/components/Morpher/server.tsx diff --git a/app/[locale]/10years/_components/AdoptionSwiper/client.tsx b/app/[locale]/10years/_components/AdoptionSwiper/index.tsx similarity index 100% rename from app/[locale]/10years/_components/AdoptionSwiper/client.tsx rename to app/[locale]/10years/_components/AdoptionSwiper/index.tsx diff --git a/app/[locale]/10years/_components/AdoptionSwiper/lazy.tsx b/app/[locale]/10years/_components/AdoptionSwiper/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/10years/_components/AdoptionSwiper/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/10years/_components/AdoptionSwiper/server.tsx b/app/[locale]/10years/_components/AdoptionSwiper/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/app/[locale]/10years/_components/AdoptionSwiper/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) diff --git a/app/[locale]/10years/_components/CountDown/client.tsx b/app/[locale]/10years/_components/CountDown/index.tsx similarity index 100% rename from app/[locale]/10years/_components/CountDown/client.tsx rename to app/[locale]/10years/_components/CountDown/index.tsx diff --git a/app/[locale]/10years/_components/CountDown/lazy.tsx b/app/[locale]/10years/_components/CountDown/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/10years/_components/CountDown/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/10years/_components/CountDown/server.tsx b/app/[locale]/10years/_components/CountDown/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/app/[locale]/10years/_components/CountDown/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) diff --git a/app/[locale]/10years/_components/InnovationSwiper/client.tsx b/app/[locale]/10years/_components/InnovationSwiper/index.tsx similarity index 100% rename from app/[locale]/10years/_components/InnovationSwiper/client.tsx rename to app/[locale]/10years/_components/InnovationSwiper/index.tsx diff --git a/app/[locale]/10years/_components/InnovationSwiper/lazy.tsx b/app/[locale]/10years/_components/InnovationSwiper/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/10years/_components/InnovationSwiper/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/10years/_components/InnovationSwiper/server.tsx b/app/[locale]/10years/_components/InnovationSwiper/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/app/[locale]/10years/_components/InnovationSwiper/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) diff --git a/app/[locale]/10years/_components/TenYearGlobe/client.tsx b/app/[locale]/10years/_components/TenYearGlobe/index.tsx similarity index 100% rename from app/[locale]/10years/_components/TenYearGlobe/client.tsx rename to app/[locale]/10years/_components/TenYearGlobe/index.tsx diff --git a/app/[locale]/10years/_components/TenYearGlobe/lazy.tsx b/app/[locale]/10years/_components/TenYearGlobe/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/10years/_components/TenYearGlobe/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/10years/_components/TenYearGlobe/server.tsx b/app/[locale]/10years/_components/TenYearGlobe/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/app/[locale]/10years/_components/TenYearGlobe/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) diff --git a/app/[locale]/10years/_components/TenYearHero.tsx b/app/[locale]/10years/_components/TenYearHero.tsx index 299002bb347..4162a063355 100644 --- a/app/[locale]/10years/_components/TenYearHero.tsx +++ b/app/[locale]/10years/_components/TenYearHero.tsx @@ -1,8 +1,8 @@ import { getTranslations } from "next-intl/server" import { Image } from "@/components/Image" -import ParallaxImage from "@/components/Image/ParallaxImage/server" -import Morpher from "@/components/Morpher/server" +import ParallaxImage from "@/components/Image/ParallaxImage/lazy" +import Morpher from "@/components/Morpher/lazy" import TenYearBackgroundImage from "@/public/images/10-year-anniversary/10-year-background.png" import TenYearGraphicImage from "@/public/images/10-year-anniversary/10-year-graphic.png" diff --git a/app/[locale]/10years/_components/TenYearHomeBanner.tsx b/app/[locale]/10years/_components/TenYearHomeBanner.tsx index d5515040a4e..354442d3525 100644 --- a/app/[locale]/10years/_components/TenYearHomeBanner.tsx +++ b/app/[locale]/10years/_components/TenYearHomeBanner.tsx @@ -1,10 +1,10 @@ import { getLocale, getTranslations } from "next-intl/server" import { Image } from "@/components/Image" -import ParallaxImage from "@/components/Image/ParallaxImage/server" +import ParallaxImage from "@/components/Image/ParallaxImage/lazy" import { ButtonLink } from "@/components/ui/buttons/Button" -import Countdown from "./CountDown/server" +import Countdown from "./CountDown/lazy" import { getTimeUnitTranslations } from "./utils" import TenYearBackgroundImage from "@/public/images/10-year-anniversary/10-year-background.png" diff --git a/app/[locale]/10years/_components/UserStories/client.tsx b/app/[locale]/10years/_components/UserStories/index.tsx similarity index 100% rename from app/[locale]/10years/_components/UserStories/client.tsx rename to app/[locale]/10years/_components/UserStories/index.tsx diff --git a/app/[locale]/10years/_components/UserStories/lazy.tsx b/app/[locale]/10years/_components/UserStories/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/10years/_components/UserStories/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/10years/_components/UserStories/server.tsx b/app/[locale]/10years/_components/UserStories/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/app/[locale]/10years/_components/UserStories/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) diff --git a/app/[locale]/10years/page.tsx b/app/[locale]/10years/page.tsx index 686451f1554..62d0c6280ee 100644 --- a/app/[locale]/10years/page.tsx +++ b/app/[locale]/10years/page.tsx @@ -23,13 +23,13 @@ import { getRequiredNamespacesForPage } from "@/lib/utils/translations" import { BASE_TIME_UNIT } from "@/lib/constants" -import AdoptionSwiper from "./_components/AdoptionSwiper/server" -import CountDown from "./_components/CountDown/server" +import AdoptionSwiper from "./_components/AdoptionSwiper/lazy" +import CountDown from "./_components/CountDown/lazy" import { adoptionStyles } from "./_components/data" -import InnovationSwiper from "./_components/InnovationSwiper/server" -import TenYearGlobe from "./_components/TenYearGlobe/server" +import InnovationSwiper from "./_components/InnovationSwiper/lazy" +import TenYearGlobe from "./_components/TenYearGlobe/lazy" import TenYearHero from "./_components/TenYearHero" -import Stories from "./_components/UserStories/server" +import Stories from "./_components/UserStories/lazy" import { getAdoptionCards, getInnovationCards, diff --git a/src/components/Homepage/LanguageMorpher.tsx b/src/components/Homepage/LanguageMorpher.tsx index ccbf56062ce..12e91344664 100644 --- a/src/components/Homepage/LanguageMorpher.tsx +++ b/src/components/Homepage/LanguageMorpher.tsx @@ -1,6 +1,6 @@ "use client" -import Morpher from "@/components/Morpher/client" +import Morpher from "@/components/Morpher" import { Button } from "@/components/ui/buttons/Button" import { screens } from "@/lib/utils/screen" diff --git a/src/components/Image/ParallaxImage/client.tsx b/src/components/Image/ParallaxImage/index.tsx similarity index 100% rename from src/components/Image/ParallaxImage/client.tsx rename to src/components/Image/ParallaxImage/index.tsx diff --git a/src/components/Image/ParallaxImage/lazy.tsx b/src/components/Image/ParallaxImage/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/src/components/Image/ParallaxImage/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/src/components/Image/ParallaxImage/server.tsx b/src/components/Image/ParallaxImage/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/src/components/Image/ParallaxImage/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) diff --git a/src/components/Morpher/client.tsx b/src/components/Morpher/index.tsx similarity index 100% rename from src/components/Morpher/client.tsx rename to src/components/Morpher/index.tsx diff --git a/src/components/Morpher/lazy.tsx b/src/components/Morpher/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/src/components/Morpher/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/src/components/Morpher/server.tsx b/src/components/Morpher/server.tsx deleted file mode 100644 index c87674840b7..00000000000 --- a/src/components/Morpher/server.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import dynamic from "next/dynamic" - -import Loading from "./loading" - -export default dynamic(() => import("./client"), { - ssr: false, - loading: Loading, -}) From 5691b67e9de7dab11394eeb83894219c38aa889a Mon Sep 17 00:00:00 2001 From: Antoine-Sparenberg <128523213+Antoine-Sparenberg@users.noreply.github.com> Date: Tue, 8 Jul 2025 14:25:53 +0200 Subject: [PATCH 292/368] Update wallet-data.ts --- src/data/wallets/wallet-data.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index d808b7dcdd3..1f5ec74490d 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -149,15 +149,15 @@ export const walletsData: WalletData[] = [ supported_chains: ["Ethereum Mainnet"], }, { - last_updated: "2024-03-07", - name: "Argent", + last_updated: "2025-07-08", + name: "Ready Wallet", image: ArgentImage, twBackgroundColor: "bg-[#FFFFFF]", twGradiantBrandColor: "from-[#ffffff]", - url: "https://www.argent.xyz/", + url: "https://www.ready.co/", active_development_team: true, languages_supported: ["en"], - twitter: "https://twitter.com/argenthq", + twitter: "https://x.com/ready_co", discord: "https://discord.com/invite/GWSyrHg", reddit: "", telegram: "", @@ -174,7 +174,7 @@ export const walletsData: WalletData[] = [ non_custodial: true, security_audit: [ "https://github.com/argentlabs/argent-contracts/tree/develop/audit", - "https://www.argent.xyz/argent-bug-bounty/", + "https://www.ready.co/ready-bug-bounty", ], scam_protection: true, hardware_support: true, @@ -191,8 +191,8 @@ export const walletsData: WalletData[] = [ withdraw_crypto: false, multisig: true, social_recovery: true, - onboard_documentation: "https://www.argent.xyz/learn/", - documentation: "", + onboard_documentation: "https://www.ready.co/learn", + documentation: "https://docs.ready.co/", supported_chains: ["Starknet"], }, { From 22ab8d28b4a6a8fbdffb8a9827c860648482c690 Mon Sep 17 00:00:00 2001 From: Antoine-Sparenberg <128523213+Antoine-Sparenberg@users.noreply.github.com> Date: Tue, 8 Jul 2025 14:26:25 +0200 Subject: [PATCH 293/368] Rename argent.png to ready.png --- public/images/wallets/{argent.png => ready.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename public/images/wallets/{argent.png => ready.png} (100%) diff --git a/public/images/wallets/argent.png b/public/images/wallets/ready.png similarity index 100% rename from public/images/wallets/argent.png rename to public/images/wallets/ready.png From 0b05b2c822dfe01d01a8092d221107b8572292de Mon Sep 17 00:00:00 2001 From: Antoine-Sparenberg <128523213+Antoine-Sparenberg@users.noreply.github.com> Date: Tue, 8 Jul 2025 14:27:54 +0200 Subject: [PATCH 294/368] Update wallet-data.ts --- src/data/wallets/wallet-data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 1f5ec74490d..6f907db5556 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -5,7 +5,7 @@ import { newToCrypto } from "@/data/wallets/new-to-crypto" import OneInchWalletImage from "@/public/images/wallets/1inch.png" import AlphaWalletImage from "@/public/images/wallets/alpha.png" import AmbireImage from "@/public/images/wallets/ambire.png" -import ArgentImage from "@/public/images/wallets/argent.png" +import ReadyImage from "@/public/images/wallets/ready.png" import AuroxImage from "@/public/images/wallets/aurox.png" import BitgetImage from "@/public/images/wallets/bitget.png" import BlockWalletImage from "@/public/images/wallets/blockwallet.png" @@ -151,7 +151,7 @@ export const walletsData: WalletData[] = [ { last_updated: "2025-07-08", name: "Ready Wallet", - image: ArgentImage, + image: ReadyImage, twBackgroundColor: "bg-[#FFFFFF]", twGradiantBrandColor: "from-[#ffffff]", url: "https://www.ready.co/", From dbd9491de7090b5897f9ef84f7a43c8e526ede2d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 8 Jul 2025 10:44:23 -0700 Subject: [PATCH 295/368] chore: sort imports --- src/data/wallets/wallet-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 6f907db5556..7ac1657fe13 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -5,7 +5,6 @@ import { newToCrypto } from "@/data/wallets/new-to-crypto" import OneInchWalletImage from "@/public/images/wallets/1inch.png" import AlphaWalletImage from "@/public/images/wallets/alpha.png" import AmbireImage from "@/public/images/wallets/ambire.png" -import ReadyImage from "@/public/images/wallets/ready.png" import AuroxImage from "@/public/images/wallets/aurox.png" import BitgetImage from "@/public/images/wallets/bitget.png" import BlockWalletImage from "@/public/images/wallets/blockwallet.png" @@ -36,6 +35,7 @@ import PhantomImage from "@/public/images/wallets/phantom.png" import PillarImage from "@/public/images/wallets/pillar.png" import RabbyWalletImage from "@/public/images/wallets/rabbywallet.png" import RainbowImage from "@/public/images/wallets/rainbow.png" +import ReadyImage from "@/public/images/wallets/ready.png" import SafeImage from "@/public/images/wallets/safe.png" import ShapeShiftImage from "@/public/images/wallets/shapeshift.png" import TahoImage from "@/public/images/wallets/taho.png" From 2a8f5f8b926218f4b395e47ff166bb0c72c3c50f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 01:11:53 +0000 Subject: [PATCH 296/368] docs: update README.md [skip ci] --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 3af3c8585d6..016e1cf9856 100644 --- a/README.md +++ b/README.md @@ -1993,8 +1993,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Nik-EpicWeb3
    Nik-EpicWeb3

    📋 - kichong
    kichong

    🖋 - FT
    FT

    🖋 + Brian Rossetti
    Brian Rossetti

    🚧 From 70c68a6cf16145ca6865f1d031950686d521cfd9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 01:11:53 +0000 Subject: [PATCH 297/368] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 5881 +++++++++++++++++++++++++++++++++---------- 1 file changed, 4501 insertions(+), 1380 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a02c6180b5d..404b06adb6a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1,5 +1,7 @@ { - "files": ["README.md"], + "files": [ + "README.md" + ], "imageSize": 100, "commit": false, "contributors": [ @@ -8,1281 +10,1707 @@ "name": "ExodusActual", "avatar_url": "https://avatars3.githubusercontent.com/u/56446532?v=4", "profile": "https://github.com/ExodusActual", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "P1X3L0V4", "name": "Anna Karpińska", "avatar_url": "https://avatars2.githubusercontent.com/u/3372341?v=4", "profile": "https://github.com/P1X3L0V4", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "8bitp", "name": "8bitp", "avatar_url": "https://avatars2.githubusercontent.com/u/8021176?v=4", "profile": "https://github.com/8bitp", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "AlexandrouR", "name": "Rousos Alexandros", "avatar_url": "https://avatars1.githubusercontent.com/u/21177075?v=4", "profile": "https://github.com/AlexandrouR", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "EvanVanNessEth", "name": "EvanVanNessEth", "avatar_url": "https://avatars3.githubusercontent.com/u/34992008?v=4", "profile": "https://github.com/EvanVanNessEth", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "JesseAbram", "name": "JesseAbram", "avatar_url": "https://avatars0.githubusercontent.com/u/33698952?v=4", "profile": "https://github.com/JesseAbram", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Lililashka", "name": "Lililashka", "avatar_url": "https://avatars1.githubusercontent.com/u/28689401?v=4", "profile": "http://impermanence.co", - "contributions": ["design", "bug"] + "contributions": [ + "design", + "bug" + ] }, { "login": "vrde", "name": "vrde", "avatar_url": "https://avatars1.githubusercontent.com/u/134680?v=4", "profile": "https://github.com/vrde", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "RichardMcSorley", "name": "Richard McSorley", "avatar_url": "https://avatars2.githubusercontent.com/u/6407008?v=4", "profile": "https://github.com/RichardMcSorley", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ajsantander", "name": "Alejandro Santander", "avatar_url": "https://avatars2.githubusercontent.com/u/550409?v=4", "profile": "http://ajsantander.github.io/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "carver", "name": "Jason Carver", "avatar_url": "https://avatars0.githubusercontent.com/u/205327?v=4", "profile": "https://github.com/carver", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "chaitanyapotti", "name": "Chaitanya Potti", "avatar_url": "https://avatars1.githubusercontent.com/u/1688380?v=4", "profile": "https://github.com/chaitanyapotti", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "chriseth", "name": "chriseth", "avatar_url": "https://avatars2.githubusercontent.com/u/9073706?v=4", "profile": "https://github.com/chriseth", - "contributions": ["content", "review"] + "contributions": [ + "content", + "review" + ] }, { "login": "craigwilliams84", "name": "Craig Williams", "avatar_url": "https://avatars2.githubusercontent.com/u/11519649?v=4", "profile": "https://github.com/craigwilliams84", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "damianrusinek", "name": "Damian Rusinek", "avatar_url": "https://avatars3.githubusercontent.com/u/3885749?v=4", "profile": "https://github.com/damianrusinek", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "djrtwo", "name": "Danny Ryan", "avatar_url": "https://avatars0.githubusercontent.com/u/1433595?v=4", "profile": "https://github.com/djrtwo", - "contributions": ["content", "review"] + "contributions": [ + "content", + "review" + ] }, { "login": "fzeoli", "name": "Franco Zeoli", "avatar_url": "https://avatars2.githubusercontent.com/u/232174?v=4", "profile": "https://nomiclabs.io", - "contributions": ["content", "review"] + "contributions": [ + "content", + "review" + ] }, { "login": "guylando", "name": "Guy Lando", "avatar_url": "https://avatars2.githubusercontent.com/u/14879163?v=4", "profile": "https://secinfodb.wordpress.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jamesconnolly93", "name": "James Connolly", "avatar_url": "https://avatars1.githubusercontent.com/u/6970414?v=4", "profile": "https://github.com/jamesconnolly93", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jekrb", "name": "Jacob Burden", "avatar_url": "https://avatars3.githubusercontent.com/u/2081699?v=4", "profile": "https://burden.blog", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "joshorig", "name": "joshorig", "avatar_url": "https://avatars3.githubusercontent.com/u/852671?v=4", "profile": "https://github.com/joshorig", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mariapaulafn", "name": "mariapaulafn", "avatar_url": "https://avatars1.githubusercontent.com/u/27913589?v=4", "profile": "https://github.com/mariapaulafn", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "martintel", "name": "Martín", "avatar_url": "https://avatars0.githubusercontent.com/u/447637?v=4", "profile": "https://openzeppelin.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mat7ias", "name": "Mattias Nystrom", "avatar_url": "https://avatars2.githubusercontent.com/u/35585644?v=4", "profile": "https://github.com/mat7ias", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nabetse00", "name": "nabetse", "avatar_url": "https://avatars0.githubusercontent.com/u/4185026?v=4", "profile": "http://iteasys.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nicksavers", "name": "Nick Savers", "avatar_url": "https://avatars0.githubusercontent.com/u/7483198?v=4", "profile": "https://github.com/nicksavers", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ninabreznik", "name": "Nina Breznik", "avatar_url": "https://avatars1.githubusercontent.com/u/1076427?v=4", "profile": "http://playproject.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "oovg", "name": "Ven Gist", "avatar_url": "https://avatars2.githubusercontent.com/u/23664663?v=4", "profile": "https://odyssy.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "pfletcherhill", "name": "Paul Fletcher-Hill", "avatar_url": "https://avatars0.githubusercontent.com/u/1607180?v=4", "profile": "http://paulfletcherhill.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "phillux", "name": "Phil ", "avatar_url": "https://avatars1.githubusercontent.com/u/6450379?v=4", "profile": "https://github.com/phillux", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "remiprev", "name": "Rémi Prévost", "avatar_url": "https://avatars1.githubusercontent.com/u/11348?v=4", "profile": "https://exomel.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "shanejonas", "name": "Shane", "avatar_url": "https://avatars2.githubusercontent.com/u/364566?v=4", "profile": "http://shanejonas.net", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "shazow", "name": "Andrey Petrov", "avatar_url": "https://avatars3.githubusercontent.com/u/6292?v=4", "profile": "https://shazow.net/", - "contributions": ["content", "ideas", "a11y"] + "contributions": [ + "content", + "ideas", + "a11y" + ] }, { "login": "spalladino", "name": "Santiago Palladino", "avatar_url": "https://avatars2.githubusercontent.com/u/429604?v=4", "profile": "https://twitter.com/smpalladino", - "contributions": ["content", "ideas"] + "contributions": [ + "content", + "ideas" + ] }, { "login": "timbeiko", "name": "Tim Beiko", "avatar_url": "https://avatars0.githubusercontent.com/u/9390255?v=4", "profile": "http://www.twitter.com/timbeiko", - "contributions": ["content", "review"] + "contributions": [ + "content", + "review" + ] }, { "login": "wanseob", "name": "Wanseob Lim", "avatar_url": "https://avatars2.githubusercontent.com/u/8542397?v=4", "profile": "https://wanseob.com", - "contributions": ["content", "translation"] + "contributions": [ + "content", + "translation" + ] }, { "login": "wilbarnes", "name": "Wil Barnes", "avatar_url": "https://avatars1.githubusercontent.com/u/31866314?v=4", "profile": "https://github.com/wilbarnes", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Aniket-Engg", "name": "Aniket", "avatar_url": "https://avatars2.githubusercontent.com/u/30843294?v=4", "profile": "https://github.com/Aniket-Engg", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ChrisChinchilla", "name": "Chris Chinchilla", "avatar_url": "https://avatars2.githubusercontent.com/u/42080?v=4", "profile": "http://chrischinchilla.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Perseverance", "name": "George Spasov", "avatar_url": "https://avatars0.githubusercontent.com/u/5130509?v=4", "profile": "https://github.com/Perseverance", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "PierrickGT", "name": "Pierrick TURELIER", "avatar_url": "https://avatars3.githubusercontent.com/u/2401738?v=4", "profile": "http://pierrickturelier.fr", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Solexplorer", "name": "Solexplorer", "avatar_url": "https://avatars3.githubusercontent.com/u/50027175?v=4", "profile": "https://github.com/Solexplorer", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Sunghee2", "name": "Sunghee Lee", "avatar_url": "https://avatars2.githubusercontent.com/u/31603479?v=4", "profile": "https://github.com/Sunghee2", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "awallendahl", "name": "awallendahl", "avatar_url": "https://avatars1.githubusercontent.com/u/32873416?v=4", "profile": "https://github.com/awallendahl", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "bmann", "name": "Boris Mann", "avatar_url": "https://avatars2.githubusercontent.com/u/280420?v=4", "profile": "https://blog.bmannconsulting.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "carumusan", "name": "carumusan", "avatar_url": "https://avatars1.githubusercontent.com/u/879525?v=4", "profile": "https://github.com/carumusan", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "econoar", "name": "econoar", "avatar_url": "https://avatars1.githubusercontent.com/u/5050615?v=4", "profile": "https://github.com/econoar", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "gesquinca", "name": "Gustavo Esquinca", "avatar_url": "https://avatars1.githubusercontent.com/u/1707044?v=4", "profile": "http://twitter.com/gesq_", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "javier-tarazaga", "name": "Javier Tarazaga", "avatar_url": "https://avatars3.githubusercontent.com/u/7814134?v=4", "profile": "http://www.superblocks.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "kcole16", "name": "Kendall Cole", "avatar_url": "https://avatars2.githubusercontent.com/u/5624527?v=4", "profile": "https://github.com/kcole16", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "lbrendanl", "name": "Brendan Lee", "avatar_url": "https://avatars3.githubusercontent.com/u/5441045?v=4", "profile": "https://github.com/lbrendanl", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "maheshmurthy", "name": "Mahesh Murthy", "avatar_url": "https://avatars3.githubusercontent.com/u/70360?v=4", "profile": "https://www.zastrin.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "pi0neerpat", "name": "Patrick Gallagher", "avatar_url": "https://avatars1.githubusercontent.com/u/35622595?v=4", "profile": "http://oneclickdapp.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "realabbas", "name": "Ali Abbas", "avatar_url": "https://avatars0.githubusercontent.com/u/43527087?v=4", "profile": "https://www.mrroom.in", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "wtf", "name": "wtf", "avatar_url": "https://avatars3.githubusercontent.com/u/2460739?v=4", "profile": "https://github.com/wtf", - "contributions": ["code", "review", "infra"] + "contributions": [ + "code", + "review", + "infra" + ] }, { "login": "s0b0lev", "name": " Aleksandr Sobolev", "avatar_url": "https://avatars1.githubusercontent.com/u/2613381?v=4", "profile": "https://s0b0lev.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "zscole", "name": "Zak Cole", "avatar_url": "https://avatars1.githubusercontent.com/u/20308948?v=4", "profile": "http://www.whiteblock.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "BogdanHabic", "name": "Bogdan Habic", "avatar_url": "https://avatars2.githubusercontent.com/u/5364073?v=4", "profile": "https://github.com/BogdanHabic", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sneg55", "name": "Nick Sawinyh", "avatar_url": "https://avatars1.githubusercontent.com/u/7769371?v=4", "profile": "https://sawinyh.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "zoek1", "name": "Miguel Angel Gordián", "avatar_url": "https://avatars1.githubusercontent.com/u/660973?v=4", "profile": "http://zoek1.github.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "eswarasai", "name": "Eswara Sai", "avatar_url": "https://avatars2.githubusercontent.com/u/5172086?v=4", "profile": "https://eswarasai.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ethers", "name": "ethers", "avatar_url": "https://avatars1.githubusercontent.com/u/6937903?v=4", "profile": "https://github.com/ethers", - "contributions": ["content", "ideas"] + "contributions": [ + "content", + "ideas" + ] }, { "login": "faraggi", "name": "Felipe Faraggi", "avatar_url": "https://avatars2.githubusercontent.com/u/264382?v=4", "profile": "http://faraggi.org", - "contributions": ["content", "translation", "ideas", "review"] + "contributions": [ + "content", + "translation", + "ideas", + "review" + ] }, { "login": "maurelian", "name": "Maurelian", "avatar_url": "https://avatars3.githubusercontent.com/u/23033765?v=4", "profile": "https://github.com/maurelian", - "contributions": ["code", "review", "content"] + "contributions": [ + "code", + "review", + "content" + ] }, { "login": "CPSTL", "name": "CPSTL", "avatar_url": "https://avatars0.githubusercontent.com/u/32653033?v=4", "profile": "https://github.com/CPSTL", - "contributions": ["content", "review", "doc"] + "contributions": [ + "content", + "review", + "doc" + ] }, { "login": "Souptacular", "name": "Hudson Jameson", "avatar_url": "https://avatars1.githubusercontent.com/u/3460120?v=4", "profile": "http://www.hudsonjameson.com", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "shayanb", "name": "Shayan Eskandari", "avatar_url": "https://avatars2.githubusercontent.com/u/309108?v=4", "profile": "https://shayan.es/", - "contributions": ["code", "translation", "doc"] + "contributions": [ + "code", + "translation", + "doc" + ] }, { "login": "ScyDev", "name": "Lukas Sägesser", "avatar_url": "https://avatars3.githubusercontent.com/u/1307146?v=4", "profile": "http://www.scydev.ch", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "virgil", "name": "Virgil Griffith", "avatar_url": "https://avatars2.githubusercontent.com/u/81322?v=4", "profile": "http://virgil.gr", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "easeev", "name": "Eugene Aseev", "avatar_url": "https://avatars3.githubusercontent.com/u/14873170?v=4", "profile": "https://github.com/easeev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Jannis", "name": "Jannis Pohlmann", "avatar_url": "https://avatars0.githubusercontent.com/u/19324?v=4", "profile": "http://jannispohlmann.de/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "think-in-universe", "name": "think-in-universe", "avatar_url": "https://avatars0.githubusercontent.com/u/46699230?v=4", "profile": "https://steemblog.github.io/@robertyan", - "contributions": ["code", "content"] + "contributions": [ + "code", + "content" + ] }, { "login": "jjmstark", "name": "Josh Stark", "avatar_url": "https://avatars3.githubusercontent.com/u/17183498?v=4", "profile": "http://l4v.io", - "contributions": ["content", "review", "projectManagement"] + "contributions": [ + "content", + "review", + "projectManagement" + ] }, { "login": "alancwoo", "name": "Alan Woo", "avatar_url": "https://avatars0.githubusercontent.com/u/1481890?v=4", "profile": "https://www.alanwoo.ca", - "contributions": ["code", "design"] + "contributions": [ + "code", + "design" + ] }, { "login": "Man-Jain", "name": "Manank Patni", "avatar_url": "https://avatars3.githubusercontent.com/u/12700384?v=4", "profile": "https://manankpatni.wordpress.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "rodgeraraujo", "name": "Rogério Araújo", "avatar_url": "https://avatars0.githubusercontent.com/u/20842252?v=4", "profile": "http://www.rogerioaraujo.co.nf/", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "natacha-involves", "name": "Natacha Souza", "avatar_url": "https://avatars1.githubusercontent.com/u/49870579?v=4", "profile": "https://github.com/natacha-involves", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "sorumfactory", "name": "sorumfactory", "avatar_url": "https://avatars1.githubusercontent.com/u/15648718?v=4", "profile": "https://github.com/sorumfactory", - "contributions": ["translation", "projectManagement", "content", "bug"] + "contributions": [ + "translation", + "projectManagement", + "content", + "bug" + ] }, { "login": "samajammin", "name": "Sam Richards", "avatar_url": "https://avatars1.githubusercontent.com/u/8097623?v=4", "profile": "https://www.samajammin.com/", - "contributions": ["code", "content", "doc", "projectManagement"] + "contributions": [ + "code", + "content", + "doc", + "projectManagement" + ] }, { "login": "antodp", "name": "Antonio Della Porta", "avatar_url": "https://avatars3.githubusercontent.com/u/20992089?v=4", "profile": "http://antodp.xyz", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Abhimanyu121", "name": "Abhimanyu Shekhawat", "avatar_url": "https://avatars0.githubusercontent.com/u/16034874?v=4", "profile": "https://github.com/Abhimanyu121", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "fulldecent", "name": "William Entriken", "avatar_url": "https://avatars0.githubusercontent.com/u/382183?v=4", "profile": "http://phor.net", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "sangphilkim", "name": "Sangphil Kim", "avatar_url": "https://avatars1.githubusercontent.com/u/13456532?v=4", "profile": "http://sangphilkim.me", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "tstt", "name": "peijie", "avatar_url": "https://avatars2.githubusercontent.com/u/16997688?v=4", "profile": "https://github.com/tstt", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "Jokyash", "name": "Jokyash", "avatar_url": "https://avatars1.githubusercontent.com/u/44118299?v=4", "profile": "https://github.com/Jokyash", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "pedrorivera", "name": "Pedro Rivera", "avatar_url": "https://avatars2.githubusercontent.com/u/4961012?v=4", "profile": "https://github.com/pedrorivera", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "gabririgo", "name": "Gabriele Rigo", "avatar_url": "https://avatars1.githubusercontent.com/u/12066256?v=4", "profile": "https://beta.rigoblock.com", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "dTilen", "name": "Tilen Držan", "avatar_url": "https://avatars1.githubusercontent.com/u/912560?v=4", "profile": "https://dtilen.si", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "jJosko1986", "name": "jJosko1986", "avatar_url": "https://avatars2.githubusercontent.com/u/54378053?v=4", "profile": "https://github.com/jJosko1986", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "EthereumCommunityNetwork", "name": "ECN", "avatar_url": "https://avatars1.githubusercontent.com/u/53846157?v=4", "profile": "https://ethereum.cn", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "damianoazzolini", "name": "Damiano Azzolini", "avatar_url": "https://avatars2.githubusercontent.com/u/24901681?v=4", "profile": "https://github.com/damianoazzolini", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "matteopey", "name": "matteopey", "avatar_url": "https://avatars2.githubusercontent.com/u/28830727?v=4", "profile": "https://github.com/matteopey", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "kilu83", "name": "Hun Ryu", "avatar_url": "https://avatars3.githubusercontent.com/u/29397119?v=4", "profile": "https://github.com/kilu83", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "nake13", "name": "nake13", "avatar_url": "https://avatars0.githubusercontent.com/u/6271031?v=4", "profile": "https://github.com/nake13", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "alexiskefalas", "name": "alexiskefalas", "avatar_url": "https://avatars2.githubusercontent.com/u/57708389?v=4", "profile": "https://github.com/alexiskefalas", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "behradkhodayar", "name": "Behrad Khodayar", "avatar_url": "https://avatars1.githubusercontent.com/u/16176436?v=4", "profile": "http://Behrad.Khodayar.me", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "Frankaus", "name": "Frankaus", "avatar_url": "https://avatars3.githubusercontent.com/u/57708955?v=4", "profile": "https://github.com/Frankaus", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "hacktar", "name": "hacktar", "avatar_url": "https://avatars2.githubusercontent.com/u/11939542?v=4", "profile": "https://github.com/hacktar", - "contributions": ["code", "translation"] + "contributions": [ + "code", + "translation" + ] }, { "login": "DjangoM", "name": "Jaroslav Macej", "avatar_url": "https://avatars2.githubusercontent.com/u/35060411?v=4", "profile": "https://github.com/DjangoM", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "EmanHerawy", "name": "Eman Herawy", "avatar_url": "https://avatars3.githubusercontent.com/u/10674070?v=4", "profile": "https://github.com/EmanHerawy", - "contributions": ["translation", "code", "ideas", "doc"] + "contributions": [ + "translation", + "code", + "ideas", + "doc" + ] }, { "login": "Bellinas", "name": "Bellinas", "avatar_url": "https://avatars0.githubusercontent.com/u/45827044?v=4", "profile": "https://github.com/Bellinas", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "amchercashin", "name": "Alexander Cherkashin", "avatar_url": "https://avatars3.githubusercontent.com/u/8727497?v=4", "profile": "https://github.com/amchercashin", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "EnochMbaebie", "name": "Enoch Mbaebie", "avatar_url": "https://avatars0.githubusercontent.com/u/29120867?v=4", "profile": "http://www.soarontech.com.ng", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "inlak16", "name": "inlak16", "avatar_url": "https://avatars1.githubusercontent.com/u/53479637?v=4", "profile": "https://github.com/inlak16", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "bobjiang", "name": "Bob Jiang", "avatar_url": "https://avatars0.githubusercontent.com/u/1224604?v=4", "profile": "https://www.c4at.cn/", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "cobject", "name": "Suhun Kim", "avatar_url": "https://avatars1.githubusercontent.com/u/826798?v=4", "profile": "https://www.linkedin.com/in/suhunkim/", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "jzu", "name": "Jean Zundel", "avatar_url": "https://avatars3.githubusercontent.com/u/337334?v=4", "profile": "http://jzu.blog.free.fr/", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "HachemiH", "name": "Hachemi", "avatar_url": "https://avatars2.githubusercontent.com/u/12778013?v=4", "profile": "https://twitter.com/_Hachemi_", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "hanzoh1", "name": "hanzoh", "avatar_url": "https://avatars0.githubusercontent.com/u/42790758?v=4", "profile": "https://github.com/hanzoh1", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "vincentlg", "name": "Vincent Le Gallic", "avatar_url": "https://avatars1.githubusercontent.com/u/813911?v=4", "profile": "https://twitter.com/vincentLg", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "Enigmatic331", "name": "Enigmatic331", "avatar_url": "https://avatars2.githubusercontent.com/u/28551011?v=4", "profile": "https://github.com/Enigmatic331", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "0zAND1z", "name": "Ganesh Prasad Kumble", "avatar_url": "https://avatars1.githubusercontent.com/u/11145839?v=4", "profile": "https://twitter.com/0zAND1z", - "contributions": ["content", "translation"] + "contributions": [ + "content", + "translation" + ] }, { "login": "pontiyaraja", "name": "Pandiyaraja Ramamoorthy", "avatar_url": "https://avatars0.githubusercontent.com/u/1989030?v=4", "profile": "https://github.com/pontiyaraja", - "contributions": ["content", "translation"] + "contributions": [ + "content", + "translation" + ] }, { "login": "Kuekuatsheu95", "name": "Archan Roychoudhury", "avatar_url": "https://avatars0.githubusercontent.com/u/45584024?v=4", "profile": "https://github.com/Kuekuatsheu95", - "contributions": ["content", "translation"] + "contributions": [ + "content", + "translation" + ] }, { "login": "its-VSP", "name": "SAI PRASHANTH VUPPALA", "avatar_url": "https://avatars0.githubusercontent.com/u/22447085?v=4", "profile": "https://github.com/its-VSP", - "contributions": ["content", "translation"] + "contributions": [ + "content", + "translation" + ] }, { "login": "sickmorty", "name": "Sayid Almahdy", "avatar_url": "https://avatars3.githubusercontent.com/u/39275239?v=4", "profile": "https://github.com/sickmorty", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "jeedani", "name": "jeedani", "avatar_url": "https://avatars2.githubusercontent.com/u/36130718?v=4", "profile": "https://github.com/jeedani", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "akira-19", "name": "Akira", "avatar_url": "https://avatars2.githubusercontent.com/u/38364091?v=4", "profile": "https://github.com/akira-19", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "karansinghgit", "name": "karansinghgit", "avatar_url": "https://avatars3.githubusercontent.com/u/44376616?v=4", "profile": "https://github.com/karansinghgit", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "marcgarreau", "name": "Marc Garreau", "avatar_url": "https://avatars1.githubusercontent.com/u/3621728?v=4", "profile": "https://www.manning.com/books/redux-in-action?a_aid=coach&a_bid=48d05fcb", - "contributions": ["content", "ideas", "bug"] + "contributions": [ + "content", + "ideas", + "bug" + ] }, { "login": "mul53", "name": "mul53", "avatar_url": "https://avatars0.githubusercontent.com/u/19148531?v=4", "profile": "https://github.com/mul53", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "CodinMaster", "name": "Apoorv Lathey", "avatar_url": "https://avatars3.githubusercontent.com/u/20395316?v=4", "profile": "https://github.com/CodinMaster", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ksato9700", "name": "Ken Sato", "avatar_url": "https://avatars1.githubusercontent.com/u/175834?v=4", "profile": "https://github.com/ksato9700", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Sesamestrong", "name": "Sesamestrong", "avatar_url": "https://avatars3.githubusercontent.com/u/26335275?v=4", "profile": "https://github.com/Sesamestrong", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Christofon", "name": "ChrisK", "avatar_url": "https://avatars0.githubusercontent.com/u/26435661?v=4", "profile": "https://github.com/Christofon", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "svanas", "name": "Stefan van As", "avatar_url": "https://avatars1.githubusercontent.com/u/787861?v=4", "profile": "https://stackoverflow.com/story/svanas", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "gjeanmart", "name": "Grégoire Jeanmart", "avatar_url": "https://avatars3.githubusercontent.com/u/506784?v=4", "profile": "https://greg.jeanmart.me", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nysxah", "name": "nysxah", "avatar_url": "https://avatars2.githubusercontent.com/u/30059030?v=4", "profile": "https://github.com/nysxah", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "RachBLondon", "name": "Rachel", "avatar_url": "https://avatars0.githubusercontent.com/u/8742251?v=4", "profile": "http://rachblondon.github.io/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "wschwab", "name": "wschwab", "avatar_url": "https://avatars3.githubusercontent.com/u/31592931?v=4", "profile": "https://github.com/wschwab", - "contributions": ["code", "content"] + "contributions": [ + "code", + "content" + ] }, { "login": "edsonayllon", "name": "Edson Ayllon", "avatar_url": "https://avatars2.githubusercontent.com/u/34966228?v=4", "profile": "http://twitter.com/relativeread", - "contributions": ["content", "ideas"] + "contributions": [ + "content", + "ideas" + ] }, { "login": "Pet3ris", "name": "Peteris Erins", "avatar_url": "https://avatars0.githubusercontent.com/u/224585?v=4", "profile": "http://peteris.xyz", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "JimmyShi22", "name": "jimmyshi", "avatar_url": "https://avatars3.githubusercontent.com/u/12178678?v=4", "profile": "https://github.com/JimmyShi22", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "JefteCosta", "name": "Jefte Costa", "avatar_url": "https://avatars0.githubusercontent.com/u/3399117?v=4", "profile": "http://www.netyul.com.br", - "contributions": ["translation", "code"] + "contributions": [ + "translation", + "code" + ] }, { "login": "jinhojang6", "name": "Jinho Jang", "avatar_url": "https://avatars2.githubusercontent.com/u/41753422?v=4", "profile": "https://www.linkedin.com/in/jinho-jang-4304a0142/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jklepatch", "name": "Julien Klepatch", "avatar_url": "https://avatars2.githubusercontent.com/u/9279488?v=4", "profile": "https://eattheblocks.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "YazzyYaz", "name": "Yaz Khoury", "avatar_url": "https://avatars2.githubusercontent.com/u/9094204?v=4", "profile": "https://www.yazkhoury.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "yosriady", "name": "Yos Riady", "avatar_url": "https://avatars3.githubusercontent.com/u/1084226?v=4", "profile": "http://yos.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "andrewjcohen", "name": "Andrew Cohen", "avatar_url": "https://avatars2.githubusercontent.com/u/1210802?v=4", "profile": "http://infura.io", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "wslyvh", "name": "Wesley van Heije", "avatar_url": "https://avatars2.githubusercontent.com/u/25974464?v=4", "profile": "https://twitter.com/wslyvh", - "contributions": ["content", "infra"] + "contributions": [ + "content", + "infra" + ] }, { "login": "gr0uch0dev", "name": "gr0uch0dev", "avatar_url": "https://avatars1.githubusercontent.com/u/17497722?v=4", "profile": "https://github.com/gr0uch0dev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "hsy822", "name": "sooyoung", "avatar_url": "https://avatars3.githubusercontent.com/u/17763340?v=4", "profile": "https://github.com/hsy822", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "adria0", "name": "Adria Massanet", "avatar_url": "https://avatars3.githubusercontent.com/u/5526331?v=4", "profile": "https://github.com/adria0", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "as-dr", "name": "Alex Singh", "avatar_url": "https://avatars0.githubusercontent.com/u/6787950?v=4", "profile": "http://www.alexsingh.com", - "contributions": ["design"] + "contributions": [ + "design" + ] }, { "login": "carlfairclough", "name": "Carl Fairclough", "avatar_url": "https://avatars1.githubusercontent.com/u/4670881?v=4", "profile": "http://carlfairclough.me", - "contributions": ["design", "code", "bug"] + "contributions": [ + "design", + "code", + "bug" + ] }, { "login": "kvrnc", "name": "Kaven C", "avatar_url": "https://avatars3.githubusercontent.com/u/36660375?v=4", "profile": "https://github.com/kvrnc", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mhatvan", "name": "Markus Hatvan", "avatar_url": "https://avatars2.githubusercontent.com/u/16797721?v=4", "profile": "https://github.com/mhatvan", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "evanstucker-hates-2fa", "name": "Evans Tucker", "avatar_url": "https://avatars0.githubusercontent.com/u/20584445?v=4", "profile": "https://github.com/evanstucker-hates-2fa", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "fluffays", "name": "Adina Cretu", "avatar_url": "https://avatars1.githubusercontent.com/u/39056857?v=4", "profile": "https://github.com/fluffays", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "tvanepps", "name": "tvanepps", "avatar_url": "https://avatars1.githubusercontent.com/u/27454964?v=4", "profile": "https://github.com/tvanepps", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "FlipFloop", "name": "Victor Guyard", "avatar_url": "https://avatars3.githubusercontent.com/u/19635051?v=4", "profile": "https://github.com/FlipFloop", - "contributions": ["a11y"] + "contributions": [ + "a11y" + ] }, { "login": "abhranildas", "name": "Abhranil Das", "avatar_url": "https://avatars0.githubusercontent.com/u/1142007?v=4", "profile": "http://www.abhranil.net", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ahmeteminkocal", "name": "Ahmet Emin Koçal", "avatar_url": "https://avatars2.githubusercontent.com/u/10382507?v=4", "profile": "https://www.exorditech.com.tr", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "qnou", "name": "Aqeel", "avatar_url": "https://avatars0.githubusercontent.com/u/33502282?v=4", "profile": "http://empire.studio", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "linda-xie", "name": "Linda Xie", "avatar_url": "https://avatars0.githubusercontent.com/u/55955358?v=4", "profile": "https://github.com/linda-xie", - "contributions": ["review", "content"] + "contributions": [ + "review", + "content" + ] }, { "login": "IanEck", "name": "Ian Eck", "avatar_url": "https://avatars2.githubusercontent.com/u/5863338?v=4", "profile": "https://github.com/IanEck", - "contributions": ["review", "content"] + "contributions": [ + "review", + "content" + ] }, { "login": "cwaring", "name": "Chris Waring", "avatar_url": "https://avatars2.githubusercontent.com/u/106938?v=4", "profile": "http://wwaves.co", - "contributions": ["code", "ideas"] + "contributions": [ + "code", + "ideas" + ] }, { "login": "evertonfraga", "name": "Ev", "avatar_url": "https://avatars2.githubusercontent.com/u/47108?v=4", "profile": "https://github.com/evertonfraga", - "contributions": ["ideas", "bug", "content"] + "contributions": [ + "ideas", + "bug", + "content" + ] }, { "login": "0xKiwi", "name": "Ivan Martinez", "avatar_url": "https://avatars2.githubusercontent.com/u/6251510?v=4", "profile": "https://discord.gg/5W5tVb3", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sebastiantf", "name": "Sebastian T F", "avatar_url": "https://avatars3.githubusercontent.com/u/36922376?v=4", "profile": "https://github.com/sebastiantf", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "anettrolikova", "name": "Anett Rolikova ", "avatar_url": "https://avatars1.githubusercontent.com/u/44020788?v=4", "profile": "https://twitter.com/AnettRolikova", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "poojaranjan", "name": "Pooja Ranjan", "avatar_url": "https://avatars0.githubusercontent.com/u/29681685?v=4", "profile": "https://etherworld.co", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sassal", "name": "sassal", "avatar_url": "https://avatars0.githubusercontent.com/u/9276959?v=4", "profile": "https://twitter.com/sassal0x", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "robert-zaremba", "name": "Robert Zaremba", "avatar_url": "https://avatars0.githubusercontent.com/u/811701?v=4", "profile": "https://zaremba.ch", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "tasdienes", "name": "Tas", "avatar_url": "https://avatars1.githubusercontent.com/u/18563486?v=4", "profile": "https://github.com/tasdienes", - "contributions": ["ideas", "content"] + "contributions": [ + "ideas", + "content" + ] }, { "login": "s-pace", "name": "Sylvain Pace", "avatar_url": "https://avatars2.githubusercontent.com/u/32097720?v=4", "profile": "https://github.com/s-pace", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "sinahab", "name": "Sina Habibian", "avatar_url": "https://avatars0.githubusercontent.com/u/4315207?v=4", "profile": "http://twitter.com/sinahab", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "crazyrabbitLTC", "name": "Dennison Bertram", "avatar_url": "https://avatars0.githubusercontent.com/u/1938013?v=4", "profile": "http://www.dennisonbertram.com", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "arturgontijo", "name": "Artur Gontijo", "avatar_url": "https://avatars0.githubusercontent.com/u/15108323?v=4", "profile": "https://github.com/arturgontijo", - "contributions": ["ideas", "content"] + "contributions": [ + "ideas", + "content" + ] }, { "login": "ethjoe", "name": "ethjoe", "avatar_url": "https://avatars0.githubusercontent.com/u/36374665?v=4", "profile": "https://github.com/ethjoe", - "contributions": ["content", "review"] + "contributions": [ + "content", + "review" + ] }, { "login": "cooganb", "name": "cooganb", "avatar_url": "https://avatars2.githubusercontent.com/u/8144425?v=4", "profile": "https://github.com/cooganb", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "drequinox", "name": "drequinox", "avatar_url": "https://avatars1.githubusercontent.com/u/34604812?v=4", "profile": "https://github.com/drequinox", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "tarun1475", "name": "Tarun Gupta", "avatar_url": "https://avatars1.githubusercontent.com/u/17008737?v=4", "profile": "https://biconomy.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jpitts", "name": "Jamie Pitts", "avatar_url": "https://avatars1.githubusercontent.com/u/509756?v=4", "profile": "https://github.com/jpitts", - "contributions": ["ideas", "content"] + "contributions": [ + "ideas", + "content" + ] }, { "login": "seichris", "name": "Chris Seifert", "avatar_url": "https://avatars0.githubusercontent.com/u/25006584?v=4", "profile": "http://web3.consulting", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "JCraigWasTaken", "name": "John Craig", "avatar_url": "https://avatars1.githubusercontent.com/u/16075438?v=4", "profile": "http://johnpcraig.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "MorpheusNetwork", "name": "Noam Eppel", "avatar_url": "https://avatars0.githubusercontent.com/u/36540973?v=4", "profile": "https://morpheus.network/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "jacobwillemsma", "name": "Jacob Willemsma", "avatar_url": "https://avatars0.githubusercontent.com/u/4511854?v=4", "profile": "https://github.com/jacobwillemsma", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "alexmb15", "name": "Alex", "avatar_url": "https://avatars3.githubusercontent.com/u/12184447?v=4", "profile": "https://github.com/alexmb15", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "PaulRBerg", "name": "Paul Razvan Berg", "avatar_url": "https://avatars1.githubusercontent.com/u/8782666?v=4", "profile": "https://twitter.com/PaulRBerg", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ph5500", "name": "ph5500", "avatar_url": "https://avatars0.githubusercontent.com/u/60459707?v=4", "profile": "https://github.com/ph5500", - "contributions": ["content", "code"] + "contributions": [ + "content", + "code" + ] }, { "login": "johnmonarch", "name": "John Monarch", "avatar_url": "https://avatars1.githubusercontent.com/u/31969812?v=4", "profile": "http://www.johnmonarch.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "shad-k", "name": "Shadab Khan", "avatar_url": "https://avatars1.githubusercontent.com/u/23720732?v=4", "profile": "https://github.com/shad-k", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ryancreatescopy", @@ -1304,1736 +1732,2305 @@ "name": "Hammad Jutt", "avatar_url": "https://avatars3.githubusercontent.com/u/7143583?v=4", "profile": "http://jutt.ca", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "becaz", "name": "Becaz", "avatar_url": "https://avatars2.githubusercontent.com/u/58934348?v=4", "profile": "https://becaz.org", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "caosbad", "name": "Caos", "avatar_url": "https://avatars2.githubusercontent.com/u/10805199?v=4", "profile": "https://github.com/caosbad", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "developerfred", "name": "codingsh", "avatar_url": "https://avatars2.githubusercontent.com/u/57037080?v=4", "profile": "http://bit.ly/SupportMyCode", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ArtemKo7v", "name": "Artem", "avatar_url": "https://avatars3.githubusercontent.com/u/2138231?v=4", "profile": "https://github.com/ArtemKo7v", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "crisgarner", "name": "Cristian Espinoza Garner", "avatar_url": "https://avatars1.githubusercontent.com/u/578688?v=4", "profile": "http://medium.com/@crisgarner", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "dschlabach", "name": "Daniel Schlabach", "avatar_url": "https://avatars1.githubusercontent.com/u/31226559?v=4", "profile": "https://github.com/dschlabach", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "MariusVanDerWijden", "name": "Marius van der Wijden", "avatar_url": "https://avatars0.githubusercontent.com/u/16664698?v=4", "profile": "https://github.com/MariusVanDerWijden", - "contributions": ["content", "ideas"] + "contributions": [ + "content", + "ideas" + ] }, { "login": "gorgos", "name": "Markus Waas", "avatar_url": "https://avatars1.githubusercontent.com/u/659390?v=4", "profile": "https://soliditydeveloper.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "KiChjang", "name": "Keith Yeung", "avatar_url": "https://avatars0.githubusercontent.com/u/3248587?v=4", "profile": "https://github.com/KiChjang", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "jordanlyall", "name": "Jordan Lyall", "avatar_url": "https://avatars0.githubusercontent.com/u/999289?v=4", "profile": "https://twitter.com/JordanLyall", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "elanh", "name": "elanh", "avatar_url": "https://avatars0.githubusercontent.com/u/23513719?v=4", "profile": "https://github.com/elanh", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mohamedhayibor", "name": "Mohamed Hayibor", "avatar_url": "https://avatars1.githubusercontent.com/u/11381259?v=4", "profile": "https://mohamedhayibor.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "conor10", "name": "Conor Svensson", "avatar_url": "https://avatars1.githubusercontent.com/u/2148266?v=4", "profile": "https://www.web3labs.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "aranhaagency", "name": "Aranha", "avatar_url": "https://avatars1.githubusercontent.com/u/50056110?v=4", "profile": "http://twitter.com/aranhaagency", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "jyoo", "name": "Jung Sup (James) Yoo", "avatar_url": "https://avatars1.githubusercontent.com/u/37724247?v=4", "profile": "http://www.linkedin.com/in/jsyoo", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "Veeit", "name": "Veit Progl", "avatar_url": "https://avatars2.githubusercontent.com/u/22853176?v=4", "profile": "https://veit.pro", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "jcamilli", "name": "jcamilli", "avatar_url": "https://avatars3.githubusercontent.com/u/1952742?v=4", "profile": "https://github.com/jcamilli", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "holiman", "name": "Martin Holst Swende", "avatar_url": "https://avatars1.githubusercontent.com/u/142290?v=4", "profile": "http://martin.swende.se", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "gilbertginsberg", "name": "Steven Gilbert", "avatar_url": "https://avatars2.githubusercontent.com/u/4500679?v=4", "profile": "https://github.com/gilbertginsberg", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sachayves", "name": "Sacha Saint-Leger", "avatar_url": "https://avatars1.githubusercontent.com/u/5483559?v=4", "profile": "https://hackingresear.ch", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "gichiba", "name": "Griffin Ichiba Hotchkiss", "avatar_url": "https://avatars3.githubusercontent.com/u/9886144?v=4", "profile": "https://github.com/gichiba", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "epheph", "name": "Scott Bigelow", "avatar_url": "https://avatars1.githubusercontent.com/u/361654?v=4", "profile": "https://github.com/epheph", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "hrkrshnn", "name": "Harikrishnan Mulackal", "avatar_url": "https://avatars2.githubusercontent.com/u/13174375?v=4", "profile": "https://github.com/hrkrshnn", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "matthieucan", "name": "Matthieu Caneill", "avatar_url": "https://avatars1.githubusercontent.com/u/2828729?v=4", "profile": "https://matthieu.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "arjunaskykok", "name": "Arjuna Sky Kok", "avatar_url": "https://avatars0.githubusercontent.com/u/32124593?v=4", "profile": "https://github.com/arjunaskykok", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "briangu33", "name": "Brian Gu", "avatar_url": "https://avatars2.githubusercontent.com/u/16885693?v=4", "profile": "https://github.com/briangu33", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "BlueVelvetSackOfGoldPotatoes", "name": "Gonçalo Hora de Carvalho", "avatar_url": "https://avatars1.githubusercontent.com/u/37756125?v=4", "profile": "http://goncalohoracarvalho.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "taxmeifyoucan", "name": "Mário Havel", "avatar_url": "https://avatars0.githubusercontent.com/u/61149543?v=4", "profile": "https://github.com/taxmeifyoucan", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "JosefJ", "name": "JosefJ", "avatar_url": "https://avatars1.githubusercontent.com/u/10713123?v=4", "profile": "http://Polynom.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "cburgdorf", "name": "Christoph Burgdorf", "avatar_url": "https://avatars2.githubusercontent.com/u/521109?v=4", "profile": "http://christoph.burgdorf.eth.link", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "slipperybeluga", "name": "slipperybeluga", "avatar_url": "https://avatars0.githubusercontent.com/u/6125744?v=4", "profile": "https://github.com/slipperybeluga", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "liuzimin", "name": "David Liu", "avatar_url": "https://avatars3.githubusercontent.com/u/24978284?v=4", "profile": "https://www.campusconnect.ca/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "shreyashariharan3", "name": "shreyashariharan3", "avatar_url": "https://avatars3.githubusercontent.com/u/48186822?v=4", "profile": "https://github.com/shreyashariharan3", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "AdrianClv", "name": "Adrián Calvo", "avatar_url": "https://avatars2.githubusercontent.com/u/9255560?v=4", "profile": "https://www.linkedin.com/in/adrianclv/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "daviroo", "name": "daviroo", "avatar_url": "https://avatars1.githubusercontent.com/u/3502409?v=4", "profile": "https://github.com/daviroo", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "notrixbe", "name": "Wim Notredame", "avatar_url": "https://avatars1.githubusercontent.com/u/3173121?v=4", "profile": "https://www.linkedin.com/in/wim-notredame/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "vasa-develop", "name": "vasa", "avatar_url": "https://avatars2.githubusercontent.com/u/28847087?v=4", "profile": "https://vaibhavsaini.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "franzihei", "name": "Franziska Heintel", "avatar_url": "https://avatars2.githubusercontent.com/u/41991517?v=4", "profile": "https://github.com/franzihei", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "umair-me", "name": "Muhammad Umair Irshad", "avatar_url": "https://avatars1.githubusercontent.com/u/834935?v=4", "profile": "http://umair.me", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "naszam", "name": "Nazzareno Massari", "avatar_url": "https://avatars0.githubusercontent.com/u/23325228?v=4", "profile": "https://gitcoin.co/profile/naszam/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "vladimirfomene", "name": "Mayemene Fomene Jean Vladimir", "avatar_url": "https://avatars1.githubusercontent.com/u/11140070?v=4", "profile": "http://vladimirfomene.github.io", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "yahsinhuangtw", "name": "Yahsin Huang", "avatar_url": "https://avatars2.githubusercontent.com/u/6111396?v=4", "profile": "https://yahsin.me/", - "contributions": ["content", "translation"] + "contributions": [ + "content", + "translation" + ] }, { "login": "jzaki", "name": "James Zaki", "avatar_url": "https://avatars1.githubusercontent.com/u/939603?v=4", "profile": "http://medium.com/@james.zaki", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "designheretic", "name": "Greg Lang", "avatar_url": "https://avatars2.githubusercontent.com/u/16615034?v=4", "profile": "https://rivet.cloud", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "voska", "name": "Matt Voska", "avatar_url": "https://avatars1.githubusercontent.com/u/3444419?v=4", "profile": "https://github.com/voska", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "mustafawm", "name": "mustafa", "avatar_url": "https://avatars0.githubusercontent.com/u/13101565?v=4", "profile": "https://github.com/mustafawm", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "wackerow", "name": "Paul Wackerow", "avatar_url": "https://avatars0.githubusercontent.com/u/54227730?v=4", "profile": "https://github.com/wackerow", - "contributions": ["code", "bug", "doc", "design"] + "contributions": [ + "code", + "bug", + "doc", + "design" + ] }, { "login": "detohm", "name": "Attaphong Rattanaveerachanon", "avatar_url": "https://avatars1.githubusercontent.com/u/4770525?v=4", "profile": "https://github.com/detohm", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "liaojianqi", "name": "LoinLiao", "avatar_url": "https://avatars1.githubusercontent.com/u/14259182?v=4", "profile": "https://github.com/liaojianqi", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "DrMad92", "name": "DrMad92", "avatar_url": "https://avatars2.githubusercontent.com/u/28419987?v=4", "profile": "https://github.com/DrMad92", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "alcuadrado", "name": "Patricio Palladino", "avatar_url": "https://avatars1.githubusercontent.com/u/176499?v=4", "profile": "http://www.nomiclabs.io", - "contributions": ["review", "ideas"] + "contributions": [ + "review", + "ideas" + ] }, { "login": "davidmurdoch", "name": "David Murdoch", "avatar_url": "https://avatars2.githubusercontent.com/u/187813?v=4", "profile": "https://davidmurdoch.com", - "contributions": ["review"] + "contributions": [ + "review" + ] }, { "login": "MashhoodIjaz", "name": "MashhoodIjaz", "avatar_url": "https://avatars2.githubusercontent.com/u/33490414?v=4", "profile": "https://github.com/MashhoodIjaz", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "Dan-Nolan", "name": "Dan Nolan", "avatar_url": "https://avatars2.githubusercontent.com/u/4423365?v=4", "profile": "https://www.chainshot.com/", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "marekkirejczyk", "name": "Marek Kirejczyk", "avatar_url": "https://avatars3.githubusercontent.com/u/197522?v=4", "profile": "https://github.com/marekkirejczyk", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "joncursi", "name": "Jon Cursi", "avatar_url": "https://avatars3.githubusercontent.com/u/4974609?v=4", "profile": "https://joncursi.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jamespfarrell", "name": "James Farrell", "avatar_url": "https://avatars2.githubusercontent.com/u/10499048?v=4", "profile": "https://topia.us", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "xaviarias", "name": "Xavi Arias Seguí", "avatar_url": "https://avatars3.githubusercontent.com/u/876579?v=4", "profile": "https://github.com/xaviarias", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "howdyAnkit", "name": "ANKIT_PAL", "avatar_url": "https://avatars2.githubusercontent.com/u/40737659?v=4", "profile": "https://howdyankit.xyz", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ikc89", "name": "İsmail Kerim Cem", "avatar_url": "https://avatars0.githubusercontent.com/u/7846803?v=4", "profile": "https://github.com/ikc89", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "eberhardtj", "name": "Joanne", "avatar_url": "https://avatars0.githubusercontent.com/u/49472730?v=4", "profile": "https://github.com/eberhardtj", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "michael60634", "name": "michael60634", "avatar_url": "https://avatars1.githubusercontent.com/u/59159320?v=4", "profile": "https://github.com/michael60634", - "contributions": ["bug", "ideas"] + "contributions": [ + "bug", + "ideas" + ] }, { "login": "gumb0", "name": "Andrei Maiboroda", "avatar_url": "https://avatars0.githubusercontent.com/u/1863135?v=4", "profile": "https://github.com/gumb0", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ankisharmadel", "name": "Anki", "avatar_url": "https://avatars2.githubusercontent.com/u/28820514?v=4", "profile": "https://github.com/ankisharmadel", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "wendydv1989", "name": "Michelle Plur", "avatar_url": "https://avatars1.githubusercontent.com/u/52613476?v=4", "profile": "https://github.com/wendydv1989", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "PAAlmasi", "name": "PAAlmasi", "avatar_url": "https://avatars3.githubusercontent.com/u/38504457?v=4", "profile": "https://github.com/PAAlmasi", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "benjaminion", "name": "Ben Edgington", "avatar_url": "https://avatars2.githubusercontent.com/u/20796281?v=4", "profile": "http://benjaminion.xyz", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "alexsantee", "name": "alexsantee", "avatar_url": "https://avatars3.githubusercontent.com/u/40058461?v=4", "profile": "https://github.com/alexsantee", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "peth-yursick", "name": "peth-yursick", "avatar_url": "https://avatars2.githubusercontent.com/u/55857222?v=4", "profile": "https://github.com/peth-yursick", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Arnor1711", "name": "Alwin Stockinger", "avatar_url": "https://avatars2.githubusercontent.com/u/23365186?v=4", "profile": "https://github.com/Arnor1711", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "rihp", "name": "Roberto Henríquez Perozo", "avatar_url": "https://avatars1.githubusercontent.com/u/12145726?v=4", "profile": "http://henriquezperozo.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "strykerin", "name": "strykerin", "avatar_url": "https://avatars2.githubusercontent.com/u/19648581?v=4", "profile": "https://github.com/strykerin", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jddxf", "name": "jddxf", "avatar_url": "https://avatars2.githubusercontent.com/u/11155177?v=4", "profile": "https://github.com/jddxf", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "LucasRoorda", "name": "LucasRoorda", "avatar_url": "https://avatars2.githubusercontent.com/u/48732931?v=4", "profile": "http://www.blockchair.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "MihirLuthra", "name": "Mihir Luthra", "avatar_url": "https://avatars0.githubusercontent.com/u/42952059?v=4", "profile": "https://github.com/MihirLuthra", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "tentodev", "name": "tentodev", "avatar_url": "https://avatars2.githubusercontent.com/u/75068379?v=4", "profile": "https://github.com/tentodev", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "MiZiet", "name": "MiZiet", "avatar_url": "https://avatars2.githubusercontent.com/u/55240109?v=4", "profile": "https://github.com/MiZiet", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sudo-vaibhav", "name": "Vaibhav Chopra", "avatar_url": "https://avatars0.githubusercontent.com/u/53619134?v=4", "profile": "http://vaibhavchopra.codes", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "lsankar4033", "name": "Lakshman Sankar", "avatar_url": "https://avatars1.githubusercontent.com/u/451947?v=4", "profile": "https://github.com/lsankar4033", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "hewigovens", "name": "hewigovens", "avatar_url": "https://avatars1.githubusercontent.com/u/360470?v=4", "profile": "https://twitter.com/hewigovens", - "contributions": ["content", "bug"] - }, - { - "login": "DragonDev1906", + "contributions": [ + "content", + "bug" + ] + }, + { + "login": "DragonDev1906", "name": "DragonDev1906", "avatar_url": "https://avatars3.githubusercontent.com/u/8270201?v=4", "profile": "https://github.com/DragonDev1906", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "ryanio", "name": "Ryan Ghods", "avatar_url": "https://avatars0.githubusercontent.com/u/22116?v=4", "profile": "https://github.com/ryanio", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "OliverPetrovic", "name": "Oliver", "avatar_url": "https://avatars0.githubusercontent.com/u/44640417?v=4", "profile": "https://oliverpetrovic.sk/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Kristiyan96", "name": "Kristiyan", "avatar_url": "https://avatars3.githubusercontent.com/u/15987117?v=4", "profile": "https://github.com/Kristiyan96", - "contributions": ["bug", "code"] + "contributions": [ + "bug", + "code" + ] }, { "login": "matthieu", "name": "Matthieu Riou", "avatar_url": "https://avatars0.githubusercontent.com/u/4904?v=4", "profile": "http://www.blockcypher.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "pansay", "name": "pansay", "avatar_url": "https://avatars2.githubusercontent.com/u/4820218?v=4", "profile": "http://pansay.com/", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "eirtscience", "name": "eirtscience", "avatar_url": "https://avatars2.githubusercontent.com/u/6157618?v=4", "profile": "https://github.com/eirtscience", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "lewifr", "name": "Francis Lewis", "avatar_url": "https://avatars2.githubusercontent.com/u/49526117?v=4", "profile": "https://github.com/lewifr", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "baub", "name": "baub", "avatar_url": "https://avatars3.githubusercontent.com/u/44686?v=4", "profile": "https://github.com/baub", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "l-armstrong", "name": "lamone", "avatar_url": "https://avatars0.githubusercontent.com/u/43922258?v=4", "profile": "https://github.com/l-armstrong", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "aseoconnor", "name": "Sean O'Connor", "avatar_url": "https://avatars2.githubusercontent.com/u/9483108?v=4", "profile": "http://seanoconn.org", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ttrowell", "name": "Tara Rowell", "avatar_url": "https://avatars1.githubusercontent.com/u/1165813?v=4", "profile": "https://github.com/ttrowell", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "hiiri", "name": "Aleksi Cohen", "avatar_url": "https://avatars0.githubusercontent.com/u/30537851?v=4", "profile": "https://www.linkedin.com/in/aleksicohen/", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "staktrace", "name": "Kartikaya Gupta (kats)", "avatar_url": "https://avatars3.githubusercontent.com/u/485789?v=4", "profile": "https://staktrace.com/", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "siddhantkharode", "name": "siddhantkharode", "avatar_url": "https://avatars0.githubusercontent.com/u/50978880?v=4", "profile": "https://github.com/siddhantkharode", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "renandincer", "name": "Renan Dincer", "avatar_url": "https://avatars0.githubusercontent.com/u/1429100?v=4", "profile": "https://renandincer.com", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "zhangyuannie", "name": "Zhangyuan Nie", "avatar_url": "https://avatars1.githubusercontent.com/u/54489058?v=4", "profile": "http://znie.org", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "PatrickAlphaC", "name": "Patrick Collins", "avatar_url": "https://avatars0.githubusercontent.com/u/54278053?v=4", "profile": "https://alphachain.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "santdeleon", "name": "Sant Deleon", "avatar_url": "https://avatars2.githubusercontent.com/u/22578527?v=4", "profile": "https://santdeleon.io", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "hurryabit", "name": "Martin Huschenbett", "avatar_url": "https://avatars1.githubusercontent.com/u/11665611?v=4", "profile": "http://daml.com", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "kallemoen", "name": "Kalle Moen", "avatar_url": "https://avatars1.githubusercontent.com/u/13684960?v=4", "profile": "http://www.kallemoen.com", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "esteticalVE", "name": "Vitaly", "avatar_url": "https://avatars1.githubusercontent.com/u/49448423?v=4", "profile": "https://github.com/esteticalVE", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "neewy", "name": "Nikolay Yushkevich", "avatar_url": "https://avatars.githubusercontent.com/u/11841667?v=4", "profile": "https://github.com/neewy", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "darkwater4213", "name": "darkwater4213", "avatar_url": "https://avatars.githubusercontent.com/u/53630002?v=4", "profile": "https://github.com/darkwater4213", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "akashnimare", "name": "Akash Nimare", "avatar_url": "https://avatars.githubusercontent.com/u/2263909?v=4", "profile": "https://akashnimare.in", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "davidshq", "name": "Dave Mackey", "avatar_url": "https://avatars.githubusercontent.com/u/8009774?v=4", "profile": "https://davemackey.net/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Siegrift", "name": "Emanuel Tesař", "avatar_url": "https://avatars.githubusercontent.com/u/22679154?v=4", "profile": "https://github.com/Siegrift", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "DeFiDude", "name": "DeFiDude", "avatar_url": "https://avatars.githubusercontent.com/u/59237470?v=4", "profile": "https://github.com/DeFiDude", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "austintgriffith", "name": "Austin Griffith", "avatar_url": "https://avatars.githubusercontent.com/u/2653167?v=4", "profile": "http://austingriffith.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "chase-manning", "name": "Chase Manning", "avatar_url": "https://avatars.githubusercontent.com/u/53957795?v=4", "profile": "https://chasemanning.co.nz", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "colinsteil", "name": "Colin Steil", "avatar_url": "https://avatars.githubusercontent.com/u/28073950?v=4", "profile": "http://cartesi.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "MonarthS", "name": "MonarthS", "avatar_url": "https://avatars.githubusercontent.com/u/40236229?v=4", "profile": "https://github.com/MonarthS", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "adamdry", "name": "Adam Dry", "avatar_url": "https://avatars.githubusercontent.com/u/7360709?v=4", "profile": "https://github.com/adamdry", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "seishun", "name": "Nikolai Vavilov", "avatar_url": "https://avatars.githubusercontent.com/u/988441?v=4", "profile": "https://github.com/seishun", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "okdonga", "name": "Katie ", "avatar_url": "https://avatars.githubusercontent.com/u/12257412?v=4", "profile": "https://github.com/okdonga", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "comeToThinkOfEth", "name": "comeToThinkOfEth", "avatar_url": "https://avatars.githubusercontent.com/u/78873209?v=4", "profile": "https://github.com/comeToThinkOfEth", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "catsnackattack", "name": "catsnackattack", "avatar_url": "https://avatars.githubusercontent.com/u/36013218?v=4", "profile": "https://github.com/catsnackattack", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "maurycyp", "name": "Maurycy", "avatar_url": "https://avatars.githubusercontent.com/u/1296842?v=4", "profile": "https://github.com/maurycyp", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ipapandinas", "name": "Igor Papandinas", "avatar_url": "https://avatars.githubusercontent.com/u/26460174?v=4", "profile": "https://github.com/ipapandinas", - "contributions": ["bug", "code", "content"] + "contributions": [ + "bug", + "code", + "content" + ] }, { "login": "tahiralvi", "name": "Tahir Alvi ", "avatar_url": "https://avatars.githubusercontent.com/u/1356887?v=4", "profile": "https://stackoverflow.com/users/355191/tahir-alvi", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "amirmehdi", "name": "amirmehdi", "avatar_url": "https://avatars.githubusercontent.com/u/24705793?v=4", "profile": "https://github.com/amirmehdi", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "Dadybayo", "name": "Dan Dadybaev", "avatar_url": "https://avatars.githubusercontent.com/u/33674013?v=4", "profile": "https://github.com/Dadybayo", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "finleyexp", "name": "Finley", "avatar_url": "https://avatars.githubusercontent.com/u/18469214?v=4", "profile": "https://www.pir8aye.net", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "nobd", "name": "nobd", "avatar_url": "https://avatars.githubusercontent.com/u/51967351?v=4", "profile": "https://github.com/nobd", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "AlexSSD7", "name": "Alexander Sadovskyi", "avatar_url": "https://avatars.githubusercontent.com/u/43043344?v=4", "profile": "https://github.com/AlexSSD7", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "EthanSK", "name": "Ethan Sarif-Kattan", "avatar_url": "https://avatars.githubusercontent.com/u/13756744?v=4", "profile": "https://www.etggames.com/", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "cj-technical", "name": "C.J. Kozarski", "avatar_url": "https://avatars.githubusercontent.com/u/58790577?v=4", "profile": "https://github.com/cj-technical", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "yakkomajuri", "name": "Yakko Majuri", "avatar_url": "https://avatars.githubusercontent.com/u/38760734?v=4", "profile": "http://yakko.tech", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "adlerjohn", "name": "John Adler", "avatar_url": "https://avatars.githubusercontent.com/u/3290375?v=4", "profile": "https://github.com/adlerjohn", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "fubuloubu", "name": "Just some guy", "avatar_url": "https://avatars.githubusercontent.com/u/3859395?v=4", "profile": "https://github.com/fubuloubu", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "ved08", "name": "Vedvardhan", "avatar_url": "https://avatars.githubusercontent.com/u/37742218?v=4", "profile": "https://github.com/ved08", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "vemuez", "name": "Yussuf Elarif", "avatar_url": "https://avatars.githubusercontent.com/u/9627828?v=4", "profile": "https://github.com/vemuez", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "davidawad", "name": "David Awad", "avatar_url": "https://avatars.githubusercontent.com/u/4019054?v=4", "profile": "https://davidawad.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "axic", "name": "Alex Beregszaszi", "avatar_url": "https://avatars.githubusercontent.com/u/20340?v=4", "profile": "http://www.rtfs.hu", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "adamgoth", "name": "Adam Goth", "avatar_url": "https://avatars.githubusercontent.com/u/5225766?v=4", "profile": "http://www.adamgoth.com", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "Anuragtech02", "name": "Anurag Pal", "avatar_url": "https://avatars.githubusercontent.com/u/55744578?v=4", "profile": "https://github.com/Anuragtech02", - "contributions": ["code", "doc"] + "contributions": [ + "code", + "doc" + ] }, { "login": "Vishal19111999", "name": "Vishal Pratap Singh", "avatar_url": "https://avatars.githubusercontent.com/u/29145212?v=4", "profile": "https://www.codechef.com/users/chaos_", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "qbzzt", "name": "qbzzt", "avatar_url": "https://avatars.githubusercontent.com/u/12722969?v=4", "profile": "https://github.com/qbzzt", - "contributions": ["content", "ideas"] + "contributions": [ + "content", + "ideas" + ] }, { "login": "ekowalsk", "name": "Ewa Kowalska", "avatar_url": "https://avatars.githubusercontent.com/u/30404388?v=4", "profile": "https://github.com/ekowalsk", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Aheesh", "name": "Aheesh", "avatar_url": "https://avatars.githubusercontent.com/u/8059227?v=4", "profile": "https://github.com/Aheesh", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "tophersjones", "name": "tophersjones", "avatar_url": "https://avatars.githubusercontent.com/u/33736287?v=4", "profile": "https://github.com/tophersjones", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "andrw", "name": "Andrew Yang", "avatar_url": "https://avatars.githubusercontent.com/u/994064?v=4", "profile": "https://github.com/andrw", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "BokilaLin", "name": "$hoot->Pairs", "avatar_url": "https://avatars.githubusercontent.com/u/12237944?v=4", "profile": "https://github.com/BokilaLin", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "NilsKaden", "name": "NilsKaden", "avatar_url": "https://avatars.githubusercontent.com/u/34445522?v=4", "profile": "https://github.com/NilsKaden", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "stuz5000", "name": "Stuart Reynolds", "avatar_url": "https://avatars.githubusercontent.com/u/7799980?v=4", "profile": "https://github.com/stuz5000", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "glebodic", "name": "Gwenael Le Bodic", "avatar_url": "https://avatars.githubusercontent.com/u/18246298?v=4", "profile": "https://github.com/glebodic", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "whoanuragverma", "name": "Anurag Verma", "avatar_url": "https://avatars.githubusercontent.com/u/55322425?v=4", "profile": "https://github.com/whoanuragverma", - "contributions": ["bug", "code"] + "contributions": [ + "bug", + "code" + ] }, { "login": "citizen-stig", "name": "Nikolai Golub", "avatar_url": "https://avatars.githubusercontent.com/u/3115300?v=4", "profile": "http://golub.pro/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "intelliot", "name": "Elliot Lee", "avatar_url": "https://avatars.githubusercontent.com/u/81505?v=4", "profile": "https://twitter.com/intelliot", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "v-gar", "name": "Viktor Garske", "avatar_url": "https://avatars.githubusercontent.com/u/11472697?v=4", "profile": "https://www.v-gar.de/", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "grmkris", "name": "Kristjan Grm", "avatar_url": "https://avatars.githubusercontent.com/u/15545195?v=4", "profile": "http://grmkris.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "macladson", "name": "Mac L", "avatar_url": "https://avatars.githubusercontent.com/u/58379419?v=4", "profile": "https://github.com/macladson", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "BruceMacD", "name": "Bruce MacDonald", "avatar_url": "https://avatars.githubusercontent.com/u/5853428?v=4", "profile": "http://bruce-macdonald.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "RonSherfey", "name": "Ronnie Sherfey", "avatar_url": "https://avatars.githubusercontent.com/u/77251516?v=4", "profile": "http://reggienoble.eth", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "a1irahman", "name": "Ali Rahman", "avatar_url": "https://avatars.githubusercontent.com/u/46408722?v=4", "profile": "https://github.com/a1irahman", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "erikvdp", "name": "Erik Vandeputte", "avatar_url": "https://avatars.githubusercontent.com/u/203481?v=4", "profile": "https://github.com/erikvdp", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "tmlee", "name": "TM Lee", "avatar_url": "https://avatars.githubusercontent.com/u/110264?v=4", "profile": "https://www.coingecko.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "mic0des", "name": "mic0des", "avatar_url": "https://avatars.githubusercontent.com/u/4992682?v=4", "profile": "https://github.com/mic0des", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Hakeemmidan", "name": "Hakeem Almidan", "avatar_url": "https://avatars.githubusercontent.com/u/27740273?v=4", "profile": "http://hakeem-almidan.com", - "contributions": ["content", "code"] + "contributions": [ + "content", + "code" + ] }, { "login": "JulienRioux", "name": "Julien Rioux", "avatar_url": "https://avatars.githubusercontent.com/u/26312935?v=4", "profile": "https://julien-rioux.web.app/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "kraxx", "name": "Justin Chow", "avatar_url": "https://avatars.githubusercontent.com/u/24942820?v=4", "profile": "https://github.com/kraxx", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "0xGabi", "name": "Gabi", "avatar_url": "https://avatars.githubusercontent.com/u/9082013?v=4", "profile": "https://github.com/0xGabi", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "rabbitXIII", "name": "Rohit Gopal", "avatar_url": "https://avatars.githubusercontent.com/u/1820619?v=4", "profile": "https://github.com/rabbitXIII", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "jordanoverbye", "name": "Jordan Overbye", "avatar_url": "https://avatars.githubusercontent.com/u/6265154?v=4", "profile": "https://jordanoverbye.com", - "contributions": ["bug", "code"] + "contributions": [ + "bug", + "code" + ] }, { "login": "Pilafonta", "name": "Peter LaFontaine", "avatar_url": "https://avatars.githubusercontent.com/u/4194866?v=4", "profile": "https://github.com/Pilafonta", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "joshjwelsh", "name": "Joshua Welsh", "avatar_url": "https://avatars.githubusercontent.com/u/60113598?v=4", "profile": "http://joshjwelsh.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "robertdosa", "name": "Robert Dosa", "avatar_url": "https://avatars.githubusercontent.com/u/57013905?v=4", "profile": "https://github.com/robertdosa", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "SatoshiMiracle", "name": "SatoshiMiracle", "avatar_url": "https://avatars.githubusercontent.com/u/72975337?v=4", "profile": "https://github.com/SatoshiMiracle", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "jhhb", "name": "James Boyle", "avatar_url": "https://avatars.githubusercontent.com/u/12632889?v=4", "profile": "https://github.com/jhhb", - "contributions": ["ideas", "content"] + "contributions": [ + "ideas", + "content" + ] }, { "login": "kziechmann", "name": "Kevin Ziechmann", "avatar_url": "https://avatars.githubusercontent.com/u/42778833?v=4", "profile": "http://www.kevinziechmann.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "elmorg", "name": "Evan", "avatar_url": "https://avatars.githubusercontent.com/u/1218452?v=4", "profile": "http://you-rhythmic.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ETHorHIL", "name": "ETHorHIL", "avatar_url": "https://avatars.githubusercontent.com/u/24531309?v=4", "profile": "https://github.com/ETHorHIL", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "shashvatshah9", "name": "shashvatshah9", "avatar_url": "https://avatars.githubusercontent.com/u/24702409?v=4", "profile": "http://www.linkedin.com/in/shashvat-shah-565399122", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "slightlyfloating", "name": "slightlyfloating", "avatar_url": "https://avatars.githubusercontent.com/u/56945047?v=4", "profile": "https://github.com/slightlyfloating", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Luis-Mx", "name": "Luis Miranda", "avatar_url": "https://avatars.githubusercontent.com/u/30961?v=4", "profile": "https://github.com/Luis-Mx", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "qe", "name": "Alex Ismodes", "avatar_url": "https://avatars.githubusercontent.com/u/59273057?v=4", "profile": "http://qe.github.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "minimalsm", "name": "Joshua", "avatar_url": "https://avatars.githubusercontent.com/u/62268199?v=4", "profile": "https://github.com/minimalsm", - "contributions": ["bug", "code"] + "contributions": [ + "bug", + "code" + ] }, { "login": "ensaryusuf", "name": "Ensar Yusuf Yılmaz", "avatar_url": "https://avatars.githubusercontent.com/u/49895756?v=4", "profile": "https://seskit.com/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "leogtzr", "name": "Leo Gutiérrez Ramírez", "avatar_url": "https://avatars.githubusercontent.com/u/1211969?v=4", "profile": "https://github.com/leogtzr", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "abdulmalik97", "name": "Abdul Malik", "avatar_url": "https://avatars.githubusercontent.com/u/9363303?v=4", "profile": "https://github.com/abdulmalik97", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "JayWelsh", "name": "Jay Welsh", "avatar_url": "https://avatars.githubusercontent.com/u/14224459?v=4", "profile": "https://twitter.com/JayBWelsh", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "linkastic", "name": "linkastic", "avatar_url": "https://avatars.githubusercontent.com/u/7030395?v=4", "profile": "https://github.com/linkastic", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "cjinghong", "name": "Chan Jing Hong", "avatar_url": "https://avatars.githubusercontent.com/u/11567740?v=4", "profile": "http://groftware.tech", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ozora-ogino", "name": "Ozora Ogino", "avatar_url": "https://avatars.githubusercontent.com/u/63685461?v=4", "profile": "https://github.com/ozora-ogino", - "contributions": ["content", "translation"] + "contributions": [ + "content", + "translation" + ] }, { "login": "eltociear", "name": "Ikko Ashimine", "avatar_url": "https://avatars.githubusercontent.com/u/22633385?v=4", "profile": "https://bandism.net/", - "contributions": ["bug", "content", "doc", "translation"] + "contributions": [ + "bug", + "content", + "doc", + "translation" + ] }, { "login": "CameronHonis", "name": "Cameron Honis", "avatar_url": "https://avatars.githubusercontent.com/u/66322224?v=4", "profile": "https://github.com/CameronHonis", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "nurdtechie98", "name": "Chirag Shetty", "avatar_url": "https://avatars.githubusercontent.com/u/21201278?v=4", "profile": "http://nurdtechie98.github.io", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "iloveitaly", "name": "Michael Bianco", "avatar_url": "https://avatars.githubusercontent.com/u/150855?v=4", "profile": "http://mikebian.co/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Robiquet", "name": "Tom Robiquet", "avatar_url": "https://avatars.githubusercontent.com/u/4950844?v=4", "profile": "https://github.com/Robiquet", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "StanislavBreadless", "name": "Stanislav Bezkorovainyi", "avatar_url": "https://avatars.githubusercontent.com/u/52464764?v=4", "profile": "https://github.com/StanislavBreadless", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "rootulp", "name": "Rootul Patel", "avatar_url": "https://avatars.githubusercontent.com/u/3699047?v=4", "profile": "https://rootulp.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ZackDeRose", "name": "Zachary DeRose", "avatar_url": "https://avatars.githubusercontent.com/u/3788405?v=4", "profile": "https://zackderose.dev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ArshanKhanifar", "name": "Arshan Khanifar", "avatar_url": "https://avatars.githubusercontent.com/u/10492324?v=4", "profile": "https://github.com/ArshanKhanifar", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "schnerd", "name": "David Schnurr", "avatar_url": "https://avatars.githubusercontent.com/u/875591?v=4", "profile": "http://dschnurr.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "keleffew", "name": "Kevin Leffew", "avatar_url": "https://avatars.githubusercontent.com/u/33433528?v=4", "profile": "https://twitter.com/kleffew94", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "pgrimaud", "name": "Pierre Grimaud", "avatar_url": "https://avatars.githubusercontent.com/u/1866496?v=4", "profile": "https://github.com/pgrimaud", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "jclancy93", "name": "Jack Clancy", "avatar_url": "https://avatars.githubusercontent.com/u/7850202?v=4", "profile": "https://github.com/jclancy93", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sprad", "name": "Justin Spradlin", "avatar_url": "https://avatars.githubusercontent.com/u/25503?v=4", "profile": "http://www.justinspradlin.com", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "thelostone-mc", "name": "Aditya Anand M C", "avatar_url": "https://avatars.githubusercontent.com/u/5358146?v=4", "profile": "https://github.com/thelostone-mc", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "lemonase", "name": "James Dixon", "avatar_url": "https://avatars.githubusercontent.com/u/11729404?v=4", "profile": "https://jamesdixon.dev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "vasumanhas000", "name": "Vasu Manhas", "avatar_url": "https://avatars.githubusercontent.com/u/55337644?v=4", "profile": "https://www.linkedin.com/in/vasu-manhas/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "jpaulet", "name": "jp_aulet", "avatar_url": "https://avatars.githubusercontent.com/u/6894329?v=4", "profile": "http://www.jpaulet.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "manojmsrit", "name": "manojmsrit", "avatar_url": "https://avatars.githubusercontent.com/u/49993125?v=4", "profile": "https://github.com/manojmsrit", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "PowerStream3604", "name": "David Kim", "avatar_url": "https://avatars.githubusercontent.com/u/63450340?v=4", "profile": "https://github.com/PowerStream3604", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "bhavishy6", "name": "Bhavish Yalamanchi", "avatar_url": "https://avatars.githubusercontent.com/u/1428107?v=4", "profile": "https://github.com/bhavishy6", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "awg0013-PR", "name": "awg0013-PR", "avatar_url": "https://avatars.githubusercontent.com/u/73718997?v=4", "profile": "https://github.com/awg0013-PR", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "DevAranCarter", "name": "Devin", "avatar_url": "https://avatars.githubusercontent.com/u/68774530?v=4", "profile": "https://github.com/DevAranCarter", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Dave2022", "name": "Dave", "avatar_url": "https://avatars.githubusercontent.com/u/82191676?v=4", "profile": "https://github.com/Dave2022", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "skylenet", "name": "Rafael Matias", "avatar_url": "https://avatars.githubusercontent.com/u/1500888?v=4", "profile": "https://skyle.net", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "cglagovich", "name": "Colman Glagovich", "avatar_url": "https://avatars.githubusercontent.com/u/20099419?v=4", "profile": "https://github.com/cglagovich", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "endorphin", "name": "endorphin", "avatar_url": "https://avatars.githubusercontent.com/u/10931642?v=4", "profile": "https://github.com/endorphin", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nebali", "name": "Nebali", "avatar_url": "https://avatars.githubusercontent.com/u/43342338?v=4", "profile": "https://github.com/nebali", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "theshubhagrwl", "name": "Shubh Agrawal", "avatar_url": "https://avatars.githubusercontent.com/u/37265683?v=4", "profile": "https://theshubhagrwl.vercel.app/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "cth0604", "name": "cth0604", "avatar_url": "https://avatars.githubusercontent.com/u/57742558?v=4", "profile": "https://github.com/cth0604", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "zjpetersen", "name": "zjpetersen", "avatar_url": "https://avatars.githubusercontent.com/u/12157308?v=4", "profile": "https://github.com/zjpetersen", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "frankie224", "name": "frankie224", "avatar_url": "https://avatars.githubusercontent.com/u/84561472?v=4", "profile": "https://github.com/frankie224", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Pondorasti", "name": "Alexandru Turcanu", "avatar_url": "https://avatars.githubusercontent.com/u/32957606?v=4", "profile": "https://alexandru.so", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "brettsmentek", "name": "Brett", "avatar_url": "https://avatars.githubusercontent.com/u/9037105?v=4", "profile": "https://brett.sh", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "blackblather", "name": "João Monteiro", "avatar_url": "https://avatars.githubusercontent.com/u/6885917?v=4", "profile": "http://joao-monteiro.com", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "arunlodhi", "name": "Arun Lodhi", "avatar_url": "https://avatars.githubusercontent.com/u/5833803?v=4", "profile": "https://github.com/arunlodhi", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "timhc22", "name": "Tim", "avatar_url": "https://avatars.githubusercontent.com/u/3952393?v=4", "profile": "https://unegma.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "vitaliyhayda", "name": "Vitaliy Hayda", "avatar_url": "https://avatars.githubusercontent.com/u/7917231?v=4", "profile": "https://github.com/vitaliyhayda", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "ayushman17", "name": "Ayushman Singh Chauhan", "avatar_url": "https://avatars.githubusercontent.com/u/53474591?v=4", "profile": "http://linkedin.com/in/ayushman17/", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "Lisanaaa", "name": "Keqi Huang", "avatar_url": "https://avatars.githubusercontent.com/u/28261876?v=4", "profile": "https://www.linkedin.com/in/keqi-huang/", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "davidplutus", "name": "davidplutus", "avatar_url": "https://avatars.githubusercontent.com/u/63456936?v=4", "profile": "https://github.com/DavidPlutus", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Karthickmerk", "name": "Karthickmerk", "avatar_url": "https://avatars.githubusercontent.com/u/53270101?v=4", "profile": "https://github.com/Karthickmerk", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "hueyhe", "name": "Sihong", "avatar_url": "https://avatars.githubusercontent.com/u/13460383?v=4", "profile": "https://github.com/hueyhe", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "AmirAliM", "name": "AmirAliM", "avatar_url": "https://avatars.githubusercontent.com/u/8203572?v=4", "profile": "https://github.com/AmirAliM", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Rub3cula", "name": "Rub3cula", "avatar_url": "https://avatars.githubusercontent.com/u/63545006?v=4", "profile": "https://github.com/Rub3cula", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "pawurb", "name": "Paweł Urbanek", "avatar_url": "https://avatars.githubusercontent.com/u/1131944?v=4", "profile": "https://pawelurbanek.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "adi44", "name": "Aditya Dhir", "avatar_url": "https://avatars.githubusercontent.com/u/31381639?v=4", "profile": "https://github.com/adi44", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ammarhusain", "name": "Ammar Husain", "avatar_url": "https://avatars.githubusercontent.com/u/4248914?v=4", "profile": "http://ammarhusain.github.io", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "miiiguel", "name": "miiiguel", "avatar_url": "https://avatars.githubusercontent.com/u/29905526?v=4", "profile": "https://github.com/miiiguel", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Uttam-Singhh", "name": "Uttam Singh", "avatar_url": "https://avatars.githubusercontent.com/u/63050765?v=4", "profile": "https://uttam-singhh.github.io/Portfolio/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "MysticRyuujin", "name": "Chase Wright", "avatar_url": "https://avatars.githubusercontent.com/u/8877131?v=4", "profile": "https://www.chasewright.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "TheBicPen", "name": "Bic", "avatar_url": "https://avatars.githubusercontent.com/u/23622288?v=4", "profile": "https://github.com/TheBicPen", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "lopeselio", "name": "devELIOper", "avatar_url": "https://avatars.githubusercontent.com/u/43913734?v=4", "profile": "https://develioper.vercel.app", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "vbarda", "name": "Vadym Barda", "avatar_url": "https://avatars.githubusercontent.com/u/19161700?v=4", "profile": "http://www.kensho.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "leo-cuellar", "name": "Leo Cuéllar", "avatar_url": "https://avatars.githubusercontent.com/u/52687532?v=4", "profile": "https://github.com/leo-cuellar", - "contributions": ["content", "code", "bug"] + "contributions": [ + "content", + "code", + "bug" + ] }, { "login": "pheeque", "name": "pheeque", "avatar_url": "https://avatars.githubusercontent.com/u/988061?v=4", "profile": "https://github.com/pheeque", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "jmusighi", "name": "Jeremy Musighi", "avatar_url": "https://avatars.githubusercontent.com/u/495607?v=4", "profile": "https://github.com/jmusighi", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "tbollinger", "name": "tbollinger", "avatar_url": "https://avatars.githubusercontent.com/u/10273688?v=4", "profile": "https://github.com/tbollinger", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ryangrunest", "name": "Ryan Grunest", "avatar_url": "https://avatars.githubusercontent.com/u/37844814?v=4", "profile": "https://ryangrunest.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "aniket-spidey", "name": "Aniket Raj", "avatar_url": "https://avatars.githubusercontent.com/u/32848400?v=4", "profile": "http://aniketraj.me", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Ryeore", "name": "Kamil Zarzycki", "avatar_url": "https://avatars.githubusercontent.com/u/26347436?v=4", "profile": "http://linkedin.com/in/kamilzarzycki/", - "contributions": ["translation", "content"] + "contributions": [ + "translation", + "content" + ] }, { "login": "filipmartinsson", "name": "Filip Martinsson", "avatar_url": "https://avatars.githubusercontent.com/u/10158281?v=4", "profile": "https://www.stockholmblockchain.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "zeroservices", "name": "zeroservices", "avatar_url": "https://avatars.githubusercontent.com/u/78486441?v=4", "profile": "https://www.zeroservices.eu", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "lukassim", @@ -3052,6615 +4049,8730 @@ "name": "Luke Ingalls", "avatar_url": "https://avatars.githubusercontent.com/u/45518011?v=4", "profile": "http://lukeingalls.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "cstradtman", "name": "cstradtman", "avatar_url": "https://avatars.githubusercontent.com/u/17035843?v=4", "profile": "https://github.com/cstradtman", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "gsthina", "name": "G Surendar Thina", "avatar_url": "https://avatars.githubusercontent.com/u/8844334?v=4", "profile": "http://www.gsthina.me", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "scotato", "name": "Scott Dodge", "avatar_url": "https://avatars.githubusercontent.com/u/5290015?v=4", "profile": "https://github.com/scotato", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "arcz", "name": "Artur Cygan", "avatar_url": "https://avatars.githubusercontent.com/u/4679721?v=4", "profile": "https://arturcygan.com/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "rorychristianmurray", "name": "Rory", "avatar_url": "https://avatars.githubusercontent.com/u/21082125?v=4", "profile": "http://rorymurray.io", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "cnnrmnn", "name": "Connor Mann", "avatar_url": "https://avatars.githubusercontent.com/u/34930543?v=4", "profile": "https://github.com/cnnrmnn", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ph4ni", "name": "Phanindra", "avatar_url": "https://avatars.githubusercontent.com/u/29685411?v=4", "profile": "https://ph4ni.github.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "kwsorensen", "name": "kwsorensen", "avatar_url": "https://avatars.githubusercontent.com/u/29787085?v=4", "profile": "https://github.com/kwsorensen", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "FuriKuri", "name": "Theo Pack", "avatar_url": "https://avatars.githubusercontent.com/u/1391889?v=4", "profile": "https://furikuri.net/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "kirati-su", "name": "kirati-su", "avatar_url": "https://avatars.githubusercontent.com/u/85088317?v=4", "profile": "https://github.com/kirati-su", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "mapachurro", "name": "oliver renwick", "avatar_url": "https://avatars.githubusercontent.com/u/7252642?v=4", "profile": "http://www.oliverrenwick.com", - "contributions": ["ideas", "bug"] + "contributions": [ + "ideas", + "bug" + ] }, { "login": "Patil2099", "name": "Pankaj Patil", "avatar_url": "https://avatars.githubusercontent.com/u/35653876?v=4", "profile": "https://pplife.home.blog", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "esale", "name": "esale", "avatar_url": "https://avatars.githubusercontent.com/u/36928404?v=4", "profile": "https://github.com/esale", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "RaynHarr", "name": "RaynHarr", "avatar_url": "https://avatars.githubusercontent.com/u/39592448?v=4", "profile": "https://github.com/RaynHarr", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "n4rsil", "name": "n4rsil", "avatar_url": "https://avatars.githubusercontent.com/u/85314714?v=4", "profile": "https://github.com/n4rsil", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jkbishbish", "name": "John Bishop", "avatar_url": "https://avatars.githubusercontent.com/u/40157941?v=4", "profile": "https://github.com/jkbishbish", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "robriks", "name": "robriks", "avatar_url": "https://avatars.githubusercontent.com/u/80549215?v=4", "profile": "https://github.com/robriks", - "contributions": ["bug", "projectManagement", "question", "doc"] + "contributions": [ + "bug", + "projectManagement", + "question", + "doc" + ] }, { "login": "NishantChandla", "name": "Nishant Chandla", "avatar_url": "https://avatars.githubusercontent.com/u/55653617?v=4", "profile": "https://github.com/NishantChandla", - "contributions": ["code", "bug"] + "contributions": [ + "code", + "bug" + ] }, { "login": "PaulApivat", "name": "@paulapivat", "avatar_url": "https://avatars.githubusercontent.com/u/4058461?v=4", "profile": "https://github.com/PaulApivat", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "graemeblackwood", "name": "Graeme Blackwood", "avatar_url": "https://avatars.githubusercontent.com/u/646863?v=4", "profile": "http://blackwood.london", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "il3ven", "name": "il3ven", "avatar_url": "https://avatars.githubusercontent.com/u/4337699?v=4", "profile": "https://github.com/il3ven", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "hbriese", "name": "Hayden Briese", "avatar_url": "https://avatars.githubusercontent.com/u/14974903?v=4", "profile": "https://github.com/hbriese", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "TrevorFrench", "name": "Trevor French", "avatar_url": "https://avatars.githubusercontent.com/u/42419234?v=4", "profile": "http://trevorfrench.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "asanso", "name": "Antonio Sanso", "avatar_url": "https://avatars.githubusercontent.com/u/494825?v=4", "profile": "https://blog.intothesymmetry.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "siddharths00", "name": "Siddharth S", "avatar_url": "https://avatars.githubusercontent.com/u/45630336?v=4", "profile": "https://github.com/siddharths00", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "jbgwu", "name": "jbgwu", "avatar_url": "https://avatars.githubusercontent.com/u/60628515?v=4", "profile": "https://github.com/jbgwu", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ethosdev", "name": "ethosdev", "avatar_url": "https://avatars.githubusercontent.com/u/79124435?v=4", "profile": "https://ethos.dev", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "jschiarizzi", "name": "Joseph Schiarizzi", "avatar_url": "https://avatars.githubusercontent.com/u/9449596?v=4", "profile": "http://josephschiarizzi.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Rodney-O-C-Melby", "name": "Rodney Olav C Melby", "avatar_url": "https://avatars.githubusercontent.com/u/16503898?v=4", "profile": "https://github.com/Rodney-O-C-Melby", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ksaitor", "name": "Raman", "avatar_url": "https://avatars.githubusercontent.com/u/936436?v=4", "profile": "https://cryptojobslist.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ruleking", "name": "Roeland Werring", "avatar_url": "https://avatars.githubusercontent.com/u/9334333?v=4", "profile": "https://attrace.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "kladkogex", "name": "Stan Kladko", "avatar_url": "https://avatars.githubusercontent.com/u/13399135?v=4", "profile": "https://github.com/skalenetwork", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "JaredFlomen", "name": "Jared Flomen", "avatar_url": "https://avatars.githubusercontent.com/u/58126876?v=4", "profile": "http://jaredflomen.ca", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "mannekin", "name": "Joseph Wallace", "avatar_url": "https://avatars.githubusercontent.com/u/38049812?v=4", "profile": "http://atimidblog.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ahmedprusevic", "name": "Ahmed Prusevic", "avatar_url": "https://avatars.githubusercontent.com/u/24927091?v=4", "profile": "https://ahmed.prusevic.com/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "mds1", "name": "Matt", "avatar_url": "https://avatars.githubusercontent.com/u/17163988?v=4", "profile": "https://mattsolomon.dev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ytrezq", "name": "ytrezq", "avatar_url": "https://avatars.githubusercontent.com/u/3824869?v=4", "profile": "https://github.com/ytrezq", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ricky321u", "name": "Ricky", "avatar_url": "https://avatars.githubusercontent.com/u/17769771?v=4", "profile": "https://github.com/ricky321u", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "smudgil", "name": "smudgil", "avatar_url": "https://avatars.githubusercontent.com/u/38195323?v=4", "profile": "https://github.com/smudgil", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "cosinekitty", "name": "Don Cross", "avatar_url": "https://avatars.githubusercontent.com/u/11699954?v=4", "profile": "http://cosinekitty.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "jacksonet00", "name": "Jackson Taylor", "avatar_url": "https://avatars.githubusercontent.com/u/57923799?v=4", "profile": "http://jacksontaylor.info", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "MrBrain295", "name": "MrBrain295", "avatar_url": "https://avatars.githubusercontent.com/u/66077254?v=4", "profile": "https://github.com/MrBrain295", - "contributions": ["bug", "doc", "ideas", "content"] + "contributions": [ + "bug", + "doc", + "ideas", + "content" + ] }, { "login": "SafePalWallet", "name": "SafePalWallet", "avatar_url": "https://avatars.githubusercontent.com/u/52519650?v=4", "profile": "https://github.com/SafePalWallet", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "svaddadhi", "name": "Vishal Vaddadhi", "avatar_url": "https://avatars.githubusercontent.com/u/29217475?v=4", "profile": "https://svaddadhi.github.io/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "matthewrkula", "name": "Matt Kula", "avatar_url": "https://avatars.githubusercontent.com/u/1483546?v=4", "profile": "https://github.com/matthewrkula", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Hamza-Shahzad", "name": "Hamza Shahzad", "avatar_url": "https://avatars.githubusercontent.com/u/13493539?v=4", "profile": "http://hamza.ai", - "contributions": ["code", "bug"] + "contributions": [ + "code", + "bug" + ] }, { "login": "MukulKolpe", "name": "Mukul Kolpe", "avatar_url": "https://avatars.githubusercontent.com/u/78664749?v=4", "profile": "https://github.com/MukulKolpe", - "contributions": ["code", "bug", "doc"] + "contributions": [ + "code", + "bug", + "doc" + ] }, { "login": "corwintines", "name": "Corwin Smith", "avatar_url": "https://avatars.githubusercontent.com/u/15589226?v=4", "profile": "http://corwintines.netlify.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "spiolat", "name": "spiolat", "avatar_url": "https://avatars.githubusercontent.com/u/89148238?v=4", "profile": "https://github.com/spiolat", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "hosyminh95", "name": "hosyminh95", "avatar_url": "https://avatars.githubusercontent.com/u/88025075?v=4", "profile": "https://github.com/hosyminh95", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "chiarawilden", "name": "Chiara Wilden", "avatar_url": "https://avatars.githubusercontent.com/u/77884268?v=4", "profile": "https://chiarawilden.com", - "contributions": ["ideas", "doc"] + "contributions": [ + "ideas", + "doc" + ] }, { "login": "DanhPTHTech", "name": "DanhPTHTech", "avatar_url": "https://avatars.githubusercontent.com/u/83639953?v=4", "profile": "https://github.com/DanhPTHTech", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "FitFingers", "name": "James Hooper", "avatar_url": "https://avatars.githubusercontent.com/u/44674550?v=4", "profile": "https://fitfingers.github.io/", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "hegrec", "name": "Christopher Hegre", "avatar_url": "https://avatars.githubusercontent.com/u/6075845?v=4", "profile": "http://www.hegrec.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "najeeb95", "name": "Najeeb Nabwani", "avatar_url": "https://avatars.githubusercontent.com/u/29060164?v=4", "profile": "https://github.com/najeeb95", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "schroeder-g", "name": "Alexander Goncalves", "avatar_url": "https://avatars.githubusercontent.com/u/66321261?v=4", "profile": "https://github.com/schroeder-g", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "gcasalett", "name": "Gabe Casalett", "avatar_url": "https://avatars.githubusercontent.com/u/5896438?v=4", "profile": "http://www.casalett.net", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "waynedyer12", "name": "waynedyer12", "avatar_url": "https://avatars.githubusercontent.com/u/89638901?v=4", "profile": "https://github.com/waynedyer12", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "tapstephenson", "name": "tap (pts.eth)", "avatar_url": "https://avatars.githubusercontent.com/u/10340540?v=4", "profile": "https://github.com/tapstephenson", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jamesmorgan", "name": "James Morgan", "avatar_url": "https://avatars.githubusercontent.com/u/110869?v=4", "profile": "https://medium.com/@james.morgan", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "sharon-wang", "name": "Sharon Wang", "avatar_url": "https://avatars.githubusercontent.com/u/25834218?v=4", "profile": "https://www.linkedin.com/in/sharon--wang/", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "enriavil1", "name": "Enrique Jose Avila Asapche", "avatar_url": "https://avatars.githubusercontent.com/u/19207637?v=4", "profile": "https://github.com/enriavil1", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "NotManyIdeasDev", "name": "Gianni Alessandroni", "avatar_url": "https://avatars.githubusercontent.com/u/45824238?v=4", "profile": "http://notmanyideasdev.github.io", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "raj-shekhar1", "name": "Raj Shekhar Bhardwaj", "avatar_url": "https://avatars.githubusercontent.com/u/55439064?v=4", "profile": "https://github.com/raj-shekhar1", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "joakimengerstam", "name": "joakimengerstam", "avatar_url": "https://avatars.githubusercontent.com/u/12713452?v=4", "profile": "https://github.com/joakimengerstam", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ndrozd", "name": "Nikita Drozd", "avatar_url": "https://avatars.githubusercontent.com/u/6696080?v=4", "profile": "https://github.com/ndrozd", - "contributions": ["bug", "doc", "a11y"] + "contributions": [ + "bug", + "doc", + "a11y" + ] }, { "login": "Scott1UP", "name": "Scott", "avatar_url": "https://avatars.githubusercontent.com/u/83584447?v=4", "profile": "http://scottcameron.uk", - "contributions": ["design", "bug"] + "contributions": [ + "design", + "bug" + ] }, { "login": "stefanrsathianathen", "name": "Stefan Sathianathen", "avatar_url": "https://avatars.githubusercontent.com/u/22087626?v=4", "profile": "http://stefanrs.me", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "mlehotsky13", "name": "Miroslav Lehotsky", "avatar_url": "https://avatars.githubusercontent.com/u/18735418?v=4", "profile": "https://miroslavlehotsky.eu/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "RemcoMi", "name": "Remco", "avatar_url": "https://avatars.githubusercontent.com/u/4744907?v=4", "profile": "https://github.com/RemcoMi", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "shailscript", "name": "Shailendra Shukla", "avatar_url": "https://avatars.githubusercontent.com/u/32084602?v=4", "profile": "https://shailendrashukla.com/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "skylarweaver", "name": "Skylar Weaver", "avatar_url": "https://avatars.githubusercontent.com/u/4008777?v=4", "profile": "http://ProjectAFA.org", - "contributions": ["doc", "content"] + "contributions": [ + "doc", + "content" + ] }, { "login": "agorismlabs", "name": "agorismlabs", "avatar_url": "https://avatars.githubusercontent.com/u/84196983?v=4", "profile": "https://github.com/agorismlabs", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "tanishqsh", "name": "Tanishq Sharma", "avatar_url": "https://avatars.githubusercontent.com/u/15674971?v=4", "profile": "https://tanishq.xyz", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "markstrefford", "name": "Mark Strefford", "avatar_url": "https://avatars.githubusercontent.com/u/1695274?v=4", "profile": "http://delirium.digital", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "akwodkiewicz", "name": "Andrzej Wódkiewicz", "avatar_url": "https://avatars.githubusercontent.com/u/22861194?v=4", "profile": "https://github.com/akwodkiewicz", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "hugomd", "name": "Hugo", "avatar_url": "https://avatars.githubusercontent.com/u/1646536?v=4", "profile": "http://hugo.md", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "lntel", "name": "Joseph Harris", "avatar_url": "https://avatars.githubusercontent.com/u/37447006?v=4", "profile": "https://github.com/lntel", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "rootqa", "name": "Ozgur", "avatar_url": "https://avatars.githubusercontent.com/u/375834?v=4", "profile": "https://o.zgur.org", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "adilanchian", "name": "Alec Dilanchian", "avatar_url": "https://avatars.githubusercontent.com/u/13204620?v=4", "profile": "https://github.com/adilanchian", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "horacio", "name": "Horacio Bertorello", "avatar_url": "https://avatars.githubusercontent.com/u/7662728?v=4", "profile": "http://horacio.eth", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "m4sterbunny", "name": "m4sterbunny", "avatar_url": "https://avatars.githubusercontent.com/u/20266893?v=4", "profile": "http://www.technobunnies.com", - "contributions": ["doc", "maintenance", "content"] + "contributions": [ + "doc", + "maintenance", + "content" + ] }, { "login": "yutingzhao1991", "name": "愚指导", "avatar_url": "https://avatars.githubusercontent.com/u/1061968?v=4", "profile": "https://yutingzhao1991.github.io/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "rayjasson98", "name": "Ray Jasson", "avatar_url": "https://avatars.githubusercontent.com/u/48130098?v=4", "profile": "https://github.com/rayjasson98", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "calvinsomething", "name": "Calvin Storoschuk", "avatar_url": "https://avatars.githubusercontent.com/u/73667022?v=4", "profile": "https://calvinsomething.com", - "contributions": ["bug", "code"] + "contributions": [ + "bug", + "code" + ] }, { "login": "Clashinm", "name": "Clashinm", "avatar_url": "https://avatars.githubusercontent.com/u/89336570?v=4", "profile": "https://github.com/Clashinm", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "james-prysm", "name": "james-prysm", "avatar_url": "https://avatars.githubusercontent.com/u/90280386?v=4", "profile": "https://github.com/james-prysm", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "wsbuck", "name": "William Buck", "avatar_url": "https://avatars.githubusercontent.com/u/22014035?v=4", "profile": "http://williambuck.dev", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "metalocal", "name": "metalocal", "avatar_url": "https://avatars.githubusercontent.com/u/82745711?v=4", "profile": "https://github.com/metalocal", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "himanshu3w", "name": "Himanshu Singh", "avatar_url": "https://avatars.githubusercontent.com/u/63382395?v=4", "profile": "https://github.com/himanshu3w", - "contributions": ["bug", "doc", "ideas"] + "contributions": [ + "bug", + "doc", + "ideas" + ] }, { "login": "abcoathup", "name": "Andrew B Coathup", "avatar_url": "https://avatars.githubusercontent.com/u/28278242?v=4", "profile": "https://github.com/abcoathup", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "andyGallagher", "name": "Andrew Gallagher", "avatar_url": "https://avatars.githubusercontent.com/u/43940590?v=4", "profile": "https://www.andrewgallagher-portfolio.com/", - "contributions": ["content", "code"] + "contributions": [ + "content", + "code" + ] }, { "login": "phatngluu", "name": "Phat Nguyen Luu", "avatar_url": "https://avatars.githubusercontent.com/u/44693107?v=4", "profile": "https://github.com/phatngluu", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Andrew-Sofos", "name": "Andreas Sofos", "avatar_url": "https://avatars.githubusercontent.com/u/56540744?v=4", "profile": "https://github.com/Andrew-Sofos", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "fselmo", "name": "Felipe Selmo", "avatar_url": "https://avatars.githubusercontent.com/u/3532824?v=4", "profile": "https://github.com/fselmo", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "bingwei-infstones", "name": "Bingwei Qin", "avatar_url": "https://avatars.githubusercontent.com/u/64890979?v=4", "profile": "https://github.com/bingwei-infstones", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "miohtama", "name": "Mikko Ohtamaa", "avatar_url": "https://avatars.githubusercontent.com/u/49922?v=4", "profile": "https://capitalgram.com", - "contributions": ["ideas", "doc"] + "contributions": [ + "ideas", + "doc" + ] }, { "login": "iamkabilan", "name": "Kabilan", "avatar_url": "https://avatars.githubusercontent.com/u/38951107?v=4", "profile": "http://iamkabilan.github.io", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "colinsteidtmann", "name": "Colin Steidtmann", "avatar_url": "https://avatars.githubusercontent.com/u/34821973?v=4", "profile": "https://colinsteidtmann.com/", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "SNikhill", "name": "SNikhill", "avatar_url": "https://avatars.githubusercontent.com/u/51415616?v=4", "profile": "https://snikhill.tech", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "SlashHash", "name": "SlashHash", "avatar_url": "https://avatars.githubusercontent.com/u/83152561?v=4", "profile": "https://www.youtube.com/channel/UCJJWZ6IKi_hxSsh-upLAH-g", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "harshmathurx", "name": "Harsh Mathur", "avatar_url": "https://avatars.githubusercontent.com/u/58532371?v=4", "profile": "https://harshmathurx.github.io/website/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "pranavvdesai", "name": "pranav desai", "avatar_url": "https://avatars.githubusercontent.com/u/74852751?v=4", "profile": "https://github.com/pranavvdesai", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Hathoriel", "name": "Lukáš Kotol", "avatar_url": "https://avatars.githubusercontent.com/u/10884869?v=4", "profile": "http://tatum.io/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "drumnickydrum", "name": "Nick Carbone", "avatar_url": "https://avatars.githubusercontent.com/u/25669830?v=4", "profile": "http://instagram.com/drumnickydrum", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Ashwin-exe", "name": "Ashwin Nair", "avatar_url": "https://avatars.githubusercontent.com/u/58840757?v=4", "profile": "https://github.com/Ashwin-exe", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "julian-st", "name": "Julian Ste", "avatar_url": "https://avatars.githubusercontent.com/u/31321934?v=4", "profile": "https://github.com/julian-st", - "contributions": ["code", "doc", "content"] + "contributions": [ + "code", + "doc", + "content" + ] }, { "login": "0xpranay", "name": "Pranay Reddy", "avatar_url": "https://avatars.githubusercontent.com/u/48883700?v=4", "profile": "https://github.com/0xpranay", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Sednaoui", "name": "marc", "avatar_url": "https://avatars.githubusercontent.com/u/7014833?v=4", "profile": "https://github.com/Sednaoui", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "mbaragiola", "name": "Mariano Baragiola", "avatar_url": "https://avatars.githubusercontent.com/u/3682895?v=4", "profile": "https://github.com/mbaragiola", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "under3415", "name": "under3415", "avatar_url": "https://avatars.githubusercontent.com/u/3857822?v=4", "profile": "https://github.com/under3415", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "GaurKS", "name": "Gaurav Kumar Shah", "avatar_url": "https://avatars.githubusercontent.com/u/75743822?v=4", "profile": "https://github.com/GaurKS", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "princeelector", "name": "Hubert Sikorski", "avatar_url": "https://avatars.githubusercontent.com/u/46070006?v=4", "profile": "http://hubertsikorski.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "coreyar", "name": "Corey Rice", "avatar_url": "https://avatars.githubusercontent.com/u/7258308?v=4", "profile": "https://github.com/coreyar", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ezenwankwogabriel", "name": "Ezenwankwo Gabriel", "avatar_url": "https://avatars.githubusercontent.com/u/32826083?v=4", "profile": "https://github.com/ezenwankwogabriel", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "TomLisankie", "name": "Thomas Lisankie", "avatar_url": "https://avatars.githubusercontent.com/u/92654?v=4", "profile": "https://tomlisankie.com", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "TylerIlunga", "name": "Tyler Ilunga", "avatar_url": "https://avatars.githubusercontent.com/u/11746486?v=4", "profile": "https://www.linkedin.com/in/tylerilunga/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "kocvrek", "name": "Kasia Kosturek", "avatar_url": "https://avatars.githubusercontent.com/u/36547835?v=4", "profile": "http://linkedin.com/in/katarzynakosturek/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "solarpunklabs", "name": "solarpunklabs", "avatar_url": "https://avatars.githubusercontent.com/u/84196983?v=4", "profile": "https://github.com/solarpunklabs", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "aakhtar3", "name": "aakhtar3", "avatar_url": "https://avatars.githubusercontent.com/u/16447834?v=4", "profile": "https://ayyazakhtar.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "shryasss", "name": "Shreyas Londhe", "avatar_url": "https://avatars.githubusercontent.com/u/62744899?v=4", "profile": "https://github.com/shryasss", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "timbeccue", "name": "Tim Beccue", "avatar_url": "https://avatars.githubusercontent.com/u/35314207?v=4", "profile": "https://github.com/timbeccue", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "robertjosephwayne", "name": "Robert Joseph Wayne", "avatar_url": "https://avatars.githubusercontent.com/u/22128622?v=4", "profile": "http://www.robertjosephwayne.com", - "contributions": ["doc", "content"] + "contributions": [ + "doc", + "content" + ] }, { "login": "pdesmondflynn", "name": "pdesmondflynn", "avatar_url": "https://avatars.githubusercontent.com/u/93043668?v=4", "profile": "https://github.com/pdesmondflynn", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "danidamiobi", "name": "Daniel Damilola Obiokeke", "avatar_url": "https://avatars.githubusercontent.com/u/18666499?v=4", "profile": "https://meta.wikimedia.org/wiki/User:Danidamiobi", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "empeje", "name": "mpj", "avatar_url": "https://avatars.githubusercontent.com/u/11813607?v=4", "profile": "https://mpj.io", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "hungdoansy", "name": "Hung Doan", "avatar_url": "https://avatars.githubusercontent.com/u/19758667?v=4", "profile": "https://github.com/hungdoansy", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "pwilczynskiclearcode", "name": "Paweł Wilczyński", "avatar_url": "https://avatars.githubusercontent.com/u/3940860?v=4", "profile": "https://github.com/pwilczynskiclearcode", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "joaoMpf", "name": "joaoMpf", "avatar_url": "https://avatars.githubusercontent.com/u/56357437?v=4", "profile": "https://github.com/joaoMpf", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "bskrksyp9", "name": "Bhaskar Kashyap", "avatar_url": "https://avatars.githubusercontent.com/u/31563474?v=4", "profile": "https://github.com/bskrksyp9", - "contributions": ["doc", "content"] + "contributions": [ + "doc", + "content" + ] }, { "login": "bleesherman", "name": "bleesherman", "avatar_url": "https://avatars.githubusercontent.com/u/82793845?v=4", "profile": "https://github.com/bleesherman", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "bertmiller", "name": "Robert Miller", "avatar_url": "https://avatars.githubusercontent.com/u/30010302?v=4", "profile": "https://www.linkedin.com/in/bertcmiller/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "hacklschorsch", "name": "Florian Sesser", "avatar_url": "https://avatars.githubusercontent.com/u/454605?v=4", "profile": "https://florian.sesser.at/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "xianxiongwang", "name": "xianxiongwang", "avatar_url": "https://avatars.githubusercontent.com/u/30892152?v=4", "profile": "https://github.com/xianxiongwang", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "sshirokov", "name": "Slava Shirokov", "avatar_url": "https://avatars.githubusercontent.com/u/40149?v=4", "profile": "https://github.com/sshirokov", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "BenOfTheBlockchain", "name": "BenOfTheBlockchain", "avatar_url": "https://avatars.githubusercontent.com/u/93357542?v=4", "profile": "https://linktr.ee/cryptocribsnft", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "0xngmi", "name": "0xngmi", "avatar_url": "https://avatars.githubusercontent.com/u/80541789?v=4", "profile": "https://github.com/0xngmi", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "phyBrackets", "name": "Shivam Rajput", "avatar_url": "https://avatars.githubusercontent.com/u/75530356?v=4", "profile": "https://github.com/phyBrackets", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "erhuve", "name": "Raymond", "avatar_url": "https://avatars.githubusercontent.com/u/59463268?v=4", "profile": "https://github.com/erhuve", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "justincjohnson", "name": "Justin Johnson", "avatar_url": "https://avatars.githubusercontent.com/u/25121264?v=4", "profile": "https://github.com/justincjohnson", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "sakshamgurbhele", "name": "SA KSH AM ", "avatar_url": "https://avatars.githubusercontent.com/u/64558515?v=4", "profile": "https://bio.link/saksham", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "RedWolf4845", "name": "Samrat", "avatar_url": "https://avatars.githubusercontent.com/u/93679609?v=4", "profile": "https://github.com/RedWolf4845", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "notjustinshaw", "name": "Justin Shaw", "avatar_url": "https://avatars.githubusercontent.com/u/46334750?v=4", "profile": "http://justinshaw.eth", - "contributions": ["content", "code", "doc", "ideas"] + "contributions": [ + "content", + "code", + "doc", + "ideas" + ] }, { "login": "meoww-bot", "name": "meoww-bot", "avatar_url": "https://avatars.githubusercontent.com/u/14239840?v=4", "profile": "https://meow.page", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "GhostWalker562", "name": "Philip Vu", "avatar_url": "https://avatars.githubusercontent.com/u/43276017?v=4", "profile": "http://moonsdontburn.design", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "connerj70", "name": "Conner Jensen", "avatar_url": "https://avatars.githubusercontent.com/u/29151695?v=4", "profile": "http://connerjensen.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "jhaymesdev", "name": "Jhaymes", "avatar_url": "https://avatars.githubusercontent.com/u/69610160?v=4", "profile": "https://jhaymesdev.web.app/", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "selfagency", "name": "daniel sieradski", "avatar_url": "https://avatars.githubusercontent.com/u/2541728?v=4", "profile": "https://self.agency", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "bgillcode", "name": "bgillcode", "avatar_url": "https://avatars.githubusercontent.com/u/35796630?v=4", "profile": "https://github.com/bgillcode", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "cameronfink", "name": "Cameron Fink", "avatar_url": "https://avatars.githubusercontent.com/u/61752416?v=4", "profile": "http://plutum.org", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "0xvenom", "name": "Venom", "avatar_url": "https://avatars.githubusercontent.com/u/94072825?v=4", "profile": "https://github.com/0xvenom", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "JulienMaurice", "name": "JulienM", "avatar_url": "https://avatars.githubusercontent.com/u/68739585?v=4", "profile": "https://github.com/JulienMaurice", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Synesso", "name": "Jem Mawson", "avatar_url": "https://avatars.githubusercontent.com/u/21859?v=4", "profile": "https://github.com/Synesso", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "MislavJuric", "name": "Mislav", "avatar_url": "https://avatars.githubusercontent.com/u/14131045?v=4", "profile": "http://www.mislavjuric.com/", - "contributions": ["code", "doc"] + "contributions": [ + "code", + "doc" + ] }, { "login": "polluterofminds", "name": "Justin Hunter", "avatar_url": "https://avatars.githubusercontent.com/u/10519834?v=4", "profile": "https://polluterofminds.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "entonbiba", "name": "Enton Biba", "avatar_url": "https://avatars.githubusercontent.com/u/5193884?v=4", "profile": "http://www.entonbiba.com/", - "contributions": ["a11y"] + "contributions": [ + "a11y" + ] }, { "login": "byoriolserra", "name": "Oriol Serra", "avatar_url": "https://avatars.githubusercontent.com/u/87442357?v=4", "profile": "https://github.com/byoriolserra", - "contributions": ["bug", "ideas"] + "contributions": [ + "bug", + "ideas" + ] }, { "login": "nlarche", "name": "Nicolas LARCHE", "avatar_url": "https://avatars.githubusercontent.com/u/3041222?v=4", "profile": "https://github.com/nlarche", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "tbenson89", "name": "A. Tyler Benson", "avatar_url": "https://avatars.githubusercontent.com/u/25698188?v=4", "profile": "http://slmodd.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "zhous", "name": "Derek周朝晖", "avatar_url": "https://avatars.githubusercontent.com/u/1388904?v=4", "profile": "http://www.NaturalDAO.io", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "dschenkelman", "name": "Damian Schenkelman", "avatar_url": "https://avatars.githubusercontent.com/u/3376731?v=4", "profile": "http://yenkel.dev", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "heeckhau", "name": "Hendrik Eeckhaut", "avatar_url": "https://avatars.githubusercontent.com/u/735288?v=4", "profile": "http://www.sigasi.com", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "womensrights", "name": "Susannah Evans", "avatar_url": "https://avatars.githubusercontent.com/u/65018876?v=4", "profile": "https://github.com/womensrights", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "eulerbeat", "name": "Minimalist Optimalist", "avatar_url": "https://avatars.githubusercontent.com/u/52531715?v=4", "profile": "https://github.com/eulerbeat", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "vluna", "name": "vluna", "avatar_url": "https://avatars.githubusercontent.com/u/8848639?v=4", "profile": "https://vluna.github.io/portfolio/", - "contributions": ["code", "bug", "content"] + "contributions": [ + "code", + "bug", + "content" + ] }, { "login": "arghyab0", "name": "Arghya Biswas", "avatar_url": "https://avatars.githubusercontent.com/u/43907522?v=4", "profile": "https://arghyabiswas.me", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "abhi-go", "name": "abhi-go", "avatar_url": "https://avatars.githubusercontent.com/u/86805484?v=4", "profile": "https://github.com/abhi-go", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "fvictorio", "name": "Franco Victorio", "avatar_url": "https://avatars.githubusercontent.com/u/417134?v=4", "profile": "https://github.com/fvictorio", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "joneskj55", "name": "Kevin Jones", "avatar_url": "https://avatars.githubusercontent.com/u/20748598?v=4", "profile": "https://kevinjones.engineer", - "contributions": ["code", "bug", "content"] + "contributions": [ + "code", + "bug", + "content" + ] }, { "login": "ShubhankarKG", "name": "Shubhankar Kanchan Gupta", "avatar_url": "https://avatars.githubusercontent.com/u/50791000?v=4", "profile": "https://github.com/ShubhankarKG", - "contributions": ["bug", "code"] + "contributions": [ + "bug", + "code" + ] }, { "login": "vishvanathan-k", "name": "Vishvanathan K", "avatar_url": "https://avatars.githubusercontent.com/u/66466541?v=4", "profile": "https://github.com/vishvanathan-k", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "agryaznov", "name": "Alexander Gryaznov", "avatar_url": "https://avatars.githubusercontent.com/u/3878903?v=4", "profile": "http://agryaznov.com", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "pettinarip", "name": "Pablo Pettinari", "avatar_url": "https://avatars.githubusercontent.com/u/468158?v=4", "profile": "https://pettinarip.github.io/", - "contributions": ["doc", "a11y"] + "contributions": [ + "doc", + "a11y" + ] }, { "login": "Celetra", "name": "Celetra", "avatar_url": "https://avatars.githubusercontent.com/u/65692335?v=4", "profile": "http://celetralabs.com", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "sharadseth", "name": "sharadseth", "avatar_url": "https://avatars.githubusercontent.com/u/14011221?v=4", "profile": "https://github.com/sharadseth", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "mariahpickett", "name": "Mariah", "avatar_url": "https://avatars.githubusercontent.com/u/74935737?v=4", "profile": "https://github.com/mariahpickett", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ascrookes", "name": "Amadou Crookes", "avatar_url": "https://avatars.githubusercontent.com/u/1642035?v=4", "profile": "https://github.com/ascrookes", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "nwoodr94", "name": "Nathan Woodruff", "avatar_url": "https://avatars.githubusercontent.com/u/46133948?v=4", "profile": "http://nathanwoodruff.dev", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "AndreyAzimov", "name": "Andrey Azimov", "avatar_url": "https://avatars.githubusercontent.com/u/5325909?v=4", "profile": "https://web3.career", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ddocs", "name": "Anita Diamond", "avatar_url": "https://avatars.githubusercontent.com/u/38940580?v=4", "profile": "https://ddocs.co.uk", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ismaventuras", "name": "ismaventuras", "avatar_url": "https://avatars.githubusercontent.com/u/24738382?v=4", "profile": "https://github.com/ismaventuras", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "jhonnyvianello", "name": "Jhonny", "avatar_url": "https://avatars.githubusercontent.com/u/62344609?v=4", "profile": "https://www.instagram.com/jhonnyvianello", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "MatthieuScarset", "name": "Matthieu SCARSET", "avatar_url": "https://avatars.githubusercontent.com/u/7369593?v=4", "profile": "https://matthieuscarset.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "luozhanxin", "name": "zhanxin", "avatar_url": "https://avatars.githubusercontent.com/u/16456918?v=4", "profile": "http://blog.luoxinxin.com.cn", - "contributions": ["translation", "doc"] + "contributions": [ + "translation", + "doc" + ] }, { "login": "geoffhull03", "name": "Geoff Hull", "avatar_url": "https://avatars.githubusercontent.com/u/24528980?v=4", "profile": "https://github.com/geoffhull03", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "aburk3", "name": "Austin Burke", "avatar_url": "https://avatars.githubusercontent.com/u/24820716?v=4", "profile": "https://austinburke.dev", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "rich1n", "name": "Richard Rodrigues", "avatar_url": "https://avatars.githubusercontent.com/u/66102911?v=4", "profile": "http://rich1n.com", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "samnang", "name": "Samnang Chhun", "avatar_url": "https://avatars.githubusercontent.com/u/131172?v=4", "profile": "https://github.com/samnang", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "m-t-a97", "name": "Tanvir Ahmed", "avatar_url": "https://avatars.githubusercontent.com/u/54685928?v=4", "profile": "http://m-t-ahmed.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "JorisZierold", "name": "Joris Zierold", "avatar_url": "https://avatars.githubusercontent.com/u/13258954?v=4", "profile": "https://github.com/JorisZierold", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "selfwithin", "name": "selfwithin", "avatar_url": "https://avatars.githubusercontent.com/u/94748148?v=4", "profile": "https://github.com/selfwithin", - "contributions": ["ideas", "doc"] + "contributions": [ + "ideas", + "doc" + ] }, { "login": "jnathnjshua", "name": "Jonathan Joshua", "avatar_url": "https://avatars.githubusercontent.com/u/46720446?v=4", "profile": "https://github.com/jnathnjshua", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "patcito", "name": "Patrick Aljord", "avatar_url": "https://avatars.githubusercontent.com/u/26435?v=4", "profile": "https://twitter.com/patcito", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "decipherer2", "name": "decifer", "avatar_url": "https://avatars.githubusercontent.com/u/16278986?v=4", "profile": "https://github.com/decipherer2", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "aghArdeshir", "name": "aghArdeshir", "avatar_url": "https://avatars.githubusercontent.com/u/5755214?v=4", "profile": "https://github.com/aghArdeshir", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "MiConnell", "name": "Michael Connell", "avatar_url": "https://avatars.githubusercontent.com/u/14168559?v=4", "profile": "https://github.com/MiConnell", - "contributions": ["content", "code", "bug"] + "contributions": [ + "content", + "code", + "bug" + ] }, { "login": "amm98d", "name": "Ahmed Mustafa Malik", "avatar_url": "https://avatars.githubusercontent.com/u/39633205?v=4", "profile": "https://github.com/amm98d", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "gamalielhere", "name": "Gamaliel 'Yel' Padillo", "avatar_url": "https://avatars.githubusercontent.com/u/16236741?v=4", "profile": "https://www.gamalielpadillo.com/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "kum9748ar", "name": "Kumar Kalyan", "avatar_url": "https://avatars.githubusercontent.com/u/67071462?v=4", "profile": "https://linktr.ee/kumarkalyan", - "contributions": ["bug", "doc", "code", "a11y"] + "contributions": [ + "bug", + "doc", + "code", + "a11y" + ] }, { "login": "0xdie", "name": "0xdie", "avatar_url": "https://avatars.githubusercontent.com/u/94481845?v=4", "profile": "https://github.com/0xdie", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Taimoor0217", "name": "Taimoor Ali", "avatar_url": "https://avatars.githubusercontent.com/u/48244930?v=4", "profile": "https://github.com/Taimoor0217", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "andrejrakic", "name": "Andrej", "avatar_url": "https://avatars.githubusercontent.com/u/37881789?v=4", "profile": "https://www.linkedin.com/in/andrejrakic/", - "contributions": ["doc", "content"] + "contributions": [ + "doc", + "content" + ] }, { "login": "pcaversaccio", "name": "Pascal Marco Caversaccio", "avatar_url": "https://avatars.githubusercontent.com/u/25297591?v=4", "profile": "http://www.daita.tech", - "contributions": ["doc", "content"] + "contributions": [ + "doc", + "content" + ] }, { "login": "kennethcassel", "name": "kennethcassel", "avatar_url": "https://avatars.githubusercontent.com/u/22961671?v=4", "profile": "https://www.slip.so", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "BrysonXiao", "name": "BrysonXiao", "avatar_url": "https://avatars.githubusercontent.com/u/40129652?v=4", "profile": "https://github.com/BrysonXiao", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "cdomashn", "name": "Discord #8528", "avatar_url": "https://avatars.githubusercontent.com/u/58366873?v=4", "profile": "https://github.com/cdomashn", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nedrocks", "name": "Ned Rockson", "avatar_url": "https://avatars.githubusercontent.com/u/537592?v=4", "profile": "http://www.nedrockson.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "tommtt", "name": "Tommaso Tosi", "avatar_url": "https://avatars.githubusercontent.com/u/71329765?v=4", "profile": "https://github.com/tommtt", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "kamilsadik", "name": "Kamil", "avatar_url": "https://avatars.githubusercontent.com/u/75034988?v=4", "profile": "http://kamilsadik.xyz", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Periyot", "name": "Mert", "avatar_url": "https://avatars.githubusercontent.com/u/88425310?v=4", "profile": "http://www.mert.click", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "Naman-Bhalla", "name": "Naman Bhalla", "avatar_url": "https://avatars.githubusercontent.com/u/6305474?v=4", "profile": "https://www.linkedin.com/in/namanbhalla/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "A2be", "name": "Kirk", "avatar_url": "https://avatars.githubusercontent.com/u/19943243?v=4", "profile": "https://github.com/A2be", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "juliangeissler", "name": "juliangeissler", "avatar_url": "https://avatars.githubusercontent.com/u/81534590?v=4", "profile": "https://github.com/juliangeissler", - "contributions": ["doc", "bug", "code"] + "contributions": [ + "doc", + "bug", + "code" + ] }, { "login": "garricn", "name": "Garric G. Nahapetian", "avatar_url": "https://avatars.githubusercontent.com/u/13260696?v=4", "profile": "https://github.com/garricn", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "fishmandev", "name": "Dmitriy Fishman", "avatar_url": "https://avatars.githubusercontent.com/u/29619660?v=4", "profile": "https://github.com/fishmandev", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "neozapatista", "name": "neozapatista", "avatar_url": "https://avatars.githubusercontent.com/u/44417247?v=4", "profile": "https://github.com/neozapatista", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Factral", "name": "Factral", "avatar_url": "https://avatars.githubusercontent.com/u/74687828?v=4", "profile": "http://factral.github.io/", - "contributions": ["translation", "doc", "bug", "code"] + "contributions": [ + "translation", + "doc", + "bug", + "code" + ] }, { "login": "elshigori", "name": "elshigori", "avatar_url": "https://avatars.githubusercontent.com/u/96995185?v=4", "profile": "https://github.com/elshigori", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "HuangRongcun", "name": "EarthMan", "avatar_url": "https://avatars.githubusercontent.com/u/1501342?v=4", "profile": "https://github.com/HuangRongcun", - "contributions": ["translation", "doc"] + "contributions": [ + "translation", + "doc" + ] }, { "login": "mohan-chinnappan-n", "name": "mohan-chinnappan-n", "avatar_url": "https://avatars.githubusercontent.com/u/5963194?v=4", "profile": "https://mohan-chinnappan-n.github.io/about/cv.html", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Gobljn", "name": "Nicola Bonsi", "avatar_url": "https://avatars.githubusercontent.com/u/44135563?v=4", "profile": "https://github.com/Gobljn", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "yelnady", "name": "Yusuf Elnady", "avatar_url": "https://avatars.githubusercontent.com/u/45317481?v=4", "profile": "https://www.linkedin.com/in/yelnady/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "aryankeluskar", "name": "Aryan Keluskar", "avatar_url": "https://avatars.githubusercontent.com/u/80093392?v=4", "profile": "https://github.com/aryankeluskar", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "LingTian", "name": "Ling", "avatar_url": "https://avatars.githubusercontent.com/u/4249432?v=4", "profile": "https://github.com/LingTian", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sorenrood", "name": "Søren Rood", "avatar_url": "https://avatars.githubusercontent.com/u/49735495?v=4", "profile": "http://5oren.com", - "contributions": ["code", "doc", "ideas"] + "contributions": [ + "code", + "doc", + "ideas" + ] }, { "login": "braindead2408", "name": "Tanmay Nagepatil", "avatar_url": "https://avatars.githubusercontent.com/u/69108887?v=4", "profile": "http://minimalistblogger.space", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "B-Harden", "name": "Brandon Harden", "avatar_url": "https://avatars.githubusercontent.com/u/20617335?v=4", "profile": "https://b-harden.github.io/Portfolio/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "snigdha920", "name": "Snigdha Singh", "avatar_url": "https://avatars.githubusercontent.com/u/62167899?v=4", "profile": "https://snigdha920.github.io/formal-personal-site/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "stefan-wuest", "name": "SW", "avatar_url": "https://avatars.githubusercontent.com/u/20667579?v=4", "profile": "https://github.com/stefan-wuest", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "aaronisme", "name": "Aaron Chen", "avatar_url": "https://avatars.githubusercontent.com/u/7855886?v=4", "profile": "https://aaronisme.github.io", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Qazalin", "name": "Qazal Samani", "avatar_url": "https://avatars.githubusercontent.com/u/77887910?v=4", "profile": "https://portfolio-qazalin.vercel.app/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "YashKarthik", "name": "yash", "avatar_url": "https://avatars.githubusercontent.com/u/52369876?v=4", "profile": "https://www.yashkarthik.xyz/", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "ibeale", "name": "Isaac Beale", "avatar_url": "https://avatars.githubusercontent.com/u/46497763?v=4", "profile": "https://github.com/ibeale", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "chrishna1", "name": "Bal Krishna Jha", "avatar_url": "https://avatars.githubusercontent.com/u/26048398?v=4", "profile": "https://github.com/chrishna1", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "maciejrrr", "name": "maciejrrr", "avatar_url": "https://avatars.githubusercontent.com/u/6785984?v=4", "profile": "http://www.linkedin.com/in/maciejrrr", - "contributions": ["code", "bug"] + "contributions": [ + "code", + "bug" + ] }, { "login": "mmilenkovic", "name": "mmilenkovic", "avatar_url": "https://avatars.githubusercontent.com/u/2448210?v=4", "profile": "https://github.com/mmilenkovic", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "guevaraf", "name": "Fernando Guevara", "avatar_url": "https://avatars.githubusercontent.com/u/2633129?v=4", "profile": "https://github.com/guevaraf", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "garrivjo", "name": "Jose Manuel Garcia Rivas", "avatar_url": "https://avatars.githubusercontent.com/u/31991694?v=4", "profile": "https://github.com/garrivjo", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "PolySages", "name": "PolySages", "avatar_url": "https://avatars.githubusercontent.com/u/98001681?v=4", "profile": "https://github.com/PolySages", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "zainabb12345", "name": "Zainab Hasan", "avatar_url": "https://avatars.githubusercontent.com/u/59745525?v=4", "profile": "https://github.com/zainabb12345", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "mdedeu", "name": "Marcos Dedeu", "avatar_url": "https://avatars.githubusercontent.com/u/62359173?v=4", "profile": "https://github.com/mdedeu", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "SunitRoy2703", "name": "Sunit Roy", "avatar_url": "https://avatars.githubusercontent.com/u/67560900?v=4", "profile": "https://bit.ly/SunitRoyYT", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "astutejoe", "name": "Gabriel Garcia", "avatar_url": "https://avatars.githubusercontent.com/u/15985195?v=4", "profile": "https://www.facebook.com/gabriel.antunes.garcia/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "tiagoyonamine", "name": "Tiago Yonamine", "avatar_url": "https://avatars.githubusercontent.com/u/6979032?v=4", "profile": "https://tiagoyonamine.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Ej1seven", "name": "Erik Hunter", "avatar_url": "https://avatars.githubusercontent.com/u/12377787?v=4", "profile": "http://ww.erikhunter.dev", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "lingzhong", "name": "lingzhong", "avatar_url": "https://avatars.githubusercontent.com/u/4011137?v=4", "profile": "https://www.linkedin.com/in/lingzhong-eth/", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "yashkamalchaturvedi", "name": "Yash Kamal Chaturvedi", "avatar_url": "https://avatars.githubusercontent.com/u/69413160?v=4", "profile": "https://github.com/yashkamalchaturvedi", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "EtherWorldCo", "name": "EtherWorld", "avatar_url": "https://avatars.githubusercontent.com/u/97191248?v=4", "profile": "https://github.com/EtherWorldCo", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Ignjatovic", "name": "Stefan Ignjatović", "avatar_url": "https://avatars.githubusercontent.com/u/2846306?v=4", "profile": "http://tenderly.co", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ihebu", "name": "Iheb Haboubi", "avatar_url": "https://avatars.githubusercontent.com/u/47149194?v=4", "profile": "https://github.com/ihebu", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "HursitTarcan", "name": "Hursit Tarcan", "avatar_url": "https://avatars.githubusercontent.com/u/75273616?v=4", "profile": "https://github.com/HursitTarcan", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "pabloped", "name": "pabloped", "avatar_url": "https://avatars.githubusercontent.com/u/65499117?v=4", "profile": "https://github.com/pabloped", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "ilkererkek", "name": "ilkererkek", "avatar_url": "https://avatars.githubusercontent.com/u/69644608?v=4", "profile": "https://github.com/ilkererkek", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Filoppi", "name": "Filippo Tarpini", "avatar_url": "https://avatars.githubusercontent.com/u/7011366?v=4", "profile": "https://github.com/Filoppi", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "saif-11bit", "name": "saif-11bit", "avatar_url": "https://avatars.githubusercontent.com/u/56977968?v=4", "profile": "https://github.com/saif-11bit", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Shpota", "name": "Sasha Shpota", "avatar_url": "https://avatars.githubusercontent.com/u/5640984?v=4", "profile": "http://shpota.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ErikBjare", "name": "Erik Bjäreholt", "avatar_url": "https://avatars.githubusercontent.com/u/1405370?v=4", "profile": "https://erik.bjareholt.com", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "tomasbanik", "name": "tomasbanik", "avatar_url": "https://avatars.githubusercontent.com/u/12295965?v=4", "profile": "https://github.com/tomasbanik", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "adi611", "name": "Aditya Agarwal", "avatar_url": "https://avatars.githubusercontent.com/u/50960175?v=4", "profile": "https://adityaagarwal.bio.link/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "gsans", "name": "Gerard Sans", "avatar_url": "https://avatars.githubusercontent.com/u/4660316?v=4", "profile": "https://medium.com/@gerard.sans", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "chuyeow", "name": "Cheah Chu Yeow", "avatar_url": "https://avatars.githubusercontent.com/u/213?v=4", "profile": "http://blog.codefront.net/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nomadbitcoin", "name": "Yan Luiz", "avatar_url": "https://avatars.githubusercontent.com/u/39248465?v=4", "profile": "https://www.linkedin.com/in/yanluiz/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "chabroA", "name": "Alexandre Chabrolin", "avatar_url": "https://avatars.githubusercontent.com/u/9203826?v=4", "profile": "https://github.com/chabroA", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Sergey1997", "name": "Sergey Danilovich", "avatar_url": "https://avatars.githubusercontent.com/u/22988415?v=4", "profile": "https://github.com/Sergey1997", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "chelorope", "name": "Marcelo Rodriguez", "avatar_url": "https://avatars.githubusercontent.com/u/6799516?v=4", "profile": "https://github.com/chelorope", - "contributions": ["content", "code"] + "contributions": [ + "content", + "code" + ] }, { "login": "parkedtruck", "name": "Anna", "avatar_url": "https://avatars.githubusercontent.com/u/90351322?v=4", "profile": "https://github.com/parkedtruck", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jtraglia", "name": "Justin Traglia", "avatar_url": "https://avatars.githubusercontent.com/u/95511699?v=4", "profile": "https://github.com/jtraglia", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mateusnds", "name": "bitmateus", "avatar_url": "https://avatars.githubusercontent.com/u/895529?v=4", "profile": "https://livecoins.com.br", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "carboni-rob", "name": "Roberto Carboni", "avatar_url": "https://avatars.githubusercontent.com/u/25662777?v=4", "profile": "https://github.com/carboni-rob", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "kelcheone", "name": "KΞVIN KΞlchΞ⟠", "avatar_url": "https://avatars.githubusercontent.com/u/80192475?v=4", "profile": "https://github.com/kelcheone", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "said026", "name": "Saïd Ibrihen", "avatar_url": "https://avatars.githubusercontent.com/u/8886540?v=4", "profile": "https://www.orange-business.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "rojotek", "name": "Rob Dawson", "avatar_url": "https://avatars.githubusercontent.com/u/261271?v=4", "profile": "https://github.com/rojotek", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "asashour", "name": "Ahmed Ashour", "avatar_url": "https://avatars.githubusercontent.com/u/2410127?v=4", "profile": "https://github.com/asashour", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Arachnid", "name": "Nick Johnson", "avatar_url": "https://avatars.githubusercontent.com/u/17865?v=4", "profile": "http://blog.notdot.net/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "wuzekang", "name": "吴泽康", "avatar_url": "https://avatars.githubusercontent.com/u/6880274?v=4", "profile": "https://www.zhihu.com/people/wu-ze-kang", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "nickgaski", "name": "Nick Gaski", "avatar_url": "https://avatars.githubusercontent.com/u/16326255?v=4", "profile": "https://github.com/nickgaski", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "RahulBansal123", "name": "Rahul", "avatar_url": "https://avatars.githubusercontent.com/u/64414414?v=4", "profile": "https://www.linkedin.com/in/rahul-bansal-66a9581a6/", - "contributions": ["ideas", "doc", "content"] + "contributions": [ + "ideas", + "doc", + "content" + ] }, { "login": "frxncismor", "name": "Francisco J. Moreno", "avatar_url": "https://avatars.githubusercontent.com/u/30633617?v=4", "profile": "https://github.com/frxncismor", - "contributions": ["translation", "doc"] + "contributions": [ + "translation", + "doc" + ] }, { "login": "Kansas-Guy", "name": "Zach", "avatar_url": "https://avatars.githubusercontent.com/u/87861134?v=4", "profile": "https://github.com/Kansas-Guy", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "bestpilotingalaxy", "name": "bestpilotingalaxy", "avatar_url": "https://avatars.githubusercontent.com/u/59182467?v=4", "profile": "https://github.com/bestpilotingalaxy", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "q9f", "name": "Afr Schoe", "avatar_url": "https://avatars.githubusercontent.com/u/58883403?v=4", "profile": "http://fault.dev", - "contributions": ["code", "doc"] + "contributions": [ + "code", + "doc" + ] }, { "login": "jamongeon1", "name": "jamongeon1", "avatar_url": "https://avatars.githubusercontent.com/u/94926423?v=4", "profile": "https://github.com/jamongeon1", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "JayGreck", "name": "Jay", "avatar_url": "https://avatars.githubusercontent.com/u/56350730?v=4", "profile": "https://github.com/JayGreck", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ArnaudSpanneut", "name": "Arnaud Spanneut", "avatar_url": "https://avatars.githubusercontent.com/u/2766935?v=4", "profile": "https://github.com/ArnaudSpanneut", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "yuliyu123", "name": "yuliyu123", "avatar_url": "https://avatars.githubusercontent.com/u/8566390?v=4", "profile": "https://github.com/yuliyu123", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "VignetteApril", "name": "Jack", "avatar_url": "https://avatars.githubusercontent.com/u/28882898?v=4", "profile": "https://vignetteapril.github.io", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "JayGhb", "name": "Jason Manoloudis", "avatar_url": "https://avatars.githubusercontent.com/u/29868879?v=4", "profile": "https://github.com/JayGhb", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Medzhidov-Omardibir", "name": "Medzhidov-Omardibir", "avatar_url": "https://avatars.githubusercontent.com/u/95706785?v=4", "profile": "https://github.com/Medzhidov-Omardibir", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ApostolisGaros", "name": "ApoGrs", "avatar_url": "https://avatars.githubusercontent.com/u/45716978?v=4", "profile": "https://github.com/ApostolisGaros", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "m-zaink", "name": "Mohammed Sadiq", "avatar_url": "https://avatars.githubusercontent.com/u/32197186?v=4", "profile": "https://github.com/m-zaink", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Sahilsen", "name": "Sahil sen", "avatar_url": "https://avatars.githubusercontent.com/u/41318044?v=4", "profile": "https://github.com/Sahilsen", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "collincusce", "name": "Collin K Cusce", "avatar_url": "https://avatars.githubusercontent.com/u/6778681?v=4", "profile": "https://github.com/collincusce", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "hma23", "name": "hma23", "avatar_url": "https://avatars.githubusercontent.com/u/33968559?v=4", "profile": "https://github.com/hma23", - "contributions": ["ideas", "doc"] + "contributions": [ + "ideas", + "doc" + ] }, { "login": "KaranKaira", "name": "Karan Kaira", "avatar_url": "https://avatars.githubusercontent.com/u/46125192?v=4", "profile": "https://github.com/KaranKaira", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "Re-Drawn", "name": "ReDrawn", "avatar_url": "https://avatars.githubusercontent.com/u/54480926?v=4", "profile": "https://github.com/Re-Drawn", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "brokenprogrammer", "name": "Oskar Mendel", "avatar_url": "https://avatars.githubusercontent.com/u/16289144?v=4", "profile": "http://www.oskarmendel.me", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "thewild-being", "name": "thewild-being", "avatar_url": "https://avatars.githubusercontent.com/u/82868359?v=4", "profile": "https://github.com/thewild-being", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "mydearcode", "name": "Mihrac Cerrahoglu", "avatar_url": "https://avatars.githubusercontent.com/u/18642701?v=4", "profile": "http://mihrac.com", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "smartcontracts", "name": "smartcontracts", "avatar_url": "https://avatars.githubusercontent.com/u/14298799?v=4", "profile": "https://github.com/smartcontracts", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "BlockchainRev", "name": "Samay Lakhani", "avatar_url": "https://avatars.githubusercontent.com/u/47613687?v=4", "profile": "http://thetaclubai.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "vdusart", "name": "vdusart", "avatar_url": "https://avatars.githubusercontent.com/u/43795504?v=4", "profile": "https://github.com/vdusart", - "contributions": ["doc", "code", "translation"] + "contributions": [ + "doc", + "code", + "translation" + ] }, { "login": "wd021", "name": "wd021", "avatar_url": "https://avatars.githubusercontent.com/u/2752586?v=4", "profile": "https://github.com/wd021", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "brian7346", "name": "Max Roslow", "avatar_url": "https://avatars.githubusercontent.com/u/14194522?v=4", "profile": "https://github.com/brian7346", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "tnkrxyz", "name": "tnkrxyz", "avatar_url": "https://avatars.githubusercontent.com/u/97625120?v=4", "profile": "https://github.com/tnkrxyz", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "nloureiro", "name": "Nuno Loureiro", "avatar_url": "https://avatars.githubusercontent.com/u/1120748?v=4", "profile": "http://nloureiro.com", - "contributions": ["code", "design"] + "contributions": [ + "code", + "design" + ] }, { "login": "polarpunklabs", "name": "polarpunklabs", "avatar_url": "https://avatars.githubusercontent.com/u/84196983?v=4", "profile": "https://github.com/polarpunklabs", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "neographer", "name": "Neographer", "avatar_url": "https://avatars.githubusercontent.com/u/1559973?v=4", "profile": "https://github.com/neographer", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "britodiego", "name": "Voll", "avatar_url": "https://avatars.githubusercontent.com/u/84880186?v=4", "profile": "https://github.com/britodiego", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "SurpriseMF3000", "name": "SurpriseMF3000", "avatar_url": "https://avatars.githubusercontent.com/u/99681009?v=4", "profile": "https://github.com/SurpriseMF3000", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "htimsk", "name": "htimsk", "avatar_url": "https://avatars.githubusercontent.com/u/16523856?v=4", "profile": "https://github.com/htimsk", - "contributions": ["eventOrganizing"] + "contributions": [ + "eventOrganizing" + ] }, { "login": "odysseus0", "name": "George Zhang", "avatar_url": "https://avatars.githubusercontent.com/u/8635094?v=4", "profile": "https://github.com/odysseus0", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "nitin094-hub", "name": "Nitin Rajesh", "avatar_url": "https://avatars.githubusercontent.com/u/73329655?v=4", "profile": "https://github.com/nitin094-hub", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "rakeshhotker", "name": "Rakesh Hotker", "avatar_url": "https://avatars.githubusercontent.com/u/55056403?v=4", "profile": "https://github.com/rakeshhotker", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "sebastiendan", "name": "Sébastien Dan", "avatar_url": "https://avatars.githubusercontent.com/u/12198372?v=4", "profile": "https://sebastiendan.github.io/tokyo-stories-8bits/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "krsakshi", "name": "Sakshi", "avatar_url": "https://avatars.githubusercontent.com/u/85516345?v=4", "profile": "https://github.com/krsakshi", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "theanshi", "name": "Anshi", "avatar_url": "https://avatars.githubusercontent.com/u/85395224?v=4", "profile": "https://github.com/theanshi", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "mikoto-studio", "name": "mikoto-studio", "avatar_url": "https://avatars.githubusercontent.com/u/83389134?v=4", "profile": "https://github.com/mikoto-studio", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sacshin", "name": "Arhat", "avatar_url": "https://avatars.githubusercontent.com/u/55705611?v=4", "profile": "https://github.com/sacshin", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "php4fan", "name": "php4fan", "avatar_url": "https://avatars.githubusercontent.com/u/13969584?v=4", "profile": "https://github.com/php4fan", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "kpister", "name": "Kaiser Pister", "avatar_url": "https://avatars.githubusercontent.com/u/4607361?v=4", "profile": "https://github.com/kpister", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "MATsxm", "name": "Marc-Antoine Thevenet", "avatar_url": "https://avatars.githubusercontent.com/u/1972717?v=4", "profile": "http://idimweb.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "alantoa", "name": "Alan Toa", "avatar_url": "https://avatars.githubusercontent.com/u/37520667?v=4", "profile": "http://alantoa.com", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "christopear", "name": "Christopher Pearce", "avatar_url": "https://avatars.githubusercontent.com/u/9981297?v=4", "profile": "http://christopherpearce.nz", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "kurotaky", "name": "Yuta Kurotaki", "avatar_url": "https://avatars.githubusercontent.com/u/866589?v=4", "profile": "https://mo-fu.org", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Claudio2000", "name": "Claudio2000", "avatar_url": "https://avatars.githubusercontent.com/u/32911415?v=4", "profile": "https://github.com/Claudio2000", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "tomaspasie", "name": "Tomas Pasiecznik", "avatar_url": "https://avatars.githubusercontent.com/u/42984839?v=4", "profile": "http://hoo.be/tomaspasie", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "StrongerXi", "name": "Xiangxi Guo (Ryan)", "avatar_url": "https://avatars.githubusercontent.com/u/26714592?v=4", "profile": "https://strongerxi.github.io/ryanguo99.github.io/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "SkywalkingZulu", "name": "Andile Mchunu", "avatar_url": "https://avatars.githubusercontent.com/u/47420082?v=4", "profile": "http://ibistech.site", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "noahliechti", "name": "Noah", "avatar_url": "https://avatars.githubusercontent.com/u/38284563?v=4", "profile": "http://noahliechti.ch", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "adrianmcli", "name": "Adrian Li", "avatar_url": "https://avatars.githubusercontent.com/u/943555?v=4", "profile": "https://github.com/adrianmcli", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "penlix", "name": "Konstantinos Penlidis", "avatar_url": "https://avatars.githubusercontent.com/u/8178384?v=4", "profile": "http://www.niceandneat.digital", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "HunterSandlin", "name": "Hunter Sandlin", "avatar_url": "https://avatars.githubusercontent.com/u/62820211?v=4", "profile": "https://github.com/HunterSandlin", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "chrboesch", "name": "Chris Boesch", "avatar_url": "https://avatars.githubusercontent.com/u/48591413?v=4", "profile": "https://github.com/chrboesch", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "xcaro", "name": "Nhan Vo", "avatar_url": "https://avatars.githubusercontent.com/u/32713050?v=4", "profile": "http://nguoithua.net", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "devtooligan", "name": "devtooligan", "avatar_url": "https://avatars.githubusercontent.com/u/71567643?v=4", "profile": "https://github.com/devtooligan", - "contributions": ["doc", "code", "ideas"] + "contributions": [ + "doc", + "code", + "ideas" + ] }, { "login": "Nottommy11", "name": "Thomas", "avatar_url": "https://avatars.githubusercontent.com/u/91304333?v=4", "profile": "https://github.com/Nottommy11", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "plamarque", "name": "Patrice Lamarque", "avatar_url": "https://avatars.githubusercontent.com/u/227828?v=4", "profile": "https://github.com/plamarque", - "contributions": ["doc", "ideas", "bug", "tool"] + "contributions": [ + "doc", + "ideas", + "bug", + "tool" + ] }, { "login": "sell50", "name": "sell50", "avatar_url": "https://avatars.githubusercontent.com/u/34224830?v=4", "profile": "https://github.com/sell50", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "manuperalta", "name": "Manuel Peralta", "avatar_url": "https://avatars.githubusercontent.com/u/90803647?v=4", "profile": "https://github.com/manuperalta", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Riely007", "name": "Riely", "avatar_url": "https://avatars.githubusercontent.com/u/80497350?v=4", "profile": "https://github.com/Riely007", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "Ghospel", "name": "Jasper", "avatar_url": "https://avatars.githubusercontent.com/u/5272374?v=4", "profile": "https://github.com/Ghospel", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "rhigdon", "name": "Ryan Higdn", "avatar_url": "https://avatars.githubusercontent.com/u/133530?v=4", "profile": "http://ryanhigdon.com", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "Eni-G", "name": "Eni-G", "avatar_url": "https://avatars.githubusercontent.com/u/100782096?v=4", "profile": "https://github.com/Eni-G", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "B01AND", "name": "B01AND", "avatar_url": "https://avatars.githubusercontent.com/u/88404615?v=4", "profile": "https://github.com/B01AND", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "epicfaace", "name": "Ashwin Ramaswami", "avatar_url": "https://avatars.githubusercontent.com/u/1689183?v=4", "profile": "https://ashwin.run/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "LieAlbertTriAdrian", "name": "Albert Lie Adrian", "avatar_url": "https://avatars.githubusercontent.com/u/12984659?v=4", "profile": "https://github.com/LieAlbertTriAdrian", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "1337-ishaan", "name": "Ishaan Parmar", "avatar_url": "https://avatars.githubusercontent.com/u/64636222?v=4", "profile": "https://github.com/1337-ishaan", - "contributions": ["code", "design", "ideas"] + "contributions": [ + "code", + "design", + "ideas" + ] }, { "login": "tarunbatra", "name": "Tarun Batra", "avatar_url": "https://avatars.githubusercontent.com/u/5329230?v=4", "profile": "http://tarunbatra.com", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "max-donger", "name": "Max", "avatar_url": "https://avatars.githubusercontent.com/u/56192627?v=4", "profile": "https://github.com/max-donger", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "LuozhuZhang", "name": "Luozhu", "avatar_url": "https://avatars.githubusercontent.com/u/70309026?v=4", "profile": "https://github.com/LuozhuZhang", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "yash-sharma1", "name": "Yash Sharma ", "avatar_url": "https://avatars.githubusercontent.com/u/44340561?v=4", "profile": "http://www.linkedin.com/in/sharma-yash", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "cryptochrome", "name": "cryptochrome", "avatar_url": "https://avatars.githubusercontent.com/u/4440762?v=4", "profile": "https://github.com/cryptochrome", - "contributions": ["ideas", "bug"] + "contributions": [ + "ideas", + "bug" + ] }, { "login": "argan", "name": "Argan Wang", "avatar_url": "https://avatars.githubusercontent.com/u/27713?v=4", "profile": "http://argan.github.io", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "14MR", "name": "Tim Mustafin", "avatar_url": "https://avatars.githubusercontent.com/u/5824170?v=4", "profile": "http://mustafin.dev", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "superphiz", "name": "superphiz", "avatar_url": "https://avatars.githubusercontent.com/u/51464737?v=4", "profile": "https://github.com/superphiz", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "seanlakers", "name": "seanlakers", "avatar_url": "https://avatars.githubusercontent.com/u/104017504?v=4", "profile": "https://github.com/seanlakers", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "JasonYan2015", "name": "Jason Yan", "avatar_url": "https://avatars.githubusercontent.com/u/17684609?v=4", "profile": "https://github.com/JasonYan2015", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "mradkov", "name": "mradkov", "avatar_url": "https://avatars.githubusercontent.com/u/13139371?v=4", "profile": "https://hack.bg", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "b17z", "name": "Bienvenido Rodriguez", "avatar_url": "https://avatars.githubusercontent.com/u/3633484?v=4", "profile": "https://github.com/b17z", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "soranature", "name": "Sora Nature", "avatar_url": "https://avatars.githubusercontent.com/u/105337203?v=4", "profile": "https://github.com/soranature", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "cupOJoseph", "name": "Joseph Schiarizzi", "avatar_url": "https://avatars.githubusercontent.com/u/9449596?v=4", "profile": "http://josephschiarizzi.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "GustavoRSSilva", "name": "Gustavo Silva", "avatar_url": "https://avatars.githubusercontent.com/u/8384988?v=4", "profile": "https://gustavorssilva.github.io/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "AweSamarth", "name": "Samarth Saxena", "avatar_url": "https://avatars.githubusercontent.com/u/72488638?v=4", "profile": "https://github.com/AweSamarth", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "byhow", "name": "Baihao", "avatar_url": "https://avatars.githubusercontent.com/u/25713361?v=4", "profile": "https://github.com/byhow", - "contributions": ["doc", "bug", "code"] + "contributions": [ + "doc", + "bug", + "code" + ] }, { "login": "stoobie", "name": "Steve Goodman", "avatar_url": "https://avatars.githubusercontent.com/u/39279277?v=4", "profile": "https://github.com/stoobie", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "booklearner", "name": "booklearner", "avatar_url": "https://avatars.githubusercontent.com/u/103979114?v=4", "profile": "http://booklearner.org", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "moretimeL", "name": "moretimeL", "avatar_url": "https://avatars.githubusercontent.com/u/43361848?v=4", "profile": "https://github.com/moretimeL", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "SuperDelphi", "name": "SuperDelphi", "avatar_url": "https://avatars.githubusercontent.com/u/44942598?v=4", "profile": "https://github.com/SuperDelphi", - "contributions": ["content", "translation", "bug", "doc"] + "contributions": [ + "content", + "translation", + "bug", + "doc" + ] }, { "login": "chadlohrli", "name": "chadlohrli", "avatar_url": "https://avatars.githubusercontent.com/u/9952172?v=4", "profile": "https://github.com/chadlohrli", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "JuliusDegesys", "name": "Julius Degesys", "avatar_url": "https://avatars.githubusercontent.com/u/3232103?v=4", "profile": "https://github.com/JuliusDegesys", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "nhsz", "name": "Nicolás Quiroz", "avatar_url": "https://avatars.githubusercontent.com/u/948922?v=4", "profile": "https://nicolasquiroz.com", - "contributions": ["code", "bug"] + "contributions": [ + "code", + "bug" + ] }, { "login": "wolz-CODElife", "name": "wolz-CODElife", "avatar_url": "https://avatars.githubusercontent.com/u/55518764?v=4", "profile": "http://wolzcodelife.web.app", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "minaessam2015", "name": "Mina Essam", "avatar_url": "https://avatars.githubusercontent.com/u/13814552?v=4", "profile": "https://github.com/minaessam2015", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Choi-Jinhong", "name": "GNONG", "avatar_url": "https://avatars.githubusercontent.com/u/65050483?v=4", "profile": "https://jinhongdev.tistory.com/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "spilehchiha", "name": "Sina Pilehchiha", "avatar_url": "https://avatars.githubusercontent.com/u/46059077?v=4", "profile": "https://github.com/spilehchiha", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "theexoticman", "name": "thefrenchbrazilianguy", "avatar_url": "https://avatars.githubusercontent.com/u/10594609?v=4", "profile": "https://github.com/theexoticman", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "nativeanish", "name": "Anish Gupta", "avatar_url": "https://avatars.githubusercontent.com/u/15274388?v=4", "profile": "http://nativeanish.tech", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "dev-matthew", "name": "Matthew", "avatar_url": "https://avatars.githubusercontent.com/u/80741503?v=4", "profile": "https://github.com/dev-matthew", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "JustynaBroniszewska", "name": "Justyna Broniszewska", "avatar_url": "https://avatars.githubusercontent.com/u/33961199?v=4", "profile": "https://github.com/JustynaBroniszewska", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "yanil3500", "name": "Elyanil Liranzo-Castro", "avatar_url": "https://avatars.githubusercontent.com/u/11803254?v=4", "profile": "https://github.com/yanil3500", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "LichuAcu", "name": "Lichu Acuña", "avatar_url": "https://avatars.githubusercontent.com/u/54295410?v=4", "profile": "https://www.linkedin.com/in/lisandroea/?locale=en_US", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "avcdsld", "name": "Takamasa Arakawa", "avatar_url": "https://avatars.githubusercontent.com/u/10495516?v=4", "profile": "https://github.com/avcdsld", - "contributions": ["code", "bug"] + "contributions": [ + "code", + "bug" + ] }, { "login": "skaunov", "name": "skaunov", "avatar_url": "https://avatars.githubusercontent.com/u/65976143?v=4", "profile": "https://github.com/skaunov", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "pcowgill", "name": "Paul Cowgill", "avatar_url": "https://avatars.githubusercontent.com/u/2731712?v=4", "profile": "https://paulcowgill.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "zjiekai", "name": "zjiekai", "avatar_url": "https://avatars.githubusercontent.com/u/1871071?v=4", "profile": "https://github.com/zjiekai", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "WiiCoder", "name": "wii u", "avatar_url": "https://avatars.githubusercontent.com/u/65171537?v=4", "profile": "https://github.com/WiiCoder", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "MonsieurDMA", "name": "MonsieurDMA", "avatar_url": "https://avatars.githubusercontent.com/u/92155252?v=4", "profile": "https://github.com/MonsieurDMA", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "fennar01", "name": "fennar01", "avatar_url": "https://avatars.githubusercontent.com/u/42185291?v=4", "profile": "https://github.com/fennar01", - "contributions": ["ideas", "doc"] + "contributions": [ + "ideas", + "doc" + ] }, { "login": "WilliamWelsh", "name": "William", "avatar_url": "https://avatars.githubusercontent.com/u/16886888?v=4", "profile": "https://williamalanwelsh.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "motemotech", "name": "motemotech", "avatar_url": "https://avatars.githubusercontent.com/u/59491191?v=4", "profile": "https://github.com/motemotech", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Mousticke", "name": "mousticke.eth", "avatar_url": "https://avatars.githubusercontent.com/u/16734238?v=4", "profile": "https://github.com/Mousticke", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "brightiron", "name": "brightiron", "avatar_url": "https://avatars.githubusercontent.com/u/95196612?v=4", "profile": "https://github.com/brightiron", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "modernxpunk", "name": "oleksandrkovalskiy", "avatar_url": "https://avatars.githubusercontent.com/u/65621247?v=4", "profile": "https://github.com/modernxpunk", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "yoshikouki", "name": "yoshikouki", "avatar_url": "https://avatars.githubusercontent.com/u/53972292?v=4", "profile": "http://yoshikouki.com", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "graz-network", "name": "Graz Network", "avatar_url": "https://avatars.githubusercontent.com/u/102697012?v=4", "profile": "http://graz.network", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "cryptoversidad", "name": "Cryptoversidad", "avatar_url": "https://avatars.githubusercontent.com/u/107050863?v=4", "profile": "https://www.youtube.com/c/Cryptoversidad", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "disconnect3d", "name": "Disconnect3d", "avatar_url": "https://avatars.githubusercontent.com/u/10009354?v=4", "profile": "https://disconnect3d.pl/", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "setgree", "name": "Seth Ariel Green", "avatar_url": "https://avatars.githubusercontent.com/u/9850322?v=4", "profile": "http://setharielgreen.com", - "contributions": ["doc", "content"] + "contributions": [ + "doc", + "content" + ] }, { "login": "lcalixxto", "name": "Luisa Calixto", "avatar_url": "https://avatars.githubusercontent.com/u/98348072?v=4", "profile": "https://www.linkedin.com/in/lcalixxto/", - "contributions": ["doc", "content"] + "contributions": [ + "doc", + "content" + ] }, { "login": "theanneli", "name": "theanneli", "avatar_url": "https://avatars.githubusercontent.com/u/106612248?v=4", "profile": "https://github.com/theanneli", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "deric-alchemy", "name": "Deric | Alchemy", "avatar_url": "https://avatars.githubusercontent.com/u/59844056?v=4", "profile": "https://www.linkedin.com/in/dericcheng/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Ahmetbasli", "name": "Ahmetbasli", "avatar_url": "https://avatars.githubusercontent.com/u/68350525?v=4", "profile": "https://github.com/Ahmetbasli", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "dalmau", "name": "Jordi Pascual", "avatar_url": "https://avatars.githubusercontent.com/u/7261873?v=4", "profile": "https://github.com/dalmau", - "contributions": ["translation", "bug", "doc"] + "contributions": [ + "translation", + "bug", + "doc" + ] }, { "login": "amithkk", "name": "Amith KK", "avatar_url": "https://avatars.githubusercontent.com/u/1029727?v=4", "profile": "http://amithkk.github.io", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "ArpitIngle", "name": "Arpit Ingle", "avatar_url": "https://avatars.githubusercontent.com/u/37828045?v=4", "profile": "https://github.com/ArpitIngle", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Seek4samurai", "name": "Gourav Singh Rawat", "avatar_url": "https://avatars.githubusercontent.com/u/69115613?v=4", "profile": "https://seek4samurai.vercel.app/", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "jonasbostoen", "name": "mempirate", "avatar_url": "https://avatars.githubusercontent.com/u/32879610?v=4", "profile": "https://netbound.io", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "Barukimang", "name": "Barukimang", "avatar_url": "https://avatars.githubusercontent.com/u/16764792?v=4", "profile": "https://github.com/Barukimang", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "kuzdogan", "name": "Kaan Uzdoğan", "avatar_url": "https://avatars.githubusercontent.com/u/13069972?v=4", "profile": "http://kaanuzdogan.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "NiloCK", "name": "Colin Kennedy", "avatar_url": "https://avatars.githubusercontent.com/u/10780590?v=4", "profile": "https://github.com/NiloCK", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "TimGrey998", "name": "XOF", "avatar_url": "https://avatars.githubusercontent.com/u/57596934?v=4", "profile": "https://github.com/TimGrey998", - "contributions": ["doc", "translation", "bug"] + "contributions": [ + "doc", + "translation", + "bug" + ] }, { "login": "ManuKashyap01", "name": "Manu kashyap", "avatar_url": "https://avatars.githubusercontent.com/u/76866512?v=4", "profile": "https://github.com/ManuKashyap01", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "arjenzhou", "name": "Zhou Yang", "avatar_url": "https://avatars.githubusercontent.com/u/23600703?v=4", "profile": "http://arjenzhou.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "burningtree", "name": "tree", "avatar_url": "https://avatars.githubusercontent.com/u/67269?v=4", "profile": "https://keybase.io/tree", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "StephenFluin", "name": "Stephen Fluin", "avatar_url": "https://avatars.githubusercontent.com/u/165056?v=4", "profile": "https://github.com/StephenFluin", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "hakuta", "name": "hakuta", "avatar_url": "https://avatars.githubusercontent.com/u/806605?v=4", "profile": "https://github.com/hakuta", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "MiloBowman", "name": "MiloBowman", "avatar_url": "https://avatars.githubusercontent.com/u/104447804?v=4", "profile": "https://github.com/MiloBowman", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "tadeodao", "name": "tadeo", "avatar_url": "https://avatars.githubusercontent.com/u/94108039?v=4", "profile": "https://github.com/tadeodao", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "creacodigos", "name": "Jorge Santana", "avatar_url": "https://avatars.githubusercontent.com/u/50615503?v=4", "profile": "http://creacodigos.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "rolodexter", "name": "rolodexter", "avatar_url": "https://avatars.githubusercontent.com/u/977925?v=4", "profile": "http://www.rolodexter1.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "RanchHowards", "name": "RanchHowards", "avatar_url": "https://avatars.githubusercontent.com/u/69303624?v=4", "profile": "https://github.com/RanchHowards", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "didoshotev", "name": "Deyan Shotev", "avatar_url": "https://avatars.githubusercontent.com/u/62618421?v=4", "profile": "https://github.com/didoshotev", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "PraneshASP", "name": "Pranesh A S", "avatar_url": "https://avatars.githubusercontent.com/u/42379522?v=4", "profile": "https://github.com/PraneshASP", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "shir22", "name": "shir22", "avatar_url": "https://avatars.githubusercontent.com/u/33841818?v=4", "profile": "https://github.com/shir22", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "nikashitsa", "name": "Nikita Verkhovin", "avatar_url": "https://avatars.githubusercontent.com/u/1029908?v=4", "profile": "https://github.com/nikashitsa", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "pushkar2112", "name": "Pushkar Verma", "avatar_url": "https://avatars.githubusercontent.com/u/50198312?v=4", "profile": "https://pushkarverma.dev", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "vincentweisser", "name": "Vincent Weisser", "avatar_url": "https://avatars.githubusercontent.com/u/32839303?v=4", "profile": "http://vincentweisser.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "koogawa", "name": "Kosuke Ogawa", "avatar_url": "https://avatars.githubusercontent.com/u/893643?v=4", "profile": "http://www.koogawa.com", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "Feerol", "name": "Fatih Eren Erol", "avatar_url": "https://avatars.githubusercontent.com/u/47645405?v=4", "profile": "https://github.com/Feerol", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "olalonde", "name": "Oli Lalonde", "avatar_url": "https://avatars.githubusercontent.com/u/416585?v=4", "profile": "https://syskall.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "gingerheart86", "name": "gingerheart86", "avatar_url": "https://avatars.githubusercontent.com/u/100948227?v=4", "profile": "https://github.com/gingerheart86", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "naveen106", "name": "Naveen Kumar", "avatar_url": "https://avatars.githubusercontent.com/u/61573478?v=4", "profile": "https://github.com/naveen106", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "treethought", "name": "Cam Sweeney", "avatar_url": "https://avatars.githubusercontent.com/u/15894818?v=4", "profile": "https://github.com/treethought", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "moyedx3", "name": "moyed", "avatar_url": "https://avatars.githubusercontent.com/u/108647630?v=4", "profile": "https://github.com/moyedx3", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "shelleyolivia", "name": "shelleyolivia", "avatar_url": "https://avatars.githubusercontent.com/u/108895606?v=4", "profile": "https://github.com/shelleyolivia", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "zyjblockchain", "name": "Sandy", "avatar_url": "https://avatars.githubusercontent.com/u/40423181?v=4", "profile": "http://sandyzhou911@gmail.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "NachoRoizman", "name": "NachoRoizman", "avatar_url": "https://avatars.githubusercontent.com/u/107893772?v=4", "profile": "https://github.com/NachoRoizman", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "M-Ivan", "name": "Iván Miragaya", "avatar_url": "https://avatars.githubusercontent.com/u/72365253?v=4", "profile": "https://linkedin.com/in/miragaya-ivan", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "smejak", "name": "Jakub Smékal", "avatar_url": "https://avatars.githubusercontent.com/u/20759274?v=4", "profile": "https://github.com/smejak", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "chendatony31", "name": "Tony Chen", "avatar_url": "https://avatars.githubusercontent.com/u/2173383?v=4", "profile": "https://tokenpocket.pro", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "metalc", "name": "metalc", "avatar_url": "https://avatars.githubusercontent.com/u/102876192?v=4", "profile": "https://github.com/metalc", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Tuongg2312", "name": "Tuongg2312", "avatar_url": "https://avatars.githubusercontent.com/u/107551539?v=4", "profile": "https://github.com/Tuongg2312", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ErikSaunier", "name": "Ξrik Saunier", "avatar_url": "https://avatars.githubusercontent.com/u/1122363?v=4", "profile": "https://github.com/ErikSaunier", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "vorot93", "name": "Artem Vorotnikov", "avatar_url": "https://avatars.githubusercontent.com/u/240364?v=4", "profile": "https://github.com/vorot93", - "contributions": ["content", "projectManagement", "question"] + "contributions": [ + "content", + "projectManagement", + "question" + ] }, { "login": "liam0215", "name": "Liam Arzola", "avatar_url": "https://avatars.githubusercontent.com/u/8989334?v=4", "profile": "https://github.com/liam0215", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "srt180", "name": "shao", "avatar_url": "https://avatars.githubusercontent.com/u/30768686?v=4", "profile": "https://github.com/srt180", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "HiroyukiNaito", "name": "Hiroyuki Naito", "avatar_url": "https://avatars.githubusercontent.com/u/32320988?v=4", "profile": "https://crowdin.com/profile/hiroyukinaito", - "contributions": ["doc", "maintenance"] + "contributions": [ + "doc", + "maintenance" + ] }, { "login": "AlehNat", "name": "AlehN", "avatar_url": "https://avatars.githubusercontent.com/u/3587775?v=4", "profile": "https://github.com/AlehNat", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "varunshenoy", "name": "Varun Shenoy", "avatar_url": "https://avatars.githubusercontent.com/u/10859091?v=4", "profile": "http://varunshenoy.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "alebaffa", "name": "Alessandro Baffa", "avatar_url": "https://avatars.githubusercontent.com/u/465513?v=4", "profile": "https://alebaffa.eth.link", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "johngrantuk", "name": "John Grant", "avatar_url": "https://avatars.githubusercontent.com/u/4797222?v=4", "profile": "https://medium.com/@johngrant", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "gorondan", "name": "gorondan", "avatar_url": "https://avatars.githubusercontent.com/u/97026899?v=4", "profile": "https://github.com/gorondan", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "pruthvirajjadhav1", "name": "Pruthviraj Jadhav", "avatar_url": "https://avatars.githubusercontent.com/u/73253354?v=4", "profile": "https://github.com/pruthvirajjadhav1", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "gndx", "name": "Oscar Barajas Tavares", "avatar_url": "https://avatars.githubusercontent.com/u/10554486?v=4", "profile": "https://gndx.io", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "LucidSamuel", "name": "Samuel Akinosho", "avatar_url": "https://avatars.githubusercontent.com/u/39565075?v=4", "profile": "http://www.samuelakinosho.com", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "OdairTrujillo", "name": "Odair Augusto Trujillo Orozco", "avatar_url": "https://avatars.githubusercontent.com/u/45074733?v=4", "profile": "https://odair.dev", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "Unforkable", "name": "Unforkable", "avatar_url": "https://avatars.githubusercontent.com/u/86481149?v=4", "profile": "https://github.com/Unforkable", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Rodrigolvc", "name": "Rodrigo vasquez", "avatar_url": "https://avatars.githubusercontent.com/u/108540208?v=4", "profile": "https://github.com/Rodrigolvc", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "michaelmccallam", "name": "Michael McCallam", "avatar_url": "https://avatars.githubusercontent.com/u/3510607?v=4", "profile": "https://github.com/michaelmccallam", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "PolinaShanti", "name": "Polina G.", "avatar_url": "https://avatars.githubusercontent.com/u/110098268?v=4", "profile": "https://nownodes.io/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Cerebro92", "name": "Neeraj Gahlot", "avatar_url": "https://avatars.githubusercontent.com/u/13215478?v=4", "profile": "https://github.com/Cerebro92", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "vrinek", "name": "Kostas", "avatar_url": "https://avatars.githubusercontent.com/u/81346?v=4", "profile": "https://github.com/vrinek", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "rogueassasin1729", "name": "rogueassasin1729", "avatar_url": "https://avatars.githubusercontent.com/u/92800000?v=4", "profile": "https://github.com/rogueassasin1729", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Pandapip1", "name": "Pandapip1", "avatar_url": "https://avatars.githubusercontent.com/u/45835846?v=4", "profile": "https://pandapip1.com/", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "Aldizh", "name": "Aldi Zhupani", "avatar_url": "https://avatars.githubusercontent.com/u/2282120?v=4", "profile": "http://aldizh.github.io/", - "contributions": ["bug", "code"] + "contributions": [ + "bug", + "code" + ] }, { "login": "linhuatan", "name": "linhuatan", "avatar_url": "https://avatars.githubusercontent.com/u/94831627?v=4", "profile": "https://github.com/linhuatan", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "hughcrt", "name": "Hugh", "avatar_url": "https://avatars.githubusercontent.com/u/24587702?v=4", "profile": "http://hugh.sh", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "z3zzz", "name": "Kim Kwangtae", "avatar_url": "https://avatars.githubusercontent.com/u/91174156?v=4", "profile": "https://github.com/z3zzz", - "contributions": ["content", "ideas"] + "contributions": [ + "content", + "ideas" + ] }, { "login": "tobi4021", "name": "tobi4021", "avatar_url": "https://avatars.githubusercontent.com/u/84390698?v=4", "profile": "https://github.com/tobi4021", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "lonelyotter", "name": "Haochen Song", "avatar_url": "https://avatars.githubusercontent.com/u/57280827?v=4", "profile": "https://github.com/lonelyotter", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "opensourcex123", "name": "N Fx", "avatar_url": "https://avatars.githubusercontent.com/u/73230562?v=4", "profile": "https://github.com/opensourcex123", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "srhinee", "name": "samsara", "avatar_url": "https://avatars.githubusercontent.com/u/29331203?v=4", "profile": "https://github.com/srhinee", - "contributions": ["doc", "bug", "translation"] + "contributions": [ + "doc", + "bug", + "translation" + ] }, { "login": "greefea", "name": "greefea", "avatar_url": "https://avatars.githubusercontent.com/u/106492500?v=4", "profile": "https://github.com/greefea", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "parotax", "name": "parotax", "avatar_url": "https://avatars.githubusercontent.com/u/86522055?v=4", "profile": "https://github.com/parotax", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "vinhloc30796", "name": "Loc Nguyen", "avatar_url": "https://avatars.githubusercontent.com/u/19675202?v=4", "profile": "https://linkedin.com/in/vinhloc30796", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "north-vanhooser", "name": "north-vanhooser", "avatar_url": "https://avatars.githubusercontent.com/u/86130010?v=4", "profile": "https://github.com/north-vanhooser", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "othaime-en", "name": "othaime-en", "avatar_url": "https://avatars.githubusercontent.com/u/61498231?v=4", "profile": "https://github.com/othaime-en", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "fleischi-svr", "name": "Cronos", "avatar_url": "https://avatars.githubusercontent.com/u/79516944?v=4", "profile": "https://github.com/fleischi-svr", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "MicahZoltu", "name": "Micah Zoltu", "avatar_url": "https://avatars.githubusercontent.com/u/886059?v=4", "profile": "https://github.com/MicahZoltu", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Aracki", "name": "Ivan Aracki", "avatar_url": "https://avatars.githubusercontent.com/u/6129986?v=4", "profile": "https://www.aracki.me", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "always0e0w", "name": "屠虫少年", "avatar_url": "https://avatars.githubusercontent.com/u/64178062?v=4", "profile": "https://alphabeta.top/", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "RamanSB", "name": "Ramandeep", "avatar_url": "https://avatars.githubusercontent.com/u/13969478?v=4", "profile": "http://stackoverflow.com/users/5062825/ramansb", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "vvladd", "name": "Vlad Kokhan", "avatar_url": "https://avatars.githubusercontent.com/u/13506999?v=4", "profile": "https://github.com/vvladd", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "SavPhill", "name": "Phill", "avatar_url": "https://avatars.githubusercontent.com/u/38789408?v=4", "profile": "https://github.com/SavPhill", - "contributions": ["content", "doc", "code"] + "contributions": [ + "content", + "doc", + "code" + ] }, { "login": "camerondurham", "name": "cam", "avatar_url": "https://avatars.githubusercontent.com/u/17013462?v=4", "profile": "http://u64.cam", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "calumtomeny", "name": "calumtomeny", "avatar_url": "https://avatars.githubusercontent.com/u/939917?v=4", "profile": "https://github.com/calumtomeny", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "robertu7", "name": "robertu", "avatar_url": "https://avatars.githubusercontent.com/u/4065233?v=4", "profile": "https://robertu7.github.io/", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "ldlsalazar", "name": "Lorena De Leon Salazar", "avatar_url": "https://avatars.githubusercontent.com/u/112458077?v=4", "profile": "https://github.com/ldlsalazar", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "JAdams-eth", "name": "James Adams", "avatar_url": "https://avatars.githubusercontent.com/u/95427666?v=4", "profile": "https://akcela.co.uk", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "taiyangc", "name": "Eric Chen", "avatar_url": "https://avatars.githubusercontent.com/u/1467354?v=4", "profile": "https://github.com/taiyangc", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Colt-M1873", "name": "Van De Biao", "avatar_url": "https://avatars.githubusercontent.com/u/47551017?v=4", "profile": "https://github.com/Colt-M1873", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "srv-smn", "name": "Sourav Suman", "avatar_url": "https://avatars.githubusercontent.com/u/47235134?v=4", "profile": "https://github.com/srv-smn", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "ivpavici", "name": "Ivan Pavičić", "avatar_url": "https://avatars.githubusercontent.com/u/2848732?v=4", "profile": "https://github.com/ivpavici", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "Batxent", "name": "tommy", "avatar_url": "https://avatars.githubusercontent.com/u/7824431?v=4", "profile": "https://github.com/Batxent", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "martinyung", "name": "Martin Yung", "avatar_url": "https://avatars.githubusercontent.com/u/8136256?v=4", "profile": "https://medium.com/@martinyce", - "contributions": ["code", "translation"] + "contributions": [ + "code", + "translation" + ] }, { "login": "pankajjagtapp", "name": "Pankaj Jagtap", "avatar_url": "https://avatars.githubusercontent.com/u/89507661?v=4", "profile": "https://github.com/pankajjagtapp", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "hannsu", "name": "nulun", "avatar_url": "https://avatars.githubusercontent.com/u/20453231?v=4", "profile": "https://github.com/hannsu", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Denllay", "name": "Denllay", "avatar_url": "https://avatars.githubusercontent.com/u/75447714?v=4", "profile": "https://github.com/Denllay", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "yalexis-eth", "name": "yalexis.eth", "avatar_url": "https://avatars.githubusercontent.com/u/96504224?v=4", "profile": "http://yalexis.eth.xyz", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "smartprogrammer93", "name": "Ahmad Bitar", "avatar_url": "https://avatars.githubusercontent.com/u/33181301?v=4", "profile": "https://github.com/smartprogrammer93", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "carllippert", "name": "Carl Lippert", "avatar_url": "https://avatars.githubusercontent.com/u/16457876?v=4", "profile": "https://carllippert.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "tymtam2", "name": "Tymek Majewski", "avatar_url": "https://avatars.githubusercontent.com/u/1097613?v=4", "profile": "https://github.com/tymtam2", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Cryptolibertarian-id", "name": "Cryptolibertarian.id", "avatar_url": "https://avatars.githubusercontent.com/u/108990005?v=4", "profile": "http://cryptolibertarian.id", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "MahendraBishnoi29", "name": "browny", "avatar_url": "https://avatars.githubusercontent.com/u/74294202?v=4", "profile": "https://github.com/MahendraBishnoi29", - "contributions": ["ideas", "code", "bug"] + "contributions": [ + "ideas", + "code", + "bug" + ] }, { "login": "sandakersmann", "name": "Marius Kjærstad", "avatar_url": "https://avatars.githubusercontent.com/u/6118832?v=4", "profile": "https://github.com/sandakersmann", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "scottfits", "name": "Scott Fitsimones", "avatar_url": "https://avatars.githubusercontent.com/u/1193692?v=4", "profile": "http://scottfits.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "kryptopaul", "name": "Paul Lechocki", "avatar_url": "https://avatars.githubusercontent.com/u/87016182?v=4", "profile": "https://github.com/kryptopaul", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "justalike", "name": "justalike", "avatar_url": "https://avatars.githubusercontent.com/u/44633493?v=4", "profile": "https://github.com/justalike", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "grayliquid", "name": "grayliquid", "avatar_url": "https://avatars.githubusercontent.com/u/26670751?v=4", "profile": "http://l5d.li", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "MHMasoon", "name": "MohammadHosein Masoon", "avatar_url": "https://avatars.githubusercontent.com/u/63204823?v=4", "profile": "https://github.com/MHMasoon", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "patoshii", "name": "Patoshi", "avatar_url": "https://avatars.githubusercontent.com/u/381050?v=4", "profile": "https://www.xcubicle.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "joonspoon", "name": "June Clarke ", "avatar_url": "https://avatars.githubusercontent.com/u/302478?v=4", "profile": "https://www.jointheleague.org/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "slf188", "name": "菲利", "avatar_url": "https://avatars.githubusercontent.com/u/49417481?v=4", "profile": "https://huggingface.co/slf188", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "DamitusThyYeetus123", "name": "DamitusThyYeetus123", "avatar_url": "https://avatars.githubusercontent.com/u/108782125?v=4", "profile": "https://github.com/DamitusThyYeetus123", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "matusame", "name": "matusame", "avatar_url": "https://avatars.githubusercontent.com/u/97032288?v=4", "profile": "https://github.com/matusame", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "laurentlucian", "name": "Lohan", "avatar_url": "https://avatars.githubusercontent.com/u/33508364?v=4", "profile": "https://github.com/laurentlucian", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "marcellamalune", "name": "Marcella", "avatar_url": "https://avatars.githubusercontent.com/u/63505124?v=4", "profile": "https://github.com/marcellamalune", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "leontodd", "name": "Leon Todd", "avatar_url": "https://avatars.githubusercontent.com/u/8823227?v=4", "profile": "https://londonbustimes.com/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ladislasfontaine", "name": "Ladislas Fontaine", "avatar_url": "https://avatars.githubusercontent.com/u/42914253?v=4", "profile": "https://ladislasfontaine.com/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "YasshhYadav", "name": "Yash Yadav", "avatar_url": "https://avatars.githubusercontent.com/u/91071840?v=4", "profile": "https://github.com/YasshhYadav", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "barro32", "name": "barro", "avatar_url": "https://avatars.githubusercontent.com/u/1510990?v=4", "profile": "https://github.com/barro32", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Master7130", "name": "Master7130", "avatar_url": "https://avatars.githubusercontent.com/u/85327930?v=4", "profile": "https://github.com/Master7130", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Lude15", "name": "Lude15", "avatar_url": "https://avatars.githubusercontent.com/u/109084476?v=4", "profile": "https://github.com/Lude15", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "badkk", "name": "Luke Fan", "avatar_url": "https://avatars.githubusercontent.com/u/10335300?v=4", "profile": "https://crust.network", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "TABASCOatw", "name": "TABASCO", "avatar_url": "https://avatars.githubusercontent.com/u/84655644?v=4", "profile": "https://github.com/TABASCOatw", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "d1onys1us", "name": "d1onys1us", "avatar_url": "https://avatars.githubusercontent.com/u/13951458?v=4", "profile": "https://github.com/d1onys1us", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "thib-web3", "name": "Thibaut", "avatar_url": "https://avatars.githubusercontent.com/u/66329321?v=4", "profile": "https://github.com/thib-web3", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ImMiguelP", "name": "Miguel", "avatar_url": "https://avatars.githubusercontent.com/u/61770010?v=4", "profile": "https://github.com/ImMiguelP", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "rayzhudev", "name": "Ray Zhu", "avatar_url": "https://avatars.githubusercontent.com/u/20132960?v=4", "profile": "https://github.com/rayzhudev", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "BenedettiLucca", "name": "Lucca Benedetti", "avatar_url": "https://avatars.githubusercontent.com/u/108427035?v=4", "profile": "https://github.com/BenedettiLucca", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "MacMorgan", "name": "Mac Morgan", "avatar_url": "https://avatars.githubusercontent.com/u/17681?v=4", "profile": "http://www.printfly.com/", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "Aksa12", "name": "Aksa12", "avatar_url": "https://avatars.githubusercontent.com/u/41188167?v=4", "profile": "https://github.com/Aksa12", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "lawlesx", "name": "Aniruddha Sil", "avatar_url": "https://avatars.githubusercontent.com/u/52166437?v=4", "profile": "https://lawlesx.vercel.app/", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "bt3gl", "name": "♡", "avatar_url": "https://avatars.githubusercontent.com/u/1130416?v=4", "profile": "https://github.com/bt3gl", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "LuisUrrutia", "name": "Luis Sebastian Urrutia Fuentes", "avatar_url": "https://avatars.githubusercontent.com/u/3771248?v=4", "profile": "https://github.com/LuisUrrutia", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "jakubalsoori", "name": "jakubalsoori", "avatar_url": "https://avatars.githubusercontent.com/u/93258205?v=4", "profile": "https://github.com/jakubalsoori", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "wenceslas-sanchez", "name": "Wenceslas Sanchez", "avatar_url": "https://avatars.githubusercontent.com/u/85337624?v=4", "profile": "https://www.compassft.com/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Abyscuit", "name": "Marcus Escobedo", "avatar_url": "https://avatars.githubusercontent.com/u/36307949?v=4", "profile": "https://github.com/Abyscuit", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "fr33dr4g0n", "name": "fr33dr4g0n", "avatar_url": "https://avatars.githubusercontent.com/u/4492996?v=4", "profile": "https://workfromhomejobs.me/remote-developer-jobs/", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "codespirit7", "name": "Ritesh Singh", "avatar_url": "https://avatars.githubusercontent.com/u/88592710?v=4", "profile": "https://www.linkedin.com/in/ritesh-in/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "simonletort", "name": "Simon Letort", "avatar_url": "https://avatars.githubusercontent.com/u/367992?v=4", "profile": "https://www.linkedin.com/in/simonletort", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "AidanPine", "name": "AidanPine", "avatar_url": "https://avatars.githubusercontent.com/u/92037147?v=4", "profile": "https://github.com/AidanPine", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "christy-pdx", "name": "christy-pdx", "avatar_url": "https://avatars.githubusercontent.com/u/107286087?v=4", "profile": "https://github.com/christy-pdx", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "medardm", "name": "Medard Mandane", "avatar_url": "https://avatars.githubusercontent.com/u/20562573?v=4", "profile": "https://github.com/medardm", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "davydog187", "name": "Dave Lucia", "avatar_url": "https://avatars.githubusercontent.com/u/1019721?v=4", "profile": "https://davelucia.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "loicalbertin", "name": "Loïc Albertin", "avatar_url": "https://avatars.githubusercontent.com/u/872896?v=4", "profile": "https://github.com/loicalbertin", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "millecodex", "name": "Mille Codex", "avatar_url": "https://avatars.githubusercontent.com/u/39792005?v=4", "profile": "https://github.com/millecodex", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Gift-Stack", "name": "Gift Opia", "avatar_url": "https://avatars.githubusercontent.com/u/72243506?v=4", "profile": "https://github.com/Gift-Stack", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "dhirajgagrai", "name": "Dhiraj Gagrai", "avatar_url": "https://avatars.githubusercontent.com/u/22605432?v=4", "profile": "https://dhirajgagrai.dev/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "KurtMerbeth", "name": "KurtMerbeth", "avatar_url": "https://avatars.githubusercontent.com/u/22886639?v=4", "profile": "https://github.com/KurtMerbeth", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "EmperorRP", "name": "Sai Leela Rahul Pujari", "avatar_url": "https://avatars.githubusercontent.com/u/66853318?v=4", "profile": "https://github.com/EmperorRP", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "SkyWarrior123", "name": "SkyWarrior123", "avatar_url": "https://avatars.githubusercontent.com/u/102062194?v=4", "profile": "https://github.com/SkyWarrior123", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "yashovardhan", "name": "Yashovardhan Agrawal", "avatar_url": "https://avatars.githubusercontent.com/u/21066442?v=4", "profile": "http://yashovardhan.dev", - "contributions": ["data"] + "contributions": [ + "data" + ] }, { "login": "cheeky-gorilla", "name": "cheeky-gorilla", "avatar_url": "https://avatars.githubusercontent.com/u/76262359?v=4", "profile": "https://github.com/cheeky-gorilla", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ThreeMuskets12", "name": "Noah Page", "avatar_url": "https://avatars.githubusercontent.com/u/23061574?v=4", "profile": "https://github.com/ThreeMuskets12", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "oceans404", "name": "steph", "avatar_url": "https://avatars.githubusercontent.com/u/91382964?v=4", "profile": "https://github.com/oceans404", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "panieldark", "name": "Daniel Park", "avatar_url": "https://avatars.githubusercontent.com/u/21699995?v=4", "profile": "https://www.linkedin.com/in/itsdanielpark", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "knititwearit", "name": "knititwearit", "avatar_url": "https://avatars.githubusercontent.com/u/5172992?v=4", "profile": "https://github.com/knititwearit", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "ryandotsmith", "name": "Ryan Smith", "avatar_url": "https://avatars.githubusercontent.com/u/11726?v=4", "profile": "https://r.32k.io", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "vj-codes", "name": "Vaishnavi Joshi", "avatar_url": "https://avatars.githubusercontent.com/u/60894542?v=4", "profile": "https://vj-codes.github.io/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "jb-0", "name": "Jamie Barrett", "avatar_url": "https://avatars.githubusercontent.com/u/39060614?v=4", "profile": "https://github.com/jb-0", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "hyper0x", "name": "Renato", "avatar_url": "https://avatars.githubusercontent.com/u/315569?v=4", "profile": "https://github.com/hyper0x", - "contributions": ["content", "translation"] + "contributions": [ + "content", + "translation" + ] }, { "login": "frangio", "name": "Francisco", "avatar_url": "https://avatars.githubusercontent.com/u/481465?v=4", "profile": "https://frang.io", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "frankiefab100", "name": "Franklin Ohaegbulam", "avatar_url": "https://avatars.githubusercontent.com/u/46662771?v=4", "profile": "http://frankiefab.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "soos3d", "name": "Soos3D", "avatar_url": "https://avatars.githubusercontent.com/u/99700157?v=4", "profile": "https://github.com/soos3d", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "minhoryang", "name": "Minho Ryang", "avatar_url": "https://avatars.githubusercontent.com/u/1270855?v=4", "profile": "http://keybase.io/minhoryang", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "SebastianSupreme", "name": "Sebastian Supreme", "avatar_url": "https://avatars.githubusercontent.com/u/106926150?v=4", "profile": "https://sebastiansupreme.eth.link", - "contributions": ["ideas", "translation", "code"] + "contributions": [ + "ideas", + "translation", + "code" + ] }, { "login": "jhhornn", "name": "Awosise Oluwaseun", "avatar_url": "https://avatars.githubusercontent.com/u/66667958?v=4", "profile": "https://github.com/jhhornn", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Mahmadabid", "name": "Muhammad Ahmad", "avatar_url": "https://avatars.githubusercontent.com/u/75790323?v=4", "profile": "https://mahmad.netlify.app/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "this-oliver", "name": "Oliver", "avatar_url": "https://avatars.githubusercontent.com/u/32515201?v=4", "profile": "http://oliverrr.net", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "jiOnederfull", "name": "Jiwon Park", "avatar_url": "https://avatars.githubusercontent.com/u/48719289?v=4", "profile": "https://github.com/jiOnederfull", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ZandtLavish", "name": "Zandt Lavish", "avatar_url": "https://avatars.githubusercontent.com/u/99204971?v=4", "profile": "https://github.com/ZandtLavish", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "issa-me-sush", "name": "sushthecoda", "avatar_url": "https://avatars.githubusercontent.com/u/29679285?v=4", "profile": "https://github.com/issa-me-sush", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "LucasMartinCalderon", "name": "Lucas Martin Calderon", "avatar_url": "https://avatars.githubusercontent.com/u/25382998?v=4", "profile": "http://pentestify.io", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "crypto8893", "name": "crypto8893", "avatar_url": "https://avatars.githubusercontent.com/u/115051650?v=4", "profile": "https://github.com/crypto8893", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "victorpatru", "name": "Victor Patru", "avatar_url": "https://avatars.githubusercontent.com/u/102596893?v=4", "profile": "http://victorpatru.xyz", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "vaishnav-mk", "name": "wishee", "avatar_url": "https://avatars.githubusercontent.com/u/84540554?v=4", "profile": "https://vaishnav.tech", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Harshil-Gupta", "name": "Harshil Gupta", "avatar_url": "https://avatars.githubusercontent.com/u/53968071?v=4", "profile": "https://github.com/Harshil-Gupta", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "vanshika-srivastava", "name": "Vanshika Srivastava", "avatar_url": "https://avatars.githubusercontent.com/u/76511019?v=4", "profile": "https://github.com/vanshika-srivastava", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "shariqanwar20", "name": "Shariq Anwar", "avatar_url": "https://avatars.githubusercontent.com/u/61353122?v=4", "profile": "https://github.com/shariqanwar20", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "giorgionocera", "name": "Giorgio Nocera", "avatar_url": "https://avatars.githubusercontent.com/u/13519292?v=4", "profile": "https://github.com/giorgionocera", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "alexeevcc", "name": "Dmitry Alexeev", "avatar_url": "https://avatars.githubusercontent.com/u/61043916?v=4", "profile": "https://cyberacademy.dev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "af-afk", "name": "Alex", "avatar_url": "https://avatars.githubusercontent.com/u/71931113?v=4", "profile": "https://github.com/af-afk", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "benlazzero", "name": "benlazzero", "avatar_url": "https://avatars.githubusercontent.com/u/85390423?v=4", "profile": "https://github.com/benlazzero", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ankitzm", "name": "Ankit Singh", "avatar_url": "https://avatars.githubusercontent.com/u/66105983?v=4", "profile": "https://github.com/ankitzm", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "mhairimcalpine", "name": "mhairimcalpine", "avatar_url": "https://avatars.githubusercontent.com/u/76955258?v=4", "profile": "https://github.com/mhairimcalpine", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "itsthedoom", "name": "William Doom", "avatar_url": "https://avatars.githubusercontent.com/u/32095408?v=4", "profile": "https://github.com/itsthedoom", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "AsheBarrett", "name": "AsheBarrett", "avatar_url": "https://avatars.githubusercontent.com/u/117123553?v=4", "profile": "https://github.com/AsheBarrett", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "Hitisha-G", "name": "Hitishaa", "avatar_url": "https://avatars.githubusercontent.com/u/89304585?v=4", "profile": "https://github.com/Hitisha-G", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "srustagi", "name": "Shiv Rustagi", "avatar_url": "https://avatars.githubusercontent.com/u/11203724?v=4", "profile": "https://github.com/srustagi", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "douglasmakey", "name": "Douglas Makey Mendez Molero", "avatar_url": "https://avatars.githubusercontent.com/u/8400576?v=4", "profile": "https://www.kungfudev.com/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ameeetgaikwad", "name": "Amit Gaikwad", "avatar_url": "https://avatars.githubusercontent.com/u/76063569?v=4", "profile": "https://github.com/ameeetgaikwad", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "EridianAlpha", "name": "Eridian", "avatar_url": "https://avatars.githubusercontent.com/u/86061486?v=4", "profile": "https://github.com/EridianAlpha", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "bobbyg603", "name": "Bobby Galli", "avatar_url": "https://avatars.githubusercontent.com/u/2646053?v=4", "profile": "http://bobbyg603.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "flanagansteve", "name": "flanagansteve", "avatar_url": "https://avatars.githubusercontent.com/u/32844300?v=4", "profile": "https://github.com/flanagansteve", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "owenHwang", "name": "Owen Hwang", "avatar_url": "https://avatars.githubusercontent.com/u/112543777?v=4", "profile": "https://github.com/owenHwang", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "florath", "name": "Andreas Florath", "avatar_url": "https://avatars.githubusercontent.com/u/11856543?v=4", "profile": "https://github.com/florath", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "dgcoffman", "name": "Daniel Coffman", "avatar_url": "https://avatars.githubusercontent.com/u/1711204?v=4", "profile": "http://dancoffman.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Amit0617", "name": "AMIT KUMAR MISHRA", "avatar_url": "https://avatars.githubusercontent.com/u/71893015?v=4", "profile": "https://github.com/Amit0617", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Saksham010", "name": "Saksham Thapa", "avatar_url": "https://avatars.githubusercontent.com/u/56692835?v=4", "profile": "https://github.com/Saksham010", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "vjgaur", "name": "Vijayendra Gaur", "avatar_url": "https://avatars.githubusercontent.com/u/1871257?v=4", "profile": "https://github.com/vjgaur", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "nocibambi", "name": "András Novoszáth", "avatar_url": "https://avatars.githubusercontent.com/u/8539674?v=4", "profile": "https://www.linkedin.com/in/andrasnovoszath/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "SahilAujla", "name": "Sahil Aujla", "avatar_url": "https://avatars.githubusercontent.com/u/83442423?v=4", "profile": "http://sahilaujla.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "ritave", "name": "Olaf Tomalka", "avatar_url": "https://avatars.githubusercontent.com/u/1614945?v=4", "profile": "https://github.com/ritave", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "armgp", "name": "Abhiram G P", "avatar_url": "https://avatars.githubusercontent.com/u/49094298?v=4", "profile": "https://github.com/armgp", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "aelmanaa", "name": "Amine E.", "avatar_url": "https://avatars.githubusercontent.com/u/4503543?v=4", "profile": "https://github.com/aelmanaa", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Roshan-R", "name": "Roshan R Chandar", "avatar_url": "https://avatars.githubusercontent.com/u/43182697?v=4", "profile": "https://roshan.ml/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "mossow", "name": "mossow", "avatar_url": "https://avatars.githubusercontent.com/u/9072132?v=4", "profile": "https://github.com/mossow", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "OpenWJY", "name": "yujingwei", "avatar_url": "https://avatars.githubusercontent.com/u/29328336?v=4", "profile": "https://github.com/OpenWJY", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Olshansk", "name": "Daniel Olshansky", "avatar_url": "https://avatars.githubusercontent.com/u/1892194?v=4", "profile": "http://olshansky.info", - "contributions": ["doc", "ideas"] + "contributions": [ + "doc", + "ideas" + ] }, { "login": "aguzmant103", "name": "aguzmant103", "avatar_url": "https://avatars.githubusercontent.com/u/67167307?v=4", "profile": "https://github.com/aguzmant103", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "soheil555", "name": "Soheil", "avatar_url": "https://avatars.githubusercontent.com/u/22212139?v=4", "profile": "https://soheil.vercel.app/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "metadiver", "name": "metadiver.eth", "avatar_url": "https://avatars.githubusercontent.com/u/75746881?v=4", "profile": "http://linktr.ee/metadiver", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "nuclearfalcon", "name": "Jacob", "avatar_url": "https://avatars.githubusercontent.com/u/12568736?v=4", "profile": "https://github.com/nuclearfalcon", - "contributions": ["ideas", "doc"] + "contributions": [ + "ideas", + "doc" + ] }, { "login": "theSamPadilla", "name": "Sam Padilla", "avatar_url": "https://avatars.githubusercontent.com/u/35386211?v=4", "profile": "https://github.com/theSamPadilla", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "terasum", "name": "Chen Quan", "avatar_url": "https://avatars.githubusercontent.com/u/20042193?v=4", "profile": "https://chenquan.me", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "Marcelixoo", "name": "Marcelo T. dos Santos", "avatar_url": "https://avatars.githubusercontent.com/u/29285152?v=4", "profile": "http://marcelixoo.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "NoahSchick", "name": "NoahSchick", "avatar_url": "https://avatars.githubusercontent.com/u/43729013?v=4", "profile": "https://github.com/NoahSchick", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Joeysantoro", "name": "Joey", "avatar_url": "https://avatars.githubusercontent.com/u/31974730?v=4", "profile": "https://github.com/Joeysantoro", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "AnnaNodes", "name": "AnnaNodes", "avatar_url": "https://avatars.githubusercontent.com/u/117726964?v=4", "profile": "https://github.com/AnnaNodes", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "yash251", "name": "Yash Jagtap", "avatar_url": "https://avatars.githubusercontent.com/u/47234407?v=4", "profile": "https://yashjagtap.netlify.app", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "gzanitti", "name": "Gastón Zanitti", "avatar_url": "https://avatars.githubusercontent.com/u/1610461?v=4", "profile": "https://github.com/gzanitti", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "danceratopz", "name": "Dan", "avatar_url": "https://avatars.githubusercontent.com/u/91727015?v=4", "profile": "https://github.com/danceratopz", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Dev-Liz", "name": "Elizabeth Bassey", "avatar_url": "https://avatars.githubusercontent.com/u/40176275?v=4", "profile": "https://dribbble.com/Liz-B", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mihaic01", "name": "mihaic01", "avatar_url": "https://avatars.githubusercontent.com/u/108999659?v=4", "profile": "https://github.com/mihaic01", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "qiuhaohao", "name": "qiuhaohao", "avatar_url": "https://avatars.githubusercontent.com/u/22148367?v=4", "profile": "https://github.com/qiuhaohao", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "debeldami", "name": "damilola debel", "avatar_url": "https://avatars.githubusercontent.com/u/44111962?v=4", "profile": "https://github.com/debeldami", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "SaratAngajalaoffl", "name": "Sarat Angajala", "avatar_url": "https://avatars.githubusercontent.com/u/60383339?v=4", "profile": "https://github.com/SaratAngajalaoffl", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "questions", "name": "questions", "avatar_url": "https://avatars.githubusercontent.com/u/3233328?v=4", "profile": "https://github.com/Questions", - "contributions": ["projectManagement", "question"] + "contributions": [ + "projectManagement", + "question" + ] }, { "login": "machin3boy", "name": "machin3boy", "avatar_url": "https://avatars.githubusercontent.com/u/78896694?v=4", "profile": "https://github.com/machin3boy", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nsexer", "name": "nethan", "avatar_url": "https://avatars.githubusercontent.com/u/30265113?v=4", "profile": "https://github.com/nsexer", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "MrJithil", "name": "Jithil P Ponnan", "avatar_url": "https://avatars.githubusercontent.com/u/26359740?v=4", "profile": "https://www.linkedin.com/in/jithil", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "chocolatesuit", "name": "chocolatesuit", "avatar_url": "https://avatars.githubusercontent.com/u/120116662?v=4", "profile": "https://github.com/chocolatesuit", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "apinanyogaratnam", "name": "Apinan Yogaratnam", "avatar_url": "https://avatars.githubusercontent.com/u/72412733?v=4", "profile": "http://apinanyogaratnam.github.io/my-personal-website-v2.0/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "trevorsc19", "name": "trevorsc19", "avatar_url": "https://avatars.githubusercontent.com/u/30576577?v=4", "profile": "http://trevorscanlon.eth.xyz", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "thouravi", "name": "ImThour", "avatar_url": "https://avatars.githubusercontent.com/u/15676184?v=4", "profile": "https://github.com/thouravi", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "nvitorovic", "name": "Nenad Vitorović", "avatar_url": "https://avatars.githubusercontent.com/u/3808837?v=4", "profile": "https://github.com/nvitorovic", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "danierod", "name": "danierod", "avatar_url": "https://avatars.githubusercontent.com/u/12255235?v=4", "profile": "https://github.com/danierod", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "siddtheone", "name": "siddtheone", "avatar_url": "https://avatars.githubusercontent.com/u/45398971?v=4", "profile": "https://github.com/siddtheone", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ShawkiS", "name": "Shawki Sukkar", "avatar_url": "https://avatars.githubusercontent.com/u/57439827?v=4", "profile": "http://shawkisukkar.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "therealharpaljadeja", "name": "Harpal Jadeja", "avatar_url": "https://avatars.githubusercontent.com/u/38040789?v=4", "profile": "https://github.com/therealharpaljadeja", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "zlog-in", "name": "Zion", "avatar_url": "https://avatars.githubusercontent.com/u/67903793?v=4", "profile": "http://www.zlog.in", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "azpwnz", "name": "Andriy Zhuk", "avatar_url": "https://avatars.githubusercontent.com/u/6987007?v=4", "profile": "https://github.com/azpwnz", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "gooseri", "name": "gooser.eth", "avatar_url": "https://avatars.githubusercontent.com/u/121782105?v=4", "profile": "https://etherscan.io/address/gooser.eth", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "feibowei", "name": "feibowei", "avatar_url": "https://avatars.githubusercontent.com/u/69777448?v=4", "profile": "https://github.com/feibowei", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mesquitaoliveira", "name": "Mesquita Oliveira", "avatar_url": "https://avatars.githubusercontent.com/u/92008139?v=4", "profile": "https://github.com/mesquitaoliveira", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Juancamp1987", "name": "Juan José Giraldo", "avatar_url": "https://avatars.githubusercontent.com/u/91024217?v=4", "profile": "http://www.juanjosegiraldo.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Ash20pk", "name": "Ash@metaschool", "avatar_url": "https://avatars.githubusercontent.com/u/86375577?v=4", "profile": "https://github.com/Ash20pk", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "t-rutten", "name": "Tom Rutten", "avatar_url": "https://avatars.githubusercontent.com/u/1389793?v=4", "profile": "https://github.com/t-rutten", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "chawyehsu", "name": "Chawye Hsu", "avatar_url": "https://avatars.githubusercontent.com/u/5764917?v=4", "profile": "http://chawyehsu.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "MateusTP", "name": "Mateus Pimenta", "avatar_url": "https://avatars.githubusercontent.com/u/59940545?v=4", "profile": "https://github.com/MateusTP", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ezal", "name": "ezal", "avatar_url": "https://avatars.githubusercontent.com/u/6931328?v=4", "profile": "https://github.com/ezal", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "jarrodwatts", "name": "Jarrod Watts", "avatar_url": "https://avatars.githubusercontent.com/u/35651410?v=4", "profile": "https://jarrodwatts.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mlCode111", "name": "Miao", "avatar_url": "https://avatars.githubusercontent.com/u/34754144?v=4", "profile": "https://github.com/mlCode111", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ljiatu", "name": "Jiatu Liu", "avatar_url": "https://avatars.githubusercontent.com/u/3280973?v=4", "profile": "https://github.com/ljiatu", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "DeUETH", "name": "DeUETH", "avatar_url": "https://avatars.githubusercontent.com/u/107472460?v=4", "profile": "https://github.com/DeUETH", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "erin-at-work", "name": "erin-at-work", "avatar_url": "https://avatars.githubusercontent.com/u/50590950?v=4", "profile": "http://www.erinleelikes.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "AmazingAng", "name": "0xAA", "avatar_url": "https://avatars.githubusercontent.com/u/14728591?v=4", "profile": "https://github.com/AmazingAng", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "changwu-tw", "name": "changwu", "avatar_url": "https://avatars.githubusercontent.com/u/1557364?v=4", "profile": "https://changwu.me/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "uniyj", "name": "yj", "avatar_url": "https://avatars.githubusercontent.com/u/84749041?v=4", "profile": "http://uniyj.eth", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "megatheikal", "name": "megatheikal", "avatar_url": "https://avatars.githubusercontent.com/u/64621442?v=4", "profile": "https://megatheikal.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "stephenfire", "name": "Stephen Guo", "avatar_url": "https://avatars.githubusercontent.com/u/17247036?v=4", "profile": "https://github.com/stephenfire", - "contributions": ["translation"] + "contributions": [ + "translation" + ] }, { "login": "feuGeneA", "name": "F. Eugene Aumson", "avatar_url": "https://avatars.githubusercontent.com/u/7883777?v=4", "profile": "http://aumson.org/gene", - "contributions": ["bug", "content"] + "contributions": [ + "bug", + "content" + ] }, { "login": "rpalakkal", "name": "Roshan", "avatar_url": "https://avatars.githubusercontent.com/u/19766713?v=4", "profile": "https://github.com/rpalakkal", - "contributions": ["content", "code"] + "contributions": [ + "content", + "code" + ] }, { "login": "maxime216-pro", "name": "Maxime Dessez", "avatar_url": "https://avatars.githubusercontent.com/u/66296351?v=4", "profile": "http://maximedessez.fr", - "contributions": ["bug", "translation"] + "contributions": [ + "bug", + "translation" + ] }, { "login": "Tyler-233", "name": "Tyler-233", "avatar_url": "https://avatars.githubusercontent.com/u/44740396?v=4", "profile": "https://github.com/Tyler-233", - "contributions": ["translation", "content"] + "contributions": [ + "translation", + "content" + ] }, { "login": "neodaoist", "name": "neodaoist", "avatar_url": "https://avatars.githubusercontent.com/u/3170590?v=4", "profile": "http://neodaoist.xyz", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "atharvadeosthale", "name": "Atharva Deosthale", "avatar_url": "https://avatars.githubusercontent.com/u/11805367?v=4", "profile": "https://links.atharva.codes", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ckartik", "name": "Kartik Chopra", "avatar_url": "https://avatars.githubusercontent.com/u/13803371?v=4", "profile": "https://github.com/ckartik", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "BBashh", "name": "Bibash Tandon", "avatar_url": "https://avatars.githubusercontent.com/u/125178349?v=4", "profile": "https://github.com/BBashh", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "vaibhavtevatia", "name": "Vaibhav Tevatia", "avatar_url": "https://avatars.githubusercontent.com/u/86671961?v=4", "profile": "https://github.com/vaibhavtevatia", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "cnn-rnn", "name": "cnn-rnn", "avatar_url": "https://avatars.githubusercontent.com/u/44789658?v=4", "profile": "https://github.com/cnn-rnn", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "SahityaRoy", "name": "Sahitya Roy", "avatar_url": "https://avatars.githubusercontent.com/u/72821604?v=4", "profile": "https://www.linkedin.com/in/sahitya-roy-244b941a2/", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Keecointoken", "name": "KeeCoin", "avatar_url": "https://avatars.githubusercontent.com/u/99338330?v=4", "profile": "https://www.keecoin.io", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "tomatowax", "name": "Seungwook Chi", "avatar_url": "https://avatars.githubusercontent.com/u/799503?v=4", "profile": "http://www.tomatowax.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "0xx92", "name": "0xx92", "avatar_url": "https://avatars.githubusercontent.com/u/133748557?v=4", "profile": "https://github.com/0xx92", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "altinocoelho", "name": "altinocoelho", "avatar_url": "https://avatars.githubusercontent.com/u/92543849?v=4", "profile": "https://github.com/altinocoelho", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "viac92", "name": "viac92", "avatar_url": "https://avatars.githubusercontent.com/u/64146594?v=4", "profile": "https://github.com/viac92", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "GDdark", "name": "DongXi Huang", "avatar_url": "https://avatars.githubusercontent.com/u/15982894?v=4", "profile": "https://github.com/GDdark", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "SurajAnand88", "name": "Suraj Anand", "avatar_url": "https://avatars.githubusercontent.com/u/120190623?v=4", "profile": "https://surajanand88.github.io/portfolio/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "MwitahJob", "name": "Mwitah ", "avatar_url": "https://avatars.githubusercontent.com/u/136892656?v=4", "profile": "https://github.com/MwitahJob", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "TucksonDev", "name": "Tuckson", "avatar_url": "https://avatars.githubusercontent.com/u/105675159?v=4", "profile": "https://github.com/TucksonDev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Akamig", "name": "Akamig", "avatar_url": "https://avatars.githubusercontent.com/u/6278999?v=4", "profile": "https://twitter.com/_Akamig", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "perriefidelis", "name": "Peace Ojemeh", "avatar_url": "https://avatars.githubusercontent.com/u/30669761?v=4", "profile": "https://github.com/perriefidelis", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "woseK", "name": "woseK", "avatar_url": "https://avatars.githubusercontent.com/u/110729731?v=4", "profile": "https://github.com/woseK", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "gunal-123", "name": "Gunal", "avatar_url": "https://avatars.githubusercontent.com/u/103403219?v=4", "profile": "https://github.com/gunal-123", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "LadyDhaga", "name": "chinaman123", "avatar_url": "https://avatars.githubusercontent.com/u/106376368?v=4", "profile": "https://github.com/LadyDhaga", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "z0rats", "name": "Alex", "avatar_url": "https://avatars.githubusercontent.com/u/32142853?v=4", "profile": "http://t.me/mevsinternet", - "contributions": ["doc", "bug"] + "contributions": [ + "doc", + "bug" + ] }, { "login": "mteam88", "name": "Matthew", "avatar_url": "https://avatars.githubusercontent.com/u/84196639?v=4", "profile": "https://mteam88.github.io", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "avalidurl", "name": "gokhan", "avatar_url": "https://avatars.githubusercontent.com/u/11991363?v=4", "profile": "https://github.com/avalidurl", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "0xadri", "name": "Adri", "avatar_url": "https://avatars.githubusercontent.com/u/738533?v=4", "profile": "https://github.com/0xadri", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "DSherryD", "name": "Sherry.Du", "avatar_url": "https://avatars.githubusercontent.com/u/130898085?v=4", "profile": "https://github.com/DSherryD", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "FrancescoXX", "name": "Francesco Ciulla", "avatar_url": "https://avatars.githubusercontent.com/u/18360871?v=4", "profile": "http://francescociulla.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "blazingrome", "name": "blazingrome", "avatar_url": "https://avatars.githubusercontent.com/u/136898739?v=4", "profile": "https://github.com/blazingrome", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "etan-status", "name": "Etan Kissling", "avatar_url": "https://avatars.githubusercontent.com/u/89844309?v=4", "profile": "https://github.com/etan-status", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "kritik-sah", "name": "kritik sah", "avatar_url": "https://avatars.githubusercontent.com/u/57076429?v=4", "profile": "https://linktr.ee/kritik", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Fuliggine", "name": "Fuliggine", "avatar_url": "https://avatars.githubusercontent.com/u/56844974?v=4", "profile": "https://github.com/Fuliggine", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Omsify", "name": "Omsify", "avatar_url": "https://avatars.githubusercontent.com/u/87442202?v=4", "profile": "https://github.com/Omsify", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "0xMimir", "name": "0xMimir", "avatar_url": "https://avatars.githubusercontent.com/u/108837858?v=4", "profile": "https://github.com/0xMimir", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "bilaljawed", "name": "Bilal", "avatar_url": "https://avatars.githubusercontent.com/u/17548944?v=4", "profile": "https://github.com/bilaljawed", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ilanolkies", "name": "Ilan", "avatar_url": "https://avatars.githubusercontent.com/u/36084092?v=4", "profile": "https://ilanolkies.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "umededoteth", "name": "umede", "avatar_url": "https://avatars.githubusercontent.com/u/122288558?v=4", "profile": "https://mirror.xyz/umede.eth", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "taminobaumann", "name": "Tamino", "avatar_url": "https://avatars.githubusercontent.com/u/48290617?v=4", "profile": "http://taminobaumann.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "keccers", "name": "Katherine Champagne", "avatar_url": "https://avatars.githubusercontent.com/u/770277?v=4", "profile": "https://github.com/keccers", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Coderoostr", "name": "Marcos González", "avatar_url": "https://avatars.githubusercontent.com/u/103231131?v=4", "profile": "https://coderoostr.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "natpicone", "name": "Natalino Picone", "avatar_url": "https://avatars.githubusercontent.com/u/4753402?v=4", "profile": "https://chainlabo.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "hammadsaedi", "name": "Hammad Saaedi", "avatar_url": "https://avatars.githubusercontent.com/u/71373419?v=4", "profile": "https://github.com/hammadsaedi", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "srn08", "name": "Shaunak Nagrecha", "avatar_url": "https://avatars.githubusercontent.com/u/105499798?v=4", "profile": "https://github.com/srn08", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "schwindtkevin", "name": "Kevin Schwindt", "avatar_url": "https://avatars.githubusercontent.com/u/1700789?v=4", "profile": "https://github.com/schwindtkevin", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "robertkodra", "name": "Robert", "avatar_url": "https://avatars.githubusercontent.com/u/36516516?v=4", "profile": "https://github.com/robertkodra", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "0xObsidian", "name": "obsidian", "avatar_url": "https://avatars.githubusercontent.com/u/131651958?v=4", "profile": "https://github.com/0xObsidian", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "MohamedFekryyy", "name": "Fekry Aiad", "avatar_url": "https://avatars.githubusercontent.com/u/36033065?v=4", "profile": "http://www.scienft.com", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Wilson-Wu1", "name": "Wilson Wu", "avatar_url": "https://avatars.githubusercontent.com/u/41039035?v=4", "profile": "https://www.linkedin.com/in/wilson-wu-2021/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "fvaysh", "name": "VAS", "avatar_url": "https://avatars.githubusercontent.com/u/126754021?v=4", "profile": "https://github.com/fvaysh", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "costgallo", "name": "Costanza", "avatar_url": "https://avatars.githubusercontent.com/u/49433698?v=4", "profile": "https://github.com/costgallo", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "joaolago1113", "name": "joao", "avatar_url": "https://avatars.githubusercontent.com/u/22820692?v=4", "profile": "https://github.com/joaolago1113", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "rgb2hsl", "name": "Eugene", "avatar_url": "https://avatars.githubusercontent.com/u/3310192?v=4", "profile": "http://p2p.org", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "g0rbe", "name": "Dániel Görbe", "avatar_url": "https://avatars.githubusercontent.com/u/36860942?v=4", "profile": "https://www.gorbe.io", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "s-crypt", "name": "s-crypt", "avatar_url": "https://avatars.githubusercontent.com/u/41712656?v=4", "profile": "https://blog.insubli.me", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "tudorpintea999", "name": "iwantanode", "avatar_url": "https://avatars.githubusercontent.com/u/87604944?v=4", "profile": "https://github.com/tudorpintea999", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "shak58", "name": "shak58", "avatar_url": "https://avatars.githubusercontent.com/u/150069539?v=4", "profile": "https://github.com/shak58", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Muhammad-Altabba", "name": "Muhammad Altabba", "avatar_url": "https://avatars.githubusercontent.com/u/24407834?v=4", "profile": "https://linkedin.com/in/muhammadaltabba", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "darigovresearch", "name": "Darigov Research", "avatar_url": "https://avatars.githubusercontent.com/u/30328618?v=4", "profile": "https://www.darigovresearch.com/", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "shubhusion", "name": "SHUBHAM SHARMA ", "avatar_url": "https://avatars.githubusercontent.com/u/96301987?v=4", "profile": "https://github.com/shubhusion", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "paulallensuxs", "name": "paulallensuxs", "avatar_url": "https://avatars.githubusercontent.com/u/114240091?v=4", "profile": "https://github.com/paulallensuxs", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "pseudomata", "name": "Pseudomata", "avatar_url": "https://avatars.githubusercontent.com/u/132238190?v=4", "profile": "https://pseudomata.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "CodeDragonVN", "name": "CodeDragonVN", "avatar_url": "https://avatars.githubusercontent.com/u/150457827?v=4", "profile": "https://github.com/CodeDragonVN", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "SamiAlHassan", "name": "SamiAlHassan", "avatar_url": "https://avatars.githubusercontent.com/u/150172180?v=4", "profile": "https://github.com/SamiAlHassan", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "NaijaCoderGirl", "name": "NaijaCoderGirl", "avatar_url": "https://avatars.githubusercontent.com/u/150683513?v=4", "profile": "https://github.com/NaijaCoderGirl", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "konstantinzolotarev", "name": "Konstantin Zolotarev", "avatar_url": "https://avatars.githubusercontent.com/u/286431?v=4", "profile": "https://github.com/konstantinzolotarev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "vuittont60", "name": "vuittont60", "avatar_url": "https://avatars.githubusercontent.com/u/81072379?v=4", "profile": "https://github.com/vuittont60", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "goldnite", "name": "Golden Ite", "avatar_url": "https://avatars.githubusercontent.com/u/114434414?v=4", "profile": "http://goldnite.github.io", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Erlangshen219", "name": "Erlangshen219", "avatar_url": "https://avatars.githubusercontent.com/u/104747507?v=4", "profile": "https://github.com/Erlangshen219", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "AyDeveloper", "name": "AyDeveloper", "avatar_url": "https://avatars.githubusercontent.com/u/72970379?v=4", "profile": "https://oxpampam.netlify.app/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jeremyfritzen", "name": "jeremyfritzen", "avatar_url": "https://avatars.githubusercontent.com/u/26802442?v=4", "profile": "https://github.com/jeremyfritzen", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "fuzheng1998", "name": "Zheng Fu", "avatar_url": "https://avatars.githubusercontent.com/u/24203166?v=4", "profile": "https://github.com/fuzheng1998", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "xiaolou86", "name": "xiaolou86", "avatar_url": "https://avatars.githubusercontent.com/u/20718693?v=4", "profile": "https://github.com/xiaolou86", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "aztecEagle22", "name": "aztecEagle22", "avatar_url": "https://avatars.githubusercontent.com/u/152518936?v=4", "profile": "https://github.com/aztecEagle22", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Messi-Q", "name": "QIAN", "avatar_url": "https://avatars.githubusercontent.com/u/21357985?v=4", "profile": "https://github.com/Messi-Q", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "SanShi2023", "name": "SanShi2023", "avatar_url": "https://avatars.githubusercontent.com/u/136459117?v=4", "profile": "https://github.com/SanShi2023", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "kamuik16", "name": "Krishang Shah", "avatar_url": "https://avatars.githubusercontent.com/u/93703995?v=4", "profile": "https://github.com/kamuik16", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "vuvoth", "name": "Vu Vo", "avatar_url": "https://avatars.githubusercontent.com/u/45826131?v=4", "profile": "https://github.com/vuvoth", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "o2Stake", "name": "Tim - o2Stake", "avatar_url": "https://avatars.githubusercontent.com/u/77958700?v=4", "profile": "http://o2stake.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "b-wagn", "name": "Benedikt Wagner", "avatar_url": "https://avatars.githubusercontent.com/u/113296072?v=4", "profile": "http://benedikt-wagner.dev", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "tdahar", "name": "Tarun Mohandas Daryanani", "avatar_url": "https://avatars.githubusercontent.com/u/18716811?v=4", "profile": "https://github.com/tdahar", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Crosstons", "name": "Shubh", "avatar_url": "https://avatars.githubusercontent.com/u/110349596?v=4", "profile": "https://github.com/Crosstons", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "duckdegen", "name": "duckdegen", "avatar_url": "https://avatars.githubusercontent.com/u/98649644?v=4", "profile": "https://github.com/duckdegen", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sminempepe", "name": "sminempepe", "avatar_url": "https://avatars.githubusercontent.com/u/76882704?v=4", "profile": "https://github.com/sminempepe", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "aslikaya", "name": "aslikaya", "avatar_url": "https://avatars.githubusercontent.com/u/9151261?v=4", "profile": "https://github.com/aslikaya", - "contributions": ["doc", "maintenance"] + "contributions": [ + "doc", + "maintenance" + ] }, { "login": "lucas-amberg", "name": "Lucas Amberg", "avatar_url": "https://avatars.githubusercontent.com/u/102396588?v=4", "profile": "http://lucasamberg.dev", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "a-hagi613", "name": "Abdullahi", "avatar_url": "https://avatars.githubusercontent.com/u/92589940?v=4", "profile": "https://a-hagi.dev/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "pranavkonde", "name": "Pranav Konde", "avatar_url": "https://avatars.githubusercontent.com/u/76070589?v=4", "profile": "https://www.linkedin.com/in/pranav-konde-56aa141b5/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "MohitKambli", "name": "Mohit Kambli", "avatar_url": "https://avatars.githubusercontent.com/u/31406633?v=4", "profile": "https://github.com/MohitKambli", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "oleksandr-hyriavets", "name": "Oleksandr Hyriavets", "avatar_url": "https://avatars.githubusercontent.com/u/19614509?v=4", "profile": "https://github.com/oleksandr-hyriavets", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "titanism", "name": "titanism", "avatar_url": "https://avatars.githubusercontent.com/u/101466223?v=4", "profile": "https://github.com/titanism", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Maxservais", "name": "Maxime Servais", "avatar_url": "https://avatars.githubusercontent.com/u/43566493?v=4", "profile": "https://www.ethereum-ecosystem.com/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "nebolax", "name": "Alexey Nebolsin", "avatar_url": "https://avatars.githubusercontent.com/u/63492346?v=4", "profile": "https://t.me/nebolax", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "jimgreen2013", "name": "jimgreen2013", "avatar_url": "https://avatars.githubusercontent.com/u/15890793?v=4", "profile": "https://github.com/jimgreen2013", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "gabrieltemtsen", "name": "Gabriel Temsten", "avatar_url": "https://avatars.githubusercontent.com/u/57184013?v=4", "profile": "https://github.com/gabrieltemtsen", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "jennyg0", "name": "Jen ", "avatar_url": "https://avatars.githubusercontent.com/u/60794961?v=4", "profile": "https://github.com/jennyg0", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Molotov-Eugene", "name": "Eugene", "avatar_url": "https://avatars.githubusercontent.com/u/95471552?v=4", "profile": "https://github.com/Molotov-Eugene", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "rimtaex", "name": "RimTaeX", "avatar_url": "https://avatars.githubusercontent.com/u/155366533?v=4", "profile": "https://github.com/rimtaex", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "zarifpour", "name": "Daniel Zarifpour", "avatar_url": "https://avatars.githubusercontent.com/u/16494335?v=4", "profile": "http://zarifpour.xyz", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "intldds", "name": "intldds", "avatar_url": "https://avatars.githubusercontent.com/u/80983240?v=4", "profile": "https://github.com/intldds", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "hodlon", "name": "Hodlon", "avatar_url": "https://avatars.githubusercontent.com/u/37387563?v=4", "profile": "https://hodlon.art", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "M4x28", "name": "Leonardo Birardi", "avatar_url": "https://avatars.githubusercontent.com/u/64036726?v=4", "profile": "https://github.com/M4x28", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Flamenk", "name": "Parrot Iwai", "avatar_url": "https://avatars.githubusercontent.com/u/78525550?v=4", "profile": "https://github.com/Flamenk", - "contributions": ["doc", "translation"] + "contributions": [ + "doc", + "translation" + ] }, { "login": "starwalker00", "name": "starwalker00", "avatar_url": "https://avatars.githubusercontent.com/u/68958932?v=4", "profile": "https://github.com/starwalker00", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "Eversmile12", "name": "VItto Rivabella", "avatar_url": "https://avatars.githubusercontent.com/u/72762629?v=4", "profile": "http://vitto.cc", - "contributions": ["doc", "tool"] + "contributions": [ + "doc", + "tool" + ] }, { "login": "olafnub", "name": "Andy Li", "avatar_url": "https://avatars.githubusercontent.com/u/101077165?v=4", "profile": "https://www.linkedin.com/in/andy-li-65284220b/", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "maxammann", "name": "Max Ammann", "avatar_url": "https://avatars.githubusercontent.com/u/905221?v=4", "profile": "https://maxammann.org/", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "dswilson4", "name": "dswilson4", "avatar_url": "https://avatars.githubusercontent.com/u/33137497?v=4", "profile": "https://github.com/dswilson4", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "vbaranov", "name": "Victor Baranov", "avatar_url": "https://avatars.githubusercontent.com/u/4341812?v=4", "profile": "https://ethereum.stackexchange.com/users/2128/viktor-baranov", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "drehuwann", "name": "drehuwann", "avatar_url": "https://avatars.githubusercontent.com/u/62968123?v=4", "profile": "https://github.com/drehuwann", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "greetfish", "name": "junble", "avatar_url": "https://avatars.githubusercontent.com/u/11615617?v=4", "profile": "https://github.com/greetfish", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "viniciusmorais", "name": "Vinicius de Morais", "avatar_url": "https://avatars.githubusercontent.com/u/3915778?v=4", "profile": "https://github.com/viniciusmorais", - "contributions": ["translation", "doc"] + "contributions": [ + "translation", + "doc" + ] }, { "login": "0xhsy", "name": "0xhsy", "avatar_url": "https://avatars.githubusercontent.com/u/102006034?v=4", "profile": "http://www.dsrvlabs.com", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "enjoyooor", "name": "enjoyooor", "avatar_url": "https://avatars.githubusercontent.com/u/147568088?v=4", "profile": "https://github.com/enjoyooor", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "konopkja", "name": "Jakub", "avatar_url": "https://avatars.githubusercontent.com/u/100724231?v=4", "profile": "http://ethereum.org", - "contributions": ["doc", "content", "design"] + "contributions": [ + "doc", + "content", + "design" + ] }, { "login": "yusuf-musleh", "name": "Yusuf Musleh", "avatar_url": "https://avatars.githubusercontent.com/u/6829768?v=4", "profile": "http://www.ymusleh.com", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "acceptacross", "name": "acceptacross", "avatar_url": "https://avatars.githubusercontent.com/u/150119116?v=4", "profile": "https://github.com/acceptacross", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "pdelagrave", "name": "Pierre Delagrave", "avatar_url": "https://avatars.githubusercontent.com/u/17990895?v=4", "profile": "https://github.com/pdelagrave", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "blmalone", "name": "Blaine Malone", "avatar_url": "https://avatars.githubusercontent.com/u/15608778?v=4", "profile": "https://medium.com/@blainemalone01", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sixhobbits", "name": "Gareth Dwyer", "avatar_url": "https://avatars.githubusercontent.com/u/2641205?v=4", "profile": "https://dwyer.co.za", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "UNOFFICIALbgd", "name": "UNOFFICIALbgd", "avatar_url": "https://avatars.githubusercontent.com/u/71248977?v=4", "profile": "https://github.com/UNOFFICIALbgd", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "Codex-Bugmenot", "name": "Codex-Bugmenot", "avatar_url": "https://avatars.githubusercontent.com/u/59927099?v=4", "profile": "https://github.com/Codex-Bugmenot", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "doutv", "name": "Jason Huang", "avatar_url": "https://avatars.githubusercontent.com/u/20609724?v=4", "profile": "http://huangyongjin.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "adeolu98", "name": "dCRYPT", "avatar_url": "https://avatars.githubusercontent.com/u/39372980?v=4", "profile": "https://github.com/adeolu98", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "sourabupadhya123", "name": "Sourab", "avatar_url": "https://avatars.githubusercontent.com/u/64914231?v=4", "profile": "https://github.com/sourabupadhya123", - "contributions": ["security"] + "contributions": [ + "security" + ] }, { "login": "ykaravas", "name": "ykaravas", "avatar_url": "https://avatars.githubusercontent.com/u/6537956?v=4", "profile": "https://github.com/ykaravas", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "allwin199", "name": "Prince Allwin", "avatar_url": "https://avatars.githubusercontent.com/u/127643894?v=4", "profile": "https://allwin-portfolio.vercel.app/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ryanpwaldon", "name": "Ryan Waldon", "avatar_url": "https://avatars.githubusercontent.com/u/12480362?v=4", "profile": "https://github.com/ryanpwaldon", - "contributions": ["content", "code"] + "contributions": [ + "content", + "code" + ] }, { "login": "4everlandorg", "name": "4EVERLAND", "avatar_url": "https://avatars.githubusercontent.com/u/89854839?v=4", "profile": "https://www.4everland.org", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "iepn", "name": "iepn", "avatar_url": "https://avatars.githubusercontent.com/u/57232813?v=4", "profile": "https://member.acm.org/~rhymeq", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "veridelisi", "name": "veridelisi", "avatar_url": "https://avatars.githubusercontent.com/u/72710290?v=4", "profile": "https://www.ispanyol.com", - "contributions": ["tutorial"] + "contributions": [ + "tutorial" + ] }, { "login": "reetbatra", "name": "Reet Batra", "avatar_url": "https://avatars.githubusercontent.com/u/51335174?v=4", "profile": "https://github.com/reetbatra", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "gndelia", "name": "Gonzalo D'Elia", "avatar_url": "https://avatars.githubusercontent.com/u/352474?v=4", "profile": "https://github.com/gndelia", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "rileyannon", "name": "Riley Annon", "avatar_url": "https://avatars.githubusercontent.com/u/31807653?v=4", "profile": "http://www.rileyannon.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ayofimihan", "name": "Ogunsina Champion", "avatar_url": "https://avatars.githubusercontent.com/u/31336254?v=4", "profile": "http://0x13.dev", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ardislu", "name": "Ardis Lu", "avatar_url": "https://avatars.githubusercontent.com/u/29699850?v=4", "profile": "http://ardislu.dev", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "niuhp", "name": "niuhp", "avatar_url": "https://avatars.githubusercontent.com/u/7373524?v=4", "profile": "https://github.com/niuhp", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "xivanc", "name": "xivanc", "avatar_url": "https://avatars.githubusercontent.com/u/91614446?v=4", "profile": "https://github.com/xivanc", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "zm-moon", "name": "patrick", "avatar_url": "https://avatars.githubusercontent.com/u/42063103?v=4", "profile": "https://github.com/zm-moon", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "0xemrekaya", "name": "Emre", "avatar_url": "https://avatars.githubusercontent.com/u/72754835?v=4", "profile": "https://github.com/0xemrekaya", - "contributions": ["tutorial", "doc"] + "contributions": [ + "tutorial", + "doc" + ] }, { "login": "ryokomy", "name": "Ryo Komiyama", "avatar_url": "https://avatars.githubusercontent.com/u/6007453?v=4", "profile": "http://ryokomy.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Har01d", "name": "Nikita Zhavoronkov", "avatar_url": "https://avatars.githubusercontent.com/u/14060856?v=4", "profile": "https://blockchair.com/", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "tomasgrusz", "name": "Tomáš Grusz", "avatar_url": "https://avatars.githubusercontent.com/u/85355882?v=4", "profile": "https://grusz.dev", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "davidzhangg", "name": "David Zhang", "avatar_url": "https://avatars.githubusercontent.com/u/59639140?v=4", "profile": "https://github.com/davidzhangg", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "HemaDeviU", "name": "EL", "avatar_url": "https://avatars.githubusercontent.com/u/135946602?v=4", "profile": "https://github.com/HemaDeviU", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "hkey0", "name": "hkey", "avatar_url": "https://avatars.githubusercontent.com/u/81494947?v=4", "profile": "https://github.com/hkey0", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "emmanuel-awosika", "name": "Emmanuel Awosika", "avatar_url": "https://avatars.githubusercontent.com/u/102589267?v=4", "profile": "https://emmanuelawosika.bio.link/", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "seandotau", "name": "seandotau", "avatar_url": "https://avatars.githubusercontent.com/u/12471846?v=4", "profile": "https://github.com/seandotau", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "Eikix", "name": "Elias Tazartes", "avatar_url": "https://avatars.githubusercontent.com/u/66871571?v=4", "profile": "https://github.com/Eikix", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "cradle0fFilth", "name": "cradle0fFilth", "avatar_url": "https://avatars.githubusercontent.com/u/64477775?v=4", "profile": "https://github.com/cradle0fFilth", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "lispking", "name": "King", "avatar_url": "https://avatars.githubusercontent.com/u/4446580?v=4", "profile": "http://lispking.github.io/", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "kartojal", "name": "kartojal", "avatar_url": "https://avatars.githubusercontent.com/u/11179847?v=4", "profile": "https://catapulta.sh", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "AaronChen0", "name": "Aaron Chen", "avatar_url": "https://avatars.githubusercontent.com/u/18425462?v=4", "profile": "https://github.com/AaronChen0", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "melpomene", "name": "Christopher", "avatar_url": "https://avatars.githubusercontent.com/u/763476?v=4", "profile": "https://github.com/melpomene", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "AyumuKasuga", "name": "Andrei Kostakov", "avatar_url": "https://avatars.githubusercontent.com/u/700142?v=4", "profile": "https://t.me/AyumuKasuga", - "contributions": ["content", "doc"] + "contributions": [ + "content", + "doc" + ] }, { "login": "shubhisaran", "name": "Shubhi Saran", "avatar_url": "https://avatars.githubusercontent.com/u/113500663?v=4", "profile": "https://github.com/shubhisaran", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "bh2smith", "name": "Benjamin Smith", "avatar_url": "https://avatars.githubusercontent.com/u/11778116?v=4", "profile": "https://github.com/bh2smith", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Hector-Chong", "name": "Héctor Chong", "avatar_url": "https://avatars.githubusercontent.com/u/12469549?v=4", "profile": "http://hector.im", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nakmr", "name": "nace.kimura", "avatar_url": "https://avatars.githubusercontent.com/u/145886319?v=4", "profile": "https://github.com/nakmr", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "WuRuiLei2023", "name": "WuRuiLei2023", "avatar_url": "https://avatars.githubusercontent.com/u/149141323?v=4", "profile": "https://github.com/WuRuiLei2023", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "radeksvarz", "name": "Radek", "avatar_url": "https://avatars.githubusercontent.com/u/6020891?v=4", "profile": "http://www.edukids.cz", - "contributions": ["eventOrganizing", "maintenance"] + "contributions": [ + "eventOrganizing", + "maintenance" + ] }, { "login": "bhargavkakadiya", "name": "Bhargav kakadiya", "avatar_url": "https://avatars.githubusercontent.com/u/26486494?v=4", "profile": "https://github.com/bhargavkakadiya", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "ArtificialPB", "name": "ArtificialPB", "avatar_url": "https://avatars.githubusercontent.com/u/4672155?v=4", "profile": "https://github.com/ArtificialPB", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "Pedrojok01", "name": "Pedrojok01", "avatar_url": "https://avatars.githubusercontent.com/u/77141890?v=4", "profile": "https://github.com/Pedrojok01", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "Vid201", "name": "Vid Kersic", "avatar_url": "https://avatars.githubusercontent.com/u/38610409?v=4", "profile": "https://github.com/Vid201", - "contributions": ["tool", "bug"] + "contributions": [ + "tool", + "bug" + ] }, { "login": "futantan", "name": "Tantan Fu", "avatar_url": "https://avatars.githubusercontent.com/u/6268441?v=4", "profile": "http://www.futantan.com", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "Dharmik79", "name": "Dharmik Dholariya", "avatar_url": "https://avatars.githubusercontent.com/u/61613931?v=4", "profile": "https://dharmik79.github.io/portfolio.github.io/", - "contributions": ["bug", "code"] + "contributions": [ + "bug", + "code" + ] }, { "login": "Destiner", "name": "Timur Badretdinov", "avatar_url": "https://avatars.githubusercontent.com/u/4247901?v=4", "profile": "https://destiner.io", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "finxter", "name": "Finxter", "avatar_url": "https://avatars.githubusercontent.com/u/57671493?v=4", "profile": "https://blog.finxter.com/", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "croath", "name": "Croath Liu", "avatar_url": "https://avatars.githubusercontent.com/u/1398729?v=4", "profile": "http://croath.com", - "contributions": ["doc", "code"] + "contributions": [ + "doc", + "code" + ] }, { "login": "HayattiQ", "name": "Hayatti", "avatar_url": "https://avatars.githubusercontent.com/u/5105841?v=4", "profile": "https://github.com/HayattiQ", - "contributions": ["content", "bug", "maintenance"] + "contributions": [ + "content", + "bug", + "maintenance" + ] }, { "login": "JeffreyJoel", "name": "Jeffrey Owoloko", "avatar_url": "https://avatars.githubusercontent.com/u/72028836?v=4", "profile": "https://github.com/JeffreyJoel", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "colmck", "name": "Colin McKerracher", "avatar_url": "https://avatars.githubusercontent.com/u/73862596?v=4", "profile": "https://github.com/colmck", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "writegr", "name": "writegr", "avatar_url": "https://avatars.githubusercontent.com/u/167099595?v=4", "profile": "https://github.com/writegr", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "richardgreg", "name": "Cardo", "avatar_url": "https://avatars.githubusercontent.com/u/35255909?v=4", "profile": "https://github.com/richardgreg", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "shravanandoria", "name": "shravanandoria", "avatar_url": "https://avatars.githubusercontent.com/u/36509067?v=4", "profile": "https://www.linkedin.com/in/shravan-andoria/", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "mcmoodoo", "name": "Rashid Ma", "avatar_url": "https://avatars.githubusercontent.com/u/8257719?v=4", "profile": "http://rashidma.com", - "contributions": ["bug", "doc"] + "contributions": [ + "bug", + "doc" + ] }, { "login": "prestwich", "name": "James Prestwich", "avatar_url": "https://avatars.githubusercontent.com/u/10149425?v=4", "profile": "https://prestwi.ch", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "daiwt", "name": "Dai Wentao", "avatar_url": "https://avatars.githubusercontent.com/u/26290219?v=4", "profile": "https://github.com/daiwt", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "beetrootkid", "name": "kuhant", "avatar_url": "https://avatars.githubusercontent.com/u/34025634?v=4", "profile": "https://github.com/beetrootkid", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "LucasAschenbach", "name": "Lucas Aschenbach", "avatar_url": "https://avatars.githubusercontent.com/u/37406743?v=4", "profile": "https://github.com/LucasAschenbach", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "juliettech13", "name": "juliettech", "avatar_url": "https://avatars.githubusercontent.com/u/19226636?v=4", "profile": "https://juliet.tech", - "contributions": ["tutorial"] + "contributions": [ + "tutorial" + ] }, { "login": "0xayot", "name": "0xayot", "avatar_url": "https://avatars.githubusercontent.com/u/101125111?v=4", "profile": "https://github.com/0xayot", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "lgaroche", "name": "Louis", "avatar_url": "https://avatars.githubusercontent.com/u/13414533?v=4", "profile": "https://github.com/lgaroche", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "rohit-710", "name": "Rohit Ramesh", "avatar_url": "https://avatars.githubusercontent.com/u/70317502?v=4", "profile": "https://bento.me/rohitramesh", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "gsalzer", "name": "Gernot Salzer", "avatar_url": "https://avatars.githubusercontent.com/u/13353518?v=4", "profile": "https://github.com/gsalzer", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "lightclient", "name": "lightclient", "avatar_url": "https://avatars.githubusercontent.com/u/14004106?v=4", "profile": "https://github.com/lightclient", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "GarenWoo", "name": "Garen Woo", "avatar_url": "https://avatars.githubusercontent.com/u/126687110?v=4", "profile": "https://github.com/GarenWoo", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "AbiPrescott", "name": "Abi Prescott", "avatar_url": "https://avatars.githubusercontent.com/u/140613896?v=4", "profile": "https://github.com/AbiPrescott", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "skyminelabs", "name": "skyminelabs", "avatar_url": "https://avatars.githubusercontent.com/u/57817726?v=4", "profile": "https://github.com/skyminelabs", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "sogobanwo", "name": "sogobanwo", "avatar_url": "https://avatars.githubusercontent.com/u/99739569?v=4", "profile": "https://olorunsogo-portfolio-sand.vercel.app/", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "liuye20240304", "name": "liuye20240304", "avatar_url": "https://avatars.githubusercontent.com/u/162123251?v=4", "profile": "https://github.com/liuye20240304", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "zk-Lumi", "name": "Daniel Lumi", "avatar_url": "https://avatars.githubusercontent.com/u/149794418?v=4", "profile": "https://zksync.io", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "ZakGriffith", "name": "Zak G", "avatar_url": "https://avatars.githubusercontent.com/u/12072395?v=4", "profile": "https://github.com/ZakGriffith", - "contributions": ["tutorial"] + "contributions": [ + "tutorial" + ] }, { "login": "barskhianfannie", "name": "Fannie Barskhian", "avatar_url": "https://avatars.githubusercontent.com/u/42990794?v=4", "profile": "http://fanniebarskhian.com", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "ksdumont", "name": "Keith Dumont", "avatar_url": "https://avatars.githubusercontent.com/u/51958351?v=4", "profile": "https://github.com/ksdumont", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ecabras", "name": "ecabras", "avatar_url": "https://avatars.githubusercontent.com/u/126670074?v=4", "profile": "https://github.com/ecabras", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "raxhvl", "name": "rahul", "avatar_url": "https://avatars.githubusercontent.com/u/10168946?v=4", "profile": "https://github.com/raxhvl", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "professorabhay", "name": "Abhay Gupta ", "avatar_url": "https://avatars.githubusercontent.com/u/76243309?v=4", "profile": "https://abhayporwals.live/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "somethingstup", "name": "somethingstup", "avatar_url": "https://avatars.githubusercontent.com/u/166286712?v=4", "profile": "https://github.com/somethingstup", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "woxjro", "name": "woxjro", "avatar_url": "https://avatars.githubusercontent.com/u/63214188?v=4", "profile": "https://github.com/woxjro", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "SeanXLChen", "name": "bambooskySean", "avatar_url": "https://avatars.githubusercontent.com/u/78134555?v=4", "profile": "https://github.com/SeanXLChen", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "VikVM", "name": "VikVM", "avatar_url": "https://avatars.githubusercontent.com/u/60881781?v=4", "profile": "https://github.com/VikVM", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "checkomkar", "name": "Omkar Kamale", "avatar_url": "https://avatars.githubusercontent.com/u/8987373?v=4", "profile": "https://github.com/checkomkar", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "mingoing", "name": "Mingo", "avatar_url": "https://avatars.githubusercontent.com/u/344175?v=4", "profile": "https://github.com/mingoing", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "zkVlad", "name": "zkVlad", "avatar_url": "https://avatars.githubusercontent.com/u/125317045?v=4", "profile": "https://github.com/zkVlad", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "yunseonna", "name": "yunseon na", "avatar_url": "https://avatars.githubusercontent.com/u/148749864?v=4", "profile": "https://github.com/yunseonna", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "alex1092", "name": "Alex", "avatar_url": "https://avatars.githubusercontent.com/u/59183749?v=4", "profile": "https://github.com/alex1092", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "kyndrawynne", "name": "kyndrawynne", "avatar_url": "https://avatars.githubusercontent.com/u/108100622?v=4", "profile": "https://github.com/kyndrawynne", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "stolab", "name": "stolab", "avatar_url": "https://avatars.githubusercontent.com/u/144235139?v=4", "profile": "https://github.com/stolab", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jacobjelen", "name": "jacobjelen", "avatar_url": "https://avatars.githubusercontent.com/u/6750124?v=4", "profile": "http://www.jacobjelen.com", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "Dennayz", "name": "Dennis Zhang", "avatar_url": "https://avatars.githubusercontent.com/u/58843979?v=4", "profile": "https://github.com/Dennayz", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "JanetMo", "name": "Marlene Marz", "avatar_url": "https://avatars.githubusercontent.com/u/42071757?v=4", "profile": "https://github.com/JanetMo", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mahnunchik", "name": "Evgeny", "avatar_url": "https://avatars.githubusercontent.com/u/780935?v=4", "profile": "https://github.com/mahnunchik", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "SnehalSrivastava27", "name": "SnehalSrivastava27", "avatar_url": "https://avatars.githubusercontent.com/u/118104081?v=4", "profile": "https://github.com/SnehalSrivastava27", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "wrexgem", "name": "wrexgem", "avatar_url": "https://avatars.githubusercontent.com/u/134736543?v=4", "profile": "https://github.com/wrexgem", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "cd-sigma", "name": "ciphernova", "avatar_url": "https://avatars.githubusercontent.com/u/119534349?v=4", "profile": "https://github.com/cd-sigma", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "CodeMongerrr", "name": "Aditya Joshi", "avatar_url": "https://avatars.githubusercontent.com/u/99281767?v=4", "profile": "https://github.com/CodeMongerrr", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Khemmie-Ray", "name": "Atoyebi Oluwakemi", "avatar_url": "https://avatars.githubusercontent.com/u/89976006?v=4", "profile": "https://github.com/Khemmie-Ray", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "pglekshmi", "name": "pglekshmi", "avatar_url": "https://avatars.githubusercontent.com/u/107828565?v=4", "profile": "https://github.com/pglekshmi", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "abonnaudet-ledger", "name": "abonnaudet-ledger", "avatar_url": "https://avatars.githubusercontent.com/u/71646516?v=4", "profile": "https://github.com/abonnaudet-ledger", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "JacobSharples", "name": "Jacob Sharples", "avatar_url": "https://avatars.githubusercontent.com/u/45126111?v=4", "profile": "https://github.com/JacobSharples", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "omahs", "name": "omahs", "avatar_url": "https://avatars.githubusercontent.com/u/73983677?v=4", "profile": "https://github.com/omahs", - "contributions": ["translation", "maintenance"] + "contributions": [ + "translation", + "maintenance" + ] }, { "login": "Shiva-Sai-ssb", "name": "Shiva Sai", "avatar_url": "https://avatars.githubusercontent.com/u/112751524?v=4", "profile": "https://github.com/Shiva-Sai-ssb", - "contributions": ["bug", "maintenance", "content"] + "contributions": [ + "bug", + "maintenance", + "content" + ] }, { "login": "saurabhburade", "name": "Saurabh Burade", "avatar_url": "https://avatars.githubusercontent.com/u/39492927?v=4", "profile": "https://bsaurabh.xyz/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "yorkerhodes3", "name": "Yorke E. Rhodes III", "avatar_url": "https://avatars.githubusercontent.com/u/17415717?v=4", "profile": "https://github.com/yorkerhodes3", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "sandeepV2", "name": "Sandeep Belagavi", "avatar_url": "https://avatars.githubusercontent.com/u/52043035?v=4", "profile": "https://github.com/sandeepV2", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "codingmickey", "name": "Kartik Jolapara", "avatar_url": "https://avatars.githubusercontent.com/u/42518907?v=4", "profile": "https://github.com/codingmickey", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Ekam-Bitt", "name": "Ekam Bitt", "avatar_url": "https://avatars.githubusercontent.com/u/74407205?v=4", "profile": "https://ekam-bitt.github.io", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "iankressin", "name": "Ian K. Guimarães", "avatar_url": "https://avatars.githubusercontent.com/u/29215044?v=4", "profile": "http://iankguimaraes.com", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "jncrabb", "name": "jncrabb", "avatar_url": "https://avatars.githubusercontent.com/u/27811684?v=4", "profile": "https://github.com/jncrabb", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "bibo7086", "name": "Saidu Sokoto", "avatar_url": "https://avatars.githubusercontent.com/u/24389200?v=4", "profile": "https://github.com/bibo7086", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "krishchvn", "name": "Krishnakumar Chavan", "avatar_url": "https://avatars.githubusercontent.com/u/58606754?v=4", "profile": "https://github.com/krishchvn", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "0xV4L3NT1N3", "name": "0xV4L3NT1N3", "avatar_url": "https://avatars.githubusercontent.com/u/33112835?v=4", "profile": "https://github.com/0xV4L3NT1N3", - "contributions": ["tool"] + "contributions": [ + "tool" + ] }, { "login": "JoshDavisLight", "name": "Josh Davis", "avatar_url": "https://avatars.githubusercontent.com/u/82784104?v=4", "profile": "https://github.com/JoshDavisLight", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "tr1sm0s1n", "name": "Mobin Mohanan", "avatar_url": "https://avatars.githubusercontent.com/u/47410557?v=4", "profile": "https://github.com/tr1sm0s1n", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Baystef", "name": "Adebayo Steve", "avatar_url": "https://avatars.githubusercontent.com/u/36106823?v=4", "profile": "https://github.com/Baystef", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "sanjanaynvsdl", "name": "Sanjana", "avatar_url": "https://avatars.githubusercontent.com/u/142678317?v=4", "profile": "https://github.com/sanjanaynvsdl", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "zaryab2000", "name": "Zaryab", "avatar_url": "https://avatars.githubusercontent.com/u/42082608?v=4", "profile": "https://www.zaryabs.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "yannggg", "name": "Yann Gerardi", "avatar_url": "https://avatars.githubusercontent.com/u/29145014?v=4", "profile": "https://www.mtpelerin.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "panditdhamdhere", "name": "Pandit Dhamdhere", "avatar_url": "https://avatars.githubusercontent.com/u/85685981?v=4", "profile": "https://github.com/panditdhamdhere", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ferreiramarcelo", "name": "M@rC3L0", "avatar_url": "https://avatars.githubusercontent.com/u/11818521?v=4", "profile": "http://linkedin.com/in/fmarcelo", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Refdeveloper", "name": "DevOFtoken", "avatar_url": "https://avatars.githubusercontent.com/u/87125773?v=4", "profile": "https://github.com/Refdeveloper", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "vvvvvv1vvvvvv", "name": "vvvvvv1vvvvvv", "avatar_url": "https://avatars.githubusercontent.com/u/86296331?v=4", "profile": "https://github.com/vvvvvv1vvvvvv", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "abraj", "name": "Abhishek Raj", "avatar_url": "https://avatars.githubusercontent.com/u/8170980?v=4", "profile": "https://raj.me", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "p1kalys", "name": "Pavan Emani", "avatar_url": "https://avatars.githubusercontent.com/u/85685112?v=4", "profile": "https://github.com/p1kalys", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "makoshan", "name": "Mako Shan", "avatar_url": "https://avatars.githubusercontent.com/u/7024451?v=4", "profile": "https://v2eth.com/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "cratiu222", "name": "Christina", "avatar_url": "https://avatars.githubusercontent.com/u/156356273?v=4", "profile": "https://github.com/cratiu222", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "nipunh", "name": "Nipun Hedaoo", "avatar_url": "https://avatars.githubusercontent.com/u/26524611?v=4", "profile": "https://github.com/nipunh", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "chenjiali-april", "name": "april", "avatar_url": "https://avatars.githubusercontent.com/u/132745538?v=4", "profile": "https://github.com/chenjiali-april", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "r4f4ss", "name": "rafaelss", "avatar_url": "https://avatars.githubusercontent.com/u/5679073?v=4", "profile": "https://github.com/r4f4ss", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "preetjdp", "name": "Preet Parekh", "avatar_url": "https://avatars.githubusercontent.com/u/27439197?v=4", "profile": "https://preetjdp.dev/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "ludamad", "name": "ludamad", "avatar_url": "https://avatars.githubusercontent.com/u/163993?v=4", "profile": "https://www.linkedin.com/in/adamdomurad/", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "MaryNfs", "name": "MaryNfs", "avatar_url": "https://avatars.githubusercontent.com/u/52598322?v=4", "profile": "https://github.com/MaryNfs", - "contributions": ["content", "bug"] + "contributions": [ + "content", + "bug" + ] }, { "login": "Signor1", "name": "Signor Dev", "avatar_url": "https://avatars.githubusercontent.com/u/94352660?v=4", "profile": "https://signor.vercel.app/", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "KatrixReloaded", "name": "Kartikeya Sureka", "avatar_url": "https://avatars.githubusercontent.com/u/68804269?v=4", "profile": "https://github.com/KatrixReloaded", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "Piyush-Tilokani", "name": "Piyush Tilokani", "avatar_url": "https://avatars.githubusercontent.com/u/112542519?v=4", "profile": "https://github.com/Piyush-Tilokani", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jacobourar", "name": "Jacobo Uribe", "avatar_url": "https://avatars.githubusercontent.com/u/109108267?v=4", "profile": "https://github.com/jacobourar", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "Xcertik-Realist", "name": "NilFoundation", "avatar_url": "https://avatars.githubusercontent.com/u/63165931?v=4", "profile": "https://github.com/Xcertik-Realist", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "gconnect", "name": "Glory Agatevure", "avatar_url": "https://avatars.githubusercontent.com/u/23031920?v=4", "profile": "https://github.com/gconnect", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "emmanuellar", "name": "Amarachi Johnson-Ubah", "avatar_url": "https://avatars.githubusercontent.com/u/41474439?v=4", "profile": "http://amarachijohnson.com", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "sumitvekariya", "name": "Sumit Vekariya", "avatar_url": "https://avatars.githubusercontent.com/u/20764957?v=4", "profile": "http://sumitvekariya.surge.sh", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "rafagomes", "name": "Rafa Gomes", "avatar_url": "https://avatars.githubusercontent.com/u/565337?v=4", "profile": "https://github.com/rafagomes", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "ddannehh", "name": "ddannehh", "avatar_url": "https://avatars.githubusercontent.com/u/109203827?v=4", "profile": "https://github.com/ddannehh", - "contributions": ["design"] + "contributions": [ + "design" + ] }, { "login": "jkylling", "name": "Jonas Irgens Kylling", "avatar_url": "https://avatars.githubusercontent.com/u/6781076?v=4", "profile": "https://github.com/jkylling", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "CremaFR", "name": "Thomas Brillard", "avatar_url": "https://avatars.githubusercontent.com/u/5360522?v=4", "profile": "https://github.com/CremaFR", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "YakshitAgarwal", "name": "Yakshit Agarwal", "avatar_url": "https://avatars.githubusercontent.com/u/153830716?v=4", "profile": "https://github.com/YakshitAgarwal", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "mseidlx", "name": "Matthias Seidl", "avatar_url": "https://avatars.githubusercontent.com/u/32496674?v=4", "profile": "https://growthepie.com", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "JoeChenJ", "name": "JoeChenJ", "avatar_url": "https://avatars.githubusercontent.com/u/171761102?v=4", "profile": "https://github.com/JoeChenJ", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "itzVarsha", "name": "Varshitha", "avatar_url": "https://avatars.githubusercontent.com/u/138134029?v=4", "profile": "https://github.com/itzVarsha", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "alexandriaroberts", "name": "Alexandria Roberts", "avatar_url": "https://avatars.githubusercontent.com/u/31341867?v=4", "profile": "https://alexandriaroberts.dev/", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "colinlyguo", "name": "colin", "avatar_url": "https://avatars.githubusercontent.com/u/102356659?v=4", "profile": "https://github.com/colinlyguo", - "contributions": ["content"] + "contributions": [ + "content" + ] }, { "login": "jenish-thapa", "name": "Jenish Thapa", "avatar_url": "https://avatars.githubusercontent.com/u/141203631?v=4", "profile": "https://github.com/jenish-thapa", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "iusx", "name": "iusx", "avatar_url": "https://avatars.githubusercontent.com/u/57232813?v=4", "profile": "https://jiangxue.org/~ritsu", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "JJOptimist", "name": "JJOptimist", "avatar_url": "https://avatars.githubusercontent.com/u/86833563?v=4", "profile": "https://github.com/JJOptimist", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "hotequil", "name": "João Paulo Hotequil", "avatar_url": "https://avatars.githubusercontent.com/u/46814712?v=4", "profile": "https://github.com/hotequil", - "contributions": ["code", "translation"] + "contributions": [ + "code", + "translation" + ] }, { "login": "microHoffman", "name": "microHoffman", "avatar_url": "https://avatars.githubusercontent.com/u/61500778?v=4", "profile": "http://pwn.xyz", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "smithrashell", "name": "Rashell Smith", "avatar_url": "https://avatars.githubusercontent.com/u/36465023?v=4", "profile": "https://github.com/smithrashell", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "aolson078", "name": "Alex Olson", "avatar_url": "https://avatars.githubusercontent.com/u/69769089?v=4", "profile": "https://github.com/aolson078", - "contributions": ["bug"] + "contributions": [ + "bug" + ] }, { "login": "adminsuci", "name": "SUCI - Blockchain Hub Team", "avatar_url": "https://avatars.githubusercontent.com/u/155696196?v=4", "profile": "https://www.suci.io/", - "contributions": ["maintenance"] + "contributions": [ + "maintenance" + ] }, { "login": "Nik-EpicWeb3", @@ -9670,6 +12782,15 @@ "contributions": [ "eventOrganizing" ] + }, + { + "login": "brossetti1", + "name": "Brian Rossetti", + "avatar_url": "https://avatars.githubusercontent.com/u/5998100?v=4", + "profile": "https://github.com/brossetti1", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 269ca3b90edb06a8e5e007498eb03275e6db19c1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 8 Jul 2025 18:19:40 -0700 Subject: [PATCH 298/368] update: oat link [fixes #14711] --- public/content/translations/ja/contributing/index.md | 2 +- public/content/translations/pt-br/contributing/index.md | 2 +- public/content/translations/zh-tw/contributing/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/translations/ja/contributing/index.md b/public/content/translations/ja/contributing/index.md index 74029da8ea4..f049de76b31 100644 --- a/public/content/translations/ja/contributing/index.md +++ b/public/content/translations/ja/contributing/index.md @@ -90,7 +90,7 @@ GitHubリポジトリには、オープンソースに初めて触れるデベ あなたの貢献がethereum.orgにマージされると、[Galxe](https://app.galxe.com/quest/ethereumorg)で特別なバッジを請求できるようになります。 オンチェーン功績トークン(OAT)は、エコシステムをささやかながらより素晴らしいものにするのに貢献したことの証拠です。 -[OATの詳細](https://help.galxe.com/en/articles/7067290-galxe-oats-reward-and-celebrate-achievements) +[OATの詳細](https://help.galxe.com/en/articles/9645630-create-quest-rewards#h_1c5d63ba03) ### 申請方法 1. [Discordサーバー](https://discord.gg/ethereum-org)に参加します。 diff --git a/public/content/translations/pt-br/contributing/index.md b/public/content/translations/pt-br/contributing/index.md index e13c3629687..2ea1f540c67 100644 --- a/public/content/translations/pt-br/contributing/index.md +++ b/public/content/translations/pt-br/contributing/index.md @@ -90,7 +90,7 @@ Em nosso repositório do GitHub, temos uma categoria de envio de tíquetes espec Se sua contribuição for incluída no ethereum.org, você terá a chance de reivindicar um badge especial no [Galxe](https://app.galxe.com/quest/ethereumorg). Um token de conquista on-chain (OAT) é uma prova de que você contribuiu com o ecossistema de maneira considerável. -[Mais sobre OATs](https://help.galxe.com/en/articles/7067290-galxe-oats-reward-and-celebrate-achievements) +[Mais sobre OATs](https://help.galxe.com/en/articles/9645630-create-quest-rewards#h_1c5d63ba03) ### Como solicitar seu POAP 1. Junte-se ao nosso [servidor Discord](https://discord.gg/ethereum-org). diff --git a/public/content/translations/zh-tw/contributing/index.md b/public/content/translations/zh-tw/contributing/index.md index b68cda7fb87..a0caf2f9b53 100644 --- a/public/content/translations/zh-tw/contributing/index.md +++ b/public/content/translations/zh-tw/contributing/index.md @@ -90,7 +90,7 @@ Ethereum.org 是一個開源專案,擁有超過 **12000 名**貢獻者,幫 如果你的貢獻合併到 ethereum.org,你將有機會在 [Galxe](https://app.galxe.com/quest/ethereumorg) 上領取特殊徽章。 鏈上成就代幣 (OAT) 證明你曾經協助生態系統變得更加出色。 -[有關鏈上成就代幣的更多資訊](https://help.galxe.com/en/articles/7067290-galxe-oats-reward-and-celebrate-achievements) +[有關鏈上成就代幣的更多資訊](https://help.galxe.com/en/articles/9645630-create-quest-rewards#h_1c5d63ba03) ### 如何領取 1. 加入我們的 [Discord 伺服器](https://discord.gg/ethereum-org)。 From 71b8d42e1c9758d9d11014e370bf0df7ca6e8088 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 8 Jul 2025 19:59:52 -0700 Subject: [PATCH 299/368] patch: match only markdown --- .github/workflows/lychee-cron.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/lychee-cron.yml b/.github/workflows/lychee-cron.yml index fb1757a4a29..7f896317ecc 100644 --- a/.github/workflows/lychee-cron.yml +++ b/.github/workflows/lychee-cron.yml @@ -35,7 +35,6 @@ jobs: --include '^https?://' --format detailed './**/*.md' - './**/*.html' continue-on-error: true - name: Provide helpful failure message From a9d67e53c6185992863f38dc65833ada9a00a679 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:29 -0700 Subject: [PATCH 300/368] chore: remove on pull_request trigger monthly cron job, manually dispatchable --- .github/workflows/lychee-cron.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/lychee-cron.yml b/.github/workflows/lychee-cron.yml index 7f896317ecc..d1c78dff7ad 100644 --- a/.github/workflows/lychee-cron.yml +++ b/.github/workflows/lychee-cron.yml @@ -1,7 +1,6 @@ name: Check Links In Public Directory on: - pull_request: schedule: - cron: "0 0 1 * *" # Monthly run on the 1st day of every month at midnight UTC workflow_dispatch: From 0e67adf41f3a7b206f6958e1b6679a2d60b8da83 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 03:05:51 +0000 Subject: [PATCH 301/368] docs: update README.md [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 016e1cf9856..d06ef03c5ee 100644 --- a/README.md +++ b/README.md @@ -1993,7 +1993,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Nik-EpicWeb3
    Nik-EpicWeb3

    📋 - Brian Rossetti
    Brian Rossetti

    🚧 + Brian Rossetti
    Brian Rossetti

    🚧 💻 From d068d10c54b835c5306089e87c7a12ba634648e7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 03:05:52 +0000 Subject: [PATCH 302/368] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 404b06adb6a..75877571802 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12789,7 +12789,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/5998100?v=4", "profile": "https://github.com/brossetti1", "contributions": [ - "maintenance" + "maintenance", + "code" ] } ], From 937822a01fc4ea7aade00486437dee4062d17cfa Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:47:34 -0700 Subject: [PATCH 303/368] redesign: /developers above-the-fold (desktop) --- app/[locale]/developers/page.tsx | 127 ++++++++++-------- public/images/developers/speedrun-nft.png | Bin 0 -> 32355 bytes .../developers/speedrun-staking-app.png | Bin 0 -> 44729 bytes .../developers/speedrun-token-vendor.png | Bin 0 -> 59850 bytes src/intl/en/page-developers-index.json | 9 +- 5 files changed, 78 insertions(+), 58 deletions(-) create mode 100644 public/images/developers/speedrun-nft.png create mode 100644 public/images/developers/speedrun-staking-app.png create mode 100644 public/images/developers/speedrun-token-vendor.png diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index b1c844144c0..87aa4a9369d 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -1,11 +1,11 @@ -import { ReactNode } from "react" +import { type ReactNode } from "react" +import { type StaticImageData } from "next/image" import { getTranslations } from "next-intl/server" -import { Lang } from "@/lib/types" +import type { Lang } from "@/lib/types" import { ChildOnlyProp } from "@/lib/types" import CalloutSSR from "@/components/CalloutSSR" -import OldCard from "@/components/Card" import { CopyButton } from "@/components/CopyToClipboard" import FeedbackCard from "@/components/FeedbackCard" import HubHero from "@/components/Hero/HubHero" @@ -16,13 +16,17 @@ import { Card } from "@/components/ui/card" import { VStack } from "@/components/ui/flex" import Link from "@/components/ui/Link" import InlineLink from "@/components/ui/Link" +import { Tag } from "@/components/ui/tag" import { getMetadata } from "@/lib/utils/metadata" -import SpeedRunEthereumImage from "@/public/images/dev-tools/speed-run-ethereum-banner.png" -import DevelopersImage from "@/public/images/developers-eth-blocks.png" -import DogeImage from "@/public/images/doge-computer.png" -import HeroImage from "@/public/images/heroes/developers-hub-hero.jpg" +import speedRunEthereumImage from "@/public/images/dev-tools/speed-run-ethereum-banner.png" +import speedrunNFT from "@/public/images/developers/speedrun-nft.png" +import speedrunStakingApp from "@/public/images/developers/speedrun-staking-app.png" +import speedrunTokenVendor from "@/public/images/developers/speedrun-token-vendor.png" +import developersImage from "@/public/images/developers-eth-blocks.png" +import dogeImage from "@/public/images/doge-computer.png" +import heroImage from "@/public/images/heroes/developers-hub-hero.jpg" const H2 = (props: ChildOnlyProp) =>

    @@ -44,7 +48,8 @@ const IntroColumn = (props: ChildOnlyProp) => ( ) type DevelopersPath = { - emoji: string + imgSrc: StaticImageData + imgAlt: string title: ReactNode description: ReactNode url: string @@ -68,39 +73,36 @@ const DevelopersPage = async ({ const paths: DevelopersPath[] = [ { - emoji: ":woman_student:", - title: t("page-developers-learn"), - description: t("page-developers-learn-desc"), - url: "/developers/docs/", - button: t("page-developers-read-docs"), + imgSrc: speedrunNFT, + imgAlt: "Speedrun Ethereum NFT banner", + title: "Simple NFT Example", // t("page-developers-learn"), + description: "Create a public NFT to learn the basics of scaffold-eth.", // t("page-developers-learn-desc"), + url: "https://speedrunethereum.com/challenge/simple-nft-example", + button: t("page-developers-start-quest"), }, { - emoji: ":woman_teacher:", - title: t("page-developers-learn-tutorials"), - description: t("page-developers-learn-tutorials-desc"), - url: "/developers/tutorials/", - button: t("page-developers-learn-tutorials-cta"), + imgSrc: speedrunStakingApp, + imgAlt: "Speedrun Ethereum staking app banner", + title: "Staking App", // t("page-developers-learn-tutorials"), + description: "Write a smart contract where users pool funds together.", // t("page-developers-learn-tutorials-desc"), + url: "https://speedrunethereum.com/challenge/decentralized-staking", + button: t("page-developers-start-quest"), }, { - emoji: ":woman_scientist:", - title: t("page-developers-resources"), - description: t("page-developers-start-desc"), - url: "/developers/learning-tools/", - button: t("page-developers-play-code"), - }, - { - emoji: ":construction_worker:", - title: t("page-developers-set-up"), - description: t("page-developers-setup-desc"), - url: "/developers/local-environment/", - button: t("page-developers-choose-stack"), + imgSrc: speedrunTokenVendor, + imgAlt: "Speedrun Ethereum token vendor project banner", + title: "Create a token", // t("page-developers-resources"), + description: + "Build a digital currency and a smart conract that trades it.", // t("page-developers-start-desc"), + url: "https://speedrunethereum.com/challenge/token-vendor", + button: t("page-developers-start-quest"), }, ] return (

    {t("page-developers-get-started")}

    -
    +
    + {paths.map((path, idx) => ( + + {path.imgAlt} +
    + + Challenge #{idx} + +

    {path.title}

    +

    + {path.description} +

    +
    + + {path.button} + +
    + ))} +
    SpeedRunEthereum banner -
    +

    {t("page-developers-start")}

    {t("page-developers-speedrunethereum-description")}

    +
    +

    {t("page-developers-jump-right-in-title")}

    @@ -186,20 +219,6 @@ const DevelopersPage = async ({
    -
    - {paths.map((path, idx) => ( - - {path.button} - - ))} -
    -

    {t("page-developers-about")}

    @@ -216,7 +235,7 @@ const DevelopersPage = async ({
    {t("page-developers-language-desc")} {t("page-assets-doge")} diff --git a/public/images/developers/speedrun-nft.png b/public/images/developers/speedrun-nft.png new file mode 100644 index 0000000000000000000000000000000000000000..db1a14497841fab739af1af3e2e94753511f756d GIT binary patch literal 32355 zcmce;1y`F*7cLAGDAE>pcZcHc?(S9~xVw9ChXTc|Kye7}UL;6?;_mM5Cp_(Y*0;_N z_|{4mA$KzOo|$dewf7`KNkQ@>0xkjs1jI*aDKQlY2q-QH2uK4sSnxaHpH1n(e;}Pz zBt;-9$ME;T|A?7tNt?;bL(qa>!$ClXSwcX+eFXf(1wSDm-sM6VH?E zxN_h9?=_^s+XtsBRK7z%2ti1T39ETP9%a4v!SA1c&1q*GqCHV>*oNi!1#4rHVdh2r z6;+2AIq^vvjvQKQjly#sMot7SkBVtO@avh#9{g7&Id}>eIaX|}C2!^0h5dz>oZTPG z8Twf+#dIzF`usQ0j1-IA?GM@{+3 zaek-PS+MP7^EK~>rO(XZA)E6(RX^sITn_iDqwmRg1b%CnJYB6lM)HSaG-%^WDSLdm zY;g@-p0Efxacgx_ryPb1RD*^}kg6NowA9g4MUzX`XdmnJo!w*dEorOy@#CwE?6fRg zu#f>)?H<7ky57<oJ=wTrQLEt6z_|;s zJ3bA(gDlp(is!!T{!HaGF zxbhh6^-1c;R2xP5<5|7R^5Szg{ae(2uM<4)cCPnc7UBc{KDB8Gq>R?>qeUgIk7)S~f@=Eapai5xciDCsN&0sZ#q5`Me* zla(hO6_4ohK6mh-$xk@=@5RUn2x$D`>y)C8POW;D43MrmQxk;$-3=1i0Ra+@OJP4k zj90I1L(*oc>;D=yKnem%A$08`jR7-44rG2$jrZS;AfO+3!C(1wWRyCqd)#G~C;cYd zn|N$*5>%IYK$|DN%Lt+TH;~W-azMc5NM+)4?AkwBA)r~vAt0$l9qvbqk2lw3()_K4FT0J1OXMx>Mea~x!_^W@v-9HazXB*fk*!%5ZPa? zwp8L9?DqGrT-o3mhq)yb9ikB|u(2Wj8y{a0Jcw$m)U46y-2e080k;H1*?xjWP7Cb+ z92%k_EcYfB3)S9&@R`=oGq%)=8 zR_;+;r*J=AqsA}CQ;YUwNk9bjcRKho;H#p%lq==f$<6$E2?}c4Men0 z&Qo%j=;2OZPkgc?P5r$DbkBXyBwW}@@)U=Pb@hE0luVL)I7Cdg7sW)&Vc|c z>|c|3vx;xv5r2rO%|Y8Bn*WAg71GT zj}Bh>*n?O=%*1DK-jtIj6`h;QtDVg4{(*8|IFR z_gF@pY8~F25wY`6n*$2qz$>lh?qVCgx3-7fy^jFP{7?UXzk`%hzJ?eeNrkf0$Ga$- zF7q7X!vAkTu$)3XZ!-`r>9REbfdt=gybWUqTl)U5EP?r8n=i(0k(ml@^6e1r|E*Ss z^1sb{Q+qTo5^=n`?*e>FGqB>D=$RM3+&e}wKYcWVE`*6OAfFIaQF>gF!@3vYiuqoYMOQq$y+P(t; z^o2y1xXtzthfifc5e5W~(@ind|5TVn(%KqJ?GZy=1TBkx#j?He&6i|PZ6Lv&%0app zjhRmkLlw&P|L?ZXWeFU8;wLioC3XTdKP}2Rir{)`EWXJjbYHVWhIUXCO+7QFzIYnW zF0UR$_1D26t(MzaTj?}-oGdBv-0n`WX@2{>_x%&yk0E}@mq(^OXDld%lSeip3Rq)w zf``Z3l}kVKlcl@(TEZ!vj z@b1yEKnr`)PPbjBBVAtfDHa^DhI-vwMtWoHH`xAuPg|04qUTo<3)!1ZkyB|*BVK5%`zb*O#fz}15kl@lG zTa5B&K}UmpRGd}#uS?F&1#dYzy8lCREzh|{BPfKX^eTab;y;b(f}jL%xfG9~dvmCS zYePsc9a-d$Aq&cX>Vh5(mL(|fRKMRQiA^Y-V`E*CP&nuM6M@QKo&O*N<)MwKTzn~0 zT9bjrc!i;yG@IjrU@nH z`YNeA*Q;<@Mapb$0~KW&^*4(d(fc`)S94XA47v?Z;1oETXIo&t{Hxz$BnFCpuY0-b z1E8zEcUz_n4#D9P99ALtGibH#zJHT{@!4JOjqF2uzE!WYUe>9l9X&3(H_sH-d^yBn zWn2`ht`AvhdVSrCTjg1$moe$z+>gSXz~OuviDreWu|UVn{fO=BO>gdb*5${5Zsk&~ z>8v=%<9;%WZF|DD@BCYl8S|(foBRSlR}2LQc@1efNWh(B4e;ACWMpH~!inTiQN1yG zsg9jP37kEesWi@l-f=OO;<7G8gE)vE_*68fPL|D-N!Qq>XVQ1Uergr@cN@J3eu1@) z^y;5fKZc6{_mOy&hf#@PKasBEb=!Qzz0YpiLU(CuqZbY_Th9F+WA7^!;hRWV_Tt*R z9?-o|)G2&}7Pn;DC2{p6tB;5aq*@Hy1l-nI~1kzjlATniy0-%(mTL_1kd zIRdilVKig3Nl2UmM(h0h=M__yzorKZ^`=#`AUjPq9>!NvF|RLHoc8(VcAd*|dK?~b z419++m`$4O+jc6Bh!r$QWE+~L?CGj1UtAf1~RO*ga zE2*6U=9rtglUFbG|KhmUn~~XDaFa7ECZ~xoKg^MgO3!~t<3XseR~DPs=|+Q#@2ndc z!GjMeY4?otJUM?qsHq}@TNM@d&rkwaPy+&{bd43Hh^7D(>JxBW-8*Jphk5TU`^&1* zuK-CSp2gW_*;Ss0@?M7tVWZEbp|f)NOnOf6$w+u+MgP1S1oR|Dye8zpXwmTyPL%KD zwlezu95x7A-nlj{>MLng5*}jp^3)N6VTijGM^rtis zp>{d9{8nsY$)+cM_kArBO_{E+Sr}?~UuJz-p$)wg$h@p~Ym%(IG-uYlU9=T?l=gGr z&mt_Bdi!kuE8s^N$Gr&jJ9p$N1F~a+mHoXh0{hBc>xZWFOGn#ZIf|!X<5r0{uQd6c z4OyGD2sD<@BG4@7?#}5$$+wW_L-;gftwCPg8sAp2wXqV*@I<&{$+~F6B8aL)b#^bC z8^lN_IGc^acz#G*{0bn+WS>f(6a`vYGQ-cIsmG&IzZ@L~>QyhJzeC>RsKmr7Nxsom&Mw z{SD5QpOLt}V6CmJgS@Tg37wRCw-g8VCcI6 z-+|a5fd+r-jP6 z-J=stL5h=m@_!IT15kPUf>GZ7GUC28dZ%V zI31DKq4|1&wX(!go1@V`n1Jk{mJ9bcCIiHXYa5j$)Jar%p!Ilc*G)HUdS@lMk9UxDeo85fKRazJvfkt(Hz{4k;6DHzY+ek3rJ+C zx18jP>sq_iqQsnTF^J};;}3yWZ7^Z+_q(2?U>v3RrIvQ4&~}7YkmX-S+yz1PmbnW; z=o_B)ndQmF%T%_aV^Rf?xdB-&;l_S{!T_FvCoWX#&-)cOm|E!ketf5_e&ZM`^dWKg?9G9%IQ8{1hPC3em|jU z*D_Ro(OaBTG*HzQvU=<% z=iQy+4YC7I;M#wP^*JG6%1q>eY|~&>RoarqprgGg^uxcUiU-3Ks_q`>0XqYH>s78c z@jDE-C6WIw^C0|}$l*MKK~P0rSW<8Y4vQOo%!;)=&sKRYhl3-q-;?1{`pBHdk1uTf zUs{C%4uGGI)Sj|f(^`C5U)BieFFv6e$V=pjVUOZgJj-sT8 z=B-QXpDX9FyDB@Hrs>M^@zXBNxS!S>$L_q%3yXpKma3Z=IlTk_c&a$fYOb^42=&)N zbG9(6(`Y}I^e;_Szop2VZT-zt2N5Bo*S27+ zZ$etw8N`0rZYP=n3~^(9#Mt~pt*h8owC`u zysFxNDd;zydCYX<=ytl|wLi`k$nae27mAU=LFvQecPX0#HT~I0>%>|pk5Mn-2l#qB zIzSj=V185!j23Iw9LA&z#<6g=oNT+@b;ce6e5rQ~H&e-pr|W0;!=96C82aLCB$88g3;!S_IaQ)*&a*WHYFYgJ_;6o zajvD1T;3U-b?P%cngw>oJagQHs`g4`df^XIO%b*3r0+lCyZ%u!l!ians|}?b&mmGI zV`}X#kSyCrQ9usAu;v`BVsgE`>6<2ntMGn(?g~W`_#6Vme8lDUaCKuDhQILZf)TMz zCraW$HCxF-v#3#3Sy{N&e4L{;DuB=^j~26bSZ>0?9QGg#*5Z3&)R-x4h%31Y7o7)Hk=C*S|%{4fLjeDqjg!wc#Rdb`rwdn6K{;wE;by z<4W*-&INB*ysv;**{Q2SOXq{~O=c%coW%rAXU>e1`N~+fzl|ScU)jCgq7o?km49HK z?}YcGNa7142~e}hgqaA3x*acw^QoAK^~Wg+K3@qmE;&U})0CaC3!rS9sCS`6JW8;m zg!O;l<~_IoEb10zPj08?>uJ+|e`FNsSeKKu``o_so4GDDWW z;NrR zK35VO9x}r!A(@Mt^ze~aeaGi#FFkxVFknFJ{X1=xqmwvuzAbQ>Hf~^QScixgmIG#q z{~s{E%6@}-d_J`49w$?bTpc7m*!Ydpz40+Dox>)bE1S15Ul%zr1 zWA7e##Z`y1Zbe6>k@Z^usv*b96SMcV{idow=R>C9(g7Z`>##hZ>*t_ieJ+GbB2=#I zQ|X3~xZBrw5>coDMje;FJI75@MuTqjPDA<2>FH?#zwy-tTb@vORA0qd08l>U5=B6MDyiRq7ka(1Cu!LcZa* zQFsT6oFqhgjTJgmxrfXK%z?>j`!^K>r>BW^lbmWA=Ra!2G+01q(GQKvL%Z@xJ0q7h z6efNJ!c9hm&(ppM_D8x$n?b_9zWm4hb|3U_mruXn;@Q}{Ki_nRnFAdzSy_Q(XLJJS zB3(G3YlDH6r}fj)vMKxfms@(lKNP2JoX7jS*^fq&s-v&3qa?~rVF4zj!nvKuN<4rTOaR+dS$+qlUkDZgK05hf9S;5 zJc_tcLpmiEIP`dMf&|s0SZqazZVw{6@KI4dff;}g_2 z9Ese_W!f#W@c3Ia0)5lMjPfnGvQQGYupjBUWpLwQg+~+rR(#|4JR~omUkM4(OSTKh zmci@*&t@pzNQ13@M<(IjL~>o0?Zi)o=yiGiyDt~$8eQj(8DgCx=n<{X7o3hn-q*VB zh&do?-12*7XfAUUhnh`{RGk_ce%>fjohhQX0PIn9VXkeWHg(_;4AFE1A8yc(HD@>} zs_cGQZ#`coF(pQmcAZPS_W2!G7z(zaA77Tsq;v{~3R%tYxKaDp9rPgZoJEvQ#j{A_ zis#W{L?ElNM!ckG3s`_*<39-}2Mdpn)FG+Fo%CP>kKn+7+fp`_ksUE%dx?eAB*)Fl z%IW|(zOdFEyr1bjMzT^cJVN9^b+s`f1ugU?;6Ez$6OuyuAGHQ6b$y>C$-}ycUfq+q zof1{WAzYeS)k5hMBuCkA2VKC!k>R^7#jhws@`J<+E{#fssM5;EVJ({4FQytH8(cnHX`0IMxfrrvI5`p( zNM#V|`weKc8_(vyI;u5RYBFyGyW}RjSX#Y^fOjOt=5|dypW(Gu#oi?aZk{e|Urzrb zP2gAh=;))F7x*q9;ON44E%3d{=u=2a>+>SmCwxZalGGuMu-mz;KRUEMPfyj-{v51R_A@(Fgl z&mmQEXV$T1S`mW=LnWwk}(uXoo$cV{XR~%k{^@Q&juzD)8J+ z5@~J3a&5ppWT8%F1H}ba(M1yq0PZ;LKX6Yk#;eftit^A-EGtmtdZY z4FT-`X&^BjN<9!mqBS)s7|`DcG)u74O2RDap_=5+CMYkr9^1s~5VwGY`=AH)RMU;{ zT0)?xeBNa}f$JgV8w^(4Pm}?9s_)%n7wUvQH?i-X*X?;|lxiWv26hmiL25e1sU&FV z>grzhp(*0`+*ps8|D=BR+WC6>`VAn)>vohoYv4VKntCMWVv$0xZQT54B(kSC%Pn1e z$m8Ydo^7yUGJa8HobU2O37#WxjL`SG%&`6&r|-iRqbCDADpmfI52m-PxgxXZ3%xf7 z7s7j}e&MdCP5RiKPfHqp?!Tf_7B#CXcaL$mKqzGP?{13&cu#eqjD2Jbj+pSKFH$~0 zVp5O!pZ8;7;W#>>ukSQ0+Nl=orFK41w7)zYrZfSlz}~(P#MHUuB>fdn8KJUN#zvT` ztXOPF+x2j!q5#jXiKHVW7=a6MiMD+6pgQsczJv-w zj{?QZ#4QG<)QVZuSk8CJ)8A82^7^J3NruWXzu4-fZiPcY?t=GNHCI6Uaz^)RuYOj` z%H6X)%7-zv{8jGZv(dU4-S}SPCG{t0d_?X{F!0(+givg6R)6GerpGf46fy*VdrI?% z?e*7%pg)5Rv}&3<286%qXj|B0^TZ1>hPGo%J(1taje&ZoU)F#1lPN;tzy!SuG=8hn zgnPw(47QE9K*zu|MOQA)D^CV*)ePVPIq*Gio0{&k9vmFt#&8Lon7v{?>dW8<5wBstAs<=;e&TOaNdUmp;t-Ipj6VG056U>$xRBZWV%UTd3 zeGqchAKZtX410tAZHga+`EmC?c;0Yav=(0pz>IOMNeii~=tBMkLonY7vVBt;53>q* zeLlcJ0a;`u9Mz~EwT4h#rz22nTfXUm2@uav+R8aSjg&bIN^}GmE$xLCpC}8~-OEx> z6j(?qlrAR|s%weJ2E75<{(HI#4sjN}e^uH*NN{mo0p%GQP{I|r;$t8tFQF=&D~KGQ z5QUI&%HouFP=4hy1|)Jc#kWJnn$jvW2ZC=1+9_0uLgox&DfX#yd_*+$U6cC-#!A)8=q)cCNo58> zsZ7PTi(v&Y87jMUpLJocr@5yNKWhtwI(XpvbGcf;Nmg4W`0H4_AC= zRc5QxBkESM6stcB$OfgpoOwrvqPp=$%kj=sum_!QKHR2GMs+?C3=PN1g8=GQJ+==3 zoae_A!GzfXwK)d9M;qKe!ygX+I4UqhHQpHr*V#AQaZA{K-u0Z4E+M}Na>_o5s4B5E z@owJZ-c*R7tHcXWBn{XD7nKBbtC1D*76_=dy~`OE2QmWNYC zQF|XteeF91coT(Y_&%K@JAAjdHI4o`%omcAn@Jhj2xqS z{QL)~3-s8a330C3@bM-JbnV-d7w+tP!u|IPQ^OBq;tX*2V|fm!Th4kAE$2SZpS5~Z z{d(FNMVrq1nk3IV|HY6rNEC>(_Z1#Z%Ej>ml_@CP5?5h`NOivK*DHW~4)$jBXkF-k zRa@9(kjgm*o#v(Lq$899ta~s$@fsTxTC;Fi4QI^4M?${up9G&AVh`qhM+#z?I-h_P z6M^pur7m~Jsb~tQ26Ty)e0|#~BCro?@ec8L-E30TwNvD>sFJ7@DN&l#8UaJ74=cAF zlE%=#9nh#0e)LCS4TRv6Da4X~#R*EmwMPWWFOL}bVlwPrUe0&+6N3AWWQZA<+jAMj zw)Nrm?A(nFia_db9Mj*&7wBT4&OlT`T!X&e(Nb%qu=?p7UpMN380C%r@KEYJ8`h00 z3!4J@LJB{cxg|Ng75`N!Ou-gkgGdPvXl_i_P4-5*mk`V(k6y<>#?%aBsBO}s4 z$^KpXj@wk<^DUL3Wl187XLUp;re?=YIyb%jk91y7^8S`IFP6!xo2JWUPRsFyY3W*9 zpIyNy$`6dvbJ>lB7v6Ob@S-w;UVhsr6%DdnU=B}8B;Y!Vk8gNWVYbUCkrWvQ$`efR zQdN1hGWqPq=ea!EHtL}IJWWWxSie4YGHq)+P0N(FIrxvgv;ZEJr|nnd;ut#^ z6QV^;)q}Ou8k2h>gDRPnL>Mtuf*2w!ozk3dFDbokZ5l;g123F_Rd*M_<>*@b=H$}b zWli~XHoZnuM1HsD4aQkN{}a9oZ|BF$)`RiR!s8fyjMTyl3vwrB#L!4Fb6b_Jf{HkC z5y3SrI4%vg=X*JHMS9#vzT_XC?JF~rlPb#TC>WWHQ?e|sQ+;K`#}D+0ZlsF$KNX6K zmYy0@hKD*7Z`y_~qK{n1@b_OG&>_ULS$eAjzMRg1%6b z?$WD*I00Z?e^V$K99JN?L5k{1glTat%9Ar>Svk%5fOdNhgwT*Uh6I@2Zwr!*)7}(= zm{@F$_1nv2+m+%kA_7hoY~6eIKGvRA{wB}CGHkz~FS{W> z0F{WnkyOGt9buc^0aR2SvO;6P88$IU-I-cmI7>?kQ+t2t3A$Aj1k#&#L;_AJql zv&5OnRl(shlAm3uhZB6i2KxardqtK{YqISSPLTZ0v+qEDna^R8-aMDw`Os^C)iQU< zA@sJSLyDC?|Iwy!Vy`F{)Sl=MOnwqzKbCRHG5KQXXst82=>{@SqNNzTZ$4uByw`S7 zEZ8id4J2PP*T#iy=`DDvU0aIn_wklsKhz>Wt z#}<-JG~)2tW#UjkGVjcG-S9p1=(|3MAcWee+FNSqEu!PU{CPa|U(s27iYk)w=BEpt zxv1`hOEtbb7F3Du`~fiWwmwtM9$5@4zM|zWoken@F%RH+k=|!0|9oSRG22-3{ZyNy z1l^u%o?ywY_E%G=i5avp(@ZJ94aMMeXe(TN!zoPmn@1G_5ULyF*JfEIZ)hta4HD@LL zc@m9gfSNh|W0Q&L#_w2m>lyd#^swOsGSfO?gSN;ii#uYZ7#dAe%55ieC9|4?g%*7P zV5kf9i;P$Bb!n7H|B3#<;XKa@)5*n@yTy^AN-|-DN4G|C^m}xfPJ6{l?dEFEM}yV^ z;bG)ZG>WdVEzk2N$NEma+MNa^F~feRO#wZ2=*&+N`Y*E{Yq3k&>g9*mebY&l*D+rg z3o+&;2g7?-Utip#M4020T+-5qI*OiBi7_Lw7<9zI=_?Bz9+6t8sLdHQjdAA$KE1V$jWw zYH)(RDxt$%ENHIte|9+d(+JBJ&So!A1r=Mj-bpF{@Ez#_gHK7Hd-YCn-mnzPVyVHE zAZPaq>8%!Lt5<&kwhFMT+`fsyOL4aexn0Ib*|}n>IBE6I-_3LOSj1^6~cjn z`qhV-#-H`|(<30+InZg#VWquOpSBr5@{0h`H*VX*>C=%cy76zCJnh${V?xBDP&*2ieU6z=W784?S4Q_@)Rn9B-Kap=-NYmdnExX`pDe{g!hDMD-WQHb;x~B)@ z;y9>q*muY*=1->a?`R93)r&dU@ z05e>(eE}yuqgLPpz(+zU{-lW7ni{!$jqCiZ<_l_)EIhw!CaF^JPB9 zYRVXqoDDXn>ac($*m7g(p58>4>uJq__Bzk);big_`UBchvN%2#yAZ7p&lnj=6-0eq zxo~=+Ni?*s1CC@Xe&~5}^t5F>T=}`>2zEDo;I{P+aMNxvlVt(8l` zUM)WcC*4tUK@L;05XV+A@I)b}f9%VG#cF z$xUoa-3`PLu1R3zO*#F{nIgt zD|GnizVhPD_0_~LQ*;HOaFLg+fJRFe2fa{W>}bNYtYwIH$#;Q;?C&|La_Nhr1AgaX zk+7%;Lz6Eqq4iUxY`tRge6NZN+0jm|+M>M3)Fh*(>VpDiH+RD&tr;rm;z$jWlI3$V z4hIbnDJ^WcXRyWEDH1&7Lrj6&dQYrY7;SnjWO>>OMN!K07g=EY$HZ zZ%-`4PAkhl*!#-6gS~AOJ+IH#1}%<5ARF!`^TS>YKh7BZt?gumG*@;y^eI{E@+oV9 z&bSwcWlf7Qy@^hFE@dtHAJ#vY#q(~y0i`A>AGDir)cFH72ehuEJDuh_)Paf$lX5a! zhak?FR~P5yMs8XHI8A3BI4*=vC>Wx3uN?KmmtDbEPl8A3rENz@$(I+#=B>mg&8h3% zY9FNtrD8veA-j!y5BfzlY=yDueVT|}9M8l$CpLWlOm?8k4K!hhMzS*?q{r-LrizLT zEtWX`9aLKTwUd&gAhk%!;Rh4Jo+d0z2Nz{bHTNa<%K5k_2#0e7XwQsvd$sxgMj(*I z)Gw{_;w-9(#sV9?AvK%pwn@KjL|1z^tLdAD6p#aS!O)+41`Cs{9&FhMcR7<>7J?Wl zAk;JHbh<#2@wLU{O2YTEEWG-5A&@|Hm;p!Tod8i4W9md(-&q!V{8E~4_7jWoV|bTB zrDWT_2ehPw+9**Q9M?f44Xcshr@_)v|K~%)lsKS#2FFAQmVuP<^t=P<;GY?t7&MR@ z^6JY?<0e#MLagH_o`atSFLC43ra7&5Pxv=E*!vF9;4>y*=2A4DPd;h3`4OLky*2+X z53Kay&J@x`^wHypFHA&|`wQ#RyT6WzELA$>YEPHa;@^8dWcC%sEe}bigUcY!n(FHE z>rV&4qM;s>ILB&{!pP8GlEmAomZy=TR{uIy_C$m*>{|51py9TH!3EUG0$T5~KiJZy zv0go2;WzJP3$rx2`aQNN8L5X=6l?7BcRaLW1V1PXaahgz7=GxG zCS?w?$+)_@ras;LV15Bk=~|UER0NVv#CvN0N-KpT#NAR<>|iiK8{XhE5WJUtuN=_1 zbfn5{wr&Z#prezo!6*KKlS@Xd*hu<_a)%)gic=% z9;TLy{h5r@w9q3rW5d3(Ye3)VdF>af7f6CmJ`gB`hMR`zPY?Y*5qvpEdH~m6iX;X? z(B}I!UGsl{*zS|4IM(F`ZF z)0i}kYd$P*n!~uJ79W0ZugGmp^>IK)C;*;(ufNxGR!uJu{GKw@)v5(*pT;WyQHRpCq;zom)?0! z&^M3!j^Ufr32MXGi;)NL84`vJi<9|Us*XC}jlKvo6;Fc-o%&%uNifcl00##zewN52 zf-mIB81lfyO6((**R`0#17!(}K9-+W$EuYei*d;J-^EL{RYJD|DV?`&JTCw^VR6{f z$1ANCx~d{1+9}bEq4NC0fO&eynC`J;oo=)IP_x8lcTYI8%^-$R=8GcEpl|a0`#Z^g zR!C+Yxdm-j4qrCrj3BjRl7~I@h$7VVvS4>MVN_yICW%ZhrLEn&a)6;Qrd0c*`>0jvsen=AZC+toccpsY< z?aK?D$bLX6)%`pe1clP@Cppo2raVvAt~mrC>BNQXKnhMA6pk?J;KA{)23o8{Q(t5` z^<(n(;_BndEj=B!Dd_8|&n|BY#iFs5h(s)_Bg-`JQ*BAgDeRG<|hAa=(EGrx3c?U#6fHZih;Q69+8%gMX%}ie;}wxK?99z7N!X z)W6p*DWPAJFDdH{XG3a!&kh|NaSunDW{o}=!7b?x!!;h-m653p?jaXNGZwQlys4cV z$dW?=#ct#amGj^%E5*1Bvum?FgR3Df^QY3Iv-(=u1aI{Y(^4r+%E8c-{+%NzEI~9G z&lW@|g&J2tLOuBG#wT7m4Xq{TasDeX08c9%jv_b=#bVD2F z{eGPsFE&y|TOiBVkkelz5hFJ6a@fnsO5aD-{(8Vvs9MQ7NO5Ol)8u>Z4kZEx6dQ%D*$dDGKO?<+q&37k3#TaL2Z6;eXk{>dYm2ISbQwac&vS z)#G|Rs@*wA1dqz zgzPO0UU*DPYXiN?o71p}TzG0+d{%vL`*UCU`Hi8j2XTc|_W zLmdARY?kxC4};slLFt?+-#o{6rd+LgMfN{@Nie6Z$+AwlKfP< z-VUHlkArcT*`Y>S2{n{v^{gmLwJ;iiVnDGLyX6nLZnKRYa0^-^QBuU08tYj`oklx? zuZeP9WJqwI!7_3`;S4TaYj#{)&te13WIO?JQ5oE!7l zP&$-FsQ0IRlelvB3NoUAbz&|6`>K44kVKDyvT6LlxOKwwfyPOb>_U>j{cn z(XeKmmA>UyPm2ag=Y)RZ-a<|+$&-Wr@fOaaV6Fsg`Dot-l7gFwslo`T>EOl$Uwvx( zzz2Ak$PHY94;wv*O!SHS6dGabnjFUYnQQqce{d5Mz_W*Qu0xFHTkD!75ADUC)A~od(Du<{9SQCadx(pf& zA7pX%(~G!{s(Uwv2M<{6CeBq)HEok{F%OT7&+oF_SC|V-h5L^iR|!{Vx}&$cj^=AE zZ^0*EzESgmuDpr3lrdA^YmvAyrs5qvxX!-kjG^TLSCAatHXukJSEbiaj}ChzoP8OpKvnl`1e znoo}V-LQfVsMWuJo}}Q7JWG!KoJ3y*rwj~|srR7w5(UbDDs$=g|4eJBRMDzY&Kw(YfaP(U@FtI%};6S@5`Eem4{tFg*3ZuS^^=xI#sl9ofq=dcLxmFgeYHBpz zK7uFPh&Z-wytx(;cQzm{qj>M}6FKfLSERX;JAs2$!m_}CDYEPnCg6pAI1zOZQ^rC;?5_`g@9#L73qk_~3Eom6taRRqc`9zzpxZHxMJt z*F!3r>qvDu%%VrndwPR~W#pSN-D;|O_%*8LVPp@1DfyusxLiGX<*)Egdx%RIxEo)d zYi+q8iqb!9^MfBB#}LCp;7gA~&4X3TjMC>h%nuawmFLOf3f^uU;<1R51y(+2hC09e z!qRZS#Rf3{Q2?0u%2Pp(xnTNLI~oDkZfh_BGuTg}&Bi3pZiI$RbuMHnH`t^D?#HXd zuqI+;!IEZkTEsKf9pL(4I_&wXSTL*GkfbPp)pQuWe4BPlXxC7~P#k$v9ce=;iD^@qNvDPEI1kO=|`B9peGh+cx8ZF^% zQMO(YMnNzzs`-2Q=cT>~wEgnhvHZiT)Ew0?G?=5IBr3e(o%55{(}trd$_K7g11}nI z5pTc@_tTjPNe57q9Y{U9-N-o0;%G2o0@#`VmLT13eBb;vhU9_Mex=;5o)ko-%9JlTVTDX^C*HQvP z^?CVH2u?;C2Y{xl6`e2FRlw1&6j^ZAZlDRl*ZcAD?Yd$|k!z&OI3LE_uxWM7pnLAX zfFzgv-W1?3v*Qxs)#64_g#Gb`_nWxBH6*;>g(%6)Tc z0n@~clF+CotK786{r~EDLiX_00^>>zj|B*v`Qw|r7&akVkkgAhWbNRs1L8L=XqDUDHT62W92aa{nmAc*wHPE8 zJOrH$peTBVqiy<97&!OMB(C`N)GD(%#b29m>`0|GAh1zg=@r(o{Gal^vMG*e?G{b2 zKyU~eG`PD4cXxLQ?ykWd1_>VA-Q5|S;10opOK|5lIp@58;!;!dVXCXy)BD+vuC+#u z8>@7ayVYx*B9-%sIECkcz-)B;QU3xC4I-)1(}0r^BHwyWo2tEDYk2OzfAJF zEX!jgigIZ-f!(Oc?g?3u?|9JWNZ>%rSw z1CiTUKcYo0ba*#|(D&0fo(fS#YoS~Bx!>xvD0Hz}rBPpogrAv7=ev1IE=C8MyTm7r zD`*MKyQ$U;$}p|KD4}>@;86tgkgO`va*~Fo|Jb7-HYm0R1=sIa$Q|kIWM@cGD-r>| z2g1n4hW~4Gwg2Q4JWK|DK%$WbB;8%ld!l~#fq;9A^GlSC@xWl}F>e5Nq0(kd<5O$Y zP~eIhr(%_z9BG*`^!)&6j8x~B8^Q0DYks#J`#p9gWm<1`5f@{F9TjL=7NS1S=C)L7 zD3m0VqpjP$eVCxH^mMZA=@z!YRCc;=$s9-Q5NEGKpBnQ1eiidEhN@1YC>?KQ?Nx7v zGhkF@qcB(SRjlwD!=bavennns#c!|%EF)m>u>Mrn6eChl2 zc%-S1^L zMO6+(YGGK3Hjngo+-*gY(bNEmH|q}nEZ@CJ;vSIUvLy7!l5l2t{7EGn8FO{(`@r$* zVt15o>h*c!)n@6Pco5POzmN+FOs3NWm-DZ$?@OlY-yi^Q#ZY+Les1JGP+zeIQ)rUk z6fpQuy#$m}B-+q)0$uS^Mdw*X@c{ud%&+s;0Ph(8v2Ej7u5dL9mYO7|V@MApcGFP? zsK}86YW+zPnkD`e`lCmR6_+#`Ux`(Gn>?*Jw9M)|%wwHY&2j(ug%FCRxddD~z8l=( zeAf<5_4~GDitB^j9$#wK9tx@pf`r~q=`RvYsSFw8GN_m+!Z61C7@Z;MTkNhoQE!nx zi+%pbV_`6%RSVm;k|KeqU@EJn(zI9n36;sLxQlX;Tmdk=Z3Sa~Q!30yuWA)1@?oXl zDRuzxI<>)Fa5T9x*6Lq;k1Cp4cXX=_APGG8bN-Ge^Ne1d*WOuLdm5xEg?i7;QSHI~ zd4rhX_wI0+-Pc5LWb$U@qB@0iN5uw}4_=NT{ulB9_(~Jmw_XI?Kup*!XkyRxy+%<% zCRj{Gl6Y4@*FPu6SZ}r2d8zWhFPE#Yy$A+&GAOtkJqH@jzaFjzX_q zgD&P1bWvuKC9gJ_C#U`McZef>%hhZqwR3jArY9@Y9Gy!sBc@Sjtc@C^Y-7rcm#OQH zR>ahag!s>W1uPBZmZA(|)&s=|185BQbMeK_SJ7k}g7)PsJ4)g^?|S)e=lF!WC1dMl z=Cg7sDz2255_1YZ@W(bzgxSUJSE@Gj7`jwk=!NiQjx1tzHi_EAv~fo^P8q73_>ciqPl763guN}3yC+7_WRYqQB5N+g?vr|o#2b8 z@6E^yG>~;X->lFUdb0e%X_Hl=$=;wyPIr}`Hu!?s%o%a=LsLLs6G&CNZxB7#& zYT!8VIU=ybWHwcs!m-7{;Na&=mHJM%I`tXMW4(wRBLGl*J*HtE$o#nF2&Ty5GAe-M-&s_vhH?eECxDwa#rIR$*nSKaS?J3pM+8P5|jN+h7-3$%HN-v`B2R9 z-S2>$U!QN&6>GJQ+Ak;a7`!(T&2&CPixYa7=qRq>Y#Q;=Vk3TkU)_79yIL7H-8ha< zSd<}su6g6=6bb{*(sA=&*iF<^lb56aUU>J zvWU-A z!Gn;ZYGkt+6lfxDees$uY`s&>Z^HDAf@&{{fXwWL_CqCty9V@UKDA*h;qr17%h>)e zM*7GL&}s7uv!l9IDUbEn-aAAEZ#^*^epGe^lR86-!nE3hj?8MF|W z7Re9#B#9m&I%HeJp{W;+r*xRZAXBk_>ZrHvQ3I)3mr(0I*HG<$5vh)jC9#_}WHo=S z{|(v7or6YKptig-(*F|7QWyfIhwba9rlXlH>R~EpY!#=qLigu~Cv6iQK4N`PE}QJ< z?X{(NZc?*(m<{p0UA%|m>IDCyQm>F=1I;?1JTu6mT|g;sh%Ev3{;3~+1HA;hS09x zqc~9+P1rz(`2-{uCanvZTFF78IU0?s9}A57!ZCN=ddhz$8p>jEsO)7x{#R!MjrH%( z?|qKPgX!>n1D>Og(--@e;C{mzLkB9q6^S3Aa*JD|)eqWdT0APh?iL3lM*Z|yZFR!# zxILhpolaw{vmeTU9d(rkIlRjvdi7^qrfZ`JT? zH=0}BQ#Z?%bc>wm01d?kl<>&jN$#6A8%u{YSjhRFrLlLL6b`6r1I@G}W2R~~LteW{ z>Po`G-!;oMcpGVO(y>t?0{8(aGUbQgA5Lm|Uhl@fX_o{x3BX-^OHyF{ys2`h+s<8_ zh@2Kztwoz0CEamz`}I>23DCSkgqm$Cb9`MmmZzN3q3I;e0oyzA^+(W=G=&27^(R zsG@cPMA==wto|ZL^ueglf4N+1Z-0%xk(a~`vu+aQnuxk$t8!6uB(;~QBt`VePhGz{jZx+U*ASZ$&b=9>zk#9jj_v9fB0?!*mSykcX$m+a!QW0==8g0Vw$X#nUETUs* zThQoE*#*@_x6-Jii6}EO^X|!h+ zs2t=FPdDEUzYB2yD=VEUkny^!>sEwD|G}MNEiR9GS94MRJ#$eeUeQcBJc7d^YIb2E z*7Pg*Sh%K)G`VulOZqm;#58e#wR!DNly|FUJiQx?$%xXr{9#i;|1dMVON546Kj-~f zO!@)`GE_`boyI|H_H)_1MZ)`>wf=L~7|_Y_`<3Y}448-a0UESRmtXmze0%ifT2q{j zOs^x4KVbjqM!UJiMMdW2AGXmltsgzRY}wH7e0q{stI7f=2tLV9Xp{aL4kbjp6>DwB z7ru}iS+x0`@!Ge3%)oxdu>%ki+ETY=AjN|)vM0ebg5$;YG$u#G|8NZ{!9|(y@J_P7 z`RLEZZc6LvddFiIDajmjC-0xkkKebmyb{0T4M&E!Nc13;#iDfL_6X|>5bPrR3CgmL z5QfPpTC`KO_2djS^#Um;axT>gieYBZ{%#*WK__ynXdmx2md?sXM+m;zi$_-OPF2to zqdep3lSs}cjjc4sM=Dw_QRdC({DH5 zz(aPQppb?A{rf)t6Pyr)t8W5x{8cJ~aG!j~A01Yb&D;8;v^E>;slW<{L<}|D`Rm=U zlWn#C6G(X=1sLl23uVk*B@+&{wFDm5KPX0gwmiaFJ^1LO)unEIeYG!u?^OvmWXHI4 zR(*>HOp-SoS#H1YV-I7b4@xz>NYG+gSfJ`oJhgmGm)_%F=~Fg7+*f43RAaWWaLE1M z*A}n6wIjm5DYH8=DjLe`CTCk$qo}%V^qW`o%OK{QB_q6W4VT;Mdo9V2_R~jymokpO zupJP`S}it9=~sY7pA1NvHns`*>-%+8hu_Tr`dA7u8vTW6*`fUsnFn`COB2epJ@yPm zUs+|Dk?M)+bKGem_>4o4`K~(HtR_33CjC_X(@dPO&L6y2?sq$X=wE!Jtk^^l`90Df z?r-Ms##{i&aZ`1E8fhk$0%KxgQU$}I+KWtas>`|ZbRAW;S**3Xn8lNL69Bc4^KlJ0 z&B3%i&}J}-_edbM;q$Kzpyw)CB`(_BA}Oo2UX2`Kx-P74Wq*TQY*v1$N>rKpo{Z z#^7lnGm_sPjAmg7S70*g54$_0W~oJisx^5oDay)i+VEW|w>g|GaRz2rGsBdl4<9%` z4rK|hzuMQ?kw^it0wUl=_Ge>_qKx93TH?-sY84U1|4V=--ZbuTpZ(STFW>;zINLkI zIT2%%OAFjo`|c2~R35cy86rABJkjTa1|T$ra&r6N3TgSY4BGq@)1LdW_GXneKi@Ol zq(A%&(0=$ClcDw*p%-9*Gx)r;;7pv@qr2~2+j(!}kv*{TaVc7NZie86eLzbaCOh?q z?k9Hjl)I?XsOe3(yPAJL`O; zb(kh}NlGoh^4tu@-nyR)dOYj$OKH!=r@P+!MKEld*`udB-55E^V9KDKhl9Mr>YM}XIjiBIgLTu>9|5;y8Ws_m zh|YjB*AHw?E^kiOJJR3q!=6AzIM%vb;JX!0S%_i3Gr)i_u++Sl?U$wJbFC_k3c!nP zy)l!i6E)DzC4dOG%LXR7yiSLfYwJqbt`6QSqr_X; zZ}1_-e5EqOERPBz4MZuS5sGAQRVrr`gdQ{UQQXTseztaAsXv%Gm-sfUW$NjwK5D)` zm~{5j1`D%*%g@HNg72f|8PvVm@1C0XOm|)-XA~>wmzq z@q8nX=EA~3-ZNQ2j2I%HtEuLg$ar}qR6XY@QC6T8MmoZ)=P-bI)llU#&YR-@g@baX zP(+q&<*PRURiRWwQp?m(l-mtT!Xd$D`<6(4kiq3dySJ7}t63YA<-P^KG&?6_v{BpJ z?*Cur`$yO-5d)dv>`pE>GE4UG!RRI9B<_=0(tE4)%}yU9IhKr*#P!^l&0 zqRmR5{ko78j@&A{-xRdaEU-g(%v2L@k>knY8LFiyv9QkQg~)-pwd?TxB|!Cpo|LtgrLAXt`)|L?&sG}f zze{h-Gd_X)Q99EzGX_#!uPqR*b(iRi2OkDraiNY$91li(0a&E9P&`%od(a9g)23?g z`XM8a>27=<%Vs6Frs$k#p0;cp8Lg;&rv{nXIBxjC*G^#k7VRBKu1Sq*9@2*6i%!!g zj_&{y?pVFK152|<@^m#Hjmr`u7NcS_aorfST7(h`&^mg5+@M0roib$}&@yddM{D^l zlZ54iIF>TofuV*2X&6xP)bA!p(=!!q=4a+Ub@)C%n1~Y7O9P2g>wC^%hRg|H*2j*e z&<@)QpF;(|%e$V=O;z99IHl~eqtOg>VB*cLy1p_k7k=TzEUyi0wQBEf5CzwJ`t7xhmhJ!Du{ly#!S$Qn4uF>`C)MOeeucEsYM(2Ci=;w{EKr z;5QD=kBdf;mV02-SCbFIR0aq+lM+K7&({kF$=bF#$;nuCGBvJGpzNoheBCV(Vz2$2 z&{hpGb{66|%(vuqyX=p&d2O~O*%s=%mE5l zT#f+e>c6oi&JNg&3t61q{|Y?;N094Hb(HJES376_@-J(W+1&KeuMS0Xkq2^!)DRHC z&nPP57Ri=_yJ&MJ0d=z9`KcE*`M!*}lgV)4vI*ZxJ>ljd_^^b^{UjV^k-?KNSOb^q zWYi7)nAexvF3EC?GTXcJP3Lj81r3cbetE11Iq8-syu}on>+&u8&^bYJv>s%rL18#v zL1G%H3uGeA(+@H9x7uoJDkwLPtSR#YrQg(&xEP&$7=_XgmrKYK^93L zEoDH^nyvL5b*v%E7>XzX<~zfVlmI1{PS;~MiEQ-1X=i=UvA?eXP`#B)`x!_3^=G;w z?8)!&r0;U6T&y+k*y0N|LfPkG4+2nJryBVj29EBYk!db}4YN>N3YnTU3O(tuZ|j{J zK~l0nmZ0QBLU@rsDkpM_{(5G6bV}redE^SvZF8Nn^S#9L1ZGimZVwf9K4todoXP0} z;l^;q!Xq)37@z*5i1e=`vIO9EKp*)2t6l`85B6lhmT}c;|N8Q8WZDJOf42r;%&n&8 zP{~acdoclK!Mwq8z2#tuaV#*1=Uj8&j!wS$*DS4IqK)S~P<}g+V7hq^x4MlUy;(VT z^LHH$e4pmhR@$sDds8&262W~UHM5zUrKw*SdMr`ETiV3^h&!+OU#Mo3iA9xbqE^t9 z7TyhvKRDr4IEZ;U0PfBnCV<+D29OW=*p$WtaMmvqaH{L@YS6!u&Lr{IY8^`JKcEo+ zvBr!5t(s;z!vFFuf0!<)Wi0NSo1N{ic#7CHoHJd= zqz(Q}M)PmYw+Q;&xtABQckaqo8bw8F$Kj7AOJdbZ2M#mT79$FNwWCzqji>N40?8b| zDwF%AmZkIpoQ`K5m)%TK2tFz$r$oXyPI7cnFzfZ!v}1B;XM}x)1Hf2@Fd@q;b*?8` z4}C;02C)+d_ffbk`@kTy5EcaE-6 z{(xdbwF_h66v8QU{Jm8Mrk>LYn#f6xl zv*QHM887$65a~F#2!{obp8nwiz|nNTH3z5|M>cf4Bb!FBMns6v4x?7N{$<=8i16(! zEWsk$oY3HOZcqy1t>o8Cxd|3kE%p(K+b=WPH;s{uiDMqyHZt|fF!}3Wgl^R&HNQF5 zmbj^#cikt&GavArDy^TajQkp}HRGNSH&v1KHD0TkHolP@G~qLi+`h=?I+RbjUWT>( z@hbnr@N~$mM#_dpk}nBOgsMw4Jn=GUPIwn8&__s+R_t|H4fKWZ4BY7q!!wWjHwvFC z!E7?ihN+j*&sTY*vsL!%bZo3A2Wen9R=yOnC`U!CXsi7fR>NE~vKk5>bEZ1nqG{ z#c@Sv-{)ODrBNVQD`Z~|&dq`yyCSjXkaC&zjp{{V;1yZrz@kPE6mseng&#tU8dhy< zFbNsA?%9_~rhbgcr+TH?>sSlx7XPgxn*G2&JshuJDf_K8h7%#P?bY7RMK#xu#2<-D zdc)`}M$D`~sqlz;^hsswQp-7fdOY2R+tSSIi%?JX^K#cBMT8~+_roWnCkKCY%kK*F0k_FO%m8j$8tS|G0 zSj!sO7NAf+W5SdpQ#qeHIxzc+hg%V|^_|m=8x_3BzGhVh>0%Siyrav)VyVv19?N2^ z<+pEJXB5#C@>w!PS)SBy(hoA!3_AdgJxUEC9D-O#lzRez+4Tsksh326`I0WXp;0u{ z3?-L=20*kN|GkMaCyQDT8!PJ%QAvVHzFT}gzjgH!~N)XTqey@Tx@bXI8o==VYv&rdeW3S z;}p*W?XUJXshqwGY%7;F#1#6|Hd`76uiAg9~mG93fB<|0xcxh-%LqIpgCuO8qmG4<|G} zJ};hC-irn~isQiasm%6;3NNs+smX1a#_}XEvcJTmK*us~ZFmSBF*@0z1iG>shS>{* z)i_?FDcN9Siv3YLOU51Yi`&g z1P;U1P)PPWBOJyXfKh1rEU$H8A(Vvfgvp64M4VK}D=^mq8sJ_)K$XA`)lUGVB4_x~Tuej&;t$BAMkL%INv0XChbBonnIqF%sS?hM8NtNurg6xl z)pU8Z*TeQLThGXYgS((Pdytk-r0TLeY8Tzo$_^6AxoVk{Wu~<`{B5tnKOpj3am98u z@)KAxVLdNjQhHO2m>hR1$?<&<$lPXOk8bk)@~Ix-a0$_9qs&J|8$tUt2B_S88iZ!; zCR?_$kE0!34|7$_X!a%%$Jwt>lx*zmX}iNJngHU!+jA`H_%kuWKrUGYcdAjsL2ecd zB5J-8ttZF?WdXp64KzxZFhXRV&426fC|7C*`6Maz z+avo0Je!cpsR8cbM$x5U2#2o?p=%}AVAbhxtZD?&Z9~!YVRn=J4~^1#Uwds)lnd(^ zXGy>cQ8l=Qb)2t!EPejb-A($3o@O5klXQv5W9(MWNu}M(nB7PKm-N!RDc?LP3*IBO z61j5WSFdPQH-lMXloPhqjj|*Q2Uue~^@c2Wjmn}qWnD)SK)G`!9RY$v za|C_n33b5J1|wH;(r@+9oVron)>cnh7Zzxkg>p)9+YZe=c4TZ_OL^*9g_n4ro%r#tgTm_@| zff`or4%JY5iV34dx3NMv$d`YLx<{W~P^4V6PVWh0C(~V&y zavsGp@e?RAz^`2$POf+#pN0gRClh+Y)UJedW z52-$Y2j{Am-_M5Ax2=t)oBuI(>l7&UeQ4uns-Af_hj~3mT5(D8`o+gX^VVEN&60l( z;5wh%FTELnPD-LfXw68!a+Mt+RRZd(h3mK*lKyM z10TXB=b;XGACS5pJ;l+flb5HZuufc_97xXjCrA{R1bXk+_J=t_oFzvqdz7o;@+MG> zyX4F)tTrrUJ`BIG#SCHFMORxF$A9=B?LDxEB;iig1rrnA>IeEQ7ieK;*Ckr$p>J+$ zQwE~QYCzPcO zx~=(yeoqb!fP6sIwGp}T@i4hqM$)969Sw~zbzoAO;f?{=RcaGH&T$i0zAS{FiDaFd z>8GzBd|nSa$z;djpu{dS!K5QE-2zkO2ti=-CZcP^!JdQ(u0Ctdq0**Z%bI%R*=TAL-npx=VTA<`aPD>aQL%abHS4Y$4YyT zGd%27fP#Zex=LAfL7X5VT=(BGM}Cmahu`9P0)ujxi-!hVu@D!eZELyh7QIQTm?Q#wybO*L@<0v#_s?H1kv$-?7UH16W$yI-lD z8btyGd>jP4$!9@mN15ME5V#cd;>6p-|X#woh&4fOP4o$ef~WRlIJgJZEam$ zwI9L^HR0e#q^zFLApen`p1wB<Qa^}tK06bn91ig zFQpB1oLc{+S!Fyu^a9JUxZn7lv;Zg(&Gw-Pl-F^JTY?*y@lI&Ah)g;W`?7F|q~Po< zwHgwAgWky%X>D=qJ;ld}D@iTmu7*8>@c@{Mto~=G6^Fqi%?=+>j zY>};B<&{>_C=7YMh|o;r+M?aqU+kdvwqKa0QbmoWeUct_Mh1r`hOi1sl4SOqGJlwe zX&7y!<|rCwzT8YvJAY^1#}+6dHQHz=)8jN(wDxe?nahfIH#tlFdi~N8{(hjf(X+wT z!Djx1&bfgXunFL2QKIm`j~nfvOKgplJfEq-1k@|W2m1vQ}1`SsSAk-lFr{Nr_yG>27}h7Jj}FyIX!hpkb@_s zeZ81Mej+%IxtS_AJghF?tCi?K)#w+7$8tX^X<`?m_S9d>F{RaNa*pnaD^0ZH(#9a2 z{P<#;k~EM8UgpXB?qdx9m`?GXaI(Pm-Y_KF4@XQ5_5RbRleJ8VqF`HjDO9>o4f4fYErGvfSE@#Ry2!FYxc zT*&vjXoP~~^z>2?0`Q$^_U8hF zuYVUmzC4~C<)`xZ8vfChFHo2E4u-jf4r1@?(Zb_(&vc$sRriRv7iZA#EWbJ1sQN8Y z4%-$}rPDI)$Q$zg0vO6UW9_+L>`2l~NN_^2+V?sbQ=xs~3<&?+6>-&M6Y?p30bcI& zy}a1kYEC}Vu6sDlNSt8T)xB4Vf$QsgG!Gc~<(fO-C+n2m)?89d<9@(0XBr0`zTr;A zO5TPV*R#sxE5Gzf8L#Ov`U?dpDDmg!y4U*ixjwq{Nsv)mvF5h=2twUp=fBGGn1k zFFNTgJ~y0oMFaZ;7c8&Ln;NA53$;QTD;!@HGwHQx`^|*o1WV9<2C#U!Va0$~iWEEC zx093m!JtKpGi|hUL@TKSoUn=%`!bX6@<4C+f_G-L`qjglNw9+#)79BAm?niNDKrzc<+IXdMMWzfTUUtF6<6@%CW^ z9T%qCGS6|v3>7-n>c~jl7Zk~5E)&PBXNvu?ROmRN=HZM?jGgS;Cj56GsOu8atww) zKZ*1#K>!n^=bCaMzJww#H4LsdSPHD@lR!s_;z}m#h6L9wM*f znsjG^X4k!By2Fqvo0%nw7~w6?AD1DnjS-HKQ{7ZeJQFYf4B;JA19RP;aU|BLgs3pL zx~S;`Z~s!QXho^brcjf~_pzbU68cu~Wd6cBP%?HO**9HAM@N@dmTFaKHIAJi${ku| zYHp}4W5n}Iirb46?ueT#bCmOrW>?phNe|m=QmY>l=ZPn-0?MWO8n)x+wrD?Gpm4su zBn0_!XgjVYU4zeBT|3zZR~3{?N@*(2nCjprC4m&(ALc^B|D7D6p_1wnnt%L^^-U*} z5~lv_P;AO@(B7LlFoIxKbDC1i6J7peKK~x^XZT;;RAjn`Z&}a3*AGmo}zX2l1UBK%I_#b7%NDM|Xb8ilMklXi zI=ccUp|&Ue)=-Da*e^*5V)8uXlfD~al_v)wh)*>{_~D^hD&mPuNjImo@W)Hg^M%ot zCD5PEOk@oy=KSJyePHz;|IP*YcjXv2T`Ft%RZ_!}B_AAGHqtNS#0f3xS1(RstYioZYb;0kB*Xih&D~4N(j4V zB1|DN*X83o+z&@ryX5BPsc?^pm+boZ7!=zS6U)u5B6RwJoD=d0g~y%gPsTP(wZ=H` zdm1}=I#lwSM}YnpxC1`nov{SU4H+X@{P&$?p7#S|Qcz@ZGy$+m-CE3BPX*G4mwu0K zr+at^;9ZvWrD)lzIw{ajb<=WkP}j>NIO7aU_Y(;EeQ1bt{f}6eX-*uQn5d|z;_UX9 zR!^Hr+sqyOP%)-2gi_~7a&~oDN;S6~x3kH8p|rty#)@oTu9XAPfv}Z<>GYp~iQ2s% z@CdPxIeHr=BCejI#t72K3QyQw?7IC#pkgC$A+| z(xfXSe5$MhD)!?d7!uc$8NM(xB~HduJhszt#I;bb*K&qNE_HZ#-MZ63z^4;8RpRY` zn+gF(KXuhYp2J~-$t(B6!9}?X5&;e&dR@;+Q8|GyJdV)C$11ocJJoR6;CG`}-ddr^ z^DU5U0*>goPnG>fsiXNSkAzQG_hu#}Z|h8i2O^89V;ls`YGspqzN-O7dQ(T?@}Wb1$2 zlTcePP?(-2Yl@qUp7A1XKl~DB`T4FohgkAAa*WcA&*|wkI2sQ=F@=4U z#=*)u{SpZ`Va!KjD`tU|$r{nPHjzX3`PY18bksd(>v*ElHyC~^3%fOL8s#%OACMnv zxILtiUCNW&e|>*6if|j&dA<$K>kN5pQwsFhSdhTKJGpL6yOet;yh z;PbhrNZ03wy5Kyj=9n{yD_wo7q)Qhx8Gf_|nCx*Ha(9nZPiM&4fS)V=&fc8@pAA38 z(@uY0cugdim(-o-sL1D5CCLnk9eYMQFG#X$(ZaAz@<&no*s~FSYgi!Q|Imjo5@o_SGD(R28PCq z_?6!mNEGR(aoYrc2DhsAFYr#Ta~yW&j!|}TPgOe_6v{WYEzRpg_DLCj(!FA&bSqRZ zzJKEeHe#rJQA~G&_pR>mz|ZsV5Gpsla=!|F^l|6hZWBG~+n~Gpj1k%0CHG1^Ya`@0 zrKbGL?rNz$#5adwsq=j|Bt3ND|m3{3Yyv3B-1izk%&^ja05#Yzz17ani&xyN< z=%H~j9yhvO?|CvQA*ab8_49pgCidXo9i~Y;ma)#qN-oxqW=&Kj+@10+pf=jjrfhg+ zqGWAcJ#{2{&sv$Lc!w^1{cp@64w$ACgf6-|WAgfE&Tkei4p{WknxpHF|N36QeDK@9 z3`j!AnQN0_^bR+3dX1@#n?i}_|D`1B-b9@!CQ7ldfT?;?LVM^4H$~GYdtS`|cg93i zE+F}w2LzI`n7t@SbW8s(CVN^>AL9JqiTuyG{QvgdU-tJTI8>76eAEjA0{D{@l@qBH HG6?*Cd=&^q literal 0 HcmV?d00001 diff --git a/public/images/developers/speedrun-staking-app.png b/public/images/developers/speedrun-staking-app.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb32704135d26d154bf376cb1ad0724f1dc7db3 GIT binary patch literal 44729 zcmdR$W0R&ayRO^jv~AnAZQC}cZFAbTZQJgC+M2d)Yt6gYUaM;Vg#95E+*hS4so>6; z>qw-cyaYT9HVhCD5WJM6s4@@`2p13#us#&TzY>dkgkS$6U>9WxVW8Ss+_QffQ8P^` zb2&L6>VIh{AmDH-Ah7?K{0rFs0uT^rJ}?mIzZm#GW%(fg^A&_EAM}6H!216&REEvi z1OgHSk`fhC^#H!?flSwxNMZM}KbhdN7GIFWHlyL0;@Vs@G+`VyG)X1PgoFKQG-SAJ z>%UGEK!1gL24Sym2xN;MU`N2Tm=aQ7nYI+iwsM|btoVL$RhV;CIQ94lyQb#TaQWDV zDci2paXZgeDT^@u10@MY3i1m$GC)+2m=O8@i>xLXuvvmdsV8Yj{nL{Y!jtlMa_~Ja z|0D^`k>^&jMN5**-NCBt?Z>!@i(;Bvrq>v3MO&|a23*hLhr<|fgKopTIc$Q6gLaH& zFA}SAkG>}{UNasi;eFL*^8`gXIo{h?62*%glaRv7wKDmBWSx0-FNtx+j<`;!#z}7( zAbr2!Dd7v}`Jq~>{g%K`c7SuLNFp9na zfu9^z5c#bi_RYIf&aiK|LV+{xm%j9q6IqGj*(JIF$`9&V3XN*5EysfoH zs!FG2DbR)i&rR-l1vs?m?;4C;yb!0@fN*Y9Sl^yPB~MB%;dc2ii3;TGsWZzz4~}-i z`XzpWVmL6nK;+?yCqj>#_{lGwI|_5&s2eJ6soW|#t~`hla_Tg`h`xnHnwk7RMU_eA z$6sm}$z6j~r(CrBkQ@A%-?H)EfM>|MyzdVC;K7Fo`+~0kN;fSl8gwg*LWOEj_HIoY zFh6;~X}=FfI^w(qt;g{QF4T5-w+Bb)j>@ZjXF}lTn!vEdeEn3yFD z?=SBVU&gc*Pg_?sk0ZU^?Y4ZOs9PZ(fc7-ta6fZyoKQMBAkFB8$sP$^@=%=N);J>X z8mn}#R%D+M`?Ky8*Poh4OitUe6LVZWIF&75_a>4Y#^b%WQM()ywS4jr4!;P*=ToBy zv3j-5opMW|%`oVrFTL0&b3ReQeH=Ko=%!|&db$K=5JdD9Bs#UknAT%^S+>NoOXpVU zp{>Zf-;^mJ^2U-m>-CAYuS|t7xb8kPLTp=;8L- z*ImeDOYTw9A?X!4y;>uwfaniL-6t9?p_G9X!ugEJQ^za$t&|~aE_A*fiM>Xc-^CLK z+_8F=ue?e=86F*7VYwtgj9&nq(r+WMBcUXnH}$T2+=bW_XaMOQXWRc3zEhs^7WXue z^-aWsam`or67=BHJ1fOcqf;9TL5%sqK!lO&Z^GurxE3(E`JiyiVQE(9mn%HBIm?Ty z>!o2)NQKgtn;^b2+oB1yC8CYS8l3lXyQq=v34~;Y{PlShTG(x=;^?k#SOpkNhDDxN{c|=7!Q6r=P)S5J3Yg*^IaR9Rfdq4 z|Ekg*Uv$oQi!m7~pH#VuU=T7tbXb1-jiewma_zT@FYa#8FZe(1MtX&Ef&>k4dHKZE ze%5@8kABnq9QS-__}1lsoe(NzkY9>8@A3%Ty3h-CAWe_vZQ*_ZPfcEFKM5#U=|D0R;$Hh8t&7doz6R=DBo-|Mlwbs*&Qz@J>5QXai1a zHBCon1Qs5CQnmS2+!yjK7B!626DO!)(|XJ1q9#T~D>tg};8$E}4q*BwNaR*-|-;x=D%uVL}bvRTH^#Dxv} z4_4G`Dg!kLl7qVCEjFAe0Z@-a3(sj}FZsK#f6}XtR*^IFHm@nK2~mLG3%dy8A{?yx zA?EmO2B*B*>#`MXag2oA2~%ab^oewlV%VLL!Wp&~m%i6pfI8el%^!%rk z*3q!_lpkKT!Uk7sB>2li<$U_IsWIUWAm^&z_>J_<0u<6+@eA(FM^C3DtDphe(*l{0 zk8+TsrA3RNDIT2uwcXo7*6EL^Ycu!PoKn28Blx5)ZXYO3&ptaAOu znsL3)?y{0;LfzktqC@`EGi75iHYxmzs=~jdO~yo*+r#OZ;ZUm^!ASUy|JA+d056gz z1U(=gxGAU|C^UX>b|OF&I0QiFsc)bpjreW2@XlG6Zc-*m9R}{1C&b^ms1GHw2)eH% zc9f$jrIaE_TrTI#D56IGhm@pnP}CT9;~Fm=r*5P$^Qy=-O&uZ~uW;+M=^`YY{*+&~ z4@B?B2BM$M%$YkrVzEHPp8zhB0gTgTX813yrR<6UOea>X|HL8YSMN=EdzoE`{#J`j zWj(r~SwAF-ekY76mRTYkVMs$IUk_n*? zN<0(=e1@Ev&)kL=jH8<_hB|i&d^M#>QT2LI zn}?=8hQ}BXrvziTZ*r>c9P}b{B!+`4Mg@0FJE&jzClQ=;f$SV1_a+&;)1fcG5D{sMWfwZ)JOb z<-^2~1Bhy1gD>PXY0qvx5mAHU_$5mTG?Ujn5qaVwo-B7>_U>SGF=1MuPcPh)y-B(Y zF~#4}EM{{4V4}j>Dn_#OQWe1)%Cy@g_QH*Rxs(TFfB~5quGJ02^*RVg3}lfn%qoyB z_FIui^HSMv&Ftf1{^k!5+C}iOv_;Epy-%#@p0sMW55?^4rH42bV9HOa%I=$%2M5z6 zy+j5U=@mw6RN;e#bEVn+@=81Xp8C35~DmibkWLxl-%{TMSlA{QWf)$PtV_&nV8F0UH7_ftu zd2xMW#>1G878TCh28UjX_sTk5;k$KclSI`cC<#3asPd7}V9SB60@2?)y$;fG2|@E} z6Djb&;iGI6UaI8ktw3Fq;?nfZj;Dnqg4QgihFQwv;f5qcNF@RRHb*sF_lC!(kM}6p zi8q4F_aCjToYy2>bI#9I?$?FLt$j&B55HS#o~MqUU?H&6N2iO^+G)_1ib!empghF23rWOi?KUr~({C23*D?EPxMT$w_H=(Rk`&ID8bEdYLm6 z%#iI`mV+v3UvuV)V6Qs^!@PHLHWoQHhUE<0Qy}_)?-y9i81+)=?1{w(EtZ=Qk1uUF z>W%0!IRt&~aS5J$DN7FS9(M7(35`OKG0jWfhIqIZV(DJ)in7BI6ik@y!A}0Czp4{P zVAih`m8**tnjKH-5V%!2kjL7;&xkN<=(fVAO+osmhwu*fF%L=^e(-yt6%TjwU5 zJB+Xp7``+}ut=&V4|o5TE%xu$+b4)!RUYHn5Hjt1`{cJ^rtfUJppL1G=ktL0UIB;4 z@x(B$4}*a2%zJito_h|&s^!k_oV-;8VyObGP<1L-_fQ|vB%O@C_+I2h#LhV)Ht_vC z8R@T>y}ZLuL4${6^ufBPVROGOxt?y=7e;LKudzCUc6Wh z$p>nWO4#HL=cl(a%O*Co%V=hQ_j9S8UG8qpZv@Vm40hRVMx#idY{ipUTx~br9P58}`f?HE&IO`yhB>hG9S7Z=_2r?drGl zf>8Oaed^qtN2LC!S<$N5{TQ=QE;|MqO9GkHJVID05t?29Vw}aQ5)#l13V8-oP9rDe zh)Udr7$xJh!C}L#%2P%w?c~)r8EpNgy;q88bh+$SPzsaea!#%dO7r?sq&)Q~zLI~G z2dpq>aj~@qF(QuA_^#b>rCHE4-5fO7x^Mvj0nf~3y&xTp0rE6S-Q9tJk*Tl)G`bjj zLFNGc#ilP^4?Pgrpp??UzRg@T++>`h7u_&U+e+BIS>HWYIWv%~L`FKgaZDE$RT5MCYHM0n^WDD?z}PQ;ZzUv)N&0H~v(=M6}yI z4~6+EB$Ko(q(CMb6TfdB@oSP}Vm#f}HCvOT-=1gTH3kG;=qV6J1(J)HfLnK$jojQcJ+fz4y zFU@9}{JGD+d4zzfTg<*6fl&paDRme`-unPL-w7Uh!(im)CEP2U6*9aiO~FRM5Ak-x zVihqIS8IU*&#l!ephgdo>ZN7KqgP{+Su`Di1-XRi1O+pR0|*!*orUX-IQ%LZt`*cP z0Yr)}mXP%lGW5rsZBo#gQDjkl9=_U=t7*JdAbactRAy~Ea<3o57OR}PMmW*0h-4-) zCxI$KyOf798l&)ca!|zgYOk07HE2=yM0$qXQKIFyg$)xB%4+%du5)#zE z=NpNhsnhVOYL-2QGuG`C!>#o^T2zO@6J?IrXKdU#QB6R%#H0IvkT-lSNoZIrsbf#A z%{wVpOPYL-PH!j>02zg83Ni^I@O*KuAR|Nrb6t+DtE+ptH~i-2#R(KW$HJSG>y%{V zL;&d4hNBW%6(-c

    Vqfa~!Bk-(X3?=Ik|C`Zr5W?usby2T86Y0Yi4w7$b8)6lz6D zvjY-xNglz}?=R`pR)MOYt4UR`KF^}kutPuWnxRL#j`>N^Yp?bWPq=sQ_}CbkMDTm$ zj3Lp%!y2B3gwGlh#gAG{>o=RFoQ6_<9vopjeqEJUSrbeTUMydrsz^Cwx>S!=xw!1H zOyC5D^CICW>{DkJPE-PCs?!H?Wx-*^0raUQ&(5o(K z5{t|zZ6Esmz+vdP9k5h9HI;dr5uk@WSOTb5De!xp#l6%L_wAW6#=N8G=ErVXw*;dZ z8<-S72TQYpdQy*Yf8*c+`*&QzhhIFJC}EeUuI{xv-Lz?lGu!%p7%hya8 znC+J15X7$(3Qt0m%d)2*b=X>xw3lq`lvFR6*uPq>fr^Fe)T76xIz-)6f-YR)hd)># zObfw+oLe0<&{y4q;1w2Qb9x#s7#KTXYm{)o^;z)OlCNg-2JI3ElL9PUdi)G&n!jvV zfN%1w7|uC!K{*0i>ww5o7tUMd=wY&m`~pWlcZrl)ghP^@!|Wi32f76i#2BSeKq=(q zNQE7+1seD4ou|C)B0)oEA7090W}rz|e%U{_O7(`sP9DUC9&{YLAw?JS=63472a}7Btv`t+q_N5wr6G;MTB1+Q z`M5ogKG4X~;{Z}!TuoJqOh(v!6Thu-`H*N0%F8MGDDOzzj&WgxZxbT=UOY*Mui4gQ8o!PgRqtEfo`lpbI-By z7Q7>;U*s0bQGR35NlIogPP%Lpd9WN|I|L za9G2At&&E=adLihg#E&%d(|`Ltd=gFXI45T>&xnWx2D01MW4C7aU7@mtfmziQ}8s( zz3x=kw&XgUu5OUf1Kjs})cY2Y6Pb})WW6>yvv-KOwuTt?r598ss97&Z_y0| z;m<|M!kcvPJg+SqroE|)RX31YIv!}}cWmU0S}l9q&>Is!`IjcN1c!7Z3uNhoMV($&@#Wz4nyTV=QNA5hdfRI0qu!J?c&s< z^IWk*y#wd(@L0VhZ$zK<#{1p6FXG_Pdw3-WHA8W?_%6thVRBYhIidFiyFD9ZL}q@5#oN7cT2vznCo=>@6h`1 zC!MvZZ-tz2tFGj8+AZv)q$Jj##?7nbq$CulJ7s3xZJN5i#5U)nP$wpNO>&B!M% zK6o$wviw!ka&HGe#wsD>j2%9Sm1(P@yu94*e+Ccu?;cGEnj*K;kk3Alkx#xjzr!d4 z1NY^5>4(B|Jb}MWZDDfs4hkU^xpGm>6tRF^v#1#H89d(40w%Q>#t~#uFAvVtE;B#= zHiy!WVS3S}C+oGV2gP}eofr)Zz(DNQN&YBaaUVIr!b}E0_M2c;8b!E36%9a3iQ#Vu z&wGAaf#U6i{j?d}eoj9&rW)0UvJ2-ti+y$@_>$L(nf%+7J`kF@K2dKT7>1jRo&X0kUtVWW8b z7LZIG(@|5Ux82e>UlVjrFBHFe5MZJoiIMHrQgq5=S521Fvp4i6!TuRT+6`mF4f@AJ zQ+eYNL2p0}Ro4CHh>lmQQOb>8PS}kB1PRH^#S^1PmU_fX8JyV#%|zvks~~05COEDF z_55&cIRN}jnR0E}nYRj|UK=WQ%iWZ{^Ozm{y#*^>;8gKM48Cm?Xi~iYs@guNV5M(B ziKveVeW?qHEOsmzsE8zCjbAc9%pM~)EkH239eH35T+(d>Ve<}SHa(_cu*R)8@M5qA zaUH=ka>5qt|K2Kjz3EoDEaA7t#$I$FT4NI0J{K25!68~s$Gz4Ndzut{VY*YZ3|kda z{Y_PBr}nU#e^aRulAptQb39u>ez&(TUP7ils;KzAOk+uQD;>!+Tp1r)j7C{Sr0tp6 zJ#>u_16q@B@lBe|PGQ+&ry4q70ePNg)m3@SkpVutRf~?_iNSDuz$0*-*!Olx{p=H| zRtCocWoW*?RXA7fDXz)9J6qnc7B6hwi<(IF7s?7XGsGW2l3v{wJ}#tj^k(XN+NSgq zWbVtR1~cHWzhEIf`&gq?v|q-qSII)8R+W66AhNHABKl%j-wqcXrc^z>JW6lwm+r_A zO17)fl{td9Y?GW@@=LJh$-rYwLpm@=5zSBnyx4L_nu>(&7mX_%O`T3dFzI0U!ue5_ zhjuI+2#(&o(jaL4K?TS4Sy~AvUwD3H<2;rm4@28+Hp?Nt{Xxy!nzBr@Xad9IRP3PTTwEM4*u^LDNa$NCNXe$7hmwpGSwVHEhFN)RFDl4wZwCNBCa{_kB$#QZCX|AHk18k?CQ4KIPQXo#on03}tHe4r++N z(05|MZ!WS;NUSzQ|6B@gWyDQtf@*1suLocU56c>OGRq78-Z+cvHGjuqA7E8@UKEta zsyXEs)(8^#KuXVV@si3k51@9`vLd^lnL2b7!*)z38}5Bc-T>*v*^UkCL)cw8P-}lp zC^C2Lm+*psNR#1yjzDJz%$`o3D{{#`N-MAwhknO!S5cEEo@(HDXMtL1^`Nsf#vpNk zq=V^x&Y-`8$Ybn8@D#+9(}M(+0uXGInzgoK7PD~RR<+)XUj~EWTO9_mw95(vZd_7S zFfRF5_tw|bgW(5Qja}l%eFQg1xeDxAi&p)x+^NP2{&?WV`qK&a;`gV8?VAql@Vb6h z(H=btl-t;#FKH}NH&()g<6nc3XcbuvyknRTs2^krhM796+QUAU&}k;*Awqchx3?P{ z8JoH*Apr%m09U9iuv;iK%3siwlW$h5-=ES_?Qu8qUAjM-Z97F-VG!LC?405VB4%o2 zmh1M1Yhds4i8{p}bAwbYSB^kY#S{nI*`W z!=>dY!1a;uuB+~sA63nex2SMkvD|n6g2Y`L>1JMLtTvp%7#;he`(%wnOC5;^oK*dj zExXiaS5ViD#F}Zx@an~w!F$Mw6E!kVU@iKQ^CHLPb5vnoq~ySGGnu)F6bCM$O0==+tQ0q>SE&0cb<1><9H8OI+Xn1U zD9YdTRr^rx_9lYG?|94(`V`l_zDFia+g6R>Kt=hS6uWFWWxK#V=^Ivst`=fa2q2<) zBgWQ&w9*{bH7(2K;j07~j*5g;=d{c*ae!gv*6{*837s{BFOxe*cSm@k{FF3^;q*DH zs_HqHLo(#M-RmdvFdxW;kZc*G07=#!=ve8 zY$K0=v+4vwx81JLQl5D$v!9j0ap~0xNm7EVjM7d%+X%Bq0)DR*Ltx)ws!r~Fc!$+g1T)8y+K=fyRKaEfp%}iAkdKe+Z$&=$D$p&kvXeb ztZo*l6O+}nJbhWMn;=NvOO2gB(Y;`z8L(0X1D4ffx|P42CQ$^`IbpK(&;}(HXcDe5 zpI4i{qdwl38t(aL@ zd%h~$i*EthJww1@lHF1`ms9WwSI8X6U1d!iBo(z|~qsK(L z@GpgeTlUI44G*|yijlQ_9Z7xbyK(q+NwVwdOPH%+eQR6ciO6zOHg?t8^SBW$c9E8Y z?3ACYgGG>Spd(A{_=RycjA+3kHvr_!%uDarHT2MRJb7^s2?$=F36K*UuHAW6LGRXS#Pd;OYWyBn~Wpa#* zV^?KRi-MAk()0Mz^hoBAU&w`L1MaE4ZX$AA$O&__U2xl3SZUsmHh5cV<4dimxMfz~ zY492-KB_$8;$}v@p>3$ErHt_4-#XZKI$x#u;Xr+eSKv2v;P-T#`uU*GQ_0u@7G%@3 z1+Lq7V&Q@iiBX`rfX#7RStK6)vhRfcwT}jozlfmraFs8@%!SP{dP^D0;|y|69V;W> z!}%Kefk&#Cm#Z~gl3OrMLE*21l!Q!h*WI) z{Fraepz{Z?Jq^hchb=rgvU%DzXn)n_m6wkP*}+t#T3wi0OY+E>-u5yYQ!NAraDv9H z8=YK^Qf0FV_+1W#E5{g<5QtV)3M-G%(p9z#gfZ(NC*hL`4RK(ROLw?NbJC`r&%!3Z z2Ay>9bIMQLx<4IfmLoBI_6^;MLm+()mjmNAJh>#PS)oXh0ge=L2zU$-1zYm9SiiR_ z!XK&9Bfl{X!rN*~sFS$rPMV%OdjXW)bi%5;F6o=>6tk*g&dSe5>7~gJF;Gzjz4;YI}+HM_LEoufilORig8W{lNWX$8XNJjM3WpBp^Slo zBJFj7jnehkXyZ!&JxO~WLlF0449hAcT!&kzSj`|2**DWaR}yM`*ko%DvL2+d*JiQNU@htkl;pFW^iGBSpM^@jx;f%{fjN2hdi+ddXjP|2RVGy9I{@`Mx;ae8mIDsLELekKEPsk zKbZ9lf0N@ujm>`yocw`%f%U{>(jixdu5Cy@MezeQvEUD)7Hf#?I&SlcZn zAL>5MRv7&GJ+Y4c;a8jS2UU2?K=Sg8U>NbZ#l)b1L}q9;9m`)=U!)sdTu0NY<3Q0J z%$mGA_~Ii>gC19hRjQg)v(8;p*LrGY zFoO_%xwP{YQvbqA#)3GfsFy3I3$84dQ7hfOMF1T^i11T00;p7g@h_1#9x!T!G-{lx zRo|}ztwZh2n9NRd)+bX$P!X_!UP#0O(WcYkxF_3(+keA}0FuB(J<13tkdK=upxF=^ z?48z5e*^qApE}dwjVZ0wKSwa_bGOtA&@(u()<%Z)*NcmZ!6v5-SWg*wU$?t#eF0`) z-K$zZD3xdoqG`w&j5>@+YqsuPGxAvtm75hjmVc%LM}3L}-y zW#R6Ds4L=Hr&rOnXt`v6ayWuf;X#8~(*P698#}-`mn>X9`j|u)7MQ{iA=Jq&C|K_s+QLlE3qc)& zqES>4xpD5e2i~^^RSg
    2pt@y-%8iO5}K(C_)0`uWyUkXvp9knsH+^WVRU{0uDwU4qnzpC?t0a?Wgg?J;K<9sAl2pQ5JcMEO0Txj}mdz8wjD= z6XV*JME!OEX6L$_*N)cN)rlOo&RiS=lr9GQz9@{WFv&%c4Lp_DItYEt!Sp%{Q8(B2 zZqfJYSBtg{9E-$@|MDR?W_;eXv)^&{ZWd#Za2??|D}t7VZNj)(aZDA&DHHHYLDxPdo!_@)IYn_`?#4P6CA z!P`?@xRvnQ8H&f3ch8GSGrXEEp5z08{CdD5!{f(Eek4DmoUPse^sPAn|&=WVv zJor|Ko=>JFj))$MV(7?1UN7Wkk@QOS{(!mUlsD{Q9KxT2+N*hiH|X=@pa%Y^Q-Z92 z1&_MGzLp~7wMSQcqf`B;1SeSrr+VU=1VRVlJHRCRqeOz0-CqCfB`N@C)-}Yy%hHoz zq??kK@Jl#y}8o^{q1t3ktgEFR{8 zScDl~$sisDKGJXfw`zCL0Zni8$AjZpUofk?nK%GD-q7hiV?%B-a&7)8GC`f3Lbc?4 zd9wEzbl<(&V;i<-YmdArwvt#-Ul>vmQUv0HzyhIY=%!^t7<>+cl(YNsRsoPK^a}B*}CxO)f2cmgt__vH;{!ge}=iTALSrf?I0~n3_TX0 z3l1t!M!<)-0uA5!%fi)Z^=e@ze7o#aN)bX%eUB%Wd#V4p+rp6NR0_gXrhIBKI0!@U zJFV}}m_Z($wV`Ey)6H(xO`b2Ki%ApJ3W2X@mZrYl<=yH9%C-OdERjB)dr$KZ)|5rx z>vveDHUFH85$8|#)M;GbPk1PUtKZ!rjE&Q;0U|#qOSeY^O_^mXI zx3jhcw*Q<*|5#!WoZ*#m7*##ZSOT`%sbd!E>!Z2B>uMCbsvo}=*e09A3uv(MGMTt! zho{-kIWjYcPhdYEQMqZW>Sp^#sDnX;_(o4n_6JIw4&aiqYF1{ zAh%2G_}?XBh)Oz@ct0q+84(l&|(D&?hYI{0CIIP z^kOIVL%s5%`*G8QDmbfp*8jyi4m+@#~{j zcpeXQyV`RgLylCc0#!(J9t(Kx2l0!gLMMxcj=60fr!D7;$*GDthdZ3eNXCI>3VRsn z)eFS@`j4Ojdopc2xbkT9pq)1kv1NRu%bPE=N>2^{}G|1ujkE_QJ9RR&1-F5)isWe=2W`{xmwL8!;nSa0K zC+4JItvg<8FZjNzh9G59dVC7fxjuP zv$FG_&2${A!zR+Rkf=MExQIYr8Tudg5jUG$S@~!YHrN3-mn6v!PD;UQfORCP8=#>E z&>I{;@mb+|v>MS(=6X0Yf}yhS%y~)LCjxfZP+di$M*o^*uyKEqwxvDK~HlqsK$LkBw~L7X9H9GNUIkk(?{5yDT@MEwlG#z#^3 zcMu-$T`)UQV8}sODq6z5=R$kvWqMvnx0?oL4k)t7bhf!5$s^@qJ^~k0yxxLwy2=NZ$Zu~{&+Z_~x&7=B3p#f0OZ>9!g;-X5 z_fkGRI1yLQqVAk^uNki^B3%lnFFI7cW*CjMG<7ZCX522C^MM#u?Jw1sF#6GO9Uzij zX2(2m%S&Qb&BI~Lzu?R9-Q4})zX@llUT@Eaxpd0%acpQ#KzC((d5mYU?;r6>%`t_p zCGeh5y#<#=C3HRic$FZj(@_}Q0Lk08<=3!rLS7xM=F;(RZ)@Yq-;duabslvtd!Tv) zXMo!9vV^qhE6M2jGRaDWL`T7NKlY3C#gr#bofUHEIhp7Ti=g@K;#>y2tO}4NE;l~0 zF8L+*f?co0x&D=WhY0BJV)7@AWnn=TGxh>`P$3;!?ohhiB{xl``ZNZrcF93$>!^zrHRhzC;Z zYTY2QQPYmJ8zzm$ZYB7G0gQXtq<6P8RGjslVcYolf`w7ZV{^s ze+K3P+4-bswQ0^mNdGxnR$d6{$>8lJ(Zt)yG0MjcjDP9C7a!$8>#g&)%a?QKM-{E; zbg$#wjXdD$hv4Ha3d-(v8R<^+`@i8V2(f<0MBLzg(g|q_kU;_9Qu2i%CiRgsTIFN9 z|I2S>#0Qu98;ICecj6F_j15A!Q1*hi^6cFl_53gBWlThvk*x_e@nR*B|1=ET zs_{qYe-W@sVjyn;tpA4$GsOp4xaEAwn%O1?+4ma z5p$D#Ia$|En)U;*Xkz1aELpQ=^RaEwMz*OcQEy8ML7JIi(UAH*sN3TQhZ+!Hda2qI zn~UNHZE81j6pCo}ysbuY8evMz+|d&!BIkR1>_;~<*CaBNLAGfXtf=mH3I!F1G!W11nn*x=>>Q5 zsJP`FPWuPV`}tHJUU=Y(E|o}SdI!4I^s&!B~< z2yg;G5GUH4NU@5`RVl#7G%i|nBgwu`QnW8xHEnWFI{ z5}=N|YX;d8TW|2vX`QO3;`aY(OWe0rCu*3?PXK*53c0B!9PnC`;e-&*?Th6J%_H6L z9?JwXyDVI%RkeU+)joB-ieE(%t@}Ynn-(LnI{WC&t5>l_RJSIxvo|-aZL$t-MP<}V zzI&E$tX6NlpiF47w$V%&KU^+3CgYxhHf>;1D$kzMmxlr!9{7RF5_vfmLU!EpXB0$o z*Yw;pU6Gx!-`@De!fWsS?{X9LrRNaG*KZJws z&nN3plE2Ow_Mj5{>4X;kzcEt;+VA^9=NOpNOXe7JFZcZJ6`kV;ml->Jcsqa87JhKr ztW({lt0BQvJAU0~C8v0fjQ_jg!-6+UqF3mp1@Qmpc(Lik|ngaq=g^ zT$cL#TLi}S7lV#>)~OjIzkjuDajR`=twh}YJA3Ay^o=!o3X)Zx1Lq)|G}4lKmQy*k zzoQSJLJ4Fu(uXP=Gk(?KtzQm46y7a?9BKsoPKy4sI`07-L$doF5h`^ER`P&P=FfY4 ze3Hd48_p0li)5jw;RC(%0mvK@8E4w`5nue;wLwL=uZ}*xf+~SqSZh8ulSAHz z)>8tR>FGn!734%+!baSfIcHf~p85AQ;bk|Kj#va&)<}VOud}wN6G~2&C0*cX&hZaN zY1Hqefk!Atlipt~nvqR-bEEC9Sl13WR)rWmh>->wzvr7W%AI4Et^bX~us;F0*je_4 zVhK0INRBX}wIfLu#JT4m!H5pkP!zzRJZh<26(H879>Kq{(F0hzl4t=ZoG!tMI5eeD zevmrFg6gx~kABMARsyjvT@!rBto}w}G+O9mh~hJRaR&_+=SPr9LxENMfrb9YgdUAy z%T`1@=TlFuLyl%lf8Qa(%KZtI15TbY2Sq6qPr!am#-sZ&Z3kMQ|IQt)Fu%L565WA@ z2VXPj)xc4t=lRVyXd#4iLh#i2sg5TuixYYfd$Kjwh+o(TI6jBvnmuxp@(5HmFAhlu z7ryNkT5B+Ee=hJ4kI94rAN+$Xtf2J=Y?E&C7ftlJzpVx2 zVnvxrKy-I^Cnoww%#v45lxIeX8`BSy-O%>pa?~7|sYHgEFZDl&+=o9!c98FKoI>&W z-J|4nOQkZ0;17MT8`Y(0kF81{~dH}1my=UVkeP~Plt+YcNQKVf^ ztadhIG9D$-t%B48l^9sRMDiO=*{IH#iX0UIOym;5&lI*<2h&YSbb+77DHvCLH^=)jvHg|o8ojZ}SdiR{|XF1-;~un~g&xTDy*=@!ATk691e!XUZn;BgmsX@{k1xw}5|H z7%g|hZXMj^7Cn-zz3}Puh%+VDXp0Nd(Il{f@Z#%-etQOPDZD(hE%wyZ7(0jrGbg*o zLC9h9Q)4BIUQHP9Ag`sq>`=ZL>)y?UZ6sNb|C+CeGt}qp6Z{a$*}N#)%df7UnfZ#J zv)hJ8QwT}9L+hfU;*fuW-7IGW-3?Tt51&Bhh&AqFgWT3iLHxjvW?Pekp(gRD5X3F| z9%JWHnO>V-JIvk?5KS7&1wzqKJt(|S8Ia>(UpwS9v_X}#emrI2W93I<4MSL2mG<{- z`4g9GDD|eh=6fvm*sCMJ{zAxe-3bWA9}Ihd49&`|*{+PiDcR5qAKBUS{=#5v#hUfR z26qx!7y#8lVb2l(8hN^b^nDD=_zgEJp(*WrOcJ!i<-QSk*N5MhIG_cVry0+fpQhk( z$~)}MsIHr`!yw`35IK%Q@~Tr;9_x{OikNE5$a0XmZp6>TD_7JbB*3K}p5pBI7-%wz z#5Ldj6f@V#x7X_^yq(a|8;6T?lr}b3uZK|T&xL%~UJhWDParv!zms5t zNPH2tYS~N_d3nnFCBUFl+FX`iCQFa32n(EhvQpsh_X~%HfwE;`uJbwSBX&5ZOj(I5 zk|8K}EF4-}af`U_u!s{0=-+}5f5YY^nxaGsq7?|#3$3qcAEJ7zl8gMlF>cf#zj1CV zwwP6xNbFcW)&UsxM>e1QSz4zeb}z{+BTh(`mWtU%WB8x90OU#WU9I!V!y^X~A{<=$ zPsjg&fzZARHr7xeMz*-&Bo|4U8l94gEq9oPx5o#gcyaOb8~GXPE4=ltCnjSfTidv9vx1@ZXD2}Y49sx2P)g1_~JaD*|`&x^hwY&kmV%F zQX(r70K@Gp1^n<=!~j|g4)$|KXp)7VqUY(yN+fu%EE#2`Y>g1cq{{y3`5`uY{{@dg zaKFrD7)nh*h(gO@i+dq3ZNe7CjA9p=QHaJYaO>a3(g)xl(L`rhP+Ni@y z4KTdgfx$=O5{65Xw^kUkZGfP2Gty^`NPh6tWZ=jLzt11oxfH^Vx1i@IC@Gm7@nBaM zJQDM^?i2%iYaW5>EOZ3db{0_O~+-r)LHOO~EF z2(X8VHK@*A5Kfmsef2A|sjuWHH`5teRRv!GYyCdjCf7CUe4$vSHsZj}ZNT>BOjB7c zh0v)3L*$(~S1LRX?^Ig8y(Iim%=_M!vEV_VDlj>G^h9sV=xmwGca&18WO8Ql(Dg>4 z0x&zbgNFRRBlHb%7gW4jop26y6(p|gB|!#>Kr{r_VqW~*)FhR591%aPU8nR#i)^HK zQe8FE8bfVVgrj@d;8^;LP^pJP)LDuSwyonTLOKJ=5jdb$p^w1A@?#x)M1ANWbUndr9GTPzKp+;oX8c3ehey!UFt4rx#xFo+6`Z{zay9pl$w5y* zr8Euiha7yKjUI-Czrq7Wue+lMFH>3 zoO#E=AzZ-?J!LEMap-6PDIo?ZP`dn24+PMY@iXpm(}1fn5;F})Oh z^sb(RqN#GD@^G}cMtCQg9JE63K{&6o;)GT>fHgv+7=Z?_-%H~Yk>2O0ppf->;rKg| z00&d}C@$!3p+}LdCy}Hv;@*k(*M{QY$N}p+u3lF1iQ86tU?>-KVuP11cqC3|V54B4 z+dnIPNwq9LBtzcmATP+q%Y25E6?^`eNl9g~4F(hWSa2TIjGz*;>1;VDGabzR7eBI& zKJu=HFi0%)w^y3z@*8%*5M)kZT2)a)zx?4J!s2E9twZ?fA7O~xTQx@CS9Yaw>n?90 z4@n`j9(D;pya-_UC?+fYq_0K1yKEIbh4IC(y+|@SXjP?v3dIy%osNM%-cFO@@y-RS zQ4eWOuZjl9JbUg8;l|7cAG&$^X^9#4hSDeUmsLk027wKFQ{DZq8v0N+j8e3YQglT?DrmdbJjs(oJiCN}JR9DVd@ z^ie}f>LrtdUh18st(ZDCWO;{8TlK;9ufsOkEzQleAB6-DeM(zt>Cc!|M}5bFDkTp~ zad4#)Iu8y9m<%fz7exdgmwPO-_R>cLvT$RAv;`@{~ zIdh1}yZ8}cA4?lCZrpM57@b10rudU;7gI7hz#8+&+tFBa@^kI**S#b^T=RBxo}?47 z!3htY{ikTf)>Yw;sHCcl4z=v3uI`T6=T4`KR@668d0EtBPAm|#TwXCnzehsTGdV1I z8Sa8(ewD%)m?mae_;`psY&Bo(U`&?a6wWXuo=GqDwT&Z9@&q{ZZII*yKY#YeGuF?i zk^4<~&}i}~7(OLWB8{*W{P?NE0ab6t9g$-A7LWu+M}U3GDRimBN6n*6;u{5xis3ex zWIdC^UL0Zia1D#;voUzR9(rNVGxXs9{5qogb!(PW`I{nle&^x{n)!j8%3;fV0e&_w_TK2vhB_u`yg&HuP7bGL z9x*lQ2}okRP&=`npkh@%42&U2gh(;BXx3(WNk}ZPJ*r%jkL~90;s*8AaQ7T-OD5tM z&`T^93M*X!1826(@Z)NGg?EPrRad3;d6ZKao2JF`mCw{c0L{ibuHIu4v=3^l2cfny ztdXZWHI})U5P>>jqYoDP=~eX6H`1b7O%fEzEm}g|r00Er7{B{)cQw@qzw+PHK ze46;+$)J8{30@)YGTE;V=jWdBj9k6Ga8^wek8uRs?iAJL1gu5<*s{*s*Fy|gR3et> z=X|__W9HOxH+=E5zdjVm#szg2GeE)fB%|gmU#1^{W$1UecOIh`P}GU^7bi=Q2qcWa zE=V5VJ9vz~gp|Vxr%qFXth7T3VL5bIG=RamDD+$YO)mlv5?nUkCTh}Kih8*VNV!rm%L920p@?Nw0P* z9(X+TDDbziuxK%-fy%@*y%Q0>5fRydKbVmj>YSYMe2VMBw+8(V@oudA zau=8fe_(5i&7Qn3A7)DOOC3-}1>0(J*d6d>%#2Agff=Uax|~2#c0$PYo*oPC;wq?c zl1r+tl7UsVG-&P*=dK`jz!td=U$qisMiPPK5kUWRU@`l}<8O!;R&2rX%mxTq%jC2_ zCwL^k1beDnOW7(IpnX&&VQ6HC9{SUR^xEE+XY;k%pps}TqIEZIoPEYOYbwg=w2H{> zJ3e17O<%c+21bIOayed(HHThqeV(3p{1N^c2o8snE;;`Sy6W=lLXT$uV(Pu-zya~S zO`8<=>_Y?Iu=nBK=24m$N{zV*RgJfu^TnY6DxkV8#n={}`sc??Nl|Ssu3$+$pqY0| z!MG;)Ai@9HS>TH8!7b!$J9KK_Fpc&G+k5$r63OHwh-Vt2*W#1?lz39yu3Q9b!c>EF z2AC>>GW~o66gu1Gpqudchx1?Q@jLZVRu8IGDAQU=8{xZUEf}2Sm(eQFp=B0s7zwww zHPN2eSgjun4yS`QRBtBV&dBl7RZ?_K zM|c@_<l&a%KN=8%%0ccm?CG#p|mbFX{8y=7K zOwp7}{m+l3IE&3#e30n)z%+c}#6O+6;g5$sI?shj_2t}id8Z`;XayIRB%i`AmRq2% z3~!*s$&k(f6UR)Zh=~A916K%lK$`P!F(aorg8HLunh91T`;&)68HW1PF<3~~u4(|9 zSROfWSATxX9#OPN&gnf$XCv=t(viQ+QzDQG0x%KGLm$1ar&;{A za*fiQN?xg^%}OQ*`l-|4%e)Z=$639*EY;4FWO`VU(CYj=Iuq$1O)?KtCu3=f-<#S3 zJW&9!>W5z)ZOcrQMj1bT1kju{7{A_)c6|=goN!Jw{!C;{i9os#2%3Rx79M&tiqLhV zN!Bqr7!+(hO>_oqaTYfkNmrvAAm5_G61w5KchEU!oO08p&)AS6b=R zwzaeI_(r%LWZeft*D>~;5)8TaT-vee47z#eZJ|eGwc2QTUBm3}`8SXU)W8zzVzk9y z%rZdpu?lSDn{1dpfHQ#%k|}ec^d*4;V@6HB{xP$b5fVdy-RZ-NI1WeTkNK&@5{JcR z!($!qmI^#u4#!C{1KfE^v{r#*B!ax?{#%rEQQd-P~x8& zZ|7#eG*)~3Opd)5Czr<`eJOI6crF+GO8}$S<2;|B?ZZv990VNGiwIe+L|`cdVAfX$ z)#@2g7CeMFy4YZ5l}!r!#=${%TfpF~T&hvzbBz!XRFAgU*4`fQSENy)vKWa#W+4E6 zb^~n6d9fgaM8Jp$Sg`2Y=_j~r(J3Upywr(MHHs}LrE0eYE~f=SV-^|~Tr@5C(ibB}xJ#H#~=czLBxDqESiAWfz{u;*B*WLXZm3WA?Y zUWxo{jMm2JnzdLd?;2jx9uN2ayXI(+cHVmyZp|GGBM#d{c zKNI?k!FeZkJg-M0<1sm~gDI?@Gq67K>L5;E4;|2{WCfFB1qS&Qu9-tR6KYx+St|r! zfQ+4@yL@h1gCZ06JtYl~wQ8wsE~fytV`ucV296`?)*6VcVRAb5h+L14&IE%Kc}SDi zh#RathuuLtx1UL;ZQK??*=ze=rU$?NtB7ZftJc$}Kl}x%tFE7Y&WA$UY)P;1tFdWm z^WMGUv8`K`;K5F_Im;V~fJ7i31R!hN2x%i5@h8sY!0?zCebU-09;9WQq!Cc)ESrzY zkX|x5NrM<8VL=h)jr-^=h&CsNh><2+UfZzc+Xlnh@W9)^r$)n$Z@^2>q?>FO8|CJz zrmC^{6}q^_M!!b(k$c#~i7~)^Ua1{aarL{O^3DxKV7Y^{%B9PG@uQ!&n% z;=o>nCx+a_+sdN{K6pBMfHaIIk(Ybs&{RHai=QPM6mXqII9rQ@19h`Iv*y&3WFgZ% z9hj6#FglGm6V8#$nQ-VYu{)aXwUh*y8Ud)Ru>G$dDyu`_s#6%D5=S9&W=lN1X;Q$+ z>>7C5J;yWzX9=OOd_P@SXf+NTY*XdH!8GAkwlW_os$k}W?c;QO#y+PI3_8LYzdk8+COUmbYU0D*D(5 zJ`+K|!{MTmBK1`nushiZ+Z^`8+!;}zL4V}H28UHt9Hxdn)PG`}JkW=7SaWU#m>jhj z1#MK<`DIQjZ^#dLR#s9tx*`C8{7)YQ1SSuh$Jg9UPk?~wc!|gwQGUFD$av{QpbDAS z;nGy4niWircbaa16i0r~33OjR0%CdnssvJ`5ETLhoLbB3L{l8tX|-EmgA?pdEWz=> z=yz%?$mFQKB-Vn>u{sj>teiq?%cN;SK(W#aEJ2*eK5ixlQdBIkrQva!nnY$h4*{3*k7*Inuv^-JlE#FZ}rS{@di#OS37H&pF}_v z1mF~KlPVb{kV!_boFN&o!WGG7n1G5Bz(hvX2?61wx1r5qxrWh(I_RBz@Mq%%!@}26 zK5gKZfcPLyn=5#EX5#Z-UrawZT$N}Fsin4%M@yp(JhBwyA%G93&Yqi~VJCY$mO&z* z9RjPhD=Ju0MoV%|9->utYrvp2qwA@4r%6|NaGrcFTz|9FO>?i93+n_UE;z=sKqA9j z7aK0b6Ig=d!(~NUo<4k@;2grtkY!P$-e?&wF3E|9j)iex_{0ti0WychX<3*`vnL{8 zbp9MH=jL|U`KbWtl>xgtV7VN$B<)&TvwG-TP?0C-(Y-ApG8D<^#D$kaCxFz`7!YQ~ zuK1eDupTPKwG3kf_tA_N9K?lFlt}oV8=|~U%d3o@{Oxu+&*H~X?`eTfW|{^BO36c4 zAm5*-A@78;Wag$E4gfun<}h2pJF4Odm5qhu^9FbD`fxB;=b_<1vb<6UmDK5{99f^amDW&x?FU3D2B>OGEUPhfyb0}aE#A%O z`9iVe-*5zko65s~%X{?@0Qd52c>#Susa1mR&XILbtEeV7Rly!=GkmeV6^|~#Rj6L6 znUxb5!FnDMh|@FjL=W{S3?B8_se7S z&=Wid%!R7zo%G*7djt<=n}~|wcrsc*b22B`1If-0;ex0NE9&>jNn~-v{6Zc;yf`xH zeTqKH;@hU-7V*tVmOKi&2wgm5=hsxw#L<7uh)X6X6%aWsTuARkM_V;F-KCnNOrLfH z_@F?n(qUJy8-HUlISWo)e(J@3){7&Lxe0XTGJO_Q7Ro^# z`7En|T?`23T}~|d;d7`aalqyTJScPEs)TCd#*V7d?x}zQw9n%wA9jDm3hc{=Ra6|< zIGPU=)iS(#aEKm%zBi)Co35{-3(mPL;#s^uShCachWLTvf=WPWze^)tI`xbPv;F8C zqn^ZNLD_|?sClZ1{vB1_ii_M>CSsJb6fzVeZ%gY-J~#*TGEivkWu) zd0k!N=hfB9cocdU)$;_M@y)%07&%H7>3hYVgV_crWQWs#e4N^64)tWUku$FtSMc+z zULRE9^S1TwBO|j+4lAod)bkE6R)2Avcmp#z%TCjAVQ9Y#SN;0I|Dxag{yv(Xo+5|CNpF4gJLseD|7=te&Gyn_rDxGcPd6LgTF`5?kf!#Q z8OP)_H3=vAv29$?dMz4EmZ3fZm_}E_wqQFZ+2?0;-Rc*jagKZlCOZz~z!DsGGRQ|l zFw2lzibFkNF}g6!sjGtT7K;;^%8_p)XO0b9-m#4x$2Fu9JX3z^KR!kigF%OgRcrEb z0BNuespPv@+IS^7oEC8h@qM%GM}~O_0Fu#pk7E907!&7=VrCmPLdG|ppCa|NQPIe* zmtKXUN$6DvBjcEyA{+F5UhJy!Q_vVeb;x9f8X!;#Zhu?reyTuO2Jo4adX4j7gX7E( zZhV=9%}w92v4Ce}9_-ib#-W}zb?jvdW)9nARTcQ0l!6~y;U@+>G};^7?O9T{(BpGT z1tggm3~({DfflVN<|N70G#Sia$22Wa7Pcq?=$o3VWELgDpbu?6ZTo1(F*!ar)noL# zK(6u(+QZ``i$xgQi*u*o#&*-ohPl5Qs>8gaaEA zhmLX(n6(!Vb2d4__e;f_OU-3Ca#^jEniOX)NA2zucYI$hn7183LhhPeq-mfgNl22D z?q1@@4v? zz4?8!zs+{j)lBDOp}iqKmfdW%OPyXUQZ$t|W)zdtSWQJ(AY8`g2&p%P%t2=aaxh4o zT~|#113G$ire(HxuUpI>+G)j^AxlePW|J(q$t!VE<9QXcX-~X12&s;bY_Opzs^P;s zs{?5Uu;skznVwn0UzQ@x4}6S7B@O~DnK^9J0zKd2_C51c#{O-CG^n5wjLnPyiS2yS z71;0?0^U(^>svnbs;opye7~XaRL4+T=2~oSBeb&sJPZjUZBW6OvZE%>uVbzu23p*Mx zDURIW+JjY3{Els7q6IEDlqOod@OJ|z#%QcJxSGzda#3+@4q4`_-N4fXOrO)o+k}&} zA<=9+ZebYr)t42)Kr8tYq5yy6D7B38UPQv&$=+|R`{9rFLUc z!0BFi`SIMdG=`-(mVmJ^4)~m5nxINpGO)yk1uFpqEny(MJP)5Tq;PBb48Hm@4ZE>0C&}*c10@Mxxnpv3l za+sTjvDful11QT&F9O0!Z?aC%Z&6A-OwOx__oZ-(TrSJHFMj*rCj)z`!(RNKPi&yd zIBZPVK5~4(O#>$u?t1jVczAenj;!i+1t=ksQrZt zX%VDG0$z{1n}Rk!yv=+ubr?&6%9iI5=g0hm5f0n@#@)@-1AC>ppwODeE9rAPdCZ?1 zW*S#*n2Qp2hpN|sZ~LIzL&3_s&|)5{0ROf@V5c3bi6>zRJlWaruwgk=#kq!Wp1<;`B;2H32 zhZ5LI-WLanhY^Rb+3?E#p_RBkJ^Nth<_jNOJO5Eyeh)%gGTaqpgo_ohRj9KsYn?C6jllw(V7!1y*~%sVv#Q3KA9;^4$dbL<>1v|XE-kNJV6 zJ)DMv8!9rRgd#9pg{-1N;4SbFy~|*71mFp}Ek{XQl4J5}OY%*G0EQXK{97BUbpX(HcBio@NM~)q6tJRxDRK zG%GQzpulP2GpZfl{WKdOat}E9i{f~%dP5;>Zi4ElSd0lvf{LqisAxvQ($_jhY}147 zUF5(~5H%avusNt#VhNKB5`kF+1bJb*bYRUI3T~O3eG%gZ>MGV8rOPH~vC{dhs>?6A zX7*J+)LAlQ0RnzbOL$(c1c#$mRaeyLiwR5q6fHKcEf-U|r+B?%aK|MlMR zbatC!Jp+eiWZBD3pW^4<>vWd8LANdU>pLDJO8nmM78RO^BOBsh>UzJZPQ3A;E*m0taqhAGs54UXX~?rdZs znVb}GG(%FD4dlTE&9!ErRV^CXklB@Q3tW8YW^k{nTDi-7G6ezXr}`BiwN!6a7CLi^ zRY@2gL*tsTiYr#O^1Vc09s(`sWF1haviX3f!PHC+eB-Qyb0$_rXrn*Sv}t5v^AK=i zC_cNhNmR^xE`Le{vKj#l;s-Gfwk89DsV9JBDlF6JgMdP>VDCo19)+8`k9z~^i}iW{ zC(G0v0rnqO2mLBb?qrY%NCbii2rxLWRTNTFGJxQt0Q~ zM)f&^(6lx=O-;gyvqH9Fbzd#T_;K{K42bgow|5?3avay4e?56~j@VtKO#l`|BnU8q zL5Z@hOrLls%RYU+^Z8DWr?YH{XIrKMWy!J?j;1WzvPmmY5+#wcNih=)06}D6fyM3u z3oI7coWtbl``3Uo(>*i0(=$7vXXX{Y!gg0zSH1dmPxtGpSFbR!r^)D}+t8FJlhB+` zq72m(k8eDB;kSPJ{O~(XMk)BaxNUb8{r+!kOhR?pSH!DFCh70~RqfWIv}`T?Z#i&2W;yyhyC&1uX$lZz`_}0uwz_n(O zz+{L8cZACha(Sl#R`E?8@(FVZ-CpU88(2S*8W7JNRn7oq98gBI^tem_+UP`q+|5a9no= z3BYZD!Au<(vO1e&TZGeS)xQT?hO(vUc~{FXUK+s+zK}6;;CT4odv2~F8#Hjehv(lI zCxShjg3som4UjK^90W0*%`PP z$|?=iZ}8I3r3@Jy2Smv_C1(=Ohb&)SV(o2`HntH5o)1G(H7e4zCMnpo2 zo6V-0kQS>5KAt)PXW@4w!gxM))#;<;uYL0ibm5YEw)|q_0vm}nVWQs)2AQ& zeeyU$#>hp5#q{TY_7D}?^#2>x2kli!;f5{F>(wLbbpuybVuB}UoswfNqzaFZLQB{t z*l<2As|grF;YcOY`~G`qO7mP*0zFqRzV34OF_JlzjO54TRY&fd` zmHASjDE=FR03Mj*xEha2cS@cZSyO&E^of@8s*+QI&qKGPqz%a_jZ4W^0=RMa*&Wo$ zv#hf93bNd*AaJ5?vm_M!)dw-VikEd*Jx4A%!Q}CeW{4G6 zt1kj(gG_f{xJv6_!5PUVCo z6998zi}UrGPD$-WG|BbEQ(RUlIZ$x!MdM21X&~p#T>@|y-s-Z#0Ga4Y3R`&$Wq&qS z`4+Ru{5SvH|7QhOV{NRwnLI9&h3>!alVmhiL5!7^oVE>^RK`J11TMlB?O!X}DCcc) z78e)jiKl)*F1Pr`2n9ojk!si1g%YsU+Fn3)=+Bkm88Hy1*4oH>S1m0$@YZ-c6c`KX zM^8OU@DQyE?|bh@sJfEZ{Z&Cpa0f10k66s~uL+)>lGCzA$q}{}qrLR&tevOiKFHQW zjd)Fe7{UjqeW#!yJt$Me6~m(4P5=DF;2*4*Nhb%7y!e~cyk?zFq+u~M5rAJD^iDkP zGtz1FW`rzkHJzM&nHHerJodwXr1=H4KDYIcw^41QTFKd1X`u~;E{wW`und_kG+A0r zOTLhjizPpOu_s+#)h9!uj8~W+WO-Msdk1BWrAOCi|!piu$%> zHJr=I4Fa%FxOZSc=6TJzaXGma%Mid9@&ULu`d)o2O)QgzlbJv!3HUHR_>)32y|{k8 z{n?Gc7`&HM0hD13CK`hT2WeGx2CD6 zsJJwcriZ^J`VvPENc1X$Ffw@x%WwX_lqopEPmT`#;|cv_`_|pGxU`_UHb%RVCN8Ku z3uds2*Jy(Q4GG!gOwP%)G_XXA?$F4Icg{;&H|A9*MlabX={e%QdM7CQm)$P9i0-u3gd2>zS^`!QorewEG`rZysPvTYOzMzL!bLb zgi!zWckiQtz6+{!`9tt{yjOTU4t)bJomrsaA4hsT{=biWiAsujg02c+qB}4&#(nc6 zr<)#w5*{{ZEzv@gf1d7@obgK}OzC$(!Qm%!@~?kxlqgdHY;)cr_sNe+ZIW1xAyZ*W zS@Hhc-XZ+=2)_{=m_WP)y3xV%nWjxrZ@eeQm0zqvE?mlp;T;Z4APxesll^zuOb<10 zkW|mTIEqM1){yF(mg*9y#7o=pBkaVP{4-1dUtXLd5gcq%*No49pX5c8xska`07~&? z#LqN#N=I_HmE5vyCV<|*qec@w(6~XmtoL^4TFJpsl@a5`+o9d8*E>j-FS7*jQm8{0 z&Rv<6f@^02t0pjs&$$QdI`VIY@l})K0@6jGA0L&UuGyI4UdAM~M%PNtNDnn*m}(c= zYDrRixtJU!fG>+GqeQ#Ldt@GP&(Uj~2hCc*J^W=%A^jO_9MWSBoMj7i8WeUnf&0OL zAAfidY0=UnbB3SE`zsLuzpJv3{;0N%UR)`ko{s6(CI`JZhKWAf0(*Hevx@IcJ>4}r zl?8Jdw;GIorTAr?ipXLyfd~S4xOs5z4*3l9(2|+Hn^tFPVu8*qvdQ_*H-8Yp?`z-s z0{!eye?)GNJ9zA#{qLbi{_T5IU@Hiw@kZhVaFe+4F7B31^uOyi(90>C?U%TS%buy* zo}AHBRDdoqVQ}2Mtn_?<38)FQzytD*BS&Bk$AJlC4}m_sL>{;{NB@{s1t)v>u%wwK z;DjoC2%Te}f`ao>+Ikt2)Mni(ImTjIgKn|g&`$BC!GQ^AAyAH+Wk+=(Rcp!2d6+=P z2}pDhFOR>fJw@N&y;}-(MWjnGFKqG-&R)c?*)v(6=oQ(;jp8yuz#1!0Tuw28JYdWM?(=R}%MkrbA zlCx_|mrBmi5LvAf?Zr1nRd(TIX>~wgBbFxL3`O}h ze08M%%UA~hSOnb@n1k>3N6ZraOI2HjUmiK&Cr6T^4@mG3z^Z-+S7C$mHE6&8Qrj+N z^`fx4RC0_d#;|Mp98>9zCz%3>yrSUYgaIX>gzryJzBL@ z8r7$i*(KGl-TPsJ<4yAU@LGO5)YaCL#bOQY^56IfoWv-~UoA-Vi?+-_#mPzmNn&pm_QI|>%x^h2`u15Ba z6YJ{n@#P3Knay;&+%2Dxwn(n!GI2T+NHqaG$As<8Al6R!M`Ja8v#Ls(OLd)bm7ir( z$m41oXVykQ#?mtqriXj!%acC($(9^@X6jDKxpGA=z&FnOwOt*~#RQ@g@OkOoV+Hhm z9OWT_=!iHqwFHDQ?-=?>j>9nQ(@h=H$<$VtVCgztg*?I5@M-Z85WR~d7@GP4hWNkP zut~ZU-|5+rTX#y1Wu9)uI?iIKfddmroPb0(V_n<^6u?SO;uQJJ_zB>nm_}h8as>9U zPcIng-!^WPX5%j=eP{6Os`RneNljiT;Flnaa9{9KObvfRCvv4k4BaU?u*LZ(Tg9j3 zTI;S*htomAO}oXMl99<0j4!_jjXt5fhOgre@4GKe z%QGZOGzVr^CED~nJWp6(4dMQL9`n(j@s!d_4GlDz>l}2YQrGayaBX0gu;1 zPe1oFdgHB^seQv{+SJiSTROK>MR{d1+y3h)?2E}Pkjr8MQ3zZ`+DitBo`*_vux5lV zN_V0kF&hGgt0cVo@Z#f;!vruKbrwtBJnQk&0keVLtnQ$ZY;^3G$R*O1l7kDdAKhnl zi8O@I$u0sjGgI{P>(A0po_dUmi%O}gq8hP=+FCc!&aHcB_l|wEu4N+}CfO2h76uA?>>oH!M^7E1r=IyS*`VAsHZ;?oowv|C_Wugqw(qW$id*iO#o+b(TVf?=IYOMS zoq$YJ$owk4hz~%)c?DLRSL8)nY}zI*YA-}zIfZ8#HV@F(HCcr;J}5I+Fgy8mF(icr z{0>=U8ZWs@GuftmuYy6usk%{erh4QX+!A#_!7)Zi$q89Yz=M^67Z&FI@>^{-vRbb9 z%nS|BgNm)Ap@5Qgvl5_4b`c8hZTkW)T*f%LQSWymyyar!}#F87?(rJ+vQZKbu$y zd{zbsh-s}OsjL@vC?4E(;w2##Ae_Z5I0IwhQFQJ1dJQyCW~08dqcoP0MKe>`a4tI; z1cah-0izD7bm%DK1I>&3(E%k!)Fb>WO+lHtg8Os;b@vxZbg{UVCi89hDc%dH3ngdz zD3wYjSgVStBHjjYeti=d80@F+o>O%B%0+tVwO^7E3rp?WwT*t|?l$^g|D}WaFHO+k z@DhzoIOy7#6Fo0#g{P{rhIVedX*G>3_ZjG&P^6y2!$4j5YD(pEQ$_%a>E9Ym{$)8* zQwRF=FpRlGHkz&2K#RC9vcpI?294I%R;%o`-Ag{HEJoJg;m?2hfxTNc-C(hrFu0M1 zP*YP!Tes}+4@ak=x>Qv$3uWW8MiZS*RRu5<_8EM%;3%Z&=4MGK;v5nrpbI6(T})jt zfa}B?h=-~YypVc4&E1U7NO3NpWf5^hEwzpxW%aa^CMV=UO5K@HuHFAk%2|dZ{PPwPt;F zE|;s&EL;DMB)M5@WB%ipKP3^<6>i+Qmp=7-4^Y#Zwdtxd>Gj|}<(1uZrM8Xl(WJvo zL4g@pa>P*8ct352huU_GTyV%C0+W+t)OWFm9FEY3h!Lw3Zfq{3bxj5EkwX}|viRfP zZ58BnV!U9|NmoXe=<+o?of|NbUGAbK#}ch#V!4Da-xjOS-&2^=POoz4*5Rfw0Vco% zl0qQkO3p|>Rl~Q$E+{x9Nof%mq8kFE6C;>GrM82!!b!vKt_reQpy7lCtJOd)jRpR= zZ#zEcr_J=cpL>!1`yamH_n~w9zPoAHj=fZ0)9AP52|In+U3_`fV5;vOP^f>7p$Xy2 zoC6bJ0!)Aj?YeZiDgP4zT8a9IZE;OxK_kF5u9aE*tqeATG{PwCzD}C&zO?SXWG8AZouc2ulsD!AaY?*X?bx`Nv%OL zrR81F(%eElm{~bIDx5?wAB?a(-_*I43KIFPFJCMl$wLBZxv`hyYFVHfpM`GYE}Z2E zMW#a`9EWoA45q-AVO#X*Xf`s8EG=~@vvV`l4J9W$+`6lpiV9=jb{;GtcN{%96I0if zoIp9XHTAS%ZChYh^Ivchi*@eAB+RGqS4_v`zyz{`fYZAZGtM3+k8j9{aB z#;D{1)tx6_;kEeEl?!xj+Pzb=(hu+6Qd)Knkao(A`Y-&an! zl2eIAJU6v$4gP0mE9Ng6e({!-mbUNth$wLv6+_tNdj2L5!6&9Dga16LWQ?p`u zmQW}wsi3aSVj^C`L4qgI+c4($C`w?voP;s*iK!w`SGTd&W-@P-B(o(@M_GlrwXn!^ z+3mq{pn-rd0nd^Hx3U<)z8=g*$!;KTna|^nS}XHFbAL+9?;j)6ZPZ9#un#;#>}6UHY;v6REf z@MOBT(PL=5Umfhsirm0%TZsa{Wo_z6F*cYk;U6c_jirbQgiSzM%Ky( zs=9F-+3KL^yd7rof%EV;9;Y`Ct35t^?V)c|`v!GAfphpT6NpA2BQHkzCD}A4({Dx- zh|`uOAY*xge^X9>zVANCd#y+Q8Jq~;gR?ZRSF>ylNjh-g;0v_47c~DBcoRz!NQ?p*#LD{ zQJe+E%D(lM#>)2A&8>w6g|V{oaRq_%eP=(3-47yu2k}Y8q1@k;WGfn3iA5QMN{-2F zm@KcbxvW;BIOY!?tIxMkWN>+1QZNmAipA%0Sg_Es=3W{6+*TjZ3FLD{TdPtcpHuxi zCai~QGrGxS4gK`27{M+tH&bC%NXZeN(LEjqP0viJ+qcVZIAh>|na1SfVr z+8k3l&JZMkhtYU#J4KEGdFg;`qA7fb=|;(U{71VmD0*`tMHv@j)*ViRGN~sQcN8eg^30ITDhA#f-5I50Vco%n85M`Vt-mMe{MoY#(U%vpOM~; zo*WL^3HYGMEW1=NdT|~{PtOOm7ni!6=gyy^kx^j_9SX&8{00~5$M0&a)X?V6t*GkGmR&zK&&!#6zZb9!C!bclz%R4N-<@vMmb zH4!=~ty>=0NzZwz$l(c1a4hncQ@PVfp2d*Zo+Tgoyb<4YX_b{L%MAi)S8{NV-wFjs zmtK1HdP$+coHrRM(zD*%0%P&+=iq{74*5zm-Gzf3UdRf*BLp_m$LZJ0cxq&KGDs4_N&U|9VU=31bp@x!(!iCW}h{*ti#NlNB;Zg?X={SgPK1)OL)Gr z)ktOy9}}5k2YKo7!;4tfAv6n1CGq`8-*+0aZXJ67iNxzv8LG9@$Do81KPGHtN{ z04@tjL_t*2ujCND7e;lJt1#xzZsG|@57po$uagvCZ0bUqHc6A?z4FUY5`Im6B)xk= zxjA&?)rd-OXfLCh%8-3zM25E$+_1+v**k}+<7)qg7R;2b`7$}C@)S`cwAC&c9mns z=es!OonLS$Z1E(Tad;$S#=mq{xBzbaRQs>aQqMrhy;nhrOs)kdxxFF#I?obbO}>g1 zO5#IIKpTOyDmjyVa+3!Oa^kI&)_S#}&}}ZCY^G;mbR2E^LQrTd_4ErULm5?au3WuD z=X%v0PNMT>`=&A~FA2?@2nrpxv9RQ!qo=3Q6Qn*+R$5Nq{rD29fG^NySoMg!QC4I1Pk0^@BN;8e#7Z+^z%^F zRW;WdGDofDbsxXJ_HMy~WIolC%?j!9=X#d67;)eXf#xmUNr!(5pL|s5b$cItinsy% zY^iNG+CIj+CR$eH-y(HVbZ-a@qju*8YznOm?XeYnv@KA6Zst|Z%|eRDbcbu)lqg-x z*@8usZrd2uM}wrtCpPFNQ@h?|2hpQ zG6>TLmnyqZu3y0S%qg}>#c@e8!SP`@knvbQang!CdHu~C97BtH;(#E2s0`D8_ z#_VfRl8Z_IIU;Z``sKhZ@{_w`POn9e+)eI1rZqh?oc7GzOnp8({Rn9&;YKJ&bi?bg zh&77k$?8h86=CPkO4neknV!`V&m@tDD3cLfM=1$DD!)qP49&`3g*w?{0 zqluC8rAIher}f&a+#p9D!z=MJFu!?7yd3wY6P-&tG7IZDi*IJXs^l)lh*d~xu{NRB zl`79&mABFr<_yZ59!n^9Y1s^s3>8_A%k``}49U{}QhvU2sm$6|_yPZcP+AsC^qxqQf7R$X0n{SB; z+h2Xoh>3%6$~~oODqSxJrx|^5rjl5jY^->%n`5_o85%F(|8o3p_{%KuQNTa0bAn59 zT#8<-&+>kMcp*a{oaLk-5m2Dk1G>C6Jjh{^gk$`i(JD`J+LN0>TTV;L#J^E{SHL%< z`LkbDb8+wVjhAz7NWF`MOjVl3oTPZ%z!saQZ%)ym#Z^zjj5&PYfVipjn8FXGxuAw zt}dqU3P*kp(|{A4pl(Un-Ed|$gIq|53!<+pNq+1vuBgz)ue@zADkHrr0Dm^0(ND+W z>q2DW6~eb1R-%j^Vhuqik7262+Ow#+mI4>ZE4w$@_DstmW@!tT$*X9Ke5)NFS5jLa zAlG|;JH*j_-_kiKU-2=Vd*SM+M$V~u{=6co@OplJT0$l-R`j;)Io1B>=cdwfoT9aC z#Lg$Oc@i)7QckF{7EZTng>6%tZ>Y>8b2+8iQnW!24>QjBKg<{2KLKbg!)PBkO?MnP zSO#vBcC1&TW9HBmsVoSF{}ktQNr=_)7S@9HGW|Gm$e^aFdUN%+)EMT`14}qNijeju)wQ}tQoQr9k8+lIAoo? zVHf6v&)fD%gudp5TWy!r*Z!?pE+gz<@lALwCeDmA?E`hjs~?LzrK7t5GDX8rEhx@mzTGd?r?Rb%(CxxGD3kIx0tQ3k8o0dJ^;5*xpXe>9ET$zF$V8*92FnQDFN&;O!lCVY;$W}O7A9!7{%J;TsA z5o>C%oFhf}p)@-zVvmZ!+P;s)wZgp2INAnIavb4O@E5oH<$xdkQx_-sU*}}p+R*n? zgx*`Um@IavywSsu!bKp(y4n+CnAKxjxZeEiUQ(-ms;Bhj(ZK}v0!#JDc1u7-!${}Z z7fGyrx=M9UH-kYRNl{4&5UNAds5ohYtmfXDk~y=gQv6hO@Rw`^D93AP>&A$(qeP1(=0BZ@|J=fq#o;4o-z{{s%4E3}sHi9VCtE`e$Nh+~7k8Q(%wy#Kdv2tM^c??H5)1{&H3=rzGiw zQ$*Hmm}i`e5!+8lW8e8@zb{4>Xs`%@+*)Gmn|B9p zAtV$*#bYyOg904UZ}srHg6W`W2pKVD1BOG#cTiD22S_+}_LwSGK zC=iH1A&xtWf%t+V;=SyoC>rTc}w$eH35 zTz+4+U<=in6ZFZ*4j-aK=7q=g&tJGPkCxD6bk&P54w9CZCptXQ36nVw8^c1A?6^&M zjFY`^xjy;73Lav*+cT*Ws_=WIEl|69&LSI2*!k@fsBMaA#XAgSA?K1T?*x;D+6aAI zzTpsljafxl)tY6vB-lquEEiNdXTiD6rJY$ginYXnA2VQ+9hVy?j)I4W+vg4MOO5Cc zmHFoya6O9wpx~ur*38NZwHn+Wu@$t{`(@^R84o2%ccB?NbeXP+kIhv6b5iD?yuE}; zx48?ngUL~yOB3^JXPuVkeGEs4z7ysU71_(Hf^ktO>KMs@}* zERwn(bK5S10=Fs7+uHdHW29~eJzv+z#wHP@lSfxAnp}DZnMAaw;DH>I|$L(m6hi5}#o=XX0s(AnAMWsT4w z`nhdc2!XDFnnas@d#2k7I&ZWsFNvnM^)V>Q5N?0i3YJ05i5>1%dqj3w%W~Z6ezdVK zye0EM(?XrIG1K0w7m`1f$9#?RAu(ubT&eHi)8jcxx=6OoDQf~);5cQ|jTy=ff|`xi9wy+~3ZcVSg{me_~W zOS^ws3G17OaPj;Gvc@1lP~{rlD0Wl?z40X>X-oSqdU}U*Qpt}Sx!ze<*Ym-;Uasdb zD(-C-hfV=Ue6TXUMW(;q)Fb;hLX_KI)dVr#?@#@HT2$l@0lSztIvp(62R}jA(ycXQ z7e|Ti=yBfpiO&K!OWp!+n9nCUWJN<4g-UgIz@td4DJrnV|M{+5Dg9vU)>AN;e3vA7 z3hy~Kz9@RSKmSrPz4(>Jkh^Qe?KryDn}m$cG1MOK8dDB^>(7h!FD7~Jm;>&?Aj&?* z74hqUIXiGXcX(_6DPG$Uy#x941UW2zd=IfjvBWQ2InDXH5F~|BV6^1I$2}#n6IxRw zWPELXi(@Cnnh_%U&DWSuE_}ouHMqPTXc)wvIAM}`@<80;b;?TdHN?yiK6Fb`yB$%y z=W8l1PHD7TCHw6%`5%K*6i4;XzuD=YUSMBC#2n(}DG^L-co#S1IZfvaYM*@9R**oL zN?3749UUkNmrj9B{O$ym@^P#EanKn=biSsq^!mpV#fnB9tDuitQa`SfMR8?$j^WB5 zhIo&3z?rc?+Gwfy3KG%zQ%NYrM=vN{pz2=C{CUH_Co)PsS&Cf(h%ASK5fE$AoW?i! zxV3hA1EqrrYt1#^U^C-KR9Ad+IVc(ZN)|qVLb8|d`zb`b@4-_ZTp~X?|5}gwvo)d& zs9vdRMB_j$?QfcXVVT-&Jdn*OVi=KO+bW62?UGJrHO?P{x|E~Q#``zgG3EieQTeF! zD3gv-sKZ>Peo1l6r%VUd_9^&YWWo`PKQVVC2$vQ7k|{=?w1-&7P)Yp?Ap&c-KaIx(X@4LMVPJ;Mv){H4erG|;)J#``IldV3- z>T6ohxDi)>QP9+Mt(VLggx696emh2l!5>1JIq${K2 zOmU4)+%f^OkDqj&JNQH}sn>4~JO}d2jt6@%pQ|$8QyYh8DaGEaH^urm49kVo>xX=@5wDUnfx2GvqHX0!ROKSYD&1i7e{xbj}QnOlr2j`&+dfVdgiL*D5y3Co-|(OMPk->po5lCG^)Rl%SPg zvL5_rE!l3ww4=?QQ)F8z3+ZS(V{WOQ}a%#zf8RVms3f0>S zn>IH4F=|b;`IZJLTJMWs7Tnr8wMx-P0HyND2 zh*Wi89IJ2H@VvQxx3Yig@Jc6NCxcD35&2B0Ur%e)WT-bAqbP*dN+K-jlK;~_EDYac zSB!^1IFS@-ik}e@0Kk(QKkw!PGJ~(EaK~ym{qyMsT=%V=z6gngg^L9yyK~upUBWMB z8cSS}wMYx#^vIr6Rw?SpvA9YQrp^eR@##l7WyF|4MSL=Q=%3dim_%LU`*>tK-`PmW zIsiGAS8!t^6XOe?TgWMH-qDR8;fK|gSdJG|aQNio(~8w0kh@~#%^u6=6e&(ad_~^x zCf!$EPm(FKlN=5!&&elJd50|AVkTG~>um)8jFS1ZX2S2EC_5DVaPiHle}O<3|^)C<_O2JDBWU+>SYW5}hV(RKU$1fhnx5_c!a~2HpB!5~)oIfx@^z;g28+33D1m zEGO>J&G{)X;}CU_({F;%Ew&I`tm>)WF{=iS!np0waOTSR3;H&uRr9gIs}kwMM58&0cWK`avnR&lgFtTW&awCf@!XY zOUkkUC>=U*mV$-pgid#7BgafNj;A(>zg$TBysrG;(O-kPDBnwp>#^!k9y@rqQqH$h zMvl|bx#Av3|N4QqpZvxljJWySn%)uf3(0rCzD(ck*JEu#(hJfliYMM;<5^pcUHjG1Z= zv!MI(c6{DbQex31FV6I97%e9kN1|E@q@115wG5NuirQ(6a_s^dgI1d&|D4bf4ha7i zKSX$NF*hbJbO;OXtqYAE#tHPrU%>{OfKd%J6B(zt^&+omnn46uRFzcdVI*hPZr(`L5u+hmyvEFYAq4`u|>{x ziYTwH`9X`k@+yz=spNubejvm};#DO|d5W#JyY(>n*%#^YUhLqjf1MZ*yw1os@m^## zq)>9wnRpyD+NEuma<-oNizS@H>@U+f8gup4`SsM-1T=%sApt=)E5(wHVv>&y;%?(7 zPOHwqdhW)5*Y=14{rksBF$82xTxQko2V}jTapfnU)wq?e=!FAr@&3J`-S7dx*^qNL zBJq$ytE>{^Gz`phMf9Z+RZiG>j`P?2J^8OSe&UB`iuQXHK~UhpIm6{|uMpFLb}4$$ zu|E4;xTHNc^lk?>eg@0OUm7zC*rbh5|9hd9t^!%%rBh-}WKQGwGdv5FB;R3`Rh6~6_i|l`0uI_CrAe(G3Oc^NnU~GBUW&LE61+D> zevx1$4JvXdM~UI4(|T=P*m&X6DjjQ6bnAmv&W;p64C&j{UfPiV8ouoQ2`|+^qvKqv z%0b&e(=P3PT7j$*)+)wtTh#N>?b1urOcTPp;3+ke-uIt-lp-#V1a;7quijJ4>9u=M zmP&NALXLzN_qgoJ9fGmw^m;fH@>%&=_jf~{Kr5qyUYw^@9=fz;v3Y-^E+_z z9c)7K6q}p0cFfP-gYK{8Z@k*MzWaW7K8WN)nZnAcp7+ftT>rwDP(A+R!TvPn{5dk( zMEdMFYjShKK+pra9JPLTYV~!!%mg|-OL=mFN()868Ghxz^r;jLX+RTL7qNN>BqC7i zu&A``>&b{TL}Qmi_KO$>HSH8RBDHBRC|myB8sMp#c*2@$ko_g1QIBL``|PB{ z%5Re}la7)o!@cFo zGGung1#{gsxyERrB^=Zm0abt4W7HD~a_$PD|IvPlxM>az;v3}iKFZ;u;7Q5fkO=VK ze&l;V_E^2VTFO7RuHT8s<$;W@$qk6U%wgT|?|~twwz-kX4*Sq|W9_ajfJZRcX?LPb zagE73y`$Ja?+DCVHTP11(`i|6zp$$MP02Po!~On#(pCGR7aP;x{3%@${;M6+R^5l$ zXuJt*$v3~+@?K$g9wr!YqWM|unqYg0qHD}4h_>~WaiV0UI)5HvD4Xpa!+D6CJLcvW zMuvBL#xHLUnUjqCs733!9%(#W@%Bh^SNMMV`Kr9kJ5BrnhRT2 z>MZLjTuq&j&INUe;0P91-#BNmjd<;beanP`wwS@5^tN_xcYAXY-p_J`!T*>w!5o7a zS;r!LC$@ue!WRN5x$2oBW31L&S1a zG5e?ZdIMWZztn8ItbFSJJ_ka)`tE>5^~3}D{v>UIYzCV4&=_J2j@}3R>-VkHH{>PQ zFn&GGNDNGAc62rWcF*oD%p95%1ZQeJc8bzPZWn4eX0hQy8v_F?A)phIg7=4}(A{h= zC+SnzPQ28rMBONgvS|f@q+4S(_u7OyZ26A)VUR-25)HlYCl4~n!o_Iq2MWKVjBqzh zG9f;avt1qY)`+FD$%)UNiW^kRYk|djxK2dmkego%7Ez9zFL44eBY<+bkdX(ei|d8# zd~igh5MP42uH1?KAWYu&V)QpTRnVqIes%IT60>Kz10l;ZT5eL}fwa4nt$Vv?IHy;i zv`Wa*= zoGr5t>?B|kI8qXMOD?%e=pp*gCBmdsosrFSaE4zsBYs&F0TZT6`QiZuA|06kmy$-T z#?V0c35!K)nBC_6U&&BN$~Z-1eNv*&MpkgzecBSQIMA#9bc5Bc*qmzI$&2zVgX6pD z@{oYiKsfn`yhTG+FGJYji&aAdR&dOjdB_qv5(X;S=qrpUzQb0`M|cF;lL;}e`y+}g zL%sKIzDn7d(bToZh0JXmz@z#3S|PA`%fFMHga5C_)tZYvePJ;1ZrcY>IU`|i^3!ac z7_K9jd{nsYXv!qYdr8l4scUUrYxEJB0y}T~)zb%VH~FGeNOE@QNp2b4vb1T<9oj&y zK+a4-JXmm?z5TgkqVw~4aZ_o=6g($%y_^m@oAV7_%-7!BPDc`<`k9!DNx;Mbexc1k`4^mi|NU~B#*YIl9DV5|$jcj9FS;qS_`|zRU&c#bsg1ViD z;4#HE&t)#Y%#L}dejL_VChz>fFp%yV6kgQGE?B89zou$e(Aco-wfBHXVC^C-kqlbx z90DaL>;i1-pYRjA|9flz3lm-Hs%$w7=KTrhKL8Q0`#mZfeF8gL?5@$X&l9Ve=7B!h)g>nt>)4rsPISTL26EF3lgFU8IsKzJQWs#Y5PSw-PTzj<+oK#=dNRXLku^cMm#ZjqQu~mY#PX3lY~kjdwGOe80BK zOsTq-JAR6;tyamUN_!BUl`7;Hjo&_o(A&|}F_JS>uodwj`nPaDRkw7|BEuA8HBt7? z2a?jGmS*uhjY)?FsrLSRP#&v!L9qgwb*2p3y;9Fu{=rdo2PkW^fe4-fWqYC=3^pb- z5N_CkhJ9A~IY#I8wC6etYii;~K0_2Ubav&*YOK#F=ww-ldiE@^1NP4`eW)Kh#o?k) zU}fvys;d}G{aUN8QEQy&zb7{t@vcB~aCGX$w9P5l{)>C9ngu(aKu zCisMXi9|!URL3uH`0GyyrmNV-^{vhbOo{=j5yjnJ(l0tg*7fxqJJhfnWI6>e&(w^s z%w5rh8G8IY$2z~0*N^TJCTx}?W`1q_EsgokSC`?}^KQRg^zbdWBz?0#I0AiOh%kit zh1Vn*R^xtSO2|0fv{g8={+3BJz>J{=6*n>5cyTsF%F1;AGhb3cCn9t zf6#OS92v>Ht!-I6%Njrz2~<{$b_;o`Y>??Vt(d!FzZLGn?z z9YBXg5sdm$=C27D2B=VkGQ2}e&)hd(Rd>?X8|}$+BIRv=Gy_p909z#KQ~^N_ohWe@ zj8H`hH$B7D-!$2pgl+ivc%;M$eM@^Q zD>)fiBfLL$o8n&^W)+oDgJg!NDDmW#(MSJcLBiEH*6&rv?s-(l`FF@+e$qVv?4@uh ztM%T$glPYBpWZFuOR@EQ&&sPG*B&TX!O}F7q-Ny$Fu9vJ%bO9-qXdxT8 zZ?~APg0%*v$QMnGP#&@GDZSK?!e=pUL-f-QE{ulzv&7g~2%Q)V4PE=^3wFJ<;y9dZ zqtig`?;>B1 znpk2)N;5#a9FL}V?mf7@ZTb1(veQq>G&w%Wuj&k1xnDm&mY5&pXC6~r{Z4WU z!kJ&Ai{@Is@g^|eevCb3BG}=zY*TNoNf{m1gR}Rws{`^qO|_UoJqw8fyQ}aGmw3dd z=m?=luCm^-?k9hG>x}+?V+D%f3V=|{G1(hxS_X52<|>;$F%}(#Es;_8wq1bAwRxJr zwqlxZnQd-c8H3#a2O<9(a`B8p;30$p=H4+!?avIFNdsC=q^xXYf*cjXBGoKjj1VP0r1M>1j6Tpb zc!4-CT0om-RROEQ;>Zj!(iE9_BLfRUr-yl0`eq?iNds}Ms78!JEnC*i{~*eb7XX_N z+X)|AzDCC=19xv56Y@IbM}zcy{>=KgLI~aPaU}GO6Go7sciX!sAUN|6kb?7oTQEZZ z6rt$@XHzMO7NwAgn_A*+$dQOUkR`~P??WW7oB&3P3fkmAq>Yh+tz~{_UweZ;EX@H# zCg|XoRFty}4yrBBx;q`<3DH>4d6(;RzP>>ZcLMSphx2#EPmX{d?|0hik=N>?Y{y`w zLRgH&+CrHc`yEbRlO`BK`lfmZI&MJbik4^1sIs^eow7_I`?Hr_ zX1T6Z_vRJ9q4JcllotAenJ>>Db$rmUm|CFm<=x^{yIsw#qc6#Y81?<<%de2%Ykys@ zpx-~uaT{DOX-HnxsE{Ee@&|my1e2qP#T@;;w>f6gp})F$zu32H6(Npk^8~*|Qj*kd z9_O=nF?_DzDq`SciIjq-e!d)>`|P-R)Ek}}>-SNK4~D!_p6_COaS;LZgBqc#V*vsf zZ3FY!J;>Qu&kcEMA*E59(<%H}XTYoPJY|_h`UaIML-5%fQiN%TItKVG%CO|+K?twu z5<4aw<@C2>sVbIT?1}+cN2azP~CnTqA!mBoX zO}wnOd2m_J@D)JR+;TPBHp(wpKF|@)CKrFtGEGE_dj3y+CQ*a4D8ENKK?C2J(a@o! z*s4Hi=vJyszFdZ9VO_k&aS1l-J_-SX?(@Ni+j_mnLxscSEk_<=lO3T4bLt2{bcqQI ztFE|L#4>y{$YoVuc^*$RgEA}ru^b*APzEbVP)xp+%B7qJWq$r|(#ACd()RFG;|N8)H z@J9ZcIo|eyeo^8leENIl+iCGC*+kMPecLAVtlTqam6sb&@+5HD_|_Yv*mv0{^Z~cM zoqqh4@3xg_W9a?mGHz*en~OL>t$FXgWD~fRA^#Wh$x)%?rB{SP6a@*TFefL3$^ssk z>@p5g^DeAs(yLH%5%8jz-8L$RVAzZL8G56|knrBwV4D;u0v&Ve28I`|5TL6RPH1SW|8Cl-FnkKpVy;IGF6X zw;yZn9YOD`2jAEW4qFh|;%%Yq`?mE>tuJW4ZAg48LiOn2u#VWV<#JA{G%3|?RY|46 z7>vCZ5u@$4tctSZ2J_WzU*kKwiPa(bpUH zB9gm)heCDeA@TaxXIaB3K2hhumgebV#l2HfDu<~d<7eRnQVzvZG~@0`0+8;En)*ns zon+F;*cPp__?H~Fpzl8W7)+|;O)5DSKqMdSvageW6|otd{5?h5w~dG zdQA8tZXZGEi49>ipqr2Hoq*R&W;YzZibUx^HiaScJmd+k7ym~+xZnUhW3``4<2(Ao z*;{U=GUFAUcXm1n8VUy#2H80vjuB}*nVOfB!M}0?hBjLWIM2aZT)rZhLw^^X%f59L zvSPXd;T^bfI&twT+20bzXN#z2!5_>n-)WzSfBshj_;n&xZ`O2H%9iGXf}NkkZgF!7 zYg>!Dsk{%)ym@-9lqt8uOg(z#_SsnChRT2>O2)2%Onc+j$d{Mg55PiF#Dia+DkYSt zSj)qa%twg4v2Ewm)0uIWAoR+A#;$2qM~UxKRlXPVv~?ZvCgJou84n4JuL|19#rwTq zO!%PM5r$;qJ9oces2-F5J*0~?fTV_oQS~TwRx@YT_dUJ_G$4+$Ai+g~nNBjzdaI8D z4V5f~Y4S{(NvXU3IW!cwnb5mB0JSS5oGtzpDc$h(fB=(aD)}|$&Xk60&}TDpmSbjR z_4h)bUsc<#&k3_&enCsn*KXVqUqJvVFr%<3FGX1>AO+=_pFT;l6FVk9d#poM8`9ak z;l>5bPBy^pEhjeB!UtRG+DX>4()~U78kps|@V4uVoh@vqb!WgAi5!rEgss$xIBut7 zKbFpNfJ)Lp0Culhv`v!EGWqwCB2EJmTC6H92k`5yL zR7tk9g>7%W`Oo{h1BB;qerZF44QLbmO%(bi`b?Wu1DE$ai-Nrd5^6s_y z#s8!?yZ-?|8oo^iY5f1+Fu%~7Bx7;>|0(8IIHAhmr09eLE636-BqX@?Q!i|!+HuOT zRQ(xC=3jnS@=^dYB*Gg-sW;zdGFxF$&fa=3QeUDh&A)$RYpudzQL_n&i0H@zK zKg~3y%;n@jXukU}AfRDZAQ1me`L4L%6$Au47Ze2iy9NDkEEnv5Pr)&Fmz zGJM)P2#64f)K6hmchCzTSbxBv%VWh=w#oJ48CF}o5RpCX@3;E8I%1Bl9t*U+ff$pF zcdokLOn9_EHDodS?>l7j@4R)0Lr{b$H=skh30TA^U}Sl3T~AwSrv;zalNT3P7gPN6 z{PPWJa~Jo{8jHN;ZD)%WPx`23ga+L}5u^f|X>EKo#Id`!#g59NN5&DL0 zlMvI4zdP2Rh9A_IbCw=;#^Dlf)_g_NaqkFAJqxYAI9ZE$?yRFce}hh_%T03UYI1Qq z7`bkeR-3%uMOX~Zd$bPflz)knC;PJSaR($S{ZTW=2+d)R2Y*oQusFMw9ci4-oYyh4 zSs_R2^~b2W8v9sxn;$pAJFjyR?!Ay8$PaysHtY7pRJ&1 z4Z#H2W?J=PFcJ-Wd+B6x5{3KVvx9++=nBOQ;3C&4^3Gvq=j|Ekjret>?QW1Y2wk{d z(|TTDi4Px*CgOiu?%O2ug&scHML$Xs>AOjPr&tDe3rM2b8Nr=_lw14>zIs)Rtjge& zPRJ4Fg_bEF-|rJC5vBb3_X+$WGEFGs%`J<;`GfbQU55RthsL81bpE#hemlt{vvmo0 z8pzt47ejpdBh}g<=ZCzcU3-<=E#U3hvQ1X59hbK7O*qye7@+d_iR0{T%SM0rd>IiJ z1o{d=VnFwEytn_XTyzG5xQ~7@L=_D0#kn1|Y}w)m?xYjc0Ll6fE;-Um+3^$^;$ED& z-ChGSPkC>GkqTs|VywJbt7ic@<0Uhr5t0l^^z#W)AU*q)KAy+vm7H>VhC#&4l?j-T(u-w_An0jVnq>l?aPuZ=>WQhI zs%2;@4f&*WiqbZLlTgHuKDfI%DidH~mmM+MaSF;B!jeB+e0d#KI#-Nj(~A`n zRszGwiV(Sgqu27%Z1okv2Dh!6fN_4{Aq!)#@-jP*Gbq+p}2SroXlq1=sC}Y6d zRwpce)(yf!EV7R>XC^+`gT}NCMolVXji$}Qxy^tSC!tf&mXnr6X{48)Q{R4mL;7X7 zN1eEF453Gu@1qHGO(!ef6~`kXJAZZLM2Z|gEhlvFgbBkKr9vwzZJj`6Xl-tWbPfAL zUUApLnm5;%2z#=$=!Vd=&QwHw#bw%_lPp+4(O@>=+(r*z%ymy#%~z_VVMus!aor4sBoB&^QX0+-scb zBfB4p-DN?e{Jj(S#FRQ=%G1`_;GGrS9FtmJ(_vttpTZrs9nk|&KAvh9hSH-VOC+}V zbRhD7aEX7OBmJSN@?LIqO8@pA z-rl!*42Uz9Rtf4AiILXg+KGvfq#AFd<8ymLrLYq16D$#-t~Vb%7A1L2+UI%_)op>W zti9D);=hHL=pIe!V95RVjfMO4>dauQ(X81 z&u}5kpNhQ7Av=)toQYgAmI=+_`N0;~sf;K?Ku951P^M%RjR`CqaEGTAGa!Fj>&XfT z!8fAmGTN)aVj!&V&?E0yuimqx_B=5*@syrjvI^7`>yV6PDjexW27UT2$deynjJG=J%e!tYgM}Tt>GXX)Bx!uBcXqNgIN0ulum$+|5uP5jMloBVpodHgQ92AVuq~4e&BsHPvwWz4h)NF`P zJn;oNi52T5M$0Xw^l2SC(fzU{NAH+ixR1oASi!H9fru{a-r?;ct)X20IC8_Y=*z#J zp^{k~doYQiw`{uD4#s*&{We`!Z#27JAE;eIKM{j-o>`hov4Xh&^4$hy+?fui_&LCR z5O_KrBKWyLA=lB*+~BPHH?YgKkBK6T!&*lku1wGW=6pQTDP!TA`lE6{U`CP?Z@6-|(aqDN<-E#8JU%O5GzhEq7 ze9Ek&SMKi@dd+S&o9y13FP?F2rBrEB!0)QwGEhFAtYu$UEpm)OTeRfoh=B+2jfGE^ z#D?Dd@mM03i-(i^*e{1n8_tz~@wwZV6Ux#v-O2PZH`qpNHu#Cs8sZ!SzuBhH=*DidTPZc_>RvRMqQpKvZ5!=hCDo*cwps(aOOuIT)6q0)=VkX*#E%R z&!ew7PSRVz>YpdTWYh)P3k4ADrbDJb&z3~uce%J})cnD3xwyG8LcJ@46wuku=cSgF zr>l0jxWj>Gj0qby;BLVHKPL^Nj8O2qyfEiq$*yfoS?jlbx|tN?EnScW=kStToGN7g zq$F#LUP%@XwfPb$J^K%AFp~wU7ar=0y|zq4t0ahTezf6%U{zdkW1zw?rnrI}ln-66 z>;s@~P!@R|6`@=g4`OLe6(kK?sbcAmW*1a9y}z&S(Q7J z4~~IL20<>Pc9%w(D!#3j2yR^Qe#*< z{@$U|5I^ahf9uHY`&SA?NK?c9ZfE*6+c38f21>~BpXgPSPQD&sv#~-4qJ* zRZLVd;C1Ym~e zjvikDny;(A*Tl5p5#X!bAipWp5)=8~TD;1GGo6+X(qL2Y!$o9JVT1qOvk{{ZI3YzsaBZ`3V8?_oiWnY{}MqKU6tTgU+?l$-S|ZwylNkebyZ*I%c}CG0RDMr>Vurw^yE)?*JCtFaAhyb=e_Z+kZ@}S z7qPdewgFtVsy!hsE<0xf*?1vD_ z)^Czvyo0>>z|WszqVi1hPA4@oW;P*XPkHoyOUiC+*YiWP!6jfB@!)?6DZ`|&(^=iZ zA-njNj9}jC4O&PKh}30Pnbk0lh66Wcg zC)3?P-GVbadMl!m4?t{iFG^jIq&(!wZ%c(&YSogl)0G7iV~0zHU+*ZS*6tjLgx=zz zn~Fybf)Pv%wg$?h)J6g}R5G{s518hS;JMsVUwoqyS)+VfYc}de)Jx+2v}eJUDd4h9 ztBkxwmDLiykWdi2y$Ta+E^F&cMXzwbLu57Hdc-vqEsfxbDm0o+V7b^%j+v#$VYg$~ z`XFE(wiB0%&L6_>-7`KV7bpuX3Gcrw3G&$6Pg`gfueoEB10f zvBE}Y1lFaf>-N`{0D+F$pIpBH=uc@PQ_3dC9PHypw?CNwRFRVZp519s#HJ;5Ejm8h z*^C*uB`==r7-AXxoz(oa5@Czu2-+N3MMu%*+NxK!kYp(VI%oo`!O%UUrrTu$AT(4S z`4D3##V=JG=h7B~J?ZxXK)mg+ki&!~iJi z&lpfF8f+eFKh4>5=gN8Sd=~w~HMmA%+MVQ+TX1f)I|H>ixReP(@n;ForyVq)hRsaM z%SXVGaMDR*{(;0?3sDgdyUD5Z^m%uoHKB1a#7Gl3f^6X}$51lTt~X5u&`+V&F1d-Y zajd!7v_1b=N>=RqP6q7YA>q_!tAk3;v;E->io2_p?zfJ$cVZHvYNBv_W;}j}^ z6Ya$$G6H$jA;))GQ>|vM8PG(iX`?PAHw6W{_mkL%YeyOv1@|L6X3GN(>>kZW)NP))NLcZtv5yVaHr7Fv&li&0MS71_~#FGJ&3+nP=$ln=rrmf4=Y! zuCiJNC3L-Qaf4Dz=i^l*6K2T2N;xyyEO1=Y>8JekbWEVodRSPPs_x4yjlv9bP$MCX zQwHxNLf78!%3+a{gk28$4|1wPs9GAZ$XU=NCxa1ch`O^$8$&1NcF)-gfccfJhLjsZ zI_)q8q41QM`}Ybk-p(PH2(vvHO%Qzn+6wD^DAOzzv}F;LDV)SPm|ru_e9@bvYbi^l_rJG-Rp zP(3G~-gmhj`#fgv-N{_xvv`YnBUBp-|aWsR2XG8~*eM zH!m#vsi=$MJQQJB#dd;PcJ9>P9lJvGfSJ+EK4yRm(&~KPfYG=g`5}TUA^Cy(KLRz# zB*}%$C@vyEE`3392@Oh>99bZat2xd7{+W$#rtrUcMH4=N?*nlOlQLi=5xjC#_$0K< z!<>+FH7SnOK0RF$nO!!hqvpbiX7Py5u&Z7L@}eB$YrZ$xdBG{uU}n@U>9FzEnP`E3 z5R{S2Ke7C*5L~WPni`-eA`i!Fy)Qx0Z$i(o6OLt|ObuH?GSA@c3ic)M?OhThR-0LC z_E0`^uC@T0H~12b3T)b0cl#)dSUGV}wH~}lMTS@!gopkUVm-k0LaI((v4Re!WThYsvHC>PcWhO<#Q7+;HAX8ZyZ{1L< zccKjvYUP?TV6$t z+2fsr6$Cozm};(NlojhHvPAZi-^6Xp-|>R4m2>zgTHJ%hdh*1?^>RjqM3Tcv!Zn6EY&Vv(YPuDRSW1tV#QCszvUXM3(dSZeS zIv20w@-*}KzU{DYwRl^H0JE!x0y?02qs}9K{&u)Y3m)sE0tpR%pYaP{JOTWqKU|kl zB^bbjpRGm{ec(?kf`ss*nRv4!DRkHox@*;g*04Sj--QNb!X$*v_Bj_!NyLU+B>ziA z*JqS;6zieB=KSeg5EF#`SW=Mq7H~Q9_Riweb2|xkJU^EZBj7U4k7T&(F0ybYfQ^#v zh&<*v$@Geit81WIE`sFP@NAOB7U%&+dCw(5oF(SS%C{FF$mnzwtrK3+JVigHZq&)O zOcq)-P`NI+7|fx+18-NaX~Ib{2nk?*gLBu{<2y1+-txCAKrlhiJ?S$pwb z_-%30!V%>qE^G$|+{iH8G{qT8{3y){0VLOdht_iPSng*^klg<6M5x2Wgss?PaVDdW zE9sasQ`QxMGT2>G(;dXdF3y2gk?TyLO0a&J1$|@rAM!LUf-Ec^b#R?&P zp+Ial!Sc`40FII1>D8BE+^9C8TI*HHP)Jn7l;9@Tw;X$8KX-HwNr|D`rvlCM=&y#< zr_J9EqjkzwQPTG(hB`xLm`Q_M{ZfW|7RWZ$*VPv9fUq9LR=gJDG0;ntCQPlN=?>nw zdi(z6Ef;_|=-sy%=1oBpLoBQo@nD6JO!Cxiq_&|XIz*+jf{48+A?K`c+IbZkR7@&C zOhf_9vsHMsTSA(#q5RRXK{r({5wT_Z^q@lqDqJIqU({mAAB@&pN>^(VOT#QN*AoKb zXo~&I8yugt%79gvTAIW=luWN$%kq%y!>!b6TcG%325xtZ;tooOSDQ`d1Pz74Bd({R z0wyWfm14j2vox*YWc=l&H66gMDu*bwv*KN{t$5r=^PV~*6A)dZe*r)!FB;wrm;o*2 zh+ROF^Ua53j%cIyewP>A)qQJ;5HI_&OiUCKVW9dJt*3&))3kzo995l8G6rd!6t@qi zQt?+h<|-oj+-T>RwmsAO&?3NnbteB3GqOghgE7v@-Xd)4iw4fd_N^#k&)<*BAKf!< zrJttXD&&)RP);^EZlA)fqSk)puPwN?k6O5PRRKot)Juvs&PNEATPsy1GIq!HgMuSBc8SDpQ5M~uK)9pgPsNYn+bBHs0Y4hf#tQn1 z+YMN6$@YZ-{oKop6^mrUIy4|n?*m*PTfyu34AnPx`o|IH(}qG_QsxyC2$mWTUTc?1 zc#f`NK9Ng6g``Rh?HJn6K$n{omsn)?eF@?I`&@dpf&OSRZjElK(nP$)apS2CWWCO* zP%Q%VtUBZ*-VtNY7E7;7CIS9Nd8tIE`N?13T%w+t=0 zc%tg7)7)Ln*zA0UI1do!(U-cvwJVgx62mwp{579{u~#%)FID^N3tEX;Otg--E{td# zc%2Xj+Mfa{#fu7G3&qBL^*2D_JBMB^p^n+7zVMlaHRAxLOs^KAiAchV@)u=HL>sS( zz#Hy>-IVn9Qco|h3>}Zn5~JR%V$3494nFXgcfC+*JqQ(y3Hcspm88u=TBAfW=d_|)x(R&1JYB@UUX;I7fExVNB;O;g9e8kcZ{{AdvL) zV$E(KM|n=;^PNQ7H-dB5n@JV+>-U-%@DC}$x$k;iLSN(ka}*fo-KB58udPgLN!O#~ z6L$)kOG!Nd=8RvVS6t{vU)u&k%D$oSg^FIwc!$y=EfN({(iA8RSCQ0oQGwzj`?G3d zf9P<-M{}&U*j|&Sr=N!HWQ0U5#ar#{9F9hg_u5$enkH6@bu zNOf3XsI(B= zT!(Ajqi2GzjkkB4SH!Pg0#n5li3`#A7;fADSUs-nG^mM(r$6$4Zh+Ud(VJ5}vLa;U zFx1hg0RSg>;j_qooiU%au3njhSw1P5Jl9Dp+Xgq3&@Ot@FV&~%Fnz_1T9%*a;jbhK z(Fe-v|&vCKxLSWjvMJ2G+4bnCKVjpbZLew%7^v?R&b3a-6HSB5{Yv`3t>^a0xsqZ@qG zIZ_@Kt$^aU$f3h`xf(L*O0_btT6$bLekKlvo1Ms-DT7cWDl+-9m=vxI+Ravk{O=hL zQuea%2k+#w=nYq^SkV}NwYuC(z5kAa=GhI7eJ!k!RkM}Dsb{4?$tPFyAZ5NR_NRvUf#Ub! zsfA@sqwJMg-UlNMmp@;yl@9El)8*8mr^RZLzz zHx|9fM7>fi>+Jd7hZ<^RI4HI z4UT4<`L;a>pAj^T{7Klz{9eXPr;rLagX}SK}VSU))6P0_aOcT`|U40Q#x}z+qO3CXr zzwt@&38g0#N=G}!TrQi19b!@re|>)^15*6&2<~1&8&wK;o+E$At+0P>OI!i;ndR5+ zRMOc>zd{izz+Y%ZfqRPN(IXR3yu>u1KCaq75uQTWc7Ga?)meeoge02uyq|Ba@ox_| zQ{FfC)JSGbqDR_bc&JoW!(T`g=@VQ457&f{iD8F{M{WHoc`rFo2LO#WkK;zUSai2X zw4$ouvf6N0htwt0Kg`2)R$N7!k%?e;qVmnf*w0+004Ud;0=Q?tx*|?rq*M!2AP1dP zZmYPu%9JC(85|A0Wu2O8kxh1U!s&Owus?K*6udy1DpY|X;CpkA;RGmtVPl-FU_xr; z|0i+SA%+IpYj}jqvt4}l!(Z;uI?!LRI{6S++vq( zH%&Ta^6ob5p6?fqk7KH3?D_Bce{uD+4|69V+X3A zR7V2jVh9ssU44Vvyb(COw*5n-`Xtt3-_^PPL+hwtNS6D36wtG@bYTYsUmQ(du1W%! z!1whe-(FohyK7Euul+M-9X*#GUU#@}g7jU4JdskfOnc{hhehN) z+s2%hOGJ>`<4VfU$9fTv&m0vfkHPMYXQTP+N}t_Uh`vA&uAM-G87qQCs;6Bq4BpKj z)??oiKtdY#dfaz=xSWV{_!=e$0-gW(Wh7TcZAg8;NfLZ3@1~J$)$Tw0RV#?TC!w_G zFQOBwWuV9mqMWziM@kT<-Kxt^E8vjp4;KliTu&}0dEF7KUTmX8^!vKF{VmtzZ`z?g z&8vEzih$dKpLBQH{a62UpCe&SBX>1T_uRRp06BDJ7zOHB;G-g`BVIf69V*@F+Va~w0wt8y_>Z<8+ zd}t0#PiGh3NB)}MhgxQD1X*l<;-9X}9L@ZDUU+}ROe*cn{nwmQSOd{W{dI&`f{8H* zIv8;Gec)Q+SZne{?%}Du&k)bI4o>DTXUpl_q>;qu}cEU^B!ru9BZdt6vO>EJNW$(3CFY5?{d z+k+-_HMyx3sty`Q%EwHOJbVMf54FvjnrxNlD9*k?bR~!^xFpH?J+; zx#UQ<5H>&dj}`eMtb~xR2fCQtS6?zyfkkJ}c4YE1ZA&Pzpgo~701hFvGs_=OPm+&^ zXxvQV_m*^52bQPP?@jwA|0_@RQOuJv>&VcrRXGsOmyt~F?bv}+pLDAqx01@pQgwZG z7t`l!g*jB9!-SK?wW@%TfdE}-=d(08^@oqT^h}C;m*XAF4Y1>Y*%1ZbBGu~K5m20$ zL?fKS^Unp=s9}x@w#f?|- zM{4l#3h!F^Mbe`8MID^WifUpG6;+z6R26{{pxFeTGH4Sly3P4|i46uzJgIg-)|B=3 z`dV615lJ@=#7rsQ*ajGaTI>z{UYMELaS$m7dAr>cnW{{QnWYW!!2pZh4hAgKsehkR z)!qyh1h{WJVjgMH5zqWQ6cBP3ac%tS1x6J$HP+0r+i`0;vRo+)4BNnyXBtSn8S>tT zlAfpq3w@apnRb$4H4kqb{E8kS`+FHmh zGh2kc%Zi*Z<;>?cOe>RsSoI}8@nikwJMxOu7q6|vHaN*^X6$U-L|21T&@4cA5WA5e z9}Mv3VyZ_j^G!q^9&*U`uWh3*!yg1;^-W`n0Q$jkcc&ZKXuu}^IqH%QZ1V|m_z^$2 zGZFn)xT(2Y>N-Cs9yJvoa|%JUV84(wZxc20CJi)%7M>sdhPu%q{RBy(7V6 zI2`k+K;l(e>_`P&xuZxqGBi*Q;}hPR#tcKAz+|zvvsW~KYAY*pXN*Id=Oo?cmq{MF z6wd`;H|5$o{=d%4Zql+GI(BV;(xVCk+rP9G|ReF+A1#}L%ur{-NhQptYH>NPmbnh_k!YCGUc?RCweR44ehC zOM^_HGbAnVWk?!mbt1XvK7-`frsIbRb@;&cb7nrnkk}mXMgQRQ7AJn1=!|dxdalqt zf5zra!!x`i2?b{@&y#5~%#aaMEGt zY!GFnLONMH_j)bJW94EZZ zPs$DooDh3I-x~bA?@yG@E=(oTf{RQ3{!K2HO+&*5&U7Z=j$%Aj`1v_cKH0yV(++|A9jUb!F!HeC53WLMCxlKID`Pclch06zzNLiQfb<;0AV|1s9Sfuh731?(^tMb z_lyw8AM6;=*4 z7?8k4Lj7{JnKtRBNh!Vafz zbk}v6elUKSWTZfyxVMwIq%A}-0MWmacNGFbpPiB!H_JqlytVUjvOM4W+N$~BW zP#f>-Wr%Q}*ZtVb%JrB>*=%7Fc{K>2)rjplo?^GvcDAEG`*g1N<;^t+{kox7OSDCTOw3bY^^JxSDhVk>J+0g%zWsLFYCy9^q^Nl@jc#pLg)8aDc z{JquiaPu4;tGL%=XY{D6e|iQ*yxH&$d>`9Dh z@(b}ajRtcDk=za*+f#0)vn`on9%MyuOCx~iTN}uD@yov{qNNy@-PK)EfSe(hQ`Zkx zETK|cf2C{Cg}T@sJ@o0Ghi17{c{{uLz3%olr2Q9ydi=yIVMsIUQy#^cRphI|`_R6Rm(1BpJLU(u%Kf-yrA)iBplO%ep?%&uo@`z>)>Zu@ z0uNzJq|6VSKj+ukxTg*B-}+27^ff?(jJ(*vJytX%fLf$b3Fnm?y#}}taXZUgXMbDo zG^6XY%+L~QKX-nwF<91YM@=gIqoO`&Y4b+t!BjXM_4h1tZAt@RcHQ{oZGzp+ZkV=~ zc*oKq&c2fwN5jtfcY^P+cSC**!D2{iq*BPHo1Q|7c^9EjJsdZ1+=u>=`5cVSYdQon z2%3?0Ra~(Uw`WNXA-8`j48$4A(J_lL8N`scUf7z$c)1XcJNLkZ@-PK<>_7jz*7^b4Brx!dhyA(o+6jR~wB3W5)L}X4V=eq-kFCIiF zg(ky~y^)oypD2X`r-pf!pYQWZ`XybT@-Tq*{hRf*;^A{ZHTB2hR91%NS3nihLc*pRxAge%#1aTuis4NN&bPuT*lO}YpEtZvw zoa5Sgo~VTD9`k@lHG$vTTf1bCj^BE)70R0D&TbY%9v-|3`u!tMjOzlC$3*#Z^YBvTvt3W4pG3RD7DaU{ z1+kN7sII+G<=>L#E4v2hOc}tqZy08sLQrClYLuK^ZYe<}!Z5Gmo_q)x^QS=Soi0-E*X%+$S(vlwo`ZAi zW*Y~z<%gRL^-2l4TdPrF#lUmJ#s_2v*aOWgu;#CP^ep+X9%xbv4@SJv{UI3jQ$%om z1cwseE^}{nY_@a^5^Xf5%7|P|g#JD1e~VEvDg};zSn(p~cN>Jo02y#vL26KgGx@M} z5&}~tw1wX~xHd(+QHIAie(Uv9+ND1*0yp_74LfjdS)zrDZt!Ft)tajQ^`}nCneQy} zLSAq4GVOd8tWx?C=>6TZZoPan(;7K4wI1)X%t3i26&j$0^-9tG8^|j%RETGcL_zd( z+6Rd)NTFX#!4zqhne&xr5`G-gB)hu0c@< zYbCPjQYD!{W_FHxpgkAoahBjU+e9-Hh=K>&mlC_5EsXa@O^Y9SkgPf)P>i%sB-Xaq ziv>FRo_qk-b6mG!59?)34&B|W>cm=xii%eNJHzj zJFqq*2?Sj1#l=!sAuC$rs)lafcT%_EPVj)%K!=L(%k`>rW6n^+>a+!9EBxt}gi4N( z1Nrh(-+6L#$IFVkB#yM&DpnY>0~GOA-75EvF4_)e9c7&5@F?c`gvSQxjyL#0HsDK1 zl_%z0A#y+Oh@!TQ`{Ih&0<-I_ zPTsBVmRKi)iq@o+(60U{Ha=_4Q;k7j zh9K+Yh{{so6<$96Wh4#xL92qbJ_^Fkej+Y6^2i^J>_m;<2x&k#Ze51_wDvl}58F_l zF`sr+uLBuYwY6oTL_=zK+#z~?m28%+SYgCZ^OHvOZ3dGpc11P)&0DT*cgnl?;#52mFh-p!Em zg(=QFWM_@~Du^Nu!qB?90{&Vy-}1Z%C*tyH90uAY2EpJu)3%ph_EIL&)N}1av+C65 zU~%6uU7z?x@?y&-9c~0hO6bsz0z5~_O3=^WY_DF=SBfbZwsC^`5VcThhNHO3^_aIo z(E)B3nhH8il?8U|%dx*9_*BWkqY~3WfuZZ7hYh+(ifl4fA^fu5QO~hZP1E?a59V zGxL9TypJ7*)VBwb7$HkKf&tG@CaOtzGrL=KI3jtFwcEeH=1o|b1nrclYkQ|k)Z24v zHN43*Yrdv@BtHXltwQV%lEewujO?x0F|>Gy@i4Twlq%CHNMTjVTPRV@k#&=Q{`nJv zY6Gbqi6fvCAx5fJ`*BSEaB8Hc(k&fpw0c$V@|JwV{n=zT#no;5H>T2Z_ejNVSRa(K z9C^p}FARolY$Kp)#BF7%2l^n?70Y|b0j*JYeo*c%8517fOhjJTrq1_LfP z^_@$t15=;AB$i>EMl2PW9WF1}w{GrS&GPAb;4o0uT#D{9J~EeIp1{)CqoZoJ-;9#6 zDDQ8>hPP%eD>g1*0w2=_j;|qJyGjszj*Hq|VyDQ2r)N`7wmp4sYnpxV_w^AK8pTLB zlfmU9$HZohbejYp)#6!Ffy3OmKM~$g-Rx)$7XlAIs$L@xsSBV6PO=wTU2jiF^h zJ1OAU)nWezUYI6wfw?tjRQ}+W4JwtE7ZSh+y~x=v(hR0+?G{~#bpoukuK=iAg~?Swb@LminK2`Pq-t=e7pmmQ>A*aMY9IWJhDk&`DFFv4d* z<7NJF0bjBte}YsnF#fvXUWliL_}aw>Nu(qTAg-24j19PwrNz;R%H!~8S=|Mum%dRT z+EUN`BXKPi31)0IenNVNWFs=@?are>xCt=wH!1wD`|V(yeMPq?qo3RYapB?<9<3tY z#@hILl&U-v2v!CusdqL36^8rEY;ub$1cmvE3gyF+t3vr^k&w`&Y3H5rR!6ob*= zHdhSRvL}9@Q>T4NmnW2!s8p6nl{kwaQCr+U^zQW=`ZcvH{WYZC$DwpYm=<{zCY!qg zad9l7ej2|2qg&ByiW^Tu35h>&YKoE=1dJI=dJy=!*E-O=(#d$)!qm1&?)vY$SM2vh z;`e!Wl!DSj-a35-h4_=AsA`VPqG&Q=$Z|1}tWchE$wW+h?ZNV)ol2-0^6ysjuPn5? zcEaYFO7JDrnWZ_O%-HidyIZ_VhH&Y4C`E^!^}i_bck=NO?ZA?dlmJ3{rky&#bAAo# zE3Y?IO|Ox7TT(+4UYs8Cyo|sG|EaPOQZ*>BWHxZ(liidc_U5;-G}lH?7z=(d&T>=(|OlS#Zo1HCbrY_V&BpnuN`C>yX#e z3k!{?h=lvrn@YgUxS2_oDD)C>#`;Vc0ajJ0aaaV(Y}O82&YN?+ykEzyZYEv;!isps z)|q-z9yCbC+~nI_B9IbE3wD>>GF-g9OVsxDSkT#WV%|wF$^yX!4QLD-O-X;E^oCml z2WgGg*AAp7%jf#I{a+9mg1^%jnZIt)0MspYpiS?jQ~GeiAZc8uEd#$`;Js%k;9xq-WvF;e$O^Mw}Zx zR%K@=m81_&HQfsmesHhEpK#>b%WE}53(ojSM~d~ReVc)ddN=@v{^z)%F5&k}?~__N z6SQL?SljvEHK83b+wFJa9P}cTy5$eFin z8{Cmqvkr&BFzd>6vlNg7kZ0WZL2y_=%k^8{fsSZKlNG~j%BMye9E-X>ZJ`>6qj+Zd zaPd2ltxGq4?kPs6bfYt?;A-#(WDp#`yq7RaBxEMeLV7gTdgz`|A$Mt#TqK~2q6bT` zco}x3(r#k2R#2iWSUN5iA6K0s6DSxWJiRSr|L>3_B8p!EXa4gST9kPmnBDT9Mn(bC zL3;y~F~i7n0PhhnaCmTC&J20kzIZsgq{2c#4Nz26<{d;yz#YNRztxa

    MhE~%qoS5L&*#x_x2)DK;KcvHV`F!)G-YfF09gF|2uX{z}!cnnMe2W;XbDRccr z;JB=RbfZ9p1zF)S4ec1V7o0{{A3<^abQq`;UloK~P6DC??UN7(*_dH4e9xUbNb_tFeTe>|~0S zlz$=`T2$#YeppCJ`5yaJ3z}>LAsci=3k9+Olr_~3mStx-gK^yG;9d2$j_J*1nzJZm z;g#OAZi=5{JkIIJ;(uotg|605B_B_+A+xVSqXBq(w|T2&v`ByA{DJQEOs1?}>4$6O zbkZZJ@HN*Qyy|>`UBChvHnNH=*oV7YTSHTu*TarI7j7*Wu6s88rpFe9lAE)l7I4J# zEFEaiYKlv}*Wjj@*^&CYEg3O+Kv$vXJWeW-up1lC)ra}-{y~A^!~#3+n>C|pBG{@x zufo#w@#%o)vcqrr2QL;cOI@6aHdDe?)KEy)or%^td!NW)vBCl;#|JIdB-KGG;_QBi z$vd_7SpQ<$d554uL)Ey`#voGNeeXba^*PZni2q>syY|k-`d2bBVIA%N{sj1j~Bh6KmcCwY_ymX3p%k~Ag&QaWhChB#8x`Z9NaMQ z@kzZE>bF;MA;uA^g4t#C^R=6jq0Pb|WHvnLc%*d@`Fv0bgkECB^=F3!wub0#(N6fq zt3OV(_We=Do1`tBYdT#fgIYcUKWW5f*fen;aJ|cw zf@yV@71SVX=Yv3QT_yx|+xP@LG{^3JW-8#5`&b)YO`$nI1G+hFQ`{pdvG5$+HoM2_ zSn(O)HOD=8iJGDGm`E@0W4qw20$$NVPGI@%FG8EM6-$_fZW04k?iqnFy#soM7Plu> ztO?fI!rA5~J;l~-hQd?i>aX!ASXv6fZ|!K`Q3!IWR-^^h%7U}kgR!i~ky(h7TuSMRX?_FT_%edWYwKN&#?1LEF=D3az zgj+h&n{%KnTF8kLAjQLY*>84}7@><3;S_Qm;54~AuS#%BdnHVJt3q2chNnW@Y-@;$ zR%)`K+G`R&gZtrc{N#R!`M*x++LWUA1xn>xnaZaMGKosztrm~{lK90FY0meyOxUPu z3gf^?A%`_N+-?{(;!;lX8P`~7`xTnMFs#Q#Zb2tf=PnKqw`MfGRy2xJtZClp`!({r z9<*HnTE>_aRD!uvldGCFg_M*U8Dz}#p5wX#p#Mv$vrk`n~Kk& zD#52l`>%^Ds(&G}LV15^dd$^kYI=62%tNwgcg$0yp9zd7+U*7792 zeCk3*}@Dg?0mtij=SN@#Ktz?1iq?du{+s_Ic3z#GNF%zdM7L*%sCGk5gu zn)wZp`z$HH9TMXDvFDYzPh}lA`(X$+?}4;|pi|_DfCI8*AfWA~_k0lx_3N`zS&}9P zF(W(asCW{D`C7=qTy_Lf;Y)PEO`Swv&B`$KkU3Dad{hei*wv{8puKvDT%nRR0W8oY zH8=dtLXL^ZzDXg6C)9?92E>(Nn>v*$&4FaQBn8rB+p)Hd+bF4Z<9ta0wbD3`PxxZK zeCz%uvFJv4{3McG+djj#wRs6WTk>wLeT!yuZRaVV>g5Vhrh~T=F(=^TWs-YLTO1C? zJz%rLElIo;^V%bbxBn!jyu;bSRQFS8q4!|j{Ci9;wf!!XsTmRxkIPh9A=OAZ0dcV0 zj?I*UQMu#f@I;vWFref$e~(No=%`d39N@M{w#UeJN?s?ws{`Bdiv@=7FpO~LkK_Q( zAY6!7Yiz{Fk(p}Y+7_qP0vY+zAf&dzv11uS28^tyG))d_iVV=9Kv4V+!}YZzEB4W~ z!~nL5dQ1)tJ}wf}x~Vg2fmA!NT}E_}0!x)6yJ&wEr)&hBa-5(%Ss1UEVdE1IR>+8?N%1=IC;pA+*{bJfIq@6? zgL^C%BjhlRqn`0k#*-5V&)`oIkHp>7zx*tjKlRD*FXlCGJ#pJ4`JQaEmx!OCKzYO2(9MXjk zt6}*_B2NRP>v5R*_xcuyTBn-)wgp6xpWmg`jVL^*m}itRi`Cf?54yLT@gJC=Rn z!jroJ-E1}if&~T3&MpLugdM*|8MeVP5D^O?(k5mUe_&!17e>-%!cE4l9-ly_iZT@B z5HbT0(6Yrn;EAjOYxZE4$X$$M43!LIjjTa9OthJ1&6))l@!`3dg`QwAI3)BWg`f;5 zkKfx8@2GS>X9UIms4eGfj`lG$_xr$*1~-|4whh|0lXCPA7Gx74s-pM0pYSek$H4d) zzSkhA>grEKKH1siSGm>|-+^`f=1;efN6! z9c)MAo-j5?b>Bf}JcjY^f2$kID#I>uc8cdnVG?h`K$dNuD=SVAszlVZ3Y?DfMYTe4Qp0));&PL^CO2(Z9V=*pG_D6TtOLbY)rhrcr= z#w~;Gn+%QJ8Ko%i~Gnx>@5Q8ymnm>O&U3uk|IM@_()nMXw z8Y$%P?WBE9GLQOZ4oGQeq0Qoqn|9*I2Kn;cJ1pCQHis^AnLqI8Pd(2Fnj8b@6xiE} zz*15V-l^{!0sGtH%=S)>(r-12b(mlN3Gt6kDx$`Mis0S%bQ`}Qw zt1Vf`VL&jM+yn!lwHRc4C*(kt`CR?kx9!T8VYQGChuW1!hNqewxfj!Re5OJFY6Iep z7(}5lbbs7}&@Mv(wySe50Y-e{9I3tGd&$I;C<{Zqy}i`mUwW9NWWAOAcJt)hfie-+ z)6*08q~hw5?J-io;d|UR>~Y2IqtXZt;JrzS$ai4>Mw&Xc11dhZg&f{r#Mx9MlY{-{ z5iiupN9DZMXe*Xqzh?o5tL2>m`9k~4c2N5*x`*pR4#YUmw#LfIwnFQ|o3;x_p**4Y zM0e*~Hpkj5ziR3ltOH;<Za4tM>d#Rz4RP@RQ18;VlLw`+s|}GD@;UiZ_y%_=a%9 zLXJ1;XNK#hCWq@Eostu3@_zESnn;rzsoeL-HW+zbIgF|oa!TN|=9xj51Pt%{xra6k zsK&&8W1XGrQYZu&XAI<)WM%BLy0sL`Q!L zs!U}ri36i~&%Ze(+o+_CXuDbePe`*C9$T z9s{LHZ$OFpBX)zYQuGvB-~bF|IZECZOfJXQIzy5ZX=i6A?cTi`hc?1~6O$`%Q}y+^ zxye)OoGqL_=J&>p8|m=j!*MSwHZo>Ie}K?wvKH68NH^Xh=Gsw*G zYurz8pm85aMIr3hr1o`V=`GI@-C7VLWfOA5Y4;s7*W3kdj(8U^m{1TFmB=ha3SE(4j+dA%}y|b#>+CNKh)PRrx^< zFuz}V>7}8F#%zys*=3heYiny<$We^S#sL8nP5MVKOkq;6;Oz`a`$yh$Z0!gP<~`Xm z0^C*{{qYsjI7o-Lg9kK8DRhtIf#0vum%3rV{Y_)}Ek7uRma+*s3>=Hjr?KL`4p&t# zMeY1!31c6G4vk+{G?Q~?SvzIR@DG*6pS|c4a3M^f<**9XM{-zPAyHAK~5cr|E zR8}EJEN$<{u>2dKQZ7%<;;719s?!kKA8F&9ak(_}V1qh$3lxw8o*CN;$X>pz6`b3W z6KnFjd_<|53gJLf&?%&h%3B!@z{qzObv37K+rTNNS2*IW%3$Oj)R0ac-a&I25(j)0 zaL3o^=DvZx{}88txg>+cvI;p&dO*{j!t%4a4G5%oIjWi4#5KiBhb}j>tJOmT?<+Y+ z4{KXpWr(U=aX@jv_Z&b(sb|D{)11Vu$>)7fTs8uDtLn@<_GQcBlV>)Rrq636Z-5=* z=XAO2m#r7xmp#mT9)y+ECMOPWiM>s91Xe@IJ~I#amC2%s--S#n$PKMBhz>)AA=|%6 zO_n6lCTlYc?FqzGs&;K#5?y@D1Ng+SKRe`}IpU$ZR2)zoP#nO@P5w3=8w}le+T!y@ zYBV9LbFCaM-KiP!JKC939|?=k<~VpI|Hdr4kRwF96MgB7!!7!Df+CRV8 zOO|>DD;Nk-OA`WQr|GJuWl~RXCyt;f+c@eOT?$Zo4q#__OWm?NewXg4IP2yY;m-ax zj#pTa?zyk;!Pr{b=KuJbhGFE}q%Ce3c=ix$-pY0gLD{#f7~f!B{cjO3=kPG@)pG^s zzO|MnHdYTt3X@zMa5P~F;gqe@=Ylu#IUJolPi$z+ZsXNrj|0sg&6wUoCoh~pGo}uo zvE?~q@&p(#f>a0TblSw0q0jUw6M_3=nlWuMO`ANC>ce5ubtCRQm1nh8(;oTaJD&1E zmd!fR>xTZHHOUW$UdAG@R*a6ZtQ3olMsdTjr`tyz&ry8qm0gp=sIZ}swPwYWxcp@C zsJT#5QUnG~Yr`R{N;D$*(`eS!UmII}muCT=;5Lgn*4}Fva!v9)mSJq!-NYMZ4xilA z5VE4Csqaa%C?7`2g{w+A)o>s>4ggp!Le7NNdb;hl_t1jIL-h1Z`{|zVZg7Fy<*Rbi zgy}SEsz&cU53%kCPXe`Dj-$r5M2wrgd%Ed~CmaM^JVM=lo#1o!tqc}Alb`ZoscI@0 z2QV(|b!_=aw)!+-|4It&Z}Cn|&X&(t&jiJ=SMpHP%r@U0r<9q`vH>RuU)|IgScmA* zKaQWKkU4W+Ph1gl7_zR3hb%{a9G9+Wi}IpwbS6z~MF`!sPF=`fT-v{56ISS zSuv>(ZIylIe`5^!KUwqn=pkP3*Q9PgO$)Avy<+VoylV4cQt}t(K;U)EL$Ba><`**$ zvRxB$NLsIA9rZTsa!$wt4^OgSxZA8#Xq_j(d=EroTo-kg7HAqxN?h<5ebc4iEKunO z$v^?Hu69$;%f|sU%N|?OqqK8ccBhQjI{In; z>5t&edLR0+r?!3Nqc)|c0oWM*Bw*5Z@W9)FF$E3Rek_MV;?L-f_U%ONM@xa?o{*zc zH`Go~fc;e=%tAxP}fApvNK7W zJZT7**`Yc*W7b>>hZ6@r_jPyCnx}tH8(-<5-hu9dg9^@@*G8ZJn~P}Kvbi*MYBP22 zvT4zAMBlt&KK>h$$sS6f9*ajzrV;7E_6rjcigU&lG1jAyBRTC!jfH8m!bZ%6m@)k{WM56oS+|Xz;4x|x%D(@LNIZ!3jQ|Mx6q`v3G~%JucH%YC5ANJa;Uj$05jQG zjhJb~DAcr(md>6^=ihS?J@m+CXmqyHu01=cZ$NomRY8;Hhk_JqW0D?eS{BPImWo(< zQ&;STmH&%C6z_!adtrV+sxKD=JE$b(Pea_7wrIb^;B9YNSrOj zwm6NzsjWq$O&fdAZczPo+N3kGNP1H%h3dlbUTek>P<2Ny8J!x1dbiTS{fJ#ELFZuJ z(ex&N^LCX=)xZH9%0tdRO~~(sw=H^JEW0LqhaQ1)@Vr}BTQ9GC0P_AUEWqcEc;u5y zoU$(EBYG_KV{yTQm45kL=NTG$Hb%E^%Z~OB@QDh=0CY{rVPrymorkQ}#;0+40X}0# zOU~p?>Vp;SV`A|&)ni294c#t5$uS$05h};Y;p*yx&Vc2JeVC0r6LJ#MV;PCbvnrlU zM+-V^RNLG(g~WonWSo5l7y?&r$bS)>RNlF9>>|g&^SZOordK+TQkxZ_(=WY*`e1jm zZ`Tg$?#;gNWsaYE>J0kJPoGC~W+T?jsH9_txcaim&=>{jUw^!n_8zF7xRN*pnu7a# zsj)doi>^9u$S&tt%V{)m)@;&XThz7pFl~PHNeV@~Xo|6e%%i+bm0f^|Z;K5Y9#@Ok z+o)z4H$Sm{#&|CNTN8nw6ce>xm)6fMO*;i)+<2Fv*pSa-08uF;h*#hq} zh4B}%<1-J4rG*Q2t_mLF^833S$7Vy{LpjNCF#`s_{u9Nc+vSJ;DObyF>F_LbRVU?Gp5jqSHF*rJMVmIoO?WlVUxn!UYQaLSZAF%i>|$P z2~C+Y#_k+v=Gio}#i9#NYorO#=2UAM>^X7t%)`5A&+D(!uGe0r{hK#I16F|mNY%LBXI@Lcift-}L8?qT4tN*IT7!2LW6&295lsG`3ONk8 z65drKInFNPt?(LZI^|RfeCR6D=guB_d;}Vt0SGx0rc8-{&X_ub{`}14^f%{ULhm{8 zWID2C3-v?L*%pn^BfFt-Ic*W?7oSHHTc^bZr=f~+Tu5j~dbjPS-EVbM&(XxzSdJo9 z@i@_Q5~xfG9HZ&5U7s#@(j>W$WQlI|RYBmmM8bIrj{hsf*|n~@YBq$FBb_+X%%jBZ!2tn>+QlQd3QP(I zolf=IT%7t6%>{At#f&F67KQ?;i%DtL}V77urtD8OM9hJxM*mh6%s+9BxemWO=dt z6IWW6B}LQc_D02-vtW}``^jWuVoa!+lG)QkeaJHj!cG04fWvwBJ2ve!F?7 z2WSzts%9@V=&~h^)Y6D}5ov^+Ahy|>>RYJ|(TDZHpnL-eE*u#}S_t~&`oY~Z6M|L0 zEwCdooH*P~y)K80h&vBDhzK3=T*%=l)SP$=Q3*T4?c>Q6+@&FA-X2=gUKRl-iF0si z`&zkf<>zsnSvwYP?@8XTnr|WA!ccH~P@nRsX#ecU*P?1r^b8Rp>S4X`5jz&;ouS9_ zh3mSI!-z;-TZ^%48^$Wng&g=^JRuf;p8aQ4@-YX*XCE}JRVzE;5y3M}y^l%BiMj>t zNv=sWUC8P92*~Ouq^-I}|G8@mZ9j5|^a-swVJ0*17LVWqEH`Yz7S%2?JA252K*2&S zLg!O&k3|FhHud$`^v2pAI_HY1$)Xv*Kk!%6Y5MHO`13cq1-;P&sb)|{7M4x3V*Rvi zL83`FZ||cw5hWmoeePtMXvgS`MvEp)fd4wugYDa>e`nEQGm_O7^v&(T?V^(B95B&U ze)y07^!OjX{^OUvGF7LcV;P`KEZCcc-wqRhMoJ6Im*4u0XP>zB2BSH&8_j$jvUoBt z=H#RxY^B+^9qa5_J?-7Mj#ZWBtib&YLW=D$Uf7LU{wzRqcU*?GIbfWKHu|(&ch8&R zjGOZ^LGh$9!%J`55?j6ERSaww0ZH!yZ1A`wtsl7G)Z-1pNNWdoX-|4rF%%rKcg%Fm z!`S|q?Jm?r?cPy2mYQ5b&e#&Ecc9j%E^O&o(C!Q>Nm4Up_;uwOt#pFcLp^V9rO46F zw7FQ0VqvGdOVY;Go%E@t6Y0Lk_rNthZFZ`Irbh%d+PSBfdW<>>v?PQT5ix0^IY1L3 z|1`HIgqkS`=+|{LN(T|=#%xOnM%I8s2YMqEhLQ7>wqVKxl^&wHTLT>6#mrVAop0%r zXaDFIkG^#65r^JmA?S9wX-Xxd{JcEH75}$`j(q>CWQ_fxT5PA)R;%UyCl#G+Z&@9vLh1=&5 zZy;lB;u)1*QIs3bwaX^cykLYPN74&8qicBU&2FkQ9SUcWr24Q&b+Dfgp=qN1f#EGP zy)Q!VIlYcE|U{yz3%{B;N4km3-L~R{C)Xo9#R_G5KFKvcCWzkD{0DC_Auh6$+dZ zK=cQpYd7gV_LszYx0WE_FrYgF5C~l1*+?>AyLSMF!T%SFPo8VNP1TOc z=n45!`}3wDJ^)(_XeT5aB~QwRdx_6D8YP@_wBH*6`o1{hmJ)@V60s?wcwpJ>f3P}M zeg`tu{b;~Z}{?=zuOL-!GIEuBe-D-@29aVTO2dIACK$avJS%xP+(xf3SS`pzR1 zoeZ-C*oO=pJxb2OgVYEY^3loc?4-V~E($d?P(3`W^gMmxU&3bKKAZz}5N>6Mdt!7v zgq^m=_(FFW1Y`_|EHnV&rXMHF^kSbX9MZ{ztxmdhtf8K)mc-Umy65@ci!|0z1ok>M z$Arw1V!%tww0DMb+C?sAe|?$LbjFB>|<LyH{_wy;Uu3a_*=Y0&O<<~#X zSLT@~Onl~|)22Dg7f)-MJGEgd77TN6f7A;xSg5cs1jj%}mb4D|KL_pP6M=qf10P{i zST)s?TR#%|sofS?0*t=s5mslKj`k(Fq5ZRBar;o)jfU-+ki&otUH^q;*`LKQ$cIw7;@*g*)$b4Gt3Ahpkc?5 zXdgVS_V!!!srOH%=~IGq-HOfB(?7h$qc^y_CDx~{n7te<}8?=D!aS&& zYbl~X0zkjY1kBqvys_am>gxUxEEF%!giu-T3lT%m)*l*rU`JW%OIOLjk^j%$n}Er2 zm1m=G?|aX_Yu~KJk{5ZAcVWQb1qgP41VWsIBqZE~5ccFI!MVx3T#`#368;;=4g3jV z`3W|Q4H#^^+mdX{vTWJfrO{~iwfB9!?^o3|(=*fE(=(cpW~oo=uIj3DPM!0enmTWN zYZ~6>=Qx&|d3uS31}`f0;xy>J>@rAt2O)XTCytBzSspTZn_+KlLtXnzhy_yUJ3IzrvT2mH znc-gVMSYV^JvV)An^tF89O$AQx-q@1}BUxL1%wezwW)thBbk8auH5eYqWe)!RFZsuRL*4XtQEcu_%)Ve`k6f#*N} zfZ0}Gc)Dn;ncuC;p3aX3&9TNOq6_wFX}IgF$$b8S$D=Q$4#QYm_77x!M|KfglP5tg zkhko$PG3Psygx`bCVsWhy^(pu57Xm@#v;nipZkx8ks5n48q6*1z02{tjIog6#!oKT zJyZ?<1e~Pl(mmAQgH$|;`d>A|x^)xQu3d$*;$}^WPO86uT2mHEd#tspBTA;PAL$dP z5Pkg+lD)lbuV|&1QuFhF@d&>4t(WkJe{d6Sxpfm({q?)(MU}v3|MYtdD(J@_+}n!x zU)Bnb%YFxFG;Uxao;~5<545EKHNEKFjzLXwW z>7z1d3l&R8Yj-Yh=LJ>Bf&9J)elu!umVkey$1~@n@(c+D@-7ek|E(zo79*poY?m zBz-sw889ZMh4u@12K39FI1R&NPb1OGNXd!lwB(-?6@cO4h~m9;?wk+nHw4kz;zbMd zSN(6FekU3-y_BLv(CkWKh=R<{z63@C8E#d8Gc~EGwscsjQ)qS?a8n?P^OVB$m}t<< zlbISP9y%1l8haks?NB|e&UHobray;}ZNi4fN-wOISQMMqI#5e@bZwQGxE`fB9KSyh zL0sI;eN57scfd?LCX+aOWYcoFaiR?fA~f|J7|o)e>rXgJov3JFNfT|37au=fPQ_PT zGE0$?1aq8k5>O-egnVR8u3}v-+Xcf-4^Y{D>F9w69ocE3NBag0`p58e|9Ol|k&@&?4CMFR zeq;{6jx?nmPL~}H=gcp4A|3gsuk6PoKRboL`#;`+E3atBJ@;IWz~Mpo{4^qtrtsaz zL-^S~d4aQ{z9{N)abInWi6i<1-w<#5G7)l_;kjW;-q?mf$bS{oG)pYN^=Rxe;)r9}&pWcql z;3;JLk28nf#KP9ch{=EZjTp`iB#}%D)ZEa$VTUuBXk7CQ#Rd7c| z`$gPJK1XSD7K_KK=LP47fCXNHU$cqfRtkf8Z^DYJLs3Dvg(H(UoOcWRd&>(iys(xa zRzbt;^RWX54*VlaUQ$W#vhjj?`2fD*51<6Hc6 zD-Go`lfGmwE_KA?3z6PT8q6j9L7-;%lRx>By@w7R`k>Ygx!1q;wXfwq^q~)Nh($Ms zR)AZ@t13=VU9cs~q|!*!7A-n9#z@?%6t1Xv>0P#MVS1BV=6kc*ZR66gk2<}`vk&Fy zPa} z9xR(^Q`(X@|E%KBF*j-Y=x7w*{qAe1tF_^OeDysF7C6s2Fh2I(# z?`y{{bh{93UTB}@QlF}+NxC5cHlnT)X<0dSAyGg5m?j*VL=9^s7|!SE?N=qpk?Ra}zZtSk=bAZKOG zw?5h>zyalrlMCidZ|=YK;SVZmtx7|p?Es#A_E}}&tyHe~oGhZ3(fxeSo;~A-ZFIY4 z&QI)W$YR@76B3JG{NfkrFX7!aUa`bZ6N4Gvdh4yUgHgS|N)%BJN#7rRR0+yfu1Lw_ zx7>0IwrttLbEP4UR0@Sdp!$IzuDfI#QxD2qlv5u{SvfEB7NAT2*|TRA)t3C8FA~s1 zV^_xYQGw2UwY$*m+;!Jot*1_%x;GMuY~{5K9W<2RzJ2@kw5Os+xym51lM%z;+3-us zNTZnyTKRMizqGZ@(QM``E`SHLaZM>grOY7c&+tDzIb64$#H{Yu2nOIy!xq zhMo!#nSQ47k$dmG7w>%MJ1Z6va1)Egz{R&>Iqjq@kd;7=R!$^2BeWIK7FzB2g>D7p z$b!BQ5~2(3TeKC2*T4RCdhSh_-w@opKlQ0k-OsTp zh@XEm3HIgqGtWG8i0$eir&{J-gmOB_xd=?wFQIc_HXM)#u=c4`Pag2{mRgAfu!v-4 zHgB&|R_aOnGm*Sa%YsvQ*3VR2IWG&1EI>20FJ)%aZ|&mM^j+GPepK6jHS;0Y*Z3e? zsiSSRzRh(jZ7ntW!WX`P-}}Aav(d1)j^J$E>Rs-~jT<+P1CP0kOS?yl>&kovnaYG- zTgqXPdI@>xO(o~%O2Yfqt5;8|PAQ;AlOV|n&a;t!3l3gu=}pw6kuAR;I>=dmbE=O> z=YYB8YI!uY>3tKsT_@JRj@Rhs(M+S13CvLIG}@^30~-XItLa7 z2jtCB)E+abCSH5(HAUi5snaJ;oKWmUL^V?_iK?ZquMe-jN*DDRNNgY^Ude1oRA*FU zFu0+wVzo18&L}FSiiJv?lzc-o^p2Xv65-v&Ad78wU*F%nN>iPYC1z?C;sS-)wdzpq}w)D+!eiJ|b@sBH3 z6A&qF%QdPY>FbqOUa6>{swuCOQP2tl`|ozcbw@4ojK)l#{~4-Na>FtLZnBKVoMFJi znd{8Zq<&iGzzXJo4surTS zJ`4>bO0St<(X9HU7uGqj!Z@IVoE0|V`fzm)tRxP!x2(qdf9-zso~1XAyZM4Z&YbwB zn&uFxP;n(voGL+%Vra}dI_VtHIdEYd&_T|H@lUU7E1(KYM4!aYLb*+fRf(VBF z4DeQ6RONExYiwx7P1o^^wVa>Hd;M2G_;=X z)TU2=`qRed=H@L7m}f7xFKcOOxrDu(pG!*|t75luy2%?DKy&kte)OZaF@8>lP6K(~ zFMVJ7(w9#0Z+U+6hs@6qR!l28$XPK{tq*jma6kY~C6Hq>O57VM!%W-^h}Kld0&ZY> z9Yeux#2*;Lz>pdMFvk=JS$-BH$v7Q00-X9&SI1{$>B(VAm^fWW#KL)fTaki6zz^*v)rtRs!LqZmkKc=FxPdHlb(EL z8qO<#s~LNR0p@mYG~hShu0|#fni&1q?NHv5 z4cSKK+o@5SIC``fuf2XAv3O)rNpwWb)>Pk$-MicH;oshc&6_1R(AlZOp7rmwt2f|A zs;azhb^OH*h}}NogA@*fFE{7K$hZR?^x8kz4 zEY{VA5a1`Mu zBfqKyIRbDbNaCD<&a|FP95B+&yxEjSt0e`CBE6xCi`nJ7Qg#G#<|QP{nHW>0y<{SX zRFVefv{@1|5v<$nMy6iS03HvfDaI2~o`(HQJZGkGNIcXofKoaB4dfVui2pQl8JXgP zD&TTbGclz~u+JHZKwapM#U`mwjFhHot?1ju$^jkZEY_LP`?X>@Ac6aeL5>(^xSd|C zYp=um-{!;}*HgvQU_zSSH>Xcz;NSyVC>IFBo=w3_0eOh_EG^sAC-S{-ZN!et--7@5 ztFPeA;|zcoQgi!UDh3P4@wjT?bsF)JTWkoK!?5{JE8W?{XW=9D5?q|zx#yI`TjtNMIK0&cVfjne=51UqJ~$BrbFzd5=5 z_ABhT`@J=A@E+D_adV*btS;_8>%G%Cu&g;C0H=5nl||J|)sE9{rK-wY0600kaxe;O z&WM&e^+6j?fGHd@itU3x<;P1;C9q|S7lv9c>|qC8s4WCQ7ynPb*4s$$DOIH=6DN+< z@4L=UNlp%?x-2#{nBlOfiNyi%!EG!j(VZs)O0DMPt;|O?Ez|9&N;_eN(sn3aWsJ+eb0}OUj;c=Tpm~;xSO_dmGk3XB(Cb0slae=K9%gz{z1ihQO)`z4!2~vY$50zf!pViyK{2}k9r3mj zn;4N0iC5NqQ=ULAOm}b)jMRGFSiP!s{1Q1znXbPq3%5Ou%Xds(C0g8Rv>=VEZo3xy z4*7BH&B-YvI=j+*n@%E~VceO*A~oJHcmCmluj2#v-j75)gTZq?^mqEvdwL9kPy|+M z8um0l1Ue1gP5AY<{|z2L@HHGc@mz5e^Rh3%R6aA4x@ZdYlR3a3?(xN8PagCS%Zw(i>BcobTqm#8crZ^Isym($~UZX z<9F`KO>5$i5k2;49wFEz6laS>TJ)2-s$Rf&dm1P_d#hXj)C`6rR zoU$euiN4GQ1BCz=CtqB(6Y{ug@!tD3;V=H;mT@nmP$&*#*Gn)Z{Y6)qyc>SwX|z!U z^`nR1qn_aPWU=|@e|`x+eDE~Rbe%+|Oe~#|zA(lH!#MnGmjZOO#mLX=nNmj7W^4Hd z?u5yzz=_EhzQA818PekER0DDZz*r2l!D67ol*x^hF{`Mj5>%%d2tq9kW+=i98H2c8 zSJUPN4q*YR%j5~5;6Rl7MkH0V#SuxB991M%Sr%a#DJEOlAzxsWeOBYX%)fG8IU=nQ z5()z~DkI%fDyq#W*Ei7K36y{qF37~Tl#3^O>Z)(4H-C3Ns*2kBfwp3#H3u!1X&EIMYMpR!W1!eOsfw?QY!E;Z;CNC=x@Y zdr&*2Y=f-7aYHlJU1mh66YJ|8h9^BahK+q)J?fnf1tdLoK7hv<$WA0K!LSd#tUAwp)=bNszb= z8#XYQp(>@AsSR011;oG}$1z77jzUjET!cLy7dEE|E_q(Y+tARUBxEfm!J6qhm+U+Z zeG%;iMqe54LMtK8HN2lA1tH!B2j`=+9}ycfugks3IkKgOVQC+Op#WrqoTuJXH3)U7 zQb&t9jgE#;+;qQN~pRDFq>mhBox2-r`rg)M3)Mp5qylamLt zht)FD%e0qLB-;Pv)F7MoP!t>6PvN>7`xszTo!9lvZp2?}fYG7$CmN>bVq~(^aeTn~ z&L!o54stFj`}K?K9GE)?!wt}geZR-lPMUYaRP-jy@6CpFyNlU zmO)*u2Q{{+@(wI2B~e)&eA$R$s?UD?8Z)lkVMSwy37%TkEcT`;v{SsX<>MGT^#;1B zqB?gji$@M;aI)WzNHoatXs_lIHLhB97ktN^Fl2~`#!2K;;*LF;Bz1(33sZw<7rd?) zF&65YTws>J1dM7R$L)42`_(id{Ss+}2o8=?S|HK|IVMY~iw70k@q)NQBt#<3SyCV; zOGB}NXMr~laYUkw1Fpp`tl51%GD#J*8?s$6J@FU@A3Mvl85nJOG`=;3x|`E5yVM)E z=h#mC*Z*?irH)D@Q29MLwAwcPXx`JONUaYAla;!oXO&ZkWLc z&kv>X=#hG4>CtoprB5}^{A8D5t#HxS?@uE}+;;e64*QO$aBk2~dn85}R$OX4tHa#yeSF!z&%-XB?v zQe9L#i+Catf|X$!V_KB-2NM^Uh1Wq_9Jg3I7s$w!*KM=X0GclB+Cgsl4h;kCaD1J8 zi24ePMNxMBNB{sp07*naRN;I&okEnLquXbo`ifpnRH=1!aXQIO^MWaXm49K0j~} zy~BqQjP@6wn$!M;f{*bYjvI=MA5r=vAZnq!yXG|D*;JDIRR9i+euc!A#w12v1&~46 z6!&>ftdEr~3(3tVEGS^rJkvjAiApjVIYCJmw|R-9BjpS2svt@|uN0CmxwZntWy=QH z4MUbH(=35#;rhz?;&vnjiqw%0|0`-PvB5DHK0KuSdGRL&PYUG~^`sQmX|Wug17n@t z5`|-JL**_T!pJeh`bLOd|Ai7+c=Mcf=$v`djwuIK=ia(ZxMP2= zTNNOcJUbkorb)2QF9$L@bQtF#`K7gTM2N>Q{{o{M zx4S;6m)tk8eaoQy!zL2prY}oR`ur&$ocZ4F@c~hGc>*Gk%^bR`ft$B4_+kAt(Bq%jvH{OmfzQ88H|iaC#4t?p3vVovPbpUn2Y>G zz13rpmi7M*)5HOkU9@$D!K|*K_nV#jrBLKz7@(tVDL!9jG>0OK5^an^=bjt+(%>#w zPg7DAJr6;aRUp=@62r;&c71W{30MxA$-Rl`Z(c~{FW%yB3=1;fc6b~JvzZRfpEYp-o$=J<&5F-Y1p6m=?|W6M z-SJ=sIJy=!!w;Yw2`W_WI-FU6pZT=&@718Q}54g4(&osu_+fpRLB|M+eAfFU9 zv;mNL2C|)dHy3{8y`oggMt_aQgzb1nSs*xBQ%YmTo5zE@Q#txK1SHJ_i#NX#A7FCe zh-P69gxXVJx-L87_2io|zH}Y`UPSVw2<=&bku8%#yWE0k@`;4fGJz5oyG3RYC_O*k z4iEpA_13)3c@{e91E7cSh40CSQ6+J&Sq*hIL3SlVdS(iV{j@)I4Yuf{B9(Fq8fXcP13PWi)psyX@!#rBn2Lk)@ z{#Wyilsw(C7S;46rC9fYJ1LDEaBjnwC*&Ugo4`_s ze)9&|%=%X`yqCH)j`NQqm3sG^WYM$=PsF`Kx{&KAQ3Np5&J5d2-v`JIz zDnF@gqT`#CqsO!r5*jB(GOL^XHM*3Nibz#6>Cng+kl_7UbgqMiASgMdXbT~L`vW!x zm?Q=joYPc4*UZd8a!kqstI{2c5hSH_j_{3VsB|~`FD+Wm$v3`74O=r(yf#R1){n|^uCF@Pxvv4Jx;SRvRH#l-_P5--Zc|K1J{_>aq{4KL9A_tdB{LJ##V z?c2*}E|L96=T8`j&1F;WP8jI4YwrJj&nP2@V_DNCw7>G}6dP+`Fyi+-0Dtu?`4Icx zpK?}@^aFta98aE$%hF{-^%^3pATMpY$0>>-^<^fukto0HBK|0Ra?tIy9S9Q4Wb}Tu z-8h2Rx}v1Hnm)Q^W4VreD^O6#ScyK~$myv(JGCYjz(eP*6KBna)Zv+bBOFY`TlCtO z7}M4ML4Tx&T+v-lC9Mp5hQG}bg6+n&pwlEf&s`BL_}{t-i;xo0REC|8`PrU85^?1H zo7UY*W8$y9Zi4=j6+Q$c1gh5ru>i9@7!7qJzk5idA9Jm{e>9R&)|Hj8~R&0r93g-=(8Iv14Tl^Ncf#On4v)`0wO+jRoClJQl7h+gX`S~XpvmUjc5DM} z7%P=DmEjCQYAI2;pap=BH>73Po#@~RP*5LTqk1&}B9X4co`G7FY8hj(;-g#gpj@IO+jza9um^x zTSzm2Es%&osk0m{Td3Z?D5y|_+){MHL%J%JesS0d%2Jl56|@`Xb8CUnPwLVvViLpH z{URh2PU3?dKFldv*XC|;vGNXj2K~m6&4gAHz4Fu6(_}0JzceZTi*oaUm93RddtjW5 zI=m#D6$?QAF)X|$w7U7U6_M2yw#U*^9SeTJ83rWupNe`+?5kG1cQKmjfA;hndW@;?q zU8hi{EBXDqRi&{%^8_aCGT4C!cDH6)OB8E*GJ7GFp7RU9pgjHoeC6okGi-8cKe%nI z-IsqPFHgR{cvflA|EgQNv^e?Df&Pm+p%%tl+>%o4y5$2gQ^6q7>6AZU7_rY_MZ1B@ z>z1=ttGdmWKMyCDXsFmLsy&$|U0hwsv9DkI@wi=i#2+hy6DWj%S?lgckEwi%Y+e}$ z!jCte*J0p2U*qpZesRLo&sjkNn1rPY#Ada^}G~>A(tufMDhljmUNpJfwqqqROlfhY=mNH zf^4Rj2!^4w)raqSBR)gUKA3rg`TmqaOCap|x0|_tU9GDfzBM^n8h6hpgbf)3f~M#g-|hSCeK6LS-Mgl z!dyo0d#Yanz0*R8DLDXeP@oiIJg!hIssWWVeHdCB<{Sb`nSNAP9!yTa(%T=g6!v#8`%xaT${pN!St#2 zh6eQ$5I2)h0W#RJD=J={D?Ig}x|;5bRu&TZ)<~|_aS=V^hZkcE3Pc<{qhf|y4PiKY zv|-s)tWZNTVW1{GjbusrzY`6^#I6YWq+S|OAYe@K;(p-3n@q%bfLRO-7wyZIGTL}g zARd3hy&Ay|s@VDtGc@zCJJowqYexytj)}SQ%m9Ec;m2dxD1L=$lr zk7jnL5+6-u5DNG2>mf6~2ka`HPS=8bRL}RP>p{KGV?9Tvg8*VEypnXmRMv;~S#PBO za02NjphH<_C(d{I>?`6MJCebzs-qwjj*2xC1~WBAva(8l%zBa=CN!g-o1d|`mhRSP z3^Q(M_=s2Yk+gxupw%r|)Q>qTa^79GxUlzq&{IZu z&bze*aeu^-xJQ)Gdns$ot*rs+>(e~s-swgvz%)%81*A3NLnKx%(U&D{3SF?)xMR~d2?nGB>wNm?ubDNrq{YE^4 zxrO+)qj@@R1Iaqg^~KlG(Q%pxF1|BlvYkdE*|4=zh&n3vRr^h1osF;t9C=|+N+Vr_ zy7C+h45Y|%=2ahNsN~&lb6A8o?<|nVP6!V-%+8D*sEbJu0Sv)s^KJ*_e%_NyeO*o5 zejAxi{l(p$mnW7#G&P3#1*J}e*%f0RI{yz2NcMig;Gm&LK`ZvNFUl=u;LDXo=mdbl zM0gcJ?7hu&bgX#-Hg>Kpqu7wVf1zjcpNPsFHIICW+opmWH>`ruu?`X{y}X+2tOJ@0 zU`(HGgWL-wA2%x3e41j5wKD&* zT2WCa_HT8++~{`T)d^3kbA97S0Cxw99mtLWTmwvVrh~j0;2`P0#O; z3ivvv>?a+QB)dlNu@EQC2a6BNGMiyRyQDHM#1cb@v{6yjP(@3lC1aXzN_JU8q8hb_ zj&Fiw(xqUK=mA`*`E&+W%|1Ax& ze11--_XI%u{)r<-q0~r&S0|NHzfByiY*9shBs%O(vaVSWlm(Q60;p(4jbo0}$lK$0 zHP_2GrLHee|69besqdUkcc$Irk`-o4dYl&~fGr|2x=KPsQs>MmZqmzLc z_4iO#fj!L_gvk}0HRU+nMR=yuzQ zXfZSzQn!myyd6^kxV&gk{vGTvh&yAF!aydu;ZY8mgny{~8=pA-O=r07XKI8WMM5lm_b+8QYhb3=*u#w20IU|IUoKzQuwv5J zD3MAVA$H+Y;LTH!89AToWr4p18bFZn#Wd>6Xyywqn1NEUfHo@0!nnnE0NhY|BEFwN z~DX8D735eLO1*~H2bBfl*%ZVoEMGRC*U zDW$C^tdx+a&u{z?HUj0`cqz_;vOG#lTAi7G%7`rI2?T=!bJw{{^vja>IzW3i?@g}u zLxk38;uYZ#1HhoItx?sL?_Y@6IR3=Te{LxKy|FPai<2$c?)$uI_!o%w;w2J3L7G`S4eFT~+y38731-%w0_ETGdU z9NLE^A7mX)?@~E=NSP|-dt5)Y?YbL*ttYo)2<236uk-4mnBBU^PUS<*2B%2?m+Q>L zZo^^XSrK=MdJExJ7hA(Kt?I2pYJOy2%T_72&#&WXulsCqfpLc1<7Ys9Ur(fkK+25# zD8i|4Sx7P`kB=}|;t=>lL_uQ(3Ng9lnR$k4JKEVj6(+})tbv3<*e@E1V>Y@75$yfR1SL}>WfWp%ZZmzV)+c*6@T-eIcXfVqfwNBOKVCAK>*1{plMR{` zR-ic>eLQUOMsTwOaqXeT^KR142QSWgHF_GzYt2ZsHP+*!JD%td$DCW0dGBb@=@y1vmUQ7gH0xU1!$RkCob;Dxx3!= zO99()=tQuhvH*P!{oX){HqkG!oJfhhl^Iu$IO-)XS22on)Kt|G&4jti340??F@hoq zUMczKZ^DzJQ4D4FFmJUSR}MK}3|C^;=-ZVvP(=1Yw=26z{U1Jh$YSXcK`SaU5!_jm zCkq-+?q1zT|Axv9wYv(Gk|EzXI2pg2$~pf35aQzgP!(&2&*CXNHu~L`=Fkai)uI=( zdGlp+<$DIrn!vgkX?}wWccLD&XyRWQVi^GD;I0Nfe4o)s1`0$4&J7C$vf*6Ly{)LF z!R7=_H6>~!hUG1@?bDe$7CF2{Yo?{&QvcA8P^{Q1c^C%46jaWxgtDtd19@dhn1t=;UhtXi!w zF+ka1TN~|4Z|K39ou%@))YAR~-vs8LvrA#8>>-G_=IjRT8Ixy! zvrQI)%+#xYZ1u1cf9nC_NjF^32n>BmFHa^+4y`Fo28=z|3x+Q{u6RO17K~tg36fJA zX*)4u=&>db$4IL)O{0=0)p9uVYngunBPiflqAy~oz8quA{8}QDIoFVs{_(hVZ8I#s z9?Gpq7L-l%-BEkODr8qvYtqDXmiM`9W>(RLNAE4#bLV}bf61oDI_F0DIBb0sy!89M zj)}e3;zJ`95VP*6Xuedkf#TKs z4O@X71NMJN#rUsUy*ST=k|jK&PhbcpZ{1^2o`trsl+k zOX$xeVyJLRRHhvAZF@|>0j=!&ed*vFk0_)8Y5HIo85~_q}HE2S_LpbqOd6}AH{$aEw zn=*2it_N&KKRI;bDrytr>aTV!a^5OS)7D6)o#G)gf$1bydm!S zYZ_C(wCJES_mve2dRBRx-ipF?2F&18Us87%YzU;ZuRJz|^+HeAk$RMT1xn zqBU6p!?`}a+{#Mip+>D~d%gyJb_hnCG_a!`!}Vm9+1|g@f+cXH;&5^fi9!rH)1YI` zx^p>*4aW+_*Da|&a9|29TNy;V{W2m#P_zDF!&H?dV1FLuP1R2CM63WVkRT_-oKA$O zzK&Fi?_TarG>$}lY92~Lc1>2Fd{2yv@U(41dXzL91b%GZL_TSHybRL=l|Cpo5;s6+ zY%axjdqTeKnBT`chzmLe0(yvUOSls)QdE|YGCL(|Cqxx-jD4A8egVm7+Rd7|3+SAq z6amrF{YYou^~vQC)5FO(g9|E0c|~J2b$PF;INRq-t)ftwebrKUYK)r>*x;$6lF&7u z(pcRWtm6n$scNE&jI3xnQN=rZQGm9z2qh`N&;;tAsgmc?z69K#Cz;@WW0A&Z%pBy5Nc|~g!#UdKmH<@|ynEZ}l6k-vCoR3#x9lFdV zQ&3WnTc3Dv5L&STWos&6%OPPd+6c;{5glLd^9#M8Ol;_we6yWa@J{=gU6$|Gi$!f)^BhM1z2urg;6YbIFs6#~O( z{-<}Zr3*LoB&q#iq9@=TL4RaKQaGl7S4M=X0f8p^Bl1I{e%NP+2nB!Uk5?AEZmCfB zVQT7$ize}ZxHD=xWp^e`A~+c9RMgi2ai4`&C(6!7_|zWuMq*LTR+x$r%l+nW8AFBN z)uHJ9 za)M{77jY(8&S|m^{UY^-Boh-CMn^IN^fY3KX+mk!Sr%z&Y#lWkhp~%5J)klE(xvD@ zIgbbJF+lVAL&qQ_n2xq@ir;BNv~>W}CxuQqKp`FU7y=W6K0cd(eVxVC!S1haF7;R{ zHX=+4K4%=nk<)KR5WT;10Hp=IE)3RMK6E%N$+R0;UeysV^nBdWH#Q-|i@+dN?vwTO ze&&?-2>!kcOgJh~h{q25~q7 zwG@hcFTDLe(BC?;#Z=0!q;kl57LX|7v1A8_%{^n-;SWz3GuiuBqEycGLn_s&De;-TWOv0}P>k+iOf1lO z#*TGacy`*^VK5t|k)Kxjjqymv_C0FT8hZ^trVU{gBp3s z6bcX)nWQo%G5@VJy)O3S8{`nmSCEK5G1s+3#ZAyvfOvm|8$%Jc#Y8JCp?VF!(Sy zeXWbxfMMKF!AVu(G0;aA(MCczqGB2w(vJ*@$9p7NVF{}5=Nn2u;X7l4>=S`sI?3~# zi%{N1GIhp~&jl0OA0Sl9<$)J@M~zZW5IS_J0KF5reqHBIZXCo+QMIE&!zQ;xtx0r` zfE*$hSDV6JR>dw!82fP*wnRR-%uWF%4^hmSh{acra9xfLn|Y*8UFS>XB=k*{`b+;; z=+vg3xm;c5RDk?09VLn+fbPP`5di&qZsgirtwp?WmX&eX=Vk)$Kj4xm=FTUJ=6QKw z)K95M<^MP};RuuPst5;Dlvfm`%eGz%mblaD@*fIlOXI2(d}wD-Q$YQ};l>p`9GNr+ zZbj>VDTF6DaVHt;_og|V_lls^QmS!6%@hU?qI6m^)vee^W~oae#4k4xU&nh_N2v+z z%ANR?<%+NsmzN&3mWhc5kdR(fkQHxa@$h`C^8D9n_%I~Vjhzh+KMD%U<$!?T+K&TI zBFsPpjc7J4BO2Fs@)nUg?SxX7bsO~h;vj;YD^^w;YMJ088lY?)S;%%^TLc=_jRCtc zrq(!C62K}_axLG-IPvVT`+7ZaOzZ(dZXA46v>P8T)UNuHV(_Kl3H7P~4xeE%7#u!s%>*O0t zs8r)dVJ7Ym_J<(F?=1Ii*^^6YIvmY4i?f1gOD4qbG#IKBGdQN21|t9Z`2h^J4||&q z(@U=-WD^lYtp$k{!Ey%L7E~m=aUb@gfsJvPBgD+#qo1NofV~ppU3J^2Ip(BFIQ88q zMnE%g&eZs-nw;L1PTzm+jrY5y4AxPg;NQke-fzUe#FBpo)z>Tv85Okm0N)OQ zr;A{W6?rl2Bf)#1*x{!K?u<&uLdh5<%>F%rJmH~`(v zpQa(^PFXfUlU0{9hLim-^IQAacvBhHdKTmdXTkd$9Y*1r`Yc41hPKl z3ib!7n!k&Ep(7PyFo-;gA4CYgrf}0fozvT6bcO!kbT#Eqm-)MIYh!?i+W_l~m~Wqu zZ@wOvgh-rwC2w2=(|MBdLBK^ei?*@#y~MTaa3>o0$C)9fYb(%R4|N}f0Ki^_QEAi> zF&Yo^Cu4<_`4wwLrxE2b%Ik`MQfBAl&_HfPYgVB;PI72|3J64m&>?z*;jk|5Zz2mk z3Par2g?g5jKN?w}9to{NV1;SYF7AMiymU{XB1NsoI($bz_kjB;a%S|WP2X{WJP_Xq z%oHf|&HA`t_@r{;Lp$;k)A+Z>iFG+Lm#I(+^7 z!Gzl`S2+v@Q@FO=-l?^JOGAHNT8(1EP9xlwaJjYEDj#fOQNf;j=fm@XWkaY+7gI`O zKK|kfnNdctoWx>O)56brY?>t+tE+Zwz!xquFE5D%{BZ{AJ1j0|#3u<;1Y-HP!xV~# zpddydjs$7SU{sp(45=VG{QHyiGrDQ~+&~)(RDJ@CSCv(z#%S^{u-%XF z_I=QZui|Y<5YCPoGBW8!m|O}CEz3$w1D_&3@4U(DKN;niyY+1>g%a8rB@w!%t9d_~6xa^o>ze(h|CIOCz#7fK&@$WpBCs`tMMDZWK+*@&?r#~m|ubNELeLMArON)XnR_5{nm>xZeRPjvZj=~hp-qNO7R9m zp??6sEi=!UNWCSGtJ~Uo7dK?Z=bd(r%sr9wlK=M+pD@w`zwBhk7ejTur$7GsR7LK*7^sYmwv zPu6S)Zu-3Y@Jux!c-Mn$?Sr5i`H*^ukw?nqRMT%gyxRhKO|uYU6Aelws>%k&1iytCMVk%Bu78D$II`(M(Oj?n*;oceJxt8dh#5-$4fZ;-z zverxk+TwP}jtp8&8gP@jVC=9bv^4@yo6(io=OS$!Ep`H6Ls6LURcFTN#`B_8Cql_v zi@!9z{!5$=GSRxlxuB)!&)h3a68_RNBQWlwW8Qn^l!Gn&rB@_nR?gXiL&jDYM-`FE z3BkH_bz!L%qO`teGd@c93cyX<<|0=DWYdE|vlF_` zf_#2x;^Z(%ekv*bhT`~A1|i6QTA=BL%;^pO#?O4HX;6xrq#QA`ib9@x!Mb9b1Gje0 zN90|9-FUc@#+ngZ6hRnOstx4pD36>L>BQC-9d@ckv;!7{gu~PO*F+FqW(8}RD}!O_$%)*?G=W`eS+G*y=?<4?+QEN<>0n`)Zghido|rR z^@bV28}msWs@<7Sj(4%;ZtnLKouU&c(f5VNZt;!?BIG6mz>jldCJo)*2*1xdFH+c$ zz?OkDU7t!7;}d*zf(67sGv6n(AB;-jGdaBfcP4-d9hBk?A2CEZ41yzNCtKC^qhM&?y1ml$_?-f}{Az1h;Z&vLc5 zwnmWWdnFCxUycL8rK3<{JAP!w9PxjK2k^6kvhwMbj`Y&osupoJ>hwvCAA}V<;YHcB zzeN!r(DnrN^dbNmH$9E95i|(C8z_gTK~)#_vjl|<`|Unf?5GT`XrfPoF?IX$g+oi4 z*mz%b9dN+v{;N{&zGm-I@o77L4P)vBfrJ>AD~|_=La$b9g}&c(A~#fvd<%P7U~|;T zR4zA9n|7nyzjt*mmR^{`OBc4cqx<{EbuA7dORix4WJPvZvU{aFjyLeTSSV?%oKZL< z$sB$c*-Pq0`173p?+OEd>IY>n10jL>i&Gv}(*#?y*s4NTq&)zjY}Kh0ZQ^1(%GM`c z>t7GHWT4o9;R>9$lVCD*O?K64n!VSs9@8iXn?_$=cZIAoh5xe`I2mE`rmymyJB#E>q!>kq8x_3be&3paUP%cM;YGRn6_ z!I+Uala^({8Rkp{Z=iH8ctcu5eO-!9`&O8UDk&8N_56IH_@pVrH^ti85gJ9^JgNggm>cl1B5&$Wt-WcRvD$t zlCUbEhXWZOT+dX5M6|D7V%UYomcWnV#fGE*Scl`Li$Ki@+&D;841?ZXJqIj1&&^Hh zoZh&^(HOiz_1?E-c#8sS9Z-c>zBkH5U z;YH~D?@iEWc;YuH$re-DVvGsC&m>~B*qD(@+f{~)8V4gqwYG3H0xH!^O##Y^I<8@5 zrilD>;1Y9X&&ryg?}O-gcMw$lvqJ!O#y&zROTY!+<)`L?JRQ-0>ItlD%Fc3fKWI2N z3(n*0@NoofhtM+pg5~*vUE?}f z6hB9J%)%Ux_qbP*<9Tg`JIWyX8hNK-W?})TO))2XL*BZOBqkY0K)iFt6exJH-}UNl z6z{D!W>llT!hNy2KG$pVc=UO13fq6-W>u*=!IsjI-`c?xd*9A5R_R)r+xBAwuLKZ~ z#`039g;#dR3UawJ@E3o1xzitb^7e+o%GOFP?0(Yw32w2G8}$Nx;+6e+6b_P5gldw( z{PR8^Re;J@XIYqfunCofM6lveN<bQ@5t_Eypicl{hl|tw3R9~uI%X(Ci4a&LzQCokQO!To;#?tUAJiW znm4yH)dbNwO3scmMV4?F!lKzm3+anVuQ0(UuQ-XIfPBjCeCcR$QBK1nT6~Q; zK{<_-N!-ZMr1~hG)ujmcaRI*NGdD}3kLQN}?u(S|qziCOB-~%tgrl}DhN|zDTb{e* z)>~^~zAp>kSZ?fGHKzg_VdLEO>Saw}eeutg&K)FW@%I;%U~_5*(%c}TnvN&it$M`Y zJI|p1_Us4*n6bnHu;iDxdaU{TC^(KgiU6yORvt3y=co%@8*w3u5%o zjy^xIZn(u2epZxCJak;7t#8R~=J2rBHt2hM3Thr$hD_5b7Ciu6Cj5;?my5*be<^?} zY`8G2r~%byl0-n;5MmNjK{%CSa$#pEL)HGJ{-Fd!Q|pFpc$36;SXo+@T`Z__l8#vo;dv>-;a(s73oJ&iZC=r@vVhsYSwaIl1 zRIFr?aoZLm8J0?Gjj(Lj*MHZf4tssw zGCmX&qg-7d^IB8G1z4i8G8y=xisRuwmGUE^<_{hEd;kexcaE3$q#-RR&dp604~R#)g&(Gw3eUhwBY+IK$Hz_qpX zcUcNmh#wNCQus?oIC1T)_;V%fx3*pXj#V06mUq=dnt9vQSxb??ZswWS2W8+xdR^XoJ6HW#R~pMM_o|jys?rN< z`YNqeKbZnZB&c@Ji*r&ER(Y&r(*_Gt<+}z;vUok?Y`L`dz0S0F?J?Owqt-&G8vvVa z%($ueL|h<$uF1$FZXsl)z9^OUUz0rQDN)9ioud(MJNvyEUUutEeFI;|q&ZS-1;yk* z5h12uRNE-SvD-#N9;wv(?U&Wn=C%$8p~%>bLX1D<)v%q4%a9wlf98>R(TGPRMCj3$ zB>vYig*o=0rb!6?c=2uRkN|E9N}z&G2Vrt{oM>7g#5B^ZX;W5dQIKIKAi@=EH?$s4pFA}t)egMS}>NO&tvJR^x{pdJ_ zjK(kIJx`b>o-cDAK3GuV$hBo&<+7iXY4dGr5g>D zTtrAQ*K)MPwwVz`Irg$QmEk)b)Smnu^)`lq49z!F(`AFP?H+9M1&zU_>b3T!rr31W7b8G+`El<@6)DAo*K+F=@T3cGH}*v zOuch8_Y@9Sw4@ALvd0BY#eRGOC8fF>pGov|JLa2ATf*WVwoFlSQOOg=w754ZX(+y^ z4Kl)yg|4K8U9z@^*ptv@tw*5|Pq32xo;!I%JA3%e8|6H7{1PV%`C<9D^}>VFFxa=c z=IoxE2KQ1`par)d%wicBCp`^xC3UB|XjSB|~;yGjxNC0+tup64mVRcgJ% zDyq$A7O6v}^DG&)e~{nzhqyexq9c(8mUr8T&1my#Q(nHmez1f6(D3?DpM@H~{{Tc! z`cerIb^&1A&&u`IFF)@h0a9cq1rN!Lh#|S7PQC&t&u{&=z_QGuk8QKcZ4^=MCe!{b znUYrfkjs3Hh80zoWM++fB!r#Zv?-sLHSAY5PN4yPm>ooYU<%VFS5@0@hClzT=y7>W zMJNyS=0Jk5M@H{niH{sO2aVXU@>Va4{QpiZ(3<4YTuJxkO4w!QX@wu+R-SKV287aZl%q+V|Cn_uotl3CsncZ8`fP%th zIplsvb$k1TVAM}!I!RwviD8a0%(mUX7qF^h+uv!cXk+aG+ric43R#3gFd!p;$A-ra z7bM;ojcl*y2cB$6v+I$q>W)hxBTU z5YGKo?4QNaS-2ve8P}Xar`aC3FNqisaqq$3^MPj>I9l}%AJiRql}{A9c8E7#&!)Ki zJAr7m@RNS#Yks+WULZK^o(}KVtuk6LL+ljjuzOc^frMoKHaO?ogWvLObTSz%c0gIq z4e1-y0??5-nkA4)C$VzVut7jkKg57Wp&BiA&yFdOZVs60>kC+?3&m5i>ahhRcsEymX|Z|)E8 z305{R*PqpwqABeE#d}SscJ8RKl7a#4b-63YL%d}(F0Ik#H-ih&@>7mvNR6P@m_;PiHRk4 z*#6BK({O&s&3zr^JjM&jm3d7srq6<{7L7?i&APUhg#~JwH61))A7K&AcwbWU2SD~P ze$^2RQRIh#Zso9qTqnwQsGcbEz}3kPEchklbtRa}i|A81Zq{C*rLQ*9c$v#mPq;9T zWOZHMwoXR$ty!yH@HW1fG<@_93+i772LAh(G#OM{dq7>5w#ZlW6p-<*N!t{BF|?5q zNch>Oe&=M8&(Uzer@mHeO7d8HDjrZ8c4O3#4~tv{Aw|vt^g2WEvcZ?Kr?+-^LI#iJ z^?(5fXDMc5Bt)4Sl>c*3C;6x2d=)Xq6y@o-Oi6>MF;5U`9qJ#IbM`FLd1XZLWl_L@caQz~wBC*h!a(xLVloQI6I1h^=mD;R+{&HgG zg?U92fy%0unvGiZ$q)}Gl;%pFJZnHg9#t+?5|oojD(5~aXn8XNbn`n@zAe~8i3hw; zZC~7Q#Gh7pNP);mE8A%Fz!jj#*VzN1a`oJ(r`Y;NT}gdYLGZJwodk~KXUZnDHL=ZH z;u@JxGzf}k{3|&1jh-%-IkaOkocWak9oDLgG2z3rja-ctJ%^LsEUpkXYprcfib)H2 zam5ELgem;BLM#jCSM?aS89KmMrSJ>Bdb=4w6E1F=3eU>WC#gB(4e=C7C&>qihclsI z;m{$#1|+rNuMU1)8QwaX-h12a^lm=5?%;N^blRDI5}aN8e7ya8o4&kt`Pz=IelsC_ zC|hKmY3Tsk3x3YBY&*8_6A^UwN_N=!Ryy0BCA`4D8=sD}EKye&6*Bt}#dxqvWcF5h zp>he=BgG>v<$qmNc^y(X-49%nIKEymiYeUh?ov4IFM3mynwq$|8R{Zel*5k7|8*7) zogmYa!|me@obT-KN5KZ2C+atVmpS;eKnvfH1u z*L1z!rS;1DJV-_;+^t+`(O#DCv-T$0pMjsj8$6VSTp2$2aAii#BHK1Wx*PVKo0sNS z5E}!KSZc+lCbi~?O9Q;2!PcmhHSchSY)xKcr^h8V>X5d|;cC`tf6M@OQ?wM%Gq34p z3wC=xO`)1K(H?D(>I_AvjX5+vgY#-UQRGkBU&9PbH&&wRUxLGlR&NZlQpjRrnw^&R zRl-U&h8nMJ-wo{}9y0I-nzrOb(DJ0m6Z)2=Co=AIvkc9kgt2&k{t5y=l0++iX{8== zl&@1E!8-7S-pQc*1H&vW+kq|IW!2y`TM|yy#U-_QMlge>Sjo({r z+}2k;I(vFLZp|F`{|(?rG&-RLEFv2pp2%6;{sRAibcHLQKI!tR!{rXSyty&8u&GXl zh&4&e@DE^Cqlz{dBJauLXJ!wdDUMkrpK}uY!WmVBNrMQynFOR~S%`c-&fz(5VW}9J zA2m#6hflKXz7Q;Qzk9fkZr{eQZg3f!NB6!_%>iAohWkq>nC}7!#<%7ZnSGk&ODIOV zV{(pF4bmkcBnY8G&>Tlg&=Rc8lWhpv)#W~&d;jV~ALl&M?N~CTm_t?ems}j)Ked*+ zPGqOcdK|%6W%Cg4msGpYm3$?nkeB{~J5WLno6LMoJ+S+G+P?VZW)s8TguT*;jeMOQ zk%`{}s9nR@TDv_{jKSZz#HRjfH)xkvU$6N2b{~5zKf6Wu(Fl&ugV$Vrzw7#s`#c_o zDo)jCuv#cP`lt%*ETxzz4iU7cuYDXFR@w+$ZMV?uP|WOd#bxq+_v`Zh?;^w4KKNE0 z(&sPAzZ=qrz-1g|rt4~$T@bvu%KI(l(!~ae5wYV>OxI27EkYJ4l_aH$Uch^8eaA@2c4H5|M?h;&1r|RB1|KaSHUA3R~nrp5x z$JB*QGI*^%z4i;($0+B5e!p;~Iq#)t9}!WE=Zo;$f)q&C2+NDOVsNX~emdN5@Vkd{ z-*@0dFZ+xZlRro1ebf?X1};IaLa=Xg2k`5-XGsi?kBHo}a#!O0{mnVBfacna4985o zXtyjZ?zF<^oX+st_!*D`bkTKIRw*x{EFm6f?qM{{MW~3C61R}LV!|vv)Mcy_fJDZZ zS&X}W)-Rr%bV`q>@wTB5j|;3dH4Z&YDVp1MC8m(y&9uoz;No1CEF&27jqJ1WzWqHp zdGe0SpDUZI^^F#RG`KI0pW*K+_JHqg2h%f=)^ExAB~JgnkAQ57_@T`lH+TqL|L}Wa z_5ri-f-eJB*1$sZB+%ZB#SbV7O!3%S%Urb?1x#( zcW0>VY0JHU&*iaehT#!=Oa@NwpT|r(Q-6x+UcKT{0giEpY1p`*)Ec+25$kiPqR#K zj1fQ*?gjb|A_%(8PI_zly?zes%WL}u_S3rKi zo6E{n#K~&2q)g`^rAo=TP_#QZOo08zNbj@xt^e)OuXjTmf%o{*ATb-))t=cTCTsG0 ziF&i`)@OYd%&$)y&`HH+V-*Y$q=@r7NtMwp&a!E%6_-LC!}MB=oYkTn!6^h1nhVG7 z(*aXIFhOoXcp_=sgwGgH0?o`WDnZ#WDe0j&SVmI|#e~^;n+3PikTa@Gw4?l_kXGb$ z1{mA&Byr~XLsy-(c2&-erB;Jhn|>nZ7&LOl-E!s$0SUK`?dYUqCegPR>JIvQo`V$K z+BH$_R4eNlQxresJ=*N0kbS#b^B*Bu@{rvB<8kY3?7A()-Eg@rps&X!Xd#y+O%Td7@ zsE7+jtBVIRjXMjw_}cLS=MJPsz7L!5^^Qsfo-p7X8p_CVx3L(j_09NCJCsw6dad23 zUY@eCQx9T%k)2iAwtai_lA+SCxu?%RKx#FrK$N<1TLN^o6RT$>LZB5+S!&X)=aCJ{ zq0o!75(Q@HK+ifKcX1doe;jsq2erRE9O(y$kr2|2cipnMdvNL0SuYVT)bCZ>-SU{U zKV6RYibcpBxv(MbD}%G6-N1);?Nnbl3}gOZ#hUvwoOBZ$(IPcXd05*-}v`$nL~j zWg?cm+Rvpb0!}etilKcRO0iOs(`9jS=w+2HS=?nm?i9y&r1)5}!(glb*$<=FRlH8Y z8wNp%+45BW@0HpYJaleOmKgIMm-n_WtsOnGBV9y_D_Rv#yIv*kw;3ffcn3pqB=!@L zu;pr#RI!wbMNVsn1=sxQ{T^oWQrV4~!UA;aXBc~gT{l1J^Ax;LJ@3o!_@DXa$-i%{ zFja5))LB!bM(KO}vt9B1QZYhwce16LPi>!5_$koWD8`GDWh$m1RxE#pjvQfgaPJe0 zu|`;@WMsIpqK``x?JnNx=MqP|yC)+He05Pu%G&b665s8o%WH}J-`mh)?paZW`XH88 z%9<@7>(`^{0WKT_vdRGEHN;jo!yB2-oHP?i5Jj5G&6<9=|OSvFONCyJw3vZ}pFHTQA08B+@?$zDgn zCdUP*N{1C6)#p7|%`;oa48i-!O4aXo1-qEl#4bL~eSY`uoitcTXumQjT;9&!9&F^) zN-rjb;MJncd)t+<75sxv^qX=auK@SSi3sp-qM@;%z{Vdm=ZDIm{vSe2c}8)wVQ7JR z9_p2x3`#SZGB{kA^*D^bs`R&LwC|k&oAAl zHS9a*_3@)_S_-4JpPL+qS?lhJeQf_vJgdWEH!%5bahT_Du$W&d;S1Z=;o8iVq_PpLC>WhzMh1}sd z?63($g$cyCuj_GR$#U830x^3*mWV^47E@G@-`PU?#dxUA=@{QK?OLN&2>@;YW+#M9 zCNHZB3G&YFl`JVllcm$1x8ues^LWw`{w%6UX1W*Z;-mymDNI$MR{12J% zZHPkNl%+I1;N8h>Jayx}er;qs_4J|`V|)UfV^*ErIn`qZ4^wkV0(a8B&A+EyR$NT# z=l`p$;?*BYe~ly9QoNdq-mLxE*;x==6qJ5KV@@|j8CF7lKJ?8!p6X(+Rubu|F0jLJ z?)&f^2G`jwhSUl2FaS4ROOdKn_41&F<`+Mog;DUPz zSDyuN!)nOlMmUMfga>#EX|B1$4~AC4+@ge<&Lbe>DZv)-Lijy~-*YB8>~#SqP{EMC z3Svn2CS-_VKt`$z5R+C|qKyql1LjEGIv!mDfH6d+k3jdqQWshoq`x!5GNnCTF&|FA z%1Cvp)})bG=KW28m1^)%_8|6#FPd5U9hvW=j_O#1q(b<-jeo{^*g~^}slpMaNeC*L0_K5uNaQ{5E z$uaA*n*-uNvxvrzPD3(SMW+C#$M;tN$?+wxFzO>2*J(laOLYjl#E;wVr{H&2UA@ok zAQSk6sm&_0u7H5U5Ke0d-G&~E7j09TyIodBap;$PrK)y@gY82KdIq1AHz$Lkqzt7t zR^C>eSc(Zxr3*oDx+X_&NY+~wYJ@%6EDO7 zVK}Q!diMcCof_bWa?~QR60^35#ITQO+mjt^8$k$ z23y{SOlPPtUo9vkk~zG(`^m{~QU@v?s)7Mf0?jMK|r#be6`}4D=VTj2=7NG8=4GR77 zu9yYVn3&Dt&k5uI;zi5uvw{v;qii><-$ZhcsS#o;kl;Un$p$EZ>8DGp2GCA!Tb z#*JI>@s;{mXA!*3aAW!DpGBOq!(dfRq3NDTri*<1x{o#=mfzZH&?1&<6=@+|?75SxZV5s8U#N^LQ(_o>}bkz38|>WT4)dHUw^} zzVUrRBG_6hOp&qUIS$H}y~tfTE*@VR_Eo!6+`kN&X4)ELYDdA%{!FyL2 zx-LvN54L_NJQiVXr}UIgehA1FE)2e8U=-&&^cV#8ZZ{8Zz4zeI=S&vR9mN&^CDO&AUtu*pRm>!mzz zP=;ju+BzyWJRqmfVcNc5-GodHLCB{=6yL9lTh}*yik>?pZb(-?Y|L@HW#1DyWh~Q(l!bEhpV+JuG z25%iBgVUaZeR$U3FeaO|dT?;CoxVOs3*P2Plka^MORLm0MH=y2U~JZNfF-Gf)@^$@ zk7|XuswuAgitT6Ey!y3a?v}AKeH?C0uBVzS#$3~W8GU4Z zivI6#An}*#lsw_09+5ZJvv-lEcttge8$bQ7zHNy3THW-JW#WgJ>vsv`1ItVY{yo%D zdySBHP;Y5p1DWN3Gds#YVPkQ;w{rL~w(JwyOd9i57$Wxibai=LKiOuw3!(leO!faD z<~nh-HBORUGqug#%e!VZsf}nPW??=noNoj_uqjWeri7O*b(H3LRDLRGkd7tr_28B7 z>uhL=ESX5mQUPBy!`Y9$#K^GT(&I_HtgKx=O~z3K+-6QOBV!TK zXIXF04y~`}H(Sa_0Y&4m*7`9GzbDw|%@^IknOIv}kIvW%pgR%Sa#(|lpjPvHZ} zK+}jClO$5HGzi~@CB>M}{LC`JKRz67r}RUigu0tkHMdrbe_;Nr(tS!(T+pZQ>$Q$_ zC~QQESg<%SIhfRIHo|F6CSJyTnJH>6w9E+lrJJXXR$GGw#GkyQTbrG?vB!0Em8AcH z<1yD)j+^yXmI)3NnN~a2B1D6irRCbXpMZ^76=K+-@uSitQ_Ixmij$k{+_1 zV)bcjQ~k)GRz0qpCo zVFTzRbSi+USzR&b#!5h`vKzBSgvLxCOW!46ng-)~8ch77t9x_xbz}f3DbYYMrfS8n z33{i!31)iIc}})Y{I|OwcRv3nvos!`|J{RD3cHK#tDx=}V&>p@E}?i|P4)%+VYlEO zv2PbNF1EtVSFI-D%C6#$yZ#4=8F(n=M(Ujy$t4EUbjeAD2f?~ox2WaZMp`ba_9KE~ z-iW^XDPnIi!+yoB0a>X831WRr6Y!BrWkQNXgp}0zs7hfx;PqeS3F|HW3eP54c0Zj& z9*XRs7MC8-9hhKTxRD9sVvnjZhs>?VdViKhDG2nn=A2IWKh#H%*CK}3T+oiA$;zR@ zDg7rn{-E_#gNqC57`^%&Z;nQ9)$E~vlI2mVoO{mSMvE^waNUnEBR*je1LGgWa6}U` zau09My*KvESHrkr!EZ#r(lZK&d~N2hQpVliBURP9FdV@85s={s%(~?ZfV3FCs2uEE z&WQ14o9>Nh^<{NjqPlc0Qn*?S{l#XY4Xh=YR6!WMpi=(dC&?U6s2_-WQ*C}_QHbhBN zjB}rro1wWVDByYpnE9BBJtiR`(354exRs>~o%C1G>cP^Tz+uwg0DU~{9HM2w0;;lh zV{sZ_S^x{?89wdbNo(FXRbM;(R1^6^bmp!>!6jTS#KI^zMtp9HNg2WY_8zcYzc-S? zdbKSTC8eG=NH2b`9TXNSDhe_q1txhqIQ(daa;+#egha#WOiv-d?ze}o67#;tF^o9z9B7@V0N zyLu;Z;5+F{x4J$N7n#PHsxsVYMxM|gpVytv1&dSUhdb0|q=v0`9)6tQC!pklS$FB` zc+AURtXdN=Z^V&hy9Up}ReMN-Vl9(kuODiJ?~%F!q!PT%gmC!vQJT>x&4Tb2qpnVUQ=*ZiZYaYB0w=ZrZ$;^;@5m*Qa5|KJC)<{rWpqnojInv-|m3f8o<*BX(O!o&d~U z-v9(si$Ivy%!5(-D>m^y-cp25^R7C#`ThY zKPnF{Docn=;Wx^-HvOr9&01*3QJL%m53ETU(8BkpD$98Qy$ebBIXY=6FzC^4PXv7e z?fqtuRzjl-)H>kpy!B%{G{=RQ`&S#(;x{Lis8O5B3_WYcv{s3g*9c2G!wiiuEG4y+ zDz@gup0g1`y4DEV*@@u)=YS-m0IVOUIdQzJlOv=yP;2YyHS$l|77B>!wK&_Y?uX1< zK`H$6&rcv$Ck6Jj&B<94FIQ0gEGB|Xe)2!erf*Bh5)eey@lSJYsW@^QuW@n_zd*k0 zdK)3aGm2LV5fvYoT5I`L5B^vBR6Jt^%(?uY>8Ye_q7ie>D(ylm}xr%;@vH{%uXIkTk{7{S7$$Ow6>t%SFuL2~rga-u{$wX$fi7r$A-p7{`@1k6gam zkXZ|wD0Q$*Z{J%UJ9$}sLVP}Y6t*;FZ|`v~cr341+$$M%O443hv)<>*rsnN$H_Z!? zk$yINVva^Jb3*>J=k}*0uR=7b#13{y^N(O;$3)pFTa5?dzYk;PSEu6Q>Hr z{*u>Y634{cYwVp_;!wqfmvy^V+dFrA$r{e59Lz6foRMHXtL1NTh1#8-wK6PgnfkDz zkZvW2sR%)e5>Y+5_T?96=R8KfMOa%{gcD_besNj)Jtrf3D*w_q6xdsN*9O&5*pFn_ z3a*v8xl}oOcQ4yHn!_DVdVvzv$6f4$?A!!NQiWlEYT;G&bpzb&U1Eg^zgU^|^hV0Ce)F)63JD6r3S@Q$f*+*A(O^lI?PRoLX>bEaA9z4T&J7)L zEW{VJJ*aE)UjKY6nsK$lrKp?p5b1a=)Q1r>3SAO<)B7Z>A|d^p3AG?jyLTaJ$r4EW z{zLue{cG<&?+TjNLISy$Rp^X5yz}7dar`rqN!CVDY0_3|&GO1DJ1H4i7Gq++@5y50 zDqkVq=w{RDEoH*uZd%F3b>^(|Z3^pj1ZT>_<}Q9NX;*}CkH;5Vl{r7VvW7sUhnL3h z;Bp7>!P*)ps3pz4FH`gZ^>ZZdGuRNVDC~_Q)@1Pr9r@i3axe=d4%-ZuPUO@dD-DKy zT09mi(YMKCCg>+qia6R6AKm)={G1!YAv&)zLw6mYDWNKCp5;v9K{qszDsbmb#jQY6whMFB zb`zuD)hI4f1TqvKomV|A{MgevBSoYNF1*5d2$Xptk~k46bkvmlhbcvah69Ch)Mry;X3`W~7RpV~9B+3>TGDgu0Rq&u(Sd&}JCz`X)r^2;XPW?JTm)((CeLz5oqWe)BT7 zAne%E`{mBLpK-+YytF&Ik{~TFR&nwubo#BemD-_$mAzI@`$B+bCq_JhZ)BDC04tvi ztuVo2tt@12K5?}UNCyvU0(lr7qJ)eI*J&=lMaiZY2`n1DW+m~z zfPRfvx#!urb2>%7jIiRt6|PWPVIp26wvs&XJ5MR)gRq9HO`c;%<)6w1D9XOvfSwy; zr6mqk4?Bs6*eMQqpY>oAd*`+T28!wwTZz|<#Z1x{W1>TuG}7w-m{B|k-R733zm(t2 zPdNG+_0i_t1xa?&MnzHu2*vGD>&;$=9orAUr-AJ+>*?#l^)9 z2;$R{ItSRv5x}HQ!^9~$nZhLps(A#aMZaTQ_kR_LVpEEFzvKG*P1V=;HkTb%FxXfR zTDJakwfrsD4zXQclu3m|@tuUvbz6D~6$&sz)^tSoj-Ux6P$VV7LV3H5pB>sMF7lAL z&~;Cy8UvaceSw~~9ia(*d58}Bq_1=__Nk>!x8VcLxoL4dOf9BOsHQLbqNd)!@5?fJ zA2SDfSM(iPnKZq19C70V<(_#LV2g$Gv6;|7TVWO93i?8Exck)YRg*3YH`y+n{8~=P z!zp4r4<((mU*&~!l6*ONbjU@@F7*)EkPq0WAKkiL)=r4LkiwVkJQS!@>J!>8YMt zj$|O&w*;c9qN1&_E8OMM&O*g7xQyRz3`V(3NyODXx0!Vo)ph}{K(8WMveMTmTuN>V zrq?UI-hMThz1QaeH_V6!2|b@g8RETo^V7>d*REUwM&W?fRqfwy3eoIZx^&|cVQ=!P zcf`yxrj3~;W2L_Ip!c$8u4$W8yEj;%NW^ZGpq)5z|rtvrDA;BLyhP~$_ zM?(3}%k=9Hrc*-go~EExuuEwc4y+)AcmDQpv>wgrolO1*ykChW(N)Uq0UYVMAiZYwNNo>Vl7hAbrIatTaf+4w2^O;6;y0%MvIX zWL?ec-^{5 z_!jr}ev3a3R=d|3j{xYM(z*3|*OGIksb_fEJQk0+o2SDy9+5W`((6P{Ksr=&W(f4h zgmT)%ilR7Eju=F@7K|!*p&p|17 zd5lCnCvo-B0e*ofYa7|69(mS+D@V&1YtLl0l7OV7?7NN7xwAXUC)|6P^gt3!-1dlR z4oL-tZ|!wgB|*Rk%Y1QnoA=Wg$TuIXFn_wMbu!hlYj5F@_Kkvq(|*x?QED@J$cJXbkVQC0}BlSTOu2zLOBZ3I5M>qFAYqzVCQuMKm)1=ztVRu>_ z$q6YdPP#8Kt}&~33$lyV6g*$i`u!2@y-4t7J^JS+{=SA)o$Ex9B}n1 zToTab`QLB)$bcT27Hc|d4c0foG39Uf5_K3Es+7o6v6p;=*i;z;RYA8sf{{|TSE$~|7Rv-CvAsuv7RLT$4^Yie3>KvscotmaV-PEa4vA165BC#Z`i|<4 z^JXz58Sysh@Gklr*@gGd7{L1U4gbdM5WyE(!Urc-8y~i60PcF9wIwPOfR4j&VTW{M z3!_4R5*sc2$BbT8!@cE)DHy#m0ypwjYOt$u zlZe1Nv==9)@#7=_!Vi4GF8`JXzd})K`hi13R4e`W&DLXBsd{S=s>O-MXG6l(|1XsP jC!7BxuV8ek_1Cw?J}3me57_o^;E$rL>L-Y_dC30&fNg@N literal 0 HcmV?d00001 diff --git a/src/intl/en/page-developers-index.json b/src/intl/en/page-developers-index.json index 524d5fb7694..8888fe822f5 100644 --- a/src/intl/en/page-developers-index.json +++ b/src/intl/en/page-developers-index.json @@ -28,7 +28,7 @@ "page-developers-fundamentals": "Fundamentals", "page-developers-gas-desc": "Ether needed to power transactions", "page-developers-gas-link": "Gas", - "page-developers-get-started": "Experiment with Ethereum", + "page-developers-get-started": "What do you want to build today?", "page-developers-improve-ethereum": "Help us make ethereum.org better", "page-developers-improve-ethereum-desc": "Like ethereum.org, these docs are a community effort. Create a PR if you see mistakes, room for improvement, or new opportunities to help Ethereum developers.", "page-developers-into-eth-desc": "An introduction to blockchain and Ethereum", @@ -66,6 +66,7 @@ "page-developers-quickstart-scaffold-subtext": "Bootstrap your Ethereum app stack in seconds.", "page-developers-quickstart-scaffold-docs": "Read Scaffold-ETH 2 docs", "page-developers-read-docs": "Read the docs", + "page-developers-start-quest": "Start quest", "page-developers-resources": "Resources", "page-developers-scaling-desc": "Solutions for faster transactions", "page-developers-scaling-link": "Scaling", @@ -77,14 +78,14 @@ "page-developers-smart-contracts-link": "Smart contracts", "page-developers-solidity-docs": "Read the Solidity docs", "page-developers-speedrunethereum-title": "Learn all the most important concepts by building on Ethereum", - "page-developers-speedrunethereum-description": "Hands-on challenges such as building NFTs, DEXs in a step-by-step tutorial series.", + "page-developers-speedrunethereum-description": "Receive mentorship from others, and learn how to collaborate with fellow developers.", "page-developers-speedrunethereum-link": "SpeedRun Ethereum", "page-developers-stack": "The stack", - "page-developers-start": "Start with guided challenges", + "page-developers-start": "Challenges and mentorship", "page-developers-start-desc": "Want to experiment first, ask questions later?", "page-developers-storage-desc": "How to handle dapp storage", "page-developers-storage-link": "Storage", - "page-developers-subtitle": "A builders manual for Ethereum. By builders, for builders.", + "page-developers-subtitle": "A builders manual for Ethereum. Everything you need to build and scale your onchain app.", "page-developers-title-1": "Ethereum", "page-developers-title-2": "developer", "page-developers-title-3": "resources", From 4b763e06398b5a80e32b8289e35923d694198cb9 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 9 Jul 2025 16:33:03 -0700 Subject: [PATCH 304/368] feat: mobile above-the-fold, ssr/lazy swiper --- .../developers/_components/BuilderCard.tsx | 42 ++++++ .../_components/BuilderSwiper/index.tsx | 40 ++++++ .../_components/BuilderSwiper/lazy.tsx | 5 + .../_components/BuilderSwiper/loading.tsx | 12 ++ .../developers/_components/SpeedRunCard.tsx | 49 +++++++ app/[locale]/developers/page.tsx | 120 +++--------------- app/[locale]/developers/types.ts | 12 ++ app/[locale]/developers/utils.ts | 46 +++++++ 8 files changed, 226 insertions(+), 100 deletions(-) create mode 100644 app/[locale]/developers/_components/BuilderCard.tsx create mode 100644 app/[locale]/developers/_components/BuilderSwiper/index.tsx create mode 100644 app/[locale]/developers/_components/BuilderSwiper/lazy.tsx create mode 100644 app/[locale]/developers/_components/BuilderSwiper/loading.tsx create mode 100644 app/[locale]/developers/_components/SpeedRunCard.tsx create mode 100644 app/[locale]/developers/types.ts create mode 100644 app/[locale]/developers/utils.ts diff --git a/app/[locale]/developers/_components/BuilderCard.tsx b/app/[locale]/developers/_components/BuilderCard.tsx new file mode 100644 index 00000000000..f0a3a6d7541 --- /dev/null +++ b/app/[locale]/developers/_components/BuilderCard.tsx @@ -0,0 +1,42 @@ +import { Image } from "@/components/Image" +import { ButtonLink } from "@/components/ui/buttons/Button" +import { Card } from "@/components/ui/card" +import { Tag } from "@/components/ui/tag" + +import { cn } from "@/lib/utils/cn" + +import type { DevelopersPath } from "../types" + +type BuildCardProps = { + path: DevelopersPath + className?: string +} + +const BuilderCard = ({ path, className }: BuildCardProps) => ( + + {path.imgAlt} +
    + {path.tag && ( + + {path.tag} + + )} +

    {path.title}

    +

    {path.description}

    +
    + + {path.button} + +
    +) + +export default BuilderCard diff --git a/app/[locale]/developers/_components/BuilderSwiper/index.tsx b/app/[locale]/developers/_components/BuilderSwiper/index.tsx new file mode 100644 index 00000000000..16ffaee58bb --- /dev/null +++ b/app/[locale]/developers/_components/BuilderSwiper/index.tsx @@ -0,0 +1,40 @@ +"use client" + +import { Swiper, SwiperSlide } from "@/components/ui/swiper" + +import type { DevelopersPath } from "../../types" +import BuilderCard from "../BuilderCard" +import SpeedRunCard from "../SpeedRunCard" + +import { useBreakpointValue } from "@/hooks/useBreakpointValue" + +type BuilderSwiperProps = { + paths: DevelopersPath[] + speedRunDetails: { + title: string + description: string + ctaLabel: string + } +} + +const BuilderSwiper = ({ paths, speedRunDetails }: BuilderSwiperProps) => { + const slidesPerView = useBreakpointValue({ + base: 1.15, + sm: 1.6, + }) + + return ( + + {paths.map((path, idx) => ( + + + + ))} + + + + + ) +} + +export default BuilderSwiper diff --git a/app/[locale]/developers/_components/BuilderSwiper/lazy.tsx b/app/[locale]/developers/_components/BuilderSwiper/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/developers/_components/BuilderSwiper/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/developers/_components/BuilderSwiper/loading.tsx b/app/[locale]/developers/_components/BuilderSwiper/loading.tsx new file mode 100644 index 00000000000..5c44d162b59 --- /dev/null +++ b/app/[locale]/developers/_components/BuilderSwiper/loading.tsx @@ -0,0 +1,12 @@ +import { Card } from "@/components/ui/card" +import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" + +const Loading = () => ( + + + + + +) + +export default Loading diff --git a/app/[locale]/developers/_components/SpeedRunCard.tsx b/app/[locale]/developers/_components/SpeedRunCard.tsx new file mode 100644 index 00000000000..9218419cadb --- /dev/null +++ b/app/[locale]/developers/_components/SpeedRunCard.tsx @@ -0,0 +1,49 @@ +import { Image } from "@/components/Image" +import { ButtonLink } from "@/components/ui/buttons/Button" + +import { cn } from "@/lib/utils/cn" + +import speedRunEthereumImage from "@/public/images/dev-tools/speed-run-ethereum-banner.png" + +type SpeedRunCardProps = { + title: string + description: string + ctaLabel: string + className?: string +} +const SpeedRunCard = ({ + title, + description, + ctaLabel, + className, +}: SpeedRunCardProps) => ( +
    + SpeedRunEthereum banner +
    +

    {title}

    +

    {description}

    + + {ctaLabel} + +
    +
    +) + +export default SpeedRunCard diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 87aa4a9369d..154d97600d4 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -1,5 +1,3 @@ -import { type ReactNode } from "react" -import { type StaticImageData } from "next/image" import { getTranslations } from "next-intl/server" import type { Lang } from "@/lib/types" @@ -16,14 +14,14 @@ import { Card } from "@/components/ui/card" import { VStack } from "@/components/ui/flex" import Link from "@/components/ui/Link" import InlineLink from "@/components/ui/Link" -import { Tag } from "@/components/ui/tag" import { getMetadata } from "@/lib/utils/metadata" -import speedRunEthereumImage from "@/public/images/dev-tools/speed-run-ethereum-banner.png" -import speedrunNFT from "@/public/images/developers/speedrun-nft.png" -import speedrunStakingApp from "@/public/images/developers/speedrun-staking-app.png" -import speedrunTokenVendor from "@/public/images/developers/speedrun-token-vendor.png" +import BuilderCard from "./_components/BuilderCard" +import BuilderSwiper from "./_components/BuilderSwiper" +import SpeedRunCard from "./_components/SpeedRunCard" +import { getBuilderPaths } from "./utils" + import developersImage from "@/public/images/developers-eth-blocks.png" import dogeImage from "@/public/images/doge-computer.png" import heroImage from "@/public/images/heroes/developers-hub-hero.jpg" @@ -47,15 +45,6 @@ const IntroColumn = (props: ChildOnlyProp) => ( /> ) -type DevelopersPath = { - imgSrc: StaticImageData - imgAlt: string - title: ReactNode - description: ReactNode - url: string - button: ReactNode -} - const DevelopersPage = async ({ params, }: { @@ -71,34 +60,12 @@ const DevelopersPage = async ({ namespace: "common", }) - const paths: DevelopersPath[] = [ - { - imgSrc: speedrunNFT, - imgAlt: "Speedrun Ethereum NFT banner", - title: "Simple NFT Example", // t("page-developers-learn"), - description: "Create a public NFT to learn the basics of scaffold-eth.", // t("page-developers-learn-desc"), - url: "https://speedrunethereum.com/challenge/simple-nft-example", - button: t("page-developers-start-quest"), - }, - { - imgSrc: speedrunStakingApp, - imgAlt: "Speedrun Ethereum staking app banner", - title: "Staking App", // t("page-developers-learn-tutorials"), - description: "Write a smart contract where users pool funds together.", // t("page-developers-learn-tutorials-desc"), - url: "https://speedrunethereum.com/challenge/decentralized-staking", - button: t("page-developers-start-quest"), - }, - { - imgSrc: speedrunTokenVendor, - imgAlt: "Speedrun Ethereum token vendor project banner", - title: "Create a token", // t("page-developers-resources"), - description: - "Build a digital currency and a smart conract that trades it.", // t("page-developers-start-desc"), - url: "https://speedrunethereum.com/challenge/token-vendor", - button: t("page-developers-start-quest"), - }, - ] - + const paths = await getBuilderPaths() + const speedRunDetails = { + title: t("page-developers-start"), + description: t("page-developers-speedrunethereum-description"), + ctaLabel: t("page-developers-speedrunethereum-link"), + } return (

    {t("page-developers-get-started")}

    -
    + {/* Desktop */} +
    {paths.map((path, idx) => ( - - {path.imgAlt} -
    - - Challenge #{idx} - -

    {path.title}

    -

    - {path.description} -

    -
    - - {path.button} - -
    + ))} -
    - SpeedRunEthereum banner -
    -

    {t("page-developers-start")}

    -

    {t("page-developers-speedrunethereum-description")}

    - - {t("page-developers-speedrunethereum-link")} - -
    -
    + +
    + + {/* Mobile */} +
    +
    diff --git a/app/[locale]/developers/types.ts b/app/[locale]/developers/types.ts new file mode 100644 index 00000000000..43aa7143186 --- /dev/null +++ b/app/[locale]/developers/types.ts @@ -0,0 +1,12 @@ +import type { StaticImageData } from "next/image" +import type { ReactNode } from "react" + +export type DevelopersPath = { + imgSrc: StaticImageData + imgAlt: string + title: ReactNode + description: ReactNode + url: string + button: ReactNode + tag?: string +} diff --git a/app/[locale]/developers/utils.ts b/app/[locale]/developers/utils.ts new file mode 100644 index 00000000000..ef93d97f385 --- /dev/null +++ b/app/[locale]/developers/utils.ts @@ -0,0 +1,46 @@ +import { getLocale, getTranslations } from "next-intl/server" + +import type { DevelopersPath } from "./types" + +import speedrunNFT from "@/public/images/developers/speedrun-nft.png" +import speedrunStakingApp from "@/public/images/developers/speedrun-staking-app.png" +import speedrunTokenVendor from "@/public/images/developers/speedrun-token-vendor.png" + +export const getBuilderPaths = async (): Promise => { + const locale = await getLocale() + const t = await getTranslations({ + locale, + namespace: "page-developers-index", + }) + + return [ + { + imgSrc: speedrunNFT, + imgAlt: "Speedrun Ethereum NFT banner", + title: "Simple NFT Example", // t("page-developers-learn"), + description: "Create a public NFT to learn the basics of scaffold-eth.", // t("page-developers-learn-desc"), + url: "https://speedrunethereum.com/challenge/simple-nft-example", + button: t("page-developers-start-quest"), + tag: "Challenge #0", + }, + { + imgSrc: speedrunStakingApp, + imgAlt: "Speedrun Ethereum staking app banner", + title: "Staking App", // t("page-developers-learn-tutorials"), + description: "Write a smart contract where users pool funds together.", // t("page-developers-learn-tutorials-desc"), + url: "https://speedrunethereum.com/challenge/decentralized-staking", + button: t("page-developers-start-quest"), + tag: "Challenge #1", + }, + { + imgSrc: speedrunTokenVendor, + imgAlt: "Speedrun Ethereum token vendor project banner", + title: "Create a token", // t("page-developers-resources"), + description: + "Build a digital currency and a smart conract that trades it.", // t("page-developers-start-desc"), + url: "https://speedrunethereum.com/challenge/token-vendor", + button: t("page-developers-start-quest"), + tag: "Challenge #2", + }, + ] +} From d036e2c606e1a018b658ce711e289af989207485 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 10 Jul 2025 08:23:25 -0700 Subject: [PATCH 305/368] feat: add dev resource cards section --- app/[locale]/developers/page.tsx | 152 ++++++++++++++---- public/images/developers/resources-banner.png | Bin 0 -> 51408 bytes .../developers/scaffold-debug-screenshot.png | Bin 0 -> 55972 bytes .../developers/stack-exchange-screenshot.png | Bin 0 -> 122262 bytes .../developers/tutorial-tags-banner.png | Bin 0 -> 48450 bytes src/intl/en/page-developers-index.json | 2 +- 6 files changed, 126 insertions(+), 28 deletions(-) create mode 100644 public/images/developers/resources-banner.png create mode 100644 public/images/developers/scaffold-debug-screenshot.png create mode 100644 public/images/developers/stack-exchange-screenshot.png create mode 100644 public/images/developers/tutorial-tags-banner.png diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 154d97600d4..3d9752fdd0a 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -16,12 +16,17 @@ import Link from "@/components/ui/Link" import InlineLink from "@/components/ui/Link" import { getMetadata } from "@/lib/utils/metadata" +import { screens } from "@/lib/utils/screen" import BuilderCard from "./_components/BuilderCard" import BuilderSwiper from "./_components/BuilderSwiper" import SpeedRunCard from "./_components/SpeedRunCard" import { getBuilderPaths } from "./utils" +import resourcesBanner from "@/public/images/developers/resources-banner.png" +import scaffoldDebugScreenshot from "@/public/images/developers/scaffold-debug-screenshot.png" +import stackExchangeScreenshot from "@/public/images/developers/stack-exchange-screenshot.png" +import tutorialTagsBanner from "@/public/images/developers/tutorial-tags-banner.png" import developersImage from "@/public/images/developers-eth-blocks.png" import dogeImage from "@/public/images/doge-computer.png" import heroImage from "@/public/images/heroes/developers-hub-hero.jpg" @@ -95,36 +100,41 @@ const DevelopersPage = async ({
    - -

    {t("page-developers-jump-right-in-title")}

    -
    -
    -

    Scaffold-ETH 2

    -

    - {t("page-developers-quickstart-scaffold-subtext")}{" "} - - {t("page-developers-quickstart-scaffold-docs")} - -

    -
    - - npx create-eth@latest - - -
    -
    +

    Helpful developer resources

    + + {/* Quickstart your idea */} + + Scaffold-ETH 2 debug screenshot +
    +

    {t("page-developers-jump-right-in-title")}

    +

    + {t("page-developers-quickstart-scaffold-subtext")}{" "} + + {t("page-developers-quickstart-scaffold-docs")} + +

    +
    +
    + + npx create-eth@latest + +
    -

    Need to learn the language?

    + + {/* Get help */} + + Ethereum Stack Exchange screenshot +
    +

    Get help

    +

    + If you are stuck or need help solving problems, be sure to ask + for guidance. +

    +
    + +
    + + Stack Exchange + + + Ask AI + +
    +
    + + {/* Resources */} + + Banner showing four resource app icons +
    +

    Resources

    +

    + Want to experiment first, ask questions later? Check sandboxes, + bootcamps etc. +

    +
    + +
    + + Play with code + +
    +
    + + {/* Tutorials */} + + Banner displaying multiple learning topics in a tag cloud +
    +

    Tutorials

    +

    + Learn Ethereum development step-by-step from builders who have + already done it. +

    +
    + +
    + + View tutorials + +
    +
    diff --git a/public/images/developers/resources-banner.png b/public/images/developers/resources-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..876d481c2fb86c7bb0e908c94cd34e140ecd8483 GIT binary patch literal 51408 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�DX|n0i$IX7&OqKIm(@4&}qZVo!eEvh3 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�A` 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 T*F`!<2zZ&?v@odAbBX>R@^+`_ literal 0 HcmV?d00001 diff --git a/public/images/developers/stack-exchange-screenshot.png b/public/images/developers/stack-exchange-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe821a2f55001221804f74b83d6fb8208794b33 GIT binary patch literal 122262 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 literal 0 HcmV?d00001 diff --git a/public/images/developers/tutorial-tags-banner.png b/public/images/developers/tutorial-tags-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..83bfd338d82036c4286904107acffbdcdbe6ea9f GIT binary patch literal 48450 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 Date: Thu, 10 Jul 2025 09:50:33 -0700 Subject: [PATCH 306/368] feat: trim documentation listings --- app/[locale]/developers/page.tsx | 37 -------------------------------- 1 file changed, 37 deletions(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 3d9752fdd0a..199491a23f1 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -346,16 +346,6 @@ const DevelopersPage = async ({ {t("page-developers-networks-link")} {t("page-developers-networks-desc")} - - - {t("page-developers-mining-link")} - - {t("page-developers-mining-desc")} - - - {t("page-developers-mining-algorithms-link")} - - {t("page-developers-mining-algorithms-desc")}

    {t("page-developers-stack")}

    @@ -391,33 +381,6 @@ const DevelopersPage = async ({ {t("page-developers-dev-env-link")} {t("page-developers-dev-env-desc")} -

    {t("page-developers-advanced")}

    - - {t("page-developers-token-standards-link")} - - {t("page-developers-token-standards-desc")} - - {t("page-developers-mev-link")} - - {t("page-developers-mev-desc")} - - {t("page-developers-oracles-link")} - - {t("page-developers-oracle-desc")} - - {t("page-developers-scaling-link")} - - {t("page-developers-scaling-desc")} - - {t("page-developers-networking-layer-link")} - - {t("page-developers-networking-layer-desc")} - - {t("page-developers-data-structures-and-encoding-link")} - - - {t("page-developers-data-structures-and-encoding-desc")} -
    From 5a958ea452c88920af79561bef957e915b8561b3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 10 Jul 2025 10:47:48 -0700 Subject: [PATCH 307/368] feat: add video courses section additional adjustments/patches --- .../developers/_components/BuilderCard.tsx | 4 +- .../_components/VideoCourseCard.tsx | 47 ++++++++++++ .../_components/VideoCourseSwiper/index.tsx | 44 +++++++++++ .../_components/VideoCourseSwiper/lazy.tsx | 5 ++ .../_components/VideoCourseSwiper/loading.tsx | 5 ++ app/[locale]/developers/page.tsx | 53 ++++--------- app/[locale]/developers/types.ts | 11 ++- app/[locale]/developers/utils.ts | 72 +++++++++++++++++- .../developers/cyfrin-basic-banner.webp | Bin 0 -> 50372 bytes .../cyfrin-foundry-advanced-banner.webp | Bin 0 -> 97098 bytes .../cyfrin-foundry-fundamentals-banner.webp | Bin 0 -> 69272 bytes .../developers/cyfrin-security-banner.webp | Bin 0 -> 76888 bytes .../developers/cyfrin-solidity-banner.webp | Bin 0 -> 59932 bytes 13 files changed, 196 insertions(+), 45 deletions(-) create mode 100644 app/[locale]/developers/_components/VideoCourseCard.tsx create mode 100644 app/[locale]/developers/_components/VideoCourseSwiper/index.tsx create mode 100644 app/[locale]/developers/_components/VideoCourseSwiper/lazy.tsx create mode 100644 app/[locale]/developers/_components/VideoCourseSwiper/loading.tsx create mode 100644 public/images/developers/cyfrin-basic-banner.webp create mode 100644 public/images/developers/cyfrin-foundry-advanced-banner.webp create mode 100644 public/images/developers/cyfrin-foundry-fundamentals-banner.webp create mode 100644 public/images/developers/cyfrin-security-banner.webp create mode 100644 public/images/developers/cyfrin-solidity-banner.webp diff --git a/app/[locale]/developers/_components/BuilderCard.tsx b/app/[locale]/developers/_components/BuilderCard.tsx index f0a3a6d7541..b1468a0284b 100644 --- a/app/[locale]/developers/_components/BuilderCard.tsx +++ b/app/[locale]/developers/_components/BuilderCard.tsx @@ -17,7 +17,7 @@ const BuilderCard = ({ path, className }: BuildCardProps) => ( {path.imgAlt}
    @@ -33,7 +33,7 @@ const BuilderCard = ({ path, className }: BuildCardProps) => (

    {path.title}

    {path.description}

    - + {path.button} diff --git a/app/[locale]/developers/_components/VideoCourseCard.tsx b/app/[locale]/developers/_components/VideoCourseCard.tsx new file mode 100644 index 00000000000..fbf706ffab3 --- /dev/null +++ b/app/[locale]/developers/_components/VideoCourseCard.tsx @@ -0,0 +1,47 @@ +import { Image } from "@/components/Image" +import Link from "@/components/ui/Link" +import { Tag } from "@/components/ui/tag" + +import { cn } from "@/lib/utils/cn" + +import type { VideoCourse } from "../types" + +type BuildCardProps = { + course: VideoCourse + className?: string +} + +const VideoCourseCard = ({ course, className }: BuildCardProps) => ( + +
    + {course.imgAlt} +
    +
    + + {Math.round(course.hours)}-hour course + +

    + {course.title} +

    +

    {course.description}

    +
    + +) + +export default VideoCourseCard diff --git a/app/[locale]/developers/_components/VideoCourseSwiper/index.tsx b/app/[locale]/developers/_components/VideoCourseSwiper/index.tsx new file mode 100644 index 00000000000..a32ee844e13 --- /dev/null +++ b/app/[locale]/developers/_components/VideoCourseSwiper/index.tsx @@ -0,0 +1,44 @@ +"use client" + +import { Swiper, SwiperSlide } from "@/components/ui/swiper" + +import type { VideoCourse } from "../../types" +import VideoCourseCard from "../VideoCourseCard" + +import { useBreakpointValue } from "@/hooks/useBreakpointValue" + +type VideoCourseSwiperProps = { + courses: VideoCourse[] +} + +const VideoCourseSwiper = ({ courses }: VideoCourseSwiperProps) => { + const slidesPerView = useBreakpointValue({ + base: 1.25, + sm: 1.6, + md: 2.7, + lg: 4.4, + xl: 5, + }) + const spaceBetween = useBreakpointValue({ + base: 16, + sm: 12, + md: 16, + lg: 24, + xl: 32, + }) + + return ( + + {courses.map((course, idx) => ( + + + + ))} + + ) +} + +export default VideoCourseSwiper diff --git a/app/[locale]/developers/_components/VideoCourseSwiper/lazy.tsx b/app/[locale]/developers/_components/VideoCourseSwiper/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/developers/_components/VideoCourseSwiper/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/developers/_components/VideoCourseSwiper/loading.tsx b/app/[locale]/developers/_components/VideoCourseSwiper/loading.tsx new file mode 100644 index 00000000000..5256c8f6218 --- /dev/null +++ b/app/[locale]/developers/_components/VideoCourseSwiper/loading.tsx @@ -0,0 +1,5 @@ +import { SkeletonCardGrid } from "@/components/ui/skeleton" + +const Loading = () => + +export default Loading diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 199491a23f1..95e5aa64783 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -3,7 +3,6 @@ import { getTranslations } from "next-intl/server" import type { Lang } from "@/lib/types" import { ChildOnlyProp } from "@/lib/types" -import CalloutSSR from "@/components/CalloutSSR" import { CopyButton } from "@/components/CopyToClipboard" import FeedbackCard from "@/components/FeedbackCard" import HubHero from "@/components/Hero/HubHero" @@ -19,15 +18,15 @@ import { getMetadata } from "@/lib/utils/metadata" import { screens } from "@/lib/utils/screen" import BuilderCard from "./_components/BuilderCard" -import BuilderSwiper from "./_components/BuilderSwiper" +import BuilderSwiper from "./_components/BuilderSwiper/lazy" import SpeedRunCard from "./_components/SpeedRunCard" -import { getBuilderPaths } from "./utils" +import VideoCourseSwiper from "./_components/VideoCourseSwiper/lazy" +import { getBuilderPaths, getVideoCourses } from "./utils" import resourcesBanner from "@/public/images/developers/resources-banner.png" import scaffoldDebugScreenshot from "@/public/images/developers/scaffold-debug-screenshot.png" import stackExchangeScreenshot from "@/public/images/developers/stack-exchange-screenshot.png" import tutorialTagsBanner from "@/public/images/developers/tutorial-tags-banner.png" -import developersImage from "@/public/images/developers-eth-blocks.png" import dogeImage from "@/public/images/doge-computer.png" import heroImage from "@/public/images/heroes/developers-hub-hero.jpg" @@ -43,12 +42,6 @@ const Column = (props: ChildOnlyProp) => ( const RightColumn = (props: ChildOnlyProp) => (
    ) -const IntroColumn = (props: ChildOnlyProp) => ( -
    -) const DevelopersPage = async ({ params, @@ -71,6 +64,9 @@ const DevelopersPage = async ({ description: t("page-developers-speedrunethereum-description"), ctaLabel: t("page-developers-speedrunethereum-link"), } + + const courses = await getVideoCourses() + return (
    -
    - -

    {t("page-developers-about")}

    -

    - {t("page-developers-about-desc")} -

    - {t("page-developers-about-desc-2")} - - {t("page-developers-feedback")}{" "} - - {t("page-developers-discord")} - - -
    - -
    - - {t("page-developers-contribute")} - -
    -
    +
    +

    Video courses

    +

    + Want to kickstart your professional career in blockchain? These + courses will prepare you to get hired as blockchain developer. +

    + +
    + +
    diff --git a/app/[locale]/developers/types.ts b/app/[locale]/developers/types.ts index 43aa7143186..3a679d5dff6 100644 --- a/app/[locale]/developers/types.ts +++ b/app/[locale]/developers/types.ts @@ -1,12 +1,19 @@ import type { StaticImageData } from "next/image" import type { ReactNode } from "react" -export type DevelopersPath = { +type CardInfo = { imgSrc: StaticImageData imgAlt: string title: ReactNode description: ReactNode - url: string + href: string +} + +export type DevelopersPath = CardInfo & { button: ReactNode tag?: string } + +export type VideoCourse = CardInfo & { + hours: number +} diff --git a/app/[locale]/developers/utils.ts b/app/[locale]/developers/utils.ts index ef93d97f385..170e1bd3edc 100644 --- a/app/[locale]/developers/utils.ts +++ b/app/[locale]/developers/utils.ts @@ -1,7 +1,12 @@ import { getLocale, getTranslations } from "next-intl/server" -import type { DevelopersPath } from "./types" +import type { DevelopersPath, VideoCourse } from "./types" +import cyfrinBasicBanner from "@/public/images/developers/cyfrin-basic-banner.webp" +import cyfrinFoundryAdvancedBanner from "@/public/images/developers/cyfrin-foundry-advanced-banner.webp" +import cyfrinFoundryFundamentalsBanner from "@/public/images/developers/cyfrin-foundry-fundamentals-banner.webp" +import cyfrinSecurityBanner from "@/public/images/developers/cyfrin-security-banner.webp" +import cyfrinSolidityBanner from "@/public/images/developers/cyfrin-solidity-banner.webp" import speedrunNFT from "@/public/images/developers/speedrun-nft.png" import speedrunStakingApp from "@/public/images/developers/speedrun-staking-app.png" import speedrunTokenVendor from "@/public/images/developers/speedrun-token-vendor.png" @@ -19,7 +24,7 @@ export const getBuilderPaths = async (): Promise => { imgAlt: "Speedrun Ethereum NFT banner", title: "Simple NFT Example", // t("page-developers-learn"), description: "Create a public NFT to learn the basics of scaffold-eth.", // t("page-developers-learn-desc"), - url: "https://speedrunethereum.com/challenge/simple-nft-example", + href: "https://speedrunethereum.com/challenge/simple-nft-example", button: t("page-developers-start-quest"), tag: "Challenge #0", }, @@ -28,7 +33,7 @@ export const getBuilderPaths = async (): Promise => { imgAlt: "Speedrun Ethereum staking app banner", title: "Staking App", // t("page-developers-learn-tutorials"), description: "Write a smart contract where users pool funds together.", // t("page-developers-learn-tutorials-desc"), - url: "https://speedrunethereum.com/challenge/decentralized-staking", + href: "https://speedrunethereum.com/challenge/decentralized-staking", button: t("page-developers-start-quest"), tag: "Challenge #1", }, @@ -38,9 +43,68 @@ export const getBuilderPaths = async (): Promise => { title: "Create a token", // t("page-developers-resources"), description: "Build a digital currency and a smart conract that trades it.", // t("page-developers-start-desc"), - url: "https://speedrunethereum.com/challenge/token-vendor", + href: "https://speedrunethereum.com/challenge/token-vendor", button: t("page-developers-start-quest"), tag: "Challenge #2", }, ] } + +export const getVideoCourses = async (): Promise => { + // const locale = await getLocale() + // const t = await getTranslations({ + // locale, + // namespace: "page-developers-index", + // }) + + return [ + { + title: "Blockchain basics", + description: + "Learn how blockchains and smart contracts work, create a wallet, and sign your first transaction.", + hours: 3, + imgSrc: cyfrinBasicBanner, + imgAlt: "Cyfrin Updraft Blockchain basics course banner", + href: "https://updraft.cyfrin.io/courses/blockchain-basics", + }, + { + title: "Solidity smart contract development", + description: + "Solidity Programming is your gateway to web3 development in Ethereum compatible ecosystems.", + hours: 3, + imgSrc: cyfrinSolidityBanner, + imgAlt: + "Cyfrin Updraft Solidity smart contract development course banner", + href: "https://updraft.cyfrin.io/courses/solidity", + }, + { + title: "Foundry fundamentals", + description: + "Level up your Solidity development skills with Foundry and advanced web3 development concepts and tools.", + hours: 3, + imgSrc: cyfrinFoundryFundamentalsBanner, + imgAlt: "Cyfrin Updraft Foundry fundamentals course banner", + href: "https://updraft.cyfrin.io/courses/foundry", + }, + { + title: "Advanced foundry", + description: + "Master web3 development techniques with Advanced Foundry for Solidity smart contract development.", + hours: 3, + imgSrc: cyfrinFoundryAdvancedBanner, + imgAlt: "Cyfrin Updraft Advanced foundry course banner", + href: "https://updraft.cyfrin.io/courses/advanced-foundry", + }, + { + title: "Smart contract security", // "Learn smart contract auditing, security, and DeFi", + description: + "Start your career as a smart contract security researcher! Learn smart contract auditing and the best practices.", + hours: 3, + imgSrc: cyfrinSecurityBanner, + imgAlt: "Cyfrin Updraft Blockchain basics course banner", + href: "https://updraft.cyfrin.io/courses/security", + }, + ] + + return [] +} diff --git a/public/images/developers/cyfrin-basic-banner.webp b/public/images/developers/cyfrin-basic-banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..bb2ce75ead2f946f95a550f9dde7f3ae107fe408 GIT binary patch literal 50372 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

    MnvR$|#-S<9U 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 ZnkmEekW=&N_izjR9{5wh*PWXH002iPv&H}b literal 0 HcmV?d00001 diff --git a/public/images/developers/cyfrin-foundry-advanced-banner.webp b/public/images/developers/cyfrin-foundry-advanced-banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..e41e3c6ebb6befa83b2fb323e2256b9b53e9f703 GIT binary patch literal 97098 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 SB+Gj#`Pa`*v7{**Pyhf^vxW`; literal 0 HcmV?d00001 diff --git a/public/images/developers/cyfrin-foundry-fundamentals-banner.webp b/public/images/developers/cyfrin-foundry-fundamentals-banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..cc7a639a38205c64da263defa1591b90651295f4 GIT binary patch literal 69272 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 z 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 Dm-Rw= literal 0 HcmV?d00001 diff --git a/public/images/developers/cyfrin-security-banner.webp b/public/images/developers/cyfrin-security-banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..285e0cd52c234784461de61e09564de64cea3fc0 GIT binary patch literal 76888 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 GzyJV}$LA&h literal 0 HcmV?d00001 diff --git a/public/images/developers/cyfrin-solidity-banner.webp b/public/images/developers/cyfrin-solidity-banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..fbf25ee9ff471bd8b11b357fe2378a3562cf4317 GIT binary patch literal 59932 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 A`2YX_ literal 0 HcmV?d00001 From 9fd1bec35eded0947f203ddc6427e7f1a315d32b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 10 Jul 2025 13:18:25 -0700 Subject: [PATCH 308/368] feat: template hackathons, add founders refactor: restructures html architecture using Section's and id's, wrapping full page in MainArticle fix: section background colors and spacing --- app/[locale]/developers/page.tsx | 348 ++++++++++++++++++------------- 1 file changed, 208 insertions(+), 140 deletions(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 95e5aa64783..bab97a5ae23 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -13,7 +13,10 @@ import { Card } from "@/components/ui/card" import { VStack } from "@/components/ui/flex" import Link from "@/components/ui/Link" import InlineLink from "@/components/ui/Link" +import { Section } from "@/components/ui/section" +import { SkeletonCardGrid } from "@/components/ui/skeleton" +import { cn } from "@/lib/utils/cn" import { getMetadata } from "@/lib/utils/metadata" import { screens } from "@/lib/utils/screen" @@ -30,8 +33,6 @@ import tutorialTagsBanner from "@/public/images/developers/tutorial-tags-banner. import dogeImage from "@/public/images/doge-computer.png" import heroImage from "@/public/images/heroes/developers-hub-hero.jpg" -const H2 = (props: ChildOnlyProp) =>

    - const H3 = (props: ChildOnlyProp) =>

    const Text = (props: ChildOnlyProp) =>

    @@ -79,27 +80,38 @@ const DevelopersPage = async ({ /> -

    {t("page-developers-get-started")}

    - - {/* Desktop */} -
    - {paths.map((path, idx) => ( - - ))} +
    +

    {t("page-developers-get-started")}

    - -
    +

    + Everything you need to learn and build your first apps on Ethereum +

    + {/* Desktop */} +
    + {paths.map((path, idx) => ( + + ))} - {/* Mobile */} -
    - -
    + +
    -
    + {/* Mobile */} +
    + +
    +

    + +

    Helpful developer resources

    {/* Quickstart your idea */} - + Scaffold-ETH 2 debug screenshot {/* Get help */} - + Ethereum Stack Exchange screenshot {/* Resources */} - + Banner showing four resource app icons {/* Tutorials */} - + Banner displaying multiple learning topics in a tag cloud
    -
    +

    -
    +

    Video courses

    Want to kickstart your professional career in blockchain? These @@ -243,126 +255,182 @@ const DevelopersPage = async ({

    -
    +

    + +
    +
    +

    {t("page-developers-explore-documentation")}

    +

    Understand the core concepts of Ethereum and blockchains

    +
    + +
    + +

    {t("page-developers-docs-introductions")}

    + + {t("page-developers-intro-eth-link")} + + {t("page-developers-into-eth-desc")} + + + {t("page-developers-intro-ether-link")} + + {t("page-developers-intro-ether-desc")} + + + {t("page-developers-intro-dapps-link")} + + {t("page-developers-intro-dapps-desc")} + + + {t("page-developers-intro-stack")} + + {t("page-developers-intro-stack-desc")} + + + {t("page-developers-web3-link")} + + {t("page-developers-web3-desc")} + + + {t("page-developers-languages")} + + {t("page-developers-language-desc")} + {t("page-assets-doge")} +
    + +

    {t("page-developers-fundamentals")}

    + + {t("page-developers-accounts-link")} + + {t("page-developers-account-desc")} + + + {t("page-developers-transactions-link")} + + {t("page-developers-transactions-desc")} + + + {t("page-developers-blocks-link")} + + {t("page-developers-block-desc")} + + + {t("page-developers-evm-link")} + + {t("page-developers-evm-desc")} + + + {t("page-developers-gas-link")} + + {t("page-developers-gas-desc")} + + + {t("page-developers-node-clients-link")} + + {t("page-developers-node-clients-desc")} + + + {t("page-developers-networks-link")} + + {t("page-developers-networks-desc")} +
    + +

    {t("page-developers-stack")}

    + + {t("page-developers-smart-contracts-link")} + + {t("page-developers-smart-contracts-desc")} + + {t("page-developers-frameworks-link")} + + {t("page-developers-frameworks-desc")} + + {t("page-developers-js-libraries-link")} + + {t("page-developers-js-libraries-desc")} + + {t("page-developers-api-link")} + + {t("page-developers-api-desc")} + + {t("page-developers-block-explorers-link")} + + {t("page-developers-block-explorers-desc")} + + {t("page-developers-smart-contract-security-link")} + + {t("page-developers-smart-contract-security-desc")} + + {t("page-developers-storage-link")} + + {t("page-developers-storage-desc")} + + {t("page-developers-dev-env-link")} + + {t("page-developers-dev-env-desc")} +
    +
    +
    + +
    +

    Join hackathons (TODO)

    +

    + Hackathons are great opportunities to network and learn from others + as well as start projects and earn prizes +

    + +
    + + Visit EthGlobal + +
    +
    + +
    +
    +
    +
    +

    Are you a founder?

    +

    + Have a project idea already or working on a prototype? Explore + how to take your project to the next step. Many other + organizations that provide developers with funding. +

    +
    +
    + + Get in touch + + + See grant options + +
    +
    +
    +
    -
    -
    -

    {t("page-developers-explore-documentation")}

    -
    - -
    - -

    {t("page-developers-docs-introductions")}

    - - {t("page-developers-intro-eth-link")} - - {t("page-developers-into-eth-desc")} - - - {t("page-developers-intro-ether-link")} - - {t("page-developers-intro-ether-desc")} - - - {t("page-developers-intro-dapps-link")} - - {t("page-developers-intro-dapps-desc")} - - - {t("page-developers-intro-stack")} - - {t("page-developers-intro-stack-desc")} - - - {t("page-developers-web3-link")} - - {t("page-developers-web3-desc")} - - - {t("page-developers-languages")} - - {t("page-developers-language-desc")} - {t("page-assets-doge")} -
    - -

    {t("page-developers-fundamentals")}

    - - {t("page-developers-accounts-link")} - - {t("page-developers-account-desc")} - - - {t("page-developers-transactions-link")} - - {t("page-developers-transactions-desc")} - - - {t("page-developers-blocks-link")} - - {t("page-developers-block-desc")} - - - {t("page-developers-evm-link")} - - {t("page-developers-evm-desc")} - - - {t("page-developers-gas-link")} - - {t("page-developers-gas-desc")} - - - {t("page-developers-node-clients-link")} - - {t("page-developers-node-clients-desc")} - - - {t("page-developers-networks-link")} - - {t("page-developers-networks-desc")} -
    - -

    {t("page-developers-stack")}

    - - {t("page-developers-smart-contracts-link")} - - {t("page-developers-smart-contracts-desc")} - - {t("page-developers-frameworks-link")} - - {t("page-developers-frameworks-desc")} - - {t("page-developers-js-libraries-link")} - - {t("page-developers-js-libraries-desc")} - - {t("page-developers-api-link")} - - {t("page-developers-api-desc")} - - {t("page-developers-block-explorers-link")} - - {t("page-developers-block-explorers-desc")} - - {t("page-developers-smart-contract-security-link")} - - {t("page-developers-smart-contract-security-desc")} - - {t("page-developers-storage-link")} - - {t("page-developers-storage-desc")} - - {t("page-developers-dev-env-link")} - - {t("page-developers-dev-env-desc")} -
    -
    -
    ) From 5161e40814cc4558f06a81b94e5ccf866216e4cf Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 10 Jul 2025 14:44:08 -0700 Subject: [PATCH 309/368] fix: resources links --- app/[locale]/developers/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index bab97a5ae23..7b42551a87e 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -210,7 +210,7 @@ const DevelopersPage = async ({ Play with code @@ -237,7 +237,7 @@ const DevelopersPage = async ({ View tutorials From 32b3202e1ea7e27831ceb47396f88788dcfdf2f7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 10 Jul 2025 14:47:09 -0700 Subject: [PATCH 310/368] fix: course hours lengths --- app/[locale]/developers/utils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/[locale]/developers/utils.ts b/app/[locale]/developers/utils.ts index 170e1bd3edc..3aba7384918 100644 --- a/app/[locale]/developers/utils.ts +++ b/app/[locale]/developers/utils.ts @@ -71,7 +71,7 @@ export const getVideoCourses = async (): Promise => { title: "Solidity smart contract development", description: "Solidity Programming is your gateway to web3 development in Ethereum compatible ecosystems.", - hours: 3, + hours: 5, imgSrc: cyfrinSolidityBanner, imgAlt: "Cyfrin Updraft Solidity smart contract development course banner", @@ -81,7 +81,7 @@ export const getVideoCourses = async (): Promise => { title: "Foundry fundamentals", description: "Level up your Solidity development skills with Foundry and advanced web3 development concepts and tools.", - hours: 3, + hours: 10, imgSrc: cyfrinFoundryFundamentalsBanner, imgAlt: "Cyfrin Updraft Foundry fundamentals course banner", href: "https://updraft.cyfrin.io/courses/foundry", @@ -90,7 +90,7 @@ export const getVideoCourses = async (): Promise => { title: "Advanced foundry", description: "Master web3 development techniques with Advanced Foundry for Solidity smart contract development.", - hours: 3, + hours: 13, imgSrc: cyfrinFoundryAdvancedBanner, imgAlt: "Cyfrin Updraft Advanced foundry course banner", href: "https://updraft.cyfrin.io/courses/advanced-foundry", @@ -99,7 +99,7 @@ export const getVideoCourses = async (): Promise => { title: "Smart contract security", // "Learn smart contract auditing, security, and DeFi", description: "Start your career as a smart contract security researcher! Learn smart contract auditing and the best practices.", - hours: 3, + hours: 24, imgSrc: cyfrinSecurityBanner, imgAlt: "Cyfrin Updraft Blockchain basics course banner", href: "https://updraft.cyfrin.io/courses/security", From 32832018fa77f236b0ed51b33435c319d46db9b7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:32:31 -0700 Subject: [PATCH 311/368] i18n: extract strings for translation --- app/[locale]/developers/page.tsx | 61 +++++++++------------ app/[locale]/developers/utils.ts | 73 +++++++++++-------------- src/intl/en/page-developers-index.json | 75 ++++++++++++++++---------- 3 files changed, 104 insertions(+), 105 deletions(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 7b42551a87e..e1df31f6855 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -83,9 +83,7 @@ const DevelopersPage = async ({

    {t("page-developers-get-started")}

    -

    - Everything you need to learn and build your first apps on Ethereum -

    +

    {t("page-developers-build-section-desc")}

    {/* Desktop */}
    {paths.map((path, idx) => ( @@ -108,7 +106,9 @@ const DevelopersPage = async ({ "-mx-8 w-screen max-w-screen-2xl bg-background-highlight px-8 py-10 md:py-20" )} > -

    Helpful developer resources

    +

    + {t("page-developers-resources-section-title")} +

    {/* Quickstart your idea */} @@ -165,10 +165,9 @@ const DevelopersPage = async ({ className="max-h-56 w-full object-cover object-top" />
    -

    Get help

    +

    {t("page-developers-get-help-title")}

    - If you are stuck or need help solving problems, be sure to ask - for guidance. + {t("page-developers-get-help-desc")}

    @@ -178,14 +177,14 @@ const DevelopersPage = async ({ isSecondary href="https://ethereum.stackexchange.com/" > - Stack Exchange + {t("page-developers-stack-exchange")} - Ask AI + {t("page-developers-ask-ai")}
    @@ -199,10 +198,9 @@ const DevelopersPage = async ({ className="max-h-56 w-full object-contain" />
    -

    Resources

    +

    {t("page-developers-resources-title")}

    - Want to experiment first, ask questions later? Check sandboxes, - bootcamps etc. + {t("page-developers-resources-desc")}

    @@ -212,7 +210,7 @@ const DevelopersPage = async ({ isSecondary href="/developers/learning-tools/" > - Play with code + {t("page-developers-play-code")} @@ -226,10 +224,9 @@ const DevelopersPage = async ({ className="max-h-56 w-full object-contain" />
    -

    Tutorials

    +

    {t("page-developers-tutorials-title")}

    - Learn Ethereum development step-by-step from builders who have - already done it. + {t("page-developers-tutorials-desc")}

    @@ -239,18 +236,15 @@ const DevelopersPage = async ({ isSecondary href="/developers/tutorials/" > - View tutorials + {t("page-developers-learn-tutorials-cta")}
    -

    Video courses

    -

    - Want to kickstart your professional career in blockchain? These - courses will prepare you to get hired as blockchain developer. -

    +

    {t("page-developers-video-courses-title")}

    +

    {t("page-developers-video-courses-desc")}

    @@ -266,7 +260,7 @@ const DevelopersPage = async ({ >

    {t("page-developers-explore-documentation")}

    -

    Understand the core concepts of Ethereum and blockchains

    +

    {t("page-developers-docs-section-desc")}

    @@ -383,15 +377,12 @@ const DevelopersPage = async ({
    -

    Join hackathons (TODO)

    -

    - Hackathons are great opportunities to network and learn from others - as well as start projects and earn prizes -

    +

    {t("page-developers-hackathons-title")}

    +

    {t("page-developers-hackathons-desc")}

    - Visit EthGlobal + {t("page-developers-visit-ethglobal")}
    @@ -407,23 +398,19 @@ const DevelopersPage = async ({ >
    -

    Are you a founder?

    -

    - Have a project idea already or working on a prototype? Explore - how to take your project to the next step. Many other - organizations that provide developers with funding. -

    +

    {t("page-developers-founders-title")}

    +

    {t("page-developers-founders-desc")}

    - Get in touch + {t("page-developers-get-in-touch")} - See grant options + {t("page-developers-see-grant-options")}
    diff --git a/app/[locale]/developers/utils.ts b/app/[locale]/developers/utils.ts index 3aba7384918..40d3041bf6e 100644 --- a/app/[locale]/developers/utils.ts +++ b/app/[locale]/developers/utils.ts @@ -21,90 +21,81 @@ export const getBuilderPaths = async (): Promise => { return [ { imgSrc: speedrunNFT, - imgAlt: "Speedrun Ethereum NFT banner", - title: "Simple NFT Example", // t("page-developers-learn"), - description: "Create a public NFT to learn the basics of scaffold-eth.", // t("page-developers-learn-desc"), + imgAlt: t("page-developers-speedrun-nft-alt"), + title: t("page-developers-speedrun-nft-title"), + description: t("page-developers-speedrun-nft-desc"), href: "https://speedrunethereum.com/challenge/simple-nft-example", button: t("page-developers-start-quest"), - tag: "Challenge #0", + tag: t("page-developers-speedrun-challenge-0"), }, { imgSrc: speedrunStakingApp, - imgAlt: "Speedrun Ethereum staking app banner", - title: "Staking App", // t("page-developers-learn-tutorials"), - description: "Write a smart contract where users pool funds together.", // t("page-developers-learn-tutorials-desc"), + imgAlt: t("page-developers-speedrun-staking-alt"), + title: t("page-developers-speedrun-staking-title"), + description: t("page-developers-speedrun-staking-desc"), href: "https://speedrunethereum.com/challenge/decentralized-staking", button: t("page-developers-start-quest"), - tag: "Challenge #1", + tag: t("page-developers-speedrun-challenge-1"), }, { imgSrc: speedrunTokenVendor, - imgAlt: "Speedrun Ethereum token vendor project banner", - title: "Create a token", // t("page-developers-resources"), - description: - "Build a digital currency and a smart conract that trades it.", // t("page-developers-start-desc"), + imgAlt: t("page-developers-speedrun-token-alt"), + title: t("page-developers-speedrun-token-title"), + description: t("page-developers-speedrun-token-desc"), href: "https://speedrunethereum.com/challenge/token-vendor", button: t("page-developers-start-quest"), - tag: "Challenge #2", + tag: t("page-developers-speedrun-challenge-2"), }, ] } export const getVideoCourses = async (): Promise => { - // const locale = await getLocale() - // const t = await getTranslations({ - // locale, - // namespace: "page-developers-index", - // }) + const locale = await getLocale() + const t = await getTranslations({ + locale, + namespace: "page-developers-index", + }) return [ { - title: "Blockchain basics", - description: - "Learn how blockchains and smart contracts work, create a wallet, and sign your first transaction.", + title: t("page-developers-course-blockchain-basics-title"), + description: t("page-developers-course-blockchain-basics-desc"), hours: 3, imgSrc: cyfrinBasicBanner, - imgAlt: "Cyfrin Updraft Blockchain basics course banner", + imgAlt: t("page-developers-course-blockchain-basics-alt"), href: "https://updraft.cyfrin.io/courses/blockchain-basics", }, { - title: "Solidity smart contract development", - description: - "Solidity Programming is your gateway to web3 development in Ethereum compatible ecosystems.", + title: t("page-developers-course-solidity-title"), + description: t("page-developers-course-solidity-desc"), hours: 5, imgSrc: cyfrinSolidityBanner, - imgAlt: - "Cyfrin Updraft Solidity smart contract development course banner", + imgAlt: t("page-developers-course-solidity-alt"), href: "https://updraft.cyfrin.io/courses/solidity", }, { - title: "Foundry fundamentals", - description: - "Level up your Solidity development skills with Foundry and advanced web3 development concepts and tools.", + title: t("page-developers-course-foundry-fundamentals-title"), + description: t("page-developers-course-foundry-fundamentals-desc"), hours: 10, imgSrc: cyfrinFoundryFundamentalsBanner, - imgAlt: "Cyfrin Updraft Foundry fundamentals course banner", + imgAlt: t("page-developers-course-foundry-fundamentals-alt"), href: "https://updraft.cyfrin.io/courses/foundry", }, { - title: "Advanced foundry", - description: - "Master web3 development techniques with Advanced Foundry for Solidity smart contract development.", + title: t("page-developers-course-advanced-foundry-title"), + description: t("page-developers-course-advanced-foundry-desc"), hours: 13, imgSrc: cyfrinFoundryAdvancedBanner, - imgAlt: "Cyfrin Updraft Advanced foundry course banner", + imgAlt: t("page-developers-course-advanced-foundry-alt"), href: "https://updraft.cyfrin.io/courses/advanced-foundry", }, { - title: "Smart contract security", // "Learn smart contract auditing, security, and DeFi", - description: - "Start your career as a smart contract security researcher! Learn smart contract auditing and the best practices.", + title: t("page-developers-course-security-title"), + description: t("page-developers-course-security-desc"), hours: 24, imgSrc: cyfrinSecurityBanner, - imgAlt: "Cyfrin Updraft Blockchain basics course banner", + imgAlt: t("page-developers-course-security-alt"), href: "https://updraft.cyfrin.io/courses/security", }, ] - - return [] } diff --git a/src/intl/en/page-developers-index.json b/src/intl/en/page-developers-index.json index f508a749847..93f48fbd9fe 100644 --- a/src/intl/en/page-developers-index.json +++ b/src/intl/en/page-developers-index.json @@ -1,36 +1,25 @@ { "page-developer-meta-title": "Ethereum Developer Resources", - "page-developers-about": "About these developer resources", - "page-developers-about-desc": "ethereum.org is here to help you build with Ethereum with documentation on foundational concepts as well as the development stack. Plus there are tutorials to get you up and running.", - "page-developers-about-desc-2": "Inspired by the Mozilla Developer Network, we thought Ethereum needed a place to house great developer content and resources. Like our friends at Mozilla, everything here is open-source and ready for you to extend and improve.", "page-developers-account-desc": "Contracts or people on the network", "page-developers-accounts-link": "Accounts", - "page-developers-advanced": "Advanced", "page-developers-api-desc": "Using libraries to interact with smart contracts", "page-developers-api-link": "Backend APIs", "page-developers-block-desc": "Batches of transactions added to the blockchain", "page-developers-block-explorers-desc": "Your portal to Ethereum data", "page-developers-block-explorers-link": "Block explorers", "page-developers-blocks-link": "Blocks", - "page-developers-browse-tutorials": "Browse tutorials", - "page-developers-choose-stack": "Choose your stack", - "page-developers-contribute": "Contribute", "page-developers-dev-env-desc": "IDEs that are suitable for dapp development", "page-developers-dev-env-link": "Development environments", - "page-developers-discord": "Join Discord", "page-developers-docs-introductions": "Introductions", "page-developers-evm-desc": "The computer that processes transactions", "page-developers-evm-link": "The Ethereum virtual machine (EVM)", "page-developers-explore-documentation": "Explore the documentation", - "page-developers-feedback": "If you have any feedback, reach out to us via a GitHub issue or on our Discord server.", "page-developers-frameworks-desc": "Tools for helping speed up development", "page-developers-frameworks-link": "Development frameworks", "page-developers-fundamentals": "Fundamentals", "page-developers-gas-desc": "Ether needed to power transactions", "page-developers-gas-link": "Gas", "page-developers-get-started": "What do you want to build today?", - "page-developers-improve-ethereum": "Help us make ethereum.org better", - "page-developers-improve-ethereum-desc": "Like ethereum.org, these docs are a community effort. Create a PR if you see mistakes, room for improvement, or new opportunities to help Ethereum developers.", "page-developers-into-eth-desc": "An introduction to blockchain and Ethereum", "page-developers-intro-ether-desc": "An introduction to cryptocurrency and Ether", "page-developers-intro-dapps-desc": "An introduction to decentralized applications", @@ -50,30 +39,18 @@ "page-developers-learn-tutorials-cta": "View tutorials", "page-developers-learn-tutorials-desc": "Learn Ethereum development step-by-step from builders who have already done it.", "page-developers-meta-desc": "Documentation, tutorials, and tools for developers building on Ethereum.", - "page-developers-mev-desc": "An introduction to maximal extractable value (MEV)", - "page-developers-mev-link": "Maximal extractable value (MEV)", - "page-developers-mining-desc": "How new blocks are created and consensus was reached using proof-of-work", - "page-developers-mining-link": "Mining", - "page-developers-mining-algorithms-desc": "Information on Ethereum's mining algorithms", - "page-developers-mining-algorithms-link": "Mining algorithms", "page-developers-networks-desc": "An overview of Mainnet and the test networks", "page-developers-networks-link": "Networks", "page-developers-node-clients-desc": "How blocks and transactions are verified in the network", "page-developers-node-clients-link": "Nodes and clients", - "page-developers-oracle-desc": "Getting offchain data into your smart contracts", - "page-developers-oracles-link": "Oracles", "page-developers-play-code": "Play with code", "page-developers-quickstart-scaffold-subtext": "Bootstrap your Ethereum app stack in seconds.", "page-developers-quickstart-scaffold-docs": "Read Scaffold-ETH 2", "page-developers-read-docs": "Read the docs", "page-developers-start-quest": "Start quest", "page-developers-resources": "Resources", - "page-developers-scaling-desc": "Solutions for faster transactions", - "page-developers-scaling-link": "Scaling", "page-developers-smart-contract-security-desc": "Security measures to consider during development of smart contracts", "page-developers-smart-contract-security-link": "Smart contract security", - "page-developers-set-up": "Set up local environment", - "page-developers-setup-desc": "Get your stack ready for building by configuring a development environment.", "page-developers-smart-contracts-desc": "The logic behind dapps – self-executing agreements", "page-developers-smart-contracts-link": "Smart contracts", "page-developers-solidity-docs": "Read the Solidity docs", @@ -82,15 +59,12 @@ "page-developers-speedrunethereum-link": "SpeedRun Ethereum", "page-developers-stack": "The stack", "page-developers-start": "Challenges and mentorship", - "page-developers-start-desc": "Want to experiment first, ask questions later?", "page-developers-storage-desc": "How to handle dapp storage", "page-developers-storage-link": "Storage", "page-developers-subtitle": "A builders manual for Ethereum. Everything you need to build and scale your onchain app.", "page-developers-title-1": "Ethereum", "page-developers-title-2": "developer", "page-developers-title-3": "resources", - "page-developers-token-standards-desc": "An overview of accepted token standards", - "page-developers-token-standards-link": "Token standards", "page-developers-transactions-desc": "The way Ethereum state changes", "page-developers-transactions-link": "Transactions", "page-developers-web3-desc": "How the web3 world of development is different", @@ -102,5 +76,52 @@ "page-developers-data-structures-and-encoding-link": "Data structures and encoding", "page-developers-data-structures-and-encoding-desc": "Introduction to the data structures and encoding schema used in the Ethereum stack", "alt-eth-blocks": "Illustration of blocks being organized like an ETH symbol", - "page-assets-doge": "Doge using dapps" + "page-assets-doge": "Doge using dapps", + "page-developers-build-section-desc": "Everything you need to learn and build your first apps on Ethereum", + "page-developers-resources-section-title": "Helpful developer resources", + "page-developers-get-help-title": "Get help", + "page-developers-get-help-desc": "If you are stuck or need help solving problems, be sure to ask for guidance.", + "page-developers-stack-exchange": "Stack Exchange", + "page-developers-ask-ai": "Ask AI", + "page-developers-resources-title": "Resources", + "page-developers-resources-desc": "Want to experiment first, ask questions later? Check sandboxes, bootcamps etc.", + "page-developers-tutorials-title": "Tutorials", + "page-developers-tutorials-desc": "Learn Ethereum development step-by-step from builders who have already done it.", + "page-developers-video-courses-title": "Video courses", + "page-developers-video-courses-desc": "Want to kickstart your professional career in blockchain? These courses will prepare you to get hired as blockchain developer.", + "page-developers-docs-section-desc": "Understand the core concepts of Ethereum and blockchains", + "page-developers-hackathons-title": "Join hackathons (TODO)", + "page-developers-hackathons-desc": "Hackathons are great opportunities to network and learn from others as well as start projects and earn prizes", + "page-developers-visit-ethglobal": "Visit EthGlobal", + "page-developers-founders-title": "Are you a founder?", + "page-developers-founders-desc": "Have a project idea already or working on a prototype? Explore how to take your project to the next step. Many other organizations that provide developers with funding.", + "page-developers-get-in-touch": "Get in touch", + "page-developers-see-grant-options": "See grant options", + "page-developers-speedrun-nft-alt": "Speedrun Ethereum NFT banner", + "page-developers-speedrun-nft-title": "Simple NFT Example", + "page-developers-speedrun-nft-desc": "Create a public NFT to learn the basics of scaffold-eth.", + "page-developers-speedrun-challenge-0": "Challenge #0", + "page-developers-speedrun-staking-alt": "Speedrun Ethereum staking app banner", + "page-developers-speedrun-staking-title": "Staking App", + "page-developers-speedrun-staking-desc": "Write a smart contract where users pool funds together.", + "page-developers-speedrun-challenge-1": "Challenge #1", + "page-developers-speedrun-token-alt": "Speedrun Ethereum token vendor project banner", + "page-developers-speedrun-token-title": "Create a token", + "page-developers-speedrun-token-desc": "Build a digital currency and a smart contract that trades it.", + "page-developers-speedrun-challenge-2": "Challenge #2", + "page-developers-course-blockchain-basics-title": "Blockchain basics", + "page-developers-course-blockchain-basics-desc": "Learn how blockchains and smart contracts work, create a wallet, and sign your first transaction.", + "page-developers-course-blockchain-basics-alt": "Cyfrin Updraft Blockchain basics course banner", + "page-developers-course-solidity-title": "Solidity smart contract development", + "page-developers-course-solidity-desc": "Solidity Programming is your gateway to web3 development in Ethereum compatible ecosystems.", + "page-developers-course-solidity-alt": "Cyfrin Updraft Solidity smart contract development course banner", + "page-developers-course-foundry-fundamentals-title": "Foundry fundamentals", + "page-developers-course-foundry-fundamentals-desc": "Level up your Solidity development skills with Foundry and advanced web3 development concepts and tools.", + "page-developers-course-foundry-fundamentals-alt": "Cyfrin Updraft Foundry fundamentals course banner", + "page-developers-course-advanced-foundry-title": "Advanced foundry", + "page-developers-course-advanced-foundry-desc": "Master web3 development techniques with Advanced Foundry for Solidity smart contract development.", + "page-developers-course-advanced-foundry-alt": "Cyfrin Updraft Advanced foundry course banner", + "page-developers-course-security-title": "Smart contract security", + "page-developers-course-security-desc": "Start your career as a smart contract security researcher! Learn smart contract auditing and the best practices.", + "page-developers-course-security-alt": "Cyfrin Updraft Blockchain basics course banner" } From 6991fd6c2cd24995ff67838c08e62680fa0da384 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 5 Jul 2025 10:48:00 -0700 Subject: [PATCH 312/368] feat: add glow button variant --- src/components/ui/buttons/Button.tsx | 64 ++++++++++++++++++++-------- src/styles/semantic-tokens.css | 10 +++++ tailwind.config.ts | 9 ++++ 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/components/ui/buttons/Button.tsx b/src/components/ui/buttons/Button.tsx index 774e0703a49..45655341271 100644 --- a/src/components/ui/buttons/Button.tsx +++ b/src/components/ui/buttons/Button.tsx @@ -2,6 +2,7 @@ import * as React from "react" import { cva, type VariantProps } from "class-variance-authority" +import { Sparkles } from "lucide-react" import { Slot } from "@radix-ui/react-slot" import { cn } from "@/lib/utils/cn" @@ -10,6 +11,26 @@ import { scrollIntoView } from "@/lib/utils/scrollIntoView" import { BaseLink, type LinkProps } from "../Link" +const variants = { + variant: { + solid: cn( + "text-white bg-primary-action border-transparent", + "hover:!text-white hover:bg-primary-action-hover", // Hover + "active:bg-primary-action-hover", // Active + "disabled:bg-disabled disabled:text-background" // Disabled + ), + outline: "", // Base styling + ghost: "border-transparent hover:shadow-none", + link: "border-transparent hover:shadow-none underline !min-h-0 !py-0 !px-1 active:text-primary", + glow: "group relative rounded-lg border-none p-px text-body [&_[data-label='inner']]:!rounded-[7px]", + }, + size: { + lg: "text-lg py-3 px-8 [&>svg]:size-6 [&>svg]:text-2xl rounded-lg focus-visible:rounded-lg", + md: "min-h-10.5 px-4 py-2 [&>svg]:size-6 [&>svg]:text-2xl", + sm: "text-xs min-h-[31px] py-1.5 px-2 [&>svg]:size-4 [&>svg]:text-md", + }, +} + const buttonVariants = cva( cn( // Sizing and positioning classes: @@ -28,24 +49,7 @@ const buttonVariants = cva( "[&[data-secondary='true']]:text-body" ), { - variants: { - variant: { - solid: cn( - "text-white bg-primary-action border-transparent", - "hover:!text-white hover:bg-primary-action-hover", // Hover - "active:bg-primary-action-hover", // Active - "disabled:bg-disabled disabled:text-background" // Disabled - ), - outline: "", // Base styling - ghost: "border-transparent hover:shadow-none", - link: "border-transparent hover:shadow-none underline !min-h-0 !py-0 !px-1 active:text-primary", - }, - size: { - lg: "text-lg py-3 px-8 [&>svg]:text-2xl rounded-lg focus-visible:rounded-lg", - md: "min-h-10.5 px-4 py-2 [&>svg]:text-2xl", - sm: "text-xs min-h-[31px] py-1.5 px-2 [&>svg]:text-md", - }, - }, + variants, defaultVariants: { variant: "solid", size: "md", @@ -110,6 +114,30 @@ const Button = React.forwardRef( onClick?.(e) } + if (variant === "glow") { + const { children, ...buttonProps } = props + return ( + + ) + } const Comp = asChild ? Slot : "button" return ( diff --git a/src/styles/semantic-tokens.css b/src/styles/semantic-tokens.css index 2ecc4b39c38..e76d818472d 100644 --- a/src/styles/semantic-tokens.css +++ b/src/styles/semantic-tokens.css @@ -97,6 +97,16 @@ --card-gradient-secondary-hover: linear-gradient(95deg, rgba(211, 145, 242, 0.2) 0%, rgba(159, 43, 212, 0.2) 102.78%); --ten-year-gradient: linear-gradient(100deg, #F6C9EA 55.38%, #C7A9F1 110.54%); + /* Rainbow gradients */ + --rainbow-gradient: conic-gradient( + from 0deg, + hsla(var(--primary)), + hsla(var(--accent-b)), + hsla(var(--accent-a)), + hsla(var(--accent-c)), + hsla(var(--primary)) + ); + /* Shadows */ --shadow-color-a: hsla(var(--purple-800), 0.02); --shadow-color-b: hsla(var(--red-800), 0.04); diff --git a/tailwind.config.ts b/tailwind.config.ts index 8e6e4cef472..894005e3fb4 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -237,6 +237,7 @@ const config = { "card-gradient-secondary": "var(--card-gradient-secondary)", "card-gradient-secondary-hover": "var(--card-gradient-secondary-hover)", "ten-year-gradient": "var(--ten-year-gradient)", + "rainbow-gradient": "var(--rainbow-gradient)", }, boxShadow: { "table-box": "var(--table-box-shadow)", @@ -306,6 +307,12 @@ const config = { "0%": { opacity: "0" }, "100%": { opacity: "1" }, }, + "rotate-back-and-forth": { + "0%": { transform: "rotate(0deg)" }, + "25%": { transform: "rotate(5deg)" }, + "75%": { transform: "rotate(-5deg)" }, + "100%": { transform: "rotate(0deg)" }, + }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", @@ -320,9 +327,11 @@ const config = { "spin-18": "spin 36s linear infinite", "counter-spin-18": "spin 36s linear infinite reverse", "spin-9": "spin 18s linear infinite", + "spin-4": "spin 4s linear infinite", "counter-spin-9": "spin 18s linear infinite reverse", "pulse-light": "pulse-light 2s cubic-bezier(0.4, 0, 0.6, 1) infinite", "fade-in": "fade-in 150ms ease-in-out", + wave: "rotate-back-and-forth 1s linear infinite", }, // Add custom border-radius tailwinds extension for "4xl" as "2rem" borderRadius: { From aef6519dbd717499a37710952bcf0e209739dc57 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:35:40 -0700 Subject: [PATCH 313/368] temp: hide AI button --- app/[locale]/developers/page.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index e1df31f6855..6d1e6164888 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -179,13 +179,13 @@ const DevelopersPage = async ({ > {t("page-developers-stack-exchange")} - {t("page-developers-ask-ai")} - + */}
    From 3842a5343d39be4595097e40a67f6110c87aae0c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 02:19:23 +0000 Subject: [PATCH 314/368] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d06ef03c5ee..6fe66165fdb 100644 --- a/README.md +++ b/README.md @@ -1994,6 +1994,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Brian Rossetti
    Brian Rossetti

    🚧 💻 + Antoine-Sparenberg
    Antoine-Sparenberg

    🚧 From 09f7529240be5bbac14899eff4c4e12177bfc921 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 02:19:24 +0000 Subject: [PATCH 315/368] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 75877571802..6507b3d36dc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12792,6 +12792,15 @@ "maintenance", "code" ] + }, + { + "login": "Antoine-Sparenberg", + "name": "Antoine-Sparenberg", + "avatar_url": "https://avatars.githubusercontent.com/u/128523213?v=4", + "profile": "https://github.com/Antoine-Sparenberg", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 7f576b9d44dca4fb19dc708d583c8181e628e4cd Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 10 Jul 2025 20:02:11 -0700 Subject: [PATCH 316/368] chore: upres tag banner; size adjust --- app/[locale]/developers/page.tsx | 2 +- .../developers/tutorial-tags-banner.png | Bin 48450 -> 30722 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 6d1e6164888..2caf4eb6b6c 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -195,7 +195,7 @@ const DevelopersPage = async ({ src={resourcesBanner} alt="Banner showing four resource app icons" sizes={`(max-width: ${screens.sm}) 100vw, calc(50vw - 14rem)`} - className="max-h-56 w-full object-contain" + className="-my-2 max-h-60 w-full object-contain" // -my-2 accounts for image shadows />

    {t("page-developers-resources-title")}

    diff --git a/public/images/developers/tutorial-tags-banner.png b/public/images/developers/tutorial-tags-banner.png index 83bfd338d82036c4286904107acffbdcdbe6ea9f..cb741092143d3e36af7934197607f615cd213d1d 100644 GIT binary patch literal 30722 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‹mF&tuvK%hx+Yp-3EPhmdK?!Frsh6m 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 literal 48450 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 Date: Thu, 10 Jul 2025 20:04:22 -0700 Subject: [PATCH 317/368] refactor: use x-scroll div on non-mobile for video course cards removes "swiper" functionality outside of mobile --- .../_components/VideoCourseCard.tsx | 2 +- app/[locale]/developers/page.tsx | 23 +++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/[locale]/developers/_components/VideoCourseCard.tsx b/app/[locale]/developers/_components/VideoCourseCard.tsx index fbf706ffab3..8b99219d1e3 100644 --- a/app/[locale]/developers/_components/VideoCourseCard.tsx +++ b/app/[locale]/developers/_components/VideoCourseCard.tsx @@ -15,7 +15,7 @@ const VideoCourseCard = ({ course, className }: BuildCardProps) => ( -
    +

    {t("page-developers-jump-right-in-title")}

    {t("page-developers-quickstart-scaffold-subtext")}{" "} @@ -164,7 +165,7 @@ const DevelopersPage = async ({ sizes={`(max-width: ${screens.sm}) 100vw, calc(50vw - 14rem)`} className="max-h-56 w-full object-cover object-top" /> -

    +

    {t("page-developers-get-help-title")}

    {t("page-developers-get-help-desc")} @@ -197,7 +198,7 @@ const DevelopersPage = async ({ sizes={`(max-width: ${screens.sm}) 100vw, calc(50vw - 14rem)`} className="-my-2 max-h-60 w-full object-contain" // -my-2 accounts for image shadows /> -

    +

    {t("page-developers-resources-title")}

    {t("page-developers-resources-desc")} @@ -223,7 +224,7 @@ const DevelopersPage = async ({ sizes={`(max-width: ${screens.sm}) 100vw, calc(50vw - 14rem)`} className="max-h-56 w-full object-contain" /> -

    +

    {t("page-developers-tutorials-title")}

    {t("page-developers-tutorials-desc")} @@ -246,7 +247,19 @@ const DevelopersPage = async ({

    {t("page-developers-video-courses-title")}

    {t("page-developers-video-courses-desc")}

    -
    + {/* DESKTOP */} +
    + {courses.map((course, idx) => ( + + ))} +
    + + {/* MOBILE */} +
    From 72f5ec6cbbe68fc665020a242900a89f13e43e48 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 11 Jul 2025 16:29:06 +0000 Subject: [PATCH 318/368] Update Crowdin translation progress --- src/data/translationProgress.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/translationProgress.json b/src/data/translationProgress.json index 37109d508f8..fc1ce972338 100644 --- a/src/data/translationProgress.json +++ b/src/data/translationProgress.json @@ -114,7 +114,7 @@ { "languageId": "el", "words": { - "approved": 284151, + "approved": 285736, "total": 290123 } }, From b24e8ae3d8d9f2684d2b2db67844be342c748078 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:25:29 -0700 Subject: [PATCH 319/368] feat: clean up video course cards --- .../_components/VideoCourseCard.tsx | 21 ++++----- .../_components/VideoCourseSwiper/index.tsx | 43 ++++++------------- .../_components/VideoCourseSwiper/loading.tsx | 6 ++- app/[locale]/developers/page.tsx | 23 ++++++++-- 4 files changed, 45 insertions(+), 48 deletions(-) diff --git a/app/[locale]/developers/_components/VideoCourseCard.tsx b/app/[locale]/developers/_components/VideoCourseCard.tsx index 8b99219d1e3..45c9ff6d834 100644 --- a/app/[locale]/developers/_components/VideoCourseCard.tsx +++ b/app/[locale]/developers/_components/VideoCourseCard.tsx @@ -1,24 +1,20 @@ import { Image } from "@/components/Image" -import Link from "@/components/ui/Link" +import { Card } from "@/components/ui/card" import { Tag } from "@/components/ui/tag" import { cn } from "@/lib/utils/cn" import type { VideoCourse } from "../types" -type BuildCardProps = { +type VideoCourseCardProps = { course: VideoCourse className?: string } -const VideoCourseCard = ({ course, className }: BuildCardProps) => ( - ( +
    ( + {/* // TODO: Extract intl */} {Math.round(course.hours)}-hour course -

    +

    {course.title}

    {course.description}

    - +
    ) export default VideoCourseCard diff --git a/app/[locale]/developers/_components/VideoCourseSwiper/index.tsx b/app/[locale]/developers/_components/VideoCourseSwiper/index.tsx index a32ee844e13..2356620562b 100644 --- a/app/[locale]/developers/_components/VideoCourseSwiper/index.tsx +++ b/app/[locale]/developers/_components/VideoCourseSwiper/index.tsx @@ -5,40 +5,21 @@ import { Swiper, SwiperSlide } from "@/components/ui/swiper" import type { VideoCourse } from "../../types" import VideoCourseCard from "../VideoCourseCard" -import { useBreakpointValue } from "@/hooks/useBreakpointValue" - type VideoCourseSwiperProps = { courses: VideoCourse[] } -const VideoCourseSwiper = ({ courses }: VideoCourseSwiperProps) => { - const slidesPerView = useBreakpointValue({ - base: 1.25, - sm: 1.6, - md: 2.7, - lg: 4.4, - xl: 5, - }) - const spaceBetween = useBreakpointValue({ - base: 16, - sm: 12, - md: 16, - lg: 24, - xl: 32, - }) - - return ( - - {courses.map((course, idx) => ( - - - - ))} - - ) -} +const VideoCourseSwiper = ({ courses }: VideoCourseSwiperProps) => ( + + {courses.map((course, idx) => ( + + + + ))} + +) export default VideoCourseSwiper diff --git a/app/[locale]/developers/_components/VideoCourseSwiper/loading.tsx b/app/[locale]/developers/_components/VideoCourseSwiper/loading.tsx index 5256c8f6218..0ee31a4d461 100644 --- a/app/[locale]/developers/_components/VideoCourseSwiper/loading.tsx +++ b/app/[locale]/developers/_components/VideoCourseSwiper/loading.tsx @@ -1,5 +1,9 @@ import { SkeletonCardGrid } from "@/components/ui/skeleton" -const Loading = () => +const Loading = () => ( +
    + +
    +) export default Loading diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index f243f5cac59..477a02ead68 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -45,6 +45,21 @@ const RightColumn = (props: ChildOnlyProp) => (
    ) +const Scroller = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( +
    + ) +} + const DevelopersPage = async ({ params, }: { @@ -243,20 +258,20 @@ const DevelopersPage = async ({ -
    +

    {t("page-developers-video-courses-title")}

    {t("page-developers-video-courses-desc")}

    {/* DESKTOP */} -
    + {courses.map((course, idx) => ( ))} -
    + {/* MOBILE */}
    From f1b9466471a9f2100f452f536de43ec0a8969a48 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:28:04 -0700 Subject: [PATCH 320/368] feat: add Hackathon section --- .../developers/_components/HackathonCard.tsx | 55 +++++++++++++++++++ .../_components/HackathonSwiper/index.tsx | 24 ++++++++ .../_components/HackathonSwiper/lazy.tsx | 5 ++ .../_components/HackathonSwiper/loading.tsx | 5 ++ app/[locale]/developers/page.tsx | 30 +++++++++- app/[locale]/developers/utils.ts | 12 ++++ app/[locale]/page.tsx | 21 ++----- app/[locale]/utils.ts | 45 ++++++++++++++- src/data/community-events.json | 18 ++++-- src/intl/en/page-developers-index.json | 2 +- src/lib/types.ts | 2 + 11 files changed, 192 insertions(+), 27 deletions(-) create mode 100644 app/[locale]/developers/_components/HackathonCard.tsx create mode 100644 app/[locale]/developers/_components/HackathonSwiper/index.tsx create mode 100644 app/[locale]/developers/_components/HackathonSwiper/lazy.tsx create mode 100644 app/[locale]/developers/_components/HackathonSwiper/loading.tsx diff --git a/app/[locale]/developers/_components/HackathonCard.tsx b/app/[locale]/developers/_components/HackathonCard.tsx new file mode 100644 index 00000000000..572516e442a --- /dev/null +++ b/app/[locale]/developers/_components/HackathonCard.tsx @@ -0,0 +1,55 @@ +import { CommunityConference } from "@/lib/types" + +import { Image } from "@/components/Image" +import CardImage from "@/components/Image/CardImage" +import { + Card, + CardBanner, + CardContent, + CardHighlight, + CardSubTitle, + CardTitle, +} from "@/components/ui/card" + +import EventFallback from "@/public/images/events/event-placeholder.png" + +type HackathonCardProps = { + event: CommunityConference + className?: string + eventCategory: string +} + +const HackathonCard = ({ + event, + className, + eventCategory = "Developers", +}: HackathonCardProps) => { + const { title, href, description, imageUrl, formattedDate, location } = event + return ( + + + {imageUrl ? ( + + ) : ( + + )} + + + {title} + {formattedDate} + {location} + + + ) +} + +export default HackathonCard diff --git a/app/[locale]/developers/_components/HackathonSwiper/index.tsx b/app/[locale]/developers/_components/HackathonSwiper/index.tsx new file mode 100644 index 00000000000..4e622384d42 --- /dev/null +++ b/app/[locale]/developers/_components/HackathonSwiper/index.tsx @@ -0,0 +1,24 @@ +"use client" + +import type { CommunityConference } from "@/lib/types" + +import { Swiper, SwiperSlide } from "@/components/ui/swiper" + +import HackathonCard from "../HackathonCard" + +type HackathonSwiperProps = { + events: CommunityConference[] + eventCategory: string +} + +const HackathonSwiper = ({ events, eventCategory }: HackathonSwiperProps) => ( + + {events.map((event, idx) => ( + + + + ))} + +) + +export default HackathonSwiper diff --git a/app/[locale]/developers/_components/HackathonSwiper/lazy.tsx b/app/[locale]/developers/_components/HackathonSwiper/lazy.tsx new file mode 100644 index 00000000000..c960f08e647 --- /dev/null +++ b/app/[locale]/developers/_components/HackathonSwiper/lazy.tsx @@ -0,0 +1,5 @@ +import dynamic from "next/dynamic" + +import Loading from "./loading" + +export default dynamic(() => import("."), { ssr: false, loading: Loading }) diff --git a/app/[locale]/developers/_components/HackathonSwiper/loading.tsx b/app/[locale]/developers/_components/HackathonSwiper/loading.tsx new file mode 100644 index 00000000000..5256c8f6218 --- /dev/null +++ b/app/[locale]/developers/_components/HackathonSwiper/loading.tsx @@ -0,0 +1,5 @@ +import { SkeletonCardGrid } from "@/components/ui/skeleton" + +const Loading = () => + +export default Loading diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 477a02ead68..bb133a6a2df 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -14,7 +14,6 @@ import { VStack } from "@/components/ui/flex" import Link from "@/components/ui/Link" import InlineLink from "@/components/ui/Link" import { Section } from "@/components/ui/section" -import { SkeletonCardGrid } from "@/components/ui/skeleton" import { cn } from "@/lib/utils/cn" import { getMetadata } from "@/lib/utils/metadata" @@ -22,10 +21,12 @@ import { screens } from "@/lib/utils/screen" import BuilderCard from "./_components/BuilderCard" import BuilderSwiper from "./_components/BuilderSwiper/lazy" +import HackathonCard from "./_components/HackathonCard" +import HackathonSwiper from "./_components/HackathonSwiper/lazy" import SpeedRunCard from "./_components/SpeedRunCard" import VideoCourseCard from "./_components/VideoCourseCard" import VideoCourseSwiper from "./_components/VideoCourseSwiper/lazy" -import { getBuilderPaths, getVideoCourses } from "./utils" +import { getBuilderPaths, getHackathons, getVideoCourses } from "./utils" import resourcesBanner from "@/public/images/developers/resources-banner.png" import scaffoldDebugScreenshot from "@/public/images/developers/scaffold-debug-screenshot.png" @@ -84,6 +85,10 @@ const DevelopersPage = async ({ const courses = await getVideoCourses() + const hackathons = (await getHackathons()).slice(0, 5) + + const eventCategory = `Developers - ${locale}` + return (

    {t("page-developers-hackathons-title")}

    {t("page-developers-hackathons-desc")}

    - + + {/* DESKTOP */} + + {hackathons.map((event, idx) => ( + + ))} + + {/* MOBILE */} +
    + +
    +
    {t("page-developers-visit-ethglobal")} diff --git a/app/[locale]/developers/utils.ts b/app/[locale]/developers/utils.ts index 40d3041bf6e..5e28aa1d742 100644 --- a/app/[locale]/developers/utils.ts +++ b/app/[locale]/developers/utils.ts @@ -1,5 +1,11 @@ import { getLocale, getTranslations } from "next-intl/server" +import { CommunityConference } from "@/lib/types" + +import events from "@/data/community-events.json" + +import { getUpcomingEvents } from "../utils" + import type { DevelopersPath, VideoCourse } from "./types" import cyfrinBasicBanner from "@/public/images/developers/cyfrin-basic-banner.webp" @@ -99,3 +105,9 @@ export const getVideoCourses = async (): Promise => { }, ] } + +export const getHackathons = async (): Promise => { + const locale = await getLocale() + const allUpcomingEvents = getUpcomingEvents(events, locale) + return allUpcomingEvents.filter((e) => e.hackathon) as CommunityConference[] +} diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 606fe0ca3fc..b76223e2aa2 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -8,7 +8,6 @@ import type { CommunityBlog, ValuesPairing, } from "@/lib/types" -import type { EventCardProps } from "@/lib/types" import type { Lang } from "@/lib/types" import { CodeExample } from "@/lib/interfaces" @@ -82,7 +81,7 @@ import { } from "@/lib/constants" import TenYearHomeBanner from "./10years/_components/TenYearHomeBanner" -import { getActivity } from "./utils" +import { getActivity, getUpcomingEvents } from "./utils" import SimpleDomainRegistryContent from "!!raw-loader!@/data/SimpleDomainRegistry.sol" import SimpleTokenContent from "!!raw-loader!@/data/SimpleToken.sol" @@ -402,18 +401,8 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { }, ] - const upcomingEvents = events - .filter((event) => { - const isValid = isValidDate(event.endDate) - const beginningOfEndDate = new Date(event.endDate).getTime() - const endOfEndDate = beginningOfEndDate + 24 * 60 * 60 * 1000 - const isUpcoming = endOfEndDate >= new Date().getTime() - return isValid && isUpcoming - }) - .sort( - (a, b) => new Date(a.endDate).getTime() - new Date(b.endDate).getTime() - ) - .slice(0, 3) as EventCardProps[] // Show 3 events ending soonest + const allUpcomingEvents = getUpcomingEvents(events, locale) + const upcomingEvents = allUpcomingEvents.slice(0, 3) const metricResults: AllHomepageActivityData = { ethPrice, @@ -906,9 +895,9 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { className="max-w-full object-cover object-center" /> ) : ( - + )} - + {title} diff --git a/app/[locale]/utils.ts b/app/[locale]/utils.ts index 0e460245aef..9cf747f3a01 100644 --- a/app/[locale]/utils.ts +++ b/app/[locale]/utils.ts @@ -5,10 +5,18 @@ import { getTranslations } from "next-intl/server" -import type { AllHomepageActivityData, Lang, StatsBoxMetric } from "@/lib/types" +import type { + AllHomepageActivityData, + CommunityConference, + Lang, + StatsBoxMetric, +} from "@/lib/types" +import { isValidDate } from "@/lib/utils/date" import { getLocaleForNumberFormat } from "@/lib/utils/translations" +import { DEFAULT_LOCALE } from "@/lib/constants" + const formatLargeUSD = (value: number, locale: string): string => { return new Intl.NumberFormat(locale, { style: "currency", @@ -124,3 +132,38 @@ export const getActivity = async ( return metrics } + +export const getUpcomingEvents = ( + events: CommunityConference[], + locale = DEFAULT_LOCALE +): CommunityConference[] => + events + .filter((event) => { + const isValid = isValidDate(event.endDate) + const beginningOfEndDate = new Date(event.endDate).getTime() + const endOfEndDate = beginningOfEndDate + 24 * 60 * 60 * 1000 + const isUpcoming = endOfEndDate >= new Date().getTime() + return isValid && isUpcoming + }) + .sort( + (a, b) => new Date(a.endDate).getTime() - new Date(b.endDate).getTime() + ) + .map(({ startDate, endDate, ...event }) => { + const formattedDate = + isValidDate(startDate) || isValidDate(endDate) + ? new Intl.DateTimeFormat(locale, { + month: "long", + day: "numeric", + year: "numeric", + }).formatRange( + new Date(isValidDate(startDate) ? startDate : endDate), + new Date(isValidDate(endDate) ? endDate : startDate) + ) + : "" + return { + ...event, + startDate, + endDate, + formattedDate, + } + }) diff --git a/src/data/community-events.json b/src/data/community-events.json index 463bc90e68d..eeeb76531c0 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -15,7 +15,8 @@ "href": "https://ethglobal.com/events/pragma-newyork2025", "location": "New York, NYC, USA", "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.com/og.png" + "imageUrl": "https://ethglobal.com/og.png", + "hackathon": true }, { "title": "SBC (The Science of Blockchain Conference 2025)", @@ -33,7 +34,8 @@ "href": "https://ethglobal.com/events/newyork2025", "location": "New York, NYC, USA", "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.com/og.png" + "imageUrl": "https://ethglobal.com/og.png", + "hackathon": true }, { "title": "ProdFest Jos", @@ -87,7 +89,8 @@ "href": "https://ethglobal.com/events/pragma-newdelhi", "location": "New Delhi, IND", "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.com/og.png" + "imageUrl": "https://ethglobal.com/og.png", + "hackathon": true }, { "title": "ETHGlobal New Delhi", @@ -96,7 +99,8 @@ "href": "https://ethglobal.com/events/newdelhi", "location": "New Delhi, IND", "description": "Bringing developers onchain to build the future of the internet.", - "imageUrl": "https://ethglobal.com/og.png" + "imageUrl": "https://ethglobal.com/og.png", + "hackathon": true }, { "title": "EthAccra", @@ -123,7 +127,8 @@ "href": "https://ethsafari.xyz/", "location": "Nairobi, Kenya", "description": "ETHSafari 2025 - web3 builders conference East Africa Kenya", - "imageUrl": "https://ethsafari.xyz/_next/image?url=%2FHackathon.png&w=640&q=75" + "imageUrl": "https://ethsafari.xyz/_next/image?url=%2FHackathon.png&w=640&q=75", + "hackathon": true }, { "title": "ETH Boston", @@ -168,7 +173,8 @@ "href": "https://ethistanbul.io/", "location": "Istanbul, TR", "description": "ETHIstanbul is a conference and hackathon connecting you with global talents, industry professionals, and web3 companies advancing technology.", - "imageUrl": "https://ethistanbul.io/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fistanbul-background.99d6ad2a.webp&w=3840&q=75" + "imageUrl": "https://ethistanbul.io/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fistanbul-background.99d6ad2a.webp&w=3840&q=75", + "hackathon": true }, { "title": "ETHSofia", diff --git a/src/intl/en/page-developers-index.json b/src/intl/en/page-developers-index.json index 93f48fbd9fe..41476ec8a7b 100644 --- a/src/intl/en/page-developers-index.json +++ b/src/intl/en/page-developers-index.json @@ -90,7 +90,7 @@ "page-developers-video-courses-title": "Video courses", "page-developers-video-courses-desc": "Want to kickstart your professional career in blockchain? These courses will prepare you to get hired as blockchain developer.", "page-developers-docs-section-desc": "Understand the core concepts of Ethereum and blockchains", - "page-developers-hackathons-title": "Join hackathons (TODO)", + "page-developers-hackathons-title": "Join hackathons", "page-developers-hackathons-desc": "Hackathons are great opportunities to network and learn from others as well as start projects and earn prizes", "page-developers-visit-ethglobal": "Visit EthGlobal", "page-developers-founders-title": "Are you a founder?", diff --git a/src/lib/types.ts b/src/lib/types.ts index f86c3e08e9f..868dfbc0e17 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -609,6 +609,8 @@ export type CommunityConference = { startDate: string endDate: string imageUrl: string + hackathon?: boolean + formattedDate?: string } // Chains From 479ab5ef012ced6a07db403915425498017d7663 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:28:27 -0700 Subject: [PATCH 321/368] fix: resources --- app/[locale]/developers/page.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index bb133a6a2df..141e5646b0f 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -132,7 +132,7 @@ const DevelopersPage = async ({ {/* Quickstart your idea */} - + Scaffold-ETH 2 debug screenshot - {t("page-developers-solidity-docs")} + Scaffold-Eth2-llms-full.txt
    {/* Get help */} - + Ethereum Stack Exchange screenshot + > {t("page-developers-ask-ai")} - */} + */}
    {/* Resources */} - + Banner showing four resource app icons {/* Tutorials */} - + Banner displaying multiple learning topics in a tag cloud Date: Fri, 11 Jul 2025 19:28:43 -0700 Subject: [PATCH 322/368] fix: add sizes to eventcard --- src/components/EventCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/EventCard.tsx b/src/components/EventCard.tsx index 2d8bd410946..324da97e00d 100644 --- a/src/components/EventCard.tsx +++ b/src/components/EventCard.tsx @@ -52,7 +52,7 @@ const EventCard: React.FC = ({ className="max-h-[224px] w-full object-cover xl:h-[124px]" /> ) : ( - + )}
    From 969cb7e6154a8e77de907c55ee20d111410651ac Mon Sep 17 00:00:00 2001 From: Kendra Karol Sevilla Date: Sat, 12 Jul 2025 13:03:37 +0200 Subject: [PATCH 323/368] change link to 1inch exchange --- app/[locale]/dapps/_components/dapps.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/dapps/_components/dapps.tsx b/app/[locale]/dapps/_components/dapps.tsx index f5915b3f7c0..c85d659c2ca 100644 --- a/app/[locale]/dapps/_components/dapps.tsx +++ b/app/[locale]/dapps/_components/dapps.tsx @@ -851,7 +851,7 @@ const DappsPage = ({ { title: "1inch", description: t("page-dapps-dapp-description-1inch"), - link: "https://1inch.exchange/", + link: "https://1inch.io/", image: oneinch, alt: t("page-dapps-1inch-logo-alt"), }, From 0e0a961f4b174a9ca0b99b0468a1c869d13bac16 Mon Sep 17 00:00:00 2001 From: otc group Date: Sat, 12 Jul 2025 13:10:41 +0200 Subject: [PATCH 324/368] change link to chainlink docs --- public/content/developers/docs/oracles/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/oracles/index.md b/public/content/developers/docs/oracles/index.md index 97b3c100e81..71ad6635d08 100644 --- a/public/content/developers/docs/oracles/index.md +++ b/public/content/developers/docs/oracles/index.md @@ -284,7 +284,7 @@ An early idea for this was [SchellingCoin](https://blog.ethereum.org/2014/03/28/ While SchellingCoin doesn’t exist today, a number of decentralized oracles—notably [Maker Protocol’s Oracles](https://docs.makerdao.com/smart-contract-modules/oracle-module)—use the schelling-point mechanism to improve accuracy of oracle data. Each Maker Oracle consists of an offchain P2P network of nodes ("relayers" and "feeds") who submit market prices for collateral assets and an onchain “Medianizer” contract that calculates the median of all provided values. Once the specified delay period is over, this median value becomes the new reference price for the associated asset. -Other examples of oracles that use Schelling point mechanisms include [Chainlink Offchain Reporting](https://docs.chain.link/docs/offchain-reporting/) and [Witnet](https://witnet.io/). In both systems, responses from oracle nodes in the peer-to-peer network are aggregated into a single aggregate value, such as a mean or median. Nodes are rewarded or punished according to the extent to which their responses align with or deviate from the aggregate value. +Other examples of oracles that use Schelling point mechanisms include [Chainlink Offchain Reporting](https://docs.chain.link/architecture-overview/off-chain-reporting) and [Witnet](https://witnet.io/). In both systems, responses from oracle nodes in the peer-to-peer network are aggregated into a single aggregate value, such as a mean or median. Nodes are rewarded or punished according to the extent to which their responses align with or deviate from the aggregate value. Schelling point mechanisms are attractive because they minimize onchain footprint (only one transaction needs to be sent) while guaranteeing decentralization. The latter is possible because nodes must sign off on the list of submitted responses before it is fed into the algorithm that produces the mean/median value. From f30c7b696ae735fa437cb2297236ba10838d87f3 Mon Sep 17 00:00:00 2001 From: Nicolas Consigny <101647594+nconsigny@users.noreply.github.com> Date: Sat, 12 Jul 2025 17:32:04 +0200 Subject: [PATCH 325/368] add addresses and Calibur Added uniswap and addresses --- public/content/roadmap/pectra/7702/index.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/public/content/roadmap/pectra/7702/index.md b/public/content/roadmap/pectra/7702/index.md index f6d04c7601e..ff2187920bb 100644 --- a/public/content/roadmap/pectra/7702/index.md +++ b/public/content/roadmap/pectra/7702/index.md @@ -114,11 +114,14 @@ When users perform delegated signatures, the target contract receiving the deleg Due to the nature of EIP 7702, it is recommended wallets use caution when helping users delegate to a 3rd party contract. Listed below is a collection of known implementations that have been audited: -- address TBD [[alchemyplatform/modular-account](https://github.com/alchemyplatform/modular-account)] / [audits](https://github.com/alchemyplatform/modular-account/tree/develop/audits) -- address TBD [[AmbireTech/ambire-common](https://github.com/AmbireTech/ambire-common/blob/feature/eip-7702/contracts/AmbireAccount7702.sol)] / [audits](https://github.com/AmbireTech/ambire-common/tree/feature/eip-7702/audits) -- address TBD [[MetaMask/delegation-framework]](https://github.com/MetaMask/delegation-framework) / [audits](https://github.com/MetaMask/delegation-framework/tree/main/audits) +- 0x000000009B1D0aF20D8C6d0A44e162d11F9b8f00 [[Uniswap/calibur](https://github.com/Uniswap/calibur)] / [audits](https://github.com/Uniswap/calibur/tree/main/audits) +- 0x69007702764179f14F51cdce752f4f775d74E139 [[alchemyplatform/modular-account](https://github.com/alchemyplatform/modular-account)] / [audits](https://github.com/alchemyplatform/modular-account/tree/develop/audits) +- 0x5A7FC11397E9a8AD41BF10bf13F22B0a63f96f6d [[AmbireTech/ambire-common](https://github.com/AmbireTech/ambire-common/blob/feature/eip-7702/contracts/AmbireAccount7702.sol)] / [audits](https://github.com/AmbireTech/ambire-common/tree/feature/eip-7702/audits) +- 0x63c0c19a282a1b52b07dd5a65b58948a07dae32b [[MetaMask/delegation-framework]](https://github.com/MetaMask/delegation-framework) / [audits](https://github.com/MetaMask/delegation-framework/tree/main/audits) - 0x4Cd241E8d1510e30b2076397afc7508Ae59C66c9 [[Ethereum Foundation AA team]](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/accounts/Simple7702Account.sol) / [audits](https://github.com/eth-infinitism/account-abstraction/blob/develop/audits/SpearBit%20Account%20Abstraction%20Security%20Review%20-%20Mar%202025.pdf) + + ## Hardware wallet guidelines {#hardware-wallet-guidelines} Hardware wallets shouldn't expose arbitrary delegation. The consensus in the Hardware wallet space is to use a list of trusted delegator contracts. We suggest to allow known implementations listed above and to consider others on a case by case basis. As delegating your EOA to a contract gives control over all the assets, hardware wallets should be cautious with the way they implement 7702. From 5310ad176838d9811edcb290840c827064d2783b Mon Sep 17 00:00:00 2001 From: Pablo Date: Sat, 12 Jul 2025 19:59:18 +0200 Subject: [PATCH 326/368] include link to TDS blog post --- app/[locale]/trillion-dollar-security/page.tsx | 16 ++++++++++++++-- src/intl/en/page-trillion-dollar-security.json | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/[locale]/trillion-dollar-security/page.tsx b/app/[locale]/trillion-dollar-security/page.tsx index 68ff8487188..b982c37b85e 100644 --- a/app/[locale]/trillion-dollar-security/page.tsx +++ b/app/[locale]/trillion-dollar-security/page.tsx @@ -12,7 +12,7 @@ import { CardDescription, CardFooter, } from "@/components/ui/card" -import { BaseLink as Link } from "@/components/ui/Link" +import InlineLink, { BaseLink as Link } from "@/components/ui/Link" import { getMetadata } from "@/lib/utils/metadata" @@ -104,7 +104,19 @@ const TdsPage = async ({ params }: { params: Promise<{ locale: Lang }> }) => { />
    -

    {t("page-trillion-dollar-security-hero-paragraph-5")}

    +

    + {t.rich("page-trillion-dollar-security-hero-paragraph-5", { + a: (chunks) => ( + + {chunks} + + ), + })} +

    {t("page-trillion-dollar-security-hero-paragraph-6")}

      diff --git a/src/intl/en/page-trillion-dollar-security.json b/src/intl/en/page-trillion-dollar-security.json index 78e7246ea4f..98a02332a0d 100644 --- a/src/intl/en/page-trillion-dollar-security.json +++ b/src/intl/en/page-trillion-dollar-security.json @@ -7,7 +7,8 @@ "page-trillion-dollar-security-hero-paragraph-2": "But for Ethereum to succeed in the next phase of global adoption, there are still many improvements that must be made. To achieve our community's ambitions, Ethereum must grow into an ecosystem where:", "page-trillion-dollar-security-hero-paragraph-3": "Billions of individuals are each comfortable holding more than $1000 onchain, collectively amounting to trillions of dollars secured on Ethereum.", "page-trillion-dollar-security-hero-paragraph-4": "Companies, institutions, and governments are comfortable storing more than 1 trillion dollars of value inside a single contract or application, and are comfortable transacting in comparable amounts.", - "page-trillion-dollar-security-hero-paragraph-5": "The Trillion Dollar Security (1TS) project is an ecosystem-wide effort to upgrade Ethereum's security. This report is the first deliverable of the 1TS project. Over the last month, we have gathered feedback from users, developers, security experts, and institutions about where they see the biggest challenges and areas for improvement. Thank you to the hundreds of people and dozens of organizations who have taken the time to share your insights with us.", + "page-trillion-dollar-security-hero-paragraph-5": "The Trillion Dollar Security (1TS) project is an ecosystem-wide effort to upgrade Ethereum's security. This report is the first deliverable of the 1TS project. Over the last month, we have gathered feedback from users, developers, security experts, and institutions about where they see the biggest challenges and areas for improvement. Thank you to the hundreds of people and dozens of organizations who have taken the time to share your insights with us.", + "page-trillion-dollar-security-hero-paragraph-5-link": "https://blog.ethereum.org/2025/05/14/trillion-dollar-security", "page-trillion-dollar-security-hero-paragraph-6": "This report summarizes our findings, covering 6 distinct areas:", "page-trillion-dollar-security-report-card-title": "Ethereum ecosystem security overview report", "page-trillion-dollar-security-download-report": "Download PDF", From 94308ca1d6f32630777c0c83dc0691ef9d07b375 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 12 Jul 2025 13:18:28 -0700 Subject: [PATCH 327/368] fix: /learning-tools metadata fixes syntax for namespace, resolves string id being shown as page title --- app/[locale]/developers/learning-tools/page.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/[locale]/developers/learning-tools/page.tsx b/app/[locale]/developers/learning-tools/page.tsx index fe74c14fd72..cb645c3ef27 100644 --- a/app/[locale]/developers/learning-tools/page.tsx +++ b/app/[locale]/developers/learning-tools/page.tsx @@ -48,10 +48,8 @@ export async function generateMetadata({ return await getMetadata({ locale, slug: ["developers", "learning-tools"], - title: t("page-developers-learning-tools:page-learning-tools-meta-title"), - description: t( - "page-developers-learning-tools:page-learning-tools-meta-desc" - ), + title: t("page-learning-tools-meta-title"), + description: t("page-learning-tools-meta-desc"), }) } From 42ebde0f00e7a2ae1d49fd126df1c5d394449ada Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 12 Jul 2025 13:23:49 -0700 Subject: [PATCH 328/368] fix: founder buttons positioning --- app/[locale]/developers/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 141e5646b0f..1d2ad178cff 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -453,7 +453,7 @@ const DevelopersPage = async ({

      {t("page-developers-founders-title")}

      {t("page-developers-founders-desc")}

    -
    +
    {t("page-developers-get-in-touch")} From 0000a6a20e12382a84a556f5c90f08bdc8f4f938 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 12 Jul 2025 13:54:15 -0700 Subject: [PATCH 329/368] fix: builder swiper layout --- .../developers/_components/BuilderSwiper/index.tsx | 12 ++++++++---- .../developers/_components/BuilderSwiper/loading.tsx | 10 ++++++---- app/[locale]/developers/page.tsx | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/[locale]/developers/_components/BuilderSwiper/index.tsx b/app/[locale]/developers/_components/BuilderSwiper/index.tsx index 16ffaee58bb..1b3167a0881 100644 --- a/app/[locale]/developers/_components/BuilderSwiper/index.tsx +++ b/app/[locale]/developers/_components/BuilderSwiper/index.tsx @@ -24,14 +24,18 @@ const BuilderSwiper = ({ paths, speedRunDetails }: BuilderSwiperProps) => { }) return ( - + {paths.map((path, idx) => ( - + ))} - - + + ) diff --git a/app/[locale]/developers/_components/BuilderSwiper/loading.tsx b/app/[locale]/developers/_components/BuilderSwiper/loading.tsx index 5c44d162b59..5a463164c78 100644 --- a/app/[locale]/developers/_components/BuilderSwiper/loading.tsx +++ b/app/[locale]/developers/_components/BuilderSwiper/loading.tsx @@ -2,10 +2,12 @@ import { Card } from "@/components/ui/card" import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" const Loading = () => ( - - - - + + + + + + ) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 1d2ad178cff..ebc4e16fac6 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -115,7 +115,7 @@ const DevelopersPage = async ({
    {/* Mobile */} -
    +
    From b10cd9b814162322773b924dbd0ca93d255d9ea5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 12 Jul 2025 13:54:40 -0700 Subject: [PATCH 330/368] adjust: ui/skeleton --- src/components/ui/skeleton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx index 4e7f72626e3..ea2eec850a6 100644 --- a/src/components/ui/skeleton.tsx +++ b/src/components/ui/skeleton.tsx @@ -4,7 +4,7 @@ import { Card, CardBanner, CardContent } from "../ui/card" // Pseudo-random list of skeleton widths for multiple lines const widths = [ - "w-1/3", + "w-2/3", "w-1/5", "w-4", "w-1/4", From 87f308d3d28da5b8948fe08c2a738df0e9b1b26e Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 14 Jul 2025 09:31:23 +0200 Subject: [PATCH 331/368] dotenv config --- playwright.config.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/playwright.config.ts b/playwright.config.ts index 4b4ff25892b..863e2009c9c 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,6 +1,11 @@ +import path from "path" + +import dotenv from "dotenv" import type { ChromaticConfig } from "@chromatic-com/playwright" import { defineConfig, devices } from "@playwright/test" +dotenv.config({ path: path.resolve(__dirname, ".env.local") }) + export default defineConfig({ testDir: "./tests/e2e", outputDir: "./tests/e2e/__results__", From 4ce2caf5ddccdb1734152e6e10c33d904d7a287f Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 14 Jul 2025 11:34:02 +0200 Subject: [PATCH 332/368] ensure page is ready before taking snapshot --- tests/e2e/find-wallet.spec.ts | 2 ++ tests/e2e/home.spec.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tests/e2e/find-wallet.spec.ts b/tests/e2e/find-wallet.spec.ts index d747ceb58fe..c57b1e89968 100644 --- a/tests/e2e/find-wallet.spec.ts +++ b/tests/e2e/find-wallet.spec.ts @@ -11,6 +11,8 @@ test.describe("Find Wallet Page", () => { }) test("loads successfully", async ({ page }, testInfo) => { + // ensure page is ready before taking snapshot + await findWalletPage.waitForPageReady() await findWalletPage.verifyPageLoaded() await takeSnapshot(page, "find-wallet-initial", testInfo) }) diff --git a/tests/e2e/home.spec.ts b/tests/e2e/home.spec.ts index 8485d52c78c..b5866540a0c 100644 --- a/tests/e2e/home.spec.ts +++ b/tests/e2e/home.spec.ts @@ -12,6 +12,8 @@ test.describe("Home Page", () => { }) test("loads successfully", async ({ page }, testInfo) => { + // ensure page is ready before taking snapshot + await homePage.waitForPageReady() await homePage.verifyPageLoaded() await takeSnapshot(page, "home-initial", testInfo) }) From 8143459b76137019047246885dcbe2ba411f439b Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 14 Jul 2025 18:05:45 +0200 Subject: [PATCH 333/368] move code example files to public folder --- .eslintrc.json | 3 ++- .../CreateWallet.ts => public/code-examples/CreateWallet.js | 5 +---- {src/data => public/code-examples}/SimpleDomainRegistry.sol | 0 {src/data => public/code-examples}/SimpleToken.sol | 0 {src/data => public/code-examples}/SimpleWallet.sol | 0 5 files changed, 3 insertions(+), 5 deletions(-) rename src/data/CreateWallet.ts => public/code-examples/CreateWallet.js (94%) rename {src/data => public/code-examples}/SimpleDomainRegistry.sol (100%) rename {src/data => public/code-examples}/SimpleToken.sol (100%) rename {src/data => public/code-examples}/SimpleWallet.sol (100%) diff --git a/.eslintrc.json b/.eslintrc.json index 2b6e7dfa818..190ff1656e4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -90,6 +90,7 @@ "coverage/", "storybook-static/", "**/*.d.ts", - "src/intl/" + "src/intl/", + "public/code-examples/" ] } diff --git a/src/data/CreateWallet.ts b/public/code-examples/CreateWallet.js similarity index 94% rename from src/data/CreateWallet.ts rename to public/code-examples/CreateWallet.js index 4931a7c7af6..6ed5d772492 100644 --- a/src/data/CreateWallet.ts +++ b/public/code-examples/CreateWallet.js @@ -1,4 +1,4 @@ -const createWallet = `const ethers = require("ethers") +const ethers = require("ethers") // Create a wallet instance from a mnemonic... const mnemonic = @@ -46,6 +46,3 @@ wallet.sendTransaction(tx) // https://github.com/ethers-io/ethers.js/blob/master/docs/v5/api/signer/README.md#methods // Content is licensed under the Creative Commons License: // https://choosealicense.com/licenses/cc-by-4.0/ -` - -export default createWallet diff --git a/src/data/SimpleDomainRegistry.sol b/public/code-examples/SimpleDomainRegistry.sol similarity index 100% rename from src/data/SimpleDomainRegistry.sol rename to public/code-examples/SimpleDomainRegistry.sol diff --git a/src/data/SimpleToken.sol b/public/code-examples/SimpleToken.sol similarity index 100% rename from src/data/SimpleToken.sol rename to public/code-examples/SimpleToken.sol diff --git a/src/data/SimpleWallet.sol b/public/code-examples/SimpleWallet.sol similarity index 100% rename from src/data/SimpleWallet.sol rename to public/code-examples/SimpleWallet.sol From 9c45454ca49a0e73860a683ca498678d45c6fb7e Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 14 Jul 2025 18:06:31 +0200 Subject: [PATCH 334/368] refactor CodeExamples to load code examples async --- app/[locale]/page.tsx | 12 +-- src/components/CodeModal.tsx | 2 +- src/components/Homepage/CodeExamples.tsx | 101 ++++++++++++++++------- src/lib/interfaces.ts | 2 +- 4 files changed, 78 insertions(+), 39 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 606fe0ca3fc..9e36af110ef 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -67,7 +67,6 @@ import { getMetadata } from "@/lib/utils/metadata" import { polishRSSList } from "@/lib/utils/rss" import events from "@/data/community-events.json" -import CreateWalletContent from "@/data/CreateWallet" import { ATTESTANT_BLOG, @@ -84,9 +83,6 @@ import { import TenYearHomeBanner from "./10years/_components/TenYearHomeBanner" import { getActivity } from "./utils" -import SimpleDomainRegistryContent from "!!raw-loader!@/data/SimpleDomainRegistry.sol" -import SimpleTokenContent from "!!raw-loader!@/data/SimpleToken.sol" -import SimpleWalletContent from "!!raw-loader!@/data/SimpleWallet.sol" import { routing } from "@/i18n/routing" import { fetchCommunityEvents } from "@/lib/api/calendarEvents" import { fetchEthPrice } from "@/lib/api/fetchEthPrice" @@ -341,28 +337,28 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { title: t("page-index-developers-code-example-title-0"), description: t("page-index-developers-code-example-description-0"), codeLanguage: "language-solidity", - code: SimpleWalletContent, + codeUrl: "/code-examples/SimpleWallet.sol", eventName: "bank", }, { title: t("page-index-developers-code-example-title-1"), description: t("page-index-developers-code-example-description-1"), codeLanguage: "language-solidity", - code: SimpleTokenContent, + codeUrl: "/code-examples/SimpleToken.sol", eventName: "token", }, { title: t("page-index-developers-code-example-title-2"), description: t("page-index-developers-code-example-description-2"), codeLanguage: "language-javascript", - code: CreateWalletContent, + codeUrl: "/code-examples/CreateWallet.js", eventName: "wallet", }, { title: t("page-index-developers-code-example-title-3"), description: t("page-index-developers-code-example-description-3"), codeLanguage: "language-solidity", - code: SimpleDomainRegistryContent, + codeUrl: "/code-examples/SimpleDomainRegistry.sol", eventName: "dns", }, ] diff --git a/src/components/CodeModal.tsx b/src/components/CodeModal.tsx index 938008a14bc..2bbd1116750 100644 --- a/src/components/CodeModal.tsx +++ b/src/components/CodeModal.tsx @@ -23,7 +23,7 @@ type CodeModalProps = { const CodeModal = ({ children, isOpen, setIsOpen, title }: CodeModalProps) => { const { t } = useTranslation() const codeSnippet = (Children.toArray(children)[0] as ReactElement).props - .children.props.children + .children const { onCopy, hasCopied } = useClipboard() diff --git a/src/components/Homepage/CodeExamples.tsx b/src/components/Homepage/CodeExamples.tsx index 36cab10893f..bd932ce8651 100644 --- a/src/components/Homepage/CodeExamples.tsx +++ b/src/components/Homepage/CodeExamples.tsx @@ -1,6 +1,6 @@ "use client" -import { Suspense, useState } from "react" +import { useCallback, useEffect, useState } from "react" import { Clipboard, ClipboardCheck } from "lucide-react" import { useLocale } from "next-intl" @@ -29,17 +29,64 @@ type CodeExamplesProps = { eventCategory: string } +const AccordionCodeBlock = ({ + code, + codeLanguage, +}: { + code: string + codeLanguage: string +}) => ( + <> + + {code} + + + {(hasCopied) => (hasCopied ? : )} + + +) + const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => { const locale = useLocale() const [isModalOpen, setModalOpen] = useState(false) const [activeCode, setActiveCode] = useState(0) + const [fetchedCodes, setFetchedCodes] = useState<{ [key: number]: string }>( + {} + ) const eventCategory = `Homepage - ${locale}` - const toggleCodeExample = (id: number): void => { - setActiveCode(id) - setModalOpen(true) + const getCode = useCallback( + (idx: number) => { + const example = codeExamples[idx] + if (!fetchedCodes[idx]) { + fetch(example.codeUrl) + .then((res) => res.text()) + .then((text) => setFetchedCodes((prev) => ({ ...prev, [idx]: text }))) + } + }, + [codeExamples, fetchedCodes] + ) + + // For modal: fetch code when opened if needed + useEffect(() => { + if (isModalOpen) { + getCode(activeCode) + } + }, [isModalOpen, activeCode, getCode]) + + // For accordion: fetch code when expanded if needed + const handleAccordionOpen = (idx: number) => { + getCode(idx) } return ( @@ -54,7 +101,8 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => { isModalOpen && idx === activeCode && "bg-background-highlight" )} onClick={() => { - toggleCodeExample(idx) + setActiveCode(idx) + setModalOpen(true) trackCustomEvent({ eventCategory, eventAction: "Code Examples", @@ -68,9 +116,12 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => { ))} {/* Mobile */} - {codeExamples.map(({ title, description, code, codeLanguage }) => ( + {codeExamples.map(({ title, description, codeLanguage }, idx) => ( - + handleAccordionOpen(idx)} + >

    {title} @@ -81,26 +132,16 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => {

    - }> -
    - + {!fetchedCodes[idx] ? ( + + ) : ( + - {code} - - - {(hasCopied) => - hasCopied ? : - } - -
    -
    + /> + )} +
    ))} @@ -112,16 +153,18 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => { setIsOpen={setModalOpen} title={codeExamples[activeCode].title} > - }> + {!fetchedCodes[activeCode] ? ( + + ) : ( - {codeExamples[activeCode].code} + {fetchedCodes[activeCode]} - + )} )}
    diff --git a/src/lib/interfaces.ts b/src/lib/interfaces.ts index 092a7b62647..2577e220d03 100644 --- a/src/lib/interfaces.ts +++ b/src/lib/interfaces.ts @@ -174,6 +174,6 @@ export interface CodeExample { alt?: string id?: number codeLanguage: string - code: string + codeUrl: string eventName: string } From f6e58400a4c11bf7033ae549edd8d50fe9a31bb8 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:59:58 -0700 Subject: [PATCH 335/368] feat: update all /developers action trackers --- .../developers/_components/BuilderCard.tsx | 11 ++- .../developers/_components/HackathonCard.tsx | 11 +-- .../_components/HackathonSwiper/index.tsx | 5 +- .../_components/VideoCourseCard.tsx | 5 ++ app/[locale]/developers/page.tsx | 70 ++++++++++++++----- app/[locale]/developers/types.ts | 4 +- src/intl/en/page-developers-index.json | 2 +- 7 files changed, 74 insertions(+), 34 deletions(-) diff --git a/app/[locale]/developers/_components/BuilderCard.tsx b/app/[locale]/developers/_components/BuilderCard.tsx index b1468a0284b..40bb6b87616 100644 --- a/app/[locale]/developers/_components/BuilderCard.tsx +++ b/app/[locale]/developers/_components/BuilderCard.tsx @@ -33,7 +33,16 @@ const BuilderCard = ({ path, className }: BuildCardProps) => (

    {path.title}

    {path.description}

    - + {path.button} diff --git a/app/[locale]/developers/_components/HackathonCard.tsx b/app/[locale]/developers/_components/HackathonCard.tsx index 572516e442a..0bef4027db9 100644 --- a/app/[locale]/developers/_components/HackathonCard.tsx +++ b/app/[locale]/developers/_components/HackathonCard.tsx @@ -16,22 +16,17 @@ import EventFallback from "@/public/images/events/event-placeholder.png" type HackathonCardProps = { event: CommunityConference className?: string - eventCategory: string } -const HackathonCard = ({ - event, - className, - eventCategory = "Developers", -}: HackathonCardProps) => { +const HackathonCard = ({ event, className }: HackathonCardProps) => { const { title, href, description, imageUrl, formattedDate, location } = event return ( ( +const HackathonSwiper = ({ events }: HackathonSwiperProps) => ( {events.map((event, idx) => ( - + ))} diff --git a/app/[locale]/developers/_components/VideoCourseCard.tsx b/app/[locale]/developers/_components/VideoCourseCard.tsx index 45c9ff6d834..70b994b76a5 100644 --- a/app/[locale]/developers/_components/VideoCourseCard.tsx +++ b/app/[locale]/developers/_components/VideoCourseCard.tsx @@ -15,6 +15,11 @@ const VideoCourseCard = ({ course, className }: VideoCourseCardProps) => (
    {t("page-developers-jump-right-in-title")}

    {t("page-developers-quickstart-scaffold-subtext")}{" "} - + {t("page-developers-quickstart-scaffold-docs")}

    @@ -156,9 +162,9 @@ const DevelopersPage = async ({ message="npx create-eth@latest" size="sm" customEventOptions={{ - eventCategory: "top_boxes", + eventCategory: "mid_boxes", eventAction: "click", - eventName: "scaffold", + eventName: "scaffold-npx-copy", }} />
    @@ -167,9 +173,9 @@ const DevelopersPage = async ({ Scaffold-Eth2-llms-full.txt @@ -197,6 +203,11 @@ const DevelopersPage = async ({ variant="outline" isSecondary href="https://ethereum.stackexchange.com/" + customEventOptions={{ + eventCategory: "mid_boxes", + eventAction: "click", + eventName: "stack-exchange", + }} > {t("page-developers-stack-exchange")}
    @@ -230,6 +241,11 @@ const DevelopersPage = async ({ variant="outline" isSecondary href="/developers/learning-tools/" + customEventOptions={{ + eventCategory: "mid_boxes", + eventAction: "click", + eventName: "play-with-code", + }} > {t("page-developers-play-code")} @@ -256,6 +272,11 @@ const DevelopersPage = async ({ variant="outline" isSecondary href="/developers/tutorials/" + customEventOptions={{ + eventCategory: "mid_boxes", + eventAction: "click", + eventName: "view-tutorials", + }} > {t("page-developers-learn-tutorials-cta")} @@ -416,24 +437,23 @@ const DevelopersPage = async ({ {/* DESKTOP */} {hackathons.map((event, idx) => ( - + ))} {/* MOBILE */}
    - +
    - + {t("page-developers-visit-ethglobal")}
    @@ -454,13 +474,25 @@ const DevelopersPage = async ({

    {t("page-developers-founders-desc")}

    - + {t("page-developers-get-in-touch")} {t("page-developers-see-grant-options")} diff --git a/app/[locale]/developers/types.ts b/app/[locale]/developers/types.ts index 3a679d5dff6..cbb7c2118db 100644 --- a/app/[locale]/developers/types.ts +++ b/app/[locale]/developers/types.ts @@ -4,14 +4,14 @@ import type { ReactNode } from "react" type CardInfo = { imgSrc: StaticImageData imgAlt: string - title: ReactNode + title: string description: ReactNode href: string } export type DevelopersPath = CardInfo & { button: ReactNode - tag?: string + tag: string } export type VideoCourse = CardInfo & { diff --git a/src/intl/en/page-developers-index.json b/src/intl/en/page-developers-index.json index 41476ec8a7b..f2b4718d799 100644 --- a/src/intl/en/page-developers-index.json +++ b/src/intl/en/page-developers-index.json @@ -94,7 +94,7 @@ "page-developers-hackathons-desc": "Hackathons are great opportunities to network and learn from others as well as start projects and earn prizes", "page-developers-visit-ethglobal": "Visit EthGlobal", "page-developers-founders-title": "Are you a founder?", - "page-developers-founders-desc": "Have a project idea already or working on a prototype? Explore how to take your project to the next step. Many other organizations that provide developers with funding.", + "page-developers-founders-desc": "Have a project idea already or working on a prototype? Explore how to take your project to the next step. We can connect you with relevant organizations and experts in the field.", "page-developers-get-in-touch": "Get in touch", "page-developers-see-grant-options": "See grant options", "page-developers-speedrun-nft-alt": "Speedrun Ethereum NFT banner", From 6ae6a7e1e7df51b46e566186d77d08d3d8662295 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:01:54 -0700 Subject: [PATCH 336/368] fix: scaffold llm label --- app/[locale]/developers/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/developers/page.tsx b/app/[locale]/developers/page.tsx index 86c1773851e..bfc61028a56 100644 --- a/app/[locale]/developers/page.tsx +++ b/app/[locale]/developers/page.tsx @@ -178,7 +178,7 @@ const DevelopersPage = async ({ eventName: "scaffold-llms-full", }} > - Scaffold-Eth2-llms-full.txt + Scaffold-ETH 2 llms-full.txt
    From f193f88324f950811e51cc19e7e5fbccab85a07c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:17:42 -0700 Subject: [PATCH 337/368] revert: ui/button glow variant --- src/components/ui/buttons/Button.tsx | 64 ++++++++-------------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/src/components/ui/buttons/Button.tsx b/src/components/ui/buttons/Button.tsx index 45655341271..774e0703a49 100644 --- a/src/components/ui/buttons/Button.tsx +++ b/src/components/ui/buttons/Button.tsx @@ -2,7 +2,6 @@ import * as React from "react" import { cva, type VariantProps } from "class-variance-authority" -import { Sparkles } from "lucide-react" import { Slot } from "@radix-ui/react-slot" import { cn } from "@/lib/utils/cn" @@ -11,26 +10,6 @@ import { scrollIntoView } from "@/lib/utils/scrollIntoView" import { BaseLink, type LinkProps } from "../Link" -const variants = { - variant: { - solid: cn( - "text-white bg-primary-action border-transparent", - "hover:!text-white hover:bg-primary-action-hover", // Hover - "active:bg-primary-action-hover", // Active - "disabled:bg-disabled disabled:text-background" // Disabled - ), - outline: "", // Base styling - ghost: "border-transparent hover:shadow-none", - link: "border-transparent hover:shadow-none underline !min-h-0 !py-0 !px-1 active:text-primary", - glow: "group relative rounded-lg border-none p-px text-body [&_[data-label='inner']]:!rounded-[7px]", - }, - size: { - lg: "text-lg py-3 px-8 [&>svg]:size-6 [&>svg]:text-2xl rounded-lg focus-visible:rounded-lg", - md: "min-h-10.5 px-4 py-2 [&>svg]:size-6 [&>svg]:text-2xl", - sm: "text-xs min-h-[31px] py-1.5 px-2 [&>svg]:size-4 [&>svg]:text-md", - }, -} - const buttonVariants = cva( cn( // Sizing and positioning classes: @@ -49,7 +28,24 @@ const buttonVariants = cva( "[&[data-secondary='true']]:text-body" ), { - variants, + variants: { + variant: { + solid: cn( + "text-white bg-primary-action border-transparent", + "hover:!text-white hover:bg-primary-action-hover", // Hover + "active:bg-primary-action-hover", // Active + "disabled:bg-disabled disabled:text-background" // Disabled + ), + outline: "", // Base styling + ghost: "border-transparent hover:shadow-none", + link: "border-transparent hover:shadow-none underline !min-h-0 !py-0 !px-1 active:text-primary", + }, + size: { + lg: "text-lg py-3 px-8 [&>svg]:text-2xl rounded-lg focus-visible:rounded-lg", + md: "min-h-10.5 px-4 py-2 [&>svg]:text-2xl", + sm: "text-xs min-h-[31px] py-1.5 px-2 [&>svg]:text-md", + }, + }, defaultVariants: { variant: "solid", size: "md", @@ -114,30 +110,6 @@ const Button = React.forwardRef( onClick?.(e) } - if (variant === "glow") { - const { children, ...buttonProps } = props - return ( - - ) - } const Comp = asChild ? Slot : "button" return ( From 3cab13f15b6c318cdd9fe6a9b102b9027442b8ce Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 14 Jul 2025 16:08:47 -0700 Subject: [PATCH 338/368] fix: /assets metadata string key --- app/[locale]/assets/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/assets/page.tsx b/app/[locale]/assets/page.tsx index da31dab188d..6adb7381f17 100644 --- a/app/[locale]/assets/page.tsx +++ b/app/[locale]/assets/page.tsx @@ -48,6 +48,6 @@ export async function generateMetadata({ locale, slug: ["assets"], title: t("page-assets-meta-title"), - description: t("page-assets-meta-description"), + description: t("page-assets-meta-desc"), }) } From 42c881af123cb3a989a03a188cd463bf3c0fc437 Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 15 Jul 2025 13:42:39 +0200 Subject: [PATCH 339/368] fix: handle missing CoinGecko stablecoin data gracefully --- app/[locale]/stablecoins/page.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/[locale]/stablecoins/page.tsx b/app/[locale]/stablecoins/page.tsx index 96c7c41e434..dba1c00c0ab 100644 --- a/app/[locale]/stablecoins/page.tsx +++ b/app/[locale]/stablecoins/page.tsx @@ -115,11 +115,16 @@ async function Page({ params }: { params: Promise<{ locale: Lang }> }) { const ethereumStablecoinData = stablecoins .map(({ id, ...rest }) => { const coinMarketData = stablecoinsData.find((coin) => coin.id === id) - if (!coinMarketData) - throw new Error("CoinGecko stablecoin data not found:" + id) + if (!coinMarketData) { + console.warn("CoinGecko stablecoin data not found:", id) + return null + } return { ...coinMarketData, ...rest } }) - .filter((coin) => coin.market_cap >= MIN_MARKET_CAP_USD) + .filter( + (coin): coin is Exclude => + coin !== null && coin.market_cap >= MIN_MARKET_CAP_USD + ) .sort((a, b) => b.market_cap - a.market_cap) .map(({ market_cap, ...rest }) => ({ ...rest, From 98062ddc9d132291bae2c5d41388e505c04fea77 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 10:53:14 -0700 Subject: [PATCH 340/368] fix: remove isolated href from intl strings --- app/[locale]/trillion-dollar-security/page.tsx | 6 +----- src/intl/en/page-trillion-dollar-security.json | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/app/[locale]/trillion-dollar-security/page.tsx b/app/[locale]/trillion-dollar-security/page.tsx index b982c37b85e..5ae782bcbb5 100644 --- a/app/[locale]/trillion-dollar-security/page.tsx +++ b/app/[locale]/trillion-dollar-security/page.tsx @@ -107,11 +107,7 @@ const TdsPage = async ({ params }: { params: Promise<{ locale: Lang }> }) => {

    {t.rich("page-trillion-dollar-security-hero-paragraph-5", { a: (chunks) => ( - + {chunks} ), diff --git a/src/intl/en/page-trillion-dollar-security.json b/src/intl/en/page-trillion-dollar-security.json index 98a02332a0d..1b7233a53e9 100644 --- a/src/intl/en/page-trillion-dollar-security.json +++ b/src/intl/en/page-trillion-dollar-security.json @@ -8,7 +8,6 @@ "page-trillion-dollar-security-hero-paragraph-3": "Billions of individuals are each comfortable holding more than $1000 onchain, collectively amounting to trillions of dollars secured on Ethereum.", "page-trillion-dollar-security-hero-paragraph-4": "Companies, institutions, and governments are comfortable storing more than 1 trillion dollars of value inside a single contract or application, and are comfortable transacting in comparable amounts.", "page-trillion-dollar-security-hero-paragraph-5": "The Trillion Dollar Security (1TS) project is an ecosystem-wide effort to upgrade Ethereum's security. This report is the first deliverable of the 1TS project. Over the last month, we have gathered feedback from users, developers, security experts, and institutions about where they see the biggest challenges and areas for improvement. Thank you to the hundreds of people and dozens of organizations who have taken the time to share your insights with us.", - "page-trillion-dollar-security-hero-paragraph-5-link": "https://blog.ethereum.org/2025/05/14/trillion-dollar-security", "page-trillion-dollar-security-hero-paragraph-6": "This report summarizes our findings, covering 6 distinct areas:", "page-trillion-dollar-security-report-card-title": "Ethereum ecosystem security overview report", "page-trillion-dollar-security-download-report": "Download PDF", From 95976dfcb641127db88ee9e336e96ceb00080bbd Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 11:20:12 -0700 Subject: [PATCH 341/368] i18n: extract string for translation use t.rich with embedded component to use as reusable string with variable number attachment; requires .tsx extension on utils.tsx --- .../developers/_components/VideoCourseCard.tsx | 3 +-- app/[locale]/developers/types.ts | 2 +- app/[locale]/developers/{utils.ts => utils.tsx} | 15 ++++++++++----- src/intl/en/page-developers-index.json | 1 + 4 files changed, 13 insertions(+), 8 deletions(-) rename app/[locale]/developers/{utils.ts => utils.tsx} (93%) diff --git a/app/[locale]/developers/_components/VideoCourseCard.tsx b/app/[locale]/developers/_components/VideoCourseCard.tsx index 70b994b76a5..7024ff7325e 100644 --- a/app/[locale]/developers/_components/VideoCourseCard.tsx +++ b/app/[locale]/developers/_components/VideoCourseCard.tsx @@ -35,8 +35,7 @@ const VideoCourseCard = ({ course, className }: VideoCourseCardProps) => ( size="small" className="mb-2 mt-4 rounded-[4px] px-1 py-0 font-bold normal-case" > - {/* // TODO: Extract intl */} - {Math.round(course.hours)}-hour course + {course.hours}

    {course.title} diff --git a/app/[locale]/developers/types.ts b/app/[locale]/developers/types.ts index cbb7c2118db..1835d6bd692 100644 --- a/app/[locale]/developers/types.ts +++ b/app/[locale]/developers/types.ts @@ -15,5 +15,5 @@ export type DevelopersPath = CardInfo & { } export type VideoCourse = CardInfo & { - hours: number + hours: ReactNode } diff --git a/app/[locale]/developers/utils.ts b/app/[locale]/developers/utils.tsx similarity index 93% rename from app/[locale]/developers/utils.ts rename to app/[locale]/developers/utils.tsx index 5e28aa1d742..8825fa9132a 100644 --- a/app/[locale]/developers/utils.ts +++ b/app/[locale]/developers/utils.tsx @@ -62,11 +62,16 @@ export const getVideoCourses = async (): Promise => { namespace: "page-developers-index", }) + const getDuration = (hours: number) => + t.rich("page-developers-course-duration", { + span: () => {hours}, + }) + return [ { title: t("page-developers-course-blockchain-basics-title"), description: t("page-developers-course-blockchain-basics-desc"), - hours: 3, + hours: getDuration(3), imgSrc: cyfrinBasicBanner, imgAlt: t("page-developers-course-blockchain-basics-alt"), href: "https://updraft.cyfrin.io/courses/blockchain-basics", @@ -74,7 +79,7 @@ export const getVideoCourses = async (): Promise => { { title: t("page-developers-course-solidity-title"), description: t("page-developers-course-solidity-desc"), - hours: 5, + hours: getDuration(5), imgSrc: cyfrinSolidityBanner, imgAlt: t("page-developers-course-solidity-alt"), href: "https://updraft.cyfrin.io/courses/solidity", @@ -82,7 +87,7 @@ export const getVideoCourses = async (): Promise => { { title: t("page-developers-course-foundry-fundamentals-title"), description: t("page-developers-course-foundry-fundamentals-desc"), - hours: 10, + hours: getDuration(10), imgSrc: cyfrinFoundryFundamentalsBanner, imgAlt: t("page-developers-course-foundry-fundamentals-alt"), href: "https://updraft.cyfrin.io/courses/foundry", @@ -90,7 +95,7 @@ export const getVideoCourses = async (): Promise => { { title: t("page-developers-course-advanced-foundry-title"), description: t("page-developers-course-advanced-foundry-desc"), - hours: 13, + hours: getDuration(13), imgSrc: cyfrinFoundryAdvancedBanner, imgAlt: t("page-developers-course-advanced-foundry-alt"), href: "https://updraft.cyfrin.io/courses/advanced-foundry", @@ -98,7 +103,7 @@ export const getVideoCourses = async (): Promise => { { title: t("page-developers-course-security-title"), description: t("page-developers-course-security-desc"), - hours: 24, + hours: getDuration(24), imgSrc: cyfrinSecurityBanner, imgAlt: t("page-developers-course-security-alt"), href: "https://updraft.cyfrin.io/courses/security", diff --git a/src/intl/en/page-developers-index.json b/src/intl/en/page-developers-index.json index f2b4718d799..1595981a3f5 100644 --- a/src/intl/en/page-developers-index.json +++ b/src/intl/en/page-developers-index.json @@ -109,6 +109,7 @@ "page-developers-speedrun-token-title": "Create a token", "page-developers-speedrun-token-desc": "Build a digital currency and a smart contract that trades it.", "page-developers-speedrun-challenge-2": "Challenge #2", + "page-developers-course-duration": "-hour course", "page-developers-course-blockchain-basics-title": "Blockchain basics", "page-developers-course-blockchain-basics-desc": "Learn how blockchains and smart contracts work, create a wallet, and sign your first transaction.", "page-developers-course-blockchain-basics-alt": "Cyfrin Updraft Blockchain basics course banner", From 1cb054327a06dda9bac9e864bfe0dd953bd6aa19 Mon Sep 17 00:00:00 2001 From: Savio <72797635+Savio-Sou@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:14:08 -0400 Subject: [PATCH 342/368] fix: Label Ready as closed source --- src/data/wallets/wallet-data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 7ac1657fe13..d4ce07d1fbd 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -169,8 +169,8 @@ export const walletsData: WalletData[] = [ firefox: true, chromium: true, hardware: false, - open_source: true, - repo_url: "https://github.com/argentlabs/argent-x", + open_source: false, + repo_url: "", non_custodial: true, security_audit: [ "https://github.com/argentlabs/argent-contracts/tree/develop/audit", From 4885897e2a573207dd938493352fb5df0539bd0e Mon Sep 17 00:00:00 2001 From: Savio <72797635+Savio-Sou@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:16:11 -0400 Subject: [PATCH 343/368] Update "Last Updated" date --- src/data/wallets/wallet-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index d4ce07d1fbd..b23ee46521f 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -149,7 +149,7 @@ export const walletsData: WalletData[] = [ supported_chains: ["Ethereum Mainnet"], }, { - last_updated: "2025-07-08", + last_updated: "2025-07-15", name: "Ready Wallet", image: ReadyImage, twBackgroundColor: "bg-[#FFFFFF]", From 9304cbe0329d5bf1887aab8f797a9ebcff362735 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:35:06 -0700 Subject: [PATCH 344/368] chore: remove stray syntax --- src/intl/de/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/de/common.json b/src/intl/de/common.json index 4f998792e2a..d7c01cd0654 100644 --- a/src/intl/de/common.json +++ b/src/intl/de/common.json @@ -34,7 +34,7 @@ "contributor-quiz-banner-description": "Nehmen Sie an einem kurzen Quiz teil und finden Sie heraus, wie Sie auf ethereum.org mitwirken können.", "contributor-quiz-banner-button": "Nehmen Sie an einem Quiz teil", "contributors": "Mitwirkende", - "contributors-thanks": "Vielen Dank an jeden, der zu dieser Seite \\beigetragen hat!", + "contributors-thanks": "Vielen Dank an jeden, der zu dieser Seite beigetragen hat!", "cookie-policy": "Cookie-Richtlinien", "copied": "Kopiert", "copy": "Kopieren", From 554fde7ab02f4a358b72c068efb53f42ea24b48f Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:39:42 -0700 Subject: [PATCH 345/368] revert: import regressions --- .../translations/it/contributing/adding-layer-2s/index.md | 2 +- .../translations/it/contributing/content-resources/index.md | 2 +- .../translation-program/translators-guide/index.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/content/translations/it/contributing/adding-layer-2s/index.md b/public/content/translations/it/contributing/adding-layer-2s/index.md index c2555ded0dc..e9849ec77de 100644 --- a/public/content/translations/it/contributing/adding-layer-2s/index.md +++ b/public/content/translations/it/contributing/adding-layer-2s/index.md @@ -92,6 +92,6 @@ _Non prendiamo in considerazione altre soluzioni di scalabilità che non utilizz Se desideri aggiungere un livello 2 su ethereum.org, crea un ticket su GitHub. - + Crea un ticket diff --git a/public/content/translations/it/contributing/content-resources/index.md b/public/content/translations/it/contributing/content-resources/index.md index e054d002c9b..86d4b4a66f0 100644 --- a/public/content/translations/it/contributing/content-resources/index.md +++ b/public/content/translations/it/contributing/content-resources/index.md @@ -27,6 +27,6 @@ Le risorse di apprendimento saranno valutate sulla base dei seguenti criteri: Se desideri aggiungere a ethereum.org una risorsa di contenuto che soddisfa i criteri, crea un ticket su GitHub. - + Crea un ticket diff --git a/public/content/translations/it/contributing/translation-program/translators-guide/index.md b/public/content/translations/it/contributing/translation-program/translators-guide/index.md index ac641181cb3..b9a7c3d0bf5 100644 --- a/public/content/translations/it/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/it/contributing/translation-program/translators-guide/index.md @@ -116,7 +116,7 @@ Il modo migliore per gestire i collegamenti è copiarli direttamente dal testo d ![Esempio di link.png](./example-of-link.png) -I link appaiono nel testo di partenza anche sotto forma di tag (cioè \<0> \). Se passi sul tag, l'editor ne mostrerà il contenuto completo; talvolta questi tag rappresentano dei link. +I link appaiono nel testo di partenza anche sotto forma di tag (cioè `<0> `). Se passi sul tag, l'editor ne mostrerà il contenuto completo; talvolta questi tag rappresentano dei link. È molto importante copiare i link dal testo di partenza senza modificarne l'ordine. @@ -154,7 +154,7 @@ nonce - _Testo non traducibile_ Il testo di partenza contiene anche tag abbreviati, contenenti solo numeri, il che significa che la loro funzione non è immediatamente ovvia. Puoi passare su questi tag per vedere esattamente quale scopo assolvono. -Nell'esempio seguente, passando con il mouse sul \<0> tag puoi vedere che rappresenta `` e contiene un frammento di codice, quindi il contenuto non va tradotto. +Nell'esempio seguente, passando con il mouse sul `<0>` tag puoi vedere che rappresenta `` e contiene un frammento di codice, quindi il contenuto non va tradotto. ![Esempio di tag ambigui.png](./example-of-ambiguous-tags.png) From a16cfe3b390f17556e178189609b67988bbb59b1 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:49:06 -0700 Subject: [PATCH 346/368] fix: crowdin bugs --- src/intl/tr/page-what-is-ethereum.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/tr/page-what-is-ethereum.json b/src/intl/tr/page-what-is-ethereum.json index d666d732355..214d68a6817 100644 --- a/src/intl/tr/page-what-is-ethereum.json +++ b/src/intl/tr/page-what-is-ethereum.json @@ -54,7 +54,7 @@ "page-what-is-ethereum-slide-1-desc-2": "Ethereum ve sabit paralar, yurt dışına para gönderme sürecini basitleştirir. Ortalama bankanızı ve fiyatın bir kısmını alabilecek birkaç iş günü ve hatta haftanın aksine, fonları dünya çapında taşımak genellikle sadece birkaç dakika sürer. Ek olarak, yüksek değerli bir işlem gerçekleştirmek için ekstra bir ücret yoktur ve paranızı nereye veya neden göndereceğiniz konusunda bir kısıtlama yok.", "page-what-is-ethereum-slide-2-title": "Kriz Zamanlarında En Hızlı Çözüm", "page-what-is-ethereum-slide-2-desc-1": "Yaşadığınız yerde güvenilir kurumlar aracılığıyla birden fazla bankacılık seçeneğine sahip olacak kadar şanslıysanız sundukları finansal özgürlük, güvenlik ve istikrarı doğal karşılayabilirsiniz. Ancak dünyanın dört bir yanında siyasi baskı veya ekonomik zorluklarla karşı karşıya olan birçok insan için finansal kurumlar ihtiyaç duydukları koruma veya servisleri sağlayamayabilir.", - "page-what-is-ethereum-slide-2-desc-2": "Savaş, ekonomik felaketler veya sivil özgürlüklere yönelik baskılar Venezuela,Küba,Afganistan,Nijerya,Belarus ve Ukrayna vatandaşlarını vurduğunda, kripto paralar finansal değerleri elde tutmanın en hızlı ve çoğu zaman tek seçeneği haline geldi.1Ethereum gibi kripto paralar, bu örneklerde görüldüğü gibi insanların dış dünyayla bağlantıları kesildiğinde küresel ekonomiye sınırsız erişim olanağı sağlayabilir. Ayrıca stabil paralar, yerel para birimleri süper enflasyon nedeniyle çöktüğünde bir değer saklama aracı görevi görür.", + "page-what-is-ethereum-slide-2-desc-2": "Savaş, ekonomik felaketler veya sivil özgürlüklere yönelik baskılar Venezuela, Küba, Afganistan, Nijerya, Belarus ve Ukrayna vatandaşlarını vurduğunda, kripto paralar finansal değerleri elde tutmanın en hızlı ve çoğu zaman tek seçeneği haline geldi.1Ethereum gibi kripto paralar, bu örneklerde görüldüğü gibi insanların dış dünyayla bağlantıları kesildiğinde küresel ekonomiye sınırsız erişim olanağı sağlayabilir. Ayrıca stabil paralar, yerel para birimleri süper enflasyon nedeniyle çöktüğünde bir değer saklama aracı görevi görür.", "page-what-is-ethereum-slide-3-title": "Yaratıcıları Güçlendirme", "page-what-is-ethereum-slide-3-desc-1": "Yalnızca 2021'de sanatçılar, müzisyenler, yazarlar ve diğer içerik oluşturucular Ethereum'u kullanarak toplu olarak yaklaşık 3,5 milyar dolar kazandı. Bu da Ethereum'u Spotify, YouTube ve Etsy ile birlikte yaratıcılar için en büyük küresel platformlardan biri haline getiriyor. Daha fazla bilgi edinin.", "page-what-is-ethereum-slide-4-title": "Oyuncuları Güçlendirme", From 8b8b0a5eb5d93dde89627ce74e5142487cd79b6b Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:52:28 -0700 Subject: [PATCH 347/368] fix: crowdin regression --- src/intl/uk/page-staking-deposit-contract.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/uk/page-staking-deposit-contract.json b/src/intl/uk/page-staking-deposit-contract.json index a6fe1c7cffe..c2953fe6e80 100644 --- a/src/intl/uk/page-staking-deposit-contract.json +++ b/src/intl/uk/page-staking-deposit-contract.json @@ -8,7 +8,7 @@ "page-staking-deposit-contract-confirm-address": "Підтвердьте наведене нижче, щоб відобразити адресу.", "page-staking-deposit-contract-copied": "Скопійована адреса", "page-staking-deposit-contract-copy": "Копіювати адресу", - "page-staking-deposit-contract-etherscan": "Переглянути контракт на Etherscan", + "page-staking-deposit-contract-blockexplorer": "Переглянути контракт на Etherscan", "page-staking-deposit-contract-h2": "Тут не можна зробити ставку", "page-staking-deposit-contract-launchpad": "Стейкінг за допомогою стартової платформи", "page-staking-deposit-contract-launchpad-2": "Використати стартову платформу", From c0a65e5155cbfd77a99fc4722570b8b1779ce1f7 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:55:25 -0700 Subject: [PATCH 348/368] revert: crowdin import regressions --- .../translations/zh-tw/contributing/adding-layer-2s/index.md | 2 +- .../translations/zh-tw/contributing/content-resources/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/zh-tw/contributing/adding-layer-2s/index.md b/public/content/translations/zh-tw/contributing/adding-layer-2s/index.md index 9a6c4a5bd46..3e476220719 100644 --- a/public/content/translations/zh-tw/contributing/adding-layer-2s/index.md +++ b/public/content/translations/zh-tw/contributing/adding-layer-2s/index.md @@ -92,6 +92,6 @@ _我們認為,其他不使用以太坊來實現資料可用性或安全性的 如果你想在 ethereum.org 上新增二層網路層,請在 GitHub 上建立議題。 - + 建立一個議題 diff --git a/public/content/translations/zh-tw/contributing/content-resources/index.md b/public/content/translations/zh-tw/contributing/content-resources/index.md index 51cc723e439..0b1107dfa00 100644 --- a/public/content/translations/zh-tw/contributing/content-resources/index.md +++ b/public/content/translations/zh-tw/contributing/content-resources/index.md @@ -27,6 +27,6 @@ description: 我們在 ethereum.org 上列出內容資源的標準 如果你想將內容資源新增至 ethereum.org 並且它符合標準,請在 GitHub 上建立一個議題。 - + 創建一個議題 From e2cb2e18ffb382eb104382da58b01cb2d6c34741 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:01:16 -0700 Subject: [PATCH 349/368] revert: crowdin import regressions --- .../translations/zh/contributing/adding-layer-2s/index.md | 2 +- .../translations/zh/contributing/content-resources/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/zh/contributing/adding-layer-2s/index.md b/public/content/translations/zh/contributing/adding-layer-2s/index.md index d57ce9f51d1..2aec168e548 100644 --- a/public/content/translations/zh/contributing/adding-layer-2s/index.md +++ b/public/content/translations/zh/contributing/adding-layer-2s/index.md @@ -92,6 +92,6 @@ _我们认为,其他不使用以太坊来实现数据可用性或安全性的 如果你想将二层网络添加到 ethereum.org,请在 GitHub 上创建一个提议。 - + 创建一个提议 diff --git a/public/content/translations/zh/contributing/content-resources/index.md b/public/content/translations/zh/contributing/content-resources/index.md index c9f33cd0bab..049361ca6ba 100644 --- a/public/content/translations/zh/contributing/content-resources/index.md +++ b/public/content/translations/zh/contributing/content-resources/index.md @@ -27,6 +27,6 @@ description: 在 ethereum.org 上上架内容资源的标准 如果你想要将内容资源添加到 ethereum.org,并且该内容资源符合标准,请在 GitHub 上创建一个提议。 - + 创建一个提议 From 3997609eeba79d370924f24e6e09ebb47cdbf142 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:01:32 -0700 Subject: [PATCH 350/368] revert: english-only section --- .../translations/zh/real-world-assets/index.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/public/content/translations/zh/real-world-assets/index.md b/public/content/translations/zh/real-world-assets/index.md index e9b51aa8d2a..6695a29aef7 100644 --- a/public/content/translations/zh/real-world-assets/index.md +++ b/public/content/translations/zh/real-world-assets/index.md @@ -25,17 +25,6 @@ summaryPoint3: 连接传统金融和区块链生态系统。 RWA 代币没有任何内在价值。 它们反映的是所代表的物品的价值,因此代币的价值会随着物品的价值而变化。 -## RWA 有哪些优势? {#rwas-benifits} - - - - - - - - - - ## RWA 如何运作? {#how-rwas-work} 让我们看一下 RWA 生态系统中的几个例子:房地产、传统金融产品和艺术品。 From 39b6e06c00f5508815d92dd48b0571ddbf6e2a6e Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:40:02 -0700 Subject: [PATCH 351/368] revert: recurrent crowdin regressions --- .../translations/fr/contributing/adding-layer-2s/index.md | 2 +- .../translations/fr/contributing/content-resources/index.md | 2 +- .../translation-program/translators-guide/index.md | 4 ++-- .../docs/design-and-ux/dex-design-best-practice/index.md | 6 +++--- .../docs/nodes-and-clients/node-architecture/index.md | 2 +- .../docs/smart-contracts/formal-verification/index.md | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/content/translations/fr/contributing/adding-layer-2s/index.md b/public/content/translations/fr/contributing/adding-layer-2s/index.md index 18c84d4f524..ec77967918c 100644 --- a/public/content/translations/fr/contributing/adding-layer-2s/index.md +++ b/public/content/translations/fr/contributing/adding-layer-2s/index.md @@ -92,6 +92,6 @@ _Nous ne considérons pas comme relevant de la couche 2 les autres solutions d' Si vous souhaitez ajouter une Couche 2 sur ethereum.org, créez un ticket sur GitHub. - + Créez un ticket diff --git a/public/content/translations/fr/contributing/content-resources/index.md b/public/content/translations/fr/contributing/content-resources/index.md index 6dbae83cee0..8d1f6574770 100644 --- a/public/content/translations/fr/contributing/content-resources/index.md +++ b/public/content/translations/fr/contributing/content-resources/index.md @@ -27,6 +27,6 @@ Les ressources d'apprentissage seront évaluées selon les critères suivants : Si vous souhaitez ajouter une ressource de contenu à ethereum.org et qu'elle répond aux critères, créez un ticket sur GitHub. - + Créez un ticket diff --git a/public/content/translations/fr/contributing/translation-program/translators-guide/index.md b/public/content/translations/fr/contributing/translation-program/translators-guide/index.md index 64dbf0cfcf5..bcb331c2aca 100644 --- a/public/content/translations/fr/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/fr/contributing/translation-program/translators-guide/index.md @@ -116,7 +116,7 @@ La meilleure façon de gérer les liens est de les copier directement à partir ![Exemple de lien.png](./example-of-link.png) -Les liens apparaissent également dans le texte source sous la forme de balises (c'est-à-dire \<0> \). Si vous survolez la balise, l'éditeur affichera son véritable contenu. Parfois, ces balises désigneront des liens. +Les liens apparaissent également dans le texte source sous la forme de balises (c'est-à-dire `<0> `). Si vous survolez la balise, l'éditeur affichera son véritable contenu. Parfois, ces balises désigneront des liens. Il est très important de copier les liens depuis le texte source et de ne pas modifier l'ordre des balises. @@ -154,7 +154,7 @@ nonce - _Texte non traduisible_ Le texte source contient aussi des balises raccourcies. Elles contiennent uniquement des chiffres et leur fonction n'est donc pas directement identifiable. Vous pouvez survoler ces balises pour voir exactement ce à quoi elles servent. -Dans l'exemple ci-dessous, vous pouvez voir que survoler la balise \<0> nous permet de savoir qu'elle désigne en fait une balise `` et qu'elle contient un extrait de code. Le contenu de ces balises ne doit donc pas être traduit. +Dans l'exemple ci-dessous, vous pouvez voir que survoler la balise `<0>` nous permet de savoir qu'elle désigne en fait une balise `` et qu'elle contient un extrait de code. Le contenu de ces balises ne doit donc pas être traduit. ![Exemple de balises ambiguës.png](./example-of-ambiguous-tags.png) diff --git a/public/content/translations/fr/developers/docs/design-and-ux/dex-design-best-practice/index.md b/public/content/translations/fr/developers/docs/design-and-ux/dex-design-best-practice/index.md index 41ab7455f08..0ff53041b88 100644 --- a/public/content/translations/fr/developers/docs/design-and-ux/dex-design-best-practice/index.md +++ b/public/content/translations/fr/developers/docs/design-and-ux/dex-design-best-practice/index.md @@ -179,7 +179,7 @@ La loi de proximité stipule que les éléments proches sont perçus comme étan En fin de compte, les deux options présentent des avantages et des inconvénients, mais il est intéressant de noter que la tendance est au jeton placé à droite. -# Comportement du bouton {#button-behavior} +## Comportement du bouton {#button-behavior} N'ayez pas de bouton séparé pour l'approbation. Évitez également de demander un clic séparé pour l'approbation. L'utilisateur veut effectuer un échange, il suffit donc d'indiquer "échanger" sur le bouton et de lancer l'approbation comme première étape. Une fenêtre modale peut afficher la progression avec un indicateur d'étapes, ou une simple notification du type "tx 1 sur 2 - approbation en cours". @@ -187,7 +187,7 @@ N'ayez pas de bouton séparé pour l'approbation. Évitez également de demander ![Une interface utilisateur avec un seul bouton d'approbation](./15.png) -## Bouton comme aide contextuelle {#button-as-contextual-help} +### Bouton comme aide contextuelle {#button-as-contextual-help} Le bouton peut également servir d'alerte ! @@ -205,7 +205,7 @@ Le bouton peut également être **associé à l'action** qui doit être effectu ![Message d'erreur affiché dans le principal appel à l'action](./17.png) -## Construisez le vôtre avec ce fichier Figma {#build-your-own-with-this-figma-file} +### Construisez le vôtre avec ce fichier Figma {#build-your-own-with-this-figma-file} Grâce au travail acharné de plusieurs protocoles, la conception des DEX s'est beaucoup améliorée. Nous savons de quelles informations l'utilisateur a besoin, de quelle manière nous devons les présenter et comment rendre le flux aussi fluide que possible. Nous espérons que cet article vous offrira un aperçu solide des principes UX. diff --git a/public/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/index.md index a611ccec1f3..a6adc5973b0 100644 --- a/public/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/index.md +++ b/public/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/index.md @@ -18,7 +18,7 @@ Pour que cette structure à deux clients fonctionne, les clients de consensus do ## Que fait le client d'exécution ? {#execution-client} -Le client d’exécution est responsable de la validation, du traitement et de la propagation des transactions, ainsi que de la gestion de l’état et du support de la Machine Virtuelle Ethereum ([EVM\](/developers/docs/evm/)). Il n'est **pas** responsable de la construction de blocs, de leur propagation ou de la gestion de la logique de consensus. Ces responsabilités relèvent du client de consensus. +Le client d’exécution est responsable de la validation, du traitement et de la propagation des transactions, ainsi que de la gestion de l’état et du support de la Machine Virtuelle Ethereum ([EVM](/developers/docs/evm/)). Il n'est **pas** responsable de la construction de blocs, de leur propagation ou de la gestion de la logique de consensus. Ces responsabilités relèvent du client de consensus. Le client d'exécution crée des charges utiles d'exécution - la liste des transactions, la trie d'état mise à jour, et d'autres données liées à l'exécution. Les clients de consensus incluent la charge utile d'exécution dans chaque bloc. Le client d'exécution est également responsable de réexécuter les transactions dans les nouveaux blocs pour s'assurer qu'elles sont valides. L'exécution des transactions est effectuée sur l'ordinateur intégré du client d'exécution, connu sous le nom de [Machine Virtuelle Ethereum (EVM)](/developers/docs/evm). diff --git a/public/content/translations/fr/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/fr/developers/docs/smart-contracts/formal-verification/index.md index 6c3a724a3b8..7c43dec0543 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/formal-verification/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/formal-verification/index.md @@ -70,7 +70,7 @@ Les spécifications formelles de bas niveau peuvent être données sous forme de ### Propriétés de style Hoare {#hoare-style-properties} -[La logique Hoare](https://en.wikipedia.org/wiki/Hoare_logic) fournit un ensemble de règles formelles pour raisonner sur la correction des programmes, y compris les contrats intelligents. Une propriété de style Hoare est représentée par un triple Hoare {_P_}_c_{_Q_}, où _c_ est un programme et _P_ et _Q_ sont des prédicats sur l'état de _c_ (c'est-à-dire le programme), formellement décrits comme des _prérequis_ et des _conditions ulérieures_, respectivement. +[La logique Hoare](https://en.wikipedia.org/wiki/Hoare_logic) fournit un ensemble de règles formelles pour raisonner sur la correction des programmes, y compris les contrats intelligents. Une propriété de style Hoare est représentée par un triple Hoare `{P}c{Q}`, où `c` est un programme et `P` et `Q` sont des prédicats sur l'état de `c` (c'est-à-dire le programme), formellement décrits comme des _prérequis_ et des _conditions ulérieures_, respectivement. Un prérequis est un prédicat décrivant les conditions requises pour l'exécution correcte d'une fonction ; les utilisateurs qui font appel au contrat doivent satisfaire à cette exigence. Une condition ultérieure est un prédicat décrivant la condition qu'une fonction établit si elle est correctement exécutée ; les utilisateurs peuvent s'attendre à ce que cette condition soit vraie après avoir appelé la fonction. Un _invariant_ en logique Hoare est un prédicat qui est préservé par l'exécution d'une fonction (c'est-à-dire qu'il ne change pas). From 206d5a30e014e13e2cc090130d4580f445459a92 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:18:11 -0700 Subject: [PATCH 352/368] patch: add padding --- app/[locale]/community/_components/community.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/[locale]/community/_components/community.tsx b/app/[locale]/community/_components/community.tsx index db68863f4db..ea3576a11b6 100644 --- a/app/[locale]/community/_components/community.tsx +++ b/app/[locale]/community/_components/community.tsx @@ -161,9 +161,11 @@ const CommunityPage = () => { - +
    -

    {t("page-community-why-get-involved-title")}

    +

    + {t("page-community-why-get-involved-title")} +

    {whyGetInvolvedCards.map((card, idx) => ( @@ -176,7 +178,7 @@ const CommunityPage = () => { /> ))} - +
    From d7b3f6922e4defecaa82006084d359bf35d8d5db Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:26:55 -0700 Subject: [PATCH 353/368] chore: remove whitespace --- public/content/roadmap/pectra/7702/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/content/roadmap/pectra/7702/index.md b/public/content/roadmap/pectra/7702/index.md index ff2187920bb..70f4a39268d 100644 --- a/public/content/roadmap/pectra/7702/index.md +++ b/public/content/roadmap/pectra/7702/index.md @@ -120,8 +120,6 @@ Due to the nature of EIP 7702, it is recommended wallets use caution when helpin - 0x63c0c19a282a1b52b07dd5a65b58948a07dae32b [[MetaMask/delegation-framework]](https://github.com/MetaMask/delegation-framework) / [audits](https://github.com/MetaMask/delegation-framework/tree/main/audits) - 0x4Cd241E8d1510e30b2076397afc7508Ae59C66c9 [[Ethereum Foundation AA team]](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/accounts/Simple7702Account.sol) / [audits](https://github.com/eth-infinitism/account-abstraction/blob/develop/audits/SpearBit%20Account%20Abstraction%20Security%20Review%20-%20Mar%202025.pdf) - - ## Hardware wallet guidelines {#hardware-wallet-guidelines} Hardware wallets shouldn't expose arbitrary delegation. The consensus in the Hardware wallet space is to use a list of trusted delegator contracts. We suggest to allow known implementations listed above and to consider others on a case by case basis. As delegating your EOA to a contract gives control over all the assets, hardware wallets should be cautious with the way they implement 7702. From c371c066cbfbe60d988090c562241697049e6b41 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:34:22 -0700 Subject: [PATCH 354/368] refactor: use markdown table --- public/content/roadmap/pectra/7702/index.md | 40 ++++++++++----------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/public/content/roadmap/pectra/7702/index.md b/public/content/roadmap/pectra/7702/index.md index 70f4a39268d..d2da80649c8 100644 --- a/public/content/roadmap/pectra/7702/index.md +++ b/public/content/roadmap/pectra/7702/index.md @@ -4,7 +4,7 @@ description: Learn more about 7702 in the Pectra release lang: en --- -# Pectra 7702 +# Pectra 7702 ## Abstract {#abstract} @@ -16,7 +16,7 @@ This new transaction type introduces an authorization list. Each authorization t [ chain_id, address, nonce, y_parity, r, s ] ``` -**address** is the delegation (already deployed bytecode that'll be used by the EOA) +**address** is the delegation (already deployed bytecode that'll be used by the EOA) **chain_id** locks the authorization to a specific chain (or 0 for all chains) **nonce** locks the authorization to a specific account nonce (**y_parity, r, s**) is the signature of the authorization tuple, defined as keccak(0x05 || rlp ([chain_id ,address, nonce])) by the private key of EOA to which the authorization applies (also called the authority) @@ -29,7 +29,8 @@ The private key of the EOA retains full control over the account after the deleg **Account Abstraction**: A delegation contract should align with Ethereum’s broader account abstraction (AA) standards to maximize compatibility. In particular, it should ideally be ERC-4337 compliant or compatible. -**Permissionless and Censorship-Resistant Design**: Ethereum values permissionless participation. A delegation contract MUST NOT hard-code or rely on any single “trusted” relayer or service. This would brick the account if the relayer goes offline. Features like batching (e.g. approve+transferFrom) can by used by the EOA itself without a relayer. For application developers that want to use advanced features enabled by 7702 (Gas Abstraction, Privacy-Preserving Withdrawals) you’ll need a relayer. While there are different relayer architectures, our recommendation is to use [4337 bundlers](https://www.erc4337.io/bundlers) pointing at least [entry point 0.8](https://github.com/eth-infinitism/account-abstraction/releases/tag/v0.8.0) because: +**Permissionless and Censorship-Resistant Design**: Ethereum values permissionless participation. A delegation contract MUST NOT hard-code or rely on any single “trusted” relayer or service. This would brick the account if the relayer goes offline. Features like batching (e.g. approve+transferFrom) can by used by the EOA itself without a relayer. For application developers that want to use advanced features enabled by 7702 (Gas Abstraction, Privacy-Preserving Withdrawals) you’ll need a relayer. While there are different relayer architectures, our recommendation is to use [4337 bundlers](https://www.erc4337.io/bundlers) pointing at least [entry point 0.8](https://github.com/eth-infinitism/account-abstraction/releases/tag/v0.8.0) because: + - They provide standardized interfaces for relaying - Include built-in paymaster systems - Ensure forward compatibility @@ -51,11 +52,11 @@ By utilizing these interfaces, dApps can access smart account functionalities pr > Note: There is no standardized method for dApps to request 7702 authorization signatures directly. DApps must rely on specific wallet interfaces like ERC-6900 to take advantage of EIP-7702 features. For more information: + - [ERC-5792 specification](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-5792.md) - [ERC-6900 specification](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-6900.md) - -**Avoiding Vendor Lock-In**: In line with the above, a good implementation is vendor-neutral and interoperable. This often means adhering to emerging standards for smart accounts. For instance, [Alchemy’s Modular Account](https://github.com/alchemyplatform/modular-account) uses the ERC-6900 standard for modular smart accounts and is designed with “permissionless interoperable usage” in mind. +**Avoiding Vendor Lock-In**: In line with the above, a good implementation is vendor-neutral and interoperable. This often means adhering to emerging standards for smart accounts. For instance, [Alchemy’s Modular Account](https://github.com/alchemyplatform/modular-account) uses the ERC-6900 standard for modular smart accounts and is designed with “permissionless interoperable usage” in mind. **Privacy Preservation**: While onchain privacy is limited, a delegation contract should strive to minimize data exposure and linkability. This can be achieved by supporting features like gas payments in ERC-20 tokens (so users need not maintain a public ETH balance, which improves privacy and UX) and one-time session keys (which reduce reliance on a single long-term key). For example, EIP-7702 enables paying gas in tokens via sponsored transactions, and a good implementation will make it easy to integrate such paymasters without leaking more information than necessary. Additionally, off-chain delegation of certain approvals (using signatures that are verified onchain) means fewer onchain transactions with the user’s primary key, aiding privacy. Accounts that require using a relayer force users to reveal their IP addresses. PublicMempools improves this, when a transaction/UserOp propagates through the mempool you can't tell whether it originated from the IP that sent it, or just relayed through it via the p2p protocol. @@ -69,19 +70,17 @@ Benefits of the Proxy Pattern: For instance, the [SafeEIP7702Proxy](https://docs.safe.global/advanced/eip-7702/7702-safe) demonstrates how a proxy can be utilized to securely initialize and manage delegations in EIP-7702-compatible accounts. -Cons of the Proxy Pattern: - -- **Reliance on external actors**: You have to rely on an external team to not upgrade to an unsafe contract. +Cons of the Proxy Pattern: +- **Reliance on external actors**: You have to rely on an external team to not upgrade to an unsafe contract. ## Security Considerations {#security-considerations} - **Reentrancy guard**: With the introduction of EIP-7702 delegation, a user’s account can dynamically switch between an Externally Owned Account (EOA) and a Smart Contract (SC). This flexibility enables the account to both initiate transactions and be the target of calls. As a result, scenarios where an account calls itself and makes external calls will have `msg.sender` equal to `tx.origin`, which undermines certain security assumptions that previously relied on `tx.origin` always being an EOA. For smart contract developers, it's no longer safe to assume that `tx.origin` refers to an EOA. Likewise, using `msg.sender == tx.origin` as a safeguard against reentrancy attacks is no longer a reliable strategy. -Going forward, developers should design with the assumption that any participant in the system could be a smart contract. Alternatively they could implement explicit reentrancy protection using reentrancy guards with a `nonReentrant` modifier patterns. We recommend following an audited modifier e.g [Open Zeppelin's Reentrancy Guard](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol). They could also use a [transient storage variable](https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html). +Going forward, developers should design with the assumption that any participant in the system could be a smart contract. Alternatively they could implement explicit reentrancy protection using reentrancy guards with a `nonReentrant` modifier patterns. We recommend following an audited modifier e.g [Open Zeppelin's Reentrancy Guard](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol). They could also use a [transient storage variable](https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html). **Initialization Security Considerations** @@ -100,30 +99,29 @@ This risk is especially pertinent when attempting to use existing Smart Contract By adopting these solutions, developers can enhance the security of EIP-7702 delegation contracts, safeguarding against potential frontrunning attacks during the initialization phase. - **Storage Collisions** Delegating code does not clear existing storage. When migrating from one delegation contract to another, the residual data from the previous contract remains. If the new contract utilizes the same storage slots but interprets them differently, it can cause unintended behavior. For instance, if the initial delegation was to a contract where a storage slot represents a `bool`, and the subsequent delegation is to a contract where the same slot represents a `uint`, the mismatch can lead to unpredictable outcomes. - **Phishing risks** With the implementation of EIP-7702 delegation, the assets in a user's account may be entirely controlled by smart contracts. If a user unknowingly delegates their account to a malicious contract, an attacker could easily gain control and steal funds. When using `chain_id=0` the delegation is applied to all chain ids. Only delegate to an immutable contract (never delegate to a proxy), and only to contracts that were deployed using CREATE2 (with standard initcode - no metamorphic contracts) so the deployer can't deploy something different to the same address elsewhere. Otherwise your delegation puts your account at risk on all other EVM chains. When users perform delegated signatures, the target contract receiving the delegation should be clearly and prominently displayed to help mitigate phishing risks. -**Minimal Trusted Surface & Security**: While offering flexibility, a delegation contract should keep its core logic minimal and auditable. The contract is effectively an extension of the user’s EOA, so any flaw can be catastrophic. Implementations should follow best practices from the smart contract security community. For instance, constructor or initializer functions must be carefully secured – as highlighted by Alchemy, if using a proxy pattern under 7702, an unprotected initializer could let an attacker take over the account. Teams should aim to keep the onchain code simple: Ambire’s 7702 contract is only ~200 lines of Solidity, deliberately minimizing complexity to reduce bugs. A balance must be struck between feature-rich logic and the simplicity that eases auditing. +**Minimal Trusted Surface & Security**: While offering flexibility, a delegation contract should keep its core logic minimal and auditable. The contract is effectively an extension of the user’s EOA, so any flaw can be catastrophic. Implementations should follow best practices from the smart contract security community. For instance, constructor or initializer functions must be carefully secured – as highlighted by Alchemy, if using a proxy pattern under 7702, an unprotected initializer could let an attacker take over the account. Teams should aim to keep the onchain code simple: Ambire’s 7702 contract is only ~200 lines of Solidity, deliberately minimizing complexity to reduce bugs. A balance must be struck between feature-rich logic and the simplicity that eases auditing. ### Known implementations {#known-implementations} Due to the nature of EIP 7702, it is recommended wallets use caution when helping users delegate to a 3rd party contract. Listed below is a collection of known implementations that have been audited: -- 0x000000009B1D0aF20D8C6d0A44e162d11F9b8f00 [[Uniswap/calibur](https://github.com/Uniswap/calibur)] / [audits](https://github.com/Uniswap/calibur/tree/main/audits) -- 0x69007702764179f14F51cdce752f4f775d74E139 [[alchemyplatform/modular-account](https://github.com/alchemyplatform/modular-account)] / [audits](https://github.com/alchemyplatform/modular-account/tree/develop/audits) -- 0x5A7FC11397E9a8AD41BF10bf13F22B0a63f96f6d [[AmbireTech/ambire-common](https://github.com/AmbireTech/ambire-common/blob/feature/eip-7702/contracts/AmbireAccount7702.sol)] / [audits](https://github.com/AmbireTech/ambire-common/tree/feature/eip-7702/audits) -- 0x63c0c19a282a1b52b07dd5a65b58948a07dae32b [[MetaMask/delegation-framework]](https://github.com/MetaMask/delegation-framework) / [audits](https://github.com/MetaMask/delegation-framework/tree/main/audits) -- 0x4Cd241E8d1510e30b2076397afc7508Ae59C66c9 [[Ethereum Foundation AA team]](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/accounts/Simple7702Account.sol) / [audits](https://github.com/eth-infinitism/account-abstraction/blob/develop/audits/SpearBit%20Account%20Abstraction%20Security%20Review%20-%20Mar%202025.pdf) +| Contract address | Source | Audits | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 0x000000009B1D0aF20D8C6d0A44e162d11F9b8f00 | [Uniswap/calibur](https://github.com/Uniswap/calibur) | [audits](https://github.com/Uniswap/calibur/tree/main/audits) | +| 0x69007702764179f14F51cdce752f4f775d74E139 | [alchemyplatform/modular-account](https://github.com/alchemyplatform/modular-account) | [audits](https://github.com/alchemyplatform/modular-account/tree/develop/audits) | +| 0x5A7FC11397E9a8AD41BF10bf13F22B0a63f96f6d | [AmbireTech/ambire-common](https://github.com/AmbireTech/ambire-common/blob/feature/eip-7702/contracts/AmbireAccount7702.sol) | [audits](https://github.com/AmbireTech/ambire-common/tree/feature/eip-7702/audits) | +| 0x63c0c19a282a1b52b07dd5a65b58948a07dae32b | [MetaMask/delegation-framework](https://github.com/MetaMask/delegation-framework) | [audits](https://github.com/MetaMask/delegation-framework/tree/main/audits) | +| 0x4Cd241E8d1510e30b2076397afc7508Ae59C66c9 | [Ethereum Foundation AA team](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/accounts/Simple7702Account.sol) | [audits](https://github.com/eth-infinitism/account-abstraction/blob/develop/audits/SpearBit%20Account%20Abstraction%20Security%20Review%20-%20Mar%202025.pdf) | ## Hardware wallet guidelines {#hardware-wallet-guidelines} -Hardware wallets shouldn't expose arbitrary delegation. The consensus in the Hardware wallet space is to use a list of trusted delegator contracts. We suggest to allow known implementations listed above and to consider others on a case by case basis. As delegating your EOA to a contract gives control over all the assets, hardware wallets should be cautious with the way they implement 7702. - +Hardware wallets shouldn't expose arbitrary delegation. The consensus in the Hardware wallet space is to use a list of trusted delegator contracts. We suggest to allow known implementations listed above and to consider others on a case by case basis. As delegating your EOA to a contract gives control over all the assets, hardware wallets should be cautious with the way they implement 7702. ### Integration scenarios for companion apps {#integration-scenarios-for-companion-apps} @@ -148,5 +146,3 @@ EOAs delegated to a different one will be handled as standard EOAs. Hardware provider implements its own delegation contract and adds it to the lists implements its support in softaware companion. It is recommended to build a contract with full ERC 4337 support. EOAs delegated to a different one will be handled as standard EOAs. - - From 4478e8803ee765f9f9ad413aafead3d77e2da58b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 23:58:56 +0000 Subject: [PATCH 355/368] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6fe66165fdb..1263aa82529 100644 --- a/README.md +++ b/README.md @@ -1995,6 +1995,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Brian Rossetti
    Brian Rossetti

    🚧 💻 Antoine-Sparenberg
    Antoine-Sparenberg

    🚧 + Kendra Karol Sevilla
    Kendra Karol Sevilla

    🚧 From 54cd93a6ef25c55512e1711eda27a3d7b773bd49 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 23:58:57 +0000 Subject: [PATCH 356/368] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6507b3d36dc..c7dbb17c513 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12801,6 +12801,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "kks-code", + "name": "Kendra Karol Sevilla", + "avatar_url": "https://avatars.githubusercontent.com/u/214244795?v=4", + "profile": "https://github.com/kks-code", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 854099dc0c03c08827622928740e81af1d02b163 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:04:29 +0000 Subject: [PATCH 357/368] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1263aa82529..983922481e4 100644 --- a/README.md +++ b/README.md @@ -1996,6 +1996,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Brian Rossetti
    Brian Rossetti

    🚧 💻 Antoine-Sparenberg
    Antoine-Sparenberg

    🚧 Kendra Karol Sevilla
    Kendra Karol Sevilla

    🚧 + otc group
    otc group

    🚧 From c8360636ccf899afe3681c8cd4084154b3346279 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:04:30 +0000 Subject: [PATCH 358/368] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c7dbb17c513..12ff5d2b1ca 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12810,6 +12810,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "otc-png", + "name": "otc group", + "avatar_url": "https://avatars.githubusercontent.com/u/214395681?v=4", + "profile": "https://github.com/otc-png", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 21c7dfcd9c116e39c049d52be4ad18f91225e8b6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:08:39 +0000 Subject: [PATCH 359/368] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 983922481e4..7a0b406f4d0 100644 --- a/README.md +++ b/README.md @@ -1997,6 +1997,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Antoine-Sparenberg
    Antoine-Sparenberg

    🚧 Kendra Karol Sevilla
    Kendra Karol Sevilla

    🚧 otc group
    otc group

    🚧 + Savio
    Savio

    🚧 From 6331777c48e26fb6400b52c1cadd762e17b63b68 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:08:40 +0000 Subject: [PATCH 360/368] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 12ff5d2b1ca..595feaeeb2d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12819,6 +12819,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "Savio-Sou", + "name": "Savio", + "avatar_url": "https://avatars.githubusercontent.com/u/72797635?v=4", + "profile": "https://github.com/Savio-Sou", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From e9a900545600532379029276999bd608c20f3361 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:24:51 +0000 Subject: [PATCH 361/368] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7a0b406f4d0..98f4fb004fb 100644 --- a/README.md +++ b/README.md @@ -1998,6 +1998,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Kendra Karol Sevilla
    Kendra Karol Sevilla

    🚧 otc group
    otc group

    🚧 Savio
    Savio

    🚧 + fuder.eth
    fuder.eth

    🚧 From 5e74637373bd84dbca5262616850bcd4428e6dfe Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:24:52 +0000 Subject: [PATCH 362/368] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 595feaeeb2d..d82275f4bb5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12828,6 +12828,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "vtjl10", + "name": "fuder.eth", + "avatar_url": "https://avatars.githubusercontent.com/u/139509124?v=4", + "profile": "https://github.com/vtjl10", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 0016106fe3819e3af85b6225d41bb8b89098e17e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:28:24 +0000 Subject: [PATCH 363/368] docs: update README.md [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 98f4fb004fb..68d59514760 100644 --- a/README.md +++ b/README.md @@ -1625,7 +1625,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d changwu
    changwu

    🖋 - yj
    yj

    🖋 + yj
    yj

    🖋 🚧 megatheikal
    megatheikal

    🐛 Stephen Guo
    Stephen Guo

    🌍 F. Eugene Aumson
    F. Eugene Aumson

    🐛 🖋 From 09832bcba55f801426f1815eebc4cb8047286990 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:28:26 +0000 Subject: [PATCH 364/368] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index d82275f4bb5..3f541ff9285 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -10181,7 +10181,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/84749041?v=4", "profile": "http://uniyj.eth", "contributions": [ - "content" + "content", + "maintenance" ] }, { From 5238e7908cf5b017f280ed6b1a5102dbc73722af Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 15 Jul 2025 21:51:56 -0600 Subject: [PATCH 365/368] v10.8.0 --- package.json | 2 +- src/data/published.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5283685b26b..d9b4e528c23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ethereum-org-website", - "version": "10.7.0", + "version": "10.8.0", "license": "MIT", "private": true, "scripts": { diff --git a/src/data/published.json b/src/data/published.json index eac63274e1d..ee27a348abb 100644 --- a/src/data/published.json +++ b/src/data/published.json @@ -1 +1 @@ -{"date":"2025-06-25"} +{"date":"2025-07-16"} From 1743b407746c2d11f67d253466a4493f74d17b62 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:08:14 -0700 Subject: [PATCH 366/368] fix: initial morpher transition after initial load (words[0]), start iterating list from words[1]; fixes duplication of first word after initial load --- src/components/Morpher/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Morpher/index.tsx b/src/components/Morpher/index.tsx index b0d302e0596..2dd26d54a59 100644 --- a/src/components/Morpher/index.tsx +++ b/src/components/Morpher/index.tsx @@ -19,7 +19,7 @@ const Morpher = ({ const morphTimeoutRef = useRef(null) const morphIntervalRef = useRef(null) - const counterRef = useRef(0) + const counterRef = useRef(1) const wordsRef = useRef(words) const currentTextRef = useRef(currentText) const isAnimatingRef = useRef(false) @@ -117,10 +117,10 @@ const Morpher = ({ // If reduced motion is preferred, show static text cycling if (prefersReducedMotion) { morphIntervalRef.current = setInterval(() => { - counterRef.current = (counterRef.current + 1) % wordsRef.current.length const nextWord = wordsRef.current[counterRef.current] setCurrentText(nextWord) currentTextRef.current = nextWord + counterRef.current = (counterRef.current + 1) % wordsRef.current.length }, 3000) } else { // Defer animation start by 2 seconds to improve initial page load From 51877ff7014c9a09be5c3d4d32a591cfb23ab457 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 17 Jul 2025 12:03:41 -0600 Subject: [PATCH 367/368] fix: adjust roadmap component layout for different browsers --- app/[locale]/roadmap/_components/roadmap.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/[locale]/roadmap/_components/roadmap.tsx b/app/[locale]/roadmap/_components/roadmap.tsx index d60d81dbe4d..2e627a23cf1 100644 --- a/app/[locale]/roadmap/_components/roadmap.tsx +++ b/app/[locale]/roadmap/_components/roadmap.tsx @@ -134,11 +134,11 @@ const RoadmapPage = () => { from its current form into a fully scaled, maximally resilient platform.

    -
    +
    {changesComingItems.map((item) => (

    {item.title}

    From 227a49bfc9283b8cc7416031c5648bdbad278147 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 13:46:45 -0700 Subject: [PATCH 368/368] fix: chromatic svg/icon regressions --- .../ListenToPlayer/PlayerWidget/index.tsx | 2 +- .../Quiz/QuizWidget/QuizConfetti.tsx | 19 +++++-------- .../Simulator/screens/ConnectWeb3/Slider.tsx | 2 +- .../screens/CreateAccount/GeneratingKeys.tsx | 9 +++++-- .../Simulator/screens/SendReceive/Success.tsx | 5 +++- src/components/Tooltip/Tooltip.stories.tsx | 2 +- src/components/icons/quiz/star-confetti.svg | 27 +++++++++++++++++-- src/components/ui/buttons/Button.tsx | 6 ++--- src/components/ui/carousel.tsx | 4 +-- src/components/ui/radio-group.tsx | 2 +- 10 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/components/ListenToPlayer/PlayerWidget/index.tsx b/src/components/ListenToPlayer/PlayerWidget/index.tsx index 565e32b4776..2d0c5bec989 100644 --- a/src/components/ListenToPlayer/PlayerWidget/index.tsx +++ b/src/components/ListenToPlayer/PlayerWidget/index.tsx @@ -160,7 +160,7 @@ const PlayerWidget = ({ }) }} > - +
    diff --git a/src/components/Quiz/QuizWidget/QuizConfetti.tsx b/src/components/Quiz/QuizWidget/QuizConfetti.tsx index 3e3366c3df6..1b45a74aab9 100644 --- a/src/components/Quiz/QuizWidget/QuizConfetti.tsx +++ b/src/components/Quiz/QuizWidget/QuizConfetti.tsx @@ -1,16 +1,11 @@ import * as React from "react" -import { cn } from "@/lib/utils/cn" - import { StarConfettiIcon } from "../../icons/quiz" -export const QuizConfetti = () => { - const commonClasses = "absolute" - return ( -
    - - - -
    - ) -} +export const QuizConfetti = () => ( +
    + {/* Use left/right (not start/end) to keep SVG orientation correct for placement */} + + +
    +) diff --git a/src/components/Simulator/screens/ConnectWeb3/Slider.tsx b/src/components/Simulator/screens/ConnectWeb3/Slider.tsx index c568e80bd33..1f4931d0ae1 100644 --- a/src/components/Simulator/screens/ConnectWeb3/Slider.tsx +++ b/src/components/Simulator/screens/ConnectWeb3/Slider.tsx @@ -39,7 +39,7 @@ export const Slider = ({ isConnected, displayUrl, children }: SliderProps) => { animate={{ scale: 1 }} transition={{ type: "spring", delay: 0.25 }} > - + {/* eslint-disable-next-line no-constant-condition */} - {false && loading ? ( + {loading ? ( - + )}

    diff --git a/src/components/Simulator/screens/SendReceive/Success.tsx b/src/components/Simulator/screens/SendReceive/Success.tsx index af50f4ff9c4..9ae40eb11a3 100644 --- a/src/components/Simulator/screens/SendReceive/Success.tsx +++ b/src/components/Simulator/screens/SendReceive/Success.tsx @@ -103,7 +103,10 @@ export const Success = ({ data-testid="success-icon" > )} diff --git a/src/components/Tooltip/Tooltip.stories.tsx b/src/components/Tooltip/Tooltip.stories.tsx index c78d0d219aa..3ee16ce57f6 100644 --- a/src/components/Tooltip/Tooltip.stories.tsx +++ b/src/components/Tooltip/Tooltip.stories.tsx @@ -22,7 +22,7 @@ const meta = { content: , children: ( - + ), }, diff --git a/src/components/icons/quiz/star-confetti.svg b/src/components/icons/quiz/star-confetti.svg index 7a27b8fb3c2..643d19d2ad3 100644 --- a/src/components/icons/quiz/star-confetti.svg +++ b/src/components/icons/quiz/star-confetti.svg @@ -1,3 +1,26 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/ui/buttons/Button.tsx b/src/components/ui/buttons/Button.tsx index 774e0703a49..c64738050df 100644 --- a/src/components/ui/buttons/Button.tsx +++ b/src/components/ui/buttons/Button.tsx @@ -41,9 +41,9 @@ const buttonVariants = cva( link: "border-transparent hover:shadow-none underline !min-h-0 !py-0 !px-1 active:text-primary", }, size: { - lg: "text-lg py-3 px-8 [&>svg]:text-2xl rounded-lg focus-visible:rounded-lg", - md: "min-h-10.5 px-4 py-2 [&>svg]:text-2xl", - sm: "text-xs min-h-[31px] py-1.5 px-2 [&>svg]:text-md", + lg: "text-lg py-3 px-8 [&>svg]:size-6 rounded-lg focus-visible:rounded-lg", + md: "min-h-10.5 px-4 py-2 [&>svg]:size-6", + sm: "text-xs min-h-[31px] py-1.5 px-2 [&>svg]:size-4", }, }, defaultVariants: { diff --git a/src/components/ui/carousel.tsx b/src/components/ui/carousel.tsx index ee852d1eca9..807c08c704a 100644 --- a/src/components/ui/carousel.tsx +++ b/src/components/ui/carousel.tsx @@ -217,7 +217,7 @@ const CarouselPrevious = React.forwardRef< onClick={scrollPrev} {...props} > - + Previous slide ) @@ -246,7 +246,7 @@ const CarouselNext = React.forwardRef< onClick={scrollNext} {...props} > - + Next slide ) diff --git a/src/components/ui/radio-group.tsx b/src/components/ui/radio-group.tsx index 77c5d292b7b..58ec52ba80a 100644 --- a/src/components/ui/radio-group.tsx +++ b/src/components/ui/radio-group.tsx @@ -35,7 +35,7 @@ const RadioGroupItem = React.forwardRef< {...props} > - + )