From ae88cd225f5c2ef466ca5e0febccfe07796015c2 Mon Sep 17 00:00:00 2001 From: tutizaraz Date: Mon, 1 Jul 2024 19:01:01 +0200 Subject: [PATCH 001/171] add story for Trilemma component --- .storybook/i18next.ts | 1 + src/components/Trilemma/Trilemma.stories.tsx | 35 ++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/components/Trilemma/Trilemma.stories.tsx diff --git a/.storybook/i18next.ts b/.storybook/i18next.ts index 610c3328635..f932bf490f6 100644 --- a/.storybook/i18next.ts +++ b/.storybook/i18next.ts @@ -18,6 +18,7 @@ const ns = [ "page-learn", "page-upgrades", "page-developers-index", + "page-roadmap-vision", ] const supportedLngs = Object.keys(baseLocales) diff --git a/src/components/Trilemma/Trilemma.stories.tsx b/src/components/Trilemma/Trilemma.stories.tsx new file mode 100644 index 00000000000..e76aefa6104 --- /dev/null +++ b/src/components/Trilemma/Trilemma.stories.tsx @@ -0,0 +1,35 @@ +import { Box, ChakraProvider } from "@chakra-ui/react" +import { Meta, StoryObj } from "@storybook/react" + +import Trilemma from "." + +const meta = { + title: "Molecules / Trilemma", + component: Trilemma, + parameters: { + layout: "fullscreen", + }, + decorators: [ + (Story) => ( + + + + + + ), + ], +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = { + render: () => , +} From 90c6a73b92eb13a9c220efc66f87f33ecad4c0d4 Mon Sep 17 00:00:00 2001 From: charliexfi Date: Fri, 5 Jul 2024 13:37:06 +0200 Subject: [PATCH 002/171] add SQD to tooling --- public/content/developers/docs/data-and-analytics/index.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/public/content/developers/docs/data-and-analytics/index.md b/public/content/developers/docs/data-and-analytics/index.md index 5af1349b078..52b273fb667 100644 --- a/public/content/developers/docs/data-and-analytics/index.md +++ b/public/content/developers/docs/data-and-analytics/index.md @@ -36,6 +36,12 @@ Using [GraphQL](https://graphql.org/), developers can query any of the curated o [Dune Analytics](https://dune.com/) pre-processes blockchain data into relational database (PostgreSQL and DatabricksSQL) tables, allows users to query blockchain data using SQL and build dashboards based on query results. On-chain data are organized into 4 raw tables: `blocks`, `transactions`, (event) `logs` and (call) `traces`. Popular contracts and protocols have been decoded, and each has its own set of event and call tables. Those event and call tables are processed further and organized into abstraction tables by the type of protocols, for example, dex, lending, stablecoins, etc. +## SQD {#sqd} + +[SQD](https://sqd.dev/) is a decentralized hyper-scalable data platform optimized for providing efficient, permissionless access to large volumes of data. It currently serves historical on-chain data, including event logs, transaction receipts, traces, and per-transaction state diffs. SQD offers a powerful toolkit for creating custom data extraction and processing pipelines, achieving an indexing speed of up to 150k blocks per second. + +To get started, visit the [documentation](https://docs.sqd.dev/) or see [EVM examples](https://github.com/subsquid-labs/squid-evm-examples) of what you can build with SQD. + ## SubQuery Network {#subquery-network} [SubQuery](https://subquery.network/) is a leading data indexer that gives developers fast, reliable, decentralized, and customized APIs for their web3 projects. SubQuery empower developers from over 165+ ecosystems (including Ethereum) with rich indexed data to build an intuitive and immersive experiences for their users. The SubQuery Network powers your unstoppable apps with a resilient and decentralized infrastructure network. Use SubQuery's blockchain developer toolkit to build the web3 applications of the future, without spending time building a custom backend for data processing activities. @@ -53,3 +59,4 @@ To start, visit the [Ethereum quick start guide](https://academy.subquery.networ - [Beaconcha.in Beacon Chain explorer](https://beaconcha.in) - [Dune Basics](https://docs.dune.com/#dune-basics) - [SubQuery Ethereum Quick Start Guide](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html) +- [SQD Network Overview](https://docs.sqd.dev/) From d6405ba9abc0411598d25b47d0f38390744802be Mon Sep 17 00:00:00 2001 From: Oleg Gorbatiuk Date: Mon, 29 Jul 2024 15:00:57 +0200 Subject: [PATCH 003/171] Update: ERC-20 Token Standard description --- .../developers/docs/standards/tokens/erc-20/index.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/public/content/developers/docs/standards/tokens/erc-20/index.md b/public/content/developers/docs/standards/tokens/erc-20/index.md index 674c31db3b2..47e4560ab50 100644 --- a/public/content/developers/docs/standards/tokens/erc-20/index.md +++ b/public/content/developers/docs/standards/tokens/erc-20/index.md @@ -151,6 +151,8 @@ print("Addr Balance:", addr_balance) ### ERC-20 token reception issue {#reception-issue} +**As of 06/20/2024 at least $83,656,418 worth of ERC-20 tokens were lost due to this issue. Note that a pure ERC-20 implementation is prone to this problem unless you implement a set of additional restrictions on top of the standard as listed below.** + When ERC-20 tokens are sent to a smart contract that is not designed to handle ERC-20 tokens, those tokens can be permanently lost. This happens because the receiving contract does not have the functionality to recognize or respond to the incoming tokens, and there’s no mechanism in the ERC-20 standard to notify the receiving contract about the incoming tokens. The main ways this issue takes form is through: 1. Token transfer mechanism @@ -162,6 +164,15 @@ When ERC-20 tokens are sent to a smart contract that is not designed to handle E 3. No built-in handling - The ERC-20 standard does not include a mandatory function for receiving contracts to implement, leading to a situation where many contracts are unable to manage incoming tokens properly +**Possible Solutions** + +While it is not possible to prevent this issue with ERC-20 completely there are methods that would allow to significantly reduce the possibility of a tokens loss for the end user: + +- The most common problem is when a user sends tokens to the token contract address itself (e.g. USDT deposited to the address of USDT token contract). It is recommended to restrict `transfer(..)` function to revert such transfer attempts. Consider adding `require(_to != address(this));` check within the implementation of the `transfer(..)` function. +- The `transfer(..)` function in general is not designed for depositing tokens to contracts. `approve(..) & transferFrom(..)` pattern is used to deposit ERC-20 tokens to contracts instead. It is possible to restrict the transfer function to disallow depositing tokens to any contracts with it, however it may break compatibility with contracts that assume tokens can be deposited to contracts with the `trasnfer(..)` function (e.g. Uniswap liqudity pools). +- Always assume that ERC-20 tokens can end up in your contract even if your contract is not supposed to ever receive any. There is no way to prevent or reject accidental deposits on the recipients end. It is recommended to implement a function that would allow to extract accidentally deposited ERC-20 tokens. +- Consider using alternative token standards. + Some alternative standards have come out of this issue such as [ERC-223](/developers/docs/standards/tokens/erc-223) ## Further reading {#further-reading} From c8e7b98f707ebf1dab0e7854668930bf08faa628 Mon Sep 17 00:00:00 2001 From: jackabald Date: Thu, 1 Aug 2024 12:10:59 -0500 Subject: [PATCH 004/171] feat: link to youtube series in learn Signed-off-by: jackabald --- src/intl/en/page-learn.json | 2 ++ src/pages/learn.tsx | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/intl/en/page-learn.json b/src/intl/en/page-learn.json index 933ab556ab4..7ff96f71864 100644 --- a/src/intl/en/page-learn.json +++ b/src/intl/en/page-learn.json @@ -116,6 +116,8 @@ "zeroknowledge-description": "Goes deep into the tech that will power the emerging decentralized web and the community building this", "green-pill-title": "Green Pill", "green-pill-description": "Explores the crypto-economic systems that create positive externalities for the world", + "ethereum-basics-title": "Ethereum Basics", + "ethereum-basics-description": "Learn the basics of Ethereum network architecture with an easy-to-understand video series.", "unchained-title": "Unchained", "unchained-description": "Dives deep into the people building the decentralized internet, the details of this technology that could underpin our future, and some of the thorniest topics in crypto, such as regulation, security and privacy", "the-daily-gwei-title": "The Daily Gwei", diff --git a/src/pages/learn.tsx b/src/pages/learn.tsx index 3c2889534d9..c1066280074 100644 --- a/src/pages/learn.tsx +++ b/src/pages/learn.tsx @@ -724,6 +724,12 @@ const LearnPage = () => { {" "} {t("bankless-description")} + + + {t("ethereum-basics-title")} + {" "} + {t("ethereum-basics-description")} + From dea9c75550e6b46e42f57c10704aa6d46c0029b1 Mon Sep 17 00:00:00 2001 From: jackabald Date: Thu, 1 Aug 2024 18:58:45 -0500 Subject: [PATCH 005/171] feat: embed yt series in intro to ethereum page Signed-off-by: jackabald --- public/content/developers/docs/intro-to-ethereum/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/content/developers/docs/intro-to-ethereum/index.md b/public/content/developers/docs/intro-to-ethereum/index.md index 56cbee11a9b..0986561193e 100644 --- a/public/content/developers/docs/intro-to-ethereum/index.md +++ b/public/content/developers/docs/intro-to-ethereum/index.md @@ -108,6 +108,9 @@ A reusable snippet of code (a program) which a developer publishes into EVM stat - [Ethereum Whitepaper](/whitepaper/) - [How does Ethereum work, anyway?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _Preethi Kasireddy_ (**NB** this resource is still valuable but be aware that it predates [The Merge](/roadmap/merge) and therefore still refers to Ethereum's proof-of-work mechanism - Ethereum is actually now secured using [proof-of-stake](/developers/docs/consensus-mechanisms/pos)) +- [Ethereum Basics](https://youtube.com/playlist?list=PLqgutSGloqiJyyoL0zvLVFPS-GMD2wKa5&si=kZTf5I7PKGTXDsOZ) - If you are a visual learner, this video series offers a thorough exploration of foundational topics: + + _Know of a community resource that helped you? Edit this page and add it!_ From 895147df619e4575e0130765f72666576789470c Mon Sep 17 00:00:00 2001 From: rohit-gupta001 Date: Sun, 4 Aug 2024 17:48:00 +0530 Subject: [PATCH 006/171] add: event tracking on edit_page --- src/components/TableOfContents/index.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/TableOfContents/index.tsx b/src/components/TableOfContents/index.tsx index 6f8beaaae10..318cd119904 100644 --- a/src/components/TableOfContents/index.tsx +++ b/src/components/TableOfContents/index.tsx @@ -1,3 +1,4 @@ +import { usePathname } from "next/navigation" import { useTranslation } from "next-i18next" import { FaGithub } from "react-icons/fa" import { @@ -36,6 +37,7 @@ const TableOfContents = ({ isMobile = false, ...rest }: TableOfContentsProps) => { + const pathname = usePathname() const { t } = useTranslation("common") // TODO: Replace with direct token implementation after UI migration is completed const lgBp = useToken("breakpoints", "lg") @@ -85,6 +87,11 @@ const TableOfContents = ({ leftIcon={} href={editPath} variant="outline" + customEventOptions={{ + eventCategory: "edit_page", + eventAction: "gh_edit_click", + eventName: `${pathname}`, + }} > {t("edit-page")} From 9c6e6339fff5a7a48f22ee508087de09fd0b81de Mon Sep 17 00:00:00 2001 From: Varsha Narmat <117872786+varnarmat@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:49:05 -0400 Subject: [PATCH 007/171] added AWS Blockchain Node Runners Blueprint for Ethereum --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 1 + 1 file changed, 1 insertion(+) 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 b2bef8282d0..51fa32ffbad 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 @@ -466,6 +466,7 @@ As part of your monitoring, make sure to keep an eye on your machine's performan ## Further reading {#further-reading} +- [Sample AWS Blockchain Node Runner app for Ethereum Nodes](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) - _AWS, updated often_ - [Ethereum Staking Guides](https://github.com/SomerEsat/ethereum-staking-guides) - _Somer Esat, updated often_ - [Guide | How to setup a validator for Ethereum staking on mainnet](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, updated regularly_ - [ETHStaker guides on running validators on testnets](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, updated regularly_ From ed160a810185ae0e161f0635c6a60bb236d99adb Mon Sep 17 00:00:00 2001 From: saurabhburade Date: Tue, 10 Sep 2024 15:18:54 +0530 Subject: [PATCH 008/171] feat: add FaqAccordion --- .../FaqAccordian/FaqAccordian.stories.tsx | 59 ++++++++++++ src/components/FaqAccordian/index.tsx | 92 +++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 src/components/FaqAccordian/FaqAccordian.stories.tsx create mode 100644 src/components/FaqAccordian/index.tsx diff --git a/src/components/FaqAccordian/FaqAccordian.stories.tsx b/src/components/FaqAccordian/FaqAccordian.stories.tsx new file mode 100644 index 00000000000..c6f3871cb8b --- /dev/null +++ b/src/components/FaqAccordian/FaqAccordian.stories.tsx @@ -0,0 +1,59 @@ +import { Meta, StoryObj } from "@storybook/react" + +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "." + +const meta = { + title: "FaqAccordion", + component: Accordion, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +} satisfies Meta + +export default meta + +export const FaqAccordion: StoryObj = { + render: () => ( + + + +

+ Why is there no 'official' Ethereum L2? +

+
+ + + Just as there is no 'official' Ethereum client, there is no + 'official' Ethereum layer 2. Ethereum is permissionless - + technically anyone can create a layer 2! Multiple teams will implement + their version of a layer 2, and the ecosystem as a whole will benefit + from a diversity of design approaches that are optimized for different + use cases. Much like we have multiple Ethereum clients developed by + multiple teams in order to have diversity in the network, this too + will be how layer 2s develop in the future. + +
+ + +

+ Why is there no 'official' Ethereum L2? +

+
+ + Just as there is no 'official' Ethereum client, there is no + 'official' Ethereum layer 2. Ethereum is permissionless - + technically anyone can create a layer 2! Multiple teams will implement + their version of a layer 2, and the ecosystem as a whole will benefit + from a diversity of design approaches that are optimized for different + use cases. Much like we have multiple Ethereum clients developed by + multiple teams in order to have diversity in the network, this too + will be how layer 2s develop in the future. + +
+
+ ), +} diff --git a/src/components/FaqAccordian/index.tsx b/src/components/FaqAccordian/index.tsx new file mode 100644 index 00000000000..e8211104564 --- /dev/null +++ b/src/components/FaqAccordian/index.tsx @@ -0,0 +1,92 @@ +import React from "react" +import { MdChevronRight } from "react-icons/md" +import * as AccordionPrimitive from "@radix-ui/react-accordion" + +import { cn } from "@/lib/utils/cn" + +import * as RootAccordion from "../../../tailwind/ui/accordion" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + // p-4 hover:bg-background-highlight + + svg]:-rotate-90", + className + )} + {...props} + > + {children} + + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +// TODO: Prop types +const Accordion = ({ children, ...props }) => { + return ( + + {children} + + ) +} +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
+ {children} +
+
+)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionContent, AccordionItem, AccordionTrigger } From 2d10e0f095c16336c387c707822ab4882a76cc83 Mon Sep 17 00:00:00 2001 From: baystef Date: Thu, 26 Sep 2024 19:35:51 +0100 Subject: [PATCH 009/171] feat(contributors story): create story for contributors component [#13878] --- .../Contributors/Contributors.stories.tsx | 24 +++++++++++++++++++ .../index.tsx} | 0 2 files changed, 24 insertions(+) create mode 100644 src/components/Contributors/Contributors.stories.tsx rename src/components/{Contributors.tsx => Contributors/index.tsx} (100%) diff --git a/src/components/Contributors/Contributors.stories.tsx b/src/components/Contributors/Contributors.stories.tsx new file mode 100644 index 00000000000..7b8c9613ea5 --- /dev/null +++ b/src/components/Contributors/Contributors.stories.tsx @@ -0,0 +1,24 @@ +import { Meta, StoryObj } from "@storybook/react" + +import ContributorsComponent from "." + +const meta = { + title: "Molecules / Navigation / Contributors", + component: ContributorsComponent, + parameters: { + layout: "fullscreen", + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Contributors: Story = {} diff --git a/src/components/Contributors.tsx b/src/components/Contributors/index.tsx similarity index 100% rename from src/components/Contributors.tsx rename to src/components/Contributors/index.tsx From 6b6ffaf5fda74643884a12adda3e3b848d496b7f Mon Sep 17 00:00:00 2001 From: baystef Date: Fri, 27 Sep 2024 11:22:50 +0100 Subject: [PATCH 010/171] feat(developerdocslinks story): create story for developerdocslinks --- .storybook/main.ts | 5 +++ .../DeveloperDocsLinks.stories.tsx | 34 +++++++++++++++++++ .../index.tsx} | 0 3 files changed, 39 insertions(+) create mode 100644 src/components/DeveloperDocsLinks/DeveloperDocsLinks.stories.tsx rename src/components/{DeveloperDocsLinks.tsx => DeveloperDocsLinks/index.tsx} (100%) diff --git a/.storybook/main.ts b/.storybook/main.ts index 02d785aefdc..c744770d30b 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -67,6 +67,11 @@ const config: StorybookConfig = { if (imageRule) { imageRule["exclude"] = /\.svg$/ } + // Configure yaml files to be loaded with yaml-loader + config.module.rules.push({ + test: /\.ya?ml$/, + use: "yaml-loader", + }) // Configure .svg files to be loaded with @svgr/webpack config.module.rules.push({ diff --git a/src/components/DeveloperDocsLinks/DeveloperDocsLinks.stories.tsx b/src/components/DeveloperDocsLinks/DeveloperDocsLinks.stories.tsx new file mode 100644 index 00000000000..eee1d533ca9 --- /dev/null +++ b/src/components/DeveloperDocsLinks/DeveloperDocsLinks.stories.tsx @@ -0,0 +1,34 @@ +import { Meta, StoryObj } from "@storybook/react" + +import { langViewportModes } from "../../../.storybook/modes" + +import DeveloperDocsLinksComponent from "." + +const meta = { + title: "Molecules / Navigation / DeveloperDocsLinks", + component: DeveloperDocsLinksComponent, + args: { + headerId: "ethereum-stack", + }, + parameters: { + layout: "fullscreen", + chromatic: { + modes: { + ...langViewportModes, + }, + }, + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const DeveloperDocsLinks: Story = {} diff --git a/src/components/DeveloperDocsLinks.tsx b/src/components/DeveloperDocsLinks/index.tsx similarity index 100% rename from src/components/DeveloperDocsLinks.tsx rename to src/components/DeveloperDocsLinks/index.tsx From 66bc1276ee11c217a83fa88a9913d079f5042876 Mon Sep 17 00:00:00 2001 From: baystef Date: Fri, 11 Oct 2024 08:18:35 +0100 Subject: [PATCH 011/171] fix(link import): update link import directory --- src/components/DeveloperDocsLinks/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/DeveloperDocsLinks/index.tsx b/src/components/DeveloperDocsLinks/index.tsx index d614cac67df..f7b327fef30 100644 --- a/src/components/DeveloperDocsLinks/index.tsx +++ b/src/components/DeveloperDocsLinks/index.tsx @@ -4,8 +4,8 @@ import Translation from "@/components/Translation" import docLinks from "@/data/developer-docs-links.yaml" -import InlineLink from "./ui/Link" -import { ListItem, UnorderedList } from "./ui/list" +import InlineLink from "../ui/Link" +import { ListItem, UnorderedList } from "../ui/list" export type DeveloperDocsLinksProps = { headerId: string From 6bb1d4b42acad2c2acac2a3d108cc62d5e83b172 Mon Sep 17 00:00:00 2001 From: TC Date: Sun, 13 Oct 2024 16:36:59 +0200 Subject: [PATCH 012/171] add smart contract quiz --- public/content/smart-contracts/index.md | 4 + .../Quiz/stories/QuizzesStats.stories.tsx | 1 + src/data/quizzes/index.ts | 8 ++ src/data/quizzes/questionBank.ts | 131 ++++++++++++++++++ src/intl/en/learn-quizzes.json | 47 ++++++- 5 files changed, 190 insertions(+), 1 deletion(-) diff --git a/public/content/smart-contracts/index.md b/public/content/smart-contracts/index.md index 64bf7d73a62..de39500a26a 100644 --- a/public/content/smart-contracts/index.md +++ b/public/content/smart-contracts/index.md @@ -80,3 +80,7 @@ They can perform computations, create currency, store data, mint [NFTs](/glossar - [Smart contracts for developers](/developers/docs/smart-contracts/) - [Learn to write smart-contracts](/developers/learning-tools/) - [Mastering Ethereum - What is a Smart Contract?](https://github.com/ethereumbook/ethereumbook/blob/develop/07smart-contracts-solidity.asciidoc#what-is-a-smart-contract) + + + + \ No newline at end of file diff --git a/src/components/Quiz/stories/QuizzesStats.stories.tsx b/src/components/Quiz/stories/QuizzesStats.stories.tsx index 1025ef7dfe0..9b24338d7f9 100644 --- a/src/components/Quiz/stories/QuizzesStats.stories.tsx +++ b/src/components/Quiz/stories/QuizzesStats.stories.tsx @@ -21,6 +21,7 @@ const meta = { web3: [false, 0], daos: [false, 0], stablecoins: [false, 0], + "smart-contracts": [false, 0], }, totalCorrectAnswers: 0, }, diff --git a/src/data/quizzes/index.ts b/src/data/quizzes/index.ts index 71cc4271f1c..e02ec297ad7 100644 --- a/src/data/quizzes/index.ts +++ b/src/data/quizzes/index.ts @@ -54,6 +54,10 @@ const quizzes = { title: "stablecoins", questions: ["m001", "m002", "m003", "m004", "m005"], }, + "smart-contracts": { + title: "smart-contracts", + questions: ["n001", "n002", "n003", "n004", "n005"], + }, } satisfies RawQuizzes export const ethereumBasicsQuizzes: QuizzesSection[] = [ @@ -81,6 +85,10 @@ export const ethereumBasicsQuizzes: QuizzesSection[] = [ id: "security", level: "beginner", }, + { + id: "smart-contracts", + level: "beginner", + }, ] export const usingEthereumQuizzes: QuizzesSection[] = [ diff --git a/src/data/quizzes/questionBank.ts b/src/data/quizzes/questionBank.ts index cdf24060459..4466da3a290 100644 --- a/src/data/quizzes/questionBank.ts +++ b/src/data/quizzes/questionBank.ts @@ -1610,6 +1610,137 @@ const questionBank = { ], correctAnswerId: "m005-d", }, + //smart-contract + n001: { + prompt: "n001-prompt", + answers: [ + { + id: "n001-a", + label: "n001-a-label", + explanation: "n001-a-explanation", + }, + { + id: "n001-b", + label: "n001-b-label", + explanation: "n001-b-explanation", + }, + { + id: "n001-c", + label: "n001-c-label", + explanation: "n001-c-explanation", + }, + { + id: "n001-d", + label: "n001-d-label", + explanation: "n001-d-explanation", + }, + ], + correctAnswerId: "n001-c", + }, + n002: { + prompt: "n002-prompt", + answers: [ + { + id: "n002-a", + label: "n002-a-label", + explanation: "n002-a-explanation", + }, + { + id: "n002-b", + label: "n002-b-label", + explanation: "n002-a-explanation", + }, + { + id: "n002-c", + label: "n002-c-label", + explanation: "n002-a-explanation", + }, + { + id: "n002-d", + label: "n002-d-label", + explanation: "n002-d-explanation", + }, + ], + correctAnswerId: "n002-b", + }, + n003: { + prompt: "n003-prompt", + answers: [ + { + id: "n003-a", + label: "n003-a-label", + explanation: "n003-a-explanation", + }, + { + id: "n003-b", + label: "n003-b-label", + explanation: "n003-b-explanation", + }, + { + id: "n003-c", + label: "n003-c-label", + explanation: "n003-c-explanation", + }, + { + id: "n003-d", + label: "n003-d-label", + explanation: "n003-d-explanation", + }, + ], + correctAnswerId: "n003-d", + }, + n004: { + prompt: "n004-prompt", + answers: [ + { + id: "n004-a", + label: "n004-a-label", + explanation: "n004-a-explanation", + }, + { + id: "n004-b", + label: "n004-b-label", + explanation: "n004-b-explanation", + }, + { + id: "n004-c", + label: "n004-c-label", + explanation: "n004-c-explanation", + }, + { + id: "n004-d", + label: "n004-d-label", + explanation: "n004-d-explanation", + }, + ], + correctAnswerId: "n004-b", + }, + n005: { + prompt: "n005-prompt", + answers: [ + { + id: "n005-a", + label: "n005-a-label", + explanation: "n005-a-explanation", + }, + { + id: "n005-b", + label: "n005-b-label", + explanation: "n005-b-explanation", + }, + { + id: "n005-c", + label: "n005-c-label", + explanation: "n005-c-explanation", + }, + { + id: "n005-d", + label: "n005-d-label", + explanation: "n005-d-explanation", + }, + ], + correctAnswerId: "n005-a", + }, } as const satisfies QuestionBank export default questionBank diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index cb534e9412f..b8131a87f29 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -568,5 +568,50 @@ "m005-c-label": "Buy them from an exchange", "m005-c-explanation": "Incorrect, this is a way to get stablecoins. Many exchanges and wallets let you buy stablecoins directly. Geographical restrictions may apply for centralized exchanges.", "m005-d-label": "Mine them", - "m005-d-explanation": "Correct! Unlike bitcoin, you are unable to mine stablecoins." + "m005-d-explanation": "Correct! Unlike bitcoin, you are unable to mine stablecoins.", + "n001-prompt": "How are smart contracts characterized?", + "n001-a-label": "Smart contracts are just like real (paper) contracts, but stored digitally on the blockchain to save the content securely.", + "n001-a-explanation": "Smart contracts use a similar logic to traditional contracts, but otherwise have little in common.", + "n001-b-label": "They are linked to an AI system, which allows them to make decisions that trigger blockchain transactions.", + "n001-b-explanation": "Smart contracts can actually execute transactions automatically, but only according to an ‘if this then that’ logic that is prescribed in the code. They do not use AI.", + "n001-c-label": "They are programs stored on the blockchain that follow an 'if this then that' logic, and are guaranteed to execute according to the rules defined by the code.", + "n001-c-explanation": "A smart contract is a piece of code that can be executed automatically according to an 'if this then that' logic.", + "n001-d-label": "They are the rules behind the Ethereum Blockchain, developed together with lawyers to ensure legal compliance.", + "n001-d-explanation": "Smart contracts are pieces of code that can be created by developers and deployed on a blockchain.", + "n002-prompt": "What is a metaphor that most closely characterizes the functioning of smart contracts?", + "n002-a-label": "A bank", + "n002-a-explanation": "Banks require manual intervention and are structured as hierarchical entities, whereas a smart contract automatically executes without intervention.", + "n002-b-label": "A digital vending machine", + "n002-b-explanation": "The vending machine will only dispense your desired product after all requirements are met - specific inputs guarantee predetermined outputs. This is similar to the logic of smart contracts.", + "n002-c-label": "A calculator", + "n002-c-explanation": "smart contract code can be used for calculations, but is not limited to that. Rather, smart contracts are blockchain-based programs that follow an 'if this then that' logic.", + "n002-d-label": "A website", + "n002-d-explanation": "A website is the frontend which captures user directions. A smart contract is the backend logic where these directions are executed, and the result may be returned.", + "n003-prompt": "What is not one of the main characteristics of a smart contract?", + "n003-a-label": "Automatic execution", + "n003-a-explanation": "The main benefit of a smart contract is that it deterministically executes unambiguous code when certain conditions are met.", + "n003-b-label": "Public record", + "n003-b-explanation": "With smart contracts on a public blockchain, anyone can instantly track asset transfers and other related information.", + "n003-c-label": "Privacy protection", + "n003-c-explanation": "As blockchains are pseudonymous networks, transactions are tied publicly to a unique cryptographic address, not an identity.", + "n003-d-label": "Ability to change", + "n003-d-explanation": "A smart contract cannot be changed once created, it is guaranteed to execute according to the rules defined by its code.", + "n004-prompt": "What is not one of the applications of smart contracts?", + "n004-a-label": "Cryptocurrencies", + "n004-a-explanation": "Cryptocurrencies are token objects which are defined and tracked on smart contracts.", + "n004-b-label": "Protocol changes", + "n004-b-explanation": "While protocol changes are enacted through a smart contract, their creation and definition are proposed through transparent online forums such as Github or Forum.", + "n004-c-label": "Non Fungible Assets", + "n004-c-explanation": "Smart contracts are used to define a wide range of NFTs, ranging from digital art to asset ownership certificates.", + "n004-d-label": "DAOs", + "n004-d-explanation": "The governing and voting rules of Decentralized Autonomous Organisations are defined within smart contracts for transparency.", + "n005-prompt": "Who coined the term 'smart contract'?", + "n005-a-label": "Nick Szabo", + "n005-a-explanation": "The computer scientist and cryptographer Nick Szabo coined the term 'smart contract' in an essay from 1994. In 1996, he wrote an exploration of what they could do. Smart contracts on Ethereum later put this vision into practice.", + "n005-b-label": "Satoshi Nakamoto", + "n005-b-explanation": "Satoshi is the author of Bitcoin, which already has some basic smart contract functionalities. The term 'smart contract', however, was coined by Nick Szabo in 1994.", + "n005-c-label": "Vitalik Buterin", + "n005-c-explanation": "The Ethereum co-founder has contributed to our understanding of smart contracts today. The term, however, was coined by Nick Szabo in 1994.", + "n005-d-label": "Gavin Wood", + "n005-d-explanation": "Ethereum co-founder Gavin Wood is known for coining the term web3. The term 'smart contract', however, was coined by Nick Szabo in 1994." } From f2a91a198dc66b7dbedf6e5deaf7afdfdc14b1a3 Mon Sep 17 00:00:00 2001 From: TC Date: Sat, 19 Oct 2024 11:27:20 +0200 Subject: [PATCH 013/171] add int support on sm page --- src/lib/utils/translations.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/utils/translations.ts b/src/lib/utils/translations.ts index bdaa1b04fe5..55446791fa1 100644 --- a/src/lib/utils/translations.ts +++ b/src/lib/utils/translations.ts @@ -207,7 +207,8 @@ const getRequiredNamespacesForPath = (relativePath: string) => { path.startsWith("/web3/") || path.startsWith("/what-is-ethereum/") || path.startsWith("/quizzes/") || - path.startsWith("/stablecoins/") + path.startsWith("/stablecoins/") || + path.startsWith("/smart-contracts/") ) { requiredNamespaces = [...requiredNamespaces, "learn-quizzes"] } From 6bed563f7c74886854bcd9c1b1fddda3afcee525 Mon Sep 17 00:00:00 2001 From: coincashew <62976495+coincashew@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:48:00 -0700 Subject: [PATCH 014/171] Update index.md - Update guide with prettier links and add EthPillar --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 b2bef8282d0..4e65f51271a 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 @@ -129,6 +129,7 @@ Multiple user-friendly projects aim to improve the experience of setting up a cl Below are a few projects which can help you install and control clients just with a few clicks: - [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) - DappNode doesn't come only with a machine from a vendor. The software, the actual node launcher and control center with many features can be used on arbitrary hardware. +- [EthPillar](http://ethpillar.coincashew.com) - Quickest and easiest way to setup a full node. One-liner setup tool and node management TUI. Free. Open source. Public goods for Ethereum by solo stakers. ARM64 and AMD64 support. - [eth-docker](https://eth-docker.net/) - Automated setup using Docker focused on easy and secure staking, requires basic terminal and Docker knowledge, recommended for a bit more advanced users. - [Stereum](https://stereum.net/ethereum-node-setup/) - Launcher for installing clients on a remote server via SSH connection with a GUI setup guide, control center, and many other features. - [NiceNode](https://www.nicenode.xyz/) - Launcher with a straightforward user experience to run a node on your computer. Just choose clients and start them with a few clicks. Still in development. @@ -467,7 +468,7 @@ As part of your monitoring, make sure to keep an eye on your machine's performan ## Further reading {#further-reading} - [Ethereum Staking Guides](https://github.com/SomerEsat/ethereum-staking-guides) - _Somer Esat, updated often_ -- [Guide | How to setup a validator for Ethereum staking on mainnet](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, updated regularly_ +- [Guide | How to setup a validator for Ethereum staking on mainnet](http://eth.coincashew.com) _– CoinCashew, updated often_ - [ETHStaker guides on running validators on testnets](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, updated regularly_ - [The Merge FAQ for node operators](https://notes.ethereum.org/@launchpad/node-faq-merge) - _July 2022_ - [Analyzing the hardware requirements to be an Ethereum full validated node](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24 September 2018_ From bbd9597da30ecfc1eb8bbc648c11a51804b6f05d Mon Sep 17 00:00:00 2001 From: saurabhburade Date: Wed, 23 Oct 2024 00:50:18 +0530 Subject: [PATCH 015/171] chore: update with suggested changes --- .../FaqAccordion.stories.tsx} | 41 +++++++++++-------- .../{FaqAccordian => FaqAccordion}/index.tsx | 37 ++++++++++------- 2 files changed, 45 insertions(+), 33 deletions(-) rename src/components/{FaqAccordian/FaqAccordian.stories.tsx => FaqAccordion/FaqAccordion.stories.tsx} (72%) rename src/components/{FaqAccordian => FaqAccordion}/index.tsx (76%) diff --git a/src/components/FaqAccordian/FaqAccordian.stories.tsx b/src/components/FaqAccordion/FaqAccordion.stories.tsx similarity index 72% rename from src/components/FaqAccordian/FaqAccordian.stories.tsx rename to src/components/FaqAccordion/FaqAccordion.stories.tsx index c6f3871cb8b..ab021ec0ddd 100644 --- a/src/components/FaqAccordian/FaqAccordian.stories.tsx +++ b/src/components/FaqAccordion/FaqAccordion.stories.tsx @@ -1,10 +1,15 @@ import { Meta, StoryObj } from "@storybook/react" -import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "." +import { + FaqAccordion, + FaqAccordionContent, + FaqAccordionItem, + FaqAccordionTrigger, +} from "." const meta = { title: "FaqAccordion", - component: Accordion, + component: FaqAccordion, decorators: [ (Story) => (
@@ -12,21 +17,21 @@ const meta = {
), ], -} satisfies Meta +} satisfies Meta export default meta -export const FaqAccordion: StoryObj = { +export const FaqAccordionStory: StoryObj = { render: () => ( - - - + + +

Why is there no 'official' Ethereum L2?

-
+ - + Just as there is no 'official' Ethereum client, there is no 'official' Ethereum layer 2. Ethereum is permissionless - technically anyone can create a layer 2! Multiple teams will implement @@ -35,15 +40,15 @@ export const FaqAccordion: StoryObj = { use cases. Much like we have multiple Ethereum clients developed by multiple teams in order to have diversity in the network, this too will be how layer 2s develop in the future. - -
- - + + + +

Why is there no 'official' Ethereum L2?

-
- + + Just as there is no 'official' Ethereum client, there is no 'official' Ethereum layer 2. Ethereum is permissionless - technically anyone can create a layer 2! Multiple teams will implement @@ -52,8 +57,8 @@ export const FaqAccordion: StoryObj = { use cases. Much like we have multiple Ethereum clients developed by multiple teams in order to have diversity in the network, this too will be how layer 2s develop in the future. - -
-
+ + + ), } diff --git a/src/components/FaqAccordian/index.tsx b/src/components/FaqAccordion/index.tsx similarity index 76% rename from src/components/FaqAccordian/index.tsx rename to src/components/FaqAccordion/index.tsx index e8211104564..61efd6f8248 100644 --- a/src/components/FaqAccordian/index.tsx +++ b/src/components/FaqAccordion/index.tsx @@ -6,16 +6,15 @@ import { cn } from "@/lib/utils/cn" import * as RootAccordion from "../../../tailwind/ui/accordion" -const AccordionTrigger = React.forwardRef< +const FaqAccordionTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( - // p-4 hover:bg-background-highlight - + )) -AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName +FaqAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName -// TODO: Prop types -const Accordion = ({ children, ...props }) => { +const FaqAccordion = ({ + children, + type, + ...props +}: AccordionPrimitive.AccordionSingleProps) => { return ( { ) } -const AccordionItem = React.forwardRef< +const FaqAccordionItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( @@ -67,16 +69,16 @@ const AccordionItem = React.forwardRef< {...props} /> )) -AccordionItem.displayName = "AccordionItem" +FaqAccordionItem.displayName = "AccordionItem" -const AccordionContent = React.forwardRef< +const FaqAccordionContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( )) -AccordionContent.displayName = AccordionPrimitive.Content.displayName +FaqAccordionContent.displayName = AccordionPrimitive.Content.displayName -export { Accordion, AccordionContent, AccordionItem, AccordionTrigger } +export { + FaqAccordion, + FaqAccordionContent, + FaqAccordionItem, + FaqAccordionTrigger, +} From 3443bd1510acdaaf7a54ef659f2c5b1c77c38e6c Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:33:44 +0300 Subject: [PATCH 016/171] Typo Update applying-storybook.md The word "on" should be "one." The corrected sentence is: There may be some exceptions, but generally each component should have only one story file. Corrected. --- docs/applying-storybook.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/applying-storybook.md b/docs/applying-storybook.md index 41281e6ca6a..e2ddf6b52a0 100644 --- a/docs/applying-storybook.md +++ b/docs/applying-storybook.md @@ -22,7 +22,7 @@ It's as easy as running `yarn storybook` to boot up a dedicated localhost to see A Storybook "story" is an instance of a component in a certain state or with certain parameters applied to show an alternative version of the component. -There may be some exceptions, but generally each component should have only on story file. +There may be some exceptions, but generally each component should have only one story file. The stories file will reside with each component. So the base folder structure in `src` will look like this: From 7a02409823c3b8ba5c4cf5e147c1e6129c6fc033 Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:36:33 +0300 Subject: [PATCH 017/171] Typo Update deploy-process.md The typical workflow will be as follows: It should be: The typical workflow is as follows: This is because the description refers to the current process, so "is" would be the correct tense instead of "will be." Corrected. --- docs/deploy-process.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy-process.md b/docs/deploy-process.md index bf11ef24675..2c95cfb176f 100644 --- a/docs/deploy-process.md +++ b/docs/deploy-process.md @@ -6,7 +6,7 @@ Ethereum.org follows a [Gitflow](https://www.atlassian.com/git/tutorials/compari The current process for deployment involves a 2-day QA cycle to test a release candidate. A release candidate is created on Tuesday, will have 2 days of testing, and then released to production on Thursday assuming no blocking bugs are found. -The typical workflow will be as follows: +The typical workflow is as follows: 1. A branch is created off of the `dev` branch, and pull requests for the branch are created into `dev` 2. Pull requests are reviewed, and merged into `dev` From af8d2ceb7071c92f07616cda6a1406ee78a0427e Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:39:44 +0300 Subject: [PATCH 018/171] Typo Update event-tracking.md "Each event comprises of 4 hierarchical values:" The correct phrase should be: "Each event comprises 4 hierarchical values:" The word "comprise" already means "to include," so "of" is unnecessary. Corrected. --- docs/event-tracking.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/event-tracking.md b/docs/event-tracking.md index d6a3e0e2f1d..b6eb5458b00 100644 --- a/docs/event-tracking.md +++ b/docs/event-tracking.md @@ -37,7 +37,7 @@ It's helpful to ask yourself how the results of what we track and measure might Broadly, events should be grouped by specific topic (e.g. L2 page external links, selected bridge, selected cex). -## Each event comprises of 4 hierarchical values: +## Each event comprises 4 hierarchical values: 1. Category (other events may share the same category if one feature has several actions) 2. Action From c2d66e14790b5fa5e2f9906e3575190aabc6a381 Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:42:45 +0300 Subject: [PATCH 019/171] Typo Update review-process.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There’s a small typo in the "Adding products" section: "... ensure we not sending our users to any dubious or unsafe products." It should be: "... ensure we are not sending our users to any dubious or unsafe products." The word "are" is missing. Corrected. --- docs/review-process.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/review-process.md b/docs/review-process.md index 9c79b3b0b21..d8fbe130686 100644 --- a/docs/review-process.md +++ b/docs/review-process.md @@ -42,7 +42,7 @@ Typographical and grammatical errors are medium-priority as small errors of this ### Adding products -Adding new products is currently a low-to-medium priority (depending on the type of product). These pull requests often take a long time to review as we must extensively research products to ensure we not sending our users to any dubious or unsafe products. +Adding new products is currently a low-to-medium priority (depending on the type of product). These pull requests often take a long time to review as we must extensively research products to ensure we are not sending our users to any dubious or unsafe products. **Timeline:** PRs should be closed or merged within 30 days of opening. From eaeb80e0b97fd39ae394e48e4b0f2fae4afc7af0 Mon Sep 17 00:00:00 2001 From: Sephiroth Date: Sun, 10 Nov 2024 16:57:43 +0000 Subject: [PATCH 020/171] Add Allnodes --- .../nodes-and-clients/nodes-as-a-service/index.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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..0423b8f868c 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 @@ -64,6 +64,19 @@ Here is a list of some of the most popular Ethereum node providers, feel free to - Integrated testnet faucet access - Active Discord builder community with 18k users +- [**Allnodes**](https://www.allnodes.com/) + - [Docs](https://docs.allnodes.com/) + - Features + - No rate limits with PublicNode token created on the Allnodes portfolio page. + - Privacy focused free rpc endpoints (100+ blockchains) on [PublicNode](https://www.publicnode.com) + - Dedicated nodes without rate limits for 90+ blockchains + - Dedicated archive nodes for 30+ blockchains + - Available in 3 regions (US, EU, Asia) + - Snapshots for 100+ blockchains on [PublicNode](https://www.publicnode.com/snapshots) + - 24/7 technical support with 99.90%-99.98% uptime SLA (depends on plan). + - Pay-per-hour pricing + - Pay with Credit Card, PayPal or Crypto + - [**All That Node**](https://allthatnode.com/) - [Docs](https://docs.allthatnode.com/) - Features From 7295edf053f59d90f50944b777cc692b947bc495 Mon Sep 17 00:00:00 2001 From: Ali Kim Date: Tue, 12 Nov 2024 10:06:13 -0500 Subject: [PATCH 021/171] cleaned up & added quickstart link --- public/content/developers/docs/data-and-analytics/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/developers/docs/data-and-analytics/index.md b/public/content/developers/docs/data-and-analytics/index.md index 42638340ad3..df283a44317 100644 --- a/public/content/developers/docs/data-and-analytics/index.md +++ b/public/content/developers/docs/data-and-analytics/index.md @@ -24,9 +24,9 @@ Developers can then process and transform this data to give their users unique i ## The Graph {#the-graph} -The [Graph Network](https://thegraph.com/) is a decentralized indexing protocol for organizing blockchain data. Instead of building and managing off-chain and centralized data stores to aggregate on-chain data, with The Graph, developers can build serverless applications that run entirely on public infrastructure. +The [Graph Network](https://thegraph.com/) is a decentralized indexing protocol for organizing blockchain data. Instead of building and managing off-chain and centralized data stores to aggregate on-chain data, with The Graph, developers can build serverless applications that run entirely on public infrastructure. Follow this [quick-start guide](https://thegraph.com/docs/en/quick-start/) to create, deploy and query a subgraph within 5 minutes. -Using [GraphQL](https://graphql.org/), developers can query any of the curated open APIs, known as sub-graphs, to acquire the necessary information they need to drive their dapp. By querying these indexed sub-graphs, Reports and dapps not only get performance and scalability benefits but also the built in accuracy provided by network consensus. As new improvements and/or sub-graphs are added to the network, your projects can rapidly iterate to take advantage of these enhancements. +Using [GraphQL](https://graphql.org/), developers can query any of the curated open APIs, known as subgraphs, to acquire the necessary information they need to drive their dapp. By querying these indexed subgraphs, Reports and dapps not only get performance and scalability benefits but also the built in accuracy provided by network consensus. ## Client diversity From 076a8cb7a499c434d0f18683bf7f24681532b849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Cuesta=20Ca=C3=B1ada?= <38806121+alcueca@users.noreply.github.com> Date: Wed, 20 Nov 2024 06:48:54 +0000 Subject: [PATCH 022/171] Fix `maxDeposit` and `maxMint` on the 4626 page It's "for the receiver": The idea is to allow enabling blocklists at the vault level. If you are going to restrict holding vault shares by certain addresses, you would stop it both at transfer and deposit/mint. The maxDeposit/maxMint should reflect that. It is a bit arbitrary, because blocklists could also be implemented on the function caller, and not just the token receiver, but that's what it is. --- .../developers/docs/standards/tokens/erc-4626/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/developers/docs/standards/tokens/erc-4626/index.md b/public/content/developers/docs/standards/tokens/erc-4626/index.md index a7429c253a7..c112dd9fa64 100644 --- a/public/content/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/developers/docs/standards/tokens/erc-4626/index.md @@ -62,7 +62,7 @@ This function returns the amount of `assets` that would be exchanged by the vaul function maxDeposit(address receiver) public view returns (uint256 maxAssets) ``` -This function returns the maximum amount of underlying assets that can be deposited in a single [`deposit`](#deposit) call by the `receiver`. +This function returns the maximum amount of underlying assets that can be deposited in a single [`deposit`](#deposit) call, with the shares minted for the `receiver`. #### previewDeposit {#previewdeposit} @@ -86,7 +86,7 @@ This function deposits `assets` of underlying tokens into the vault and grants o function maxMint(address receiver) public view returns (uint256 maxShares) ``` -This function returns the maximum amount of shares that can be minted in a single [`mint`](#mint) call by the `receiver`. +This function returns the maximum amount of shares that can be minted in a single [`mint`](#mint) call, with the shares minted for the `receiver`. #### previewMint {#previewmint} From d4f4b6791ac8cc994f8e70584b2d9c8792cb6a1e Mon Sep 17 00:00:00 2001 From: 0xShikhar Date: Wed, 20 Nov 2024 23:09:17 +0700 Subject: [PATCH 023/171] feat: add glossary term liquid staking token --- src/intl/en/glossary.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/intl/en/glossary.json b/src/intl/en/glossary.json index 5d4bb919f43..fac6ad55e6d 100644 --- a/src/intl/en/glossary.json +++ b/src/intl/en/glossary.json @@ -223,6 +223,8 @@ "liquidity-definition": "Liquidity is how quickly and easily an asset can be converted into cash or another asset. Decentralized exchanges like Uniswap have multiple liquidity pools where asset holders can deposit their assets where traders can buy and sell them in a decentralized way in exchange for rewards.", "liquidity-tokens-term": "Liquidity tokens", "liquidity-tokens-definition": "Liquidity tokens (LST) are digital tokens issued to participants who deposit assets into a liquidity pool, which is a collection of funds locked in a smart contract and used to facilitate trading on a decentralized exchange (DEX).
These tokens represent the participant's share of the pool and can be redeemed later for the initial deposit plus a portion of the trading fees generated by the pool's activity. Essentially, liquidity tokens serve as a proof of ownership or stake in a liquidity pool, allowing holders to earn rewards while providing the necessary liquidity for others to trade different cryptocurrency pairs efficiently.", + "liquid-staking-tokens-term": "Liquid staking tokens", + "liquid-staking-tokens-definition": "A derivative token representing that represents the locked cryptocurrency which user gets by staking a token. When a user stakes their assets, they receive an equivalent amount of Liquid Staking Tokens. These LSTs can then be traded, sold, or used in other DeFi protocols, providing liquidity to the staker even while their original assets remain staked.", "lmd-ghost-term": "LMD-GHOST", "lmd-ghost-definition": "The fork-choice algorithm used by Ethereum's consensus clients to identify the head of the chain. LMD-GHOST is an acronym standing for \"Latest Message Driven Greediest Heaviest Observed SubTree\" which means that the head of the chain is the block with the greatest accumulation of attestations in its history.", "mainnet-term": "Mainnet", From 879ecdcb75e6b1c3a33cf8b27a504f595678ea60 Mon Sep 17 00:00:00 2001 From: futreall <86553580+futreall@users.noreply.github.com> Date: Sun, 24 Nov 2024 14:14:09 +0200 Subject: [PATCH 024/171] Update typescript.md --- docs/typescript.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/typescript.md b/docs/typescript.md index 78884f9b141..bdccb06e0f9 100644 --- a/docs/typescript.md +++ b/docs/typescript.md @@ -14,7 +14,7 @@ const someVar: string = 'string' const someVar = 'string' ``` -Do declare a type for an unassigned variable when a type can not be inferred. +Do declare a type for an unassigned variable when a type cannot be inferred. ``` const someVar: string From fca4f05f086643a3d60110abad100971852b2b1a Mon Sep 17 00:00:00 2001 From: futreall <86553580+futreall@users.noreply.github.com> Date: Sun, 24 Nov 2024 14:20:02 +0200 Subject: [PATCH 025/171] Update index.md --- public/content/translations/ms/dao/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ms/dao/index.md b/public/content/translations/ms/dao/index.md index 48b4683f095..c947c40423c 100644 --- a/public/content/translations/ms/dao/index.md +++ b/public/content/translations/ms/dao/index.md @@ -34,7 +34,7 @@ Ini membuka begitu banyak peluang baharu untuk kerjasama dan penyelarasan global | Undian diperlukan oleh ahli untuk sebarang perubahan dilaksanakan. | Bergantung kepada struktur, perubahan boleh dituntut daripada parti tunggal, atau undian boleh ditawarkan. | | Undi dikira, dan hasil dilaksanakan secara automatik tanpa perantara yang dipercayai. | Jika undi dibenarkan, undian akan dikira secara dalaman, dan hasil undian mesti dikendalikan secara manual. | | Perkhidmatan yang ditawarkan dikendalikan secara automatik dengan cara terdesentralisasi (contohnya pengedaran dana dermawan). | Memerlukan pengendalian manusia, atau automasi terkawal secara pusat, terdedah pada manipulasi. | -| Semua aktiviti iadalah telus dan umum sepenuhnya. | Aktiviti biasanya peribadi, dan terhad kepada orang ramai. | +| Semua aktiviti adalah telus dan umum sepenuhnya. | Aktiviti biasanya peribadi, dan terhad kepada orang ramai. | ### Contoh DAO {#dao-examples} From 30c0338c0e73b8aff18b17a57225dafc376c9047 Mon Sep 17 00:00:00 2001 From: futreall <86553580+futreall@users.noreply.github.com> Date: Sun, 24 Nov 2024 14:20:41 +0200 Subject: [PATCH 026/171] Update index.md --- public/content/translations/ms/defi/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/ms/defi/index.md b/public/content/translations/ms/defi/index.md index 91b4a3938a5..06da3e80fe8 100644 --- a/public/content/translations/ms/defi/index.md +++ b/public/content/translations/ms/defi/index.md @@ -139,7 +139,7 @@ Ini membolehkan anda meminjam wang tanpa semakan kredit atau menyerahkan makluma #### Akses kepada dana global {#access-global-funds} -Apabila anda menggunakan pemberi pinjaman teragih, anda mempunyai akses kepada dana yang didepositkan dari seluruh dunia, bukan hanya dana dalam jagaan bank atau institusi pilihan anda. Ini menjadikan pinjaman lebih mudah diakses dan manjadikan kadar faedah lebih baik. +Apabila anda menggunakan pemberi pinjaman teragih, anda mempunyai akses kepada dana yang didepositkan dari seluruh dunia, bukan hanya dana dalam jagaan bank atau institusi pilihan anda. Ini menjadikan pinjaman lebih mudah diakses dan menjadikan kadar faedah lebih baik. #### Kecekapan cukai {#tax-efficiencies} @@ -245,7 +245,7 @@ Contoh yang baik ialah [dana DeFi Pulse Index (DPI)](https://defipulse.com/blog/ ### Biayai idea anda {#crowdfunding} -Ethereum ialah platform yang cermerlang untuk pendanaan awam: +Ethereum ialah platform yang cemerlang untuk pendanaan awam: - Pembiaya yang berpotensi boleh datang dari mana-mana sahaja – Ethereum dan tokennya terbuka kepada sesiapa sahaja, di mana-mana sahaja di dunia. - Ia telus supaya pengumpul dana dapat membuktikan jumlah wang yang telah dikumpulkan. Anda juga boleh menjejaki cara dana dibelanjakan kemudiannya. From fb5157a0932b05be56e45cb77d29f627c459c649 Mon Sep 17 00:00:00 2001 From: Ali Kim Date: Mon, 2 Dec 2024 01:03:52 -0500 Subject: [PATCH 027/171] Made content more concise. Used bullet points to improve readability. --- .../content/developers/docs/data-and-analytics/index.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/public/content/developers/docs/data-and-analytics/index.md b/public/content/developers/docs/data-and-analytics/index.md index df283a44317..13e057d5029 100644 --- a/public/content/developers/docs/data-and-analytics/index.md +++ b/public/content/developers/docs/data-and-analytics/index.md @@ -24,9 +24,14 @@ Developers can then process and transform this data to give their users unique i ## The Graph {#the-graph} -The [Graph Network](https://thegraph.com/) is a decentralized indexing protocol for organizing blockchain data. Instead of building and managing off-chain and centralized data stores to aggregate on-chain data, with The Graph, developers can build serverless applications that run entirely on public infrastructure. Follow this [quick-start guide](https://thegraph.com/docs/en/quick-start/) to create, deploy and query a subgraph within 5 minutes. +[The Graph](https://thegraph.com/) is an indexing protocol that provides an easy way to query blockchain data through open APIs known as subgraphs. -Using [GraphQL](https://graphql.org/), developers can query any of the curated open APIs, known as subgraphs, to acquire the necessary information they need to drive their dapp. By querying these indexed subgraphs, Reports and dapps not only get performance and scalability benefits but also the built in accuracy provided by network consensus. +With The Graph, developers can benefit from: + - Decentralized Indexing: Enables indexing blockchain data through multiple indexers, thus eliminating any single point of failure + - GraphQL Queries: Provides a powerful GraphQL interface for querying indexed data, making data retrieval super simple. + - Customization: Define your own logic for transforming & storing blockchain data. Reuse subgraphs published by other developers on The Graph Network. + +Follow this [quick-start](https://thegraph.com/docs/en/quick-start/) guide to create, deploy, and query a subgraph within 5 minutes. ## Client diversity From 94c791bb1b1b7398a9f2229f4421c6a5fa70aca4 Mon Sep 17 00:00:00 2001 From: standstaff Date: Mon, 9 Dec 2024 16:44:06 +0800 Subject: [PATCH 028/171] chore: fix 404 status URL Signed-off-by: standstaff --- public/content/developers/docs/smart-contracts/testing/index.md | 2 +- .../cs/developers/docs/smart-contracts/testing/index.md | 2 +- .../de/developers/docs/smart-contracts/testing/index.md | 2 +- .../el/developers/docs/smart-contracts/testing/index.md | 2 +- .../es/developers/docs/smart-contracts/testing/index.md | 2 +- .../fa/developers/docs/smart-contracts/testing/index.md | 2 +- .../fr/developers/docs/smart-contracts/testing/index.md | 2 +- .../hu/developers/docs/smart-contracts/testing/index.md | 2 +- .../it/developers/docs/smart-contracts/testing/index.md | 2 +- .../ja/developers/docs/smart-contracts/testing/index.md | 2 +- .../pt-br/developers/docs/smart-contracts/testing/index.md | 2 +- .../tr/developers/docs/smart-contracts/testing/index.md | 2 +- .../zh/developers/docs/smart-contracts/testing/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/smart-contracts/testing/index.md b/public/content/developers/docs/smart-contracts/testing/index.md index 30f27ac1a9e..78c9e6dcc49 100644 --- a/public/content/developers/docs/smart-contracts/testing/index.md +++ b/public/content/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ The major difference is that bug bounty programs are open to the wider developer - **[Brownie unit testing framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utilizes Pytest, a feature-rich test framework that lets you write small tests with minimal code, scales well for large projects, and is highly extendable._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry offers Forge, a fast and flexible Ethereum testing framework capable of executing simple unit tests, gas optimization checks, and contract fuzzing._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry offers Forge, a fast and flexible Ethereum testing framework capable of executing simple unit tests, gas optimization checks, and contract fuzzing._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework for testing smart contracts based on ethers.js, Mocha, and Chai._ diff --git a/public/content/translations/cs/developers/docs/smart-contracts/testing/index.md b/public/content/translations/cs/developers/docs/smart-contracts/testing/index.md index 56f7eccddab..fc2ad7309f9 100644 --- a/public/content/translations/cs/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/cs/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ Hlavní rozdíl spočívá v tom, že programy odměn za vyřešení chyb jsou o - **[Brownie unit testing framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** – _Brownie využívá Pytest, funkčně bohatý testovací framework, který umožňuje psát malé testy s minimem kódu, dobře se škáluje pro velké projekty a je vysoce rozšiřitelný._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** – _Foundry nabízí Forge, rychlý a flexibilní framework pro testování na Ethereu, který dokáže provádět jednoduché jednotkové testy, kontroly optimalizace paliva a fuzzing kontraktů._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _Foundry nabízí Forge, rychlý a flexibilní framework pro testování na Ethereu, který dokáže provádět jednoduché jednotkové testy, kontroly optimalizace paliva a fuzzing kontraktů._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Framework pro testování chytrých kontraktů založený na ethers.js, Mocha a Chai._ diff --git a/public/content/translations/de/developers/docs/smart-contracts/testing/index.md b/public/content/translations/de/developers/docs/smart-contracts/testing/index.md index aa4a07cb8fe..a8cc09b7c0d 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ Der Hauptunterschied besteht darin, dass Bug-Bounty-Programme der breiteren Entw - **[Brownie-Unit-Testing-Framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** – _Brownie nutzt Pytest, ein funktionsreiches Test-Framework, mit dem Sie kleine Tests mit minimalem Code schreiben können. Außerdem lässt es sich gut für große Projekte skalieren und ist in hohem Maße erweiterbar._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** – _Foundry bietet mit Forge ein schnelles und flexibles Ethereum-Testing-Framework an, das einfache Unit-Tests, Gas-Optimierungsprüfungen und Vertrags-Fuzzing durchführen kann._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _Foundry bietet mit Forge ein schnelles und flexibles Ethereum-Testing-Framework an, das einfache Unit-Tests, Gas-Optimierungsprüfungen und Vertrags-Fuzzing durchführen kann._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Framework zum Testen von Smart Contracts basierend auf ethers.js, Mocha und Chai._ diff --git a/public/content/translations/el/developers/docs/smart-contracts/testing/index.md b/public/content/translations/el/developers/docs/smart-contracts/testing/index.md index 84944ec7782..f3d9610a1ad 100644 --- a/public/content/translations/el/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/el/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ function auctionEnd() external { - **[Πλαίσιο δοκιμής μονάδας Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Το Brownie χρησιμοποιεί το Pytest, ένα πλούσιο σε χαρακτηριστικά πλαίσιο δοκιμών που σας επιτρέπει να γράφετε μικρές δοκιμές με ελάχιστο κώδικα, κλιμακώνεται καλά σε μεγάλα έργα και είναι ιδιαίτερα επεκτάσιμο._ -- **[Δοκιμές Foundry](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Το Foundry προσφέρει το Forge, ένα γρήγορο και ευέλικτο πλαίσιο δοκιμών Ethereum ικανό να εκτελεί απλές δοκιμές μονάδας, ελέγχους βελτιστοποίησης gas και fuzzing συμβολαίων._ +- **[Δοκιμές Foundry](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Το Foundry προσφέρει το Forge, ένα γρήγορο και ευέλικτο πλαίσιο δοκιμών Ethereum ικανό να εκτελεί απλές δοκιμές μονάδας, ελέγχους βελτιστοποίησης gas και fuzzing συμβολαίων._ - **[Δοκιμές Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Πλαίσιο για δοκιμή έξυπνων συμβολαίων βασισμένο σε ethers.js, Mocha και Chai._ diff --git a/public/content/translations/es/developers/docs/smart-contracts/testing/index.md b/public/content/translations/es/developers/docs/smart-contracts/testing/index.md index c42c30df4e1..21e1c0e5064 100644 --- a/public/content/translations/es/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/es/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ La diferencia principal es que los programas de recompensas por errores están a - **[Marco de pruebas unitarias de Brownie:](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** _Brownie utiliza Pytest, un marco de pruebas rico en funciones que le permite escribir pequeñas pruebas con código mínimo, escala bien para proyectos grandes y es altamente extendible._ -- **[Foundry Tests:](https://github.com/foundry-rs/foundry/tree/master/forge)** _Foundry ofrece Forge, un marco de pruebas de Ethereum rápido y flexible capaz de ejecutar pruebas unitarias simples, comprobaciones de optimización de gas y fuzzing de contratos._ +- **[Foundry Tests:](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** _Foundry ofrece Forge, un marco de pruebas de Ethereum rápido y flexible capaz de ejecutar pruebas unitarias simples, comprobaciones de optimización de gas y fuzzing de contratos._ - **[Hardhat Tests:](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** _Marco para probar contratos inteligentes basado en ethers.js, Mocha y Chai._ diff --git a/public/content/translations/fa/developers/docs/smart-contracts/testing/index.md b/public/content/translations/fa/developers/docs/smart-contracts/testing/index.md index 3349ec8baa1..54a7c41ddf4 100644 --- a/public/content/translations/fa/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/fa/developers/docs/smart-contracts/testing/index.md @@ -313,7 +313,7 @@ function auctionEnd() external { - **[فریم ورک تست واحد براونی](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _براونی از Pytest استفاده می‌کند، یک فریم ورک تستی غنی از ویژگی‌ها که به شما امکان می‌دهد تست‌های کوچک را با حداقل کد بنویسید و برای پروژه‌های بزرگ مقیاس‌پذیری خوبی دارد و بسیار قابل توسعه است._ -- **[تست‌های فاندری ](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry Forge را ارائه می‌کند، یک فریم ورک آزمایشی سریع و انعطاف‌پذیر اتریوم که قادر به اجرای آزمایش‌های واحد ساده، بررسی‌های بهینه‌سازی گس و فازبندی قرارداد است._ +- **[تست‌های فاندری ](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry Forge را ارائه می‌کند، یک فریم ورک آزمایشی سریع و انعطاف‌پذیر اتریوم که قادر به اجرای آزمایش‌های واحد ساده، بررسی‌های بهینه‌سازی گس و فازبندی قرارداد است._ - **[تست‌های هاردهت](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _چارچوبی برای آزمایش قراردادهای هوشمند مبتنی بر ethers.js، موکا و چای است._ diff --git a/public/content/translations/fr/developers/docs/smart-contracts/testing/index.md b/public/content/translations/fr/developers/docs/smart-contracts/testing/index.md index 61ea726eb67..8fef1f89fc5 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ La principale différence est que les programmes de primes aux bogues sont ouver - **Cadre de test unitaire Brownie** - _Brownie utilise Pytest, un cadre de test riche en fonctionnalités qui vous permet d'écrire de petits tests avec un code minimal, qui s'adapte bien aux grands projets et qui est hautement extensible._ -- **[Tests Foundy](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry propose Forge, un cadre de test Ethereum rapide et flexible capable d'exécuter des tests unitaires simples, des contrôles d'optimisation du gaz et du fuzzing de contrats._ +- **[Tests Foundy](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry propose Forge, un cadre de test Ethereum rapide et flexible capable d'exécuter des tests unitaires simples, des contrôles d'optimisation du gaz et du fuzzing de contrats._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework pour tester des contrats intelligents basés sur ethers.js, Mocha et Chai._ diff --git a/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md b/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md index 18fa6d86692..5c56dcfded7 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ A fő különbség az, hogy a hibavadász-programok nyitottak a szélesebb fejle - **[Brownie unit testing framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** – _A Brownie a Pytest-et használja, amely egy funkciógazdag tesztelési keretrendszert, és amely lehetővé teszi kis tesztek írását minimális kóddal, jól skálázható nagyobb projektekhez és nagymértékben bővíthető._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** – _A Foundry a Forge megoldást kínálja, amely egy gyors és rugalmas Ethereum tesztelési keretrendszert, és amely képes egyszerű egységtesztek, gázoptimalizálási ellenőrzések és szerződés fuzzing végrehajtására._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _A Foundry a Forge megoldást kínálja, amely egy gyors és rugalmas Ethereum tesztelési keretrendszert, és amely képes egyszerű egységtesztek, gázoptimalizálási ellenőrzések és szerződés fuzzing végrehajtására._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Keretrendszer az ethers.js, Mocha és Chai alapú okosszerződések tesztelésére._ diff --git a/public/content/translations/it/developers/docs/smart-contracts/testing/index.md b/public/content/translations/it/developers/docs/smart-contracts/testing/index.md index a3dbddf8e4b..50acba857b7 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ La differenza principale è che i programmi di bug bounty sono aperti alla più - **[Quadro di test unitari di Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utilizza Pytest, un quadro di test ricco di funzionalità che ti consente di scrivere piccoli test con codice minimale, si ridimensiona bene per i grandi progetti ed è altamente estendibile._ -- **[Test di Foundry](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry offre Forge, un quadro di test di Ethereum veloci e flessibili, in grado di eseguire semplici test unitari, controlli d'ottimizzazione del carburante e fuzzing del contratto._ +- **[Test di Foundry](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry offre Forge, un quadro di test di Ethereum veloci e flessibili, in grado di eseguire semplici test unitari, controlli d'ottimizzazione del carburante e fuzzing del contratto._ - **[Test di Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Quadro per testare i contratti intelligenti basato su ethers.js, Mocha e Chai._ diff --git a/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md b/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md index ec7f3f969f1..38d5f3c8674 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ Solidityスマートコントラクト用の単体テストフレームワーク - **[Brownieユニットテストフレームワーク](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _最小限のコードで小さなテストを作成可能。また、大規模なプロジェクトにも対応するスケーラビリティも持ち合わせており、機能豊富なテストフレームワークであるPytestを利用しています。_ -- **[Foundryテスト](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry社は、シンプルな単体テスト、ガス最適化チェック、コントラクトファジングを実行でき、高速で柔軟なイーサリアムテストフレームワークであるForgeを提供しています。_ +- **[Foundryテスト](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry社は、シンプルな単体テスト、ガス最適化チェック、コントラクトファジングを実行でき、高速で柔軟なイーサリアムテストフレームワークであるForgeを提供しています。_ - **[Hardhatテスト](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _ethers.js、Mocha、Chaiをベースとしたスマートコントラクトテストにおけるフレームワーク_。 diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md index 51b9be26a36..7cddcb77927 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ A maior diferença é que programas de recompensa por bug são abertos a uma mai - **[Framework de teste de unidade do Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utiliza Pytest, uma estrutura de teste rica em recursos que permite que você escreva pequenos testes com o mínimo de código, escala bem para grandes projetos e é altamente extensível._ -- **[Froundry Testes](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry oferece o Forge, um framework de teste no Ethereum rápido e flexível, capaz de executar testes de unidade simples, verificações de otimização de gás e mutações (fuzzing) em contratos._ +- **[Froundry Testes](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry oferece o Forge, um framework de teste no Ethereum rápido e flexível, capaz de executar testes de unidade simples, verificações de otimização de gás e mutações (fuzzing) em contratos._ - **[Hardhat Testes](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework para testar contratos inteligentes com base no ethers.js, Mocha e Chai._ diff --git a/public/content/translations/tr/developers/docs/smart-contracts/testing/index.md b/public/content/translations/tr/developers/docs/smart-contracts/testing/index.md index ed57f505437..bd19b926220 100644 --- a/public/content/translations/tr/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/tr/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ En önemli fark, hata ödül programlarının daha geniş bir geliştirici/hacke - **[Brownie birim test çerçevesi](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie, minimum kodla küçük testler yazmanıza olanak tanıyan, büyük projeler için iyi ölçeklenen ve oldukça genişletilebilir, zengin özelliklere sahip bir test çerçevesi olan Pytest'i kullanır._ -- **[Foundry Testleri](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry, basit birim testleri, gaz optimizasyon kontrolleri ve sözleşme bulanıklaştırma gerçekleştirebilen hızlı ve esnek bir Ethereum test çerçevesi olan Forge'u barındırır._ +- **[Foundry Testleri](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry, basit birim testleri, gaz optimizasyon kontrolleri ve sözleşme bulanıklaştırma gerçekleştirebilen hızlı ve esnek bir Ethereum test çerçevesi olan Forge'u barındırır._ - **[Hardhat Testleri](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Ethers.js, Mocha ve Chai tabanlı akıllı sözleşme test çerçevesi._ diff --git a/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md b/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md index e1833c0fc0b..b97d20a0ec8 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ function auctionEnd() external { - **[Brownie 单元测试框架](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie 采用了 Pytest,这是一个功能丰富的测试框架,让你只需使用最少的代码即可编写小型测试,并能有效地扩展以用于大型项目,而且具有很强的可扩展性。_ -- **[Foundry 测试](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry 提供了 Forge,这是一个快速灵活的以太坊测试框架,能够执行简单的单元测试、燃料优化检查和合约模糊测试。_ +- **[Foundry 测试](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry 提供了 Forge,这是一个快速灵活的以太坊测试框架,能够执行简单的单元测试、燃料优化检查和合约模糊测试。_ - **[Hardhat 测试](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _基于 ethers.js、Mocha 和 Chai 的智能合约测试框架。_ From defac7b20169c9830d9fd59d44f8d516c6dff8ac Mon Sep 17 00:00:00 2001 From: Daehyun Paik Date: Tue, 10 Dec 2024 04:12:09 +0100 Subject: [PATCH 029/171] Fix formatting in `client-diversity/index.md` --- .../docs/nodes-and-clients/client-diversity/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/content/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/developers/docs/nodes-and-clients/client-diversity/index.md index 57231954f26..7a26a24e5f5 100644 --- a/public/content/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/developers/docs/nodes-and-clients/client-diversity/index.md @@ -90,7 +90,8 @@ Several dashboards give real-time client diversity statistics for the execution - [Rated.network](https://www.rated.network/) - [clientdiversity.org](https://clientdiversity.org/) - **Execution layer:** + +**Execution layer:** - [supermajority.info](https://supermajority.info//) - [Ethernodes](https://ethernodes.org/) From d66c572c24528544bf31c1951ecd6467e7b056d2 Mon Sep 17 00:00:00 2001 From: Kerim Kabirov Date: Wed, 11 Dec 2024 15:48:15 +0100 Subject: [PATCH 030/171] Fix formatting and bug in pseudocode in `patricia-merkle-trie` Prior to the change the doc wasn't formatted for Python code, even though mostly Python syntax is used, which might've lead to decrease in comprehension as the syntax wasn't highlighted. All the code was formatted with the Black formatter to ease comprehension. Additionally, the following line contained bug: ```python if node = '': return '' ``` The comparison operator (==) was likely meant. --- .../patricia-merkle-trie/index.md | 73 ++++++++++--------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/public/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md index b49d806937c..fdb6a421787 100644 --- a/public/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md +++ b/public/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -33,34 +33,34 @@ There is a difference between looking something up in the 'trie' and the underly The update and delete operations for radix tries can be defined as follows: -``` - def update(node,path,value): - curnode = db.get(node) if node else [ NULL ] * 17 +```python + def update(node, path, value): + curnode = db.get(node) if node else [NULL] * 17 newnode = curnode.copy() - if path == '': + if path == "": newnode[-1] = value else: - newindex = update(curnode[path[0]],path[1:],value) + newindex = update(curnode[path[0]], path[1:], value) newnode[path[0]] = newindex - db.put(hash(newnode),newnode) + db.put(hash(newnode), newnode) return hash(newnode) - def delete(node,path): + def delete(node, path): if node is NULL: return NULL else: curnode = db.get(node) newnode = curnode.copy() - if path == '': + if path == "": newnode[-1] = NULL else: - newindex = delete(curnode[path[0]],path[1:]) + newindex = delete(curnode[path[0]], path[1:]) newnode[path[0]] = newindex if all(x is NULL for x in newnode): return NULL else: - db.put(hash(newnode),newnode) + db.put(hash(newnode), newnode) return hash(newnode) ``` @@ -104,60 +104,63 @@ The flagging of both _odd vs. even remaining partial path length_ and _leaf vs. For even remaining path length (`0` or `2`), another `0` "padding" nibble will always follow. -``` +```python def compact_encode(hexarray): term = 1 if hexarray[-1] == 16 else 0 - if term: hexarray = hexarray[:-1] + if term: + hexarray = hexarray[:-1] oddlen = len(hexarray) % 2 flags = 2 * term + oddlen if oddlen: hexarray = [flags] + hexarray else: hexarray = [flags] + [0] + hexarray - // hexarray now has an even length whose first nibble is the flags. - o = '' - for i in range(0,len(hexarray),2): - o += chr(16 * hexarray[i] + hexarray[i+1]) + # hexarray now has an even length whose first nibble is the flags. + o = "" + for i in range(0, len(hexarray), 2): + o += chr(16 * hexarray[i] + hexarray[i + 1]) return o ``` Examples: -``` - > [ 1, 2, 3, 4, 5, ...] +```python + > [1, 2, 3, 4, 5, ...] '11 23 45' - > [ 0, 1, 2, 3, 4, 5, ...] + > [0, 1, 2, 3, 4, 5, ...] '00 01 23 45' - > [ 0, f, 1, c, b, 8, 10] + > [0, f, 1, c, b, 8, 10] '20 0f 1c b8' - > [ f, 1, c, b, 8, 10] + > [f, 1, c, b, 8, 10] '3f 1c b8' ``` Here is the extended code for getting a node in the Merkle Patricia trie: -``` - def get_helper(node,path): - if path == []: return node - if node = '': return '' +```python + def get_helper(node, path): + if path == []: + return node + if node == "": + return "" curnode = rlp.decode(node if len(node) < 32 else db.get(node)) if len(curnode) == 2: (k2, v2) = curnode k2 = compact_decode(k2) - if k2 == path[:len(k2)]: - return get(v2, path[len(k2):]) + if k2 == path[: len(k2)]: + return get(v2, path[len(k2) :]) else: - return '' + return "" elif len(curnode) == 17: - return get_helper(curnode[path[0]],path[1:]) + return get_helper(curnode[path[0]], path[1:]) - def get(node,path): + def get(node, path): path2 = [] for i in range(len(path)): path2.push(int(ord(path[i]) / 16)) path2.push(ord(path[i]) % 16) path2.push(16) - return get_helper(node,path2) + return get_helper(node, path2) ``` ### Example Trie {#example-trie} @@ -205,7 +208,7 @@ There is one global state trie, and it is updated every time a client processes Storage trie is where _all_ contract data lives. There is a separate storage trie for each account. To retrieve values at specific storage positions at a given address the storage address, integer position of the stored data in the storage, and the block ID are required. These can then be passed as arguments to the `eth_getStorageAt` defined in the JSON-RPC API, e.g. to retrieve the data in storage slot 0 for address `0x295a70b2de5e3953354a6a8344e616ed314d7251`: -``` +```bash curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 {"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"} @@ -214,7 +217,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Retrieving other elements in storage is slightly more involved because the position in the storage trie must first be calculated. The position is calculated as the `keccak256` hash of the address and the storage position, both left-padded with zeros to a length of 32 bytes. For example, the position for the data in storage slot 1 for address `0x391694e7e0b0cce554cb130d723a9d27458f9298` is: -``` +```python keccak256(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001")) ``` @@ -229,7 +232,7 @@ undefined The `path` is therefore `keccak256(<6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9>)`. This can now be used to retrieve the data from the storage trie as before: -``` +```bash curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545 {"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"} @@ -241,7 +244,7 @@ Note: The `storageRoot` for an Ethereum account is empty by default if it's not There is a separate transactions trie for every block, again storing `(key, value)` pairs. A path here is: `rlp(transactionIndex)` which represents the key that corresponds to a value determined by: -``` +```python if legacyTx: value = rlp(tx) else: From 9c0d05e5d5fa719f2a68c6d7a9a3b5fdeb5be230 Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Mon, 16 Dec 2024 20:15:39 +0200 Subject: [PATCH 031/171] adding probelab reports --- public/content/developers/docs/nodes-and-clients/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/public/content/developers/docs/nodes-and-clients/index.md b/public/content/developers/docs/nodes-and-clients/index.md index 5da1a93f3a9..5855dfa7ac7 100644 --- a/public/content/developers/docs/nodes-and-clients/index.md +++ b/public/content/developers/docs/nodes-and-clients/index.md @@ -49,6 +49,7 @@ Multiple trackers offer a real-time overview of nodes in the Ethereum network. N - [Ethernodes](https://ethernodes.org/) by Bitfly - [Nodewatch](https://www.nodewatch.io/) by Chainsafe, crawling consensus nodes - [Monitoreth](https://monitoreth.io/) - by MigaLabs, A distributed network monitoring tool +- [Weekly Network Health Reports](https://probelab.io) - by ProbeLab, Using the [Nebula crawler](https://github.com/dennis-tra/nebula) and other tools ## Node types {#node-types} From e9c143ef20f658e1adb8c594cd028e0c861fbb92 Mon Sep 17 00:00:00 2001 From: Barty <0xbarty@gmail.com> Date: Thu, 19 Dec 2024 09:52:21 +0200 Subject: [PATCH 032/171] fix: Correct invalid duration-25 value in TailwindCSS classes --- src/components/DataTable/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DataTable/index.tsx b/src/components/DataTable/index.tsx index 38a0bcc47ba..fcbc75f6cd7 100644 --- a/src/components/DataTable/index.tsx +++ b/src/components/DataTable/index.tsx @@ -137,7 +137,7 @@ const DataTable = ({ From f87c30cf0b274e15d05b198f837d3464b769fef1 Mon Sep 17 00:00:00 2001 From: 0xShikhar Date: Mon, 23 Dec 2024 16:45:46 +0530 Subject: [PATCH 033/171] feat: add playground endpoints to json-rpc api --- .../developers/docs/apis/json-rpc/index.md | 63 ++++++++++++++++++- .../docs/apis/json-rpc/playground.svg | 1 + 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 public/content/developers/docs/apis/json-rpc/playground.svg diff --git a/public/content/developers/docs/apis/json-rpc/index.md b/public/content/developers/docs/apis/json-rpc/index.md index c9842341a8c..b517eee83a1 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -143,6 +143,8 @@ You can use the [playground tool](https://ethereum-json-rpc.com) to discover and Returns the current client version. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=web3_clientVersion) + **Parameters** None @@ -168,6 +170,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[], Returns Keccak-256 (_not_ the standardized SHA3-256) of the given data. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=web3_sha3) + **Parameters** 1. `DATA` - The data to convert into a SHA3 hash @@ -197,6 +201,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c Returns the current network id. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=net_version) + **Parameters** None @@ -228,6 +234,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67 Returns `true` if client is actively listening for network connections. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=net_listening) + **Parameters** None @@ -253,6 +261,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id": Returns number of peers currently connected to the client. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=net_peerCount) + **Parameters** None @@ -278,6 +288,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id": Returns the current Ethereum protocol version. Note that this method is [not available in Geth](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924). +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_protocolVersion) + **Parameters** None @@ -303,6 +315,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[] Returns an object with data about the sync status or `false`. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_syncing) + **Parameters** None @@ -387,6 +401,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} Returns the client coinbase address. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_coinbase) + > **Note:** This method has been deprecated as of **v1.14.0** and is no longer supported. Attempting to use this method will result in a "Method not supported" error. **Parameters** @@ -414,6 +430,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":6 Returns the chain ID used for signing replay-protected transactions. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_chainId) + **Parameters** None @@ -439,6 +457,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67 Returns `true` if client is actively mining new blocks. This can only return `true` for proof-of-work networks and may not be available in some clients since [The Merge](/roadmap/merge/). +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_mining) + **Parameters** None @@ -464,6 +484,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71} Returns the number of hashes per second that the node is mining with. This can only return `true` for proof-of-work networks and may not be available in some clients since [The Merge](/roadmap/merge/). +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_hashrate) + **Parameters** None @@ -489,6 +511,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":7 Returns an estimate of the current price per gas in wei. For example, the Besu client examines the last 100 blocks and returns the median gas unit price by default. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_gasPrice) + **Parameters** None @@ -510,10 +534,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":7 } ``` + + ### eth_accounts {#eth_accounts} Returns a list of addresses owned by client. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_accounts) + **Parameters** None @@ -538,6 +566,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1 ### eth_blockNumber {#eth_blocknumber} Returns the number of most recent block. + +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_blockNumber) **Parameters** @@ -564,6 +594,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id Returns the balance of the account of given address. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBalance) + **Parameters** 1. `DATA`, 20 Bytes - address to check for balance. @@ -594,6 +626,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407 Returns the value from a storage position at a given address. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getStorageAt) + **Parameters** 1. `DATA`, 20 Bytes - address of the storage. @@ -695,6 +729,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params Returns the number of transactions in a block from a block matching the given block hash. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBlockTransactionCountByHash) + **Parameters** 1. `DATA`, 32 Bytes - hash of a block @@ -724,6 +760,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHa Returns the number of transactions in a block matching the given block number. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBlockTransactionCountByNumber) + **Parameters** 1. `QUANTITY|TAG` - integer of a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [default block parameter](/developers/docs/apis/json-rpc/#default-block). @@ -755,6 +793,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNu Returns the number of uncles in a block from a block matching the given block hash. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getUncleCountByBlockHash) + **Parameters** 1. `DATA`, 32 Bytes - hash of a block @@ -784,6 +824,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","p Returns the number of uncles in a block from a block matching the given block number. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getUncleCountByBlockNumber) **Parameters** 1. `QUANTITY|TAG` - integer of a block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [default block parameter](/developers/docs/apis/json-rpc/#default-block) @@ -815,6 +856,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber", Returns code at a given address. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getCode) + **Parameters** 1. `DATA`, 20 Bytes - address @@ -994,6 +1037,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params" Executes a new message call immediately without creating a transaction on the blockchain. Often used for executing read-only smart contract functions, for example the `balanceOf` for an ERC-20 contract. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_call) + **Parameters** 1. `Object` - The transaction call object @@ -1028,6 +1073,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}] Generates and returns an estimate of how much gas is necessary to allow the transaction to complete. The transaction will not be added to the blockchain. Note that the estimate may be significantly more than the amount of gas actually used by the transaction, for a variety of reasons including EVM mechanics and node performance. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_estimateGas) + **Parameters** See [eth_call](#eth_call) parameters, except that all properties are optional. If no gas limit is specified geth uses the block gas limit from the pending block as an upper bound. As a result the returned estimate might not be enough to executed the call/transaction when the amount of gas is higher than the pending block gas limit. @@ -1053,6 +1100,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see Returns information about a block by hash. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBlockByHash) + **Parameters** 1. `DATA`, 32 Bytes - Hash of a block. @@ -1105,7 +1154,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 "gasLimit": "0x1388", "gasUsed": "0x0", "hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171", "mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843", "nonce": "0x689056015818adbe", @@ -1130,6 +1179,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 Returns information about a block by block number. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBlockByNumber) + **Parameters** 1. `QUANTITY|TAG` - integer of a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [default block parameter](/developers/docs/apis/json-rpc/#default-block). @@ -1158,6 +1209,8 @@ Result see [eth_getBlockByHash](#eth_getblockbyhash) Returns the information about a transaction requested by transaction hash. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionByHash) + **Parameters** 1. `DATA`, 32 Bytes - hash of a transaction @@ -1217,6 +1270,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","param Returns information about a transaction by block hash and transaction index position. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionByBlockHashAndIndex) **Parameters** 1. `DATA`, 32 Bytes - hash of a block. @@ -1245,6 +1299,8 @@ Result see [eth_getTransactionByHash](#eth_gettransactionbyhash) Returns information about a transaction by block number and transaction index position. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionByBlockNumberAndIndex) + **Parameters** 1. `QUANTITY|TAG` - a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [default block parameter](/developers/docs/apis/json-rpc/#default-block). @@ -1341,6 +1397,8 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para Returns information about a uncle of a block by hash and uncle index position. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getUncleByBlockHashAndIndex) + **Parameters** 1. `DATA`, 32 Bytes - The hash of a block. @@ -1371,6 +1429,8 @@ Result see [eth_getBlockByHash](#eth_getblockbyhash) Returns information about a uncle of a block by number and uncle index position. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getUncleByBlockNumberAndIndex) + **Parameters** 1. `QUANTITY|TAG` - a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, as in the [default block parameter](/developers/docs/apis/json-rpc/#default-block). @@ -1589,6 +1649,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":[ Returns an array of all logs matching filter with given id. + **Parameters** 1. `QUANTITY` - The filter id. diff --git a/public/content/developers/docs/apis/json-rpc/playground.svg b/public/content/developers/docs/apis/json-rpc/playground.svg new file mode 100644 index 00000000000..31a6ecb7533 --- /dev/null +++ b/public/content/developers/docs/apis/json-rpc/playground.svg @@ -0,0 +1 @@ +
Playground: Try EndpointPlaygroundTry Endpoint \ No newline at end of file From 428245520a9b1b7a63da09c3df34d002bcd0588b Mon Sep 17 00:00:00 2001 From: 0xShikhar Date: Mon, 23 Dec 2024 17:31:48 +0530 Subject: [PATCH 034/171] refactor: playground links --- .../developers/docs/apis/json-rpc/index.md | 15 +++------------ ...ontent-developers-docs-apis-json-rpc-data.json | 6 ++++++ 2 files changed, 9 insertions(+), 12 deletions(-) create mode 100644 src/data/placeholders/content-developers-docs-apis-json-rpc-data.json diff --git a/public/content/developers/docs/apis/json-rpc/index.md b/public/content/developers/docs/apis/json-rpc/index.md index b517eee83a1..30e053b3755 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -143,8 +143,6 @@ You can use the [playground tool](https://ethereum-json-rpc.com) to discover and Returns the current client version. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=web3_clientVersion) - **Parameters** None @@ -170,8 +168,6 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[], Returns Keccak-256 (_not_ the standardized SHA3-256) of the given data. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=web3_sha3) - **Parameters** 1. `DATA` - The data to convert into a SHA3 hash @@ -201,8 +197,6 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c Returns the current network id. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=net_version) - **Parameters** None @@ -234,8 +228,6 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67 Returns `true` if client is actively listening for network connections. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=net_listening) - **Parameters** None @@ -261,8 +253,6 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id": Returns number of peers currently connected to the client. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=net_peerCount) - **Parameters** None @@ -288,8 +278,6 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id": Returns the current Ethereum protocol version. Note that this method is [not available in Geth](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924). -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_protocolVersion) - **Parameters** None @@ -696,6 +684,8 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Returns the number of transactions _sent_ from an address. +[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionCount) + **Parameters** 1. `DATA`, 20 Bytes - address. @@ -1271,6 +1261,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","param Returns information about a transaction by block hash and transaction index position. [![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionByBlockHashAndIndex) + **Parameters** 1. `DATA`, 32 Bytes - hash of a block. diff --git a/src/data/placeholders/content-developers-docs-apis-json-rpc-data.json b/src/data/placeholders/content-developers-docs-apis-json-rpc-data.json new file mode 100644 index 00000000000..123f0147d5a --- /dev/null +++ b/src/data/placeholders/content-developers-docs-apis-json-rpc-data.json @@ -0,0 +1,6 @@ +{ + "/content/developers/docs/apis/json-rpc/playground.svg": { + "hash": "f41ec73f", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAACCAYAAABR7VzxAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAd0lEQVR4nGOQkZGZ6ePj89/IyOi/mZnZfysrq//6+vr/7ezs/vdvUTx+53/c/6v/Y//f+R8Pxzf/x/+/9T/u/7n/UTMZWFhYZmppaf338vICa4YZBKILpzMe3/ve6//+Tz7/d710+3/0q///098CwDRIbNsHr5kAkwlKKC5qBGUAAAAASUVORK5CYII=" + } +} \ No newline at end of file From bc18b1eec5d6cd3ee0caa56910ce9a1637bb1fc3 Mon Sep 17 00:00:00 2001 From: Claudio Carnino Date: Tue, 26 Nov 2024 18:08:54 +0000 Subject: [PATCH 035/171] Updated the Matcha.xyz logo [Fixes #14402] --- public/images/dapps/matcha.png | Bin 3756 -> 5646 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/dapps/matcha.png b/public/images/dapps/matcha.png index a765d5dd63041e25ad734bd42615a328917d577a..f0ac62a6a51513ea62c33ef519adb0b5a8580c97 100644 GIT binary patch literal 5646 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 delta 3747 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 N002ovPDHLkV1lb00kQx9 From e20b832e8b94e9fe6ede3382f09d44ca20ae496f Mon Sep 17 00:00:00 2001 From: Roman Date: Sat, 1 Feb 2025 17:18:20 +0200 Subject: [PATCH 036/171] fix: update link on stablecoin page (#14777) --- public/images/dapps/gitcoin.png | Bin 1548 -> 2349 bytes .../useStablecoinAccordion.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/public/images/dapps/gitcoin.png b/public/images/dapps/gitcoin.png index 0450d7d0f72bf5acecd3692b16105db013abf9d6..6d17effcf09376ffe906f563c6dff8269585512b 100644 GIT binary patch delta 2332 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 { { title: t("page-stablecoins-accordion-earn-project-bounties"), image: gitcoinImg, - link: "https://gitcoin.co/explorer", + link: "https://app.buidlbox.io/", description: t("page-stablecoins-accordion-earn-project-1-description"), alt: t("gitcoin-logo"), }, From ce1e8ff61df1f89b6d224062ccb1f9645ccf3e61 Mon Sep 17 00:00:00 2001 From: Roman Date: Thu, 6 Feb 2025 11:34:00 +0200 Subject: [PATCH 037/171] upd logo --- public/images/dapps/buidlbox.png | Bin 0 -> 27884 bytes .../useStablecoinAccordion.ts | 6 +++--- src/intl/en/page-stablecoins.json | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 public/images/dapps/buidlbox.png diff --git a/public/images/dapps/buidlbox.png b/public/images/dapps/buidlbox.png new file mode 100644 index 0000000000000000000000000000000000000000..f84fdd5fc0271bb95912ea0650b340b4087692b3 GIT binary patch literal 27884 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

B9Q)q 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 literal 0 HcmV?d00001 diff --git a/src/components/StablecoinAccordion/useStablecoinAccordion.ts b/src/components/StablecoinAccordion/useStablecoinAccordion.ts index b5081d556bf..0a79d330157 100644 --- a/src/components/StablecoinAccordion/useStablecoinAccordion.ts +++ b/src/components/StablecoinAccordion/useStablecoinAccordion.ts @@ -6,7 +6,7 @@ import aaveImg from "@/public/images/dapps/aave.png" // -- borrow import compoundImg from "@/public/images/dapps/compound.png" // -- earn -import gitcoinImg from "@/public/images/dapps/gitcoin.png" +import buidlboxImg from "@/public/images/dapps/buidlbox.png" import loopringImg from "@/public/images/dapps/loopring.png" import matchaImg from "@/public/images/dapps/matcha.png" import summerfiImg from "@/public/images/dapps/summerfi.png" @@ -76,10 +76,10 @@ export const useStablecoinAccordion = () => { const earn: Array = [ { title: t("page-stablecoins-accordion-earn-project-bounties"), - image: gitcoinImg, + image: buidlboxImg, link: "https://app.buidlbox.io/", description: t("page-stablecoins-accordion-earn-project-1-description"), - alt: t("gitcoin-logo"), + alt: t("buidlbox-logo"), }, { title: t("page-stablecoins-accordion-earn-project-bug-bounties"), diff --git a/src/intl/en/page-stablecoins.json b/src/intl/en/page-stablecoins.json index e212fae1d48..8312e5c2191 100644 --- a/src/intl/en/page-stablecoins.json +++ b/src/intl/en/page-stablecoins.json @@ -154,6 +154,7 @@ "aave-logo": "Aave logo", "binance-logo": "Binance logo", "bittrex-logo": "Bittrex logo", + "buidlbox-logo": "Buidlbox logo", "coinbase-logo": "Coinbase logo", "coinmama-logo": "Coinmama logo", "compound-logo": "Compound logo", From f4e6c306c601ab7ee55fba20820457004fcf039c Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 7 Feb 2025 12:17:34 +0200 Subject: [PATCH 038/171] sort imports --- .../StablecoinAccordion/useStablecoinAccordion.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/StablecoinAccordion/useStablecoinAccordion.ts b/src/components/StablecoinAccordion/useStablecoinAccordion.ts index 0a79d330157..4da62832688 100644 --- a/src/components/StablecoinAccordion/useStablecoinAccordion.ts +++ b/src/components/StablecoinAccordion/useStablecoinAccordion.ts @@ -2,16 +2,16 @@ import { useTranslation } from "next-i18next" import { type CardProps } from "@/components/CardList" +// Static assets +// -- dapps import aaveImg from "@/public/images/dapps/aave.png" -// -- borrow -import compoundImg from "@/public/images/dapps/compound.png" // -- earn import buidlboxImg from "@/public/images/dapps/buidlbox.png" +// -- borrow +import compoundImg from "@/public/images/dapps/compound.png" import loopringImg from "@/public/images/dapps/loopring.png" import matchaImg from "@/public/images/dapps/matcha.png" import summerfiImg from "@/public/images/dapps/summerfi.png" -// Static assets -// -- dapps import uniImg from "@/public/images/dapps/uni.png" import oneInchImg from "@/public/images/exchanges/1inch.png" import binanceImg from "@/public/images/exchanges/binance.png" From b9318b087b22ee431e0372873858ee377d6e5774 Mon Sep 17 00:00:00 2001 From: Reppelin Tom Date: Fri, 7 Mar 2025 14:26:40 +0100 Subject: [PATCH 039/171] feat(Morpho): adding morpho app --- public/images/dapps/morpho.png | Bin 0 -> 9227 bytes src/intl/en/page-dapps.json | 2 ++ src/pages/[locale]/dapps.tsx | 8 ++++++++ 3 files changed, 10 insertions(+) create mode 100644 public/images/dapps/morpho.png diff --git a/public/images/dapps/morpho.png b/public/images/dapps/morpho.png new file mode 100644 index 0000000000000000000000000000000000000000..529bfd6f0da6ec7340e74039eb586e2e3b9455ff GIT binary patch literal 9227 zcmYLv2UJr{*L8pZp@t#^DUpuSrHDvxA{`Z^SEVUMdH@jup*IC7N{!M4DFOK!rn+`P(sYm(~PV2f-e4)pF!nnMjwqm)-Fi08C@ zOl@M}ddTob9qB`%8ty$mtVR3gC9S=Z&xoj5@B?14%oWjWgl9vK-t#>DUr*HYJ1K{c zLDuzeFkMfM1AljZT@(g^c%Ga)sO;O{8;<*=N*PIeee~%Ac180&W!|u%coPBwiSgvC zk_I{_WrI&=%p(=zQ;?L&{gBVmn4g+?_nI<~+P1H&tpn?z_(^dsm04kJ7!~jvLykPy z4{H*;ef0|YG)luMB=?({sw$E7%-x|%|B9EH3n*5@exiNwH>Q?wr|Mv-eR#cn*iQC^ zsv)(U#f*c3s*}Vi-F(%EPYw*^n&p`}lu;;RlHc6+>kiL1iRj7ONJ?|{pad_-6?l23~0&8=yCCF=h(`g3NWHDFZ8e0 zfIu%_tsA<%%EyyY8p zNAc#PVpJfo$pFhvP5ql$j9u}B`12l@DV$X3IXCWfIgs{D4Zq68p}4;udX#-0AOZ5s z11$KKL)PJlcfE@L06f0{Kzsn#Vl~Uc^xa2PpkoDom50_&oB{=kyY<~_C}3prjh+>{ z;O+MAA^9#4Xk_=^ysK=N4TAn3p(jGgUq0WJ+Tt?Mwa@4_Uv_aTUunP2L_{a7f`t<`G+y!96)HA8Vyho zrLcOy$gZggf$=Y;tr6#eAX`@-K;Z+fMJmAQ9h?IMdeZ#UE_j6-(4f#-u1W_G#Cb*l zu*v_#q6QBEm=(hC9}JStXPU&gg#fgXc~|HrUv=}v152doKJOZ4g^&Q|9V^G9QUFET zfB>Es{cRtQZSh5{fPKHOO(&w7T-p1VIu;}EZz(H@odp=nIMVs7;u!-p0mh45D|BDb z-G!V0d=S^BvtLa%?grp?m;EiF)D8Loq=0*cZr{zQnfITa92kFibJ_Y|j#lLT$C)Lu zzy4|LY13)0Cja{Qm)ezog>K|kcP+yTQ>u2fKCq$%g)8e$!`A}(MBl5sbQA!VtC*NGAjoYRzQ%&dVMKa2%1JufH^MbNg z2sa>W)jTV7+vsj4AZOajJSxdBE@uKjJqS!-9)g7c9K%_G@qgczpNI9sVlQ3xcctfY zz6T&u0oB}+SOhTJ^p9;wGb=f2j|A zfPLQzagla~sbFBNzEbY8e{9XoWwfvTZyEe}oN!{srITl!*Q~M_p%r{rT8JFEpu5DC z`2KTKDL6eb+wZ-iJz}Q3w=E^8q1Ka}_VpY1Tu?SkwoAB4fdeT?UEETN8X9UlT_Kfs z)o)ToLw1wIXj0$}K_=M~@z#%}XH}7^B1fSn)JiCvo}bcQNZCy1(3(J(P$Vz(D3nZv zOcHmjdfrE;q1+dZ_b~mlF@BXAYWDes9e4t-qU;S~U&h>@{@8QqY&B(~x#9mYqMEx&;U!oZ$rzO5wU(zBH3$!5IuD;hMCiw7#k&@Dj zaSmWOR)?5ibk+$`L&f6aZ6KYE#1E62Zb{l~2r?@gmgqKf*)r1-a5&IwDhtiuINJ?o zghYWb1L8pn9TzGU7eAed9(ah+a-3P<=w_u7CKEJRI%##sm<}utvO$2)mKt1Ta5bt~ zXLh!LIakCL439(0z30EWkbWGN#zIAXogk#N;V5I(aGY8SxP}BFeLk&@7hR&&MT?eW zTw2Mr$Rxr2g|x;l9wy10toV5jK@Konw?d$>wP2z)F|0QzmC;>~AY^;!jy0sc#qc{> zY?FD7k*ahUY~-f>x*eUPCvn3Y7C&40)mOWyAgeWZ35Ug z0#<$+U}K{xKVzfSY;_1icTD_W`|HVno!t+~jZm}IB?x(@OQt`SI|$kUn+lQH-aV@r zx%>7RLmCiF;x{R@xO<874m+YTwtj@)_U*lB!4u$#$M|25 z*tB%%yV>tE$~=aIkJ*Y$*C`DoGHF{&CD?~*ZAUp0jADExI(u9m zRDj`|7>Ts{ysV2G3N(@Bb zqzP~Ub-b(ve9$_a()ZPe8k$@;_zDvrIw0qBU&5rjN!&NB5@?{&U-Xt(Sm`QZDWMqn zGr2lQTf@HyyxGV+N|7czCQP&A-VGKJC)PLRY}P1>s%u=l zFhM62c4BRayJ}FQ7W#wQmh!`n^V$`+d1t{9sVajzs74xD*g>TTGXFzu#a+&?2?{T9 zLE@&tUl#IeNsIzdXRndc{CghjUA@cszF2kj0Dn5WzsLUy(rB8mU|}{9h3BPkGR1Q| ztuQNCEitv}4d^;MjWuppdGug%^IaAT_85kKz?ml#(e^G4ILq2boWO8m8TzCBoR2#*9?JFHhvc2kzYb@C4>JwQL_L1iye&8`9;f79gq)961W*GWgWDn|Me{5a>I zJy+B3vx9U}GL6^M>LPk%&q6DKW2@D)MFW#-5^U&&v{!f8h#jw0rlNI%O8G)zmK6B-uFa1}v$c|nGCuIi zA!$<#t9@|Mn1!@yArJLeFpszn#XJFhp4`lVVUrsu!{BGY#Z1eA_XqIt`&Oo zOl-vHaZ^cs3*A;agBHqvz&c`V^c$~6EpVu%Dba(>XVN)d<58TcKWev%AY=?SDB5Lz zR9h9J>Yn_Bpk9GMY^S5KFG~yIzb}Ov?TQ|VMITO#=4<5RC6)&k!PtD(J5rciiv8?t zY;|*cp{MVoa^8QLO8pdgp9Om}qV?OI)2Du)I)Z|&Z4Xfc^LO`Pcu+q(p*{YjO*~IB zttQl{x%$!i?Ioj)oZ})8JkWyZ_3N>2a}50w(G_v+s!RKJ#o$XUGxny4N$ItfR#ENU z`wIg@OQ1zqS%ed1JJo@A{(hu*D0ha854SRAFT#7NVdDA4nJ+j^crCy8EgSXutil8e zQsutVG57SOV$}i@bU6v5+?chtD%O&m*J>uQyYtwn8N%}6cKyx+4F>INnl~#1TFVd8 zr+!pzyq5L4wTd>j`?RjC-XUCEpzCjS4jDf4aHhCf<0coSSG6>2*2;KkxZR^5i}qq^ z$`d}Wscg@iG5!*fC0+xawr`p@Q&PSAtRo0Amb2(bPAL!Do02cm1YA5Dn9r`F925Wa z&L8g6vLlleLi)TvWu#ssU(ZOq@QSs-=9Y^H1B+CFHL&>Kb?g09e_S_cPg2P^PVeTT zzycFKI-8>N`nh=T$cwSO=i?ZcM-&g!FJ2TNhn9X#SQ)X@7JzkQa4XjZi^~5z2-7tn zWav~$n16@!WR38>>DN5F9 zKH+Uog)9QS_rQzk*Ynh2yF;oCH}{`6U;OetSv{&r)+A55_9M4WN@D&Dp6G6v8@|#$ zkORMToj5xldZAF-?oJx67Gzy2U|szB^Z6IzmLp%%#YPy@uV5_q`|7k1dbcA9#bF<0 zX%G{?7{54*K(MK+&|m(Vi;Y4di0c(K6R2ku!!!536ouJ;4IHA&G$eev*V41Q8HpKm zbm6aw+|9OJ?t3Z4Kex#O99>BQi+M*a%IbsZtD_I!>34~7xpE02oZM#dYGCL1or(-= zCsN23$R@Nt3x;U~4q;%kizOmt^(S)S{=_8NaK?q=kJS&M4cUY2tHD{wk`k2e_(2wK zclcrZ?GCktwFljrrPfMye;YP5uef;4D)4|ys;*XHOs zkY|b;1yRchgIyG_QWU(w#X?|b6r?NioiQs`{l94zKSo+(L}Jc}a`>%|IoVK? zqmz@4om!h|TJf99eZH%U*?T#KcncWxY>Ko9+c`~&!H0L*y`zi-Ja&oY@g84aIow{c z$ULy4INr$K*!ljzM)Y^UV1t}L!>}OPy<8`MPtP% zVzchkXGj)0hjDy;6ms}f#>u>o)+J^O=@{uZ^n1&X<58dp*}XC7EdAT7;G>WzjLPL{ z)0rxNmn}e}-OnQ34?n~ql=4lpqb9#EJ!6_rpl7G~=i^9h3ri-HJ5GJmVO&cradPHL zbtwOGAp>LHSh#HP{kv(TB-bWX{fD{rm7U`77>TVIa@9c(>C$@S;!KldGAj}$xlk3g z{qCq9>uq9S=-@-{+-+U@OfP#J5(D;rkyse!^lN43Z{;%u{>?27!N1?Tvpu~ly>DC^ zdiZ?TVd?N`QQ(E@yr>6ndpLKi@p*DgL-AYq&U{fj+q=&dA2~wLrTUhVmX#?MUx~~U z>j@1*F~`Ih@B8OJMkBt=4du%fOFZ>u}Rc{WQ;V$pc@>UH8Xc=Kj-E z>aDxW+=;#={_jac#(p;*EPKSsse?<#Le8|4?rB6XPu|};TGEm_JKhgS@c>F1_)^1mVQkv>BP zm}J|aLe&zF2^mS6?EL#{f3r79y9U#fD8funzt8)WHSTqY>^@ugwmSW|{0=A4x1b{8 zHm}pc9vxy6!y(v8Z$0C)r=&^W8}}9v_P_TR56#r&+&Qgmm-j`34u2A5C_g_f^*?L( zm2V?mplUx zelw|1h87_Y=WEi(qf3wFmQF~`I~g$tnZ5nih;O$tY923KPna!GXpsKvA1I=?TTQMB zYqWs*>kVQuYuOU*{kEi~)j7z(`q^*e=JkL*Z&G&VNOJ+xN(_KPm zr}3qRip^`>KT6i$H3NvVOR|H8Emr z;eD_SjgfUZstUM4thwspaWN4HI{O3c=z!K5HTL+8PcpW4S5>&DzST0eTbGYT-y?MG^e1y)FwX#RPqkcmU z`Ctx>7T@&LziUzf!P?c$cPLyH66^Z7jaetW&6GuPM=DFJ(s3c;PcTa!UbXJ#cI4kn zxh|c&eGH~ug5=7IjZMtrV*Y!!kc#s~eFsOr=2GYCQZ4jmS%@vUZo$UoRh3Gj-)K7VG&CwV! zor+!_+;axg94<3mpR}b!SxsLXwLDzJ?J_dyE^p3hrVho18QW3 zT-){T)@!w?S`o{ukKgG{Wa>OpdS{x2cIg?ok^f2awLCj;bTw&MJl8#HQeqwH^g17wA%!X)!|#9WT6BtJ z5f>yUDsAHLSrcSf)GuIEHs(I?9h^PD2Ci zjRJ_dGTj+kLzhQO!CZ!VUIG3#q01YhDWCjapAVm<{asXE)xcEZu0kgEGtZGXM=(-Z zEoi!I@ju&(t8I;q>r_+e(&~Mlgu3G`RiVweDs+|HV5l+goJDQa1q+I?D&!g?U(mt3 zeDL|GU_>N;R*5CfGD7KB(L`XTAX%1QrkdLj*B;D%{2j| zUO(?gNK+%ELh~4oEf}wEueV(xigTDvR?4vlKNl9widWJn1nK5nxUB zQ4Ow6_b~IbnpidE$xCgQlv~72MsQwJ94VwsJ(+6$yQ zZ^38#Q#I_(`jE}Q=dB-wJ`kr`HD2o{>mB2YqKmj!cC_uPe|9it(88=&Loe3T4T~qL zmC03ZRAGcMNY6V|eFG@#6n3WbsWZR8?o%%&;Haue!4DZJ`c@`lDg2Y*Y6V1u% zF0Ft&vm9BS6XqBNkKMr)InBBgydz?C{2yxir5dNjq(h?JP)AP0^qT-VoW0y)T|DEy(k2ywI|E2`k`3VQ# z*~5YnBe_E%rT_J;POOD^y2s@m>oOpe*sP*?QQM|Gk<<`2zC9#5U zW0Dv`?1CLzEANDNl$5*)%Fd}#KMAI}dp=?z{cX3yIoCMDyL1h=VPOX!hjn;cDb?08 z&EW;Z{l#c2g#6kzY`|+Su8Q6Omb;|^Kj^u+fPV6k!TM&J6p(dU#)okOSy~!9$~FRi z2@0tX<3!LJW6QJJrr$qo^IyFezLh3o@(9iRqO|wq^;}T(;L*;|0SS!aIw9H&K-3GA z?DzGp7FgtxG^%&@#(n>6Su!K(^?kxAL-7{|ZY{86+=+1;OiP1bh0j(_czfIhJy8YK&)Vt-C7EwTLiNnd6RhWi?ay_)Y(d--mf8+4u; z`bQL>I~rsmO_bic7vl^9Do@6@9EKhl6%|+GS|I8(*=^AsqkS@O%Y)G-x%2>^`1-du zVbwbzYG|VE8&cx`v+Dj?uKY-PK92Q*|L5BD*#@J5`j!qDF5TwlNg|0JQl7v& zxda+xaeDJDHxnkWmsG}FFghNnp-N&$Bo|((v0TuQQHvIH;>7V#L${5yWp**vegcpj*;zYP!N@yxC!xHyt_;Yet8br0DCAvnV@4+NEVy23E*tI3gg6y8B5`_- zbWYFt;=b=~rPZ79XcL6smk7iAshOl6x(lV$)$!)#}dCI9QiYws79E|_U1 z^CFXMeVYPQszwb2#=W$l6F@amQ-kMlG=b&gG0AcKW`ZA;us%V^cNV(EfD}L`b25iZ${yJf-{sLJ1661Fbp|1n)4P`7<~}3o zWO`&0x%~5&V-%Z}-}u2`8}&;-rBdO}##;MQy?H#VtuFMV2$?P0tRKp&OBA98>a035 z${FK&1c*8+wsDshofONCAPcyy@##X5K&@91c*ddN)cS;vHmKq)hz1y_HfBLOEZHI< z5G4H)TNqksj}1Z%)fC#)tvK_q+p7V=MaTrEZrPAXq_kH+_gygj#q|9;_OPep%_lm6%gKrA&jmuL*zX)&2r;h8zL)5L38hZjE8vjc4$`CbET_Tza3?DR{K_}}F zi}Urp@9D}w)SpQiy>EtH?q)Rz$)kTIiGttPCZN^h8y!ZSdt+ZhG^T)PRfyWK-UXFb zxgwa63wN0?7;a2(E{CW+TORGR)`eQzvAN2U`YuI1r8a(RZ7r+=lb=0zuQupt`JzL)4TY+0-c8ubcHJz-~wczJ13x#(Na63g|+?CA1dZnK>6-r*pTS`>O*amkaQxJA_en<4N7Qcg{9$X~CDC3`Bus{KZ?t3zl&Oq(JkM63Loi5b zq+x6ic3U`EtHgn+MI3@>#F2{m8rfdgeqCcjCoNPE_OR z@#7|uaf0lKE;UGphipCgMP9<9EE;x^dd%yvTzC`oAtWyfd2zk?suDvd~_f4&flKk)}J8Ewa0$19+ZX5dD0` zjUFt^)TyC6b{FhC2~iV-|6A=b7qD|q2})pqi|Xz8+U{?rH3NJ;t+NpMMfQ!PMjGM& zE$>=Btq#q64&lA#d62%D-d3N@0yH}xoB{l5TFlg;h7xe?CmeKL0zRBJ4Saw%{=W^b zoQbO)tBe|NU;-6FI{VoX`!mBAHbK%Nd%Ok&>#Rl^G8jG0L)~DH5{P{T>AcQ{_#(6k zO0Q~w0ymekD`00X{0~VtdV+p&njb9kL7Y7s!sEfauRo^8T4_P4M8|pIyUYsUiWIu#*4s~b39$vV3NSNBthNyvdf2p@F zI1**{M1ulpox^su=W;Oos0D>^7pjW`|86?3$1+16&*pqGXe)m{pLdNd3{;byu;?F+ z&KDK9EZBv6V6=bs@KDh7&nRaYNOIDS^o2Xp=tGGv+AXD*i0|yk9?Z59V(QrZ{1*Di8;@p;i+tgs81JjU8?-NQkVG<`*Q6gLDH46+;4 zpP}+Lwnpc-)Z0gzrG>LL1fw111SQ<)%Y5k361x;uo??N_U}(V9@y3!$`McK3JP{xe z6pOIPlEVr&-{ANSa%!FlfyEG5>aZ9|pAGwEf=M}0rfW842R&*Iq7;=gO;>r3e+#R1 zR%yCBoZiHV(37I%mCH$yEKbvO{)(l=m)?k)#d}CLv;o^uhh7kZN&Vtt8`|I_mmXnu nYNU;E`W{DOwaKi|l}T)$q|HSYfaqfwIY literal 0 HcmV?d00001 diff --git a/src/intl/en/page-dapps.json b/src/intl/en/page-dapps.json index 9ecb4862060..571bc39de53 100644 --- a/src/intl/en/page-dapps.json +++ b/src/intl/en/page-dapps.json @@ -96,6 +96,7 @@ "page-dapps-dapp-description-matcha": "Searches multiple exchanges to help find you the best prices.", "page-dapps-dapp-description-meeds": "Web3 community hubs for the age of decentralized work. Reward fairly and transparently contributions that matter.", "page-dapps-dapp-description-mirror": "Built on web3 for web3, Mirror’s robust publishing platform pushes the boundaries of writing online", + "page-dapps-dapp-description-morpho": "Morpho is an open platform that allows anyone to earn yield, borrow assets, curate markets and vaults, and build applications", "page-dapps-dapp-description-multichain": "The ultimate Router for web3. It is an infrastructure developed for arbitrary cross-chain interactions.", "page-dapps-dapp-description-nifty-gateway": "Buy works onchain from top artists, athletes, brands, and creators.", "page-dapps-dapp-description-summerfi": "Trade, borrow, and save with Dai, an Ethereum stablecoin.", @@ -230,6 +231,7 @@ "page-dapps-metaverse-description": "These are applications that enable users to participate freely in virtual worlds. Users can form personal networks and take ownership of digital assets", "page-dapps-mirror-logo-alt": "Mirror logo", "page-dapps-mobile-options-header": "Browse another category", + "page-dapps-morpho-logo-alt": "Morpho logo", "page-dapps-multichain-logo-alt": "Multichain logo", "page-dapps-nifty-gateway-logo-alt": "Nifty Gateway logo", "page-dapps-summerfi-logo-alt": "Summer.fi logo", diff --git a/src/pages/[locale]/dapps.tsx b/src/pages/[locale]/dapps.tsx index 64ab7270a6c..9e0b8b2eab4 100644 --- a/src/pages/[locale]/dapps.tsx +++ b/src/pages/[locale]/dapps.tsx @@ -84,6 +84,7 @@ import marble from "@/public/images/dapps/marble.png" import matcha from "@/public/images/dapps/matcha.png" import meeds from "@/public/images/dapps/meeds.png" import mirror from "@/public/images/dapps/mirror.png" +import morpho from "@/public/images/dapps/morpho.png" import nexus from "@/public/images/dapps/nexus.png" import nifty from "@/public/images/dapps/nifty.png" import opensea from "@/public/images/dapps/opensea.png" @@ -579,6 +580,13 @@ const DappsPage = () => { image: aave, alt: t("page-dapps-aave-logo-alt"), }, + { + title: "Morpho", + description: t("page-dapps-dapp-description-morpho"), + link: "https://morpho.org/", + image: morpho, + alt: t("page-dapps-morpho-logo-alt"), + }, { title: "Compound", description: t("page-dapps-dapp-description-compound"), From e1dd87e87959f154c4d1930b84bcad8a0df0ef47 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 25 Mar 2025 08:25:57 -0700 Subject: [PATCH 040/171] fix: question keys --- src/data/quizzes/index.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/data/quizzes/index.ts b/src/data/quizzes/index.ts index 2fce70f9663..eb186e07681 100644 --- a/src/data/quizzes/index.ts +++ b/src/data/quizzes/index.ts @@ -100,7 +100,13 @@ const quizzes = { }, "smart-contracts": { title: "smart-contracts", - questions: ["n001", "n002", "n003", "n004", "n005"], + questions: [ + "smart-contracts-1", + "smart-contracts-2", + "smart-contracts-3", + "smart-contracts-4", + "smart-contracts-5", + ], }, } satisfies RawQuizzes From 1fcf3268a33e2ac81a2a372eca2140916f475913 Mon Sep 17 00:00:00 2001 From: Crypto Delirium <6353394+CryptoDelirium@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:50:50 +0200 Subject: [PATCH 041/171] Update src/intl/en/learn-quizzes.json Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/intl/en/learn-quizzes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index d967c5617e7..966e8c39770 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -617,7 +617,7 @@ "smart-contracts-1-prompt": "How are smart contracts characterized?", "smart-contracts-1-a-label": "Smart contracts are just like real (paper) contracts, but stored digitally on the blockchain to save the content securely.", "smart-contracts-1-a-explanation": "Smart contracts use a similar logic to traditional contracts, but otherwise have little in common.", - "smart-contracts-1-b-label": "They are linked to an AI system, which allows them to make decisions that trigger blockchain transactions.", + "smart-contracts-1-b-label": "Linked to autonomous AI systems that execute transactions", "smart-contracts-1-b-explanation": "Smart contracts can actually execute transactions automatically, but only according to an ‘if this then that’ logic that is prescribed in the code. They do not use AI.", "smart-contracts-1-c-label": "They are programs stored on the blockchain that follow an 'if this then that' logic, and are guaranteed to execute according to the rules defined by the code.", "smart-contracts-1-c-explanation": "A smart contract is a piece of code that can be executed automatically according to an 'if this then that' logic.", From aa56be6603d9722c13bc0bf9c852f31065ae580f Mon Sep 17 00:00:00 2001 From: Crypto Delirium <6353394+CryptoDelirium@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:51:37 +0200 Subject: [PATCH 042/171] Update src/intl/en/learn-quizzes.json Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/intl/en/learn-quizzes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index 966e8c39770..244e6a2070d 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -618,7 +618,7 @@ "smart-contracts-1-a-label": "Smart contracts are just like real (paper) contracts, but stored digitally on the blockchain to save the content securely.", "smart-contracts-1-a-explanation": "Smart contracts use a similar logic to traditional contracts, but otherwise have little in common.", "smart-contracts-1-b-label": "Linked to autonomous AI systems that execute transactions", - "smart-contracts-1-b-explanation": "Smart contracts can actually execute transactions automatically, but only according to an ‘if this then that’ logic that is prescribed in the code. They do not use AI.", + "smart-contracts-1-b-explanation": "Smart contracts execute transactions predictably according to 'if-this-then-that' logic prescribed in the code—they do not use AI", "smart-contracts-1-c-label": "They are programs stored on the blockchain that follow an 'if this then that' logic, and are guaranteed to execute according to the rules defined by the code.", "smart-contracts-1-c-explanation": "A smart contract is a piece of code that can be executed automatically according to an 'if this then that' logic.", "smart-contracts-1-d-label": "They are the rules behind the Ethereum Blockchain, developed together with lawyers to ensure legal compliance.", From 622a3915c218aa6f0c9d9f25ec04ea5499fc86f1 Mon Sep 17 00:00:00 2001 From: Crypto Delirium <6353394+CryptoDelirium@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:53:45 +0200 Subject: [PATCH 043/171] Update src/intl/en/learn-quizzes.json Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/intl/en/learn-quizzes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index 244e6a2070d..e0b6f5c21ad 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -633,7 +633,7 @@ "smart-contracts-2-d-label": "A website", "smart-contracts-2-d-explanation": "A website is the frontend which captures user directions. A smart contract is the backend logic where these directions are executed, and the result may be returned.", "smart-contracts-3-prompt": "What is not one of the main characteristics of a smart contract?", - "smart-contracts-3-a-label": "Automatic execution", + "smart-contracts-3-a-label": "Deterministic execution", "smart-contracts-3-a-explanation": "The main benefit of a smart contract is that it deterministically executes unambiguous code when certain conditions are met.", "smart-contracts-3-b-label": "Public record", "smart-contracts-3-b-explanation": "With smart contracts on a public blockchain, anyone can instantly track asset transfers and other related information.", From ea37e41902e4fa00d794d97d48449d3d0bb1b5ab Mon Sep 17 00:00:00 2001 From: Crypto Delirium <6353394+CryptoDelirium@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:56:54 +0200 Subject: [PATCH 044/171] Update src/intl/en/learn-quizzes.json Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/intl/en/learn-quizzes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index e0b6f5c21ad..f5b17c9ff52 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -649,7 +649,7 @@ "smart-contracts-4-c-label": "Non Fungible Assets", "smart-contracts-4-c-explanation": "Smart contracts are used to define a wide range of NFTs, ranging from digital art to asset ownership certificates.", "smart-contracts-4-d-label": "DAOs", - "smart-contracts-4-d-explanation": "The governing and voting rules of Decentralized Autonomous Organisations are defined within smart contracts for transparency.", + "smart-contracts-4-d-explanation": "The governing and voting rules of DAOs are defined within smart contracts for transparency.", "smart-contracts-5-prompt": "Who coined the term 'smart contract'?", "smart-contracts-5-a-label": "Nick Szabo", "smart-contracts-5-a-explanation": "The computer scientist and cryptographer Nick Szabo coined the term 'smart contract' in an essay from 1994. In 1996, he wrote an exploration of what they could do. Smart contracts on Ethereum later put this vision into practice.", From db67a96f6b1008a5366fb1cc0100e18340455211 Mon Sep 17 00:00:00 2001 From: Crypto Delirium <6353394+CryptoDelirium@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:57:16 +0200 Subject: [PATCH 045/171] Update src/intl/en/learn-quizzes.json Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/intl/en/learn-quizzes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index f5b17c9ff52..f31f8ebbb2f 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -648,7 +648,7 @@ "smart-contracts-4-b-explanation": "While protocol changes are enacted through a smart contract, their creation and definition are proposed through transparent online forums such as Github or Forum.", "smart-contracts-4-c-label": "Non Fungible Assets", "smart-contracts-4-c-explanation": "Smart contracts are used to define a wide range of NFTs, ranging from digital art to asset ownership certificates.", - "smart-contracts-4-d-label": "DAOs", + "smart-contracts-4-d-label": "Decentralized autonomous organizations (DAOs)", "smart-contracts-4-d-explanation": "The governing and voting rules of DAOs are defined within smart contracts for transparency.", "smart-contracts-5-prompt": "Who coined the term 'smart contract'?", "smart-contracts-5-a-label": "Nick Szabo", From 1c796ee8d7f4eb91d212f97d4520b05352440061 Mon Sep 17 00:00:00 2001 From: Crypto Delirium <6353394+CryptoDelirium@users.noreply.github.com> Date: Mon, 31 Mar 2025 13:09:08 +0200 Subject: [PATCH 046/171] Apply suggestions from code review Apply review changes Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/intl/en/learn-quizzes.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index f31f8ebbb2f..3c59e061aae 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -625,28 +625,28 @@ "smart-contracts-1-d-explanation": "Smart contracts are pieces of code that can be created by developers and deployed on a blockchain.", "smart-contracts-2-prompt": "What is a metaphor that most closely characterizes the functioning of smart contracts?", "smart-contracts-2-a-label": "A bank", - "smart-contracts-2-a-explanation": "Banks require manual intervention and are structured as hierarchical entities, whereas a smart contract automatically executes without intervention.", + "smart-contracts-2-a-explanation": "Banks require manual execution and are structured as hierarchical entities, whereas smart contracts are executed predictable by computers with unchangeable rules.", "smart-contracts-2-b-label": "A digital vending machine", "smart-contracts-2-b-explanation": "The vending machine will only dispense your desired product after all requirements are met - specific inputs guarantee predetermined outputs. This is similar to the logic of smart contracts.", "smart-contracts-2-c-label": "A calculator", "smart-contracts-2-c-explanation": "smart contract code can be used for calculations, but is not limited to that. Rather, smart contracts are blockchain-based programs that follow an 'if this then that' logic.", "smart-contracts-2-d-label": "A website", "smart-contracts-2-d-explanation": "A website is the frontend which captures user directions. A smart contract is the backend logic where these directions are executed, and the result may be returned.", - "smart-contracts-3-prompt": "What is not one of the main characteristics of a smart contract?", + "smart-contracts-3-prompt": "Which is NOT a main characteristic of smart contracts?", "smart-contracts-3-a-label": "Deterministic execution", - "smart-contracts-3-a-explanation": "The main benefit of a smart contract is that it deterministically executes unambiguous code when certain conditions are met.", + "smart-contracts-3-a-explanation": "The main benefit of a smart contract is that it deterministically executes unambiguous code, without human interpretation or bias.", "smart-contracts-3-b-label": "Public record", "smart-contracts-3-b-explanation": "With smart contracts on a public blockchain, anyone can instantly track asset transfers and other related information.", "smart-contracts-3-c-label": "Privacy protection", "smart-contracts-3-c-explanation": "As blockchains are pseudonymous networks, transactions are tied publicly to a unique cryptographic address, not an identity.", "smart-contracts-3-d-label": "Ability to change", - "smart-contracts-3-d-explanation": "A smart contract cannot be changed once created, it is guaranteed to execute according to the rules defined by its code.", - "smart-contracts-4-prompt": "What is not one of the applications of smart contracts?", + "smart-contracts-3-d-explanation": "A smart contract cannot be changed once created—it is guaranteed to execute according to the rules defined by its code.", + "smart-contracts-4-prompt": "Which is NOT an application of smart contracts?", "smart-contracts-4-a-label": "Cryptocurrencies", - "smart-contracts-4-a-explanation": "Cryptocurrencies are token objects which are defined and tracked on smart contracts.", + "smart-contracts-4-a-explanation": "Cryptocurrencies are token objects which are defined and tracked using smart contracts.", "smart-contracts-4-b-label": "Protocol changes", - "smart-contracts-4-b-explanation": "While protocol changes are enacted through a smart contract, their creation and definition are proposed through transparent online forums such as Github or Forum.", - "smart-contracts-4-c-label": "Non Fungible Assets", + "smart-contracts-4-b-explanation": "While protocol changes can sometimes use smart contracts, their creation and definition are proposed through transparent online forums and implemented in client software.", + "smart-contracts-4-c-label": "Non-fungible tokens (NFTs)", "smart-contracts-4-c-explanation": "Smart contracts are used to define a wide range of NFTs, ranging from digital art to asset ownership certificates.", "smart-contracts-4-d-label": "Decentralized autonomous organizations (DAOs)", "smart-contracts-4-d-explanation": "The governing and voting rules of DAOs are defined within smart contracts for transparency.", From 8ffcaca5e019c6a1ee762324a93e97f2815000e0 Mon Sep 17 00:00:00 2001 From: Anish Gupta Date: Thu, 22 May 2025 00:46:14 +0530 Subject: [PATCH 047/171] fix: line leading --- .../Staking/StakingProductsCardGrid/StakingProductCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx b/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx index 0e46a885e2f..e78618c0d1f 100644 --- a/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx +++ b/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx @@ -191,7 +191,7 @@ export const StakingProductCard = ({ {data.map(({ label, status }, idx) => (
  • {label} From 3561a7b69f91598eaa38c1dffab357ba551eca0e Mon Sep 17 00:00:00 2001 From: Anish Gupta Date: Thu, 22 May 2025 05:24:00 +0530 Subject: [PATCH 048/171] removed default and sorted alphabetically --- src/components/LanguagePicker/MenuItem.tsx | 7 ------- src/components/LanguagePicker/useLanguagePicker.tsx | 3 ++- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index b7bfbba209b..1866fbe94c6 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -7,7 +7,6 @@ import type { LocaleDisplayInfo } from "@/lib/types" import { cn } from "@/lib/utils/cn" import { CommandItem } from "../ui/command" -import { Tag } from "../ui/tag" import ProgressBar from "./ProgressBar" @@ -24,7 +23,6 @@ const MenuItem = ({ displayInfo, ...props }: ItemProps) => { targetName, approvalProgress, wordsApproved, - isBrowserDefault, } = displayInfo const { t } = useTranslation("common") const locale = useLocale() @@ -64,11 +62,6 @@ const MenuItem = ({ displayInfo, ...props }: ItemProps) => { > {targetName}

    - {isBrowserDefault && ( - - {t("page-languages-browser-default")} - - )}
  • {sourceName}

    diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 7bb23526efc..32f211d5503 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -59,7 +59,8 @@ export const useLanguagePicker = (handleClose?: () => void) => { if (indexA >= 0 && indexB >= 0) return indexA - indexB if (indexA >= 0) return -1 if (indexB >= 0) return 1 - return b.approvalProgress - a.approvalProgress + + return a.sourceName.localeCompare(b.sourceName) }) || [] ) }, [locale, t]) From d9a33ee72c92aea7f8c2a83080e2b67dc7f50310 Mon Sep 17 00:00:00 2001 From: Anish Gupta Date: Thu, 22 May 2025 17:10:58 +0530 Subject: [PATCH 049/171] changed languagefooter --- src/components/LanguagePicker/index.tsx | 28 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 70cdadc2bda..0acb3243768 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -1,5 +1,7 @@ import { useParams } from "next/navigation" +import { ButtonLink } from "@/components/ui/buttons/Button" + import { cn } from "@/lib/utils/cn" import { @@ -10,7 +12,6 @@ import { CommandList, } from "../ui/command" import { Dialog, DialogContent, DialogTrigger } from "../ui/dialog" -import { BaseLink } from "../ui/Link" import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover" import MenuItem from "./MenuItem" @@ -188,16 +189,23 @@ const LanguagePickerFooter = ({ onTranslationProgramClick }) => { return (
    -

    - {t("page-languages-recruit-community")}{" "} - {/* TODO migrate once #13411 is merged */} - +

    +

    + Translate to _______ +

    +

    + {t("page-languages-recruit-community")} +

    +
    + - {t("common:learn-more")} - -

    + {t("get-involved")} +
    +
    ) } From 9865071638073fba6301ea8875dd2ac6fb1cdd39 Mon Sep 17 00:00:00 2001 From: YashIIT0909 <24je0721@iitism.ac.in> Date: Thu, 22 May 2025 17:29:00 +0530 Subject: [PATCH 050/171] Fixed line-height --- src/components/FeedbackWidget/FixedDot.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/FeedbackWidget/FixedDot.tsx b/src/components/FeedbackWidget/FixedDot.tsx index cc77b3fb55d..5260c069bae 100644 --- a/src/components/FeedbackWidget/FixedDot.tsx +++ b/src/components/FeedbackWidget/FixedDot.tsx @@ -44,7 +44,7 @@ const FixedDot = forwardRef( >
    +
    microHoffman
    microHoffman

    🐛
    Rashell Smith
    Rashell Smith

    🐛
    Alex Olson
    Alex Olson

    🐛
    SUCI - Blockchain Hub Team
    SUCI - Blockchain Hub Team

    🚧
    diff --git a/app/[locale]/roadmap/_components/ReleaseCarousel.tsx b/app/[locale]/roadmap/_components/ReleaseCarousel.tsx index c092d5eebe0..874543edfba 100644 --- a/app/[locale]/roadmap/_components/ReleaseCarousel.tsx +++ b/app/[locale]/roadmap/_components/ReleaseCarousel.tsx @@ -1,6 +1,9 @@ "use client" -import { useEffect, useState } from "react" +// TODO: Extract intl strings +// TODO: Fix RTL compatibility; currenly forced to LTR flow +import { useCallback, useEffect, useMemo, useState } from "react" +import { useLocale } from "next-intl" import { Image } from "@/components/Image" import { ButtonLink } from "@/components/ui/buttons/Button" @@ -16,45 +19,39 @@ import { import { cn } from "@/lib/utils/cn" import { formatDate } from "@/lib/utils/date" -import { releasesData } from "@/data/roadmap/releases" +import { Release, releasesData } from "@/data/roadmap/releases" -const findLatestReleaseIndex = () => { - const today = new Date() - const twoMonthsFromNow = new Date() - twoMonthsFromNow.setMonth(today.getMonth() + 2) +const ReleaseCarousel = () => { + const locale = useLocale() - // First try to find a release within the next 2 months - const upcomingReleaseIndex = releasesData.findIndex((release) => { - const releaseDate = new Date(release.releaseDate) - return releaseDate > today && releaseDate <= twoMonthsFromNow - }) + const [api1, setApi1] = useState() + const [api2, setApi2] = useState() - // If no upcoming release found, find the most recent release up to today - if (upcomingReleaseIndex === -1) { - const pastReleases = releasesData.filter( - (release) => new Date(release.releaseDate) <= today - ) - if (pastReleases.length > 0) { - const mostRecentRelease = pastReleases[pastReleases.length - 1] - return releasesData.findIndex( - (release) => release.releaseDate === mostRecentRelease.releaseDate - ) - } - } + const startIndex = useMemo(() => { + const now = new Date() - return upcomingReleaseIndex -} + // Production: has a releaseDate in the past + const productionReleases = releasesData.filter((release) => { + if (!("releaseDate" in release) || !release.releaseDate) return false + const releaseDate = new Date(release.releaseDate) + return releaseDate <= now + }) -const ReleaseCarousel = () => { - const todayDate = new Date() - const twoMonthsFromNow = new Date() - twoMonthsFromNow.setMonth(todayDate.getMonth() + 2) + // Upcoming: has a releaseDate, but is in the future + const upcomingReleases = releasesData.filter((release) => { + if (!("releaseDate" in release) || !release.releaseDate) return false + const releaseDate = new Date(release.releaseDate) + return releaseDate > now + }) - const [api1, setApi1] = useState() - const [api2, setApi2] = useState() - const [currentIndex, setCurrentIndex] = useState(() => - findLatestReleaseIndex() - ) + // If upcoming releases exist, start index after production releases + if (upcomingReleases.length > 0) return productionReleases.length + + // If no upcoming releases, start at the last production release + return productionReleases.length - 1 + }, []) + + const [currentIndex, setCurrentIndex] = useState(startIndex) useEffect(() => { if (!api1 || !api2) { @@ -72,8 +69,29 @@ const ReleaseCarousel = () => { }) }, [api1, api2]) + const getStatus = useCallback((release: Release) => { + if (!("releaseDate" in release) || !release.releaseDate) return "dev" + if (new Date(release.releaseDate) <= new Date()) return "prod" + return "soon" + }, []) + + const getDisplayDate = (release: Release): string => { + if (!("releaseDate" in release || "plannedReleaseYear" in release)) + return "" + + if ("plannedReleaseYear" in release && release.plannedReleaseYear) + return new Intl.DateTimeFormat(locale, { + year: "numeric", + }).format(new Date(Number(release.plannedReleaseYear), 0, 1)) + + if ("releaseDate" in release && release.releaseDate) + return formatDate(release.releaseDate) + + return "" + } + return ( -
    +
    @@ -84,22 +102,15 @@ const ReleaseCarousel = () => { opts={{ align: "center", containScroll: false, + direction: "ltr", loop: false, - startIndex: findLatestReleaseIndex(), + startIndex, }} > {releasesData.map((release, index) => { - const releaseDate = new Date(release.releaseDate) - const nextRelease = - releaseDate > todayDate && releaseDate <= twoMonthsFromNow - const labelType = - releaseDate < todayDate - ? 1 - : releaseDate < twoMonthsFromNow - ? 2 - : 3 - + const status = getStatus(release) + const displayDate = getDisplayDate(release) return ( { >
    - {labelType === 1 && ( + {status === "prod" && (
    {

    In production

    )} - {labelType === 2 && ( + {status === "soon" && (
    {

    )} - {labelType === 3 && ( + {status === "dev" && (
    {
    )}
    + {/* Line-circle-line decoration —•— */}
    {
    @@ -181,7 +193,7 @@ const ReleaseCarousel = () => { {release.releaseName}

    - {formatDate(release.releaseDate)} + {displayDate}

    @@ -202,8 +214,9 @@ const ReleaseCarousel = () => { opts={{ align: "center", containScroll: false, + direction: "ltr", loop: false, - startIndex: findLatestReleaseIndex(), + startIndex, }} > @@ -225,9 +238,7 @@ const ReleaseCarousel = () => {

    {release.releaseName}

    -

    - {formatDate(release.releaseDate)} -

    +

    {getDisplayDate(release)}

    diff --git a/public/content/community/grants/index.md b/public/content/community/grants/index.md index f0eacff034e..e1fa7bb9f4a 100644 --- a/public/content/community/grants/index.md +++ b/public/content/community/grants/index.md @@ -15,32 +15,61 @@ This list is curated by our community. If there's something missing or incorrect These programs support the broad Ethereum ecosystem by offering grants to a wide scope of projects. These include solutions for scalability, community building, security, privacy, and more. These grants are not specific to any one Ethereum platform and are a good place to start if you're unsure. - [EF Ecosystem Support Program](https://esp.ethereum.foundation) - _Funding open source projects that benefit Ethereum, with a particular focus on universal tools, infrastructure, research and public goods_ -- [Moloch DAO](https://www.molochdao.com/) - _Privacy, layer 2 scaling, client security, and more_ -- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _Google spreadsheet of organizations offering grants_ - [Academic Grants](https://esp.ethereum.foundation/academic-grants) - _Grants to support Ethereum-related academic work_ + +## Grant list aggregators and platforms {#grant-list-aggregators} + +These resources compile and organize various grant opportunities across the Ethereum ecosystem, making it easier to discover funding opportunities that match your project's needs. We've organized them by persona to help you get you started finding the most relevant resources based on your specific funding needs. + +### For all grant seekers: Comprehensive directories {#comprehensive-directories} + +These general platforms offer broad coverage of grants across the entire Web3 space and are useful starting points for anyone looking for funding: + - [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _Blockworks has compiled a comprehensive directory of all grants, RFPs, and bug bounties._ +- [Find Blockchain Grants](https://findblockchaingrants.com/) - _Searchable database of blockchain grants_ +- [Grantr](https://grantr.app/) - _Platform for discovering and applying to Web3 grants_ +- [Blockchain Grants](https://www.blockchaingrants.org/) - _Directory of blockchain and crypto grants_ + +### For developers and builders {#for-developers-and-builders} + +- [Web3 Grants](https://www.notion.so/Web3-Grants-dae38f9b5f524d36a15aaee1b6fa3089) - _Notion database of Web3 grant opportunities_ +- [Grant Programs Viewer](https://airtable.com/shr86elKgWTSCP4AY) - _Public Airtable database of grant programs_ +- [Web3 Grants Spreadsheet](https://docs.google.com/spreadsheets/d/1c8koZCI-GLnD8MG-eFcXPOBCNu1v8-aXIfwAAvc7AMc/edit#gid=0) - _Google spreadsheet of Web3 grant opportunities_ + +### For DeFi projects and financial applications {#for-defi-projects} + +- [LlamaoGrants](https://wiki.defillama.com/wiki/LlamaoGrants) - _DeFi Llama's grant program directory_ +- [AlphaGrowth Grants](https://alphagrowth.io/crypto-web3-grants-list) - _Comprehensive list of crypto and Web3 grants_ + +### For DAO contributors and governance innovators {#for-dao-contributors} + +Resources for community-driven projects and governance experiments: + +- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _Google spreadsheet of organizations offering grants_ +- [MetaGov Database](https://docs.google.com/spreadsheets/d/1e5g-dlWWsK2DZoZGBgfxyfGNSddLk-V7sLEgfPjEhbA/edit#gid=780420708) - _Comprehensive Web3 grants map_ + +### For entrepreneurs and startups {#for-entrepreneurs-and-startups} + +Resources for those building products and seeking investment beyond just grants: -## Project specific {#project-specific} +- [Web3Native](https://www.web3native.co/) - _Directory of Web3 grants, investors, and accelerator programs_ +- [Cryptoneur Web3 Grants](https://www.cryptoneur.xyz/web3-grants) - _Platform for finding Web3 project funding_ +- [Pentacle Grants](https://pentacle.xyz/grants) - _Grant opportunities in the Web3 space_ -These projects have created their own grants for projects aimed at developing and experimenting with their own technology. +### Public goods and impact {#public-goods-and-impact} -- [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) grants DAO_ -- [Balancer](https://grants.balancer.community/) – _[Balancer](https://balancer.fi/) ecosystem fund_ -- [Chainlink Grants Program](https://chain.link/community/grants) - _[Chainlink](https://chain.link/) community grants_ -- [Decentraland Grants Program](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) DAO Metaverse_ -- [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_ -- [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_ +These programs focus on funding projects that benefit the broader community, public goods, and impact initiatives. These include grant providers, as well as donation platforms utilizing onchain funding allocation mechanisms including [quadratic funding](/defi/#quadratic-funding): -## Quadratic funding {#quadratic-funding} +- [Gitcoin](https://www.gitcoin.co/program) - _Gitcoin Grants utilizes multiple capital allocation mechanisms to fund open source projects and public goods in the Ethereum ecosystem_ +- [Octant](https://octant.app/home) - _Public goods funding ecosystem that balances the common good and individual financial empowerment_ +- [Giveth](https://giveth.io/) - _Crypto donation platform enabling direct donations from for-good projects with zero added fees_ +- [Artizen](https://artizen.fund/) - _Helping creators match fund new projects at the frontier of art, science, technology and culture_ +- [Quadratic Accelerator](https://qacc.giveth.io/) - _Start-up accelerator program that uses quadratic funding to support projects that benefit the public good_ -The open source roots of Ethereum have led to the growth of an interesting new fundraising model: quadratic funding. This has the potential to improve the way we fund all types of public goods in the future. Quadratic funding makes sure that the projects that receive the most funding are those with the most unique demand. In other words, projects that stand to improve the lives of the most people. [More on quadratic funding.](/defi/#quadratic-funding) +### Additional resources {#additional-resources} -- [Gitcoin](https://gitcoin.co/grants) -- [clr.fund](https://clr.fund/) +- [Web3 Summits Grants](https://www.web3summits.io/grants) - _Grant opportunities from Web3 Summits_ +- [Anke's Directory](https://docs.google.com/spreadsheets/d/1IdCCG-U7cGsih_nCNt7Yo4wXstZdCip1UKWbCK0qCZk/edit#gid=938115517) - _Web3 grant program directory_ ## Work in Ethereum {#work-in-ethereum} diff --git a/src/components/Homepage/useHome.ts b/src/components/Homepage/useHome.ts index a70d36f7bc4..8786d1bbc83 100644 --- a/src/components/Homepage/useHome.ts +++ b/src/components/Homepage/useHome.ts @@ -7,10 +7,10 @@ import type { CodeExample } from "@/lib/interfaces" import { useBentoBox } from "@/components/Homepage/useBentoBox" import BlockHeap from "@/components/icons/block-heap.svg" +import BuildAppsIcon from "@/components/icons/build-apps.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 ChooseNetworkIcon from "@/components/icons/network-layers.svg" import TryAppsIcon from "@/components/icons/phone-homescreen.svg" import RoadmapSign from "@/components/icons/roadmap-sign.svg" import Whitepaper from "@/components/icons/whitepaper.svg" @@ -103,14 +103,6 @@ export const useHome = () => { className: "text-accent-a hover:text-accent-a-hover", eventName: "get eth", }, - { - label: t("page-index:page-index-cta-networks-label"), - description: t("page-index:page-index-cta-networks-description"), - href: "/layer-2/", // TODO: Update with new networks page when ready - Svg: ChooseNetworkIcon, - className: "text-accent-b hover:text-accent-b-hover", - eventName: "L2", - }, { label: t("page-index:page-index-cta-dapps-label"), description: t("page-index:page-index-cta-dapps-description"), @@ -122,6 +114,14 @@ export const useHome = () => { ), eventName: "dapps", }, + { + label: t("page-index:page-index-cta-build-apps-label"), + description: t("page-index:page-index-cta-build-apps-description"), + href: "/developers/", + Svg: BuildAppsIcon, + className: "text-accent-b hover:text-accent-b-hover", + eventName: "build apps", + }, ] const popularTopics = [ diff --git a/src/components/icons/build-apps.svg b/src/components/icons/build-apps.svg new file mode 100644 index 00000000000..e81a4467227 --- /dev/null +++ b/src/components/icons/build-apps.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/components/ui/carousel.tsx b/src/components/ui/carousel.tsx index 32b67c80cfb..e305c16900b 100644 --- a/src/components/ui/carousel.tsx +++ b/src/components/ui/carousel.tsx @@ -1,9 +1,11 @@ +// TODO: Fix RTL compatibility + import * as React from "react" import useEmblaCarousel, { type UseEmblaCarouselType, } from "embla-carousel-react" +import { MdChevronLeft, MdChevronRight } from "react-icons/md" -import { ChevronNext, ChevronPrev } from "@/components/Chevron" import { Button } from "@/components/ui/buttons/Button" import { cn } from "@/lib/utils/cn" @@ -207,15 +209,15 @@ const CarouselPrevious = React.forwardRef< className={cn( "absolute h-8 w-8 rounded-full", orientation === "horizontal" - ? "left-5 top-1/2 -translate-y-1/2" - : "-top-12 left-1/2 -translate-x-1/2 rotate-90", + ? "start-5 top-1/2 -translate-y-1/2" + : "-top-12 start-1/2 -translate-x-1/2 rotate-90", className )} disabled={!canScrollPrev} onClick={scrollPrev} {...props} > - + Previous slide ) @@ -236,15 +238,15 @@ const CarouselNext = React.forwardRef< className={cn( "absolute h-8 w-8 rounded-full", orientation === "horizontal" - ? "right-5 top-1/2 -translate-y-1/2" - : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90", + ? "end-5 top-1/2 -translate-y-1/2" + : "-bottom-12 start-1/2 -translate-x-1/2 rotate-90", className )} disabled={!canScrollNext} onClick={scrollNext} {...props} > - + Next slide ) diff --git a/src/data/community-events.json b/src/data/community-events.json index f01854403b6..43cd0fd2a46 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -667,8 +667,8 @@ }, { "title": "ETHVietnam 2025", - "startDate": "2025-05-23", - "endDate": "2025-05-24", + "startDate": "2025-08-09", + "endDate": "2025-08-10", "href": "https://eth-vietnam.com", "location": "HCMC, VNM", "description": "", diff --git a/src/data/consensus-bounty-hunters.json b/src/data/consensus-bounty-hunters.json index 32ce0c5f047..99af853f170 100644 --- a/src/data/consensus-bounty-hunters.json +++ b/src/data/consensus-bounty-hunters.json @@ -50,8 +50,8 @@ "score": 5000 }, { - "username": "asymmetric-research", - "name": "Giuseppe Cocomazzi (Asymmetric Research) ", + "username": "sbudella-gco", + "name": "Giuseppe Cocomazzi", "score": 5000 }, { diff --git a/src/data/roadmap/releases.tsx b/src/data/roadmap/releases.tsx index ca06fd300d1..70d57f6ffc5 100644 --- a/src/data/roadmap/releases.tsx +++ b/src/data/roadmap/releases.tsx @@ -6,14 +6,36 @@ import Layer2HubHeroImage from "@/public/images/heroes/layer-2-hub-hero.jpg" import QuizzesHubHeroImage from "@/public/images/heroes/quizzes-hub-hero.png" import FusakaImage from "@/public/images/roadmap/roadmap-fusaka.png" import PectraImage from "@/public/images/roadmap/roadmap-pectra.png" -interface Release { + +type DateString = + `2${number}${number}${number}-${number}${number}-${number}${number}` +type YearString = `2${number}${number}${number}` + +interface BaseRelease { image: StaticImageData releaseName: string - releaseDate: string content: React.ReactNode href: string } +interface ReleaseWithDate extends BaseRelease { + releaseDate: DateString + plannedReleaseYear?: never +} + +interface ReleaseWithYear extends BaseRelease { + releaseDate?: never + plannedReleaseYear: YearString +} + +interface ReleaseUnscheduled extends BaseRelease { + releaseDate?: never + plannedReleaseYear?: never +} + +// Release may have either a releaseDate or a plannedReleaseYear, but not both. +export type Release = ReleaseWithDate | ReleaseWithYear | ReleaseUnscheduled + export const releasesData: Release[] = [ { image: DevelopersHubHeroImage, @@ -144,7 +166,7 @@ export const releasesData: Release[] = [ { image: FusakaImage, releaseName: "Fusaka", - releaseDate: "2025", + plannedReleaseYear: "2025", content: (

    @@ -172,7 +194,7 @@ export const releasesData: Release[] = [ { image: GuidesHubHeroImage, releaseName: "Glamsterdam", - releaseDate: "2026", + plannedReleaseYear: "2026", content: (

    Discussed for Glamsterdam

    diff --git a/src/data/translationProgress.json b/src/data/translationProgress.json index 78263040575..f5c0b2166f5 100644 --- a/src/data/translationProgress.json +++ b/src/data/translationProgress.json @@ -93,7 +93,7 @@ { "languageId": "de", "words": { - "approved": 198291, + "approved": 198769, "total": 280914 } }, @@ -114,7 +114,7 @@ { "languageId": "el", "words": { - "approved": 266720, + "approved": 268889, "total": 280914 } }, @@ -128,7 +128,7 @@ { "languageId": "es-EM", "words": { - "approved": 254050, + "approved": 255093, "total": 280914 } }, @@ -149,7 +149,7 @@ { "languageId": "fa", "words": { - "approved": 242192, + "approved": 242503, "total": 280914 } }, @@ -177,14 +177,14 @@ { "languageId": "fr", "words": { - "approved": 263694, + "approved": 272940, "total": 280914 } }, { "languageId": "ga-IE", "words": { - "approved": 175704, + "approved": 199875, "total": 280976 } }, @@ -240,7 +240,7 @@ { "languageId": "hu", "words": { - "approved": 257130, + "approved": 258157, "total": 280914 } }, @@ -254,7 +254,7 @@ { "languageId": "id", "words": { - "approved": 128250, + "approved": 128565, "total": 280914 } }, @@ -268,7 +268,7 @@ { "languageId": "it", "words": { - "approved": 260583, + "approved": 260828, "total": 280914 } }, @@ -387,7 +387,7 @@ { "languageId": "ms", "words": { - "approved": 70066, + "approved": 73490, "total": 280914 } }, @@ -450,7 +450,7 @@ { "languageId": "pl", "words": { - "approved": 106822, + "approved": 107027, "total": 280914 } }, @@ -464,7 +464,7 @@ { "languageId": "pt-BR", "words": { - "approved": 261079, + "approved": 262356, "total": 280914 } }, @@ -611,7 +611,7 @@ { "languageId": "tr", "words": { - "approved": 247156, + "approved": 247464, "total": 280914 } }, @@ -667,7 +667,7 @@ { "languageId": "zh-CN", "words": { - "approved": 264644, + "approved": 266470, "total": 280914 } }, diff --git a/src/intl/am/page-index.json b/src/intl/am/page-index.json index 2adaf073310..6b8f8565e96 100644 --- a/src/intl/am/page-index.json +++ b/src/intl/am/page-index.json @@ -36,11 +36,11 @@ "page-index-cta-dapps-label": "መተግበሪያዎችን ይሞክሩ", "page-index-cta-get-eth-description": "የ Ethereum መገበያያ", "page-index-cta-get-eth-label": "ETHን ያግኙ", - "page-index-cta-networks-description": "በአነስተኛ ክፍያዎች ይደሰቱ", - "page-index-cta-networks-label": "አውታረ መረብ ይምረጡ", "page-index-cta-wallet-description": "መለያ ይፍጠሩ እና ንብረቶችን ያስተዳድሩ", "page-index-cta-wallet-label": "ቦርሳ ይምረጡ", "page-index-description": "ለአዳዲስ መተግበሪያዎች እና የ blockchain አውታረ መረቦች መሪ መድረክ", + "page-index-cta-build-apps-description": "የመጀመሪያውን መተግበሪያዎት ይፍጠሩ", + "page-index-cta-build-apps-label": "ልማትን ይጀምሩ", "page-index-developers-code-example-description-0": "እርስዎ ፕሮግራም ባደረጉት ሎጂክ የሚሠራ ባንክ ይገንቡ", "page-index-developers-code-example-description-1": "ከመተግበሪያ ወደ መተግበሪያ ሊያስተላልፏቸው እና ጥቅም ላይ ሊያውሏቸው የምችሉትን ቶከኖች ይፍጠሩ።", "page-index-developers-code-example-description-2": "ከ Ethereum እና ከሌሎች መተግበሪያዎች ጋር ለመስተጋበር ነባር ቋንቋዎችን ይጠቀሙ።", diff --git a/src/intl/ar/page-index.json b/src/intl/ar/page-index.json index 842c3a91f8a..166534f9208 100644 --- a/src/intl/ar/page-index.json +++ b/src/intl/ar/page-index.json @@ -36,11 +36,11 @@ "page-index-cta-dapps-label": "جرب التطبيقات", "page-index-cta-get-eth-description": "عملة تطبيقات إيثريوم", "page-index-cta-get-eth-label": "احصل على عملات إثير", - "page-index-cta-networks-description": "استمتع مقابل رسوم بسيطة", - "page-index-cta-networks-label": "اختر شبكة", "page-index-cta-wallet-description": "إنشاء الحسابات وإدارة الأصول", "page-index-cta-wallet-label": "اختر محفظة", "page-index-description": "المنصة الرائدة للتطبيقات المبتكرة وشبكات البلوكتشين", + "page-index-cta-build-apps-description": "أنشئ أول تطبيق لك", + "page-index-cta-build-apps-label": "ابدأ التطوير", "page-index-developers-code-example-description-0": "بإمكانك بناء مصرف يدعمه المنطق الذي تقوم ببرمجته بنفسك", "page-index-developers-code-example-description-1": "يمكنك إنشاء رموز بحيث يمكنك نقلها واستخدامها عبر التطبيقات", "page-index-developers-code-example-description-2": "بإمكانك استخدام اللغات الموجودة للتفاعل مع إيثريوم والتطبيقات الأخرى", diff --git a/src/intl/az/page-index.json b/src/intl/az/page-index.json index 2760ddd4938..e36c2e93b00 100644 --- a/src/intl/az/page-index.json +++ b/src/intl/az/page-index.json @@ -36,11 +36,11 @@ "page-index-cta-dapps-label": "Tətbiqləri sınayın", "page-index-cta-get-eth-description": "Ethereum-un valyutası", "page-index-cta-get-eth-label": "ETH əldə et", - "page-index-cta-networks-description": "Ödənilən haqların minimal olmasından yararlanın", - "page-index-cta-networks-label": "Şəbəkə seçin", "page-index-cta-wallet-description": "Hesablar yaradın və aktivləri idarə edin", "page-index-cta-wallet-label": "Pul kisəsi seç", "page-index-description": "Yenilikçi tətbiqlər və blokçeyn şəbəkələri üçün qabaqcıl platforma", + "page-index-cta-build-apps-description": "İlk tətbiqinizi yaradın", + "page-index-cta-build-apps-label": "İnkişaf etməyə başlayın", "page-index-developers-code-example-description-0": "Proqramlaşdırdığınız məntiqlə işləyən bir bank qurun", "page-index-developers-code-example-description-1": "Tətbiqlər arasında köçürə və istifadə edə biləcəyiniz tokenlər yaradın", "page-index-developers-code-example-description-2": "Ethereum və digər tətbiqlərlə qarşılıqlı əlaqə yaratmaq üçün mövcud dillərdən istifadə edin", diff --git a/src/intl/be/page-index.json b/src/intl/be/page-index.json index f21c4bd168e..e5867d7ba6d 100644 --- a/src/intl/be/page-index.json +++ b/src/intl/be/page-index.json @@ -36,11 +36,11 @@ "page-index-cta-dapps-label": "Паспрабуйце выкарыстаць дадаткі", "page-index-cta-get-eth-description": "Валюта Ethereum", "page-index-cta-get-eth-label": "Атрымайце ETH", - "page-index-cta-networks-description": "Мінімальныя камісіі", - "page-index-cta-networks-label": "Выбар сеткі", "page-index-cta-wallet-description": "Стварэнне акаўнтаў і кіраванне актывамі", "page-index-cta-wallet-label": "Выберыце гаманец", "page-index-description": "Вядучая платформа для інавацыйных дадаткаў і блокчэйн-сетак", + "page-index-cta-build-apps-description": "Стварыце свой першы дадатак", + "page-index-cta-build-apps-label": "Пачніце распрацоўку", "page-index-developers-code-example-description-0": "Стварыце банк, які кіруецца запраграмаванай вамі логікай", "page-index-developers-code-example-description-1": "Стварайце токены, якія потым можна перадаваць і выкарыстоўваць у разнастайных дадатках", "page-index-developers-code-example-description-2": "Выкарыстоўвайце існуючыя мовы для ўзаемадзеяння з Ethereum і іншымі дадаткамі", diff --git a/src/intl/bg/page-index.json b/src/intl/bg/page-index.json index bc5921f398a..092ee0e7a2d 100644 --- a/src/intl/bg/page-index.json +++ b/src/intl/bg/page-index.json @@ -36,11 +36,11 @@ "page-index-cta-dapps-label": "Опитайте приложенията", "page-index-cta-get-eth-description": "Валутата на Eтереум", "page-index-cta-get-eth-label": "Вземете ETH", - "page-index-cta-networks-description": "Насладете се на минимални такси", - "page-index-cta-networks-label": "Изберете мрежа", "page-index-cta-wallet-description": "Създавайте акаунти и управлявайте активи", "page-index-cta-wallet-label": "Изберете портфейл", "page-index-description": "Водещата платформа за иновативни приложения и блокчейн мрежи", + "page-index-cta-build-apps-description": "Създайте своето първо приложение", + "page-index-cta-build-apps-label": "Започнете разработка", "page-index-developers-code-example-description-0": "Изградете банка, управлявана от програмирана от вас логика", "page-index-developers-code-example-description-1": "Създайте токени, които да прехвърляте и да използвате в различни приложения", "page-index-developers-code-example-description-2": "Използвайте съществуващите езици, за да взаимодействате с Етереум и други приложения", diff --git a/src/intl/bn/page-index.json b/src/intl/bn/page-index.json index 157d6ba1cd6..7b32f716e02 100644 --- a/src/intl/bn/page-index.json +++ b/src/intl/bn/page-index.json @@ -36,11 +36,11 @@ "page-index-cta-dapps-label": "অ্যাপগুলি ব্যাবহার করে দেখুন", "page-index-cta-get-eth-description": "ইথেরিয়ামের কারেন্সি", "page-index-cta-get-eth-label": "ETH নিন", - "page-index-cta-networks-description": "ন্যুনতম ফি উপভোগ করুন", - "page-index-cta-networks-label": "একটি নেটওয়ার্ক বেছে নিন", "page-index-cta-wallet-description": "অ্যাকাউন্ট তৈরি করুন এবং সম্পদ ব্যবস্থাপনা করুন", "page-index-cta-wallet-label": "একটি ওয়ালেট বেছে নিন", "page-index-description": "উদ্ভাবনী অ্যাপ এবং ব্লকচেইন নেটওয়ার্কগুলির জন্য অগ্রগণ্য প্ল্যাটফর্ম", + "page-index-cta-build-apps-description": "আপনার প্রথম অ্যাপ তৈরি করুন", + "page-index-cta-build-apps-label": "উন্নয়ন শুরু করুন", "page-index-developers-code-example-description-0": "আপনার তৈরি করা প্রোগ্রামের যুক্তি অনুযায়ী চালিত একটি ব্যাংক নির্মাণ করুন", "page-index-developers-code-example-description-1": "অ্যাপ্লিকেশনগুলি জুড়ে ট্রান্সফার এবং ব্যবহার করতে পারবেন এমন টোকেনগুলি তৈরি করুন", "page-index-developers-code-example-description-2": "ইথেরিয়াম এবং অন্যান্য অ্যাপ্লিকেশনগুলির সাথে পারস্পরিক যোগাযোগ করতে বিদ্যমান ভাষাগুলি ব্যবহার করুন", diff --git a/src/intl/bs/page-index.json b/src/intl/bs/page-index.json index 95024f781cd..1d16bfa829f 100644 --- a/src/intl/bs/page-index.json +++ b/src/intl/bs/page-index.json @@ -35,11 +35,11 @@ "page-index-cta-dapps-label": "Isprobajte aplikacije", "page-index-cta-get-eth-description": "Valuta Ethereuma", "page-index-cta-get-eth-label": "Nabavite ETH", - "page-index-cta-networks-description": "Uživajte u minimalnim naknadama", - "page-index-cta-networks-label": "Odaberite mrežu", "page-index-cta-wallet-description": "Kreirajte račune i upravljajte sredstvima", "page-index-cta-wallet-label": "Odaberite novčanik", "page-index-description": "Vodeća platforma za inovativne aplikacije i blockchain mreže", + "page-index-cta-build-apps-description": "Kreirajte svoju prvu aplikaciju", + "page-index-cta-build-apps-label": "Započnite razvoj", "page-index-developers-code-example-description-0": "Izgradite banku uz pomoć logike koju ste vi programirali", "page-index-developers-code-example-description-1": "Kreirajte tokene koje možete prenositi i koristiti u različitim aplikacijama", "page-index-developers-code-example-description-2": "Koristite postojeće jezike za interakciju s Ethereumom i drugim aplikacijama", diff --git a/src/intl/ca/page-index.json b/src/intl/ca/page-index.json index 140b18096f6..66c632d1d96 100644 --- a/src/intl/ca/page-index.json +++ b/src/intl/ca/page-index.json @@ -37,11 +37,11 @@ "page-index-cta-dapps-label": "Prova aplicacions", "page-index-cta-get-eth-description": "La moneda d'Ethereum", "page-index-cta-get-eth-label": "Aconsegueix ETH", - "page-index-cta-networks-description": "Gaudeix d'una comissió mínima", - "page-index-cta-networks-label": "Tria una xarxa", "page-index-cta-wallet-description": "Crea comptes i administra actius", "page-index-cta-wallet-label": "Selecciona una cartera", "page-index-description": "La plataforma líder per a aplicacions innovadores i xarxes de cadena de blocs", + "page-index-cta-build-apps-description": "Creï la seva primera aplicació", + "page-index-cta-build-apps-label": "Comenci a crear", "page-index-developers-code-example-description-0": "Crea un banc que funcioni amb la lògica que hagis programat", "page-index-developers-code-example-description-1": "Crea tokens per transferir i utilitzar en diverses aplicacions", "page-index-developers-code-example-description-2": "Utilitza els llenguatges existents per interactuar amb Ethereum i altres aplicacions", diff --git a/src/intl/cs/page-index.json b/src/intl/cs/page-index.json index ed7e8827f12..ae0d379b6f8 100644 --- a/src/intl/cs/page-index.json +++ b/src/intl/cs/page-index.json @@ -37,11 +37,11 @@ "page-index-cta-dapps-label": "Vyzkoušejte aplikace", "page-index-cta-get-eth-description": "Měna Ethereum", "page-index-cta-get-eth-label": "Získat ETH", - "page-index-cta-networks-description": "Minimální poplatky", - "page-index-cta-networks-label": "Zvolte síť", "page-index-cta-wallet-description": "Vytvořte účty a spravujte aktiva", "page-index-cta-wallet-label": "Vyberte si peněženku", "page-index-description": "Přední platforma pro inovativní aplikace a blockchainové sítě", + "page-index-cta-build-apps-description": "Vytvořte svou první aplikaci", + "page-index-cta-build-apps-label": "Začněte vyvíjet", "page-index-developers-code-example-description-0": "Vytvořte banku založenou na vámi naprogramované logice", "page-index-developers-code-example-description-1": "Vytvořte tokeny, které můžete přenášet a používat v různých aplikacích", "page-index-developers-code-example-description-2": "K interakci s Ethereem a ostatními aplikacemi používejte existující jazyky", diff --git a/src/intl/da/page-index.json b/src/intl/da/page-index.json index cbe92cb2638..742e984857c 100644 --- a/src/intl/da/page-index.json +++ b/src/intl/da/page-index.json @@ -36,11 +36,11 @@ "page-index-cta-dapps-label": "Prøv apps", "page-index-cta-get-eth-description": "Ethereum-valutaen", "page-index-cta-get-eth-label": "Få ETH", - "page-index-cta-networks-description": "Nyd godt af minimale gebyrer", - "page-index-cta-networks-label": "Vælg et netværk", "page-index-cta-wallet-description": "Opret konti og styr aktiver", "page-index-cta-wallet-label": "Vælg en wallet", "page-index-description": "Den førende platform for innovative apps og blockchain-netværk", + "page-index-cta-build-apps-description": "Opret Deres første app", + "page-index-cta-build-apps-label": "Start udviklingen", "page-index-developers-code-example-description-0": "Byg en bank drevet af logik, du har programmeret", "page-index-developers-code-example-description-1": "Opret tokens, som du kan overføre og bruge på tværs af applikationer", "page-index-developers-code-example-description-2": "Brug eksisterende sprog til at interagere med Ethereum og andre applikationer", diff --git a/src/intl/de/page-index.json b/src/intl/de/page-index.json index dbc4ed51838..2428939eb87 100644 --- a/src/intl/de/page-index.json +++ b/src/intl/de/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Anwendungen ausprobieren", "page-index-cta-get-eth-description": "Die Währung von Ethereum", "page-index-cta-get-eth-label": "ETH erwerben", - "page-index-cta-networks-description": "Profitiere von minimalen Gebühren", - "page-index-cta-networks-label": "Wähle ein Netzwerk", "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-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", diff --git a/src/intl/el/page-index.json b/src/intl/el/page-index.json index 3907aecb72a..39a6419492e 100644 --- a/src/intl/el/page-index.json +++ b/src/intl/el/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Δοκιμή Εφαρμογών", "page-index-cta-get-eth-description": "Το νόμισμα του Ethereum", "page-index-cta-get-eth-label": "Αγορά ETH", - "page-index-cta-networks-description": "Επωφεληθείτε από τις ελάχιστες χρεώσεις", - "page-index-cta-networks-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-description": "Η ηγετική πλατφόρμα για καινοτόμες εφαρμογές και δίκτυα κρυπτοαλυσίδων", "page-index-developers-code-example-description-0": "Δημιουργήστε μια τράπεζα που λειτουργεί με λογική προγραμματισμένη από εσάς", "page-index-developers-code-example-description-1": "Δημιουργήστε κρυπτοπαραστατικά που μπορείτε να μεταφέρετε και να χρησιμοποιείτε μεταξύ των εφαρμογών", diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index b1207c423f4..3888609c1df 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Try apps", "page-index-cta-get-eth-description": "The currency of Ethereum", "page-index-cta-get-eth-label": "Get ETH", - "page-index-cta-networks-description": "Enjoy minimal fees", - "page-index-cta-networks-label": "Choose a network", "page-index-cta-wallet-description": "Create accounts & manage assets", "page-index-cta-wallet-label": "Pick a wallet", + "page-index-cta-build-apps-description": "Create your first app", + "page-index-cta-build-apps-label": "Start building", "page-index-description": "The leading platform for innovative apps and blockchain networks", "page-index-developers-code-example-description-0": "Build a bank powered by logic you've programmed", "page-index-developers-code-example-description-1": "Create tokens that you can transfer and use across applications", diff --git a/src/intl/es/page-index.json b/src/intl/es/page-index.json index 890fc921a6c..3b8a1934923 100644 --- a/src/intl/es/page-index.json +++ b/src/intl/es/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Pruebe apps", "page-index-cta-get-eth-description": "La moneda de Ethereum", "page-index-cta-get-eth-label": "Consiga ETH", - "page-index-cta-networks-description": "Aproveche tarifas mínimas", - "page-index-cta-networks-label": "Elija una red", "page-index-cta-wallet-description": "Cree cuentas y administre activos", "page-index-cta-wallet-label": "Seleccione una billetera", + "page-index-cta-build-apps-description": "Cree su primera aplicación", + "page-index-cta-build-apps-label": "Empiece a desarrollar", "page-index-description": "La plataforma líder para aplicaciones innovadoras y redes de cadena de bloques", "page-index-developers-code-example-description-0": "Construya un banco impulsado por la lógica que programe", "page-index-developers-code-example-description-1": "Cree tókenes que pueda transferir y usar en distintas aplicaciones", diff --git a/src/intl/fa/page-index.json b/src/intl/fa/page-index.json index 2e5a5ae6a6a..fc790ff9827 100644 --- a/src/intl/fa/page-index.json +++ b/src/intl/fa/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "اپلیکیشن‌ها را امتحان کنید", "page-index-cta-get-eth-description": "واحد پول اتریوم", "page-index-cta-get-eth-label": "دریافت ETH", - "page-index-cta-networks-description": "از حداقل هزینه‌ها لذت ببرید", - "page-index-cta-networks-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-description": "پلتفرم پیشرو برای برنامه‌های نوآورانه و شبکه‌های بلاکچین", "page-index-developers-code-example-description-0": "بانکی را بسازید که توسط منطقی که برنامه‌نویسی کرده‌اید، پشتیبانی می‌شود", "page-index-developers-code-example-description-1": "توکن‌هایی را ایجاد کنید که می‌توانید آن‌ها را انتقال دهید و در برنامه‌های مختلف استفاده کنید", diff --git a/src/intl/fi/page-index.json b/src/intl/fi/page-index.json index d74fc04acc0..d74042b3331 100644 --- a/src/intl/fi/page-index.json +++ b/src/intl/fi/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Kokeile sovelluksia", "page-index-cta-get-eth-description": "Ethereumin valuutta", "page-index-cta-get-eth-label": "Hanki Ethereitä", - "page-index-cta-networks-description": "Nauti minimaalista kuluista", - "page-index-cta-networks-label": "Valitse verkko", "page-index-cta-wallet-description": "Luo tilejä ja hallitse resursseja", "page-index-cta-wallet-label": "Valitse lompakko", + "page-index-cta-build-apps-description": "Luokaa ensimmäinen sovelluksenne", + "page-index-cta-build-apps-label": "Aloittakaa kehittäminen", "page-index-description": "Innovatiivisten sovellusten ja lohkoketjuverkkojen johtava alusta", "page-index-developers-code-example-description-0": "Luo ohjelmoimasi logiikan mukainen pankki", "page-index-developers-code-example-description-1": "Voit luoda rahakkeita, joita voi siirtää ja käyttää eri sovellusten välillä", diff --git a/src/intl/fil/page-index.json b/src/intl/fil/page-index.json index 17f9b3ea449..1e9177fbc92 100644 --- a/src/intl/fil/page-index.json +++ b/src/intl/fil/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Subukan ang mga app", "page-index-cta-get-eth-description": "Ang pera ng Ethereum", "page-index-cta-get-eth-label": "Kumuha ng ETH", - "page-index-cta-networks-description": "I-enjoy ang mabababang bayarin", - "page-index-cta-networks-label": "Pumili ng network", "page-index-cta-wallet-description": "Gumawa ng mga account at pamahalaan ang mga asset", "page-index-cta-wallet-label": "Pumili ng wallet", + "page-index-cta-build-apps-description": "Gumawa ng iyong unang app", + "page-index-cta-build-apps-label": "Simulan ang pagbuo", "page-index-description": "Ang nangungunang platform para sa mga makabagong app at network ng blockchain", "page-index-developers-code-example-description-0": "Bumuo ng bangko na pinapagana ng lohikang ikaw ang nagprograma", "page-index-developers-code-example-description-1": "Gumawa ng mga token na maaaring mailipat at magagamit sa iba't ibang application", diff --git a/src/intl/fr/page-index.json b/src/intl/fr/page-index.json index e54920ff520..925b197df43 100644 --- a/src/intl/fr/page-index.json +++ b/src/intl/fr/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Essayer des applications", "page-index-cta-get-eth-description": "La devise d’Ethereum", "page-index-cta-get-eth-label": "Obtenir de l'ETH", - "page-index-cta-networks-description": "Bénéficiez de frais minimes", - "page-index-cta-networks-label": "Sélectionner un réseau", "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-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", diff --git a/src/intl/ga/page-index.json b/src/intl/ga/page-index.json index f75d6466914..aea619a35e0 100644 --- a/src/intl/ga/page-index.json +++ b/src/intl/ga/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Bain triail as aipeanna", "page-index-cta-get-eth-description": "Airgeadra Ethereum", "page-index-cta-get-eth-label": "Faigh ETH", - "page-index-cta-networks-description": "Bain leas as táillí íosta", - "page-index-cta-networks-label": "Roghnaigh líonra", "page-index-cta-wallet-description": "Cruthaigh cuntais agus bainistigh sócmhainní", "page-index-cta-wallet-label": "Pioc sparán", + "page-index-cta-build-apps-description": "Cruthaigh do chéad aip", + "page-index-cta-build-apps-label": "Tosaígí ar fhorbairt", "page-index-description": "An t-ardán is mó le haghaidh aipeanna nuálacha agus líonraí blocshlabhra", "page-index-developers-code-example-description-0": "Tóg banc atá faoi thiomáint ag an loighic atá ríomhchláraithe agat féin", "page-index-developers-code-example-description-1": "Cruthaigh comharthaí gur féidir leat a aistriú agus a úsáid thar feidhmchláir", diff --git a/src/intl/gl/page-index.json b/src/intl/gl/page-index.json index b255745b43d..ecc6f850066 100644 --- a/src/intl/gl/page-index.json +++ b/src/intl/gl/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Probar aplicacións", "page-index-cta-get-eth-description": "A divisa de Ethereum", "page-index-cta-get-eth-label": "Obter ETH", - "page-index-cta-networks-description": "Aproveita as tarifas mínimas", - "page-index-cta-networks-label": "Selecciona una rede", "page-index-cta-wallet-description": "Crear contas e xestionar activos", "page-index-cta-wallet-label": "Escolla unha carteira", + "page-index-cta-build-apps-description": "Cree a súa primeira aplicación", + "page-index-cta-build-apps-label": "Comece a crear", "page-index-description": "A plataforma líder das aplicacións innovadoras e as redes de blockchain", "page-index-developers-code-example-description-0": "Constrúe un banco impulsado pola lóxica que programaches", "page-index-developers-code-example-description-1": "Crea tokens que pode transferir e utilizar en todas as aplicacións", diff --git a/src/intl/gu/page-index.json b/src/intl/gu/page-index.json index 773a9b44383..87aef12942c 100644 --- a/src/intl/gu/page-index.json +++ b/src/intl/gu/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "ઍપ્સ અજમાવી જુઓ", "page-index-cta-get-eth-description": "Ethereumનું ચલણ", "page-index-cta-get-eth-label": "મેળવો ETH", - "page-index-cta-networks-description": "ન્યૂનતમ ફીનો આનંદ માણો", - "page-index-cta-networks-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-description": "નવીન ઍપ્સ અને બ્લોકચેન નેટવર્ક્સ માટેનું અગ્રણી પ્લેટફોર્મ", "page-index-developers-code-example-description-0": "તમે પ્રોગ્રામ કરેલા લૉજિક દ્વારા સંચાલિત બેંક બનાવો", "page-index-developers-code-example-description-1": "ટોકન્સ બનાવો કે જેને તમે ટ્રાન્સફર કરી શકો છો અને સમગ્ર ઍપ્લિકેશન્સમાં ઉપયોગ કરી શકો છો", diff --git a/src/intl/ha/page-index.json b/src/intl/ha/page-index.json index bd891a01dbf..5b5051b67c3 100644 --- a/src/intl/ha/page-index.json +++ b/src/intl/ha/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Gwada amfani da manhajoji", "page-index-cta-get-eth-description": "Kuɗin Ethereum", "page-index-cta-get-eth-label": "Samun ETH", - "page-index-cta-networks-description": "Ci moriyar kuɗade kaɗan", - "page-index-cta-networks-label": "Zaɓi cibiyar sadarwa", "page-index-cta-wallet-description": "Ƙirƙiri asusu & gudanar da kadarori", "page-index-cta-wallet-label": "Zaɓi lalita", + "page-index-cta-build-apps-description": "Ƙirƙiri aikace-aikacenka na farko", + "page-index-cta-build-apps-label": "Fara haɓaka", "page-index-description": "Dandalin da ke jagorantar ƙirƙirarrun manhajoji da cibiyoyin bulokcen", "page-index-developers-code-example-description-0": "Samar da bankin da tunaninku ke ƙarfafa ma wa", "page-index-developers-code-example-description-1": "Ƙirƙiri kadarorin dijital waɗanda za ku iya yin tiransifa tare da amfani da su a dukkan manhajoji", diff --git a/src/intl/he/page-index.json b/src/intl/he/page-index.json index a9638c1ef77..cf39ef864a3 100644 --- a/src/intl/he/page-index.json +++ b/src/intl/he/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "נסה אפליקציות", "page-index-cta-get-eth-description": "המטבע של אתריום", "page-index-cta-get-eth-label": "קבל ETH", - "page-index-cta-networks-description": "תיהנה מעמלות מינימליות", - "page-index-cta-networks-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-description": "הפלטפורמה המובילה לאפליקציות חדשניות ורשתות בלוקצ'יין", "page-index-developers-code-example-description-0": "בנה בנק המופעל על ידי לוגיקה שתכנתת", "page-index-developers-code-example-description-1": "צור טוקנים שתוכל להעביר ולהשתמש בהם בין אפליקציות", diff --git a/src/intl/hi/page-index.json b/src/intl/hi/page-index.json index a87decebd81..fdc23b8b480 100644 --- a/src/intl/hi/page-index.json +++ b/src/intl/hi/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "ऐप्स आज़माएं", "page-index-cta-get-eth-description": "एथेरियम की करेंसी", "page-index-cta-get-eth-label": "ETH प्राप्त करें", - "page-index-cta-networks-description": "न्यूनतम शुल्क का आनंद लें", - "page-index-cta-networks-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-description": "इनोवेटिव ऐप्स और ब्लॉकचेन नेटवर्क के लिए प्रमुख प्लेटफ़ॉर्म", "page-index-developers-code-example-description-0": "आपके द्वारा प्रोग्राम किए गए लॉजिक से संचालित बैंक बनाएं", "page-index-developers-code-example-description-1": "ऐसे टोकन बनाएं, जिन्हें आप ट्रांसफ़र कर सकते हैं और कई अलग-अलग एप्लिकेशन पर उपयोग कर सकते हैं", diff --git a/src/intl/hr/page-index.json b/src/intl/hr/page-index.json index 5220666d41a..aec3ec13511 100644 --- a/src/intl/hr/page-index.json +++ b/src/intl/hr/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Isprobajte aplikacije", "page-index-cta-get-eth-description": "Ethereumova valuta", "page-index-cta-get-eth-label": "Nabavite ETH", - "page-index-cta-networks-description": "Uživajte u minimalnim naknadama", - "page-index-cta-networks-label": "Odaberite mrežu", "page-index-cta-wallet-description": "Izradite račune i upravljajte imovinom", "page-index-cta-wallet-label": "Odaberite novčanik", + "page-index-cta-build-apps-description": "Izradite svoju prvu aplikaciju", + "page-index-cta-build-apps-label": "Započnite razvoj", "page-index-description": "Vodeća platforma za inovativne aplikacije i mreže lanaca blokova", "page-index-developers-code-example-description-0": "Izradite banku upravljanu logikom koju ste sami programirali", "page-index-developers-code-example-description-1": "Izradite tokene koje možete prenositi i upotrebljavati u različitim aplikacijama", diff --git a/src/intl/hu/page-index.json b/src/intl/hu/page-index.json index ec9d62589f5..34b62b2ad2a 100644 --- a/src/intl/hu/page-index.json +++ b/src/intl/hu/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Próbálja ki az alkalmazásokat", "page-index-cta-get-eth-description": "Ez Ethereum pénzneme", "page-index-cta-get-eth-label": "ETH beszerzése", - "page-index-cta-networks-description": "Élvezze a minimális díjakat", - "page-index-cta-networks-label": "Válasszon hálózatot", "page-index-cta-wallet-description": "Hozzon létre fiókokat és kezelje eszközeit", "page-index-cta-wallet-label": "Válasszon egy tárcát", + "page-index-cta-build-apps-description": "Hozza létre első alkalmazását", + "page-index-cta-build-apps-label": "Kezdje el a fejlesztést", "page-index-description": "Az innovatív alkalmazások és blokklánc-hálózatok vezető platformja", "page-index-developers-code-example-description-0": "Építsen bankot, amely az Ön által programozott logikára épül", "page-index-developers-code-example-description-1": "Hozzon létre tokeneket, amelyeket az alkalmazások között is átvihet és használhat", diff --git a/src/intl/hy-am/page-index.json b/src/intl/hy-am/page-index.json index 2ee8bbd0c71..5eb27991f33 100644 --- a/src/intl/hy-am/page-index.json +++ b/src/intl/hy-am/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Փորձել հավելվածները", "page-index-cta-get-eth-description": "Էթերիումի արժույթը", "page-index-cta-get-eth-label": "Ստանալ ETH", - "page-index-cta-networks-description": "Վայելեք նվազագույն վճարները", - "page-index-cta-networks-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-description": "Առաջատար հարթակ նորարարական հավելվածների և բլոկչեյն ցանցերի համար", "page-index-developers-code-example-description-0": "Կառուցեք բանկ, որն աշխատում է ձեր ծրագրավորած տրամաբանությամբ", "page-index-developers-code-example-description-1": "Ստեղծեք token-ներ, որոնք կարող եք փոխանցել և օգտագործել տարբեր հավելվածներում", diff --git a/src/intl/id/page-index.json b/src/intl/id/page-index.json index 500c3570ffb..55cfec1a451 100644 --- a/src/intl/id/page-index.json +++ b/src/intl/id/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Coba aplikasi", "page-index-cta-get-eth-description": "Mata uang Ethereum", "page-index-cta-get-eth-label": "Dapatkan ETH", - "page-index-cta-networks-description": "Nikmati biaya minimal", - "page-index-cta-networks-label": "Pilih jaringan", "page-index-cta-wallet-description": "Buat akun & kelola aset", "page-index-cta-wallet-label": "Tentukan dompet", + "page-index-cta-build-apps-description": "Buatlah aplikasi pertama Anda", + "page-index-cta-build-apps-label": "Mulai mengembangkan", "page-index-description": "Platform terkemuka untuk aplikasi yang inovatif dan jaringan rantai blok", "page-index-developers-code-example-description-0": "Bangun bank yang dijalankan dengan logika yang telah Anda programkan", "page-index-developers-code-example-description-1": "Buat token yang dapat Anda transfer dan gunakan di seluruh aplikasi", diff --git a/src/intl/ig/page-index.json b/src/intl/ig/page-index.json index 4589a396aee..dca543e3460 100644 --- a/src/intl/ig/page-index.json +++ b/src/intl/ig/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Nwalee ngwa", "page-index-cta-get-eth-description": "Ego nke Ethereum", "page-index-cta-get-eth-label": "Nweta ETH", - "page-index-cta-networks-description": "Na-akwụ ụgwọ dị ala", - "page-index-cta-networks-label": "Họrọ otu netwọk", "page-index-cta-wallet-description": "Mepụta akaụntụ ma jikwaa akụ", "page-index-cta-wallet-label": "Họrọ akpaego", + "page-index-cta-build-apps-description": "Mepụta ngwa gị mbụ", + "page-index-cta-build-apps-label": "Bido mmepe", "page-index-description": "Ndi kachasi mma maka ngwa echeputara ohuru na netwọkụ blockchain", "page-index-developers-code-example-description-0": "Wulite ụlọ akụ nke ihe nghota imeputara na-akwado", "page-index-developers-code-example-description-1": "Mepụta akara ndị ị nwere ike ịnyefe ma jiri n'ofe ngwa", diff --git a/src/intl/it/page-index.json b/src/intl/it/page-index.json index 77099ebb028..6b0ceb53854 100644 --- a/src/intl/it/page-index.json +++ b/src/intl/it/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Prova le app", "page-index-cta-get-eth-description": "La valuta di Ethereum", "page-index-cta-get-eth-label": "Ottieni ETH", - "page-index-cta-networks-description": "Commissioni minime", - "page-index-cta-networks-label": "Scegli una rete", "page-index-cta-wallet-description": "Crea conti e gestisci asset", "page-index-cta-wallet-label": "Scegli un portafoglio", + "page-index-cta-build-apps-description": "Crei la Sua prima applicazione", + "page-index-cta-build-apps-label": "Inizi a sviluppare", "page-index-description": "La piattaforma leader per le app innovative e le reti blockchain", "page-index-developers-code-example-description-0": "Crea una banca basata sulla logica da te programmata", "page-index-developers-code-example-description-1": "Crea token trasferibili e utilizzabili tra più applicazioni", diff --git a/src/intl/ja/page-index.json b/src/intl/ja/page-index.json index bf769694a61..ebf07dbef73 100644 --- a/src/intl/ja/page-index.json +++ b/src/intl/ja/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "アプリを試す", "page-index-cta-get-eth-description": "イーサリアムの通貨", "page-index-cta-get-eth-label": "ETHを入手", - "page-index-cta-networks-description": "手数料が最小限", - "page-index-cta-networks-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-description": "革新的なアプリのための主要プラットフォーム、そしてブロックチェーンのネットワーク", "page-index-developers-code-example-description-0": "自分でプログラムしたロジックで動く銀行を構築する", "page-index-developers-code-example-description-1": "アプリ間で転送・利用できるトークンを作成する", diff --git a/src/intl/ka/page-index.json b/src/intl/ka/page-index.json index 07feef9453e..db0ba44aa93 100644 --- a/src/intl/ka/page-index.json +++ b/src/intl/ka/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "სცადეთ აპები", "page-index-cta-get-eth-description": "Ethereum-ის ვალუტა", "page-index-cta-get-eth-label": "მიიღე ETH", - "page-index-cta-networks-description": "ისიამოვნეთ მინიმალური გადასახადებით", - "page-index-cta-networks-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-description": "ინოვაციური აპებისა და ბლოქჩეინ ქსელების წამყვანი პლატფორმა", "page-index-developers-code-example-description-0": "ააგეთ თქვენ მიერ პროგრამირებული ლოგიკით მართული ბანკი", "page-index-developers-code-example-description-1": "შექმენით ტოკენები, რომელთა გადაცემასა და გამოყენებასაც აპლიკაციებში შეძლებთ", diff --git a/src/intl/kk/page-index.json b/src/intl/kk/page-index.json index ebf1fc2ffb4..c0f7866e25e 100644 --- a/src/intl/kk/page-index.json +++ b/src/intl/kk/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Қолданбаларды байқап көру", "page-index-cta-get-eth-description": "Ethereum валютасы", "page-index-cta-get-eth-label": "ETH алу", - "page-index-cta-networks-description": "Ең төмен комиссиялар", - "page-index-cta-networks-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-description": "Инновациялық қолданбалар мен блокчейн желілері үшін жетекші платформа", "page-index-developers-code-example-description-0": "Бағдарламалаған логикаңызбен басқарылатын банк жасаңыз", "page-index-developers-code-example-description-1": "Әр түрлі қолданбаларда тасымалдауға және пайдалануға болатын токен жасаңыз", diff --git a/src/intl/km/page-index.json b/src/intl/km/page-index.json index 8958b765607..f7fe1744e0b 100644 --- a/src/intl/km/page-index.json +++ b/src/intl/km/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "សាក់ល្បងប្រើកម្មវិធី", "page-index-cta-get-eth-description": "រូបិយប័ណ្ណរបស់ Ethereum", "page-index-cta-get-eth-label": "ទទួលយក ETH", - "page-index-cta-networks-description": "រីករាយជាមួយថ្លៃសេវាតិចតួច", - "page-index-cta-networks-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-description": "ជាថ្នាលឈានមុខគេសម្រាប់កម្មវិធី​នវានុវត្តន៍ និងបណ្តាញ blockchain", "page-index-developers-code-example-description-0": "បង្កើតធនាគារដែលដំណើរការដោយតក្កវិជ្ជាដែលអ្នកបានរៀបចំកម្មវិធី", "page-index-developers-code-example-description-1": "បង្កើតថូខិនដែលអ្នកអាចផ្ទេរ និងប្រើប្រាស់នៅលើកម្មវិធីនានា", diff --git a/src/intl/kn/page-index.json b/src/intl/kn/page-index.json index 2ca1529872f..95a5594627e 100644 --- a/src/intl/kn/page-index.json +++ b/src/intl/kn/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಪ್ರಯತ್ನಿಸಿ", "page-index-cta-get-eth-description": "Ethereum ನ ಕರೆನ್ಸಿ", "page-index-cta-get-eth-label": "ETH ಪಡೆಯಿರಿ", - "page-index-cta-networks-description": "ಕನಿಷ್ಠ ಶುಲ್ಕವನ್ನು ಆನಂದಿಸಿ", - "page-index-cta-networks-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-description": "ನವೀನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಬ್ಲಾಕ್‌ಚೈನ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗೆ ಪ್ರಮುಖ ವೇದಿಕೆ", "page-index-developers-code-example-description-0": "ನೀವು ಪ್ರೋಗ್ರಾಮ್ ಮಾಡಿದ ತರ್ಕದಿಂದ ಚಾಲಿತ ಬ್ಯಾಂಕ್ ಅನ್ನು ನಿರ್ಮಿಸಿ", "page-index-developers-code-example-description-1": "ಅಪ್ಲಿಕೇಶನ್‌ಗಳಾದ್ಯಂತ ನೀವು ವರ್ಗಾಯಿಸಬಹುದಾದ ಮತ್ತು ಬಳಸಬಹುದಾದ ಟೋಕನ್‌ಗಳನ್ನು ರಚಿಸಿ", diff --git a/src/intl/ko/page-index.json b/src/intl/ko/page-index.json index 6f68c0ae9f7..25150556b63 100644 --- a/src/intl/ko/page-index.json +++ b/src/intl/ko/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "앱 사용하기", "page-index-cta-get-eth-description": "이더리움의 화폐", "page-index-cta-get-eth-label": "이더 구매하기", - "page-index-cta-networks-description": "최소 요금 지불", - "page-index-cta-networks-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-description": "혁신적인 앱과 블록체인 네트워크의 선두 플랫폼", "page-index-developers-code-example-description-0": "직접 프로그래밍한 로직에 기반하여 은행을 빌드", "page-index-developers-code-example-description-1": "다양한 애플리케이션 간에 전송하고 사용할 수 있는 토큰 생성", diff --git a/src/intl/lt/page-index.json b/src/intl/lt/page-index.json index 1f09b8b352c..253fb6842ae 100644 --- a/src/intl/lt/page-index.json +++ b/src/intl/lt/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Išbandykite programėles", "page-index-cta-get-eth-description": "Ethereum valiuta", "page-index-cta-get-eth-label": "Gauti ETH", - "page-index-cta-networks-description": "Mėgaukitės minimaliais mokesčiais", - "page-index-cta-networks-label": "Pasirinkite tinklą", "page-index-cta-wallet-description": "Sukurkite paskyras ir valdykite aktyvus", "page-index-cta-wallet-label": "Pasirinkite piniginę", + "page-index-cta-build-apps-description": "Sukurkite pirmąją programą", + "page-index-cta-build-apps-label": "Pradėkite kurti", "page-index-description": "Pirmaujanti inovatyvių programėlių ir blockchain tinklų platforma", "page-index-developers-code-example-description-0": "Sukurkite banką, veikiantį pagal jūsų suprogramuotą logiką", "page-index-developers-code-example-description-1": "Sukurkite žetonus, kuriuos galite perkelti ir naudoti įvairiose programose", diff --git a/src/intl/ml/page-index.json b/src/intl/ml/page-index.json index 77707c162dc..c8be2fecbb3 100644 --- a/src/intl/ml/page-index.json +++ b/src/intl/ml/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "ആപ്പുകൾ പരീക്ഷിക്കുക", "page-index-cta-get-eth-description": "Ethereum കറൻസി", "page-index-cta-get-eth-label": "ETH നേടൂ", - "page-index-cta-networks-description": "കുറഞ്ഞ ഫീസ് ആസ്വദിക്കൂ", - "page-index-cta-networks-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-description": "നൂതന ആപ്പുകളുടെയും ബ്ലോക്ക്‌ചെയിൻ നെറ്റ്‌വർക്കുകളുടെയും മുൻനിര പ്ലാറ്റ്‌ഫോം", "page-index-developers-code-example-description-0": "നിങ്ങൾ പ്രോഗ്രാം ചെയ്ത ലോജിക് ഉപയോഗിച്ച് ഒരു ബാങ്ക് ഉണ്ടാക്കുക", "page-index-developers-code-example-description-1": "നിങ്ങൾക്ക് ആപ്ലിക്കേഷനുകളിൽ ഉടനീളം കൈമാറാനും ഉപയോഗിക്കാനും കഴിയുന്ന ടോക്കണുകൾ സൃഷ്ടിക്കുക", diff --git a/src/intl/mr/page-index.json b/src/intl/mr/page-index.json index 36abe0bd34b..8a64cdbffed 100644 --- a/src/intl/mr/page-index.json +++ b/src/intl/mr/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "अ‍ॅप्स वापरून पहा", "page-index-cta-get-eth-description": "अथेरमचे चलन", "page-index-cta-get-eth-label": "ETH मिळवा", - "page-index-cta-networks-description": "अगदी किमान शुल्काचा लाभ घ्‍या", - "page-index-cta-networks-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-description": "नावीन्यपूर्ण अ‍ॅप्ससाठी आणि ब्लॉकचेन नेटवर्कसाठी अग्रणी प्लॅटफॉर्म", "page-index-developers-code-example-description-0": "तुम्ही प्रोग्राम केलेल्या तर्काच्या सामर्थ्‍याने एक बॅंक तयार करा", "page-index-developers-code-example-description-1": "तुम्ही अ‍ॅप्लिकेशन्सवर हस्तांतरित करू शकता आणि वापरू शकता अशी टोकन्स तयार करा", diff --git a/src/intl/ms/page-index.json b/src/intl/ms/page-index.json index 25a46aaf800..93f7ed43536 100644 --- a/src/intl/ms/page-index.json +++ b/src/intl/ms/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Cuba aplikasi", "page-index-cta-get-eth-description": "Mata wang Ethereum", "page-index-cta-get-eth-label": "Dapatkan ETH", - "page-index-cta-networks-description": "Nikmati yuran minimum", - "page-index-cta-networks-label": "Pilih rangkaian", "page-index-cta-wallet-description": "Cipta akaun & kendalikan aset", "page-index-cta-wallet-label": "Pilih dompet", + "page-index-cta-build-apps-description": "Cipta aplikasi pertama anda", + "page-index-cta-build-apps-label": "Mulakan pembangunan", "page-index-description": "Platform terbaik untuk aplikasi inovatif dan rangkaian blok rantai", "page-index-developers-code-example-description-0": "Bina bank yang dikuasakan oleh logik yang telah anda programkan", "page-index-developers-code-example-description-1": "Cipta token yang boleh anda pindahkan dan gunakan merentasi aplikasi", diff --git a/src/intl/nb/page-index.json b/src/intl/nb/page-index.json index 9a30727bfb3..dac5d78ece9 100644 --- a/src/intl/nb/page-index.json +++ b/src/intl/nb/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Prøv apper", "page-index-cta-get-eth-description": "Valutaen til Ethereum", "page-index-cta-get-eth-label": "Hent ETH", - "page-index-cta-networks-description": "Dra nytte av minimale avgifter", - "page-index-cta-networks-label": "Velg et nettverk", "page-index-cta-wallet-description": "Opprett kontoer og administer aktiva", "page-index-cta-wallet-label": "Velg en lommebok", + "page-index-cta-build-apps-description": "Lag Deres første app", + "page-index-cta-build-apps-label": "Start utvikling", "page-index-description": "Den ledende plattformen for innovative apper og blokkjede-nettverk", "page-index-developers-code-example-description-0": "Bygg en bank drevet med logikk du har programmert", "page-index-developers-code-example-description-1": "Opprett tokener som du kan overføre og bruke i andre programmer", diff --git a/src/intl/ne-np/page-index.json b/src/intl/ne-np/page-index.json index 86a2b9c1efa..2a7f86731f4 100644 --- a/src/intl/ne-np/page-index.json +++ b/src/intl/ne-np/page-index.json @@ -34,10 +34,10 @@ "page-index-cta-dapps-label": "एप्पहरू प्रयास गर्नुहोस्", "page-index-cta-get-eth-description": "Ethereum को मुद्रा", "page-index-cta-get-eth-label": "ETH प्राप्त गर्नुहोस्", - "page-index-cta-networks-description": "न्यूनतम शुल्कको आनन्द लिनुहोस्", - "page-index-cta-networks-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-description": "अभिनव एप्पहरू र ब्लकचेन नेटवर्कहरूका लागि अग्रणी प्लेटफर्म", "page-index-developers-code-example-description-0": "तपाईंले प्रोग्राम गर्नुभएको तर्कद्वारा संचालित बैंक बनाउनुहोस्", "page-index-developers-code-example-description-1": "तपाईंले एप्पहरूमा स्थानान्तरण र प्रयोग गर्न सक्ने टोकनहरू सिर्जना गर्नुहोस्", diff --git a/src/intl/nl/page-index.json b/src/intl/nl/page-index.json index 37f77d6a001..4901cd4638d 100644 --- a/src/intl/nl/page-index.json +++ b/src/intl/nl/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Probeer de apps", "page-index-cta-get-eth-description": "De valuta van Ethereum", "page-index-cta-get-eth-label": "Verkrijg ETH", - "page-index-cta-networks-description": "Profiteer van minimale kosten", - "page-index-cta-networks-label": "Kies een netwerk", "page-index-cta-wallet-description": "Maak accounts aan en beheer activa", "page-index-cta-wallet-label": "Kies een portemonnee", + "page-index-cta-build-apps-description": "Maak uw eerste app", + "page-index-cta-build-apps-label": "Begin met bouwen", "page-index-description": "Het toonaangevende platform voor innovatieve apps en blockchain-netwerken", "page-index-developers-code-example-description-0": "Bouw een bank aangedreven door logica die jij hebt geprogrammeerd", "page-index-developers-code-example-description-1": "Maak tokens aan die je kunt overzetten en gebruiken verspreid over applicaties", diff --git a/src/intl/pcm/page-index.json b/src/intl/pcm/page-index.json index 41d5a6c3041..dd61f60e36b 100644 --- a/src/intl/pcm/page-index.json +++ b/src/intl/pcm/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Try apps", "page-index-cta-get-eth-description": "Di kurensy of Ethereum", "page-index-cta-get-eth-label": "Get ETH", - "page-index-cta-networks-description": "Enjoy minimal fees", - "page-index-cta-networks-label": "Shuse one netwok", "page-index-cta-wallet-description": "Kreate akants and manaj assets", "page-index-cta-wallet-label": "Make yu pick one wallet", + "page-index-cta-build-apps-description": "Make your first app", + "page-index-cta-build-apps-label": "Begin building", "page-index-description": "Di platfom wey dey lead for innovative apps and blockchain netwoks", "page-index-developers-code-example-description-0": "Build one bank wey dem pawa by logik wey yu don program", "page-index-developers-code-example-description-1": "Kreate tokens wey yu fit transfa and yus akross aplikashons", diff --git a/src/intl/pl/page-index.json b/src/intl/pl/page-index.json index d481e7f88c7..6066e5f3d53 100644 --- a/src/intl/pl/page-index.json +++ b/src/intl/pl/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Wypróbuj aplikacje", "page-index-cta-get-eth-description": "Waluta sieci Ethereum", "page-index-cta-get-eth-label": "Zdobądź ETH", - "page-index-cta-networks-description": "Minimalne opłaty", - "page-index-cta-networks-label": "Wybierz sieć", "page-index-cta-wallet-description": "Twórz konta i zarządzaj aktywami", "page-index-cta-wallet-label": "Wybierz portfel", + "page-index-cta-build-apps-description": "Proszę stworzyć swoją pierwszą aplikację", + "page-index-cta-build-apps-label": "Rozpocznij tworzenie", "page-index-description": "Czołowa platforma dla innowacyjnych aplikacji i sieci blockchain", "page-index-developers-code-example-description-0": "Stwórz bank działający w oparciu o zaprogramowaną przez Ciebie logikę", "page-index-developers-code-example-description-1": "Twórz tokeny, które możesz przesyłać i wykorzystywać w różnych aplikacjach", diff --git a/src/intl/pt-br/page-index.json b/src/intl/pt-br/page-index.json index f4f257e470c..e12649d96ca 100644 --- a/src/intl/pt-br/page-index.json +++ b/src/intl/pt-br/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Avaliar aplicativos", "page-index-cta-get-eth-description": "A moeda do Ethereum", "page-index-cta-get-eth-label": "Obtenha ETH", - "page-index-cta-networks-description": "Aproveite taxas mínimas", - "page-index-cta-networks-label": "Escola uma rede", "page-index-cta-wallet-description": "Crie contas e gerencie ativos", "page-index-cta-wallet-label": "Escolha uma carteira", + "page-index-cta-build-apps-description": "Crie o seu primeiro aplicativo", + "page-index-cta-build-apps-label": "Comece a desenvolver", "page-index-description": "A plataforma líder para aplicativos inovadores e redes de blockchain", "page-index-developers-code-example-description-0": "Crie um banco movido pela lógica que você programou", "page-index-developers-code-example-description-1": "Crie tokens que você pode transferir e usar entre aplicativos", diff --git a/src/intl/pt/page-index.json b/src/intl/pt/page-index.json index 94d1ad4eb30..a8a4b9636b7 100644 --- a/src/intl/pt/page-index.json +++ b/src/intl/pt/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Experimente aplicações", "page-index-cta-get-eth-description": "A moeda da Ethereum", "page-index-cta-get-eth-label": "Obter ETH", - "page-index-cta-networks-description": "Desfrute de taxas mínimas", - "page-index-cta-networks-label": "Escolha uma rede", "page-index-cta-wallet-description": "Crie contas e faça a gestão de ativos", "page-index-cta-wallet-label": "Escolha uma carteira", + "page-index-cta-build-apps-description": "Crie a sua primeira aplicação", + "page-index-cta-build-apps-label": "Comece a desenvolver", "page-index-description": "A plataforma líder para aplicações inovadoras e redes de blockchain", "page-index-developers-code-example-description-0": "Crie um banco com a lógica que programou", "page-index-developers-code-example-description-1": "Crie tokens que pode transferir e utilizar entre aplicações", diff --git a/src/intl/ro/page-index.json b/src/intl/ro/page-index.json index 9ea7d32b45c..8249d4949ad 100644 --- a/src/intl/ro/page-index.json +++ b/src/intl/ro/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Încercați aplicațiile", "page-index-cta-get-eth-description": "Moneda Ethereum", "page-index-cta-get-eth-label": "Obțineți ETH", - "page-index-cta-networks-description": "Bucurați-vă de comisioane minime", - "page-index-cta-networks-label": "Alegeți o rețea", "page-index-cta-wallet-description": "Creați conturi și gestionați active", "page-index-cta-wallet-label": "Alegeți un portofel", + "page-index-cta-build-apps-description": "Creați-vă prima aplicație", + "page-index-cta-build-apps-label": "Începeți să dezvoltați", "page-index-description": "Platforma de top pentru aplicații inovatoare și rețele blockchain", "page-index-developers-code-example-description-0": "Construiți o bancă gestionată de codul pe care l-ați programat", "page-index-developers-code-example-description-1": "Creați tokenuri pe care le puteți transfera și utiliza în mai multe aplicații", diff --git a/src/intl/ru/page-index.json b/src/intl/ru/page-index.json index 9a5172ed5f9..445bcd9c557 100644 --- a/src/intl/ru/page-index.json +++ b/src/intl/ru/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Попробовать приложения", "page-index-cta-get-eth-description": "Валюта Ethereum", "page-index-cta-get-eth-label": "Получить ETH", - "page-index-cta-networks-description": "Самые низкие комиссии", - "page-index-cta-networks-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-description": "Ведущая платформа для инновационных приложений и блокчейн-сетей", "page-index-developers-code-example-description-0": "Создайте банк, управляемый запрограммированной вами логикой", "page-index-developers-code-example-description-1": "Создавайте токены, которые можно передавать и использовать в разных приложениях", diff --git a/src/intl/se/page-index.json b/src/intl/se/page-index.json index 21e5d1a9015..b4b9b84c0d0 100644 --- a/src/intl/se/page-index.json +++ b/src/intl/se/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Prova appar", "page-index-cta-get-eth-description": "Ethereum-valutan", "page-index-cta-get-eth-label": "Skaffa ETH", - "page-index-cta-networks-description": "Dra fördel av minimala avgifter", - "page-index-cta-networks-label": "Välj ett nätverk", "page-index-cta-wallet-description": "Skapa konton och hantera tillgångar", "page-index-cta-wallet-label": "Välj en plånbok", + "page-index-cta-build-apps-description": "Skapa er första app", + "page-index-cta-build-apps-label": "Börja utveckla", "page-index-description": "Den ledande plattformen för innovativa appar och blockkedjenätverk", "page-index-developers-code-example-description-0": "Bygg en bank som drivs av logik du har programmerat", "page-index-developers-code-example-description-1": "Skapa tokens som du kan överföra och använda mellan olika applikationer", diff --git a/src/intl/sk/page-index.json b/src/intl/sk/page-index.json index 4077a56606a..e73f5961933 100644 --- a/src/intl/sk/page-index.json +++ b/src/intl/sk/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Vyskúšajte aplikácie", "page-index-cta-get-eth-description": "Mena Ethereum", "page-index-cta-get-eth-label": "Získať ETH", - "page-index-cta-networks-description": "Užite si minimálne poplatky", - "page-index-cta-networks-label": "Vyberte si sieť", "page-index-cta-wallet-description": "Vytvoriť si učty a spravujte aktíva", "page-index-cta-wallet-label": "Vyberte si peňaženku", + "page-index-cta-build-apps-description": "Vytvorte svoju prvú aplikáciu", + "page-index-cta-build-apps-label": "Začnite vyvíjať", "page-index-description": "Popredná platforma pre inovatívne aplikácie a blockchainové siete", "page-index-developers-code-example-description-0": "Vybudujte banku poháňanú logikou, ktorú ste naprogramovali", "page-index-developers-code-example-description-1": "Vytvárajte tokeny, ktoré môžete prenášať a používať v rôznych aplikáciách", diff --git a/src/intl/sl/page-index.json b/src/intl/sl/page-index.json index f82acaa0589..9fe76487a92 100644 --- a/src/intl/sl/page-index.json +++ b/src/intl/sl/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Preizkusi aplikacije", "page-index-cta-get-eth-description": "Valuta na Ethereum", "page-index-cta-get-eth-label": "Pridobite ETH", - "page-index-cta-networks-description": "Uživajte v minimalnih provizijah", - "page-index-cta-networks-label": "Izberite omrežje", "page-index-cta-wallet-description": "Ustvarite račune in upravljajte sredstva", "page-index-cta-wallet-label": "Izberite denarnico", + "page-index-cta-build-apps-description": "Ustvarite svojo prvo aplikacijo", + "page-index-cta-build-apps-label": "Začnite razvijati", "page-index-description": "Vodilna platforma za inovativne aplikacije in omrežja verige blokov", "page-index-developers-code-example-description-0": "Ustvarite banko, ki jo poganja logika, ki ste jo programirali sami", "page-index-developers-code-example-description-1": "Ustvarite žetone, ki jih lahko prenašate in uporabljate v različnih aplikacijah", diff --git a/src/intl/sn/page-index.json b/src/intl/sn/page-index.json index 0f6dd02f9b6..dcf151c466f 100644 --- a/src/intl/sn/page-index.json +++ b/src/intl/sn/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Edza maapu", "page-index-cta-get-eth-description": "Mari yeEthereum", "page-index-cta-get-eth-label": "Tora ETH", - "page-index-cta-networks-description": "Nakidzwa muripo uri pasi-pasi", - "page-index-cta-networks-label": "Sarudza netiweki", "page-index-cta-wallet-description": "Gadzira maakaundi uye utarisire zvakanaka midziyo inokosha", "page-index-cta-wallet-label": "Sarudza chikwama", + "page-index-cta-build-apps-description": "Gadzira app yako yekutanga", + "page-index-cta-build-apps-label": "Tangai kugadzira", "page-index-description": "Puratifomu yemberi inowanikwa maapu ekuitisa hudobidobi uye ine manetiweki emakambani makuru", "page-index-developers-code-example-description-0": "Gadzira bhanga rinosundwa nepfungwa dzawakaruka wega", "page-index-developers-code-example-description-1": "Gadzira matokeni aunogona kutumira kumwe uye kushandisa pamaapu akawanda", diff --git a/src/intl/sr/page-index.json b/src/intl/sr/page-index.json index f4da4ec553b..3f35086b79b 100644 --- a/src/intl/sr/page-index.json +++ b/src/intl/sr/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Isprobajte aplikacije", "page-index-cta-get-eth-description": "Valuta Ethereum-a", "page-index-cta-get-eth-label": "Uzmi ETH", - "page-index-cta-networks-description": "Uživajte u minimalnim provizijama", - "page-index-cta-networks-label": "Izaberite mrežu", "page-index-cta-wallet-description": "Kreirajte račune i upravljajte sredstvima", "page-index-cta-wallet-label": "Odaberi novčanik", + "page-index-cta-build-apps-description": "Kreirajte svoju prvu aplikaciju", + "page-index-cta-build-apps-label": "Počnite razvoj", "page-index-description": "Vodeća platforma za inovativne aplikacije i mreže lanca blokova", "page-index-developers-code-example-description-0": "Izgradite banku koju pokreće logika koju ste programirali", "page-index-developers-code-example-description-1": "Kreirajte tokene koje možete da prenosite i koristite u različitim aplikacijama", diff --git a/src/intl/sw/page-index.json b/src/intl/sw/page-index.json index 53edfb9caec..c74fed64c0f 100644 --- a/src/intl/sw/page-index.json +++ b/src/intl/sw/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Jaribu programu", "page-index-cta-get-eth-description": "Sarafu ya Ethereum", "page-index-cta-get-eth-label": "Pata ETH", - "page-index-cta-networks-description": "Furahia ada za chini", - "page-index-cta-networks-label": "Chagua mtandao", "page-index-cta-wallet-description": "Tengeneza akaunti & uthibiti mali", "page-index-cta-wallet-label": "Chagua pochi", + "page-index-cta-build-apps-description": "Tengeneza app yako ya kwanza", + "page-index-cta-build-apps-label": "Anza kuendeleza", "page-index-description": "Jukwaa linaloongoza la programu bunifu na mitandao ya blockchain", "page-index-developers-code-example-description-0": "Unda benki inayoendeshwa na mantiki uliyopanga", "page-index-developers-code-example-description-1": "Unda tokeni ambazo unaweza kuhamisha na kutumia katika programu tofauti", diff --git a/src/intl/ta/page-index.json b/src/intl/ta/page-index.json index 0706bcc355b..84429f87fed 100644 --- a/src/intl/ta/page-index.json +++ b/src/intl/ta/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "செயலிகளை முயற்சிக்கவும்", "page-index-cta-get-eth-description": "Ethereum -இன் நாணயம்", "page-index-cta-get-eth-label": "ETH பெறுக", - "page-index-cta-networks-description": "குறைந்தபட்ச கட்டணத்தை மகிழ்ந்திடுங்கள்", - "page-index-cta-networks-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-description": "புதுமையான செயலிகள் மற்றும் பிளாக்செயின் பிணையங்களுக்கான முன்னணி தளம்", "page-index-developers-code-example-description-0": "நீங்கள் புரோகிராம் செய்த லாஜிக் மூலம் இயங்கும் ஒரு வங்கியை உருவாக்கிடுங்கள்", "page-index-developers-code-example-description-1": "நாணயப் பரிமாற்றம் செய்து அனைத்துச் செயலிகளிலும் பயன்படுத்துவதற்கான டோக்கன்களை உருவாக்கிடுங்கள்", diff --git a/src/intl/te/page-index.json b/src/intl/te/page-index.json index 26d0d062a7a..98f29527ce1 100644 --- a/src/intl/te/page-index.json +++ b/src/intl/te/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "యాప్‌లను ప్రయత్నించండి", "page-index-cta-get-eth-description": "Ethereum యొక్క కరెన్సీ", "page-index-cta-get-eth-label": "ETHను పొందండి", - "page-index-cta-networks-description": "కనిష్ట రుసుములతో ఆనందించండి", - "page-index-cta-networks-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-description": "వినూత్న యాప్‌లు మరియు బ్లాక్‌చెయిన్ నెట్‌వర్క్‌ల కోసం ప్రముఖ ప్లాట్‌ఫారమ్", "page-index-developers-code-example-description-0": "మీరు ప్రోగ్రామ్ చేసిన లాజిక్‌తో నడిచే బ్యాంక్‌ను మీరు నిర్మించుకోవచ్చు", "page-index-developers-code-example-description-1": "మీరు అప్లికేషన్లలో బదిలీ చేయగల మరియు ఉపయోగించగల టోకెన్‌లను సృష్టించండి", diff --git a/src/intl/th/page-index.json b/src/intl/th/page-index.json index 991ce9a193e..7c8dca97e3e 100644 --- a/src/intl/th/page-index.json +++ b/src/intl/th/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "ลองใช้แอป", "page-index-cta-get-eth-description": "สกุลเงินของอีเธอเรียม", "page-index-cta-get-eth-label": "รับ ETH", - "page-index-cta-networks-description": "ใช้งานโดยมีค่าธรรมเนียมขั้นต่ำ", - "page-index-cta-networks-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-description": "แพลตฟอร์มชั้นนำสำหรับแอปที่เป็นนวัตกรรมและเครือข่าย blockchain", "page-index-developers-code-example-description-0": "สร้างธนาคารที่ทำงานด้วยตรรกะที่คุณเขียนโปรแกรมเอง", "page-index-developers-code-example-description-1": "สร้างโทเค็นที่สามารถถ่ายโอนและใช้ระหว่างแอปพลิเคชันต่าง ๆ ได้", diff --git a/src/intl/tk/page-index.json b/src/intl/tk/page-index.json index d9afbaa911d..886e5f4cc32 100644 --- a/src/intl/tk/page-index.json +++ b/src/intl/tk/page-index.json @@ -35,10 +35,10 @@ "page-index-cta-dapps-label": "Programmalary barlap görüň", "page-index-cta-get-eth-description": "Ethereumyň walýutasy", "page-index-cta-get-eth-label": "ETH edinmek", - "page-index-cta-networks-description": "Iň az töleglerden peýdalanyň", - "page-index-cta-networks-label": "Tor saýlaň", "page-index-cta-wallet-description": "Hasap dörediň we aktiwleri dolandyryň", "page-index-cta-wallet-label": "Gapjyk saýlaň", + "page-index-cta-build-apps-description": "Ilkinji apyňyzy dörediň", + "page-index-cta-build-apps-label": "Ösdürmegi başlaň", "page-index-description": "Innowasiýa programmalary we blokçeýn torlary üçin öňdebaryjy platforma", "page-index-developers-code-example-description-0": "Öz programmirlän logikaňyz bilen işleýän bank guruň", "page-index-developers-code-example-description-1": "Programmalaryň arasynda geçirip we ulanyp boljak tokenleri dörediň", diff --git a/src/intl/tl/page-index.json b/src/intl/tl/page-index.json index b982adac1c9..d995fb77113 100644 --- a/src/intl/tl/page-index.json +++ b/src/intl/tl/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Subukan ang mga app", "page-index-cta-get-eth-description": "Ang currency ng Ethereum", "page-index-cta-get-eth-label": "Kumuha ng ETH", - "page-index-cta-networks-description": "I-enjoy ang mabababang bayarin", - "page-index-cta-networks-label": "Pumili ng network", "page-index-cta-wallet-description": "Gumawa ng mga account at pamahalaan ang mga asset", "page-index-cta-wallet-label": "Pumili ng wallet", + "page-index-cta-build-apps-description": "Lumikha ng iyong unang app", + "page-index-cta-build-apps-label": "Simulan ang pagbuo", "page-index-description": "Ang nangungunang platform para sa mga makabagong app at network ng blockchain", "page-index-developers-code-example-description-0": "Magtayo ng bangko na pinapagana ng lohikang ikaw ang nagprograma", "page-index-developers-code-example-description-1": "Gumawa ng mga token na maaaring mailipat at magagamit sa iba't ibang application", diff --git a/src/intl/tr/page-index.json b/src/intl/tr/page-index.json index 76783026d33..024492d97fc 100644 --- a/src/intl/tr/page-index.json +++ b/src/intl/tr/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Uygulamaları deneyin", "page-index-cta-get-eth-description": "Ethereum para birimi", "page-index-cta-get-eth-label": "ETH edinin", - "page-index-cta-networks-description": "Düşük ücretlerden yararlanın", - "page-index-cta-networks-label": "Bir ağ seçin", "page-index-cta-wallet-description": "Hesaplar oluşturun ve varlıkları yönetin", "page-index-cta-wallet-label": "Bir cüzdan seçin", + "page-index-cta-build-apps-description": "İlk uygulamanızı oluşturun", + "page-index-cta-build-apps-label": "Geliştirmeye başlayın", "page-index-description": "Yenilikçi uygulamalar ve blok zinciri ağları için lider platform", "page-index-developers-code-example-description-0": "Programlamış olduğunuz mantıkla desteklenen bir banka kurun", "page-index-developers-code-example-description-1": "Uygulamalar arasında transfer edebileceğiniz ve kullanabileceğiniz jetonlar oluşturun", diff --git a/src/intl/tw/page-index.json b/src/intl/tw/page-index.json index 8936901ed6e..557a820c4e9 100644 --- a/src/intl/tw/page-index.json +++ b/src/intl/tw/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "So apps no hwe", "page-index-cta-get-eth-description": "Ethereum sika no", "page-index-cta-get-eth-label": "Nya ETH no bi", - "page-index-cta-networks-description": "Nya enigye fri ka ketewaa mu", - "page-index-cta-networks-label": "Fa netwek", "page-index-cta-wallet-description": "Ye akawnt na manegye agyapade", "page-index-cta-wallet-label": "Pɛ sika kotoku", + "page-index-cta-build-apps-description": "Yɛ wo app a edi kan", + "page-index-cta-build-apps-label": "Hyɛ ase yɛ adwuma", "page-index-description": "Beae aa edikan di ma apps afoforo ne blockchain netweks", "page-index-developers-code-example-description-0": "Fa logic aa waye no si bank", "page-index-developers-code-example-description-1": "Ye token aa wobetumi amena na wode edi dwuma wɔ aplikeshins ahorow nyinaa mu", diff --git a/src/intl/uk/page-index.json b/src/intl/uk/page-index.json index 775ed647df2..9377120349e 100644 --- a/src/intl/uk/page-index.json +++ b/src/intl/uk/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Скористайтеся програмами", "page-index-cta-get-eth-description": "Валюта Ethereum", "page-index-cta-get-eth-label": "Отримати ETH", - "page-index-cta-networks-description": "Скористайтеся перевагами мінімальної комісії", - "page-index-cta-networks-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-description": "Провідна платформа інноваційних програм і блокчейн-мереж", "page-index-developers-code-example-description-0": "Створіть банк, який користається запрограмованою вами логікою", "page-index-developers-code-example-description-1": "Створюйте токени, які можна переносити в інші програми та використовувати в них", diff --git a/src/intl/ur/page-index.json b/src/intl/ur/page-index.json index 39c04606a8d..564dafcd3d2 100644 --- a/src/intl/ur/page-index.json +++ b/src/intl/ur/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "ایپس آزمائیں", "page-index-cta-get-eth-description": "Ethereum کی کرنسی", "page-index-cta-get-eth-label": "ETH حاصل کریں", - "page-index-cta-networks-description": "کم ترین فیس سے لطف اندوز ہوں", - "page-index-cta-networks-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-description": "جدید ایپس اور بلاک چین نیٹ ورکس کے لیے ایک سرکردہ پلیٹ فارم", "page-index-developers-code-example-description-0": "اپنی پروگرام کردہ لاجک کے ذریعے تقویت یافتہ بینک بنائیں", "page-index-developers-code-example-description-1": "ایسے ٹوکنز تخلیق کریں جو آپ ٹرانسفر کر سکتے ہیں اور ایپلیکیشنز میں استعمال کر سکتے ہیں", diff --git a/src/intl/uz/page-index.json b/src/intl/uz/page-index.json index 1f9b527bd1c..cade4d136ec 100644 --- a/src/intl/uz/page-index.json +++ b/src/intl/uz/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Ilovalarni sinash", "page-index-cta-get-eth-description": "Ethereum valyutasi", "page-index-cta-get-eth-label": "ETH olish", - "page-index-cta-networks-description": "Minimal toʻlovlardan zavqlaning", - "page-index-cta-networks-label": "Tarmoqni tanlang", "page-index-cta-wallet-description": "Hisoblar yaratish va aktivlarni boshqarish", "page-index-cta-wallet-label": "Hamyonni tanlang", + "page-index-cta-build-apps-description": "Birinchi ilovangizni yarating", + "page-index-cta-build-apps-label": "Rivojlantirishni boshlang", "page-index-description": "Innovatsion ilovalar va blokcheyn tarmoqlari boʻyicha yetakchi platforma", "page-index-developers-code-example-description-0": "Siz dasturlashtirgan mantiq bilan boshqariladigan bank yarating", "page-index-developers-code-example-description-1": "Ilovalar boʻylab uzatishingiz va ishlatishingiz mumkin boʻlgan tokenlarni yarating", diff --git a/src/intl/vi/page-index.json b/src/intl/vi/page-index.json index e2770054a5a..b30c6b9462e 100644 --- a/src/intl/vi/page-index.json +++ b/src/intl/vi/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "Dùng thử ứng dụng", "page-index-cta-get-eth-description": "Tiền tệ của Ethereum", "page-index-cta-get-eth-label": "Mua ETH", - "page-index-cta-networks-description": "Tận hưởng mức phí tối thiểu", - "page-index-cta-networks-label": "Chọn một mạng", "page-index-cta-wallet-description": "Tạo tài khoản & quản lý tài sản", "page-index-cta-wallet-label": "Chọn ví", + "page-index-cta-build-apps-description": "Hãy tạo ứng dụng đầu tiên của quý vị", + "page-index-cta-build-apps-label": "Bắt đầu phát triển", "page-index-description": "Nền tảng hàng đầu cho các ứng dụng sáng tạo và mạng chuỗi khối", "page-index-developers-code-example-description-0": "Xây dựng một ngân hàng được vận hành bằng logic mà bạn đã lập trình", "page-index-developers-code-example-description-1": "Tạo token mà bạn có thể chuyển và sử dụng trên nhiều ứng dụng", diff --git a/src/intl/yo/page-index.json b/src/intl/yo/page-index.json index 3867d36a505..f70089cb8b7 100644 --- a/src/intl/yo/page-index.json +++ b/src/intl/yo/page-index.json @@ -36,10 +36,10 @@ "page-index-cta-dapps-label": "Gbìyànjú àwọn ohun èlò ẹ̀rọ", "page-index-cta-get-eth-description": "Owó ti Ethereum", "page-index-cta-get-eth-label": "Gba ETH", - "page-index-cta-networks-description": "Jẹ ìgbádùn owó péréte", - "page-index-cta-networks-label": "Yan nẹ́tíwọọkì kan", "page-index-cta-wallet-description": "Ṣẹ̀dá àkántì àti ṣàkóso àwọn ohun-ìní", "page-index-cta-wallet-label": "Mú wọ́lẹ́ẹ́tì kan", + "page-index-cta-build-apps-description": "Ṣẹda app rẹ̀ àkọ́kọ́́", + "page-index-cta-build-apps-label": "Bẹrẹ idagbasoke", "page-index-description": "Pẹpẹ asíwájú fún àwọn ohun èlò tuntun àti àwọn nẹ́tíwọọkì blockchain", "page-index-developers-code-example-description-0": "Kọ́ bánkì kan tí ó ní agbára nípasẹ̀ ọgbọ́n tí o ti ṣètò", "page-index-developers-code-example-description-1": "Ṣẹ̀dá tọ́kẹ̀n tí o lè fi ránṣẹ́ tàbí lò lorí àwọn ohun èlò ẹ̀ro", diff --git a/src/intl/zh-tw/page-index.json b/src/intl/zh-tw/page-index.json index 9e5e14461ef..9bd6258e931 100644 --- a/src/intl/zh-tw/page-index.json +++ b/src/intl/zh-tw/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "嘗試應用程式", "page-index-cta-get-eth-description": "以太坊的貨幣", "page-index-cta-get-eth-label": "取得以太幣", - "page-index-cta-networks-description": "享用最低額度的費用", - "page-index-cta-networks-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-description": "區塊鏈網路與創新應用程式的頂尖平台", "page-index-developers-code-example-description-0": "建置由自已寫出來的邏輯所支援的銀行", "page-index-developers-code-example-description-1": "製作可跨應用程式轉移和使用的代幣", diff --git a/src/intl/zh/page-index.json b/src/intl/zh/page-index.json index 332692c1a45..1755afc5a99 100644 --- a/src/intl/zh/page-index.json +++ b/src/intl/zh/page-index.json @@ -37,10 +37,10 @@ "page-index-cta-dapps-label": "试用应用程序", "page-index-cta-get-eth-description": "以太坊的货币", "page-index-cta-get-eth-label": "获取以太币", - "page-index-cta-networks-description": "享受最低收费", - "page-index-cta-networks-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-description": "创新应用程序和区块链网络的首要平台", "page-index-developers-code-example-description-0": "用你编写的逻辑构建银行", "page-index-developers-code-example-description-1": "创建可跨应用程序转账和使用的代币", diff --git a/src/layouts/Docs.tsx b/src/layouts/Docs.tsx index 10ec8387c92..c83b9cedb64 100644 --- a/src/layouts/Docs.tsx +++ b/src/layouts/Docs.tsx @@ -34,6 +34,7 @@ import YouTube from "@/components/YouTube" import { cn } from "@/lib/utils/cn" import { getEditPath } from "@/lib/utils/editPath" +import { addSlashes } from "@/lib/utils/url" const baseHeadingClasses = "font-bold scroll-mt-40 break-words" @@ -133,7 +134,7 @@ export const DocsLayout = ({ className="flex justify-between bg-background-highlight lg:pe-8" dir={contentNotTranslated ? "ltr" : "unset"} > - +

    {frontmatter.title}

    Date: Fri, 30 May 2025 18:33:09 +0800 Subject: [PATCH 060/171] fix: correct terminology in accounts page for consistency between transaction and message terms --- public/content/developers/docs/accounts/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/developers/docs/accounts/index.md b/public/content/developers/docs/accounts/index.md index 83dc26d1e80..5572ced5329 100644 --- a/public/content/developers/docs/accounts/index.md +++ b/public/content/developers/docs/accounts/index.md @@ -4,7 +4,7 @@ description: An explanation of Ethereum accounts – their data structures and t lang: en --- -An Ethereum account is an entity with an ether (ETH) balance that can send transactions on Ethereum. Accounts can be user-controlled or deployed as smart contracts. +An Ethereum account is an entity with an ether (ETH) balance that can send messages on Ethereum. Accounts can be user-controlled or deployed as smart contracts. ## Prerequisites {#prerequisites} @@ -34,7 +34,7 @@ Both account types have the ability to: **Contract** - Creating a contract has a cost because you're using network storage -- Can only send transactions in response to receiving a transaction +- Can only send messages in response to receiving a transaction - Transactions from an external account to a contract account can trigger code which can execute many different actions, such as transferring tokens or even creating a new contract - Contract accounts don't have private keys. Instead, they are controlled by the logic of the smart contract code From 3d8f802f7bb22d36c0dbd7be381bd991acf59d99 Mon Sep 17 00:00:00 2001 From: chainide-agent-bob Date: Fri, 30 May 2025 18:44:43 +0800 Subject: [PATCH 061/171] docs: add Web3.js sunset warning to JavaScript API libraries page and all translations --- public/content/developers/docs/apis/javascript/index.md | 2 ++ .../translations/de/developers/docs/apis/javascript/index.md | 2 ++ .../translations/el/developers/docs/apis/javascript/index.md | 2 ++ .../translations/es/developers/docs/apis/javascript/index.md | 2 ++ .../translations/fr/developers/docs/apis/javascript/index.md | 2 ++ .../translations/hu/developers/docs/apis/javascript/index.md | 2 ++ .../translations/id/developers/docs/apis/javascript/index.md | 2 ++ .../translations/it/developers/docs/apis/javascript/index.md | 2 ++ .../translations/ja/developers/docs/apis/javascript/index.md | 2 ++ .../translations/pl/developers/docs/apis/javascript/index.md | 2 ++ .../zh-tw/developers/docs/apis/javascript/index.md | 2 ++ .../translations/zh/developers/docs/apis/javascript/index.md | 4 ++++ 12 files changed, 26 insertions(+) diff --git a/public/content/developers/docs/apis/javascript/index.md b/public/content/developers/docs/apis/javascript/index.md index c0c5139cac9..d2155c031df 100644 --- a/public/content/developers/docs/apis/javascript/index.md +++ b/public/content/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ These libraries abstract away much of the complexity of interacting directly wit Using providers, these libraries allow you to connect to Ethereum and read its data, whether that's over JSON-RPC, INFURA, Etherscan, Alchemy or MetaMask. +> **Warning:** Web3.js will be archived on March 4, 2025. [Read the announcement](https://blog.chainsafe.io/web3-js-sunset/). Consider using alternative libraries like Ethers.js or viem for new projects. + **Ethers example** ```js diff --git a/public/content/translations/de/developers/docs/apis/javascript/index.md b/public/content/translations/de/developers/docs/apis/javascript/index.md index e4a3e1818e5..d565c9ad348 100644 --- a/public/content/translations/de/developers/docs/apis/javascript/index.md +++ b/public/content/translations/de/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ Mit diesen Programmbibliotheken lässt sich die direkte Interaktion mit einem Et Sie können sich über einen Provider und diese Bibliotheken mit Ethereum verbinden und die Daten auslesen – über JSON-RPC, INFURA, Etherscan, Alchemy oder MetaMask. +> **Warnung:** Web3.js wird am 4. März 2025 archiviert. [Lesen Sie die Ankündigung](https://blog.chainsafe.io/web3-js-sunset/). Erwägen Sie die Verwendung alternativer Bibliotheken wie Ethers.js oder viem für neue Projekte. + **Ether-Beispiel** ```js diff --git a/public/content/translations/el/developers/docs/apis/javascript/index.md b/public/content/translations/el/developers/docs/apis/javascript/index.md index aa9eb34ee52..e73f0c46615 100644 --- a/public/content/translations/el/developers/docs/apis/javascript/index.md +++ b/public/content/translations/el/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ lang: el Χρησιμοποιώντας τους παρόχους, αυτές οι βιβλιοθήκες σας επιτρέπουν να συνδεθείτε στο Ethereum και να διαβάσετε τα δεδομένα του, είτε αυτό είναι μέσω JSON-RPC, INFURA, Etherscan, Alchemy ή MetaMask. +> **Προειδοποίηση:** Το Web3.js θα αρχειοθετηθεί στις 4 Μαρτίου 2025. [Διαβάστε την ανακοίνωση](https://blog.chainsafe.io/web3-js-sunset/). Εξετάστε τη χρήση εναλλακτικών βιβλιοθηκών όπως το Ethers.js ή το viem για νέα έργα. + **Παράδειγμα Ethers** ```js diff --git a/public/content/translations/es/developers/docs/apis/javascript/index.md b/public/content/translations/es/developers/docs/apis/javascript/index.md index 621c418c30c..36900a34890 100644 --- a/public/content/translations/es/developers/docs/apis/javascript/index.md +++ b/public/content/translations/es/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ Estas bibliotecas eliminan en gran parte la complejidad de interactuar directame Mediante proveedores, estas bibliotecas le permiten conectarse a Ethereum y leer sus datos, ya sea sobre JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask. +> **Advertencia:** Web3.js será archivado el 4 de marzo de 2025. [Lea el anuncio](https://blog.chainsafe.io/web3-js-sunset/). Considere usar bibliotecas alternativas como Ethers.js o viem para nuevos proyectos. + **Ejemplo de Ethers** ```js diff --git a/public/content/translations/fr/developers/docs/apis/javascript/index.md b/public/content/translations/fr/developers/docs/apis/javascript/index.md index eb548469d3c..61af196d0d4 100644 --- a/public/content/translations/fr/developers/docs/apis/javascript/index.md +++ b/public/content/translations/fr/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ Ces bibliothèques suppriment une grande partie de la complexité d'une interact En utilisant des fournisseurs, les bibliothèques vous permettent de vous connecter à Ethereum et de lire ses données, que ce soit sur JSON-RPC, INFURA, Etherscan, Alchemy ou Metamask. +> **Avertissement :** Web3.js sera archivé le 4 mars 2025. [Lire l'annonce](https://blog.chainsafe.io/web3-js-sunset/). Envisagez d'utiliser des bibliothèques alternatives comme Ethers.js ou viem pour les nouveaux projets. + **Exemple Ether** ```js diff --git a/public/content/translations/hu/developers/docs/apis/javascript/index.md b/public/content/translations/hu/developers/docs/apis/javascript/index.md index 8356791c6f7..ac50331137c 100644 --- a/public/content/translations/hu/developers/docs/apis/javascript/index.md +++ b/public/content/translations/hu/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ Ezek a könyvtárak elveszik a komplexitás nagy részét, mely Ethereum csomóp Szolgáltatók használatakor ezen könyvtárak használatával rácsatlakozhat az Ethereumra és kiolvashatja az adatait, függetlenül attól, hogy JSON-RPC, INFURA, Etherscan, Alchemy vagy MetaMask rendszeren keresztül történik. +> **Figyelmeztetés:** A Web3.js 2025. március 4-én archiválásra kerül. [Olvasd el a bejelentést](https://blog.chainsafe.io/web3-js-sunset/). Fontold meg alternatív könyvtárak, például az Ethers.js vagy a viem használatát új projektekhez. + **Példa az Ethers-re** ```js diff --git a/public/content/translations/id/developers/docs/apis/javascript/index.md b/public/content/translations/id/developers/docs/apis/javascript/index.md index 6c2e0446e67..8288aec5d00 100644 --- a/public/content/translations/id/developers/docs/apis/javascript/index.md +++ b/public/content/translations/id/developers/docs/apis/javascript/index.md @@ -24,6 +24,8 @@ Pustaka ini menyederhanakan banyak kerumitan dalam interaksi langsung dengan nod Menggunakan penyedia, pustaka ini memungkinkan Anda terhubung ke Ethereum dan membaca datanya, baik itu melalui JSON-RPC, INFURA, Etherscan, Alchemy, atau MetaMask. +> **Peringatan:** Web3.js akan diarsipkan pada 4 Maret 2025. [Baca pengumuman](https://blog.chainsafe.io/web3-js-sunset/). Pertimbangkan untuk menggunakan pustaka alternatif seperti Ethers.js atau viem untuk proyek baru. + **Contoh Ether** ```js diff --git a/public/content/translations/it/developers/docs/apis/javascript/index.md b/public/content/translations/it/developers/docs/apis/javascript/index.md index a52a7de1446..56a1edbc3bc 100644 --- a/public/content/translations/it/developers/docs/apis/javascript/index.md +++ b/public/content/translations/it/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ Queste librerie eliminano buona parte della complessità legata al dover interag Utilizzando i provider, queste librerie consentono di connettersi a Ethereum e leggerne i dati, tramite JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask. +> **Peringatan:** Web3.js akan diarsipkan pada 4 Maret 2025. [Baca pengumuman](https://blog.chainsafe.io/web3-js-sunset/). Pertimbangkan untuk menggunakan pustaka alternatif seperti Ethers.js atau viem untuk proyek baru. + **Esempio da Ethers** ```js diff --git a/public/content/translations/ja/developers/docs/apis/javascript/index.md b/public/content/translations/ja/developers/docs/apis/javascript/index.md index a029f117755..1086c39492c 100644 --- a/public/content/translations/ja/developers/docs/apis/javascript/index.md +++ b/public/content/translations/ja/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ JavaScriptを理解している必要があります。また、[イーサリア providersライブラリを使用することで、JSON-RPC、INFURA、Etherscan、AlchemyまたはMetaMaskであっても、イーサリアムに接続してデータを読み取ることができます。 +> **警告:** Web3.js は2025年3月4日にアーカイブされます。[お知らせを読む](https://blog.chainsafe.io/web3-js-sunset/)。新規プロジェクトでは、Ethers.js や viem などの代替ライブラリの使用を検討してください。 + **Ethers.jsを使った例** ```js diff --git a/public/content/translations/pl/developers/docs/apis/javascript/index.md b/public/content/translations/pl/developers/docs/apis/javascript/index.md index c483ef2788c..26f42ce6ae1 100644 --- a/public/content/translations/pl/developers/docs/apis/javascript/index.md +++ b/public/content/translations/pl/developers/docs/apis/javascript/index.md @@ -24,6 +24,8 @@ Biblioteki te eliminują znaczną złożoność interakcji bezpośrednio z węz Korzystając z dostawców, biblioteki te pozwalają Ci połączyć się z Ethereum i przeczytać jego dane, niezależnie od tego, czy chodzi o JSON-RPC, INFURA, Etherscan, Alchemy czy MetaMask. +> **Ostrzeżenie:** Web3.js zostanie zarchiwizowany 4 marca 2025 r. [Przeczytaj ogłoszenie](https://blog.chainsafe.io/web3-js-sunset/). Rozważ użycie alternatywnych bibliotek, takich jak Ethers.js lub viem dla nowych projektów. + **Przykładowy Ether** ```js diff --git a/public/content/translations/zh-tw/developers/docs/apis/javascript/index.md b/public/content/translations/zh-tw/developers/docs/apis/javascript/index.md index 4b74d4a50c2..9afad183837 100644 --- a/public/content/translations/zh-tw/developers/docs/apis/javascript/index.md +++ b/public/content/translations/zh-tw/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ lang: zh-tw 使用提供者,這些程式庫讓你能夠連結到以太坊並讀取其資料,無論是透過 JSON-RPC、INFURA、Etherscan、Alchemy 還是 MetaMask。 +> **警告:** Web3.js 將於 2025 年 3 月 4 日被歸檔。[閱讀公告](https://blog.chainsafe.io/web3-js-sunset/)。建議在新項目中使用其他替代庫,如 Ethers.js 或 viem。 + **Ethers 範例** ```js diff --git a/public/content/translations/zh/developers/docs/apis/javascript/index.md b/public/content/translations/zh/developers/docs/apis/javascript/index.md index 02548f5b65a..518b8e18768 100644 --- a/public/content/translations/zh/developers/docs/apis/javascript/index.md +++ b/public/content/translations/zh/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ lang: zh 使用提供程序,这些库允许你连接到以太坊并读取它的数据,不管是通过 JSON-RPC、INFURA、Etherscan、Alchemy 还是 Metamask。 +> **警告:** Web3.js 将于 2025 年 3 月 4 日被归档。[阅读公告](https://blog.chainsafe.io/web3-js-sunset/)。建议在新项目中使用其他替代库,如 Ethers.js 或 viem。 + **Ethers 示例** ```js @@ -239,6 +241,8 @@ ethers.utils.formatEther(balance) **Web3.js -** **_以太坊 JavaScript API。_** +> **警告:** Web3.js 将于 2025 年 3 月 4 日被归档。[阅读公告](https://blog.chainsafe.io/web3-js-sunset/)。建议在新项目中使用其他替代库,如 Ethers.js 或 viem。 + - [相关文档](https://docs.web3js.org/) - [GitHub](https://github.com/ethereum/web3.js/) From 7b6e6035177a5fe6543034976d239a430b34a73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Garamv=C3=B6lgyi?= Date: Fri, 30 May 2025 14:43:59 +0200 Subject: [PATCH 062/171] feat: update ambiguous wording about RPC block parameter --- .../developers/docs/apis/json-rpc/index.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/public/content/developers/docs/apis/json-rpc/index.md b/public/content/developers/docs/apis/json-rpc/index.md index 73dac1fc31f..6f7994ab9f3 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -58,9 +58,9 @@ Here are some examples: - WRONG: 0xf0f0f (must be even number of digits) - WRONG: 004200 (must be prefixed 0x) -### The default block parameter {#default-block} +### The block parameter {#block-parameter} -The following methods have an extra default block parameter: +The following methods have a block parameter: - [eth_getBalance](#eth_getbalance) - [eth_getCode](#eth_getcode) @@ -68,9 +68,9 @@ The following methods have an extra default block parameter: - [eth_getStorageAt](#eth_getstorageat) - [eth_call](#eth_call) -When requests are made that act on the state of Ethereum, the last default block parameter determines the height of the block. +When requests are made that query the state of Ethereum, the provided block parameter determines the height of the block. -The following options are possible for the defaultBlock parameter: +The following options are possible for the block parameter: - `HEX String` - an integer block number - `String "earliest"` for the earliest/genesis block @@ -567,7 +567,7 @@ Returns the balance of the account of given address. **Parameters** 1. `DATA`, 20 Bytes - address to check for balance. -2. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"`, or `"finalized"`, see the [default block parameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"`, or `"finalized"`, see the [block parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"] @@ -598,7 +598,7 @@ Returns the value from a storage position at a given address. 1. `DATA`, 20 Bytes - address of the storage. 2. `QUANTITY` - integer of the position in the storage. -3. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"`, `"finalized"`, see the [default block parameter](/developers/docs/apis/json-rpc/#default-block) +3. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"`, `"finalized"`, see the [block parameter](/developers/docs/apis/json-rpc/#block-parameter) **Returns** @@ -665,7 +665,7 @@ Returns the number of transactions _sent_ from an address. **Parameters** 1. `DATA`, 20 Bytes - address. -2. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [default block parameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [block parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -726,7 +726,7 @@ Returns the number of transactions in a block matching the given block number. **Parameters** -1. `QUANTITY|TAG` - integer of a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [default block parameter](/developers/docs/apis/json-rpc/#default-block). +1. `QUANTITY|TAG` - integer of a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [block parameter](/developers/docs/apis/json-rpc/#block-parameter). ```js params: [ @@ -786,7 +786,7 @@ Returns the number of uncles in a block from a block matching the given block nu **Parameters** -1. `QUANTITY|TAG` - integer of a block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [default block parameter](/developers/docs/apis/json-rpc/#default-block) +1. `QUANTITY|TAG` - integer of a block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [block parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -818,7 +818,7 @@ Returns code at a given address. **Parameters** 1. `DATA`, 20 Bytes - address -2. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [default block parameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [block parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -1005,7 +1005,7 @@ Executes a new message call immediately without creating a transaction on the bl - `value`: `QUANTITY` - (optional) Integer of the value sent with this transaction - `input`: `DATA` - (optional) Hash of the method signature and encoded parameters. For details see [Ethereum Contract ABI in the Solidity documentation](https://docs.soliditylang.org/en/latest/abi-spec.html). -2. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [default block parameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` - integer block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [block parameter](/developers/docs/apis/json-rpc/#block-parameter) **Returns** @@ -1132,7 +1132,7 @@ Returns information about a block by block number. **Parameters** -1. `QUANTITY|TAG` - integer of a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [default block parameter](/developers/docs/apis/json-rpc/#default-block). +1. `QUANTITY|TAG` - integer of a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [block parameter](/developers/docs/apis/json-rpc/#block-parameter). 2. `Boolean` - If `true` it returns the full transaction objects, if `false` only the hashes of the transactions. ```js @@ -1247,7 +1247,7 @@ Returns information about a transaction by block number and transaction index po **Parameters** -1. `QUANTITY|TAG` - a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [default block parameter](/developers/docs/apis/json-rpc/#default-block). +1. `QUANTITY|TAG` - a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"` or `"finalized"`, as in the [block parameter](/developers/docs/apis/json-rpc/#block-parameter). 2. `QUANTITY` - the transaction index position. ```js @@ -1373,7 +1373,7 @@ Returns information about a uncle of a block by number and uncle index position. **Parameters** -1. `QUANTITY|TAG` - a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, as in the [default block parameter](/developers/docs/apis/json-rpc/#default-block). +1. `QUANTITY|TAG` - a block number, or the string `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, as in the [block parameter](/developers/docs/apis/json-rpc/#block-parameter). 2. `QUANTITY` - the uncle's index position. ```js From 161b239d028236d11b06e5bdbff845ad08269dc3 Mon Sep 17 00:00:00 2001 From: Tri-stone Date: Tue, 3 Jun 2025 15:08:57 +0800 Subject: [PATCH 063/171] [R4R] typo: Update index.md to fix Execution API webpage URL --- 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 73dac1fc31f..3b4af3c7e3d 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 e78776e0e70d7b060db086a94db2544c14a5ebac Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 4 Jun 2025 18:59:03 +0800 Subject: [PATCH 064/171] Add RANDAO explanation to Node Architecture page --- .../docs/nodes-and-clients/node-architecture/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/developers/docs/nodes-and-clients/node-architecture/index.md index f914047bc8c..cb8a24c4435 100644 --- a/public/content/developers/docs/nodes-and-clients/node-architecture/index.md +++ b/public/content/developers/docs/nodes-and-clients/node-architecture/index.md @@ -49,7 +49,7 @@ Staking and running the validator software makes a node eligible to be selected | Executes/re-executes transactions | Runs the fork choice algorithm | Accrues rewards/penalties | | Verifies incoming state changes | Keeps track of the head of the chain | Makes attestations | | Manages state and receipts tries | Manages the Beacon state (contains consensus and execution info) | Requires 32 ETH to be staked | -| Creates execution payload | Keeps track of accumulated randomness in RANDAO | Can be slashed | +| Creates execution payload | Keeps track of accumulated randomness in RANDAO (an algorithm that provides verifiable randomness for validator selection and other consensus operations) | Can be slashed | | Exposes JSON-RPC API for interacting with Ethereum | Keeps track of justification and finalization | | ## Further reading {#further-reading} From 556a05ce4bfd0b1bb41849bbefabd0a6271fd38c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:46:24 -0700 Subject: [PATCH 065/171] feat: add fade transition for reduced motion --- src/components/Morpher.tsx | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/components/Morpher.tsx b/src/components/Morpher.tsx index b0d302e0596..26ad3e5ae27 100644 --- a/src/components/Morpher.tsx +++ b/src/components/Morpher.tsx @@ -2,6 +2,8 @@ import { useEffect, useRef, useState } from "react" +import { cn } from "@/lib/utils/cn" + import { usePrefersReducedMotion } from "@/hooks/usePrefersReducedMotion" type MorpherProps = { @@ -15,6 +17,7 @@ const Morpher = ({ }: MorpherProps) => { const [currentText, setCurrentText] = useState(words[0]) const [isAnimating, setIsAnimating] = useState(false) + const [isFading, setIsFading] = useState(false) const { prefersReducedMotion } = usePrefersReducedMotion() const morphTimeoutRef = useRef(null) @@ -114,13 +117,18 @@ const Morpher = ({ } useEffect(() => { - // If reduced motion is preferred, show static text cycling + // If reduced motion is preferred, show static text cycling with fade if (prefersReducedMotion) { morphIntervalRef.current = setInterval(() => { - counterRef.current = (counterRef.current + 1) % wordsRef.current.length - const nextWord = wordsRef.current[counterRef.current] - setCurrentText(nextWord) - currentTextRef.current = nextWord + setIsFading(true) + setTimeout(() => { + counterRef.current = + (counterRef.current + 1) % wordsRef.current.length + const nextWord = wordsRef.current[counterRef.current] + setCurrentText(nextWord) + currentTextRef.current = nextWord + setIsFading(false) + }, 150) // Half of the fade duration }, 3000) } else { // Defer animation start by 2 seconds to improve initial page load @@ -159,7 +167,16 @@ const Morpher = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [prefersReducedMotion, charSet]) - return currentText + return ( + + {currentText} + + ) } export default Morpher From 66d62a180b104d54d0f27b22628f17fe49fa4f5c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 8 Jul 2025 17:41:41 -0700 Subject: [PATCH 066/171] fix: use button size="sm" --- src/components/LanguagePicker/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index bd8fa3f6e29..88e4dd17432 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -209,8 +209,9 @@ const LanguagePickerFooter = ({ onTranslationProgramClick }) => {

    {t("get-involved")} From b512385def6369f9712d58a6e5a831078f1e1867 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:45:36 -0700 Subject: [PATCH 067/171] fix: lang picker footer cta logic --- src/components/LanguagePicker/index.tsx | 32 +++++++-- .../LanguagePicker/useLanguagePicker.tsx | 70 +++++++++---------- src/intl/en/common.json | 1 + 3 files changed, 59 insertions(+), 44 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 88e4dd17432..baebd509e80 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -3,10 +3,14 @@ import { useParams } from "next/navigation" import { useLocale } from "next-intl" +import type { LocaleDisplayInfo } from "@/lib/types" + import { ButtonLink } from "@/components/ui/buttons/Button" import { cn } from "@/lib/utils/cn" +import { DEFAULT_LOCALE } from "@/lib/constants" + import { Command, CommandEmpty, @@ -42,7 +46,8 @@ const LanguagePicker = ({ const pathname = usePathname() const { push } = useRouter() const params = useParams() - const { disclosure, languages } = useLanguagePicker(handleClose) + const { disclosure, languages, intlLanguagePreference } = + useLanguagePicker(handleClose) const { isOpen, setValue, onClose, onOpen } = disclosure /** @@ -98,6 +103,7 @@ const LanguagePicker = ({ /> @@ -126,7 +132,10 @@ const LanguagePicker = ({ } /> - + ) @@ -187,21 +196,30 @@ const LanguagePickerMenu = ({ languages, onClose, onSelect }) => { ) } -const LanguagePickerFooter = ({ onTranslationProgramClick }) => { +const LanguagePickerFooter = ({ + intlLanguagePreference, + onTranslationProgramClick, +}: { + intlLanguagePreference?: LocaleDisplayInfo + onTranslationProgramClick: () => void +}) => { const { t } = useTranslation("common") const locale = useLocale() - + console.log({ intlLanguagePreference }) return (
    - {locale == "en" ? ( + {locale === DEFAULT_LOCALE ? (

    - Translate Ethereum.org + {intlLanguagePreference + ? `${t("page-languages-translate-cta-title")} ${t(`language-${intlLanguagePreference.localeOption}`)}` + : "Translate ethereum.org"}

    ) : (

    - Translate to {t(`language-${locale}`)} + {t("page-languages-translate-cta-title")}{" "} + {t(`language-${locale}`)}

    )}

    diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 32f211d5503..340b00099fb 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -17,32 +17,25 @@ export const useLanguagePicker = (handleClose?: () => void) => { const { t } = useTranslation("common") const locale = useLocale() - const languages = useMemo(() => { - const locales = filterRealLocales(LOCALES_CODES) - - // Get the preferred languages for the users browser - const navLangs = typeof navigator !== "undefined" ? navigator.languages : [] - - // For each browser preference, reduce to the most specific match found in `locales` array - const allBrowserLocales: Lang[] = navLangs - .map( - (navLang) => - locales?.reduce((acc, cur) => { - if (cur.toLowerCase() === navLang.toLowerCase()) return cur - if ( - navLang.toLowerCase().startsWith(cur.toLowerCase()) && - acc !== navLang - ) - return cur - return acc - }, "") as Lang - ) - .filter((i) => !!i) // Remove those without matches - - // Remove duplicate matches - const browserLocales = Array.from(new Set(allBrowserLocales)) - - return ( + // Get the preferred language for the users browser + const [navLang] = typeof navigator !== "undefined" ? navigator.languages : [] + const locales = useMemo(() => filterRealLocales(LOCALES_CODES), []) + const intlLocalePreference = useMemo( + () => + locales?.reduce((acc, cur) => { + if (cur.toLowerCase() === navLang.toLowerCase()) return cur + if ( + navLang.toLowerCase().startsWith(cur.toLowerCase()) && + acc !== navLang + ) + return cur + return acc + }, "") as Lang, + [navLang, locales] + ) + + const languages = useMemo( + () => (locales as Lang[]) ?.map((localeOption) => { const displayInfo = localeToDisplayInfo( @@ -50,20 +43,22 @@ export const useLanguagePicker = (handleClose?: () => void) => { locale as Lang, t ) - const isBrowserDefault = browserLocales.includes(localeOption) + const isBrowserDefault = intlLocalePreference === localeOption return { ...displayInfo, isBrowserDefault } }) .sort((a, b) => { - const indexA = browserLocales.indexOf(a.localeOption as Lang) - const indexB = browserLocales.indexOf(b.localeOption as Lang) - if (indexA >= 0 && indexB >= 0) return indexA - indexB - if (indexA >= 0) return -1 - if (indexB >= 0) return 1 - - return a.sourceName.localeCompare(b.sourceName) - }) || [] - ) - }, [locale, t]) + // Always put the browser's preferred language first + if (a.localeOption === intlLocalePreference) return -1 + if (b.localeOption === intlLocalePreference) return 1 + // Otherwise, sort by wordsApproved descending + return (b.wordsApproved ?? 0) - (a.wordsApproved ?? 0) + }) || [], + [intlLocalePreference, locale, locales, t] + ) + + const intlLanguagePreference = languages.find( + (lang) => lang.localeOption === intlLocalePreference + ) const { isOpen, setValue, ...menu } = useDisclosure() @@ -100,5 +95,6 @@ export const useLanguagePicker = (handleClose?: () => void) => { return { disclosure: { isOpen, setValue, onOpen, onClose }, languages, + intlLanguagePreference, } } diff --git a/src/intl/en/common.json b/src/intl/en/common.json index 06ff2f39dad..9f7b0a15275 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -376,6 +376,7 @@ "page-languages-translated": "translated", "page-languages-want-more-header": "Want to see ethereum.org in a different language?", "page-languages-want-more-link": "Translation Program", + "page-languages-translate-cta-title": "Translate to", "page-languages-want-more-paragraph": "ethereum.org translators are always translating pages in as many languages as possible. To see what they're working on right now or to sign up to join them, read about our", "page-languages-words": "words", "page-last-updated": "Page last updated", From 8b78c621caa01047c4b4b65a93083db556ee6522 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 14 Jul 2025 16:00:07 -0700 Subject: [PATCH 068/171] update: LanguagePicker sort logic; abc-order --- src/components/LanguagePicker/useLanguagePicker.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 340b00099fb..01733d819e0 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -50,8 +50,8 @@ export const useLanguagePicker = (handleClose?: () => void) => { // Always put the browser's preferred language first if (a.localeOption === intlLocalePreference) return -1 if (b.localeOption === intlLocalePreference) return 1 - // Otherwise, sort by wordsApproved descending - return (b.wordsApproved ?? 0) - (a.wordsApproved ?? 0) + // Otherwise, sort alphabetically by source name using localeCompare + return a.sourceName.localeCompare(b.sourceName, locale) }) || [], [intlLocalePreference, locale, locales, t] ) From 76a20a900fc000a1c8d70a626dbbd2b8d0671fcf Mon Sep 17 00:00:00 2001 From: Jhonny Vianello <62344609+jhonnyvianello@users.noreply.github.com> Date: Tue, 15 Jul 2025 22:37:50 +0200 Subject: [PATCH 069/171] Add ETHVenice Event MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adding ETHVenice 2025 Event 🏝️🇮🇹 --- src/data/community-events.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/community-events.json b/src/data/community-events.json index 463bc90e68d..bfc2f19eb62 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -179,6 +179,15 @@ "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": "ETHVenice", + "startDate": "2025-10-01", + "endDate": "2025-10-01", + "href": "https://ethvenice.com/", + "location": "Venice, ITA", + "description": "Join the third edition in the beautiful San Servolo Island (Venice), to learn more about Blockchain, Technology and with an eye towards art.", + "imageUrl": "https://ethvenice.com/org/ethvenice.jpg" + }, { "title": "ProtoLayers Conference", "startDate": "2025-10-11", From a043b35a9c3ed8571593a83e69092378aaa65b34 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:10:50 -0700 Subject: [PATCH 070/171] chore: adjust casing --- src/data/community-events.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/community-events.json b/src/data/community-events.json index bfc2f19eb62..b9f0d96308c 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -185,7 +185,7 @@ "endDate": "2025-10-01", "href": "https://ethvenice.com/", "location": "Venice, ITA", - "description": "Join the third edition in the beautiful San Servolo Island (Venice), to learn more about Blockchain, Technology and with an eye towards art.", + "description": "Join the third edition in the beautiful San Servolo Island (Venice), to learn more about blockchain, technology and with an eye towards art.", "imageUrl": "https://ethvenice.com/org/ethvenice.jpg" }, { From edb16142f2a49b12774f14effebb762adb573de3 Mon Sep 17 00:00:00 2001 From: Savio <72797635+Savio-Sou@users.noreply.github.com> Date: Wed, 16 Jul 2025 12:53:33 -0400 Subject: [PATCH 071/171] fix: Update Ambire properties --- src/data/wallets/wallet-data.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index b23ee46521f..9c4eae45299 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -553,21 +553,21 @@ export const walletsData: WalletData[] = [ discord: "https://discord.com/invite/ambire", reddit: "", telegram: "https://t.me/AmbireOfficial", - ios: true, - android: true, + ios: false, + android: false, linux: false, windows: false, macOS: false, firefox: false, - chromium: false, + chromium: true, hardware: false, open_source: true, - repo_url: "https://github.com/ambireTech/wallet", + repo_url: "https://github.com/AmbireTech/extension", non_custodial: true, security_audit: ["https://github.com/ambireTech/wallet#audits"], scam_protection: true, hardware_support: true, - rpc_importing: false, + rpc_importing: true, nft_support: true, connect_to_dapps: true, staking: true, @@ -576,10 +576,10 @@ export const walletsData: WalletData[] = [ gas_fee_customization: true, ens_support: true, erc_20_support: true, - buy_crypto: true, - withdraw_crypto: true, - multisig: true, - social_recovery: true, + buy_crypto: false, + withdraw_crypto: false, + multisig: false, + social_recovery: false, onboard_documentation: "https://help.ambire.com/hc/en-us/categories/4404980091538-Ambire-Wallet", documentation: "", From edb78ad27415d3a4250774a365215fe9fb81765e Mon Sep 17 00:00:00 2001 From: Savio <72797635+Savio-Sou@users.noreply.github.com> Date: Wed, 16 Jul 2025 12:55:55 -0400 Subject: [PATCH 072/171] 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 9c4eae45299..69f0e2e2907 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -541,7 +541,7 @@ export const walletsData: WalletData[] = [ ], }, { - last_updated: "2024-10-30", + last_updated: "2025-07-16", name: "Ambire", image: AmbireImage, twBackgroundColor: "bg-[#aa6aff]", From 0a8e8667a7d21eecaeb0c5356dda11675c260936 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:41:52 -0700 Subject: [PATCH 073/171] migrate: story to tailwind Move placement to organisms/layouts/trilemma as it is comprised of multiple molecules --- src/components/Trilemma/Trilemma.stories.tsx | 34 +++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/components/Trilemma/Trilemma.stories.tsx b/src/components/Trilemma/Trilemma.stories.tsx index e76aefa6104..63253017f7e 100644 --- a/src/components/Trilemma/Trilemma.stories.tsx +++ b/src/components/Trilemma/Trilemma.stories.tsx @@ -1,35 +1,31 @@ -import { Box, ChakraProvider } from "@chakra-ui/react" import { Meta, StoryObj } from "@storybook/react" -import Trilemma from "." +import TrilemmaComponent from "." const meta = { - title: "Molecules / Trilemma", - component: Trilemma, + title: "Organisms / Layouts", + component: TrilemmaComponent, parameters: { layout: "fullscreen", }, decorators: [ (Story) => ( - - - - - +

    + +
    ), ], -} satisfies Meta +} satisfies Meta export default meta type Story = StoryObj -export const Default: Story = { - render: () => , +export const Trilemma: Story = { + render: () => , } From 8aa2d94897fe980b655543f6801596fc56842c13 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:45:48 -0700 Subject: [PATCH 074/171] fix: use bg-gradient classes to match component --- src/components/Trilemma/Trilemma.stories.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/components/Trilemma/Trilemma.stories.tsx b/src/components/Trilemma/Trilemma.stories.tsx index 63253017f7e..d84edf6a17e 100644 --- a/src/components/Trilemma/Trilemma.stories.tsx +++ b/src/components/Trilemma/Trilemma.stories.tsx @@ -10,13 +10,7 @@ const meta = { }, decorators: [ (Story) => ( -
    +
    ), From bcbc4b6bb99bf51229ee71fcbda68aa252d4104b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:49:21 -0700 Subject: [PATCH 075/171] fix: use classes to match container component --- src/components/Trilemma/Trilemma.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Trilemma/Trilemma.stories.tsx b/src/components/Trilemma/Trilemma.stories.tsx index d84edf6a17e..cc414f63c24 100644 --- a/src/components/Trilemma/Trilemma.stories.tsx +++ b/src/components/Trilemma/Trilemma.stories.tsx @@ -10,7 +10,7 @@ const meta = { }, decorators: [ (Story) => ( -
    +
    ), From e0b70a7f5846bca013be25459415dee70e1655bb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:57:57 +0000 Subject: [PATCH 076/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 68d59514760..cf27356d119 100644 --- a/README.md +++ b/README.md @@ -1999,6 +1999,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d otc group
    otc group

    🚧 Savio
    Savio

    🚧 fuder.eth
    fuder.eth

    🚧 + @karelxfi
    @karelxfi

    🔧 From 483016399dfe77289da7f2a8b3388ff752bdc91b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:57:58 +0000 Subject: [PATCH 077/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3f541ff9285..a9f7e5aec6f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12838,6 +12838,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "CXYZTW", + "name": "@karelxfi", + "avatar_url": "https://avatars.githubusercontent.com/u/54091831?v=4", + "profile": "https://github.com/CXYZTW", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 7, From c1e112a39b25aa5c49d82992102186eaba99ba28 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 20:07:57 +0000 Subject: [PATCH 078/171] docs: update README.md [skip ci] --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index cf27356d119..f081aab2b07 100644 --- a/README.md +++ b/README.md @@ -2001,6 +2001,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d fuder.eth
    fuder.eth

    🚧 @karelxfi
    @karelxfi

    🔧 + + Oleg Gorbatiuk
    Oleg Gorbatiuk

    🖋 + From 06f5b7bf23b92fe1ff5174101f2f858942ebeac3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 20:07:59 +0000 Subject: [PATCH 079/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a9f7e5aec6f..280265cd833 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12847,6 +12847,15 @@ "contributions": [ "tool" ] + }, + { + "login": "gorbatiukcom", + "name": "Oleg Gorbatiuk", + "avatar_url": "https://avatars.githubusercontent.com/u/35546483?v=4", + "profile": "https://www.linkedin.com/in/gorbatiuk/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 7, From 76491f7a74cb129ef4288777a0b385130aea88a5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:22:11 -0700 Subject: [PATCH 080/171] feat: pull videos into dedicated section --- app/[locale]/learn/page.tsx | 3 +++ public/content/developers/docs/intro-to-ethereum/index.md | 7 ++++++- src/intl/en/page-learn.json | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/[locale]/learn/page.tsx b/app/[locale]/learn/page.tsx index 94ec5b4c8e0..dc843bbdefe 100644 --- a/app/[locale]/learn/page.tsx +++ b/app/[locale]/learn/page.tsx @@ -691,6 +691,9 @@ export default async function Page({ params }: { params: Promise }) { {" "} {t("bankless-description")} + +

    {t("about-ethereum-video-series")}

    + {t("ethereum-basics-title")} diff --git a/public/content/developers/docs/intro-to-ethereum/index.md b/public/content/developers/docs/intro-to-ethereum/index.md index 0986561193e..44626627cee 100644 --- a/public/content/developers/docs/intro-to-ethereum/index.md +++ b/public/content/developers/docs/intro-to-ethereum/index.md @@ -108,10 +108,15 @@ A reusable snippet of code (a program) which a developer publishes into EVM stat - [Ethereum Whitepaper](/whitepaper/) - [How does Ethereum work, anyway?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _Preethi Kasireddy_ (**NB** this resource is still valuable but be aware that it predates [The Merge](/roadmap/merge) and therefore still refers to Ethereum's proof-of-work mechanism - Ethereum is actually now secured using [proof-of-stake](/developers/docs/consensus-mechanisms/pos)) -- [Ethereum Basics](https://youtube.com/playlist?list=PLqgutSGloqiJyyoL0zvLVFPS-GMD2wKa5&si=kZTf5I7PKGTXDsOZ) - If you are a visual learner, this video series offers a thorough exploration of foundational topics: + +### More of a visual learner? {#visual-learner} + +This video series offers a thorough exploration of foundational topics: +[Ethereum Basics Playlist](https://youtube.com/playlist?list=PLqgutSGloqiJyyoL0zvLVFPS-GMD2wKa5&si=kZTf5I7PKGTXDsOZ) + _Know of a community resource that helped you? Edit this page and add it!_ ## Related tutorials {#related-tutorials} diff --git a/src/intl/en/page-learn.json b/src/intl/en/page-learn.json index c7fa11bdf45..49afd5769e2 100644 --- a/src/intl/en/page-learn.json +++ b/src/intl/en/page-learn.json @@ -1,4 +1,5 @@ { + "about-ethereum-video-series": "Video series about Ethereum", "toc-learn-hub": "Learn hub", "toc-what-is-crypto-ethereum": "What is Ethereum?", "toc-how-do-i-use-ethereum": "How do I use Ethereum?", @@ -123,4 +124,4 @@ "unchained-description": "Dives deep into the people building the decentralized internet, the details of this technology that could underpin our future, and some of the thorniest topics in crypto, such as regulation, security and privacy", "the-daily-gwei-title": "The Daily Gwei", "the-daily-gwei-description": "Ethereum news recaps, updates and analysis" -} \ No newline at end of file +} From 43e0edf73e33cf2a31db98dd2710783df49bb765 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:46:45 -0700 Subject: [PATCH 081/171] chore: move new entry to end of "updated often" --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 51fa32ffbad..6db26530a27 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 @@ -466,10 +466,10 @@ As part of your monitoring, make sure to keep an eye on your machine's performan ## Further reading {#further-reading} -- [Sample AWS Blockchain Node Runner app for Ethereum Nodes](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) - _AWS, updated often_ - [Ethereum Staking Guides](https://github.com/SomerEsat/ethereum-staking-guides) - _Somer Esat, updated often_ - [Guide | How to setup a validator for Ethereum staking on mainnet](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, updated regularly_ - [ETHStaker guides on running validators on testnets](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, updated regularly_ +- [Sample AWS Blockchain Node Runner app for Ethereum Nodes](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) - _AWS, updated often_ - [The Merge FAQ for node operators](https://notes.ethereum.org/@launchpad/node-faq-merge) - _July 2022_ - [Analyzing the hardware requirements to be an Ethereum full validated node](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24 September 2018_ - [Running Ethereum Full Nodes: A Guide for the Barely Motivated](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7 November 2019_ From c6f924d26e1c24b19d390768b5c90dae55be4809 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 14:05:12 -0700 Subject: [PATCH 082/171] update: Faq component for latest conventions Component Changes: - Renamed from FaqAccordion to Faq - Updated to use ui/accordion components instead of direct @radix-ui/react-accordion imports - Removed react-icons dependency - the ChevronNext icon is now handled by the ui/accordion components - Fixed import path from tailwind/ui/accordion to ui/accordion - Simplified component structure while maintaining custom styling Story Changes: - Renamed file from FaqAccordion.stories.tsx to Faq.stories.tsx - Updated all component references to use new names (Faq, FaqContent, FaqItem, FaqTrigger) - Changed story name from FaqAccordionStory to Faq following standard conventions. categorized in Molecules / Display Content / Faq --- ...qAccordion.stories.tsx => Faq.stories.tsx} | 43 +++++----- src/components/FaqAccordion/index.tsx | 80 ++++++++----------- 2 files changed, 52 insertions(+), 71 deletions(-) rename src/components/FaqAccordion/{FaqAccordion.stories.tsx => Faq.stories.tsx} (71%) diff --git a/src/components/FaqAccordion/FaqAccordion.stories.tsx b/src/components/FaqAccordion/Faq.stories.tsx similarity index 71% rename from src/components/FaqAccordion/FaqAccordion.stories.tsx rename to src/components/FaqAccordion/Faq.stories.tsx index ab021ec0ddd..9493fc0f74f 100644 --- a/src/components/FaqAccordion/FaqAccordion.stories.tsx +++ b/src/components/FaqAccordion/Faq.stories.tsx @@ -1,15 +1,10 @@ import { Meta, StoryObj } from "@storybook/react" -import { - FaqAccordion, - FaqAccordionContent, - FaqAccordionItem, - FaqAccordionTrigger, -} from "." +import { Faq as FaqComponent, FaqContent, FaqItem, FaqTrigger } from "." const meta = { - title: "FaqAccordion", - component: FaqAccordion, + title: "Molecules / Display Content / Faq", + component: FaqComponent, decorators: [ (Story) => (
    @@ -17,21 +12,21 @@ const meta = {
    ), ], -} satisfies Meta +} satisfies Meta export default meta -export const FaqAccordionStory: StoryObj = { +export const Faq: StoryObj = { render: () => ( - - - + + +

    Why is there no 'official' Ethereum L2?

    -
    + - + Just as there is no 'official' Ethereum client, there is no 'official' Ethereum layer 2. Ethereum is permissionless - technically anyone can create a layer 2! Multiple teams will implement @@ -40,15 +35,15 @@ export const FaqAccordionStory: StoryObj = { use cases. Much like we have multiple Ethereum clients developed by multiple teams in order to have diversity in the network, this too will be how layer 2s develop in the future. - -
    - - + + + +

    Why is there no 'official' Ethereum L2?

    -
    - + + Just as there is no 'official' Ethereum client, there is no 'official' Ethereum layer 2. Ethereum is permissionless - technically anyone can create a layer 2! Multiple teams will implement @@ -57,8 +52,8 @@ export const FaqAccordionStory: StoryObj = { use cases. Much like we have multiple Ethereum clients developed by multiple teams in order to have diversity in the network, this too will be how layer 2s develop in the future. - -
    -
    + + + ), } diff --git a/src/components/FaqAccordion/index.tsx b/src/components/FaqAccordion/index.tsx index 61efd6f8248..d914c99cd51 100644 --- a/src/components/FaqAccordion/index.tsx +++ b/src/components/FaqAccordion/index.tsx @@ -1,51 +1,41 @@ import React from "react" -import { MdChevronRight } from "react-icons/md" import * as AccordionPrimitive from "@radix-ui/react-accordion" -import { cn } from "@/lib/utils/cn" +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion" -import * as RootAccordion from "../../../tailwind/ui/accordion" +import { cn } from "@/lib/utils/cn" -const FaqAccordionTrigger = React.forwardRef< +const FaqTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( - - svg]:-rotate-90", - className - )} - {...props} - > - {children} - - - - + + {children} + )) -FaqAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName +FaqTrigger.displayName = AccordionPrimitive.Trigger.displayName -const FaqAccordion = ({ +const Faq = ({ children, type, ...props }: AccordionPrimitive.AccordionSingleProps) => { return ( - {children} - + ) } -const FaqAccordionItem = React.forwardRef< + +const FaqItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( - )) -FaqAccordionItem.displayName = "AccordionItem" +FaqItem.displayName = "AccordionItem" -const FaqAccordionContent = React.forwardRef< +const FaqContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( - {children}
    - + )) -FaqAccordionContent.displayName = AccordionPrimitive.Content.displayName +FaqContent.displayName = AccordionPrimitive.Content.displayName -export { - FaqAccordion, - FaqAccordionContent, - FaqAccordionItem, - FaqAccordionTrigger, -} +export { Faq, FaqContent, FaqItem, FaqTrigger } From a08f34a5d14e17b86e4fdabd55cb7b10eb176838 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:42:58 -0700 Subject: [PATCH 083/171] update: Faq styling and story --- src/components/{FaqAccordion => Faq}/Faq.stories.tsx | 4 ++-- src/components/{FaqAccordion => Faq}/index.tsx | 7 ++++--- src/components/ui/accordion.tsx | 4 +++- 3 files changed, 9 insertions(+), 6 deletions(-) rename src/components/{FaqAccordion => Faq}/Faq.stories.tsx (94%) rename src/components/{FaqAccordion => Faq}/index.tsx (80%) diff --git a/src/components/FaqAccordion/Faq.stories.tsx b/src/components/Faq/Faq.stories.tsx similarity index 94% rename from src/components/FaqAccordion/Faq.stories.tsx rename to src/components/Faq/Faq.stories.tsx index 9493fc0f74f..870f498fe46 100644 --- a/src/components/FaqAccordion/Faq.stories.tsx +++ b/src/components/Faq/Faq.stories.tsx @@ -7,7 +7,7 @@ const meta = { component: FaqComponent, decorators: [ (Story) => ( -
    +
    ), @@ -18,7 +18,7 @@ export default meta export const Faq: StoryObj = { render: () => ( - +

    diff --git a/src/components/FaqAccordion/index.tsx b/src/components/Faq/index.tsx similarity index 80% rename from src/components/FaqAccordion/index.tsx rename to src/components/Faq/index.tsx index d914c99cd51..438534cf9e6 100644 --- a/src/components/FaqAccordion/index.tsx +++ b/src/components/Faq/index.tsx @@ -17,9 +17,10 @@ const FaqTrigger = React.forwardRef< (({ className, ...props }, ref) => ( )) diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx index c81d7d2c305..d2f725add36 100644 --- a/src/components/ui/accordion.tsx +++ b/src/components/ui/accordion.tsx @@ -33,7 +33,9 @@ const AccordionTrigger = React.forwardRef< <> {children} {!hideIcon && ( - +
    + +
    )} From 0a064969fd04dd1017f1b9e5565fead3baf513f4 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:55:42 -0700 Subject: [PATCH 084/171] chore: lint/prettify index.md --- .../node-architecture/index.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/public/content/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/developers/docs/nodes-and-clients/node-architecture/index.md index cb8a24c4435..5986b52a043 100644 --- a/public/content/developers/docs/nodes-and-clients/node-architecture/index.md +++ b/public/content/developers/docs/nodes-and-clients/node-architecture/index.md @@ -14,7 +14,7 @@ The diagram below shows the relationship between the two Ethereum clients. The t _There are several options for the execution client including Erigon, Nethermind, and Besu_. -For this two-client structure to work, consensus clients must pass bundles of transactions to the execution client. The execution client executes the transactions locally to validate that the transactions do not violate any Ethereum rules and that the proposed update to Ethereum’s state is correct. When a node is selected to be a block producer its consensus client instance requests bundles of transactions from the execution client to include in the new block and execute them to update the global state. The consensus client drives the execution client via a local RPC connection using the [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). +For this two-client structure to work, consensus clients must pass bundles of transactions to the execution client. The execution client executes the transactions locally to validate that the transactions do not violate any Ethereum rules and that the proposed update to Ethereum’s state is correct. When a node is selected to be a block producer its consensus client instance requests bundles of transactions from the execution client to include in the new block and execute them to update the global state. The consensus client drives the execution client via a local RPC connection using the [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). ## What does the execution client do? {#execution-client} @@ -37,20 +37,20 @@ The consensus client does not participate in attesting to or proposing blocks - ## Validators {#validators} -Staking and running the validator software makes a node eligible to be selected to propose a new block. Node operators can add a validator to their consensus clients by depositing 32 ETH in the deposit contract. The validator client comes bundled with the consensus client and can be added to a node at any time. The validator handles attestations and block proposals. It also enables a node to accrue rewards or lose ETH via penalties or slashing. +Staking and running the validator software makes a node eligible to be selected to propose a new block. Node operators can add a validator to their consensus clients by depositing 32 ETH in the deposit contract. The validator client comes bundled with the consensus client and can be added to a node at any time. The validator handles attestations and block proposals. It also enables a node to accrue rewards or lose ETH via penalties or slashing. [More on staking](/staking/). ## Components of a node comparison {#node-comparison} -| Execution Client | Consensus Client | Validator | -| -------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------- | -| Gossips transactions over its P2P network | Gossips blocks and attestations over its P2P network | Proposes blocks | -| Executes/re-executes transactions | Runs the fork choice algorithm | Accrues rewards/penalties | -| Verifies incoming state changes | Keeps track of the head of the chain | Makes attestations | -| Manages state and receipts tries | Manages the Beacon state (contains consensus and execution info) | Requires 32 ETH to be staked | +| Execution Client | Consensus Client | Validator | +| -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | +| Gossips transactions over its P2P network | Gossips blocks and attestations over its P2P network | Proposes blocks | +| Executes/re-executes transactions | Runs the fork choice algorithm | Accrues rewards/penalties | +| Verifies incoming state changes | Keeps track of the head of the chain | Makes attestations | +| Manages state and receipts tries | Manages the Beacon state (contains consensus and execution info) | Requires 32 ETH to be staked | | Creates execution payload | Keeps track of accumulated randomness in RANDAO (an algorithm that provides verifiable randomness for validator selection and other consensus operations) | Can be slashed | -| Exposes JSON-RPC API for interacting with Ethereum | Keeps track of justification and finalization | | +| Exposes JSON-RPC API for interacting with Ethereum | Keeps track of justification and finalization | | ## Further reading {#further-reading} From 1335c08ba93c586124cca7a2973324c33c76d3e9 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:10:34 -0700 Subject: [PATCH 085/171] Revert "docs: add Web3.js sunset warning to JavaScript API libraries page and all translations" This reverts commit 3d8f802f7bb22d36c0dbd7be381bd991acf59d99. --- public/content/developers/docs/apis/javascript/index.md | 2 -- .../translations/de/developers/docs/apis/javascript/index.md | 2 -- .../translations/el/developers/docs/apis/javascript/index.md | 2 -- .../translations/es/developers/docs/apis/javascript/index.md | 2 -- .../translations/fr/developers/docs/apis/javascript/index.md | 2 -- .../translations/hu/developers/docs/apis/javascript/index.md | 2 -- .../translations/id/developers/docs/apis/javascript/index.md | 2 -- .../translations/it/developers/docs/apis/javascript/index.md | 2 -- .../translations/ja/developers/docs/apis/javascript/index.md | 2 -- .../translations/pl/developers/docs/apis/javascript/index.md | 2 -- .../zh-tw/developers/docs/apis/javascript/index.md | 2 -- .../translations/zh/developers/docs/apis/javascript/index.md | 4 ---- 12 files changed, 26 deletions(-) diff --git a/public/content/developers/docs/apis/javascript/index.md b/public/content/developers/docs/apis/javascript/index.md index d2155c031df..c0c5139cac9 100644 --- a/public/content/developers/docs/apis/javascript/index.md +++ b/public/content/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ These libraries abstract away much of the complexity of interacting directly wit Using providers, these libraries allow you to connect to Ethereum and read its data, whether that's over JSON-RPC, INFURA, Etherscan, Alchemy or MetaMask. -> **Warning:** Web3.js will be archived on March 4, 2025. [Read the announcement](https://blog.chainsafe.io/web3-js-sunset/). Consider using alternative libraries like Ethers.js or viem for new projects. - **Ethers example** ```js diff --git a/public/content/translations/de/developers/docs/apis/javascript/index.md b/public/content/translations/de/developers/docs/apis/javascript/index.md index d565c9ad348..e4a3e1818e5 100644 --- a/public/content/translations/de/developers/docs/apis/javascript/index.md +++ b/public/content/translations/de/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ Mit diesen Programmbibliotheken lässt sich die direkte Interaktion mit einem Et Sie können sich über einen Provider und diese Bibliotheken mit Ethereum verbinden und die Daten auslesen – über JSON-RPC, INFURA, Etherscan, Alchemy oder MetaMask. -> **Warnung:** Web3.js wird am 4. März 2025 archiviert. [Lesen Sie die Ankündigung](https://blog.chainsafe.io/web3-js-sunset/). Erwägen Sie die Verwendung alternativer Bibliotheken wie Ethers.js oder viem für neue Projekte. - **Ether-Beispiel** ```js diff --git a/public/content/translations/el/developers/docs/apis/javascript/index.md b/public/content/translations/el/developers/docs/apis/javascript/index.md index e73f0c46615..aa9eb34ee52 100644 --- a/public/content/translations/el/developers/docs/apis/javascript/index.md +++ b/public/content/translations/el/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ lang: el Χρησιμοποιώντας τους παρόχους, αυτές οι βιβλιοθήκες σας επιτρέπουν να συνδεθείτε στο Ethereum και να διαβάσετε τα δεδομένα του, είτε αυτό είναι μέσω JSON-RPC, INFURA, Etherscan, Alchemy ή MetaMask. -> **Προειδοποίηση:** Το Web3.js θα αρχειοθετηθεί στις 4 Μαρτίου 2025. [Διαβάστε την ανακοίνωση](https://blog.chainsafe.io/web3-js-sunset/). Εξετάστε τη χρήση εναλλακτικών βιβλιοθηκών όπως το Ethers.js ή το viem για νέα έργα. - **Παράδειγμα Ethers** ```js diff --git a/public/content/translations/es/developers/docs/apis/javascript/index.md b/public/content/translations/es/developers/docs/apis/javascript/index.md index 36900a34890..621c418c30c 100644 --- a/public/content/translations/es/developers/docs/apis/javascript/index.md +++ b/public/content/translations/es/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ Estas bibliotecas eliminan en gran parte la complejidad de interactuar directame Mediante proveedores, estas bibliotecas le permiten conectarse a Ethereum y leer sus datos, ya sea sobre JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask. -> **Advertencia:** Web3.js será archivado el 4 de marzo de 2025. [Lea el anuncio](https://blog.chainsafe.io/web3-js-sunset/). Considere usar bibliotecas alternativas como Ethers.js o viem para nuevos proyectos. - **Ejemplo de Ethers** ```js diff --git a/public/content/translations/fr/developers/docs/apis/javascript/index.md b/public/content/translations/fr/developers/docs/apis/javascript/index.md index 61af196d0d4..eb548469d3c 100644 --- a/public/content/translations/fr/developers/docs/apis/javascript/index.md +++ b/public/content/translations/fr/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ Ces bibliothèques suppriment une grande partie de la complexité d'une interact En utilisant des fournisseurs, les bibliothèques vous permettent de vous connecter à Ethereum et de lire ses données, que ce soit sur JSON-RPC, INFURA, Etherscan, Alchemy ou Metamask. -> **Avertissement :** Web3.js sera archivé le 4 mars 2025. [Lire l'annonce](https://blog.chainsafe.io/web3-js-sunset/). Envisagez d'utiliser des bibliothèques alternatives comme Ethers.js ou viem pour les nouveaux projets. - **Exemple Ether** ```js diff --git a/public/content/translations/hu/developers/docs/apis/javascript/index.md b/public/content/translations/hu/developers/docs/apis/javascript/index.md index ac50331137c..8356791c6f7 100644 --- a/public/content/translations/hu/developers/docs/apis/javascript/index.md +++ b/public/content/translations/hu/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ Ezek a könyvtárak elveszik a komplexitás nagy részét, mely Ethereum csomóp Szolgáltatók használatakor ezen könyvtárak használatával rácsatlakozhat az Ethereumra és kiolvashatja az adatait, függetlenül attól, hogy JSON-RPC, INFURA, Etherscan, Alchemy vagy MetaMask rendszeren keresztül történik. -> **Figyelmeztetés:** A Web3.js 2025. március 4-én archiválásra kerül. [Olvasd el a bejelentést](https://blog.chainsafe.io/web3-js-sunset/). Fontold meg alternatív könyvtárak, például az Ethers.js vagy a viem használatát új projektekhez. - **Példa az Ethers-re** ```js diff --git a/public/content/translations/id/developers/docs/apis/javascript/index.md b/public/content/translations/id/developers/docs/apis/javascript/index.md index 8288aec5d00..6c2e0446e67 100644 --- a/public/content/translations/id/developers/docs/apis/javascript/index.md +++ b/public/content/translations/id/developers/docs/apis/javascript/index.md @@ -24,8 +24,6 @@ Pustaka ini menyederhanakan banyak kerumitan dalam interaksi langsung dengan nod Menggunakan penyedia, pustaka ini memungkinkan Anda terhubung ke Ethereum dan membaca datanya, baik itu melalui JSON-RPC, INFURA, Etherscan, Alchemy, atau MetaMask. -> **Peringatan:** Web3.js akan diarsipkan pada 4 Maret 2025. [Baca pengumuman](https://blog.chainsafe.io/web3-js-sunset/). Pertimbangkan untuk menggunakan pustaka alternatif seperti Ethers.js atau viem untuk proyek baru. - **Contoh Ether** ```js diff --git a/public/content/translations/it/developers/docs/apis/javascript/index.md b/public/content/translations/it/developers/docs/apis/javascript/index.md index 56a1edbc3bc..a52a7de1446 100644 --- a/public/content/translations/it/developers/docs/apis/javascript/index.md +++ b/public/content/translations/it/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ Queste librerie eliminano buona parte della complessità legata al dover interag Utilizzando i provider, queste librerie consentono di connettersi a Ethereum e leggerne i dati, tramite JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask. -> **Peringatan:** Web3.js akan diarsipkan pada 4 Maret 2025. [Baca pengumuman](https://blog.chainsafe.io/web3-js-sunset/). Pertimbangkan untuk menggunakan pustaka alternatif seperti Ethers.js atau viem untuk proyek baru. - **Esempio da Ethers** ```js diff --git a/public/content/translations/ja/developers/docs/apis/javascript/index.md b/public/content/translations/ja/developers/docs/apis/javascript/index.md index 1086c39492c..a029f117755 100644 --- a/public/content/translations/ja/developers/docs/apis/javascript/index.md +++ b/public/content/translations/ja/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ JavaScriptを理解している必要があります。また、[イーサリア providersライブラリを使用することで、JSON-RPC、INFURA、Etherscan、AlchemyまたはMetaMaskであっても、イーサリアムに接続してデータを読み取ることができます。 -> **警告:** Web3.js は2025年3月4日にアーカイブされます。[お知らせを読む](https://blog.chainsafe.io/web3-js-sunset/)。新規プロジェクトでは、Ethers.js や viem などの代替ライブラリの使用を検討してください。 - **Ethers.jsを使った例** ```js diff --git a/public/content/translations/pl/developers/docs/apis/javascript/index.md b/public/content/translations/pl/developers/docs/apis/javascript/index.md index 26f42ce6ae1..c483ef2788c 100644 --- a/public/content/translations/pl/developers/docs/apis/javascript/index.md +++ b/public/content/translations/pl/developers/docs/apis/javascript/index.md @@ -24,8 +24,6 @@ Biblioteki te eliminują znaczną złożoność interakcji bezpośrednio z węz Korzystając z dostawców, biblioteki te pozwalają Ci połączyć się z Ethereum i przeczytać jego dane, niezależnie od tego, czy chodzi o JSON-RPC, INFURA, Etherscan, Alchemy czy MetaMask. -> **Ostrzeżenie:** Web3.js zostanie zarchiwizowany 4 marca 2025 r. [Przeczytaj ogłoszenie](https://blog.chainsafe.io/web3-js-sunset/). Rozważ użycie alternatywnych bibliotek, takich jak Ethers.js lub viem dla nowych projektów. - **Przykładowy Ether** ```js diff --git a/public/content/translations/zh-tw/developers/docs/apis/javascript/index.md b/public/content/translations/zh-tw/developers/docs/apis/javascript/index.md index 9afad183837..4b74d4a50c2 100644 --- a/public/content/translations/zh-tw/developers/docs/apis/javascript/index.md +++ b/public/content/translations/zh-tw/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ lang: zh-tw 使用提供者,這些程式庫讓你能夠連結到以太坊並讀取其資料,無論是透過 JSON-RPC、INFURA、Etherscan、Alchemy 還是 MetaMask。 -> **警告:** Web3.js 將於 2025 年 3 月 4 日被歸檔。[閱讀公告](https://blog.chainsafe.io/web3-js-sunset/)。建議在新項目中使用其他替代庫,如 Ethers.js 或 viem。 - **Ethers 範例** ```js diff --git a/public/content/translations/zh/developers/docs/apis/javascript/index.md b/public/content/translations/zh/developers/docs/apis/javascript/index.md index 518b8e18768..02548f5b65a 100644 --- a/public/content/translations/zh/developers/docs/apis/javascript/index.md +++ b/public/content/translations/zh/developers/docs/apis/javascript/index.md @@ -26,8 +26,6 @@ lang: zh 使用提供程序,这些库允许你连接到以太坊并读取它的数据,不管是通过 JSON-RPC、INFURA、Etherscan、Alchemy 还是 Metamask。 -> **警告:** Web3.js 将于 2025 年 3 月 4 日被归档。[阅读公告](https://blog.chainsafe.io/web3-js-sunset/)。建议在新项目中使用其他替代库,如 Ethers.js 或 viem。 - **Ethers 示例** ```js @@ -241,8 +239,6 @@ ethers.utils.formatEther(balance) **Web3.js -** **_以太坊 JavaScript API。_** -> **警告:** Web3.js 将于 2025 年 3 月 4 日被归档。[阅读公告](https://blog.chainsafe.io/web3-js-sunset/)。建议在新项目中使用其他替代库,如 Ethers.js 或 viem。 - - [相关文档](https://docs.web3js.org/) - [GitHub](https://github.com/ethereum/web3.js/) From 3319d7254b0b18c1b1939d48fda4c26a45fd53d1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:12:43 -0700 Subject: [PATCH 086/171] docs: add Web3.js sunset warning Co-Authored-By: Bob <203082506+chainide-agent-bob@users.noreply.github.com> --- public/content/developers/docs/apis/javascript/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/content/developers/docs/apis/javascript/index.md b/public/content/developers/docs/apis/javascript/index.md index c0c5139cac9..6613422cf87 100644 --- a/public/content/developers/docs/apis/javascript/index.md +++ b/public/content/developers/docs/apis/javascript/index.md @@ -26,6 +26,8 @@ These libraries abstract away much of the complexity of interacting directly wit Using providers, these libraries allow you to connect to Ethereum and read its data, whether that's over JSON-RPC, INFURA, Etherscan, Alchemy or MetaMask. +> **Warning:** Web3.js was archived on March 4, 2025. [Read the announcement](https://blog.chainsafe.io/web3-js-sunset/). Consider using alternative libraries like ethers.js or viem for new projects. + **Ethers example** ```js From dc0f3736374a4665c10844a809dfe8e263ec0718 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:20:01 -0700 Subject: [PATCH 087/171] Revert "fix: json rpc doc eth_getLogs block hash parameter" This reverts commit 3a05f5861cef8a31f9e582f7635617bafe19445b. --- public/content/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/de/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/el/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/es/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/fr/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/hu/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/it/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/ja/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/pt-br/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/tr/developers/docs/apis/json-rpc/index.md | 4 ++-- .../translations/zh-tw/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/zh/developers/docs/apis/json-rpc/index.md | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/apis/json-rpc/index.md b/public/content/developers/docs/apis/json-rpc/index.md index fba8e8cb4b0..73dac1fc31f 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -1623,7 +1623,7 @@ Returns an array of all logs matching a given filter object. - `toBlock`: `QUANTITY|TAG` - (optional, default: `"latest"`) Integer block number, or `"latest"` for the last proposed block, `"safe"` for the latest safe block, `"finalized"` for the latest finalized block, or `"pending"`, `"earliest"` for transactions not yet in a block. - `address`: `DATA|Array`, 20 Bytes - (optional) Contract address or a list of addresses from which logs should originate. - `topics`: `Array of DATA`, - (optional) Array of 32 Bytes `DATA` topics. Topics are order-dependent. Each topic can also be an array of DATA with "or" options. -- `blockHash`: `DATA`, 32 Bytes - (optional, **future**) With the addition of EIP-234, `blockHash` will be a new filter option which restricts the logs returned to the single block with the 32-byte hash `blockHash`. Using `blockHash` is equivalent to `fromBlock` = `toBlock` = the block number with hash `blockHash`. If `blockHash` is present in the filter criteria, then neither `fromBlock` nor `toBlock` are allowed. +- `blockhash`: `DATA`, 32 Bytes - (optional, **future**) With the addition of EIP-234, `blockHash` will be a new filter option which restricts the logs returned to the single block with the 32-byte hash `blockHash`. Using `blockHash` is equivalent to `fromBlock` = `toBlock` = the block number with hash `blockHash`. If `blockHash` is present in the filter criteria, then neither `fromBlock` nor `toBlock` are allowed. ```js params: [ diff --git a/public/content/translations/de/developers/docs/apis/json-rpc/index.md b/public/content/translations/de/developers/docs/apis/json-rpc/index.md index 0b2f7a66b41..ad51b54df9a 100644 --- a/public/content/translations/de/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/de/developers/docs/apis/json-rpc/index.md @@ -1600,7 +1600,7 @@ Gibt ein Array aller Protokolle zurück, die einem angegebenen Filterobjekt ents - `toBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. - `Adresse`: `DATA|Array`, 20 Bytes - (Optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. - `topics`: `Array of DATA`, - (Optional) Array von 32 Bytes `DATA`-Themen. Themen sind auftragsabhängig. Jedes Thema kann auch ein Array von DATEN mit „oder“-Optionen sein. -- `blockHash`: `DATA`, 32 Bytes - (optional, **future**) Mit dem Hinzufügen von EIP-234 wird `blockHash` eine neue Filteroption sein, die die zurückgegebenen Protokolle auf den einzelnen Block mit dem 32-Byte-Hash `blockHash` beschränkt. Die Verwendung von `blockHash` entspricht `fromBlock` = `toBlock` = die Blocknummer mit Hash `blockHash`. Wenn `blockHash` in den Filterkriterien vorhanden ist, sind weder `fromBlock` noch `toBlock` zulässig. +- `blockhash`: `DATA`, 32 Bytes - (optional, **future**) Mit dem Hinzufügen von EIP-234 wird `blockHash` eine neue Filteroption sein, die die zurückgegebenen Protokolle auf den einzelnen Block mit dem 32-Byte-Hash `blockHash` beschränkt. Die Verwendung von `blockHash` entspricht `fromBlock` = `toBlock` = die Blocknummer mit Hash `blockHash`. Wenn `blockHash` in den Filterkriterien vorhanden ist, sind weder `fromBlock` noch `toBlock` zulässig. ```js params: [ diff --git a/public/content/translations/el/developers/docs/apis/json-rpc/index.md b/public/content/translations/el/developers/docs/apis/json-rpc/index.md index 44292d68773..9f048307964 100644 --- a/public/content/translations/el/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/el/developers/docs/apis/json-rpc/index.md @@ -1602,7 +1602,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x - `toBlock`: `QUANTITY|TAG` - (προαιρετικό, προεπιλογή: `"latest"`) Ακέραιος αριθμός μπλοκ ή `"latest"` για το τελευταίο προτεινόμενο μπλοκ, `"safe"` για το τελευταίο ασφαλές μπλοκ, `"finalized"` για το τελευταίο οριστικοποιημένο μπλοκ ή `"pending"`, `"earliest"` για συναλλαγές που δεν είναι ακόμα σε μπλοκ. - `address`: `DATA|Array`, 20 Bytes — (προαιρετικό) Διεύθυνση έξυπνου συμβολαίου ή λίστα διευθύνσεων από τις οποίες πρέπει να προέρχονται τα log. - `topics`: `Array of DATA`, — (προαιρετικό) Πίνακας θεμάτων `DATA` των 32 Bytes. Τα θέματα εξαρτώνται από τη σειρά. Κάθε θέμα μπορεί επίσης να είναι ένας πίνακας DATA με επιλογές "ή". -- `blockHash`: `DATA`, 32 Byte — (προαιρετικό, **μελλοντικό**) Με την προσθήκη του EIP-234, το `blockHash` θα είναι μια νέα επιλογή φίλτρου που περιορίζει τα αρχεία καταγραφής που επιστρέφονται στο μεμονωμένο μπλοκ με τον κατακερματισμό 32 byte `blockHash`. Η χρήση του `blockHash` ισοδυναμεί με `fromBlock` = `toBlock` = τον αριθμό μπλοκ με κατακερματισμό `blockHash`. Εάν υπάρχει `blockHash` στα κριτήρια φίλτρου, τότε δεν επιτρέπονται ούτε `fromBlock` ούτε `toBlock`. +- `blockhash`: `DATA`, 32 Byte — (προαιρετικό, **μελλοντικό**) Με την προσθήκη του EIP-234, το `blockHash` θα είναι μια νέα επιλογή φίλτρου που περιορίζει τα αρχεία καταγραφής που επιστρέφονται στο μεμονωμένο μπλοκ με τον κατακερματισμό 32 byte `blockHash`. Η χρήση του `blockHash` ισοδυναμεί με `fromBlock` = `toBlock` = τον αριθμό μπλοκ με κατακερματισμό `blockHash`. Εάν υπάρχει `blockHash` στα κριτήρια φίλτρου, τότε δεν επιτρέπονται ούτε `fromBlock` ούτε `toBlock`. ```js params: [ diff --git a/public/content/translations/es/developers/docs/apis/json-rpc/index.md b/public/content/translations/es/developers/docs/apis/json-rpc/index.md index 69332cc5b64..0d2fd5beb83 100644 --- a/public/content/translations/es/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/es/developers/docs/apis/json-rpc/index.md @@ -1600,7 +1600,7 @@ Devuelve una matriz de todos los registros que coinciden con un objeto de filtro - `toBlock`: `QUANTITY|TAG` - (opcional, por defecto: `"latest"`) Número de bloque entero o `"latest"` para el último bloque propuesto, `"safe"` para el último bloque seguro, `"finalized"` para el último bloque finalizado o `"pending"`, `"earliest"` para transacciones que aún no están en un bloque. - `address`: `DATA|Array`, 20 Bytes - (opcional) Dirección de contrato o una lista de las direcciones desde donde deben originarse los registros. - `topics`: `Array de DATA`, - (opcional) Array de temas de `DATA` de 32 bytes. Los temas dependen del orden. Cada tema puede también ser un array de DATA con opciones "or" (o). -- `blockHash`: `DATA`, 32 Bytes - (opcional, **future**) Con la adición de EIP-234, `blockHash` será una nueva opción de filtro que restringe los registros retornados al bloque único con el hash de 32 bytes `blockHash`. Usar `blockHash` es equivalente a `fromBlock` = `toBlock` = el número de bloque con hash `blockHash`. Si `blockHash` está presente en los criterios de filtro, no se permiten ni `fromBlock` ni `toBlock`. +- `blockhash`: `DATA`, 32 Bytes - (opcional, **future**) Con la adición de EIP-234, `blockHash` será una nueva opción de filtro que restringe los registros retornados al bloque único con el hash de 32 bytes `blockHash`. Usar `blockHash` es equivalente a `fromBlock` = `toBlock` = el número de bloque con hash `blockHash`. Si `blockHash` está presente en los criterios de filtro, no se permiten ni `fromBlock` ni `toBlock`. ```js params: [ diff --git a/public/content/translations/fr/developers/docs/apis/json-rpc/index.md b/public/content/translations/fr/developers/docs/apis/json-rpc/index.md index 6329e2c9db2..727b550bb1e 100644 --- a/public/content/translations/fr/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/fr/developers/docs/apis/json-rpc/index.md @@ -1602,7 +1602,7 @@ Retourne un tableau de tous les logs correspondant à un objet filtre donné. - `toBlock`: `QUANTITY|TAG` - (optionnel, par défaut : `« latest »`) nombre entier de blocs, ou `« latest »` pour le dernier bloc proposé, `« safe »` pour le dernier bloc sécurisé, `« finalized »` pour le dernier bloc finalisé, ou `« pending »`, `« earliest »` pour les transactions ne faisant pas encore partie d'un bloc. - `address`: `DATA|Array`, 20 octets - (facultatif) adresse contractuelle ou une liste d'adresses d'où les logs doivent provenir. - `topics`: `Array of DATA`, - (facultatif) tableau de 32 bytes `DATA` topics. Les sujets dépendent de l'ordre. Chaque sujet peut également être un tableau de DATA avec des options "ou". -- `blockHash`: `DATA`, 32 octets - (facultatif, **futur**) À l'ajout de EIP-234, `blockHash` sera une nouvelle option de filtre qui restreint les logs retournés au bloc unique avec le hachage de 32 octets `blockHash`. Utiliser `blockHash` est équivalent à `fromBlock` = `toBlock` = le numéro de bloc avec le hachage `blockHash`. Si `blockHash` est présent dans les critères de filtre, alors ni `fromBlock` ni `toBlock` ne sont autorisés. +- `blockhash`: `DATA`, 32 octets - (facultatif, **futur**) À l'ajout de EIP-234, `blockHash` sera une nouvelle option de filtre qui restreint les logs retournés au bloc unique avec le hachage de 32 octets `blockHash`. Utiliser `blockHash` est équivalent à `fromBlock` = `toBlock` = le numéro de bloc avec le hachage `blockHash`. Si `blockHash` est présent dans les critères de filtre, alors ni `fromBlock` ni `toBlock` ne sont autorisés. ```js params: [ diff --git a/public/content/translations/hu/developers/docs/apis/json-rpc/index.md b/public/content/translations/hu/developers/docs/apis/json-rpc/index.md index a4527527f6c..92f15ed8756 100644 --- a/public/content/translations/hu/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/hu/developers/docs/apis/json-rpc/index.md @@ -1602,7 +1602,7 @@ Visszaadja az adott szűrőobjektumnak megfelelő összes naplótömböt. - `toBlock`: `QUANTITY|TAG` – (opcionális, alapértelmezett: `„latest”`) blokkszám egész számként, vagy `„latest”` az utolsó előterjesztett blokkra,`„safe”` az utolsó biztosított blokkra, `„finalized”` az utolsó véglegesített blokkra, vagy `„pending”`, `„earliest”` a még blokkba nem került tranzakciókra. - `address`: `DATA|Array`, 20 bájt – (opcionális) A szerződéscím vagy címek listája, amelyekről a naplók származnak. - `topics`: `Array of DATA`, – (opcionális) a `DATA` témák (topics) 32 bájtos tömbje. A témák sorrendfüggők. Minden téma egy DATA tömb lehet „vagy” opciókkal. -- `blockHash`: `DATA`, 32 bájt – (opcionális, **jövő**) Az EIP-234 bevezetésével a `blockHash` egy új szűrőopció lesz, amely egyetlen blokkra redukálja a visszakapott naplókat egy 32-bájtos hashsel rendelkező `blockHash` segítségével. A `blockHash` használata azonos a `fromBlock` = `toBlock` = blokkszám hashsel (`blockHash`). Ha a `blockHash` benne van a szűrőkritériumban, akkor nem engedélyezett se a `fromBlock`, se a `toBlock`. +- `blockhash`: `DATA`, 32 bájt – (opcionális, **jövő**) Az EIP-234 bevezetésével a `blockHash` egy új szűrőopció lesz, amely egyetlen blokkra redukálja a visszakapott naplókat egy 32-bájtos hashsel rendelkező `blockHash` segítségével. A `blockHash` használata azonos a `fromBlock` = `toBlock` = blokkszám hashsel (`blockHash`). Ha a `blockHash` benne van a szűrőkritériumban, akkor nem engedélyezett se a `fromBlock`, se a `toBlock`. ```js params: [ diff --git a/public/content/translations/it/developers/docs/apis/json-rpc/index.md b/public/content/translations/it/developers/docs/apis/json-rpc/index.md index 9acd1dbcb61..9f2295b0800 100644 --- a/public/content/translations/it/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/it/developers/docs/apis/json-rpc/index.md @@ -1602,7 +1602,7 @@ Restituisce un array di tutti i registri che corrispondono a un dato oggetto fil - `toBlock`: `QUANTITY|TAG` - (facoltativo, predefinito: `"latest"`) Numero intero del blocco, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato o `"pending"`, `"earliest"` per le transazioni non ancora presenti in un blocco. - `address`: `DATA|Array`, 20 byte - (facoltativo) L'indirizzo del contratto oppure un elenco di indirizzi da cui dovrebbero avere origine i registri. - `topics`: `Array of DATA`, - (facoltativo) Array di argomenti `DATA` a 32 byte. Gli argomenti dipendono dall'ordine. Ogni argomento può anche essere una matrice di DATA con opzioni "OR". -- `blockHash`: `DATI`, 32 byte - (facoltativo , **future**) Con l'aggiunta di EIP-234, `blockHash` sarà una nuova opzione di filtro che limita i registri restituiti al singolo blocco con l'hash `blockHash` da 32 byte. L'utilizzo di `blockHash` equivale a `fromBlock` = `toBlock` = il numero di blocco con hash `blockHash`. Se `blockHash` è presente nei criteri di filtraggio, non sono permessi né `fromBlock` né `toBlock`. +- `blockhash`: `DATI`, 32 byte - (facoltativo , **future**) Con l'aggiunta di EIP-234, `blockHash` sarà una nuova opzione di filtro che limita i registri restituiti al singolo blocco con l'hash `blockHash` da 32 byte. L'utilizzo di `blockHash` equivale a `fromBlock` = `toBlock` = il numero di blocco con hash `blockHash`. Se `blockHash` è presente nei criteri di filtraggio, non sono permessi né `fromBlock` né `toBlock`. ```js params: [ diff --git a/public/content/translations/ja/developers/docs/apis/json-rpc/index.md b/public/content/translations/ja/developers/docs/apis/json-rpc/index.md index ed7d3464ce6..54c178cd6a7 100644 --- a/public/content/translations/ja/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/ja/developers/docs/apis/json-rpc/index.md @@ -1600,7 +1600,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x - `toBlock`: `QUANTITY|TAG` - (オプション、デフォルトは`"latest"`) 整数のブロック番号、または最後に提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはブロックにまだ含まれていないトランザクションを表す`"pending"`、`"earliest"`を指定できます。 - `address`: `DATA|Array`、20バイト - (オプション)ログの生成元となるコントラクトアドレス、またはアドレスのリスト - `topics`: `Array of DATA`、- (オプション)32バイトの`DATA`トピックの配列。 トピックは順序に依存します。 各トピックは「or」オプションのDATA配列にすることも可能 -- `blockHash`: `DATA`、32バイト - (オプション、**実装予定**) EIP-234が追加されたことにより、`blockHash`が新たなフィルターオプションになります。これは、返されるログを32バイトのハッシュ`blockHash`を持つ単一のブロックに制限します。 `blockHash`を使用することは、`fromBlock`と`toBlock`に`blockHash`のハッシュのブロック番号を指定することと同等です。 `blockHash`がフィルター条件にある場合、`fromBlock`と`toBlock`は使用できません。 +- `blockhash`: `DATA`、32バイト - (オプション、**実装予定**) EIP-234が追加されたことにより、`blockHash`が新たなフィルターオプションになります。これは、返されるログを32バイトのハッシュ`blockHash`を持つ単一のブロックに制限します。 `blockHash`を使用することは、`fromBlock`と`toBlock`に`blockHash`のハッシュのブロック番号を指定することと同等です。 `blockHash`がフィルター条件にある場合、`fromBlock`と`toBlock`は使用できません。 ```js params: [ diff --git a/public/content/translations/pt-br/developers/docs/apis/json-rpc/index.md b/public/content/translations/pt-br/developers/docs/apis/json-rpc/index.md index 9d5f95bf4a8..8c29fca6938 100644 --- a/public/content/translations/pt-br/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/pt-br/developers/docs/apis/json-rpc/index.md @@ -1602,7 +1602,7 @@ Retorna uma matriz de todos os logs que correspondem a um determinado objeto de - `toBlock`: `QUANTITY|TAG` - (opcional, padrão: `"latest"`) Número de bloco inteiro, ou `"latest"` para o último bloco proposto, `"safe"` para o último bloco seguro, `"finalized"` para o último bloco finalizado, ou `"pending"`, `"earliest"` para transações que ainda não estão em um bloco. - `endereço`: `DATA|Array`, 20 Bytes - (opcional) Endereço do contrato ou uma lista de endereços dos quais os logs devem se originar. - `topics`: `Array of DATA`, - (opcional) Array de tópicos de `DATA` de 32 Bytes. Os tópicos são dependentes da ordem. Cada tópico também pode ser uma matriz de DADOS com opções "ou". -- `blockHash`: `DATA`, 32 Bytes — (opcional, **futuro**) Com a adição do EIP-234, `blockHash` será uma nova opção de filtro, que restringe os logs retornados ao bloco único com o hash de 32 bytes `blockHash`. Usar `blockHash` é equivalente a `fromBlock` = `toBlock` = o número do bloco com hash `blockHash`. Se `blockHash` estiver presente nos critérios de filtro, nem `fromBlock`, nem `toBlock` serão permitidos. +- `blockhash`: `DATA`, 32 Bytes — (opcional, **futuro**) Com a adição do EIP-234, `blockHash` será uma nova opção de filtro, que restringe os logs retornados ao bloco único com o hash de 32 bytes `blockHash`. Usar `blockHash` é equivalente a `fromBlock` = `toBlock` = o número do bloco com hash `blockHash`. Se `blockHash` estiver presente nos critérios de filtro, nem `fromBlock`, nem `toBlock` serão permitidos. ```js params: [ diff --git a/public/content/translations/tr/developers/docs/apis/json-rpc/index.md b/public/content/translations/tr/developers/docs/apis/json-rpc/index.md index 0a6af659294..ef646de8279 100644 --- a/public/content/translations/tr/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/tr/developers/docs/apis/json-rpc/index.md @@ -1093,7 +1093,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 // Result { { - "jsonrpc": "2.0", +"jsonrpc": "2.0", "id": 1, "result": { "difficulty": "0x4ea3f27bc", @@ -1600,7 +1600,7 @@ Belirli bir filtre nesnesiyle eşleşen tüm günlüklerin bir dizisini döndür - `toBlock`: `QUANTITY|TAG` - (isteğe bağlı, default: `"latest"`) Tamsayı blok numarası veya son önerilen blok için `"latest"`, en son güvenli blok için `"safe"`, en son sonlandırılmış blok için `"finalized"`, henüz bir blokta olmayan işlemler için `"pending"` ve `"earliest"`. - `address`: `DATA|Array`, 20 Bayt - (isteğe bağlı) Sözleşme adresi veya günlüklerin kaynaklanması gereken adreslerin listesi. - `topics`: `Array of DATA`, - (isteğe bağlı) 32 Baytlık dizi `DATA` konu. Konular sıraya bağlıdır. Her konu, "veya" seçenekleriyle birlikte bir VERİ dizisi de olabilir. -- `blockHash`: `DATA`, 32 Bayt - (isteğe bağlı, **gelecek**) EIP-234 eklenmesiyle, `blockHash`, 32 baytlık `blockHash` ile tek bloka döndürülen günlükleri kısıtlayan yeni bir filtre seçeneği olacaktır. `blockHash` kullanımı, `fromBlock` ile eş değerdir = `toBlock` = `blockHash` karmalı blok numarası. Filtre ölçütlerinde `blockHash` varsa, ne `fromBlock` ne de `toBlock`'a izin verilmez. +- `blockhash`: `DATA`, 32 Bayt - (isteğe bağlı, **gelecek**) EIP-234 eklenmesiyle, `blockHash`, 32 baytlık `blockHash` ile tek bloka döndürülen günlükleri kısıtlayan yeni bir filtre seçeneği olacaktır. `blockHash` kullanımı, `fromBlock` ile eş değerdir = `toBlock` = `blockHash` karmalı blok numarası. Filtre ölçütlerinde `blockHash` varsa, ne `fromBlock` ne de `toBlock`'a izin verilmez. ```js params: [ diff --git a/public/content/translations/zh-tw/developers/docs/apis/json-rpc/index.md b/public/content/translations/zh-tw/developers/docs/apis/json-rpc/index.md index 1ceaaf46de2..35ce2484970 100644 --- a/public/content/translations/zh-tw/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/zh-tw/developers/docs/apis/json-rpc/index.md @@ -1602,7 +1602,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x - `toBlock`: `QUANTITY|TAG` -(可選,預設:`"latest"`)整數區塊編號,或 `"latest"` 表示最近提議的區塊,`"safe"` 表示最新的安全區塊,`"finalized"` 表示最新的最終確定區塊,或 `"pending"`,`"earliest"` 表示尚未在區塊中的交易。 - `address`: `DATA|Array`,20 位元組 - (可選)合約地址或日誌起源的地址清單。 - `topics`: `Array of DATA`,(可選)32 位元組陣列 `DATA` 主題。 主題與順序相關。 每個主題也可以為帶有「或」選項的 DATA 陣列。 -- `blockHash`: `DATA`,32 位元組 - (可選,**future**),新增 EIP-234 後,`blockHash` 將是一個新的篩選條件選項,會將傳回的日誌限制為具有 32 位元組雜湊值 `blockHash` 的單一區塊。 使用 `blockHash` 等於 `fromBlock` = `toBlock` = 具有雜湊值 `blockHash` 的區塊編號。 如果 `blockHash` 出現在篩選條件中,則 `fromBlock` 和 `toBlock` 都不允許使用。 +- `blockhash`: `DATA`,32 位元組 - (可選,**future**),新增 EIP-234 後,`blockHash` 將是一個新的篩選條件選項,會將傳回的日誌限制為具有 32 位元組雜湊值 `blockHash` 的單一區塊。 使用 `blockHash` 等於 `fromBlock` = `toBlock` = 具有雜湊值 `blockHash` 的區塊編號。 如果 `blockHash` 出現在篩選條件中,則 `fromBlock` 和 `toBlock` 都不允許使用。 ```js params: [ diff --git a/public/content/translations/zh/developers/docs/apis/json-rpc/index.md b/public/content/translations/zh/developers/docs/apis/json-rpc/index.md index 70f45f7cbce..0d3c4e6928f 100644 --- a/public/content/translations/zh/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/zh/developers/docs/apis/json-rpc/index.md @@ -1602,7 +1602,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x - `toBlock`: `QUANTITY|TAG` - (可选,默认值:`"latest"`)整型区块编号,或者`"latest"`表示最近提议的区块,`"safe"`表示最新的安全区块,`"finalized"`表示最近最终化的区块,或者`"pending"`、`"earliest"`表示尚未在区块中的交易。 - `address`: `DATA|Array`,20 字节 -(可选)日志起源的合约地址或地址列表。 - `topics`: `Array of DATA` -(可选)32 字节 `DATA` 主题数组。 主题是顺序相关的。 每个主题也可以是带有“或”选项的 DATA 数组。 -- `blockHash`: `DATA`,32 字节 -(可选,**future**),添加 EIP-234 后,`blockHash` 将是一个新的过滤器选项,它会将返回的日志限制为具有 32 字节哈希 `blockHash` 的单一区块。 使用 `blockHash` 相当于 `fromBlock` = `toBlock` = 具有哈希 `blockHash` 的区块编号。 如果 `blockHash` 出现在筛选条件中,则 `fromBlock` 和 `toBlock` 都不允许。 +- `blockhash`: `DATA`,32 字节 -(可选,**future**),添加 EIP-234 后,`blockHash` 将是一个新的过滤器选项,它会将返回的日志限制为具有 32 字节哈希 `blockHash` 的单一区块。 使用 `blockHash` 相当于 `fromBlock` = `toBlock` = 具有哈希 `blockHash` 的区块编号。 如果 `blockHash` 出现在筛选条件中,则 `fromBlock` 和 `toBlock` 都不允许。 ```js params: [ From 60676344e79e9c3faebe16c39f5d868e5bb415d0 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:20:29 -0700 Subject: [PATCH 088/171] fix: json rpc doc eth_getLogs block hash parameter Co-Authored-By: Bob <203082506+chainide-agent-bob@users.noreply.github.com> --- 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 73dac1fc31f..fba8e8cb4b0 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -1623,7 +1623,7 @@ Returns an array of all logs matching a given filter object. - `toBlock`: `QUANTITY|TAG` - (optional, default: `"latest"`) Integer block number, or `"latest"` for the last proposed block, `"safe"` for the latest safe block, `"finalized"` for the latest finalized block, or `"pending"`, `"earliest"` for transactions not yet in a block. - `address`: `DATA|Array`, 20 Bytes - (optional) Contract address or a list of addresses from which logs should originate. - `topics`: `Array of DATA`, - (optional) Array of 32 Bytes `DATA` topics. Topics are order-dependent. Each topic can also be an array of DATA with "or" options. -- `blockhash`: `DATA`, 32 Bytes - (optional, **future**) With the addition of EIP-234, `blockHash` will be a new filter option which restricts the logs returned to the single block with the 32-byte hash `blockHash`. Using `blockHash` is equivalent to `fromBlock` = `toBlock` = the block number with hash `blockHash`. If `blockHash` is present in the filter criteria, then neither `fromBlock` nor `toBlock` are allowed. +- `blockHash`: `DATA`, 32 Bytes - (optional, **future**) With the addition of EIP-234, `blockHash` will be a new filter option which restricts the logs returned to the single block with the 32-byte hash `blockHash`. Using `blockHash` is equivalent to `fromBlock` = `toBlock` = the block number with hash `blockHash`. If `blockHash` is present in the filter criteria, then neither `fromBlock` nor `toBlock` are allowed. ```js params: [ From 56b923fb810fe94aa1c95fbc73b104ab1ad799f1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 23:26:37 +0000 Subject: [PATCH 089/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f081aab2b07..c1ac58ac7da 100644 --- a/README.md +++ b/README.md @@ -2003,6 +2003,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Oleg Gorbatiuk
    Oleg Gorbatiuk

    🖋 + deca
    deca

    📋 From 67d5de64cfa6d19241297891951d418858a6001b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 23:26:38 +0000 Subject: [PATCH 090/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 280265cd833..b40cf5bff5c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12856,6 +12856,15 @@ "contributions": [ "content" ] + }, + { + "login": "deca12x", + "name": "deca", + "avatar_url": "https://avatars.githubusercontent.com/u/74135582?v=4", + "profile": "https://github.com/deca12x", + "contributions": [ + "eventOrganizing" + ] } ], "contributorsPerLine": 7, From d04b44815b6e5987ba94951b50ba9e99f334397c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 23:28:55 +0000 Subject: [PATCH 091/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c1ac58ac7da..e4995b85dff 100644 --- a/README.md +++ b/README.md @@ -2004,6 +2004,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Oleg Gorbatiuk
    Oleg Gorbatiuk

    🖋 deca
    deca

    📋 + Anish Gupta
    Anish Gupta

    💻 From baa96ffa3834b328e62c24b889778f526d171f80 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 23:28:56 +0000 Subject: [PATCH 092/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b40cf5bff5c..fc11c87ca1b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12865,6 +12865,15 @@ "contributions": [ "eventOrganizing" ] + }, + { + "login": "Anish-Gupta1", + "name": "Anish Gupta ", + "avatar_url": "https://avatars.githubusercontent.com/u/180473292?v=4", + "profile": "https://github.com/Anish-Gupta1", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From d8e16ed2e5a281032c6d8f0fb971b8b0d2f38a45 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:41:57 -0700 Subject: [PATCH 093/171] chore: clean up tailwind syntax --- .../Staking/StakingProductsCardGrid/StakingProductCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx b/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx index 4231cfbf240..95d7d3ee5ae 100644 --- a/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx +++ b/src/components/Staking/StakingProductsCardGrid/StakingProductCard.tsx @@ -191,7 +191,7 @@ export const StakingProductCard = ({ {data.map(({ label, status }, idx) => (
  • {label} From 4f78cf0d446762fbe3300f2f3c2f3699f8d172c7 Mon Sep 17 00:00:00 2001 From: tsatsch <63811548+Tsatsch@users.noreply.github.com> Date: Thu, 17 Jul 2025 11:42:18 +0200 Subject: [PATCH 094/171] added TUM Blockchain Conference to community-events.json --- src/data/community-events.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/community-events.json b/src/data/community-events.json index c45272727fa..6a2972ad530 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -176,6 +176,15 @@ "imageUrl": "https://ethistanbul.io/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fistanbul-background.99d6ad2a.webp&w=3840&q=75", "hackathon": true }, + { + "title": "TUM Blockchain Conference", + "startDate": "2025-09-11", + "endDate": "2025-09-12", + "href": "https://conference.tum-blockchain.com", + "location": "Munich, Germany", + "description": "Europe's top Blockchain Conference in Munich is back! Discover how Web3 is moving beyond promise to real world impact with top experts.", + "imageUrl": "https://conference.tum-blockchain.com/banners/c25-banner.svg" + }, { "title": "ETHSofia", "startDate": "2025-09-23", From e0c5eaf991b913e53dfee41f3483dade6e8250ac Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:16:59 +0000 Subject: [PATCH 095/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e4995b85dff..9d47c75943e 100644 --- a/README.md +++ b/README.md @@ -2005,6 +2005,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Oleg Gorbatiuk
    Oleg Gorbatiuk

    🖋 deca
    deca

    📋 Anish Gupta
    Anish Gupta

    💻 + Rohit Gupta
    Rohit Gupta

    💻 From 3d34d876ead5d3811d97664137598b2af37b9eaa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:17:00 +0000 Subject: [PATCH 096/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index fc11c87ca1b..31e1386995c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12874,6 +12874,15 @@ "contributions": [ "code" ] + }, + { + "login": "rohitt-gupta", + "name": "Rohit Gupta", + "avatar_url": "https://avatars.githubusercontent.com/u/81370462?v=4", + "profile": "https://rohitt.in", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From 036f4842960452fdb3493d3ef3964404d537d53b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 09:02:41 -0700 Subject: [PATCH 097/171] fix: differentiate events with locale [Fixes #11521] --- .../hooks/useWalletFilters.tsx | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/components/FindWalletProductTable/hooks/useWalletFilters.tsx b/src/components/FindWalletProductTable/hooks/useWalletFilters.tsx index b6255ebcca4..f3edd652317 100644 --- a/src/components/FindWalletProductTable/hooks/useWalletFilters.tsx +++ b/src/components/FindWalletProductTable/hooks/useWalletFilters.tsx @@ -1,4 +1,5 @@ import { useRef } from "react" +import { useLocale } from "next-intl" import { FilterOption } from "@/lib/types" @@ -36,6 +37,7 @@ import { DEFAULT_LOCALE } from "@/lib/constants" import { useTranslation } from "@/hooks/useTranslation" export const useWalletFilters = (): FilterOption[] => { + const locale = useLocale() const { t } = useTranslation("page-wallets-find-wallet") const prevNetworkArray = useRef([]) return [ @@ -95,7 +97,7 @@ export const useWalletFilters = (): FilterOption[] => { ) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-android")}`, + eventAction: `${locale} - ${t("page-find-wallet-android")}`, eventName: `android ${newInputState}`, }) updateFilterState( @@ -136,7 +138,7 @@ export const useWalletFilters = (): FilterOption[] => { ) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-iOS")}`, + eventAction: `${locale} - ${t("page-find-wallet-iOS")}`, eventName: `iOS ${newInputState}`, }) updateFilterState( @@ -168,7 +170,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-desktop")}`, + eventAction: `${locale} - ${t("page-find-wallet-desktop")}`, eventName: `desktop ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -204,7 +206,7 @@ export const useWalletFilters = (): FilterOption[] => { ) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-linux")}`, + eventAction: `${locale} - ${t("page-find-wallet-linux")}`, eventName: `linux ${newInputState}`, }) updateFilterState( @@ -245,7 +247,7 @@ export const useWalletFilters = (): FilterOption[] => { ) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-windows")}`, + eventAction: `${locale} - ${t("page-find-wallet-windows")}`, eventName: `windows ${newInputState}`, }) updateFilterState( @@ -286,7 +288,7 @@ export const useWalletFilters = (): FilterOption[] => { ) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-macOS")}`, + eventAction: `${locale} - ${t("page-find-wallet-macOS")}`, eventName: `macOS ${newInputState}`, }) updateFilterState( @@ -318,7 +320,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-browser")}`, + eventAction: `${locale} - ${t("page-find-wallet-browser")}`, eventName: `browser ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -354,7 +356,7 @@ export const useWalletFilters = (): FilterOption[] => { ) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-chromium")}`, + eventAction: `${locale} - ${t("page-find-wallet-chromium")}`, eventName: `chromium ${newInputState}`, }) updateFilterState( @@ -395,7 +397,7 @@ export const useWalletFilters = (): FilterOption[] => { ) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-firefox")}`, + eventAction: `${locale} - ${t("page-find-wallet-firefox")}`, eventName: `firefox ${newInputState}`, }) updateFilterState( @@ -427,7 +429,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-hardware")}`, + eventAction: `${locale} - ${t("page-find-wallet-hardware")}`, eventName: `hardware ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -522,7 +524,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-buy-crypto")}`, + eventAction: `${locale} - ${t("page-find-wallet-buy-crypto")}`, eventName: `buy_crypto ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -549,7 +551,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-sell-for-fiat")}`, + eventAction: `${locale} - ${t("page-find-wallet-sell-for-fiat")}`, eventName: `withdraw_crypto ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -582,7 +584,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-connect-to-dapps")}`, + eventAction: `${locale} - ${t("page-find-wallet-connect-to-dapps")}`, eventName: `connect_to_dapps ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -609,7 +611,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-nft-support")}`, + eventAction: `${locale} - ${t("page-find-wallet-nft-support")}`, eventName: `nft_support ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -636,7 +638,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-staking")}`, + eventAction: `${locale} - ${t("page-find-wallet-staking")}`, eventName: `staking ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -663,7 +665,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-layer-2")}`, + eventAction: `${locale} - ${t("page-find-wallet-layer-2")}`, eventName: `layer_2 ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -690,7 +692,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-swaps")}`, + eventAction: `${locale} - ${t("page-find-wallet-swaps")}`, eventName: `swaps ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -717,7 +719,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-hardware-wallet-support")}`, + eventAction: `${locale} - ${t("page-find-wallet-hardware-wallet-support")}`, eventName: `hardware_support ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -744,7 +746,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-ens-support")}`, + eventAction: `${locale} - ${t("page-find-wallet-ens-support")}`, eventName: `ens_support ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -777,7 +779,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-open-source")}`, + eventAction: `${locale} - ${t("page-find-wallet-open-source")}`, eventName: `open_source ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -804,7 +806,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-non-custodial")}`, + eventAction: `${locale} - ${t("page-find-wallet-non-custodial")}`, eventName: `non_custodial ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -837,7 +839,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-multisig")}`, + eventAction: `${locale} - ${t("page-find-wallet-multisig")}`, eventName: `multisig ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -864,7 +866,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-social-recovery")}`, + eventAction: `${locale} - ${t("page-find-wallet-social-recovery")}`, eventName: `social_recovery ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -897,7 +899,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-rpc-importing")}`, + eventAction: `${locale} - ${t("page-find-wallet-rpc-importing")}`, eventName: `rpc_importing ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) @@ -924,7 +926,7 @@ export const useWalletFilters = (): FilterOption[] => { updateFilterState={(filterIndex, itemIndex, newInputState) => { trackCustomEvent({ eventCategory: "WalletFilterSidebar", - eventAction: `${t("page-find-wallet-token-importing")}`, + eventAction: `${locale} - ${t("page-find-wallet-token-importing")}`, eventName: `erc_20_support ${newInputState}`, }) updateFilterState(filterIndex, itemIndex, newInputState) From 0c74ec08ac9715a17285857de7d8a471657fd948 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 20:23:36 +0000 Subject: [PATCH 098/171] fix: correct grammatical error in DeFi page Changed "This make loans" to "This makes loans" in the Access to global funds section. Fixes #15857 Co-authored-by: Jakub --- public/content/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/defi/index.md b/public/content/defi/index.md index c3f30156fb2..10e54046e1e 100644 --- a/public/content/defi/index.md +++ b/public/content/defi/index.md @@ -140,7 +140,7 @@ This allows you to borrow money without credit checks or handing over private in #### Access to global funds {#access-global-funds} -When you use a decentralized lender you have access to funds deposited from all over the globe, not just the funds in the custody of your chosen bank or institution. This make loans more accessible and improves the interest rates. +When you use a decentralized lender you have access to funds deposited from all over the globe, not just the funds in the custody of your chosen bank or institution. This makes loans more accessible and improves the interest rates. #### Tax-efficiencies {#tax-efficiencies} From f47b341584226c86e870a857aab2221c4c58c4e4 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:50:33 -0700 Subject: [PATCH 099/171] fix: outdated max-eb copy in solo faq --- public/content/staking/solo/index.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/content/staking/solo/index.md b/public/content/staking/solo/index.md index 24df7e16c90..372c34e774a 100644 --- a/public/content/staking/solo/index.md +++ b/public/content/staking/solo/index.md @@ -134,9 +134,13 @@ A validator is a virtual entity that lives on Ethereum and participates -Each key-pair associated with a validator requires exactly 32 ETH to be activated. More ETH deposited to a single set of keys does not increase rewards potential, as each validator is limited to an effective balance of 32 ETH. This means that staking is done in 32 ETH increments, each with it's own set of keys and balance. +Yes, modern validator accounts are capable of holding up to 2048 ETH. Additional ETH over 32 will compound in a step-wise manner, increasing in whole-number increments as your true balance increases. This is known as your effective balance. -Do not deposit more than 32 ETH for a single validator. It will not increase your rewards. If a withdrawal address has been set for the validator, excess funds over 32 ETH will be automatically withdrawn to this address during the next validator sweep. +To increase the effective balance of an account, and thus increase rewards, a buffer of 0.25 ETH above any full-ETH threshold must be crossed. For example, an account with a true balance of 32.9 and an effective balance of 32 would need to earn another 0.35 ETH to bring it's true balance above 33.25 before triggering an increase in effective balance. + +This buffer prevents also prevents an effective balance from dropping until it has gone 0.25 ETH below it's current effective balance. + +Each key-pair associated with a validator requires at least 32 ETH to be activated. Any balance above this may be withdrawn to the associated withdrawal address at any time via a transaction signed by this address. Any funds over the maximum effective balance will automatically be withdrawn on a periodic basis. If home staking seems too demanding for you, consider using a staking-as-a-service provider, or if you're working with less than 32 ETH, check out the staking pools. From 598b442f12e5f04143b1f418a6e45089538d49bd Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 16:47:07 -0700 Subject: [PATCH 100/171] fix: buidlbox data and icon use og:description; trim image for square aspect ratio; rm deprecated string --- public/images/dapps/buidlbox.png | Bin 27884 -> 3835 bytes .../useStablecoinAccordion.ts | 2 +- src/intl/en/page-stablecoins.json | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/images/dapps/buidlbox.png b/public/images/dapps/buidlbox.png index f84fdd5fc0271bb95912ea0650b340b4087692b3..114a4d75bf9162315636232d89c04cef584008c2 100644 GIT binary patch literal 3835 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 literal 27884 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

    B9Q)q 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 diff --git a/src/components/StablecoinAccordion/useStablecoinAccordion.ts b/src/components/StablecoinAccordion/useStablecoinAccordion.ts index bc22aac4f20..c42b7c8cdf7 100644 --- a/src/components/StablecoinAccordion/useStablecoinAccordion.ts +++ b/src/components/StablecoinAccordion/useStablecoinAccordion.ts @@ -62,7 +62,7 @@ export const useStablecoinAccordion = () => { const earn: Array = [ { - title: t("page-stablecoins-accordion-earn-project-bounties"), + title: "buidlbox", image: buidlboxImg, link: "https://app.buidlbox.io/", description: t("page-stablecoins-accordion-earn-project-1-description"), diff --git a/src/intl/en/page-stablecoins.json b/src/intl/en/page-stablecoins.json index 50a1f79c29f..9d42c921aef 100644 --- a/src/intl/en/page-stablecoins.json +++ b/src/intl/en/page-stablecoins.json @@ -26,6 +26,7 @@ "page-stablecoins-accordion-buy-text-preview": "A lot of exchanges and wallets let you buy stablecoins directly. Geographical restrictions will apply.", "page-stablecoins-accordion-buy-title": "Buy", "page-stablecoins-accordion-buy-warning": "Centralized exchanges may only list fiat-backed stablecoins like USDC, Tether, and others. You may not be able to buy them directly, but you should be able to exchange them from ETH or other cryptocurrencies that you can buy on the platform.", + "page-stablecoins-accordion-earn-project-1-description": "Ongoing and upcoming hackathons. Every buidlers gateway into the digital frontier.", "page-stablecoins-accordion-earn-project-2-description": "Technology, content, and other work for the MakerDao community (the team that brought you Dai).", "page-stablecoins-accordion-earn-project-3-description": "When you really know your stuff, find bugs to earn Dai.", "page-stablecoins-accordion-earn-project-bug-bounties": "Consensus layer bug bounties", @@ -189,7 +190,6 @@ "page-stablecoins-show-more": "Show more", "page-stablecoins-no-results": "No stablecoins match the current filters", "gemini-logo": "Gemini logo", - "gitcoin-logo": "Gitcoin logo", "makerdao-logo": "MakerDao logo", "matcha-logo": "Matcha logo", "sparkfi-logo": "Spark Protocol logo", From 755345b6ded161c0256231da394d8353ad49f2bd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:50:22 +0000 Subject: [PATCH 101/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9d47c75943e..5bc9becc60b 100644 --- a/README.md +++ b/README.md @@ -2006,6 +2006,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d deca
    deca

    📋 Anish Gupta
    Anish Gupta

    💻 Rohit Gupta
    Rohit Gupta

    💻 + Roman Mazurenko
    Roman Mazurenko

    🚧 From 210a7ef9d230d3b14874e9503376e24300c00135 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:50:24 +0000 Subject: [PATCH 102/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 31e1386995c..55fc5110452 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12883,6 +12883,15 @@ "contributions": [ "code" ] + }, + { + "login": "rvmz", + "name": "Roman Mazurenko", + "avatar_url": "https://avatars.githubusercontent.com/u/92804957?v=4", + "profile": "https://github.com/rvmz", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 3a73f3d55e62cf5a3d31e7f6c2413c0557266487 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 16:55:24 -0700 Subject: [PATCH 103/171] chore: remove broken project link --- .../developers/docs/data-and-analytics/block-explorers/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/content/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/developers/docs/data-and-analytics/block-explorers/index.md index acb58e1a1e5..7079143563a 100644 --- a/public/content/developers/docs/data-and-analytics/block-explorers/index.md +++ b/public/content/developers/docs/data-and-analytics/block-explorers/index.md @@ -25,7 +25,6 @@ You should understand the basic concepts of Ethereum so you can make sense of th - [Ethplorer](https://ethplorer.io/) -_Also available in Chinese, Spanish, French, Turkish, Russian, Korean and Vietnamese_ - [EthVM](https://www.ethvm.com/) - [OKLink](https://www.oklink.com/eth) -- [Rantom](https://rantom.app/) - [Ethseer](https://ethseer.io) ## Open source tools {#open-source-tools} @@ -244,7 +243,6 @@ The consensus layer top-level data includes the following: - [Blockchair](https://blockchair.com/ethereum) - the most private Ethereum explorer. Also for sorting and filtering (mempool) data - [Etherchain](https://www.etherchain.org/) - a block explorer for the Ethereum Mainnet - [Ethplorer](https://ethplorer.io/) - a block explorer with a focus on tokens for the Ethereum Mainnet and the Kovan testnet -- [Rantom](https://rantom.app/) - A user-friendly open-source DeFi & NFT transaction viewer for detailed insights - [Ethernow](https://www.ethernow.xyz/) - a real-time transaction explorer that enables you to see the Ethereum Mainnet pre-chain layer ## Further reading {#further-reading} From 4e5982ab896dccc845c1b03218342dabe30a4c56 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 17:00:33 -0700 Subject: [PATCH 104/171] Revert "chore: fix 404 status URL" This reverts commit 94c791bb1b1b7398a9f2229f4421c6a5fa70aca4. --- public/content/developers/docs/smart-contracts/testing/index.md | 2 +- .../cs/developers/docs/smart-contracts/testing/index.md | 2 +- .../de/developers/docs/smart-contracts/testing/index.md | 2 +- .../el/developers/docs/smart-contracts/testing/index.md | 2 +- .../es/developers/docs/smart-contracts/testing/index.md | 2 +- .../fa/developers/docs/smart-contracts/testing/index.md | 2 +- .../fr/developers/docs/smart-contracts/testing/index.md | 2 +- .../hu/developers/docs/smart-contracts/testing/index.md | 2 +- .../it/developers/docs/smart-contracts/testing/index.md | 2 +- .../ja/developers/docs/smart-contracts/testing/index.md | 2 +- .../pt-br/developers/docs/smart-contracts/testing/index.md | 2 +- .../tr/developers/docs/smart-contracts/testing/index.md | 2 +- .../zh/developers/docs/smart-contracts/testing/index.md | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/content/developers/docs/smart-contracts/testing/index.md b/public/content/developers/docs/smart-contracts/testing/index.md index 78c9e6dcc49..30f27ac1a9e 100644 --- a/public/content/developers/docs/smart-contracts/testing/index.md +++ b/public/content/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ The major difference is that bug bounty programs are open to the wider developer - **[Brownie unit testing framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utilizes Pytest, a feature-rich test framework that lets you write small tests with minimal code, scales well for large projects, and is highly extendable._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry offers Forge, a fast and flexible Ethereum testing framework capable of executing simple unit tests, gas optimization checks, and contract fuzzing._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry offers Forge, a fast and flexible Ethereum testing framework capable of executing simple unit tests, gas optimization checks, and contract fuzzing._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework for testing smart contracts based on ethers.js, Mocha, and Chai._ diff --git a/public/content/translations/cs/developers/docs/smart-contracts/testing/index.md b/public/content/translations/cs/developers/docs/smart-contracts/testing/index.md index fc2ad7309f9..56f7eccddab 100644 --- a/public/content/translations/cs/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/cs/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ Hlavní rozdíl spočívá v tom, že programy odměn za vyřešení chyb jsou o - **[Brownie unit testing framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** – _Brownie využívá Pytest, funkčně bohatý testovací framework, který umožňuje psát malé testy s minimem kódu, dobře se škáluje pro velké projekty a je vysoce rozšiřitelný._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _Foundry nabízí Forge, rychlý a flexibilní framework pro testování na Ethereu, který dokáže provádět jednoduché jednotkové testy, kontroly optimalizace paliva a fuzzing kontraktů._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** – _Foundry nabízí Forge, rychlý a flexibilní framework pro testování na Ethereu, který dokáže provádět jednoduché jednotkové testy, kontroly optimalizace paliva a fuzzing kontraktů._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Framework pro testování chytrých kontraktů založený na ethers.js, Mocha a Chai._ diff --git a/public/content/translations/de/developers/docs/smart-contracts/testing/index.md b/public/content/translations/de/developers/docs/smart-contracts/testing/index.md index a8cc09b7c0d..aa4a07cb8fe 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ Der Hauptunterschied besteht darin, dass Bug-Bounty-Programme der breiteren Entw - **[Brownie-Unit-Testing-Framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** – _Brownie nutzt Pytest, ein funktionsreiches Test-Framework, mit dem Sie kleine Tests mit minimalem Code schreiben können. Außerdem lässt es sich gut für große Projekte skalieren und ist in hohem Maße erweiterbar._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _Foundry bietet mit Forge ein schnelles und flexibles Ethereum-Testing-Framework an, das einfache Unit-Tests, Gas-Optimierungsprüfungen und Vertrags-Fuzzing durchführen kann._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** – _Foundry bietet mit Forge ein schnelles und flexibles Ethereum-Testing-Framework an, das einfache Unit-Tests, Gas-Optimierungsprüfungen und Vertrags-Fuzzing durchführen kann._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Framework zum Testen von Smart Contracts basierend auf ethers.js, Mocha und Chai._ diff --git a/public/content/translations/el/developers/docs/smart-contracts/testing/index.md b/public/content/translations/el/developers/docs/smart-contracts/testing/index.md index f3d9610a1ad..84944ec7782 100644 --- a/public/content/translations/el/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/el/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ function auctionEnd() external { - **[Πλαίσιο δοκιμής μονάδας Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Το Brownie χρησιμοποιεί το Pytest, ένα πλούσιο σε χαρακτηριστικά πλαίσιο δοκιμών που σας επιτρέπει να γράφετε μικρές δοκιμές με ελάχιστο κώδικα, κλιμακώνεται καλά σε μεγάλα έργα και είναι ιδιαίτερα επεκτάσιμο._ -- **[Δοκιμές Foundry](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Το Foundry προσφέρει το Forge, ένα γρήγορο και ευέλικτο πλαίσιο δοκιμών Ethereum ικανό να εκτελεί απλές δοκιμές μονάδας, ελέγχους βελτιστοποίησης gas και fuzzing συμβολαίων._ +- **[Δοκιμές Foundry](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Το Foundry προσφέρει το Forge, ένα γρήγορο και ευέλικτο πλαίσιο δοκιμών Ethereum ικανό να εκτελεί απλές δοκιμές μονάδας, ελέγχους βελτιστοποίησης gas και fuzzing συμβολαίων._ - **[Δοκιμές Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Πλαίσιο για δοκιμή έξυπνων συμβολαίων βασισμένο σε ethers.js, Mocha και Chai._ diff --git a/public/content/translations/es/developers/docs/smart-contracts/testing/index.md b/public/content/translations/es/developers/docs/smart-contracts/testing/index.md index 21e1c0e5064..c42c30df4e1 100644 --- a/public/content/translations/es/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/es/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ La diferencia principal es que los programas de recompensas por errores están a - **[Marco de pruebas unitarias de Brownie:](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** _Brownie utiliza Pytest, un marco de pruebas rico en funciones que le permite escribir pequeñas pruebas con código mínimo, escala bien para proyectos grandes y es altamente extendible._ -- **[Foundry Tests:](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** _Foundry ofrece Forge, un marco de pruebas de Ethereum rápido y flexible capaz de ejecutar pruebas unitarias simples, comprobaciones de optimización de gas y fuzzing de contratos._ +- **[Foundry Tests:](https://github.com/foundry-rs/foundry/tree/master/forge)** _Foundry ofrece Forge, un marco de pruebas de Ethereum rápido y flexible capaz de ejecutar pruebas unitarias simples, comprobaciones de optimización de gas y fuzzing de contratos._ - **[Hardhat Tests:](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** _Marco para probar contratos inteligentes basado en ethers.js, Mocha y Chai._ diff --git a/public/content/translations/fa/developers/docs/smart-contracts/testing/index.md b/public/content/translations/fa/developers/docs/smart-contracts/testing/index.md index 54a7c41ddf4..3349ec8baa1 100644 --- a/public/content/translations/fa/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/fa/developers/docs/smart-contracts/testing/index.md @@ -313,7 +313,7 @@ function auctionEnd() external { - **[فریم ورک تست واحد براونی](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _براونی از Pytest استفاده می‌کند، یک فریم ورک تستی غنی از ویژگی‌ها که به شما امکان می‌دهد تست‌های کوچک را با حداقل کد بنویسید و برای پروژه‌های بزرگ مقیاس‌پذیری خوبی دارد و بسیار قابل توسعه است._ -- **[تست‌های فاندری ](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry Forge را ارائه می‌کند، یک فریم ورک آزمایشی سریع و انعطاف‌پذیر اتریوم که قادر به اجرای آزمایش‌های واحد ساده، بررسی‌های بهینه‌سازی گس و فازبندی قرارداد است._ +- **[تست‌های فاندری ](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry Forge را ارائه می‌کند، یک فریم ورک آزمایشی سریع و انعطاف‌پذیر اتریوم که قادر به اجرای آزمایش‌های واحد ساده، بررسی‌های بهینه‌سازی گس و فازبندی قرارداد است._ - **[تست‌های هاردهت](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _چارچوبی برای آزمایش قراردادهای هوشمند مبتنی بر ethers.js، موکا و چای است._ diff --git a/public/content/translations/fr/developers/docs/smart-contracts/testing/index.md b/public/content/translations/fr/developers/docs/smart-contracts/testing/index.md index 8fef1f89fc5..61ea726eb67 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ La principale différence est que les programmes de primes aux bogues sont ouver - **Cadre de test unitaire Brownie** - _Brownie utilise Pytest, un cadre de test riche en fonctionnalités qui vous permet d'écrire de petits tests avec un code minimal, qui s'adapte bien aux grands projets et qui est hautement extensible._ -- **[Tests Foundy](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry propose Forge, un cadre de test Ethereum rapide et flexible capable d'exécuter des tests unitaires simples, des contrôles d'optimisation du gaz et du fuzzing de contrats._ +- **[Tests Foundy](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry propose Forge, un cadre de test Ethereum rapide et flexible capable d'exécuter des tests unitaires simples, des contrôles d'optimisation du gaz et du fuzzing de contrats._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework pour tester des contrats intelligents basés sur ethers.js, Mocha et Chai._ diff --git a/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md b/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md index 5c56dcfded7..18fa6d86692 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ A fő különbség az, hogy a hibavadász-programok nyitottak a szélesebb fejle - **[Brownie unit testing framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** – _A Brownie a Pytest-et használja, amely egy funkciógazdag tesztelési keretrendszert, és amely lehetővé teszi kis tesztek írását minimális kóddal, jól skálázható nagyobb projektekhez és nagymértékben bővíthető._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _A Foundry a Forge megoldást kínálja, amely egy gyors és rugalmas Ethereum tesztelési keretrendszert, és amely képes egyszerű egységtesztek, gázoptimalizálási ellenőrzések és szerződés fuzzing végrehajtására._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** – _A Foundry a Forge megoldást kínálja, amely egy gyors és rugalmas Ethereum tesztelési keretrendszert, és amely képes egyszerű egységtesztek, gázoptimalizálási ellenőrzések és szerződés fuzzing végrehajtására._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Keretrendszer az ethers.js, Mocha és Chai alapú okosszerződések tesztelésére._ diff --git a/public/content/translations/it/developers/docs/smart-contracts/testing/index.md b/public/content/translations/it/developers/docs/smart-contracts/testing/index.md index 50acba857b7..a3dbddf8e4b 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ La differenza principale è che i programmi di bug bounty sono aperti alla più - **[Quadro di test unitari di Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utilizza Pytest, un quadro di test ricco di funzionalità che ti consente di scrivere piccoli test con codice minimale, si ridimensiona bene per i grandi progetti ed è altamente estendibile._ -- **[Test di Foundry](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry offre Forge, un quadro di test di Ethereum veloci e flessibili, in grado di eseguire semplici test unitari, controlli d'ottimizzazione del carburante e fuzzing del contratto._ +- **[Test di Foundry](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry offre Forge, un quadro di test di Ethereum veloci e flessibili, in grado di eseguire semplici test unitari, controlli d'ottimizzazione del carburante e fuzzing del contratto._ - **[Test di Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Quadro per testare i contratti intelligenti basato su ethers.js, Mocha e Chai._ diff --git a/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md b/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md index 38d5f3c8674..ec7f3f969f1 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ Solidityスマートコントラクト用の単体テストフレームワーク - **[Brownieユニットテストフレームワーク](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _最小限のコードで小さなテストを作成可能。また、大規模なプロジェクトにも対応するスケーラビリティも持ち合わせており、機能豊富なテストフレームワークであるPytestを利用しています。_ -- **[Foundryテスト](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry社は、シンプルな単体テスト、ガス最適化チェック、コントラクトファジングを実行でき、高速で柔軟なイーサリアムテストフレームワークであるForgeを提供しています。_ +- **[Foundryテスト](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry社は、シンプルな単体テスト、ガス最適化チェック、コントラクトファジングを実行でき、高速で柔軟なイーサリアムテストフレームワークであるForgeを提供しています。_ - **[Hardhatテスト](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _ethers.js、Mocha、Chaiをベースとしたスマートコントラクトテストにおけるフレームワーク_。 diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md index 7cddcb77927..51b9be26a36 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ A maior diferença é que programas de recompensa por bug são abertos a uma mai - **[Framework de teste de unidade do Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utiliza Pytest, uma estrutura de teste rica em recursos que permite que você escreva pequenos testes com o mínimo de código, escala bem para grandes projetos e é altamente extensível._ -- **[Froundry Testes](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry oferece o Forge, um framework de teste no Ethereum rápido e flexível, capaz de executar testes de unidade simples, verificações de otimização de gás e mutações (fuzzing) em contratos._ +- **[Froundry Testes](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry oferece o Forge, um framework de teste no Ethereum rápido e flexível, capaz de executar testes de unidade simples, verificações de otimização de gás e mutações (fuzzing) em contratos._ - **[Hardhat Testes](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework para testar contratos inteligentes com base no ethers.js, Mocha e Chai._ diff --git a/public/content/translations/tr/developers/docs/smart-contracts/testing/index.md b/public/content/translations/tr/developers/docs/smart-contracts/testing/index.md index bd19b926220..ed57f505437 100644 --- a/public/content/translations/tr/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/tr/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ En önemli fark, hata ödül programlarının daha geniş bir geliştirici/hacke - **[Brownie birim test çerçevesi](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie, minimum kodla küçük testler yazmanıza olanak tanıyan, büyük projeler için iyi ölçeklenen ve oldukça genişletilebilir, zengin özelliklere sahip bir test çerçevesi olan Pytest'i kullanır._ -- **[Foundry Testleri](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry, basit birim testleri, gaz optimizasyon kontrolleri ve sözleşme bulanıklaştırma gerçekleştirebilen hızlı ve esnek bir Ethereum test çerçevesi olan Forge'u barındırır._ +- **[Foundry Testleri](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry, basit birim testleri, gaz optimizasyon kontrolleri ve sözleşme bulanıklaştırma gerçekleştirebilen hızlı ve esnek bir Ethereum test çerçevesi olan Forge'u barındırır._ - **[Hardhat Testleri](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Ethers.js, Mocha ve Chai tabanlı akıllı sözleşme test çerçevesi._ diff --git a/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md b/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md index b97d20a0ec8..e1833c0fc0b 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ function auctionEnd() external { - **[Brownie 单元测试框架](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie 采用了 Pytest,这是一个功能丰富的测试框架,让你只需使用最少的代码即可编写小型测试,并能有效地扩展以用于大型项目,而且具有很强的可扩展性。_ -- **[Foundry 测试](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry 提供了 Forge,这是一个快速灵活的以太坊测试框架,能够执行简单的单元测试、燃料优化检查和合约模糊测试。_ +- **[Foundry 测试](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry 提供了 Forge,这是一个快速灵活的以太坊测试框架,能够执行简单的单元测试、燃料优化检查和合约模糊测试。_ - **[Hardhat 测试](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _基于 ethers.js、Mocha 和 Chai 的智能合约测试框架。_ From da3af2b28ddfc0b9c3a84580cc94ee54ff292e22 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 17:01:12 -0700 Subject: [PATCH 105/171] chore: fix 404 status URL Co-Authored-By: ZhengXingRu <163401255+standstaff@users.noreply.github.com> --- public/content/developers/docs/smart-contracts/testing/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/smart-contracts/testing/index.md b/public/content/developers/docs/smart-contracts/testing/index.md index 30f27ac1a9e..78c9e6dcc49 100644 --- a/public/content/developers/docs/smart-contracts/testing/index.md +++ b/public/content/developers/docs/smart-contracts/testing/index.md @@ -259,7 +259,7 @@ The major difference is that bug bounty programs are open to the wider developer - **[Brownie unit testing framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utilizes Pytest, a feature-rich test framework that lets you write small tests with minimal code, scales well for large projects, and is highly extendable._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry offers Forge, a fast and flexible Ethereum testing framework capable of executing simple unit tests, gas optimization checks, and contract fuzzing._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry offers Forge, a fast and flexible Ethereum testing framework capable of executing simple unit tests, gas optimization checks, and contract fuzzing._ - **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework for testing smart contracts based on ethers.js, Mocha, and Chai._ From 5ccbfd0eac8426fc088778f3e2bbcf05eca9513c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 00:02:28 +0000 Subject: [PATCH 106/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5bc9becc60b..9fbf5d7dec6 100644 --- a/README.md +++ b/README.md @@ -2007,6 +2007,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Anish Gupta
    Anish Gupta

    💻 Rohit Gupta
    Rohit Gupta

    💻 Roman Mazurenko
    Roman Mazurenko

    🚧 + ZhengXingRu
    ZhengXingRu

    🚧 From 4ec2651b065ac55703fd1ea665223e4b379edd42 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 00:02:29 +0000 Subject: [PATCH 107/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 55fc5110452..9c7280511c2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12892,6 +12892,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "standstaff", + "name": "ZhengXingRu", + "avatar_url": "https://avatars.githubusercontent.com/u/163401255?v=4", + "profile": "https://github.com/standstaff", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From cddfb83e8ba482c0b5b6d47e486fcee164589279 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 00:08:41 +0000 Subject: [PATCH 108/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9fbf5d7dec6..c0417d90f95 100644 --- a/README.md +++ b/README.md @@ -2008,6 +2008,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Rohit Gupta
    Rohit Gupta

    💻 Roman Mazurenko
    Roman Mazurenko

    🚧 ZhengXingRu
    ZhengXingRu

    🚧 + barty
    barty

    🐛 From 50bab3c65da111337ea99382b277538999d8114b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 00:08:42 +0000 Subject: [PATCH 109/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9c7280511c2..4d69f8f3d00 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12901,6 +12901,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "imbarty", + "name": "barty", + "avatar_url": "https://avatars.githubusercontent.com/u/191963641?v=4", + "profile": "https://github.com/imbarty", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From 77a9ba540205522f4a0caa0150932f2f2e41764e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 00:19:55 +0000 Subject: [PATCH 110/171] docs: update README.md [skip ci] --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c0417d90f95..44e37d852fd 100644 --- a/README.md +++ b/README.md @@ -2010,6 +2010,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d ZhengXingRu
    ZhengXingRu

    🚧 barty
    barty

    🐛 + + futreall
    futreall

    🌍 🐛 + From 8496b87a60c953d410d23827082a21c8f8247fc4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 00:19:56 +0000 Subject: [PATCH 111/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4d69f8f3d00..a02c0ed1c54 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12910,6 +12910,16 @@ "contributions": [ "bug" ] + }, + { + "login": "futreall", + "name": "futreall", + "avatar_url": "https://avatars.githubusercontent.com/u/86553580?v=4", + "profile": "https://github.com/futreall", + "contributions": [ + "translation", + "bug" + ] } ], "contributorsPerLine": 7, From 596df2660b3e007ea5230c7e8861a841275a0337 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 17:40:17 -0700 Subject: [PATCH 112/171] patch: node_hash reversion #14486 accidentally reverted; reinstates changes from #13758 --- .../patricia-merkle-trie/index.md | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/public/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md index 31520bdcdee..fce9985f2d2 100644 --- a/public/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md +++ b/public/content/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -5,17 +5,17 @@ lang: en sidebarDepth: 2 --- -The state of Ethereum (the totality of all accounts, balances, and smart contracts), is encoded into a special version of the data structure known generally in computer science as a Merkle Tree. This structure is useful for many applications in cryptography because it creates a verifiable relationship between all the individual pieces of data entangled in the tree, resulting in a single **root** value that can be used to prove things about the data. +The state of Ethereum (the totality of all accounts, balances, and smart contracts), is encoded into a special version of the data structure known generally in computer science as a Merkle Tree. This structure is useful for many applications in cryptography because it creates a verifiable relationship between all the individual pieces of data entangled in the tree, resulting in a single **root** value that can be used to prove things about the data. -Ethereum's data structure is a 'modified Merkle-Patricia Trie', named so because it borrows some features of PATRICIA (the Practical Algorithm To Retrieve Information Coded in Alphanumeric), and because it is designed for efficient data re**trie**val of items that comprise the Ethereum state. +Ethereum's data structure is a 'modified Merkle-Patricia Trie', named so because it borrows some features of PATRICIA (the Practical Algorithm To Retrieve Information Coded in Alphanumeric), and because it is designed for efficient data re**trie**val of items that comprise the Ethereum state. -A Merkle-Patricia trie is deterministic and cryptographically verifiable: The only way to generate a state root is by computing it from each individual piece of the state, and two states that are identical can be easily proven so by comparing the root hash and the hashes that led to it (_a Merkle proof_). Conversely, there is no way to create two different states with the same root hash, and any attempt to modify state with different values will result in a different state root hash. Theoretically, this structure provides the 'holy grail' of `O(log(n))` efficiency for inserts, lookups and deletes. +A Merkle-Patricia trie is deterministic and cryptographically verifiable: The only way to generate a state root is by computing it from each individual piece of the state, and two states that are identical can be easily proven so by comparing the root hash and the hashes that led to it (_a Merkle proof_). Conversely, there is no way to create two different states with the same root hash, and any attempt to modify state with different values will result in a different state root hash. Theoretically, this structure provides the 'holy grail' of `O(log(n))` efficiency for inserts, lookups and deletes. -In the near future, Ethereum plans to migrate to a [Verkle Tree](https://ethereum.org/en/roadmap/verkle-trees) structure, which will open up many new possibilities for future protocol improvements. +In the near future, Ethereum plans to migrate to a [Verkle Tree](https://ethereum.org/en/roadmap/verkle-trees) structure, which will open up many new possibilities for future protocol improvements. ## Prerequisites {#prerequisites} -To better understand this page, it would be helpful to have basic knowledge of [hashes](https://en.wikipedia.org/wiki/Hash_function), [Merkle trees](https://en.wikipedia.org/wiki/Merkle_tree), [tries](https://en.wikipedia.org/wiki/Trie) and [serialization](https://en.wikipedia.org/wiki/Serialization). This article begins with a description of a basic [radix tree](https://en.wikipedia.org/wiki/Radix_tree), then gradually introduces the modifications necessary for Ethereum's more optimized data structure. +To better understand this page, it would be helpful to have basic knowledge of [hashes](https://en.wikipedia.org/wiki/Hash_function), [Merkle trees](https://en.wikipedia.org/wiki/Merkle_tree), [tries](https://en.wikipedia.org/wiki/Trie) and [serialization](https://en.wikipedia.org/wiki/Serialization). This article begins with a description of a basic [radix tree](https://en.wikipedia.org/wiki/Radix_tree), then gradually introduces the modifications necessary for Ethereum's more optimized data structure. ## Basic radix tries {#basic-radix-tries} @@ -34,8 +34,8 @@ There is a difference between looking something up in the 'trie' and the underly The update and delete operations for radix tries can be defined as follows: ```python - def update(node, path, value): - curnode = db.get(node) if node else [NULL] * 17 + def update(node_hash, path, value): + curnode = db.get(node_hash) if node_hash else [NULL] * 17 newnode = curnode.copy() if path == "": newnode[-1] = value @@ -45,8 +45,8 @@ The update and delete operations for radix tries can be defined as follows: db.put(hash(newnode), newnode) return hash(newnode) - def delete(node, path): - if node is NULL: + def delete(node_hash, path): + if node_hash is NULL: return NULL else: curnode = db.get(node_hash) @@ -95,12 +95,12 @@ When traversing paths in nibbles, we may end up with an odd number of nibbles to The flagging of both _odd vs. even remaining partial path length_ and _leaf vs. extension node_ as described above reside in the first nibble of the partial path of any 2-item node. They result in the following: - | hex char | bits | node type partial | path length | - | -------- | ---- | ------------------ | ----------- | - | 0 | 0000 | extension | even | - | 1 | 0001 | extension | odd | - | 2 | 0010 | terminating (leaf) | even | - | 3 | 0011 | terminating (leaf) | odd | +| hex char | bits | node type partial | path length | +| -------- | ---- | ------------------ | ----------- | +| 0 | 0000 | extension | even | +| 1 | 0001 | extension | odd | +| 2 | 0010 | terminating (leaf) | even | +| 3 | 0011 | terminating (leaf) | odd | For even remaining path length (`0` or `2`), another `0` "padding" nibble will always follow. @@ -138,12 +138,12 @@ Examples: Here is the extended code for getting a node in the Merkle Patricia trie: ```python - def get_helper(node, path): + def get_helper(node_hash, path): if path == []: - return node - if node == "": + return node_hash + if node_hash == "": return "" - curnode = rlp.decode(node if len(node) < 32 else db.get(node)) + curnode = rlp.decode(node_hash if len(node_hash) < 32 else db.get(node_hash)) if len(curnode) == 2: (k2, v2) = curnode k2 = compact_decode(k2) @@ -154,13 +154,13 @@ Here is the extended code for getting a node in the Merkle Patricia trie: elif len(curnode) == 17: return get_helper(curnode[path[0]], path[1:]) - def get(node, path): + def get(node_hash, path): path2 = [] for i in range(len(path)): path2.push(int(ord(path[i]) / 16)) path2.push(ord(path[i]) % 16) path2.push(16) - return get_helper(node, path2) + return get_helper(node_hash, path2) ``` ### Example Trie {#example-trie} From afd316fc939257a4f1f96b8424265bd72e153572 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 17:59:44 -0700 Subject: [PATCH 113/171] feat: use ButtonLink --- .../developers/docs/apis/json-rpc/index.md | 106 +++++++++++++----- .../docs/apis/json-rpc/playground.svg | 1 - ...nt-developers-docs-apis-json-rpc-data.json | 6 - 3 files changed, 77 insertions(+), 36 deletions(-) delete mode 100644 public/content/developers/docs/apis/json-rpc/playground.svg delete mode 100644 src/data/placeholders/content-developers-docs-apis-json-rpc-data.json diff --git a/public/content/developers/docs/apis/json-rpc/index.md b/public/content/developers/docs/apis/json-rpc/index.md index 270edf2b709..f8a203c2a29 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -303,7 +303,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[] Returns an object with data about the sync status or `false`. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_syncing) + + Try endpoint in playground + **Parameters** @@ -389,7 +391,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} Returns the client coinbase address. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_coinbase) + + Try endpoint in playground + > **Note:** This method has been deprecated as of **v1.14.0** and is no longer supported. Attempting to use this method will result in a "Method not supported" error. @@ -418,7 +422,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":6 Returns the chain ID used for signing replay-protected transactions. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_chainId) + + Try endpoint in playground + **Parameters** @@ -445,7 +451,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67 Returns `true` if client is actively mining new blocks. This can only return `true` for proof-of-work networks and may not be available in some clients since [The Merge](/roadmap/merge/). -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_mining) + + Try endpoint in playground + **Parameters** @@ -472,7 +480,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71} Returns the number of hashes per second that the node is mining with. This can only return `true` for proof-of-work networks and may not be available in some clients since [The Merge](/roadmap/merge/). -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_hashrate) + + Try endpoint in playground + **Parameters** @@ -499,7 +509,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":7 Returns an estimate of the current price per gas in wei. For example, the Besu client examines the last 100 blocks and returns the median gas unit price by default. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_gasPrice) + + Try endpoint in playground + **Parameters** @@ -522,13 +534,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":7 } ``` - - ### eth_accounts {#eth_accounts} Returns a list of addresses owned by client. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_accounts) + + Try endpoint in playground + **Parameters** @@ -554,8 +566,10 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1 ### eth_blockNumber {#eth_blocknumber} Returns the number of most recent block. - -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_blockNumber) + + + Try endpoint in playground + **Parameters** @@ -582,7 +596,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id Returns the balance of the account of given address. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBalance) + + Try endpoint in playground + **Parameters** @@ -614,7 +630,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407 Returns the value from a storage position at a given address. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getStorageAt) + + Try endpoint in playground + **Parameters** @@ -684,7 +702,9 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Returns the number of transactions _sent_ from an address. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionCount) + + Try endpoint in playground + **Parameters** @@ -719,7 +739,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params Returns the number of transactions in a block from a block matching the given block hash. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBlockTransactionCountByHash) + + Try endpoint in playground + **Parameters** @@ -750,7 +772,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHa Returns the number of transactions in a block matching the given block number. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBlockTransactionCountByNumber) + + Try endpoint in playground + **Parameters** @@ -783,7 +807,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNu Returns the number of uncles in a block from a block matching the given block hash. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getUncleCountByBlockHash) + + Try endpoint in playground + **Parameters** @@ -814,7 +840,10 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","p Returns the number of uncles in a block from a block matching the given block number. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getUncleCountByBlockNumber) + + Try endpoint in playground + + **Parameters** 1. `QUANTITY|TAG` - integer of a block number, or the string `"latest"`, `"earliest"`, `"pending"`, `"safe"` or `"finalized"`, see the [block parameter](/developers/docs/apis/json-rpc/#block-parameter) @@ -846,7 +875,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber", Returns code at a given address. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getCode) + + Try endpoint in playground + **Parameters** @@ -1027,7 +1058,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params" Executes a new message call immediately without creating a transaction on the blockchain. Often used for executing read-only smart contract functions, for example the `balanceOf` for an ERC-20 contract. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_call) + + Try endpoint in playground + **Parameters** @@ -1063,7 +1096,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}] Generates and returns an estimate of how much gas is necessary to allow the transaction to complete. The transaction will not be added to the blockchain. Note that the estimate may be significantly more than the amount of gas actually used by the transaction, for a variety of reasons including EVM mechanics and node performance. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_estimateGas) + + Try endpoint in playground + **Parameters** @@ -1090,7 +1125,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see Returns information about a block by hash. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBlockByHash) + + Try endpoint in playground + **Parameters** @@ -1169,7 +1206,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 Returns information about a block by block number. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getBlockByNumber) + + Try endpoint in playground + **Parameters** @@ -1199,7 +1238,9 @@ Result see [eth_getBlockByHash](#eth_getblockbyhash) Returns the information about a transaction requested by transaction hash. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionByHash) + + Try endpoint in playground + **Parameters** @@ -1260,7 +1301,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","param Returns information about a transaction by block hash and transaction index position. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionByBlockHashAndIndex) + + Try endpoint in playground + **Parameters** @@ -1290,7 +1333,9 @@ Result see [eth_getTransactionByHash](#eth_gettransactionbyhash) Returns information about a transaction by block number and transaction index position. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getTransactionByBlockNumberAndIndex) + + Try endpoint in playground + **Parameters** @@ -1388,7 +1433,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para Returns information about a uncle of a block by hash and uncle index position. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getUncleByBlockHashAndIndex) + + Try endpoint in playground + **Parameters** @@ -1420,7 +1467,9 @@ Result see [eth_getBlockByHash](#eth_getblockbyhash) Returns information about a uncle of a block by number and uncle index position. -[![Try this endpoint](./playground.svg)](https://ethereum-json-rpc.com/?method=eth_getUncleByBlockNumberAndIndex) + + Try endpoint in playground + **Parameters** @@ -1640,7 +1689,6 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":[ Returns an array of all logs matching filter with given id. - **Parameters** 1. `QUANTITY` - The filter id. diff --git a/public/content/developers/docs/apis/json-rpc/playground.svg b/public/content/developers/docs/apis/json-rpc/playground.svg deleted file mode 100644 index 31a6ecb7533..00000000000 --- a/public/content/developers/docs/apis/json-rpc/playground.svg +++ /dev/null @@ -1 +0,0 @@ -
    Playground: Try EndpointPlaygroundTry Endpoint \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-apis-json-rpc-data.json b/src/data/placeholders/content-developers-docs-apis-json-rpc-data.json deleted file mode 100644 index 123f0147d5a..00000000000 --- a/src/data/placeholders/content-developers-docs-apis-json-rpc-data.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "/content/developers/docs/apis/json-rpc/playground.svg": { - "hash": "f41ec73f", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAACCAYAAABR7VzxAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAd0lEQVR4nGOQkZGZ6ePj89/IyOi/mZnZfysrq//6+vr/7ezs/vdvUTx+53/c/6v/Y//f+R8Pxzf/x/+/9T/u/7n/UTMZWFhYZmppaf338vICa4YZBKILpzMe3/ve6//+Tz7/d710+3/0q///098CwDRIbNsHr5kAkwlKKC5qBGUAAAAASUVORK5CYII=" - } -} \ No newline at end of file From 4e197de306097529d6e421c55b80933e04d6d9d5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:00:37 -0700 Subject: [PATCH 114/171] revert: value change --- 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 f8a203c2a29..e831cffe7b2 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -1181,7 +1181,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 "gasLimit": "0x1388", "gasUsed": "0x0", "hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171", "mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843", "nonce": "0x689056015818adbe", From 66859eb879850efe3303b2b7858caaf2f736e445 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 01:01:50 +0000 Subject: [PATCH 115/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 44e37d852fd..a885a0bdc29 100644 --- a/README.md +++ b/README.md @@ -2012,6 +2012,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d futreall
    futreall

    🌍 🐛 + Shikhar Singh
    Shikhar Singh

    💻 From e9cbb4816ddb8de73a0e96300d576b0087f62c7a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 01:01:51 +0000 Subject: [PATCH 116/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a02c0ed1c54..721624579c6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12920,6 +12920,15 @@ "translation", "bug" ] + }, + { + "login": "0xshikhar", + "name": "Shikhar Singh", + "avatar_url": "https://avatars.githubusercontent.com/u/64684053?v=4", + "profile": "https://github.com/0xshikhar", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From 64746ec8396910231afd2e25da415daa975e0f27 Mon Sep 17 00:00:00 2001 From: ilya Smiyukha Date: Sat, 19 Jul 2025 16:47:04 +0200 Subject: [PATCH 117/171] fix: update Cyfrin icon [Fixes #15874] --- public/images/dev-tools/cyfrin-updraft.png | Bin 22337 -> 9850 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/dev-tools/cyfrin-updraft.png b/public/images/dev-tools/cyfrin-updraft.png index bc7b992360351e396d4f71fb841bdec03c34c69b..b2762a8519c5a392a56e90d055128bed0797b1c1 100644 GIT binary patch literal 9850 zcmV-=CWYCFP)#Y(sz#vU7=Y2oU+`*t*20z`FVn8}KQRlv@D%lB
  • #ygPm&%wZdpFP2^~duw?^kV{xS#V3z2mI% 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

    +B~%LdQunII!@Fx!F@oZ(!JRiN$y~=?06}uu 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 literal 22337 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 Date: Sat, 19 Jul 2025 17:12:16 -0700 Subject: [PATCH 118/171] fix: resource-banner.png logos --- public/images/developers/resources-banner.png | Bin 48552 -> 50326 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/developers/resources-banner.png b/public/images/developers/resources-banner.png index 5283abcc5f2aa2ba76806a0d5bd4f51da750a5ba..06b8f569c2a16bdeb4f299e1f1c0ff51439cbd49 100644 GIT binary patch literal 50326 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�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 z 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 From e2003cfd9c34c63f1f37fd391a95a2357825cba5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun, 20 Jul 2025 13:02:22 -0700 Subject: [PATCH 119/171] chore: adjust dark shadow --- public/images/developers/resources-banner.png | Bin 50326 -> 51556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/developers/resources-banner.png b/public/images/developers/resources-banner.png index 06b8f569c2a16bdeb4f299e1f1c0ff51439cbd49..d04a9f8b901f700ed9e7e0e76014b1bf2318e696 100644 GIT binary patch literal 51556 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

    L^X_hf1# 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�$-bj}F!xTy;{bRI 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 Date: Sun, 20 Jul 2025 13:49:00 -0700 Subject: [PATCH 120/171] fix: subnav z-index Fixes subnav bar being hidden by radial chart on /resources page --- app/[locale]/resources/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/resources/page.tsx b/app/[locale]/resources/page.tsx index 588b7efb55c..69434cd04d0 100644 --- a/app/[locale]/resources/page.tsx +++ b/app/[locale]/resources/page.tsx @@ -75,7 +75,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { /> -

    +
    {t("page-resources-whats-on-this-page")}
    From d7028d7864f10f42be56cb7dc8f1af6e71e9c909 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 03:51:14 +0000 Subject: [PATCH 121/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a885a0bdc29..1463b089f77 100644 --- a/README.md +++ b/README.md @@ -2013,6 +2013,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
    futreall
    futreall

    🌍 🐛 Shikhar Singh
    Shikhar Singh

    💻 + clacla
    clacla

    🚧 From 696f0367a6eee7af2306425db022655f89124b60 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 03:51:16 +0000 Subject: [PATCH 122/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 721624579c6..de7ad6b7f79 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12929,6 +12929,15 @@ "contributions": [ "code" ] + }, + { + "login": "clacladev", + "name": "clacla", + "avatar_url": "https://avatars.githubusercontent.com/u/161903?v=4", + "profile": "https://github.com/clacladev", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 753f609684a4f7e9bc98afae30fa2272a1f2b403 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:57:07 -0700 Subject: [PATCH 123/171] chore: use https 200 link --- .../developers/docs/nodes-and-clients/run-a-node/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 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 4e65f51271a..176fc9a135b 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 @@ -129,7 +129,7 @@ Multiple user-friendly projects aim to improve the experience of setting up a cl Below are a few projects which can help you install and control clients just with a few clicks: - [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) - DappNode doesn't come only with a machine from a vendor. The software, the actual node launcher and control center with many features can be used on arbitrary hardware. -- [EthPillar](http://ethpillar.coincashew.com) - Quickest and easiest way to setup a full node. One-liner setup tool and node management TUI. Free. Open source. Public goods for Ethereum by solo stakers. ARM64 and AMD64 support. +- [EthPillar](https://www.coincashew.com/coins/overview-eth/ethpillar) - Quickest and easiest way to setup a full node. One-liner setup tool and node management TUI. Free. Open source. Public goods for Ethereum by solo stakers. ARM64 and AMD64 support. - [eth-docker](https://eth-docker.net/) - Automated setup using Docker focused on easy and secure staking, requires basic terminal and Docker knowledge, recommended for a bit more advanced users. - [Stereum](https://stereum.net/ethereum-node-setup/) - Launcher for installing clients on a remote server via SSH connection with a GUI setup guide, control center, and many other features. - [NiceNode](https://www.nicenode.xyz/) - Launcher with a straightforward user experience to run a node on your computer. Just choose clients and start them with a few clicks. Still in development. @@ -468,7 +468,7 @@ As part of your monitoring, make sure to keep an eye on your machine's performan ## Further reading {#further-reading} - [Ethereum Staking Guides](https://github.com/SomerEsat/ethereum-staking-guides) - _Somer Esat, updated often_ -- [Guide | How to setup a validator for Ethereum staking on mainnet](http://eth.coincashew.com) _– CoinCashew, updated often_ +- [Guide | How to setup a validator for Ethereum staking on mainnet](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, updated often_ - [ETHStaker guides on running validators on testnets](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, updated regularly_ - [The Merge FAQ for node operators](https://notes.ethereum.org/@launchpad/node-faq-merge) - _July 2022_ - [Analyzing the hardware requirements to be an Ethereum full validated node](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24 September 2018_ From 5e52839d473f8b99f2891cf853e4c31193a757c9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 04:15:34 +0000 Subject: [PATCH 124/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1463b089f77..1a8cc6d4bbe 100644 --- a/README.md +++ b/README.md @@ -2014,6 +2014,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d futreall
    futreall

    🌍 🐛 Shikhar Singh
    Shikhar Singh

    💻 clacla
    clacla

    🚧 + Daehyun Paik
    Daehyun Paik

    🐛 From ecb23bb533f18d43e405ae15dc3caaafc20b10fb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 04:15:35 +0000 Subject: [PATCH 125/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index de7ad6b7f79..12b4936ad15 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12938,6 +12938,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "baumstern", + "name": "Daehyun Paik", + "avatar_url": "https://avatars.githubusercontent.com/u/1610146?v=4", + "profile": "https://a30a.dev/", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From c07dbbafcd83618fd0b41b5499eb050d4ebf4a84 Mon Sep 17 00:00:00 2001 From: Yash Agarwal <24je0721@iitism.ac.in> Date: Mon, 21 Jul 2025 13:06:26 +0530 Subject: [PATCH 126/171] Update FixedDot.tsx --- src/components/FeedbackWidget/FixedDot.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/FeedbackWidget/FixedDot.tsx b/src/components/FeedbackWidget/FixedDot.tsx index 5260c069bae..6751438c02e 100644 --- a/src/components/FeedbackWidget/FixedDot.tsx +++ b/src/components/FeedbackWidget/FixedDot.tsx @@ -44,7 +44,7 @@ const FixedDot = forwardRef( >
  • #ygPm&%wZdpFP2^~duw?^kV{xS#V3z2mI% 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

    +B~%LdQunII!@Fx!F@oZ(!JRiN$y~=?06}uu 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 From 9f6935af7099e9d202e4d816edb2bf558574f6c3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:43:28 +0000 Subject: [PATCH 128/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1a8cc6d4bbe..430d76a97e4 100644 --- a/README.md +++ b/README.md @@ -2015,6 +2015,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Shikhar Singh
    Shikhar Singh

    💻 clacla
    clacla

    🚧 Daehyun Paik
    Daehyun Paik

    🐛 + Dima Barabash
    Dima Barabash

    💻 From d1e8ceb5aab67e5b0e384def69a52d9d9e6602f8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:43:29 +0000 Subject: [PATCH 129/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 12b4936ad15..a59ed5c0bc5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12947,6 +12947,15 @@ "contributions": [ "bug" ] + }, + { + "login": "dbarabashh", + "name": "Dima Barabash", + "avatar_url": "https://avatars.githubusercontent.com/u/10253529?v=4", + "profile": "https://dbarabashh.com", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From 4334f223177395648ef8d35224bd78b64947c089 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:05:24 -0700 Subject: [PATCH 130/171] fix: FAQ component details per DS --- src/components/Faq/index.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/Faq/index.tsx b/src/components/Faq/index.tsx index 438534cf9e6..d341d72f0fe 100644 --- a/src/components/Faq/index.tsx +++ b/src/components/Faq/index.tsx @@ -18,9 +18,11 @@ const FaqTrigger = React.forwardRef< ref={ref} className={cn( "w-full p-4 md:px-8 md:py-6", - "border-t border-body-light", "text-start font-medium", - "[&_[data-label='icon-container']]:ms-8 [&_[data-label='icon-container']]:rounded-full [&_[data-label='icon-container']]:border [&_[data-label='icon-container']]:border-current [&_[data-label='icon-container']]:p-2 hover:[&_[data-label='icon-container']]:shadow-[4px_4px_0_hsla(var(--primary-low-contrast),1)] [&_svg]:text-lg", + "hover:text-body [&[data-state=open]_h2]:text-current [&[data-state=open]_svg]:-rotate-90 hover:[&_h2]:!text-body [&_svg]:rotate-90", + "[&_[data-label='icon-container']]:ms-8 [&_[data-label='icon-container']]:rounded-full [&_[data-label='icon-container']]:border [&_[data-label='icon-container']]:border-body [&_[data-label='icon-container']]:p-2 [&_svg]:text-lg", + "[&_[data-label='icon-container']:hover_svg]:text-primary-hover hover:[&_[data-label='icon-container']]:!border-primary-hover hover:[&_[data-label='icon-container']]:shadow-[4px_4px_0_hsla(var(--primary-low-contrast),1)]", + "[&[data-state=open]]:text-current", className )} {...props} @@ -40,8 +42,8 @@ const Faq = ({ type={type} collapsible className={cn( - "rounded border border-body-light first:border-t-0", - "w-full overflow-hidden bg-background", + "overflow-hidden rounded border", + "w-full bg-background", props?.className )} {...props} @@ -57,7 +59,10 @@ const FaqItem = React.forwardRef< >(({ className, ...props }, ref) => ( )) From e5100df64168d609446749e369537012bea5d494 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:05:45 -0700 Subject: [PATCH 131/171] fix: FAQ story container --- src/components/Faq/Faq.stories.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Faq/Faq.stories.tsx b/src/components/Faq/Faq.stories.tsx index 870f498fe46..63fdf874f8e 100644 --- a/src/components/Faq/Faq.stories.tsx +++ b/src/components/Faq/Faq.stories.tsx @@ -7,7 +7,7 @@ const meta = { component: FaqComponent, decorators: [ (Story) => ( -

    +
    ), @@ -18,7 +18,7 @@ export default meta export const Faq: StoryObj = { render: () => ( - +

    From 6bdac201f28f731b4d696271170c967b3831b15a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:42:15 -0700 Subject: [PATCH 132/171] feat: respect doNotTrack preference for Matomo --- src/lib/utils/matomo.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib/utils/matomo.ts b/src/lib/utils/matomo.ts index 087f948ad3b..f64952b1a2a 100644 --- a/src/lib/utils/matomo.ts +++ b/src/lib/utils/matomo.ts @@ -18,6 +18,10 @@ export const trackCustomEvent = ({ eventValue, }: MatomoEventOptions): void => { if (!IS_PROD) return + + // Respect Do Not Track header + if (navigator.doNotTrack === "1") return + const optedOutValue = localStorage.getItem(MATOMO_LS_KEY) || "false" const isOptedOut = JSON.parse(optedOutValue) if (isOptedOut) return From 1fd075b75ddf7cc1e64510e665cd5e46071950c6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:03:58 +0000 Subject: [PATCH 133/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 430d76a97e4..07132d7f2b5 100644 --- a/README.md +++ b/README.md @@ -2016,6 +2016,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d clacla
    clacla

    🚧 Daehyun Paik
    Daehyun Paik

    🐛 Dima Barabash
    Dima Barabash

    💻 + Yash Agarwal
    Yash Agarwal

    🐛 From d21b3b2c0c649fa8cff6cc182faf21ccf7dd0f96 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:03:59 +0000 Subject: [PATCH 134/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a59ed5c0bc5..0817fe321d1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12956,6 +12956,15 @@ "contributions": [ "code" ] + }, + { + "login": "YashIIT0909", + "name": "Yash Agarwal", + "avatar_url": "https://avatars.githubusercontent.com/u/182656811?v=4", + "profile": "https://github.com/YashIIT0909", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From 17c5475b2f32e850aa344da837b71ce669fae7e4 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 21 Jul 2025 19:14:12 -0700 Subject: [PATCH 135/171] fix: add missing attributes to contributors Image --- src/components/Contributors/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/Contributors/index.tsx b/src/components/Contributors/index.tsx index 079be617024..07772a86adf 100644 --- a/src/components/Contributors/index.tsx +++ b/src/components/Contributors/index.tsx @@ -44,6 +44,9 @@ const Contributors = () => { className="h-[132px] w-[132px]" src={contributor.avatar_url} alt={contributor.name} + width={132} + height={132} + sizes="132px" />

    From c7afe927cd6577b4b866fb8a4d90dc7d36a86466 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 21 Jul 2025 19:30:22 -0700 Subject: [PATCH 136/171] feat: update Contributors to accept option list override --- src/components/Contributors/index.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/Contributors/index.tsx b/src/components/Contributors/index.tsx index 07772a86adf..2b5c3cb01ba 100644 --- a/src/components/Contributors/index.tsx +++ b/src/components/Contributors/index.tsx @@ -20,12 +20,20 @@ export interface Contributor { const allContributors = JSON.parse(data) -const Contributors = () => { +interface ContributorsProps { + contributors?: Contributor[] +} + +const Contributors = ({ contributors }: ContributorsProps) => { const [contributorsList, setContributorsList] = useState([]) useEffect(() => { - setContributorsList(shuffle(allContributors.contributors)) - }, []) + if (contributors) { + setContributorsList(contributors) + } else { + setContributorsList(shuffle(allContributors.contributors)) + } + }, [contributors]) return ( <> From 1054562b1178ff7abe7fe7c0de5e61d73ec69775 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 21 Jul 2025 19:30:50 -0700 Subject: [PATCH 137/171] fix: use static list of contributors for story --- .../Contributors/Contributors.stories.tsx | 83 ++++++++++++++++++- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git a/src/components/Contributors/Contributors.stories.tsx b/src/components/Contributors/Contributors.stories.tsx index 7b8c9613ea5..288263c7055 100644 --- a/src/components/Contributors/Contributors.stories.tsx +++ b/src/components/Contributors/Contributors.stories.tsx @@ -1,9 +1,9 @@ import { Meta, StoryObj } from "@storybook/react" -import ContributorsComponent from "." +import ContributorsComponent, { type Contributor } from "." const meta = { - title: "Molecules / Navigation / Contributors", + title: "Molecules / Display Content / Contributors", component: ContributorsComponent, parameters: { layout: "fullscreen", @@ -21,4 +21,81 @@ export default meta type Story = StoryObj -export const Contributors: Story = {} +const mockContributors: Contributor[] = [ + { + login: "carlfairclough", + name: "Carl Fairclough", + avatar_url: "https://avatars1.githubusercontent.com/u/4670881?v=4", + profile: "http://carlfairclough.me", + contributions: ["design", "code", "bug"], + }, + { + login: "RichardMcSorley", + name: "Richard McSorley", + avatar_url: "https://avatars2.githubusercontent.com/u/6407008?v=4", + profile: "https://github.com/RichardMcSorley", + contributions: ["code"], + }, + { + login: "ajsantander", + name: "Alejandro Santander", + avatar_url: "https://avatars2.githubusercontent.com/u/550409?v=4", + profile: "http://ajsantander.github.io/", + contributions: ["content"], + }, + { + login: "Lililashka", + name: "Lililashka", + avatar_url: "https://avatars1.githubusercontent.com/u/28689401?v=4", + profile: "http://impermanence.co", + contributions: ["design", "bug"], + }, + { + login: "chriseth", + name: "chriseth", + avatar_url: "https://avatars2.githubusercontent.com/u/9073706?v=4", + profile: "https://github.com/chriseth", + 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"], + }, + { + login: "P1X3L0V4", + name: "Anna Karpińska", + avatar_url: "https://avatars2.githubusercontent.com/u/3372341?v=4", + profile: "https://github.com/P1X3L0V4", + contributions: ["translation"], + }, + { + login: "vrde", + name: "vrde", + avatar_url: "https://avatars1.githubusercontent.com/u/134680?v=4", + profile: "https://github.com/vrde", + contributions: ["content"], + }, + { + login: "AlexandrouR", + name: "Rousos Alexandros", + avatar_url: "https://avatars1.githubusercontent.com/u/21177075?v=4", + profile: "https://github.com/AlexandrouR", + contributions: ["content"], + }, + { + login: "eswarasai", + name: "Eswara Sai", + avatar_url: "https://avatars2.githubusercontent.com/u/5172086?v=4", + profile: "https://eswarasai.com", + contributions: ["code"], + }, +] + +export const Contributors: Story = { + args: { + contributors: mockContributors, + }, +} From 86aee5ccf1567eeb81debc9a39374d64fc7c570e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:40:19 +0000 Subject: [PATCH 138/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 430d76a97e4..c34240a485f 100644 --- a/README.md +++ b/README.md @@ -2016,6 +2016,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d clacla
    clacla

    🚧 Daehyun Paik
    Daehyun Paik

    🐛 Dima Barabash
    Dima Barabash

    💻 + Reppelin Tom
    Reppelin Tom

    🔧 From 46b37c72fefb1826086c14e532c8751df07a19dd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:40:20 +0000 Subject: [PATCH 139/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a59ed5c0bc5..594c1f47d3b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12956,6 +12956,15 @@ "contributions": [ "code" ] + }, + { + "login": "tomrpl", + "name": "Reppelin Tom", + "avatar_url": "https://avatars.githubusercontent.com/u/75627352?v=4", + "profile": "http://www.linkedin.com/in/tom-reppelin", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 7, From 6c073c831c8ec0f6e37034a64d3a2bb34719a3cf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:42:38 +0000 Subject: [PATCH 140/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c34240a485f..ad6afa2eadb 100644 --- a/README.md +++ b/README.md @@ -2017,6 +2017,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Daehyun Paik
    Daehyun Paik

    🐛 Dima Barabash
    Dima Barabash

    💻 Reppelin Tom
    Reppelin Tom

    🔧 + Dmitry
    Dmitry

    🐛 From 0ea5bfbc896aebe0a77d49e2e42a91cabfe6475b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:42:39 +0000 Subject: [PATCH 141/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 594c1f47d3b..deb01d03901 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12965,6 +12965,15 @@ "contributions": [ "tool" ] + }, + { + "login": "mdqst", + "name": "Dmitry", + "avatar_url": "https://avatars.githubusercontent.com/u/98899785?v=4", + "profile": "https://mdqst.com", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From 00ebe81370aa6373b5e8d92caac447766fac390d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:53:53 +0000 Subject: [PATCH 142/171] docs: update README.md [skip ci] --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ad6afa2eadb..c5551bc6fed 100644 --- a/README.md +++ b/README.md @@ -2019,6 +2019,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Reppelin Tom
    Reppelin Tom

    🔧 Dmitry
    Dmitry

    🐛 + + Sephiroth
    Sephiroth

    🔧 + From 9b19bcd75ee91f7874d03fb41e636c7c1796f9e4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:53:54 +0000 Subject: [PATCH 143/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index deb01d03901..c2462539334 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12974,6 +12974,15 @@ "contributions": [ "bug" ] + }, + { + "login": "3eph1r0th", + "name": "Sephiroth", + "avatar_url": "https://avatars.githubusercontent.com/u/26237289?v=4", + "profile": "https://github.com/3eph1r0th", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 7, From 1af78058dda1131c1e2553f6f7900f87a634bfcb Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:40:01 -0700 Subject: [PATCH 144/171] feat: split out each section as own story --- .../DeveloperDocsLinks.stories.tsx | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/components/DeveloperDocsLinks/DeveloperDocsLinks.stories.tsx b/src/components/DeveloperDocsLinks/DeveloperDocsLinks.stories.tsx index eee1d533ca9..236821ee33a 100644 --- a/src/components/DeveloperDocsLinks/DeveloperDocsLinks.stories.tsx +++ b/src/components/DeveloperDocsLinks/DeveloperDocsLinks.stories.tsx @@ -7,9 +7,6 @@ import DeveloperDocsLinksComponent from "." const meta = { title: "Molecules / Navigation / DeveloperDocsLinks", component: DeveloperDocsLinksComponent, - args: { - headerId: "ethereum-stack", - }, parameters: { layout: "fullscreen", chromatic: { @@ -31,4 +28,20 @@ export default meta type Story = StoryObj -export const DeveloperDocsLinks: Story = {} +export const FoundationalTopics: Story = { + args: { + headerId: "foundational-topics", + }, +} + +export const EthereumStack: Story = { + args: { + headerId: "ethereum-stack", + }, +} + +export const Advanced: Story = { + args: { + headerId: "advanced", + }, +} From 7dab0d0221d270f628c78af56c05341c9a81bd5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 06:25:06 +0000 Subject: [PATCH 145/171] Bump form-data from 4.0.2 to 4.0.4 Bumps [form-data](https://github.com/form-data/form-data) from 4.0.2 to 4.0.4. - [Release notes](https://github.com/form-data/form-data/releases) - [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md) - [Commits](https://github.com/form-data/form-data/compare/v4.0.2...v4.0.4) --- updated-dependencies: - dependency-name: form-data dependency-version: 4.0.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d39391527a..d10b61ef29d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7232,6 +7232,11 @@ packages: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -7701,6 +7706,10 @@ packages: to-buffer@1.1.1: resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -9267,7 +9276,7 @@ snapshots: eventemitter3: 5.0.1 keccak: 3.0.4 preact: 10.26.9 - sha.js: 2.4.11 + sha.js: 2.4.12 transitivePeerDependencies: - supports-color @@ -17171,6 +17180,12 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.1 + sharp@0.32.6: dependencies: color: 4.2.3 @@ -17768,6 +17783,12 @@ snapshots: to-buffer@1.1.1: {} + to-buffer@1.2.1: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 From 86cd1f07e20da4aea9cd47d48d6821b59ca70ba2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 15:41:07 +0000 Subject: [PATCH 146/171] 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 deac113c7aa..34715bf91e3 100644 --- a/README.md +++ b/README.md @@ -2021,9 +2021,8 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Dmitry
    Dmitry

    🐛 - - Sephiroth
    Sephiroth

    🔧 + Ilya Smiyukha
    Ilya Smiyukha

    🚧 From 6740a7c38448fcd4d59f3ecda7fd07b102a3bb0f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 15:41:08 +0000 Subject: [PATCH 147/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cf3b8e56419..9845d999b28 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12992,6 +12992,15 @@ "contributions": [ "tool" ] + }, + { + "login": "IlyaSmiyukha", + "name": "Ilya Smiyukha", + "avatar_url": "https://avatars.githubusercontent.com/u/39830587?v=4", + "profile": "https://ilyasmiyukha.github.io/", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 570807e8fa17c4b2758296c45660cbcaef479bba Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 22 Jul 2025 14:17:28 -0600 Subject: [PATCH 148/171] Update src/data/community-events.json --- src/data/community-events.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/community-events.json b/src/data/community-events.json index 6a2972ad530..45a3692805e 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -183,7 +183,8 @@ "href": "https://conference.tum-blockchain.com", "location": "Munich, Germany", "description": "Europe's top Blockchain Conference in Munich is back! Discover how Web3 is moving beyond promise to real world impact with top experts.", - "imageUrl": "https://conference.tum-blockchain.com/banners/c25-banner.svg" + "imageUrl": "https://conference.tum-blockchain.com/banners/c25-banner.svg", + "hackathon": false }, { "title": "ETHSofia", From 4b412c4429b74d65bcf9128090c71f70acfc757c Mon Sep 17 00:00:00 2001 From: Jorge Maldonado Ventura Date: Wed, 23 Jul 2025 11:44:20 +0200 Subject: [PATCH 149/171] Consistency fix. All other descriptions of stablecoin tools start with upper case --- src/intl/en/page-stablecoins.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/page-stablecoins.json b/src/intl/en/page-stablecoins.json index 9d42c921aef..b2f2fa642d1 100644 --- a/src/intl/en/page-stablecoins.json +++ b/src/intl/en/page-stablecoins.json @@ -169,7 +169,7 @@ "page-stablecoins-tools-title": "Learn more about stablecoins", "page-stablecoins-tools-stablecoinswtf-description": "Stablecoins.wtf offers a dashboard with historical market data, statistics, and educational content for the most prominent stablecoins.", "page-stablecoins-tools-stablepulse-description": "Provides a clear, accurate, and minimally filtered view of the stablecoin ecosystem with analytics across tokens and chains.", - "page-stablecoins-tools-stablesinfo-description": "live stablecoin leaderboard and dashboard, tracking supply and onchain data for all major stablecoins and chains.", + "page-stablecoins-tools-stablesinfo-description": "Live stablecoin leaderboard and dashboard, tracking supply and onchain data for all major stablecoins and chains.", "page-stablecoins-tools-dune-description": "Dashboard delivering real-time insights into stablecoin supply, liquidity, trading volume, and adoption across blockchains.", "page-stablecoins-tools-visa-description": "Dashboard visualizing the movement, supply, and usage of fiat-backed stablecoins across public blockchains.", "page-stablecoins-tools-stablewars-description": "Analytics leaderboard and dashboard, tracking balances, transfers, and rankings for stablecoins across multiple blockchains.", From 57f1aa8289e302a5e5ab8098914fb599d726b39d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:47:18 +0000 Subject: [PATCH 150/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 34715bf91e3..15fa80051d4 100644 --- a/README.md +++ b/README.md @@ -2023,6 +2023,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Dmitry
    Dmitry

    🐛 Sephiroth
    Sephiroth

    🔧 Ilya Smiyukha
    Ilya Smiyukha

    🚧 + Jorge
    Jorge

    🐛 From eea1f6b94af7add84746b1c63ba969d1a393b0cf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:47:19 +0000 Subject: [PATCH 151/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9845d999b28..99a0a39e73c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -13001,6 +13001,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "jorgesumle", + "name": "Jorge", + "avatar_url": "https://avatars.githubusercontent.com/u/14212780?v=4", + "profile": "https://github.com/jorgesumle", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From c5bd8366f551e315145c1f10b52442e783b61254 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 23 Jul 2025 13:09:51 -0700 Subject: [PATCH 152/171] chore: apply suggestions from review --- src/data/quizzes/index.ts | 1 - src/data/quizzes/questionBank.ts | 1 - src/intl/en/learn-quizzes.json | 27 +++++++++------------------ 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/data/quizzes/index.ts b/src/data/quizzes/index.ts index eb186e07681..7f61a6d7c08 100644 --- a/src/data/quizzes/index.ts +++ b/src/data/quizzes/index.ts @@ -105,7 +105,6 @@ const quizzes = { "smart-contracts-2", "smart-contracts-3", "smart-contracts-4", - "smart-contracts-5", ], }, } satisfies RawQuizzes diff --git a/src/data/quizzes/questionBank.ts b/src/data/quizzes/questionBank.ts index 565d49f05dd..4d64b8c420a 100644 --- a/src/data/quizzes/questionBank.ts +++ b/src/data/quizzes/questionBank.ts @@ -157,7 +157,6 @@ const questionBankConfig: QuestionBankConfig = { { totalAnswers: 4, correctAnswer: 2 }, { totalAnswers: 4, correctAnswer: 4 }, { totalAnswers: 4, correctAnswer: 2 }, - { totalAnswers: 4, correctAnswer: 1 }, ], } diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index 3c59e061aae..c1d4f7ccfdd 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -615,21 +615,21 @@ "defi-5-d-label": "Traditional financial institutions", "defi-5-d-explanation": "This is incorrect. DeFi apps don’t need traditional financial institutions. They use blockchain programs called smart contracts to handle transactions automatically.", "smart-contracts-1-prompt": "How are smart contracts characterized?", - "smart-contracts-1-a-label": "Smart contracts are just like real (paper) contracts, but stored digitally on the blockchain to save the content securely.", + "smart-contracts-1-a-label": "Smart contracts are just like legal contracts, but stored digitally on the blockchain to save the content securely.", "smart-contracts-1-a-explanation": "Smart contracts use a similar logic to traditional contracts, but otherwise have little in common.", "smart-contracts-1-b-label": "Linked to autonomous AI systems that execute transactions", "smart-contracts-1-b-explanation": "Smart contracts execute transactions predictably according to 'if-this-then-that' logic prescribed in the code—they do not use AI", - "smart-contracts-1-c-label": "They are programs stored on the blockchain that follow an 'if this then that' logic, and are guaranteed to execute according to the rules defined by the code.", - "smart-contracts-1-c-explanation": "A smart contract is a piece of code that can be executed automatically according to an 'if this then that' logic.", + "smart-contracts-1-c-label": "Onchain programs following 'if-this-then-that' logic, guaranteed to execute according to its own rules", + "smart-contracts-1-c-explanation": "A smart contract is an Ethereum account deployed with unchangeable code that determines its functionality.", "smart-contracts-1-d-label": "They are the rules behind the Ethereum Blockchain, developed together with lawyers to ensure legal compliance.", "smart-contracts-1-d-explanation": "Smart contracts are pieces of code that can be created by developers and deployed on a blockchain.", "smart-contracts-2-prompt": "What is a metaphor that most closely characterizes the functioning of smart contracts?", "smart-contracts-2-a-label": "A bank", "smart-contracts-2-a-explanation": "Banks require manual execution and are structured as hierarchical entities, whereas smart contracts are executed predictable by computers with unchangeable rules.", "smart-contracts-2-b-label": "A digital vending machine", - "smart-contracts-2-b-explanation": "The vending machine will only dispense your desired product after all requirements are met - specific inputs guarantee predetermined outputs. This is similar to the logic of smart contracts.", + "smart-contracts-2-b-explanation": "The vending machine will only dispense your desired product after all requirements are met: specific inputs guarantee deterministic outputs. This is similar to the logic of smart contracts.", "smart-contracts-2-c-label": "A calculator", - "smart-contracts-2-c-explanation": "smart contract code can be used for calculations, but is not limited to that. Rather, smart contracts are blockchain-based programs that follow an 'if this then that' logic.", + "smart-contracts-2-c-explanation": "Smart contract code can be used for calculations, but is not limited to that. Rather, smart contracts are blockchain-based programs that follow 'if-this-then-that' logic.", "smart-contracts-2-d-label": "A website", "smart-contracts-2-d-explanation": "A website is the frontend which captures user directions. A smart contract is the backend logic where these directions are executed, and the result may be returned.", "smart-contracts-3-prompt": "Which is NOT a main characteristic of smart contracts?", @@ -642,21 +642,12 @@ "smart-contracts-3-d-label": "Ability to change", "smart-contracts-3-d-explanation": "A smart contract cannot be changed once created—it is guaranteed to execute according to the rules defined by its code.", "smart-contracts-4-prompt": "Which is NOT an application of smart contracts?", - "smart-contracts-4-a-label": "Cryptocurrencies", - "smart-contracts-4-a-explanation": "Cryptocurrencies are token objects which are defined and tracked using smart contracts.", + "smart-contracts-4-a-label": "Stablecoins", + "smart-contracts-4-a-explanation": "Stablecoins are token objects which are defined and tracked using smart contracts.", "smart-contracts-4-b-label": "Protocol changes", "smart-contracts-4-b-explanation": "While protocol changes can sometimes use smart contracts, their creation and definition are proposed through transparent online forums and implemented in client software.", "smart-contracts-4-c-label": "Non-fungible tokens (NFTs)", "smart-contracts-4-c-explanation": "Smart contracts are used to define a wide range of NFTs, ranging from digital art to asset ownership certificates.", - "smart-contracts-4-d-label": "Decentralized autonomous organizations (DAOs)", - "smart-contracts-4-d-explanation": "The governing and voting rules of DAOs are defined within smart contracts for transparency.", - "smart-contracts-5-prompt": "Who coined the term 'smart contract'?", - "smart-contracts-5-a-label": "Nick Szabo", - "smart-contracts-5-a-explanation": "The computer scientist and cryptographer Nick Szabo coined the term 'smart contract' in an essay from 1994. In 1996, he wrote an exploration of what they could do. Smart contracts on Ethereum later put this vision into practice.", - "smart-contracts-5-b-label": "Satoshi Nakamoto", - "smart-contracts-5-b-explanation": "Satoshi is the author of Bitcoin, which already has some basic smart contract functionalities. The term 'smart contract', however, was coined by Nick Szabo in 1994.", - "smart-contracts-5-c-label": "Vitalik Buterin", - "smart-contracts-5-c-explanation": "The Ethereum co-founder has contributed to our understanding of smart contracts today. The term, however, was coined by Nick Szabo in 1994.", - "smart-contracts-5-d-label": "Gavin Wood", - "smart-contracts-5-d-explanation": "Ethereum co-founder Gavin Wood is known for coining the term web3. The term 'smart contract', however, was coined by Nick Szabo in 1994." + "smart-contracts-4-d-label": "Open currency exchange", + "smart-contracts-4-d-explanation": "Decentralized exchanges (DEXs) are build using smart contracts to operate without centralized control." } From 4f4b06e425593d6ddd104ee8002fa49f72537a32 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:19:15 +0000 Subject: [PATCH 153/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 15fa80051d4..3939a9fa62f 100644 --- a/README.md +++ b/README.md @@ -2024,6 +2024,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Sephiroth
    Sephiroth

    🔧 Ilya Smiyukha
    Ilya Smiyukha

    🚧 Jorge
    Jorge

    🐛 + Crypto Delirium
    Crypto Delirium

    🖋 From 664b1337e1d8ae207401bfe3635087b1a9d1d42d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:19:16 +0000 Subject: [PATCH 154/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 99a0a39e73c..ff10a581bd7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -13010,6 +13010,15 @@ "contributions": [ "bug" ] + }, + { + "login": "CryptoDelirium", + "name": "Crypto Delirium", + "avatar_url": "https://avatars.githubusercontent.com/u/6353394?v=4", + "profile": "https://github.com/CryptoDelirium", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 7, From 6ce993f7a7772fa9c2779d7860b1adefe1f4dda9 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 23 Jul 2025 13:23:21 -0700 Subject: [PATCH 155/171] chore: punctuation/capitalization clean up --- public/content/developers/docs/data-and-analytics/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/developers/docs/data-and-analytics/index.md b/public/content/developers/docs/data-and-analytics/index.md index 13e057d5029..f53e8960324 100644 --- a/public/content/developers/docs/data-and-analytics/index.md +++ b/public/content/developers/docs/data-and-analytics/index.md @@ -27,9 +27,9 @@ Developers can then process and transform this data to give their users unique i [The Graph](https://thegraph.com/) is an indexing protocol that provides an easy way to query blockchain data through open APIs known as subgraphs. With The Graph, developers can benefit from: - - Decentralized Indexing: Enables indexing blockchain data through multiple indexers, thus eliminating any single point of failure - - GraphQL Queries: Provides a powerful GraphQL interface for querying indexed data, making data retrieval super simple. - - Customization: Define your own logic for transforming & storing blockchain data. Reuse subgraphs published by other developers on The Graph Network. + - Decentralized indexing: Enables indexing blockchain data through multiple indexers, thus eliminating any single point of failure + - GraphQL queries: Provides a powerful GraphQL interface for querying indexed data, making data retrieval super simple + - Customization: Define your own logic for transforming & storing blockchain data, and reuse subgraphs published by other developers on The Graph Network Follow this [quick-start](https://thegraph.com/docs/en/quick-start/) guide to create, deploy, and query a subgraph within 5 minutes. From d09011ecc9a34de7b24ad6ec1bd768e08ea5cc73 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 23 Jul 2025 13:25:21 -0700 Subject: [PATCH 156/171] patch: add missing custom header ids --- public/content/developers/docs/data-and-analytics/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/developers/docs/data-and-analytics/index.md b/public/content/developers/docs/data-and-analytics/index.md index 39c0ed16242..ba56fb3366c 100644 --- a/public/content/developers/docs/data-and-analytics/index.md +++ b/public/content/developers/docs/data-and-analytics/index.md @@ -34,7 +34,7 @@ With The Graph, developers can benefit from: Follow this [quick-start](https://thegraph.com/docs/en/quick-start/) guide to create, deploy, and query a subgraph within 5 minutes. -## Client diversity +## Client diversity {#client-diversity} [Client diversity](/developers/docs/nodes-and-clients/client-diversity/) is important for the overall health of the Ethereum network because it provides resilience to bugs and exploits. There are now several client diversity dashboards including [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) and [Ethernodes](https://ethernodes.org/). @@ -58,7 +58,7 @@ To start, visit the [Ethereum quick start guide](https://academy.subquery.networ [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/). -## EVM Query Language +## EVM Query Language {#evm-query-language} EVM Query Language (EQL) is an SQL-like language designed to query EVM (Ethereum Virtual Machine) chains. EQL's ultimate goal is to support complex relational queries on EVM chain first-class citizens (blocks, accounts, and transactions) while providing developers and researchers with an ergonomic syntax for everyday use. With EQL, developers can fetch blockchain data using familiar SQL-like syntax and eliminate the need for complex boilerplate code. EQL supports standard blockchain data requests (e.g., retrieving an account's nonce and balance on Ethereum or fetching the current block size and timestamp) and is continually adding support for more complex requests and featuresets. From 8781506341c626d302ec89268b4fa8ce319bb829 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:26:03 +0000 Subject: [PATCH 157/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3939a9fa62f..be4255bb193 100644 --- a/README.md +++ b/README.md @@ -2025,6 +2025,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Ilya Smiyukha
    Ilya Smiyukha

    🚧 Jorge
    Jorge

    🐛 Crypto Delirium
    Crypto Delirium

    🖋 + AK
    AK

    🚧 From 08641b059318df0ab061b828520c3b8caa8a55a6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:26:05 +0000 Subject: [PATCH 158/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ff10a581bd7..e3a7db88fd4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -13019,6 +13019,15 @@ "contributions": [ "content" ] + }, + { + "login": "alinobrasil", + "name": "AK", + "avatar_url": "https://avatars.githubusercontent.com/u/1214559?v=4", + "profile": "https://github.com/alinobrasil", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From f178f427672837de5e4f672cd1d95b44e41d3a19 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:34:04 +0000 Subject: [PATCH 159/171] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index be4255bb193..b0346088d47 100644 --- a/README.md +++ b/README.md @@ -2026,6 +2026,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Jorge
    Jorge

    🐛 Crypto Delirium
    Crypto Delirium

    🖋 AK
    AK

    🚧 + 0xumarkhatab
    0xumarkhatab

    🚧 From c769a8322430bf4bd4bc9d2368a341997c73ee7c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:34:05 +0000 Subject: [PATCH 160/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e3a7db88fd4..913192e59a1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -13028,6 +13028,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "0xumarkhatab", + "name": "0xumarkhatab", + "avatar_url": "https://avatars.githubusercontent.com/u/71306738?v=4", + "profile": "https://github.com/0xumarkhatab", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 4ab2bfd73b0e8a50d4837af367b9dca9d13120ef Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:45:44 +0000 Subject: [PATCH 161/171] docs: update README.md [skip ci] --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index b0346088d47..caff549db5a 100644 --- a/README.md +++ b/README.md @@ -2028,6 +2028,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d AK
    AK

    🚧 0xumarkhatab
    0xumarkhatab

    🚧 + + Alberto Cuesta Cañada
    Alberto Cuesta Cañada

    🚧 + From f02ee40466fd77ed884878c650b5c378e31684a5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:45:45 +0000 Subject: [PATCH 162/171] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 913192e59a1..dfaf1af5f9e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -13037,6 +13037,15 @@ "contributions": [ "maintenance" ] + }, + { + "login": "alcueca", + "name": "Alberto Cuesta Cañada", + "avatar_url": "https://avatars.githubusercontent.com/u/38806121?v=4", + "profile": "https://www.linkedin.com/in/albertocuesta/", + "contributions": [ + "maintenance" + ] } ], "contributorsPerLine": 7, From 4797ed7f28eb95df0e22e84d1b440318701e2019 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 23 Jul 2025 13:56:32 -0700 Subject: [PATCH 163/171] chore: update definition copy --- src/intl/en/glossary.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/glossary.json b/src/intl/en/glossary.json index fac6ad55e6d..34914b3e19c 100644 --- a/src/intl/en/glossary.json +++ b/src/intl/en/glossary.json @@ -224,7 +224,7 @@ "liquidity-tokens-term": "Liquidity tokens", "liquidity-tokens-definition": "Liquidity tokens (LST) are digital tokens issued to participants who deposit assets into a liquidity pool, which is a collection of funds locked in a smart contract and used to facilitate trading on a decentralized exchange (DEX).
    These tokens represent the participant's share of the pool and can be redeemed later for the initial deposit plus a portion of the trading fees generated by the pool's activity. Essentially, liquidity tokens serve as a proof of ownership or stake in a liquidity pool, allowing holders to earn rewards while providing the necessary liquidity for others to trade different cryptocurrency pairs efficiently.", "liquid-staking-tokens-term": "Liquid staking tokens", - "liquid-staking-tokens-definition": "A derivative token representing that represents the locked cryptocurrency which user gets by staking a token. When a user stakes their assets, they receive an equivalent amount of Liquid Staking Tokens. These LSTs can then be traded, sold, or used in other DeFi protocols, providing liquidity to the staker even while their original assets remain staked.", + "liquid-staking-tokens-definition": "A derivative token that represents ownership of the locked cryptocurrency that a user is staking. Upon staking an asset, some platforms allowing minting of liquid staking tokens (LSTs), which represent an equivalent share of the locked tokens. These LSTs can then be traded, sold, or used in other DeFi protocols, improving capital efficiency for the staker by allowing access to liquidity from their funds, even while their original assets remain staked.", "lmd-ghost-term": "LMD-GHOST", "lmd-ghost-definition": "The fork-choice algorithm used by Ethereum's consensus clients to identify the head of the chain. LMD-GHOST is an acronym standing for \"Latest Message Driven Greediest Heaviest Observed SubTree\" which means that the head of the chain is the block with the greatest accumulation of attestations in its history.", "mainnet-term": "Mainnet", From e6fb04985a72bc0f09be03aa44bd6705f873cec6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:57:36 +0000 Subject: [PATCH 164/171] 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 caff549db5a..fc586436734 100644 --- a/README.md +++ b/README.md @@ -2012,7 +2012,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d futreall
    futreall

    🌍 🐛 - Shikhar Singh
    Shikhar Singh

    💻 + Shikhar Singh
    Shikhar Singh

    💻 🖋 clacla
    clacla

    🚧 Daehyun Paik
    Daehyun Paik

    🐛 Dima Barabash
    Dima Barabash

    💻 From a1b5966502b04073560e644a4171b955ddb24823 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:57:37 +0000 Subject: [PATCH 165/171] 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 dfaf1af5f9e..2ee717d0b3a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12927,7 +12927,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/64684053?v=4", "profile": "https://github.com/0xshikhar", "contributions": [ - "code" + "code", + "content" ] }, { From 77647e908969ff09c83f413595d58e658279ed43 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 23 Jul 2025 14:09:53 -0700 Subject: [PATCH 166/171] chore: deprecate miner terminology [Closes #12030] --- public/content/developers/docs/apis/json-rpc/index.md | 4 ++-- .../docs/nodes-and-clients/client-diversity/index.md | 2 +- public/content/developers/docs/nodes-and-clients/index.md | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/content/developers/docs/apis/json-rpc/index.md b/public/content/developers/docs/apis/json-rpc/index.md index e831cffe7b2..6b85f335185 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -1148,13 +1148,13 @@ params: [ - `number`: `QUANTITY` - the block number. `null` when its pending block. - `hash`: `DATA`, 32 Bytes - hash of the block. `null` when its pending block. - `parentHash`: `DATA`, 32 Bytes - hash of the parent block. -- `nonce`: `DATA`, 8 Bytes - hash of the generated proof-of-work. `null` when its pending block. +- `nonce`: `DATA`, 8 Bytes - hash of the generated proof-of-work. `null` when its pending block, `0x0` for proof-of-stake blocks (since The Merge) - `sha3Uncles`: `DATA`, 32 Bytes - SHA3 of the uncles data in the block. - `logsBloom`: `DATA`, 256 Bytes - the bloom filter for the logs of the block. `null` when its pending block. - `transactionsRoot`: `DATA`, 32 Bytes - the root of the transaction trie of the block. - `stateRoot`: `DATA`, 32 Bytes - the root of the final state trie of the block. - `receiptsRoot`: `DATA`, 32 Bytes - the root of the receipts trie of the block. -- `miner`: `DATA`, 20 Bytes - the address of the beneficiary to whom the mining rewards were given. +- `miner`: `DATA`, 20 Bytes - the address of the beneficiary to whom the block rewards were given. - `difficulty`: `QUANTITY` - integer of the difficulty for this block. - `totalDifficulty`: `QUANTITY` - integer of the total difficulty of the chain until this block. - `extraData`: `DATA` - the "extra data" field of this block. diff --git a/public/content/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/developers/docs/nodes-and-clients/client-diversity/index.md index 0e0f28439ad..789f2193d40 100644 --- a/public/content/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/developers/docs/nodes-and-clients/client-diversity/index.md @@ -56,7 +56,7 @@ Until now, the conversation around client diversity has focused mainly on the co ## Use a minority client {#use-minority-client} -Addressing client diversity requires more than individual users to choose minority clients - it requires mining/validator pools and institutions like the major dapps and exchanges to switch clients too. However, all users can do their part in redressing the current imbalance and normalizing the use of all the available Ethereum software. After The Merge, all node operators will be required to run an execution client and a consensus client. Choosing combinations of the clients suggested below will help increase client diversity. +Addressing client diversity requires more than individual users to choose minority clients - it requires validator pools and institutions like the major dapps and exchanges to switch clients too. However, all users can do their part in redressing the current imbalance and normalizing the use of all the available Ethereum software. After The Merge, all node operators will be required to run an execution client and a consensus client. Choosing combinations of the clients suggested below will help increase client diversity. ### Execution clients {#execution-clients} diff --git a/public/content/developers/docs/nodes-and-clients/index.md b/public/content/developers/docs/nodes-and-clients/index.md index e5a2abd532b..fe95fc21430 100644 --- a/public/content/developers/docs/nodes-and-clients/index.md +++ b/public/content/developers/docs/nodes-and-clients/index.md @@ -68,7 +68,7 @@ Full nodes do a block-by-block validation of the blockchain, including downloadi Archive nodes are full nodes that verify every block from genesis and never delete any of the downloaded data. -- Stores everything kept in the full node and builds an archive of historical states. It is needed if you want to query something like an account balance at block #4,000,000, or simply and reliably test your own transactions set without mining them using tracing. +- Stores everything kept in the full node and builds an archive of historical states. It is needed if you want to query something like an account balance at block #4,000,000, or simply and reliably test your own transactions set without validating them using tracing. - This data represents units of terabytes, which makes archive nodes less attractive for average users but can be handy for services like block explorers, wallet vendors, and chain analytics. Syncing clients in any mode other than archive will result in pruned blockchain data. This means, there is no archive of all historical states but the full node is able to build them on demand. @@ -77,7 +77,7 @@ Learn more about [Archive nodes](/developers/docs/nodes-and-clients/archive-node ### Light node {#light-node} -Instead of downloading every block, light nodes only download block headers. These headers contain summary information about the contents of the blocks. Any other information the light node requires gets requested from a full node. The light node can then independently verify the data they receive against the state roots in the block headers. Light nodes enable users to participate in the Ethereum network without the powerful hardware or high bandwidth required to run full nodes. Eventually, light nodes might run on mobile phones or embedded devices. The light nodes do not participate in consensus (i.e. they cannot be miners/validators), but they can access the Ethereum blockchain with the same functionality and security guarantees as a full node. +Instead of downloading every block, light nodes only download block headers. These headers contain summary information about the contents of the blocks. Any other information the light node requires gets requested from a full node. The light node can then independently verify the data they receive against the state roots in the block headers. Light nodes enable users to participate in the Ethereum network without the powerful hardware or high bandwidth required to run full nodes. Eventually, light nodes might run on mobile phones or embedded devices. The light nodes do not participate in consensus (i.e. they cannot be validators), but they can access the Ethereum blockchain with the same functionality and security guarantees as a full node. Light clients are an area of active development for Ethereum and we expect to see new light clients for the consensus layer and execution layer soon. There are also potential routes to providing light client data over the [gossip network](https://www.ethportal.net/). This is advantageous because the gossip network could support a network of light nodes without requiring full nodes to serve requests. From a06e32575f01cf8f9010346d5d003371ffcbfab7 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 28 Jul 2025 16:53:17 -0600 Subject: [PATCH 167/171] fix history dates --- src/data/NetworkUpgradeSummaryData.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/data/NetworkUpgradeSummaryData.ts b/src/data/NetworkUpgradeSummaryData.ts index 8eebe4fd8b6..ac1ddf6327d 100644 --- a/src/data/NetworkUpgradeSummaryData.ts +++ b/src/data/NetworkUpgradeSummaryData.ts @@ -56,7 +56,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, arrowGlacier: { - dateTimeAsString: "2021-12-09T07:55:23.000Z", + dateTimeAsString: "2021-12-09T19:55:23.000Z", ethPriceInUSD: 4111, waybackLink: "https://web.archive.org/web/20211207064430/https://ethereum.org/en/", @@ -92,13 +92,13 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, beaconChainGenesis: { - dateTimeAsString: "2020-12-01T12:00:35.000Z", + dateTimeAsString: "2020-12-01T12:00:23.000Z", ethPriceInUSD: 586.23, waybackLink: "https://web.archive.org/web/20201207184633/https://www.ethereum.org/en/", blockNumber: undefined, epochNumber: undefined, - slotNumber: 1, + slotNumber: 0, }, stakingDepositContractDeployed: { dateTimeAsString: "2020-10-14T09:22:52.000Z", @@ -119,7 +119,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, istanbul: { - dateTimeAsString: "2019-12-08T12:25:09.000Z", + dateTimeAsString: "2019-12-08T00:25:09.000Z", ethPriceInUSD: 151.06, waybackLink: "https://web.archive.org/web/20191216101254if*/https://ethereum.org/", @@ -128,7 +128,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, constantinople: { - dateTimeAsString: "2019-02-28T07:52:04.000Z", + dateTimeAsString: "2019-02-28T19:52:04.000Z", ethPriceInUSD: 136.29, waybackLink: "https://web.archive.org/web/20190415163751/https://www.ethereum.org/", @@ -146,7 +146,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, spuriousDragon: { - dateTimeAsString: "2016-11-22T04:15:44.000Z", + dateTimeAsString: "2016-11-22T16:15:44.000Z", ethPriceInUSD: 9.84, waybackLink: "https://web.archive.org/web/20161127154654/https://www.ethereum.org/", @@ -155,7 +155,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, tangerineWhistle: { - dateTimeAsString: "2016-10-18T01:19:31.000Z", + dateTimeAsString: "2016-10-18T13:19:31.000Z", ethPriceInUSD: 12.5, waybackLink: "https://web.archive.org/web/20161030043727/https://www.ethereum.org/", @@ -164,7 +164,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, daoFork: { - dateTimeAsString: "2016-07-20T01:20:40.000Z", + dateTimeAsString: "2016-07-20T13:20:40.000Z", ethPriceInUSD: 12.54, waybackLink: "https://web.archive.org/web/20160803215306/https://ethereum.org/", @@ -173,7 +173,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, homestead: { - dateTimeAsString: "2016-03-14T06:49:53.000Z", + dateTimeAsString: "2016-03-14T18:49:53.000Z", ethPriceInUSD: 12.5, waybackLink: "https://web.archive.org/web/20160313203843/https://www.ethereum.org/", @@ -182,7 +182,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, frontierThawing: { - dateTimeAsString: "2015-09-07T09:33:09.000Z", + dateTimeAsString: "2015-09-07T21:33:09.000Z", ethPriceInUSD: 1.24, waybackLink: "https://web.archive.org/web/20150912193811/https://www.ethereum.org/", @@ -191,7 +191,7 @@ const NetworkUpgradeSummaryData: NetworkUpgradeData = { slotNumber: undefined, }, frontier: { - dateTimeAsString: "2015-07-30T03:26:13.000Z", + dateTimeAsString: "2015-07-30T15:26:13.000Z", ethPriceInUSD: 0, waybackLink: "https://web.archive.org/web/20150802035735/https://www.ethereum.org/", From 170258b87ddd2c5429e0e799a820609094f7faf9 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Wed, 30 Jul 2025 09:06:48 -0600 Subject: [PATCH 168/171] v10.9.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 3c5d02889af..efdc3a53b44 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ethereum-org-website", - "version": "10.8.0", + "version": "10.9.0", "license": "MIT", "private": true, "scripts": { diff --git a/src/data/published.json b/src/data/published.json index ee27a348abb..9d37f4aaaec 100644 --- a/src/data/published.json +++ b/src/data/published.json @@ -1 +1 @@ -{"date":"2025-07-16"} +{"date":"2025-07-30"} From 2061e6950c40fa1d07307faabd399b3bdffda7a0 Mon Sep 17 00:00:00 2001 From: Pablo Date: Wed, 30 Jul 2025 10:57:29 +0200 Subject: [PATCH 169/171] hardcode txs for torch nft event --- app/[locale]/10years/page.tsx | 12 +---- src/data/torchTransferEvents.json | 86 +++++++++++++++++++++++++++++++ src/lib/torch/etherscan.ts | 66 ------------------------ src/lib/torch/index.ts | 13 ++--- 4 files changed, 92 insertions(+), 85 deletions(-) create mode 100644 src/data/torchTransferEvents.json delete mode 100644 src/lib/torch/etherscan.ts diff --git a/app/[locale]/10years/page.tsx b/app/[locale]/10years/page.tsx index 53e195fe55a..6dba54c7380 100644 --- a/app/[locale]/10years/page.tsx +++ b/app/[locale]/10years/page.tsx @@ -53,7 +53,6 @@ import { getHolderEvents, getTransferEvents, isAddressFiltered, - isTorchBurned, type TorchHolder, } from "@/lib/torch" import TenYearLogo from "@/public/images/10-year-anniversary/10-year-logo.png" @@ -97,7 +96,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { const adoptionCards = await getAdoptionCards() // Torch NFT data fetching logic - const transferEvents = await getTransferEvents() + const transferEvents = getTransferEvents() const torchHolderMap: Record = allTorchHolders.reduce( @@ -113,13 +112,6 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { transferEvents ) - let isBurned = false - try { - isBurned = await isTorchBurned() - } catch (error) { - console.error("Error fetching torch burned status:", error) - } - // Filter out events where the address is in the filtered list const torchHolders = torchHoldersEvents.filter( (holder) => !isAddressFiltered(holder.address) @@ -167,7 +159,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => { )}

    diff --git a/src/data/torchTransferEvents.json b/src/data/torchTransferEvents.json new file mode 100644 index 00000000000..8629b99ba3c --- /dev/null +++ b/src/data/torchTransferEvents.json @@ -0,0 +1,86 @@ +[ + { + "from": "0x0000000000000000000000000000000000000000", + "to": "0x8d3e2e0e562634244e5d229c3b97a38efbec65ab", + "blockNumber": 22959111, + "transactionHash": "0x843e4351b2e8e4569ce96c6d0850defe8edf7f26c867ebffb40a8b454b1613c8", + "timestamp": 1752998891 + }, + { + "from": "0x8d3e2e0e562634244e5d229c3b97a38efbec65ab", + "to": "0x88c2c3c9e64a1299e6417c24fa2ae773c6cea47c", + "blockNumber": 22959927, + "transactionHash": "0x4e3673694351fdc7e12b5198355bcc259c819856c5c92ac39a7ccf0561a52d79", + "timestamp": 1753008731 + }, + { + "from": "0x88c2c3c9e64a1299e6417c24fa2ae773c6cea47c", + "to": "0x11adbc1b3fd5cb5f29b0052b4affe725645b5e4c", + "blockNumber": 22965258, + "transactionHash": "0xbd3da85330f64b9d7b848bc9f3dc735770f1ece6b9e9b66fc07dd4ad0afac2ad", + "timestamp": 1753073063 + }, + { + "from": "0x11adbc1b3fd5cb5f29b0052b4affe725645b5e4c", + "to": "0xcc2047a4108033cb48727b8c69914f40cc0bbc1b", + "blockNumber": 22972035, + "transactionHash": "0x7397e35cdf8cc0262e4d56eda9340d29ed704884b30291d4d61b638e0536b833", + "timestamp": 1753154831 + }, + { + "from": "0xcc2047a4108033cb48727b8c69914f40cc0bbc1b", + "to": "0x5f19021618af1ceb5de7ca112b505f51f813ae18", + "blockNumber": 22979916, + "transactionHash": "0x0c4d6a4a876ed2d48a9a4dccd10d2b9398ab8d017b097a82ac0bd6e161a31423", + "timestamp": 1753250075 + }, + { + "from": "0x5f19021618af1ceb5de7ca112b505f51f813ae18", + "to": "0x7a16ff8270133f063aab6c9977183d9e72835428", + "blockNumber": 22986579, + "transactionHash": "0xa26a83f51b94c16378a03f0b227519dcfe29750746585389abe93728c8433c93", + "timestamp": 1753330691 + }, + { + "from": "0x7a16ff8270133f063aab6c9977183d9e72835428", + "to": "0x0c004944e16e9065da1c7db49f9964e2a3ac8892", + "blockNumber": 22994565, + "transactionHash": "0x4b8cd47c48e21d69193d300b19d74e17156ac6a1cc754be7af72a6aa45e4abf0", + "timestamp": 1753427183 + }, + { + "from": "0x0c004944e16e9065da1c7db49f9964e2a3ac8892", + "to": "0x54bae63e59b422dd7c047e375f051d60c37cb60f", + "blockNumber": 23001408, + "transactionHash": "0x763d47e62f18f287de1d95686a7ac7099e794ec6b42a2210e2beeda4f804e271", + "timestamp": 1753509863 + }, + { + "from": "0x54bae63e59b422dd7c047e375f051d60c37cb60f", + "to": "0xa307a15d113d9763c6fc84768ac34909438bb2ee", + "blockNumber": 23008580, + "transactionHash": "0x3740f90f7ef273b821f9f9106ad45542ab0af1ebba4af53b3c0a0ba13ae24b82", + "timestamp": 1753596383 + }, + { + "from": "0xa307a15d113d9763c6fc84768ac34909438bb2ee", + "to": "0x648aa14e4424e0825a5ce739c8c68610e143fb79", + "blockNumber": 23017584, + "transactionHash": "0x5760ed9cf8b8611a57c07f7aec5f3d9256325cf52a4b999658ee77efb91603f4", + "timestamp": 1753704983 + }, + { + "from": "0x648aa14e4424e0825a5ce739c8c68610e143fb79", + "to": "0x36acc9e5248f33b030d3ea3465ac1f99e55868ec", + "blockNumber": 23023646, + "transactionHash": "0x77dd6bbe4da042c9f7ad26447070807be5de946d129148c345f70b9cb891c74b", + "timestamp": 1753778231 + }, + { + "from": "0x36acc9e5248f33b030d3ea3465ac1f99e55868ec", + "to": "0x0000000000000000000000000000000000000000", + "blockNumber": 23032809, + "transactionHash": "0x7b6c5ae7767ee63abb5ac88374fc197bab571e71749e25fd574b102d315ec4bd", + "timestamp": 1753889003 + } +] diff --git a/src/lib/torch/etherscan.ts b/src/lib/torch/etherscan.ts deleted file mode 100644 index cfd09e18931..00000000000 --- a/src/lib/torch/etherscan.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { type Address } from "viem" - -import Torch from "@/data/Torch.json" - -const TORCH_CONTRACT_ADDRESS = Torch.address as Address -const TORCH_BLOCK_NUMBER = Torch.blockNumber - -export type TransferEvent = { - from: Address - to: Address - blockNumber: number - transactionHash: string - timestamp: number -} - -// You'll need to get an API key from https://etherscan.io/apis -const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY || "" - -export const fetchTorchTransfersFromEtherscan = async (): Promise< - TransferEvent[] -> => { - if (!ETHERSCAN_API_KEY) { - throw new Error("ETHERSCAN_API_KEY environment variable is required") - } - - try { - // Get contract events from Etherscan - const response = await fetch( - [ - "https://api.etherscan.io/api", - "?module=logs", - "&action=getLogs", - `&address=${TORCH_CONTRACT_ADDRESS}`, - `&fromBlock=${TORCH_BLOCK_NUMBER}`, - "&toBlock=latest", - // ERC721 Transfer event signature - "&topic0=0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - `&apikey=${ETHERSCAN_API_KEY}`, - ].join("") - ) - - const data = await response.json() - - if (data.status !== "1") { - throw new Error(`Etherscan API error: ${data.message}`) - } - - return data.result.map( - (log: { - topics: string[] - blockNumber: string - transactionHash: string - timeStamp: string - }) => ({ - from: `0x${log.topics[1].slice(26)}` as Address, // Remove padding from topic1 - to: `0x${log.topics[2].slice(26)}` as Address, // Remove padding from topic2 - blockNumber: parseInt(log.blockNumber, 16), - transactionHash: log.transactionHash, - timestamp: parseInt(log.timeStamp, 16), - }) - ) - } catch (error) { - console.error("Failed to fetch torch transfers from Etherscan:", error) - return [] - } -} diff --git a/src/lib/torch/index.ts b/src/lib/torch/index.ts index 9390bd7c307..4dba2b623cf 100644 --- a/src/lib/torch/index.ts +++ b/src/lib/torch/index.ts @@ -4,9 +4,9 @@ import { type Address, isAddress } from "viem" import { getPublicClient } from "@wagmi/core" import Torch from "@/data/Torch.json" +import torchTransferEvents from "@/data/torchTransferEvents.json" import { config } from "./config" -import { fetchTorchTransfersFromEtherscan } from "./etherscan" const TORCH_CONTRACT_ADDRESS = Torch.address as Address const TORCH_ABI = Torch.abi @@ -48,14 +48,9 @@ export type TorchHolderEvent = TorchHolder & { event: TransferEvent } -export const getTransferEvents = cache( - async () => { - const transferEvents = await fetchTorchTransfersFromEtherscan() - return transferEvents - }, - ["torch-transfer-events"], - { revalidate: 86400 } -) +export const getTransferEvents = () => { + return torchTransferEvents as TransferEvent[] +} export const getHolderEvents = async ( torchHolderMap: Record, From 2b308cb8a5881a54b4de576b1586b3ebab91acc9 Mon Sep 17 00:00:00 2001 From: Pablo Date: Wed, 30 Jul 2025 18:11:58 +0200 Subject: [PATCH 170/171] cleanup: remove current holder component --- .../_components/CurrentTorchHolderCard.tsx | 130 ------------------ app/[locale]/10years/page.tsx | 11 +- 2 files changed, 1 insertion(+), 140 deletions(-) delete mode 100644 app/[locale]/10years/_components/CurrentTorchHolderCard.tsx diff --git a/app/[locale]/10years/_components/CurrentTorchHolderCard.tsx b/app/[locale]/10years/_components/CurrentTorchHolderCard.tsx deleted file mode 100644 index fb282e9284f..00000000000 --- a/app/[locale]/10years/_components/CurrentTorchHolderCard.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { Avatar } from "@/components/ui/avatar" -import { ButtonLink } from "@/components/ui/buttons/Button" -import { - Card, - CardContent, - CardFooter, - CardHeader, - CardTitle, -} from "@/components/ui/card" -import { BaseLink } from "@/components/ui/Link" - -import { cn } from "@/lib/utils/cn" - -import Curved10YearsText from "./10y.svg" - -import { - extractTwitterHandle, - formatAddress, - getAvatarImage, - getTxEtherscanUrl, - type TorchHolderEvent, -} from "@/lib/torch" - -interface CurrentTorchHolderCardProps { - currentHolder: TorchHolderEvent | null - isBurned?: boolean - className?: string -} - -const CurrentTorchHolderCard = ({ - currentHolder, - isBurned = false, - className, -}: CurrentTorchHolderCardProps) => { - return ( - - -
    - {/* Torch/flame video */} -
    -
    -
    - - - {/* Curved text */} - - -
    - - {/* Bottom section: torchbearer info */} - - {currentHolder ? ( -
    - - -
    - {/* Name */} -
    - {currentHolder.name || formatAddress(currentHolder.address)} -
    - {/* Description */} -
    {currentHolder.role || "Current torchbearer"}
    - {/* Verify onchain link */} - - View on Etherscan - -
    -
    - ) : isBurned ? ( -
    -
    - 🔥 Torch Burned 🔥 -
    -
    - The Ethereum Torch has been burned to celebrate the 10-year - anniversary! -
    -
    - ) : ( -
    -
    🤐 Unknown Bearer
    -
    - The current torch bearer's identity is not publicly - available. -
    -
    - )} -
    - - - See all torchbearers - - - - ) -} - -export default CurrentTorchHolderCard diff --git a/app/[locale]/10years/page.tsx b/app/[locale]/10years/page.tsx index 6dba54c7380..c55757ed5d2 100644 --- a/app/[locale]/10years/page.tsx +++ b/app/[locale]/10years/page.tsx @@ -30,7 +30,6 @@ import { BASE_TIME_UNIT } from "@/lib/constants" import Curved10YearsText from "./_components/10y.svg" import AdoptionSwiper from "./_components/AdoptionSwiper/lazy" import CountDown from "./_components/CountDown/lazy" -import CurrentTorchHolderCard from "./_components/CurrentTorchHolderCard" import { adoptionStyles } from "./_components/data" import InnovationSwiper from "./_components/InnovationSwiper/lazy" import NFTMintCardWrapper from "./_components/NFTMintCardWrapper" @@ -153,15 +152,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => {

    - {showNFTMint ? ( - - ) : ( - - )} +
  • From 23809c073db94509f074ee35fbcac5ae373e9950 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 31 Jul 2025 13:08:16 -0600 Subject: [PATCH 171/171] upgrades number 15 -> 16 --- app/[locale]/enterprise/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/enterprise/page.tsx b/app/[locale]/enterprise/page.tsx index f28a4941ca9..2733a8c0414 100644 --- a/app/[locale]/enterprise/page.tsx +++ b/app/[locale]/enterprise/page.tsx @@ -118,7 +118,7 @@ const Page = async ({ params }: { params: { locale: Lang } }) => { }, { label: "Upgrades", - state: { value: "15" }, // TODO: Calculate from upgrades list + state: { value: "16" }, // TODO: Calculate from upgrades list }, { label: "Downtime",