diff --git a/.all-contributorsrc b/.all-contributorsrc
index aff162fb82e..1a53db5e64c 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -8379,7 +8379,8 @@
"avatar_url": "https://avatars.githubusercontent.com/u/45835846?v=4",
"profile": "https://pandapip1.com/",
"contributions": [
- "doc"
+ "doc",
+ "ideas"
]
},
{
@@ -10676,6 +10677,42 @@
"contributions": [
"doc"
]
+ },
+ {
+ "login": "joaolago1113",
+ "name": "joao",
+ "avatar_url": "https://avatars.githubusercontent.com/u/22820692?v=4",
+ "profile": "https://github.com/joaolago1113",
+ "contributions": [
+ "doc"
+ ]
+ },
+ {
+ "login": "rgb2hsl",
+ "name": "Eugene",
+ "avatar_url": "https://avatars.githubusercontent.com/u/3310192?v=4",
+ "profile": "http://p2p.org",
+ "contributions": [
+ "content"
+ ]
+ },
+ {
+ "login": "g0rbe",
+ "name": "Dániel Görbe",
+ "avatar_url": "https://avatars.githubusercontent.com/u/36860942?v=4",
+ "profile": "http://www.danielgorbe.com",
+ "contributions": [
+ "doc"
+ ]
+ },
+ {
+ "login": "s-crypt",
+ "name": "s-crypt",
+ "avatar_url": "https://avatars.githubusercontent.com/u/41712656?v=4",
+ "profile": "https://blog.insubli.me",
+ "contributions": [
+ "content"
+ ]
}
],
"contributorsPerLine": 7,
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index fa042c6b933..db9004a7f85 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -5,7 +5,7 @@
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence,
-* @samajammin @wackerow @corwintines @pettinarip @minimalsm @jmcook1186 @nhsz
+* @wackerow @corwintines @pettinarip @minimalsm @nhsz
# Owners of specific files
/src/data/consensus-bounty-hunters.csv @djrtwo @asanso @fredriksvantes
diff --git a/README.md b/README.md
index 86523963715..f184daa35f2 100644
--- a/README.md
+++ b/README.md
@@ -1347,7 +1347,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
rogueassasin1729 📖
- Pandapip1 📖
+ Pandapip1 📖 🤔
Aldi Zhupani 🐛 💻
linhuatan 📖
Hugh 📖
@@ -1671,6 +1671,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Costanza 📖
+ joao 📖
+ Eugene 🖋
+ Dániel Görbe 📖
+ s-crypt 🖋
diff --git a/gatsby-node.ts b/gatsby-node.ts
index 4b0cbfbbb11..2bf78171cd7 100644
--- a/gatsby-node.ts
+++ b/gatsby-node.ts
@@ -38,7 +38,8 @@ const commonRedirectProps = {
* @returns boolean for if file is outdated or not
*/
const checkIsMdxOutdated = (filePath: string): boolean => {
- const dirname = path.resolve("./")
+ // .replace(/\\/g, "/") to replace \ in windows paths ex: C:\\folder\\myfile.txt becomes C:/folder/myfile.txt
+ const dirname = path.resolve("./").replace(/\\/g, "/")
const splitPath = filePath.split(dirname)
const tempSplitPath = splitPath[1]
const tempSplit = tempSplitPath.split("/")
diff --git a/src/assets/heroes/community-hero.png b/src/assets/heroes/community-hero.png
new file mode 100644
index 00000000000..7820b477d57
Binary files /dev/null and b/src/assets/heroes/community-hero.png differ
diff --git a/src/components/Hero/HubHero/index.tsx b/src/components/Hero/HubHero/index.tsx
index b51c690074a..4dfcd821ad1 100644
--- a/src/components/Hero/HubHero/index.tsx
+++ b/src/components/Hero/HubHero/index.tsx
@@ -55,6 +55,7 @@ const HubHero = (props: HubHeroProps) => {
transform={{ xl: "translateY(-50%)" }}
backdropFilter={{ xl: "auto" }}
backdropBlur={{ xl: "base" }}
+ wordBreak="break-word"
>
= (props) => {
= (props) => {
{/* Show green tick if quizz was completed only */}
-
-
-
+ {isCompleted && }
{/* Labels */}
@@ -86,7 +83,7 @@ const QuizItem: React.FC = (props) => {
{/* Start Button */}
diff --git a/src/components/Quiz/QuizRadioGroup.tsx b/src/components/Quiz/QuizRadioGroup.tsx
index 4a8cf1477fd..8b8884d75a7 100644
--- a/src/components/Quiz/QuizRadioGroup.tsx
+++ b/src/components/Quiz/QuizRadioGroup.tsx
@@ -4,8 +4,12 @@ import {
chakra,
Circle,
Flex,
+ FlexProps,
RadioProps,
+ SquareProps,
+ Stack,
Text,
+ TextProps,
useRadio,
useRadioGroup,
useToken,
@@ -21,6 +25,90 @@ import { Question } from "../../types"
interface CustomRadioProps extends RadioProps {
index: number
label: string
+ showAnswer: boolean
+ isSelectedCorrect: boolean
+}
+
+const CustomRadio: React.FC = ({
+ index,
+ label,
+ showAnswer,
+ isSelectedCorrect,
+ ...radioProps
+}) => {
+ const { state, getInputProps, getRadioProps, htmlProps } =
+ useRadio(radioProps)
+
+ // Memoized values
+ const buttonBg = useMemo(() => {
+ if (!state.isChecked) return "body.inverted"
+ if (!showAnswer) return "primary.base"
+ if (!isSelectedCorrect) return "error.base"
+ return "success.base"
+ }, [state.isChecked, showAnswer, isSelectedCorrect])
+
+ const primaryBaseColor = useToken("colors", "primary.base")
+
+ const focusProps: FlexProps = {
+ outline: showAnswer ? "none" : `1px solid ${primaryBaseColor}`,
+ }
+
+ const controlFocusProps: SquareProps = {
+ bg: showAnswer ? "white" : "primary.pressed",
+ }
+
+ const getRadioControlBg = (): SquareProps["bg"] => {
+ if (showAnswer) return "white"
+
+ if (state.isChecked) return "primary.pressed"
+
+ return "disabled"
+ }
+
+ const getControlLabelColor = (): TextProps["color"] => {
+ if (!showAnswer) return "white"
+
+ if (isSelectedCorrect) return "success.base"
+
+ return "error.base"
+ }
+
+ // Render CustomRadio component
+ return (
+
+
+
+
+
+ {String.fromCharCode(97 + index).toUpperCase()}
+
+
+ {label}
+
+
+ )
}
interface IProps {
@@ -52,91 +140,18 @@ const QuizRadioGroup: React.FC = ({
[selectedAnswer]
)
- // Custom radio button component
- const CustomRadio: React.FC = ({
- index,
- label,
- ...radioProps
- }) => {
- const { state, getInputProps, getCheckboxProps, htmlProps } =
- useRadio(radioProps)
-
- // Memoized values
- const buttonBg = useMemo(() => {
- if (!state.isChecked) return "body.inverted"
- if (!showAnswer) return "primary.base"
- if (!isSelectedCorrect) return "error.base"
- return "success.base"
- }, [state.isChecked, showAnswer, isSelectedCorrect])
-
- const primaryBaseColor = useToken("colors", "primary.base")
-
- // Render CustomRadio component
- return (
-
-
-
-
-
- {String.fromCharCode(97 + index).toUpperCase()}
-
-
- {label}
-
-
- )
- }
-
// Render QuizRadioGroup
return (
-
+
{t(prompt)}
-
+
{answers.map(({ id, label }, index) => {
const display =
!showAnswer || id === selectedAnswer ? "inline-flex" : "none"
@@ -146,21 +161,23 @@ const QuizRadioGroup: React.FC = ({
display={display}
index={index}
label={t(label)}
+ showAnswer={showAnswer}
+ isSelectedCorrect={isSelectedCorrect}
{...getRadioProps({ value: id })}
/>
)
})}
-
+
{showAnswer && (
-
+
{t(explanation)}
)}
-
+
)
}
diff --git a/src/components/Quiz/QuizSummary.tsx b/src/components/Quiz/QuizSummary.tsx
index 20c26f9f083..356c74c4708 100644
--- a/src/components/Quiz/QuizSummary.tsx
+++ b/src/components/Quiz/QuizSummary.tsx
@@ -1,9 +1,14 @@
import React, { useEffect } from "react"
-import { Box, Flex, useMediaQuery } from "@chakra-ui/react"
+import {
+ HStack,
+ StackDivider,
+ Text,
+ useMediaQuery,
+ VStack,
+} from "@chakra-ui/react"
import { useI18next } from "gatsby-plugin-react-i18next"
import Translation from "../Translation"
-import Text from "../OldText"
import { numberToPercent } from "../../utils/numberToPercent"
import { updateUserStats } from "./utils"
@@ -31,7 +36,7 @@ const QuizSummary: React.FC = ({
const { language } = useI18next()
const [largerThanMobile] = useMediaQuery("(min-width: 30em)")
- const valueStyles = { fontWeight: "700", mb: 2 }
+ const valueStyles = { fontWeight: "700", lineHeight: 1 }
const labelStyles = { fontSize: "sm", m: 0, color: "disabled" }
// QuizSummary is rendered when user has finished the quiz, proper time to update the stats
@@ -45,7 +50,7 @@ const QuizSummary: React.FC = ({
}, [])
return (
-
+
= ({
)}
- div": {
+ py: "4",
},
}}
overflowX="hidden"
+ divider={ }
>
-
+
{numberToPercent(ratioCorrect, language)}
-
+
-
+
+{numberOfCorrectAnswers}
-
+
{largerThanMobile && (
-
+
{questionCount}
-
+
)}
-
-
+
+
)
}
diff --git a/src/components/Quiz/QuizWidget.tsx b/src/components/Quiz/QuizWidget.tsx
deleted file mode 100644
index 72113070617..00000000000
--- a/src/components/Quiz/QuizWidget.tsx
+++ /dev/null
@@ -1,550 +0,0 @@
-import React, {
- useEffect,
- useState,
- useMemo,
- useCallback,
- useContext,
-} from "react"
-import {
- Box,
- Center,
- Circle,
- Flex,
- Heading,
- Icon,
- Spinner,
- Stack,
- Container,
-} from "@chakra-ui/react"
-import { shuffle } from "lodash"
-import { FaTwitter } from "react-icons/fa"
-import { useTranslation } from "gatsby-plugin-react-i18next"
-
-import Button from "../Buttons/Button"
-import QuizRadioGroup from "./QuizRadioGroup"
-import QuizSummary from "./QuizSummary"
-import Translation from "../Translation"
-import Text from "../OldText"
-
-import {
- CorrectIcon,
- IncorrectIcon,
- StarConfettiIcon,
- TrophyIcon,
-} from "../icons/quiz"
-
-import { QuizzesHubContext } from "./context"
-
-import { trackCustomEvent } from "../../utils/matomo"
-
-import {
- PASSING_QUIZ_SCORE,
- PROGRESS_BAR_GAP,
- USER_STATS_KEY,
-} from "../../constants"
-import { INITIAL_USER_STATS } from "../../pages/quizzes"
-
-import { getNextQuiz } from "./utils"
-
-import {
- AnswerChoice,
- RawQuiz,
- Quiz,
- RawQuestion,
- Question,
- QuizStatus,
-} from "../../types"
-
-import allQuizzesData from "../../data/quizzes"
-import questionBank from "../../data/quizzes/questionBank"
-
-interface IProps {
- quizKey?: string
- currentHandler?: (next?: string) => void
- statusHandler?: (status: QuizStatus) => void
- maxQuestions?: number
- isStandaloneQuiz?: boolean
-}
-
-// TODO: Fix a11y keyboard tab stops
-const QuizWidget: React.FC = ({
- quizKey,
- currentHandler,
- statusHandler,
- maxQuestions,
- isStandaloneQuiz = true,
-}) => {
- const { t } = useTranslation()
- const [quizData, setQuizData] = useState(null)
- const [nextQuiz, setNextQuiz] = useState(undefined)
- const [userQuizProgress, setUserQuizProgress] = useState>(
- []
- )
- const [showAnswer, setShowAnswer] = useState(false)
- const [currentQuestionAnswerChoice, setCurrentQuestionAnswerChoice] =
- useState(null)
- const [selectedAnswer, setSelectedAnswer] = useState(null)
-
- const { setUserStats } = useContext(QuizzesHubContext)
-
- useEffect(() => {
- // If quiz is standalone (out of Quiz Hub page),
- // stats required to be initialized on localStorage first
- const item = window.localStorage.getItem(USER_STATS_KEY)
-
- if (item === null) {
- localStorage.setItem(USER_STATS_KEY, JSON.stringify(INITIAL_USER_STATS))
- }
-
- setNextQuiz(getNextQuiz(quizKey))
- }, [quizKey])
-
- const hasNextQuiz = !isStandaloneQuiz && !!nextQuiz
- const finishedQuiz =
- userQuizProgress.length === quizData?.questions.length! - 1
-
- // Reset quiz state
- const initialize = () => {
- setQuizData(null)
- setCurrentQuestionAnswerChoice(null)
- setUserQuizProgress([])
- setShowAnswer(false)
- setSelectedAnswer(null)
-
- if (!isStandaloneQuiz) {
- statusHandler?.("neutral")
- }
-
- const currentQuizKey =
- quizKey ||
- Object.keys(allQuizzesData).filter((quizUri) =>
- window?.location.href.includes(quizUri)
- )[0] ||
- null
-
- if (!currentQuizKey) return
-
- // Get quiz data from key, shuffle, then truncate if necessary
- const rawQuiz: RawQuiz = allQuizzesData[currentQuizKey]
- const questions: Array = rawQuiz.questions.map((id) => {
- const rawQuestion: RawQuestion = questionBank[id]
- return { id, ...rawQuestion }
- })
- const shuffledQuestions = shuffle(questions)
- const trimmedQuestions = maxQuestions
- ? shuffledQuestions.slice(0, maxQuestions)
- : shuffledQuestions
- const quiz: Quiz = {
- title: t(rawQuiz.title),
- questions: trimmedQuestions,
- }
-
- setQuizData(quiz)
- }
-
- useEffect(initialize, [quizKey])
-
- const currentQuestionIndex = userQuizProgress.length
- const showResults = currentQuestionIndex === quizData?.questions.length
-
- const progressBarBackground = useCallback(
- (index: number): string => {
- if (
- (showAnswer &&
- index === currentQuestionIndex &&
- currentQuestionAnswerChoice?.isCorrect) ||
- userQuizProgress[index]?.isCorrect
- ) {
- return "success.base"
- }
-
- if (
- (showAnswer &&
- index === currentQuestionIndex &&
- !currentQuestionAnswerChoice?.isCorrect) ||
- (userQuizProgress[index] && !userQuizProgress[index].isCorrect)
- ) {
- return "error.base"
- }
-
- if (index === currentQuestionIndex) {
- return "gray.400"
- }
-
- return "gray.500"
- },
- [
- showAnswer,
- currentQuestionIndex,
- currentQuestionAnswerChoice,
- userQuizProgress,
- ]
- )
-
- const numberOfCorrectAnswers = userQuizProgress.filter(
- ({ isCorrect }) => isCorrect
- ).length
-
- const ratioCorrect = !quizData
- ? 0
- : numberOfCorrectAnswers / quizData.questions.length
-
- const quizScore = Math.floor(ratioCorrect * 100)
- const isPassingScore = quizScore > PASSING_QUIZ_SCORE
-
- const showConfetti = useMemo(
- () => !!quizData && showResults && isPassingScore,
- [quizData, showResults, isPassingScore]
- )
-
- const handleSelectAnswerChoice = (answerId: string) => {
- const isCorrect =
- answerId === quizData?.questions[currentQuestionIndex].correctAnswerId
- setCurrentQuestionAnswerChoice({ answerId, isCorrect })
- }
-
- const handleSelection = (answerId: string) => {
- setSelectedAnswer(answerId)
- handleSelectAnswerChoice(answerId)
- }
-
- const handleSubmitAnswer = (questionId: string, answer: AnswerChoice) => {
- trackCustomEvent({
- eventCategory: "Quiz widget",
- eventAction: "Question answered",
- eventName: `QID: ${questionId}`,
- eventValue: answer.isCorrect ? "1" : "0",
- })
-
- setShowAnswer(true)
-
- if (!isStandaloneQuiz) {
- if (currentQuestionAnswerChoice?.isCorrect) {
- statusHandler?.("success")
- }
-
- if (!currentQuestionAnswerChoice?.isCorrect) {
- statusHandler?.("error")
- }
- }
- }
-
- const handleRetryQuestion = () => {
- trackCustomEvent({
- eventCategory: "Quiz widget",
- eventAction: "Other",
- eventName: "Retry question",
- })
-
- setCurrentQuestionAnswerChoice(null)
- setSelectedAnswer(null)
- setShowAnswer(false)
-
- if (!isStandaloneQuiz) {
- statusHandler?.("neutral")
- }
- }
-
- const handleShare = () => {
- if (!quizData || !window) return
-
- trackCustomEvent({
- eventCategory: "quiz_hub_events",
- eventAction: "Secondary button clicks",
- eventName: "Twitter_share_quiz",
- })
-
- const url = `https://ethereum.org${window.location.pathname}%23quiz`
- const hashtags = ["ethereumquiz", "ethereum", "quiz"]
- const tweet = `${encodeURI(
- `I just took the "${quizData.title}" quiz on ethereum.org and scored ${numberOfCorrectAnswers} out of ${quizData.questions.length}! Try it yourself at ${url}`
- )}`
-
- window.open(
- `https://twitter.com/intent/tweet?text=${tweet}&hashtags=${hashtags}`
- )
- }
-
- const handleContinue = () => {
- if (!currentQuestionAnswerChoice) return
-
- setUserQuizProgress((prev) => [...prev, currentQuestionAnswerChoice])
- setCurrentQuestionAnswerChoice(null)
- setShowAnswer(false)
-
- // Reset quiz status (modifies bg color for mobile)
- if (!isStandaloneQuiz) {
- statusHandler?.("neutral")
- }
-
- if (finishedQuiz) {
- trackCustomEvent({
- eventCategory: "Quiz widget",
- eventAction: "Other",
- eventName: "Submit results",
- eventValue: `${quizScore}%`,
- })
- }
- }
-
- const handleNextQuiz = () => {
- currentHandler?.(nextQuiz)
- }
-
- const AnswerIcon = () => {
- const commonProps = {
- color: "neutral",
- }
-
- if (!showAnswer) {
- return
- }
-
- return currentQuestionAnswerChoice?.isCorrect ? (
-
- ) : (
-
- )
- }
-
- // Render QuizWidget component
- return (
-
- {/* Hide heading if quiz is not in Learning Quizzes Hub page */}
- {isStandaloneQuiz && (
-
-
-
- )}
-
-
- {showConfetti && (
- <>
-
-
-
- >
- )}
-
-
- {/* Answer Icon - defaults to TrophyIcon */}
-
-
-
-
- {quizData ? (
- <>
- {/* Quiz title */}
-
-
- {showAnswer && currentQuestionAnswerChoice?.isCorrect
- ? "Correct!"
- : showAnswer && !currentQuestionAnswerChoice?.isCorrect
- ? "Incorrect"
- : quizData.title}
-
-
-
- {/* Progress bar */}
-
- {quizData?.questions.map(({ id }, index) => {
- /* Calculate width percent based on number of questions */
- const width = `calc(${Math.floor(
- 100 / quizData?.questions.length
- )}% - ${PROGRESS_BAR_GAP})`
-
- return (
-
- )
- })}
-
-
- {/* Quiz main body */}
-
- {showResults ? (
- // QuizSummary is receiving quizKey & setUserStats as props as it can be rendered on
- // other pages without access to the Context values defined on /quizzes
-
- ) : (
-
- )}
-
- >
- ) : (
-
-
-
- )}
-
-
- {/* Quiz buttons */}
- {quizData && (
-
-
- {showAnswer &&
- currentQuestionAnswerChoice &&
- !currentQuestionAnswerChoice.isCorrect && (
-
-
-
- )}
-
- {showResults ? (
-
-
- }
- onClick={handleShare}
- >
-
-
-
- {/* Show `Next Quiz` button if quiz is opened from hub page */}
- {hasNextQuiz && (
-
-
-
- )}
-
-
- {showResults && quizScore < 100 && (
-
-
-
-
-
- )}
-
- ) : showAnswer ? (
-
- {finishedQuiz ? t("see-results") : t("next-question")}
-
- ) : (
-
- handleSubmitAnswer(
- quizData.questions[currentQuestionIndex].id,
- currentQuestionAnswerChoice!
- )
- }
- isDisabled={!currentQuestionAnswerChoice}
- >
-
-
- )}
-
-
- )}
-
-
- )
-}
-
-export default QuizWidget
diff --git a/src/components/Quiz/QuizWidget/AnswerIcon.tsx b/src/components/Quiz/QuizWidget/AnswerIcon.tsx
new file mode 100644
index 00000000000..a41dffe82ad
--- /dev/null
+++ b/src/components/Quiz/QuizWidget/AnswerIcon.tsx
@@ -0,0 +1,59 @@
+import { Circle, SquareProps } from "@chakra-ui/react"
+import * as React from "react"
+import { ChildOnlyProp } from "../../../types"
+import { CorrectIcon, IncorrectIcon, TrophyIcon } from "../../icons/quiz"
+
+interface AnswerIconProps {
+ showAnswer: boolean
+ isCurrentQuestionCorrect: boolean | undefined
+}
+
+/**
+ * Icon shown for the answer
+ *
+ * Defaults to the `TrophyIcon` prior to answering a question
+ */
+export const AnswerIcon = ({
+ showAnswer,
+ isCurrentQuestionCorrect,
+}: AnswerIconProps) => {
+ const commonProps = {
+ color: "neutral",
+ }
+
+ const IconWrapper = (props: ChildOnlyProp) => {
+ const getWrapperBg = (): SquareProps["bg"] => {
+ if (!showAnswer) {
+ return "primary.base"
+ }
+ if (isCurrentQuestionCorrect) {
+ return "success.base"
+ }
+ return "error.base"
+ }
+
+ return
+ }
+
+ if (!showAnswer) {
+ return (
+
+
+
+ )
+ }
+
+ if (isCurrentQuestionCorrect) {
+ return (
+
+
+
+ )
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/src/components/Quiz/QuizWidget/QuizButtonGroup.tsx b/src/components/Quiz/QuizWidget/QuizButtonGroup.tsx
new file mode 100644
index 00000000000..1ff2366bf96
--- /dev/null
+++ b/src/components/Quiz/QuizWidget/QuizButtonGroup.tsx
@@ -0,0 +1,129 @@
+import * as React from "react"
+import { Center, Icon } from "@chakra-ui/react"
+import { FaTwitter } from "react-icons/fa"
+import { Button } from "../../Buttons"
+import Translation from "../../Translation"
+import { AnswerChoice, Question } from "../../../types"
+
+export type QuizButtonGroupProps = {
+ showAnswer: boolean
+ showResults: boolean
+ quizScore: number
+ handleReset: () => void
+ currentQuestionIndex: number
+ currentQuestionAnswerChoice: AnswerChoice | null
+ questions: Question[]
+ finishedQuiz: boolean
+ handleRetryQuestion: () => void
+ handleShare: () => void
+ handleNextQuiz: () => void
+ hasNextQuiz: boolean
+ handleContinue: () => void
+ handleSubmitAnswer: (questionId: string, answerChoice: AnswerChoice) => void
+}
+
+export const QuizButtonGroup = ({
+ showAnswer,
+ showResults,
+ quizScore,
+ questions,
+ handleReset,
+ currentQuestionIndex,
+ currentQuestionAnswerChoice,
+ finishedQuiz,
+ handleRetryQuestion,
+ handleShare,
+ handleNextQuiz,
+ hasNextQuiz,
+ handleContinue,
+ handleSubmitAnswer,
+}: QuizButtonGroupProps) => {
+ const hasFailedAnswer =
+ currentQuestionAnswerChoice && !currentQuestionAnswerChoice.isCorrect
+
+ const hasNotPerfectQuizScore = quizScore < 100
+
+ const MainButtons = () => {
+ if (showResults) {
+ return (
+ <>
+
+ }
+ onClick={handleShare}
+ >
+
+
+
+ {/* Show `Next Quiz` button if quiz is opened from hub page */}
+ {hasNextQuiz && (
+
+
+
+ )}
+
+
+ {hasNotPerfectQuizScore ? (
+
+
+
+ ) : null}
+ >
+ )
+ }
+
+ if (showAnswer) {
+ return (
+ <>
+ {hasFailedAnswer ? (
+
+
+
+ ) : null}
+
+
+
+ >
+ )
+ }
+
+ return (
+
+ handleSubmitAnswer(
+ questions[currentQuestionIndex].id,
+ currentQuestionAnswerChoice!
+ )
+ }
+ isDisabled={!currentQuestionAnswerChoice}
+ >
+
+
+ )
+ }
+
+ // Render QuizButtonGroup component
+ return (
+
+
+
+ )
+}
diff --git a/src/components/Quiz/QuizWidget/QuizConfetti.tsx b/src/components/Quiz/QuizWidget/QuizConfetti.tsx
new file mode 100644
index 00000000000..6cae8a0dbdf
--- /dev/null
+++ b/src/components/Quiz/QuizWidget/QuizConfetti.tsx
@@ -0,0 +1,18 @@
+import * as React from "react"
+import { IconProps } from "@chakra-ui/react"
+import { StarConfettiIcon } from "../../icons/quiz"
+
+export const QuizConfetti = () => {
+ const commonProps: IconProps = {
+ fontSize: "184px",
+ position: "absolute",
+ top: 0,
+ }
+ return (
+ <>
+
+
+
+ >
+ )
+}
diff --git a/src/components/Quiz/QuizWidget/QuizContent.tsx b/src/components/Quiz/QuizWidget/QuizContent.tsx
new file mode 100644
index 00000000000..dcff6123c80
--- /dev/null
+++ b/src/components/Quiz/QuizWidget/QuizContent.tsx
@@ -0,0 +1,100 @@
+import * as React from "react"
+import { Center, Container, Text, TextProps, VStack } from "@chakra-ui/react"
+import QuizSummary from "../QuizSummary"
+import QuizRadioGroup from "../QuizRadioGroup"
+import { PROGRESS_BAR_GAP } from "../../../constants"
+import { Question } from "../../../types"
+
+export type QuizContentProps = {
+ showAnswer: boolean
+ showResults: boolean
+ isCurrentQuestionCorrect: boolean | undefined
+ questions: Question[]
+ title: string
+ progressBarBackground: (index: number) => string
+ quizSummaryProps: Omit<
+ React.ComponentPropsWithoutRef,
+ "quizData"
+ >
+ currentQuestionIndex: number
+ quizRadioGroupProps: Omit<
+ React.ComponentPropsWithoutRef,
+ "questionData" | "showAnswer"
+ >
+}
+
+export const QuizContent = ({
+ showAnswer,
+ isCurrentQuestionCorrect,
+ questions,
+ title,
+ progressBarBackground,
+ showResults,
+ quizSummaryProps,
+ currentQuestionIndex,
+ quizRadioGroupProps,
+}: QuizContentProps) => {
+ const getTitleTextColor = (): TextProps["color"] => {
+ if (showAnswer) {
+ return isCurrentQuestionCorrect ? "success.base" : "fail.base"
+ }
+
+ return "primary.hover"
+ }
+
+ const getTitleContent = (): string => {
+ if (showAnswer) {
+ return isCurrentQuestionCorrect ? "Correct!" : "Incorrect"
+ }
+
+ return title
+ }
+
+ return (
+
+ {/* Quiz title */}
+
+
+ {getTitleContent()}
+
+
+ {!showResults ? (
+ <>
+ {/* Progress bar */}
+
+ {questions.map(({ id }, index) => {
+ /* Calculate width percent based on number of questions */
+ const width = `calc(${Math.floor(
+ 100 / questions.length
+ )}% - ${PROGRESS_BAR_GAP})`
+
+ return (
+
+ )
+ })}
+
+
+ >
+ ) : (
+
+ )}
+
+ )
+}
diff --git a/src/components/Quiz/QuizWidget/StandaloneQuizHeading.tsx b/src/components/Quiz/QuizWidget/StandaloneQuizHeading.tsx
new file mode 100644
index 00000000000..ccd3fcb12f1
--- /dev/null
+++ b/src/components/Quiz/QuizWidget/StandaloneQuizHeading.tsx
@@ -0,0 +1,15 @@
+import * as React from "react"
+import { Heading } from "@chakra-ui/react"
+import Translation from "../../Translation"
+
+export const StandaloneQuizHeading = () => (
+
+
+
+)
diff --git a/src/components/Quiz/QuizWidget/index.tsx b/src/components/Quiz/QuizWidget/index.tsx
new file mode 100644
index 00000000000..907b4da2b12
--- /dev/null
+++ b/src/components/Quiz/QuizWidget/index.tsx
@@ -0,0 +1,158 @@
+import * as React from "react"
+import { Center, Spinner, Stack, StackProps, VStack } from "@chakra-ui/react"
+
+import { StandaloneQuizHeading } from "./StandaloneQuizHeading"
+import { AnswerIcon } from "./AnswerIcon"
+import { QuizConfetti } from "./QuizConfetti"
+import { QuizContent } from "./QuizContent"
+import { QuizButtonGroup } from "./QuizButtonGroup"
+import { useQuizWidget } from "./useQuizWidget"
+
+import { QuizStatus } from "../../../types"
+
+export interface IProps {
+ quizKey?: string
+ currentHandler?: (next?: string) => void
+ statusHandler?: (status: QuizStatus) => void
+ maxQuestions?: number
+ isStandaloneQuiz?: boolean
+}
+
+const QuizWidget: React.FC = (props) => {
+ const {
+ quizData,
+ showAnswer,
+ currentQuestionAnswerChoice,
+ showConfetti,
+ progressBarBackground,
+ currentQuestionIndex,
+ finishedQuiz,
+ handleContinue,
+ handleRetryQuestion,
+ handleSelection,
+ handleShare,
+ handleSubmitAnswer,
+ hasNextQuiz,
+ initialize,
+ isPassingScore,
+ numberOfCorrectAnswers,
+ quizScore,
+ ratioCorrect,
+ selectedAnswer,
+ setUserStats,
+ showResults,
+ handleNextQuiz,
+ } = useQuizWidget(props)
+
+ const { quizKey, isStandaloneQuiz = false } = props
+
+ const getMainContainerBg = (): StackProps["bg"] => {
+ if (!showAnswer) {
+ return "neutral"
+ }
+
+ if (currentQuestionAnswerChoice?.isCorrect) {
+ return "success.neutral"
+ }
+
+ return "error.neutral"
+ }
+
+ // Render QuizWidget component
+ return (
+
+ {/* Inner Container */}
+
+ {showConfetti && }
+
+
+
+
+
+ {quizData ? (
+ <>
+
+
+ >
+ ) : (
+
+ )}
+
+
+
+ )
+}
+
+export default QuizWidget
+
+/**
+ * For use of the widget on single pages (not the quizzes page)
+ */
+export const StandaloneQuizWidget = (
+ props: Omit
+) => (
+
+
+
+
+)
diff --git a/src/components/Quiz/QuizWidget/useQuizWidget.tsx b/src/components/Quiz/QuizWidget/useQuizWidget.tsx
new file mode 100644
index 00000000000..313fc76635d
--- /dev/null
+++ b/src/components/Quiz/QuizWidget/useQuizWidget.tsx
@@ -0,0 +1,271 @@
+import { useCallback, useContext, useEffect, useMemo, useState } from "react"
+import { shuffle } from "lodash"
+import { useTranslation } from "gatsby-plugin-react-i18next"
+
+import allQuizzesData from "../../../data/quizzes"
+import {
+ AnswerChoice,
+ Question,
+ Quiz,
+ RawQuestion,
+ RawQuiz,
+} from "../../../types"
+import questionBank from "../../../data/quizzes/questionBank"
+import { PASSING_QUIZ_SCORE, USER_STATS_KEY } from "../../../constants"
+import { trackCustomEvent } from "../../../utils/matomo"
+import { INITIAL_USER_STATS } from "../../../pages/quizzes"
+
+import { QuizzesHubContext } from "../context"
+import { getNextQuiz } from "../utils"
+import type { IProps } from "./index"
+
+export const useQuizWidget = ({
+ currentHandler,
+ statusHandler,
+ isStandaloneQuiz,
+ maxQuestions,
+ quizKey,
+}: IProps) => {
+ const { t } = useTranslation()
+
+ const [quizData, setQuizData] = useState(null)
+ const [nextQuiz, setNextQuiz] = useState(undefined)
+ const [userQuizProgress, setUserQuizProgress] = useState>(
+ []
+ )
+ const [showAnswer, setShowAnswer] = useState(false)
+ const [currentQuestionAnswerChoice, setCurrentQuestionAnswerChoice] =
+ useState(null)
+ const [selectedAnswer, setSelectedAnswer] = useState(null)
+
+ const { setUserStats } = useContext(QuizzesHubContext)
+
+ useEffect(() => {
+ // If quiz is standalone (out of Quiz Hub page),
+ // stats required to be initialized on localStorage first
+ const item = window.localStorage.getItem(USER_STATS_KEY)
+
+ if (item === null) {
+ localStorage.setItem(USER_STATS_KEY, JSON.stringify(INITIAL_USER_STATS))
+ }
+
+ setNextQuiz(getNextQuiz(quizKey))
+ }, [quizKey])
+
+ const hasNextQuiz = !isStandaloneQuiz && !!nextQuiz
+ const finishedQuiz =
+ userQuizProgress.length === quizData?.questions.length! - 1
+
+ // Reset quiz state
+ const initialize = () => {
+ setQuizData(null)
+ setCurrentQuestionAnswerChoice(null)
+ setUserQuizProgress([])
+ setShowAnswer(false)
+ setSelectedAnswer(null)
+
+ if (!isStandaloneQuiz) {
+ statusHandler?.("neutral")
+ }
+
+ const currentQuizKey =
+ quizKey ||
+ Object.keys(allQuizzesData).filter((quizUri) =>
+ window?.location.href.includes(quizUri)
+ )[0] ||
+ null
+
+ if (!currentQuizKey) return
+
+ // Get quiz data from key, shuffle, then truncate if necessary
+ const rawQuiz: RawQuiz = allQuizzesData[currentQuizKey]
+ const questions: Array = rawQuiz.questions.map((id) => {
+ const rawQuestion: RawQuestion = questionBank[id]
+ return { id, ...rawQuestion }
+ })
+ const shuffledQuestions = shuffle(questions)
+ const trimmedQuestions = maxQuestions
+ ? shuffledQuestions.slice(0, maxQuestions)
+ : shuffledQuestions
+ const quiz: Quiz = {
+ title: t(rawQuiz.title),
+ questions: trimmedQuestions,
+ }
+
+ setQuizData(quiz)
+ }
+
+ useEffect(initialize, [quizKey])
+
+ const currentQuestionIndex = userQuizProgress.length
+ const showResults = currentQuestionIndex === quizData?.questions.length
+
+ const progressBarBackground = useCallback(
+ (index: number): string => {
+ if (
+ (showAnswer &&
+ index === currentQuestionIndex &&
+ currentQuestionAnswerChoice?.isCorrect) ||
+ userQuizProgress[index]?.isCorrect
+ ) {
+ return "success.base"
+ }
+
+ if (
+ (showAnswer &&
+ index === currentQuestionIndex &&
+ !currentQuestionAnswerChoice?.isCorrect) ||
+ (userQuizProgress[index] && !userQuizProgress[index].isCorrect)
+ ) {
+ return "error.base"
+ }
+
+ if (index === currentQuestionIndex) {
+ return "gray.400"
+ }
+
+ return "gray.500"
+ },
+ [
+ showAnswer,
+ currentQuestionIndex,
+ currentQuestionAnswerChoice,
+ userQuizProgress,
+ ]
+ )
+
+ const numberOfCorrectAnswers = userQuizProgress.filter(
+ ({ isCorrect }) => isCorrect
+ ).length
+
+ const ratioCorrect = !quizData
+ ? 0
+ : numberOfCorrectAnswers / quizData.questions.length
+
+ const quizScore = Math.floor(ratioCorrect * 100)
+ const isPassingScore = quizScore > PASSING_QUIZ_SCORE
+
+ const showConfetti = useMemo(
+ () => !!quizData && showResults && isPassingScore,
+ [quizData, showResults, isPassingScore]
+ )
+
+ const handleSelectAnswerChoice = (answerId: string) => {
+ const isCorrect =
+ answerId === quizData?.questions[currentQuestionIndex].correctAnswerId
+ setCurrentQuestionAnswerChoice({ answerId, isCorrect })
+ }
+
+ const handleSelection = (answerId: string) => {
+ setSelectedAnswer(answerId)
+ handleSelectAnswerChoice(answerId)
+ }
+
+ const handleSubmitAnswer = (questionId: string, answer: AnswerChoice) => {
+ trackCustomEvent({
+ eventCategory: "Quiz widget",
+ eventAction: "Question answered",
+ eventName: `QID: ${questionId}`,
+ eventValue: answer.isCorrect ? "1" : "0",
+ })
+
+ setShowAnswer(true)
+
+ if (!isStandaloneQuiz) {
+ if (currentQuestionAnswerChoice?.isCorrect) {
+ statusHandler?.("success")
+ }
+
+ if (!currentQuestionAnswerChoice?.isCorrect) {
+ statusHandler?.("error")
+ }
+ }
+ }
+
+ const handleRetryQuestion = () => {
+ trackCustomEvent({
+ eventCategory: "Quiz widget",
+ eventAction: "Other",
+ eventName: "Retry question",
+ })
+
+ setCurrentQuestionAnswerChoice(null)
+ setSelectedAnswer(null)
+ setShowAnswer(false)
+
+ if (!isStandaloneQuiz) {
+ statusHandler?.("neutral")
+ }
+ }
+
+ const handleShare = () => {
+ if (!quizData || !window) return
+
+ trackCustomEvent({
+ eventCategory: "quiz_hub_events",
+ eventAction: "Secondary button clicks",
+ eventName: "Twitter_share_quiz",
+ })
+
+ const url = `https://ethereum.org${window.location.pathname}%23quiz`
+ const hashtags = ["ethereumquiz", "ethereum", "quiz"]
+ const tweet = `${encodeURI(
+ `I just took the "${quizData.title}" quiz on ethereum.org and scored ${numberOfCorrectAnswers} out of ${quizData.questions.length}! Try it yourself at ${url}`
+ )}`
+
+ window.open(
+ `https://twitter.com/intent/tweet?text=${tweet}&hashtags=${hashtags}`
+ )
+ }
+
+ const handleContinue = () => {
+ if (!currentQuestionAnswerChoice) return
+
+ setUserQuizProgress((prev) => [...prev, currentQuestionAnswerChoice])
+ setCurrentQuestionAnswerChoice(null)
+ setShowAnswer(false)
+
+ // Reset quiz status (modifies bg color for mobile)
+ if (!isStandaloneQuiz) {
+ statusHandler?.("neutral")
+ }
+
+ if (finishedQuiz) {
+ trackCustomEvent({
+ eventCategory: "Quiz widget",
+ eventAction: "Other",
+ eventName: "Submit results",
+ eventValue: `${quizScore}%`,
+ })
+ }
+ }
+
+ const handleNextQuiz = () => {
+ currentHandler?.(nextQuiz)
+ }
+
+ return {
+ quizData,
+ showAnswer,
+ currentQuestionAnswerChoice,
+ showConfetti,
+ progressBarBackground,
+ showResults,
+ numberOfCorrectAnswers,
+ isPassingScore,
+ ratioCorrect,
+ quizScore,
+ setUserStats,
+ currentQuestionIndex,
+ handleSelection,
+ selectedAnswer,
+ handleRetryQuestion,
+ handleShare,
+ hasNextQuiz,
+ handleContinue,
+ initialize,
+ finishedQuiz,
+ handleSubmitAnswer,
+ handleNextQuiz,
+ }
+}
diff --git a/src/components/Quiz/QuizzesModal.tsx b/src/components/Quiz/QuizzesModal.tsx
index b8fd60428aa..16bf5cce20b 100644
--- a/src/components/Quiz/QuizzesModal.tsx
+++ b/src/components/Quiz/QuizzesModal.tsx
@@ -5,6 +5,8 @@ import {
ModalContent,
ModalCloseButton,
ModalProps,
+ ModalContentProps,
+ Center,
} from "@chakra-ui/react"
import { QuizzesHubContext } from "./context"
@@ -16,12 +18,15 @@ interface IProps extends ModalProps {
const QuizzesModal: React.FC = ({ children, ...rest }) => {
const { status: quizStatus } = useContext(QuizzesHubContext)
- const statusColor =
- quizStatus === "neutral"
- ? "neutral"
- : quizStatus === "success"
- ? "success.light"
- : "error.light"
+ const getStatusColor = (): ModalContentProps["bg"] => {
+ if (quizStatus === "neutral") {
+ return "neutral"
+ }
+ if (quizStatus === "success") {
+ return "success.neutral"
+ }
+ return "error.neutral"
+ }
return (
= ({ children, ...rest }) => {
scrollBehavior="inside"
{...rest}
>
-
+
-
-
+
+
{children}
-
+
)
}
diff --git a/src/components/Quiz/QuizzesStats.tsx b/src/components/Quiz/QuizzesStats.tsx
index 9f0ad228d87..9bfe6641bdf 100644
--- a/src/components/Quiz/QuizzesStats.tsx
+++ b/src/components/Quiz/QuizzesStats.tsx
@@ -3,9 +3,9 @@ import {
Box,
Circle,
Flex,
- Grid,
GridItem,
Progress,
+ SimpleGrid,
Stack,
Text,
} from "@chakra-ui/react"
@@ -66,18 +66,19 @@ const QuizzesStats: React.FC = () => {
} = getFormattedStats(language, average)
return (
-
-
+
+
{/* user stats */}
-
-
+
{
{
handleShare({ score: userScore, total: totalQuizzesPoints })
}
w={{ base: "full", lg: "auto" }}
- mt={{ base: 2, lg: 0 }}
+ mt={{ base: "2", lg: 0 }}
>
-
+
{
-
+
{userScore}
/{totalQuizzesPoints}
@@ -128,20 +128,15 @@ const QuizzesStats: React.FC = () => {
-
-
+
+
{" "}
{formattedUserAverageScore}
-
+
{" "}
{numberOfCompletedQuizzes}/{totalQuizzesNumber}
@@ -150,56 +145,52 @@ const QuizzesStats: React.FC = () => {
-
+
{/* community stats */}
-
-
+
-
-
-
-
- {/* Data from Matomo, manually updated */}
- {formattedCollectiveAverageScore}
-
-
-
-
-
-
-
- {/* Data from Matomo, manually updated */}
-
- {formattedCollectiveQuestionsAnswered}
- +
-
-
-
-
-
-
-
-
- {/* Data from Matomo, manually updated */}
- {formattedCollectiveRetryRate}
-
+ {(
+ [
+ {
+ labelId: "average-score",
+ value: formattedCollectiveAverageScore,
+ },
+ {
+ labelId: "questions-answered",
+ value: formattedCollectiveQuestionsAnswered + "+",
+ },
+ {
+ labelId: "retry",
+ value: formattedCollectiveRetryRate,
+ },
+ ] satisfies Array<{ labelId: string; value: string }>
+ ).map(({ labelId, value }) => (
+
+
+
+
+ {/* Data from Matomo, manually updated */}
+ {value}
+
+ ))}
-
+
)
diff --git a/src/components/icons/Icons.stories.tsx b/src/components/icons/Icons.stories.tsx
index 5399aa3b8bb..b4778ec6e54 100644
--- a/src/components/icons/Icons.stories.tsx
+++ b/src/components/icons/Icons.stories.tsx
@@ -46,6 +46,7 @@ import {
EconomicalIcon,
EthpoolGlyphIcon,
GreenCheckProductGlyphIcon,
+ P2PGlyphIcon,
KilnGlyphIcon,
LidoGlyphIcon,
LiquidityTokenIcon,
@@ -132,6 +133,7 @@ const iconsDefinitions = [
EconomicalIcon,
EthpoolGlyphIcon,
GreenCheckProductGlyphIcon,
+ P2PGlyphIcon,
KilnGlyphIcon,
LidoGlyphIcon,
LiquidityTokenIcon,
diff --git a/src/components/icons/staking/P2PGlyphIcon.tsx b/src/components/icons/staking/P2PGlyphIcon.tsx
new file mode 100644
index 00000000000..0dc95ee497b
--- /dev/null
+++ b/src/components/icons/staking/P2PGlyphIcon.tsx
@@ -0,0 +1,28 @@
+import React from "react"
+import { createIcon } from "@chakra-ui/react"
+
+export const P2PGlyphIcon = createIcon({
+ displayName: "P2PGlyphIcon",
+ viewBox: "0 0 32 32",
+ defaultProps: {
+ width: "32px",
+ height: "32px",
+ fill: "currentColor",
+ },
+ path: [
+ ,
+ ,
+ ,
+ ,
+ ,
+ ,
+ ],
+})
diff --git a/src/components/icons/staking/index.ts b/src/components/icons/staking/index.ts
index 46757a5437e..ff206007319 100644
--- a/src/components/icons/staking/index.ts
+++ b/src/components/icons/staking/index.ts
@@ -12,6 +12,7 @@ export * from "./DockerGlyphIcon"
export * from "./EconomicalIcon"
export * from "./EthpoolGlyphIcon"
export * from "./GreenCheckProductGlyphIcon"
+export * from "./P2PGlyphIcon"
export * from "./KilnGlyphIcon"
export * from "./ChainLaboGlyphIcon"
export * from "./LaunchnodesGlyphIcon"
diff --git a/src/content/bridges/index.md b/src/content/bridges/index.md
index 7f6a5664ab4..7dd48d74df5 100644
--- a/src/content/bridges/index.md
+++ b/src/content/bridges/index.md
@@ -6,7 +6,7 @@ lang: en
# Blockchain bridges {#prerequisites}
-_Web3 has evolved into an ecosystem of L1 blockchains and L2 scaling solutions, each designed with unique capabilities and trade-offs. As the number of blockchains protocols increases, so does [the demand to move assets across chains](). To fulfill this demand, we need bridges._
+_Web3 has evolved into an ecosystem of L1 blockchains and L2 scaling solutions, each designed with unique capabilities and trade-offs. As the number of blockchain protocols increases, so does [the demand to move assets across chains](). To fulfill this demand, we need bridges._
diff --git a/src/content/community/get-involved/index.md b/src/content/community/get-involved/index.md
index 715e585a63f..465e4007eb1 100644
--- a/src/content/community/get-involved/index.md
+++ b/src/content/community/get-involved/index.md
@@ -29,7 +29,7 @@ Do you have a background in mathematics, cryptography, or economics? You might b
- Write an EIP
1. Submit your idea on [Ethereum Magicians](https://ethereum-magicians.org)
2. Read [EIP-1](https://eips.ethereum.org/EIPS/eip-1) - **Yes, that's the _entire_ document.**
- 3. Follow the directons in EIP-1. Reference it as you write your draft.
+ 3. Follow the directions in EIP-1. Reference it as you write your draft.
- Learn how to become an [EIP Editor](https://eips.ethereum.org/EIPS/eip-5069)
- You can peer-review EIPs right now! See [open PRs with the `e-review` tag](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Provide technical feedback on the `discussion-to` link.
- Participate in [EIP Governance](https://github.com/ethereum-cat-herders/EIPIP)
diff --git a/src/content/community/grants/index.md b/src/content/community/grants/index.md
index f8f710791b8..88a227b64ec 100644
--- a/src/content/community/grants/index.md
+++ b/src/content/community/grants/index.md
@@ -20,7 +20,7 @@ These programs support the broad Ethereum ecosystem by offering grants to a wide
- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _Google spreadsheet of organizations offering grants_
- [Crunchbase for Web3 Grants](https://www.cryptoneur.xyz/web3-grants) - _Filter and search for grants by category, use case, amount, and more. Contribute to help others find the right grant._
- [Academic Grants](https://esp.ethereum.foundation/academic-grants) - _Grants to support Ethereum-related academic work_
-- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - \_Blockworks has compiled a comprehensive directory of all grants, RFPs, and bug bounties.
+- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _Blockworks has compiled a comprehensive directory of all grants, RFPs, and bug bounties._
## Project specific {#project-specific}
diff --git a/src/content/community/research/index.md b/src/content/community/research/index.md
index b4e2796ec4a..42ae2fa0aa8 100644
--- a/src/content/community/research/index.md
+++ b/src/content/community/research/index.md
@@ -156,7 +156,7 @@ Sharding Ethereum's blockchain has long been part of the development roadmap. Ho
#### Recent research {#recent-research-5}
-- [ecdsa on FGPAs](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738)
+- [ecdsa on FPGAs](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738)
## Security {#security}
diff --git a/src/content/community/support/index.md b/src/content/community/support/index.md
index be97d664077..89882394c5a 100644
--- a/src/content/community/support/index.md
+++ b/src/content/community/support/index.md
@@ -39,7 +39,7 @@ Looking for an Ethereum wallet? [Explore our full list of Ethereum wallets](/wal
Building can be hard. Here are some development focused spaces with experienced Ethereum developers that are happy to help.
- [Alchemy University](https://university.alchemy.com/#starter_code)
-- [CryptoDevs discord](https://discord.gg/Z9TA39m8Yu)
+- [CryptoDevs discord](https://discord.com/invite/5W5tVb3)
- [Ethereum StackExchange](https://ethereum.stackexchange.com/)
- [StackOverflow](https://stackoverflow.com/questions/tagged/web3)
- [Web3 University](https://www.web3.university/)
diff --git a/src/content/contributing/adding-exchanges/index.md b/src/content/contributing/adding-exchanges/index.md
index d86402a793b..bf88d785930 100644
--- a/src/content/contributing/adding-exchanges/index.md
+++ b/src/content/contributing/adding-exchanges/index.md
@@ -20,7 +20,7 @@ Because of this context, we need some specific information when you suggest an e
## What we need {#what-we-need}
-- The geographical restrictions that apply to the exchange
+- The geographical restrictions that apply to the exchange. Geographic restrictions associated with the exchange should be detailed on a dedicated page or section of the exchange's website.
- The currencies users can use to buy ETH
- Proof that the exchange is a legitimate trading company
- Any additional information you might have – this might be information about the company like years of operation, financial backing etc.
diff --git a/src/content/contributing/translation-program/content-buckets/index.md b/src/content/contributing/translation-program/content-buckets/index.md
index 323055bc894..a672ffc2b24 100644
--- a/src/content/contributing/translation-program/content-buckets/index.md
+++ b/src/content/contributing/translation-program/content-buckets/index.md
@@ -45,8 +45,8 @@ Below is a breakdown of the website pages each content bucket contains.
- [Decentralized finance (DeFi)](/defi/)
- [Introduction to smart contracts](/smart-contracts/)
-- [Decentralized identity)](/decentralized-identity/)
-- [Decentralized social networks)](/social-networks/)
+- [Decentralized identity](/decentralized-identity/)
+- [Decentralized social networks](/social-networks/)
- [Decentralized science (DeSci))](/desci/)
## 6) Staking pages {#staking-pages}
diff --git a/src/content/contributing/translation-program/faq/index.md b/src/content/contributing/translation-program/faq/index.md
index b98fe5f8fef..dc08578442e 100644
--- a/src/content/contributing/translation-program/faq/index.md
+++ b/src/content/contributing/translation-program/faq/index.md
@@ -18,7 +18,7 @@ The goal of the Translation Program is to make Ethereum content accessible to ev
For this reason, the Translation Program is open and voluntary, and participation is not subject to compensation. If we were to compensate translators for the number of words they translate, we could only invite those with sufficient translation experience (professional translators) to join the Translation Program. This would make the Translation Program exclusionary and prevent us from reaching the outlined goals, specifically: allowing everyone to participate and get involved with the ecosystem.
-We make every effort to enable our contributors to succeed in the Ethereum ecosystem; many non-monteary incentives are in place such as: [offering POAPs](/contributing/translation-program/acknowledgements/#poap) and a [translator certificate](/contributing/translation-program/acknowledgements/#certificate), as well as organizing the [Translation Leaderboards](/contributing/translation-program/acknowledgements/) and [listing all of our translators on the site](/contributing/translation-program/contributors/).
+We make every effort to enable our contributors to succeed in the Ethereum ecosystem; many non-monetary incentives are in place such as: [offering POAPs](/contributing/translation-program/acknowledgements/#poap) and a [translator certificate](/contributing/translation-program/acknowledgements/#certificate), as well as organizing the [Translation Leaderboards](/contributing/translation-program/acknowledgements/) and [listing all of our translators on the site](/contributing/translation-program/contributors/).
## How do I translate strings with ``? {#tags}
diff --git a/src/content/contributing/translation-program/playbook/index.md b/src/content/contributing/translation-program/playbook/index.md
index ca742814ad7..9867675b09a 100644
--- a/src/content/contributing/translation-program/playbook/index.md
+++ b/src/content/contributing/translation-program/playbook/index.md
@@ -192,7 +192,7 @@ An example workflow in this case would be:
Read more about translation workflows:
-[Content rules on the five phrases of the translation workflow](https://contentrules.com/creating-translation-workflow/)
+[Content rules on the five phases of the translation workflow](https://contentrules.com/creating-translation-workflow/)
[Smartling on what is translation workflow management](https://www.smartling.com/resources/101/what-is-translation-workflow-management/)
diff --git a/src/content/developers/docs/evm/index.md b/src/content/developers/docs/evm/index.md
index 7be53944c9c..859ff205648 100644
--- a/src/content/developers/docs/evm/index.md
+++ b/src/content/developers/docs/evm/index.md
@@ -66,6 +66,7 @@ Over Ethereum's nine year history, the EVM has undergone several revisions, and
- [evmone](https://github.com/ethereum/evmone) - _C++_
- [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) - _JavaScript_
- [eEVM](https://github.com/microsoft/eevm) - _C++_
+- [revm](https://github.com/bluealloy/revm) - _Rust_
## Further Reading {#further-reading}
diff --git a/src/content/developers/docs/nodes-and-clients/run-a-node/index.md b/src/content/developers/docs/nodes-and-clients/run-a-node/index.md
index 5eccc3a013d..b973e4b8bc8 100644
--- a/src/content/developers/docs/nodes-and-clients/run-a-node/index.md
+++ b/src/content/developers/docs/nodes-and-clients/run-a-node/index.md
@@ -152,7 +152,7 @@ Here are the release pages of clients where you can find their pre-built binarie
##### Execution clients
- [Besu](https://github.com/hyperledger/besu/releases)
-- [Erigon](https://github.com/ledgerwatch/erigon#usage) (Doesn't provide a pre-built binary, has to be compiled)
+- [Erigon](https://github.com/ledgerwatch/erigon/releases)
- [Geth](https://geth.ethereum.org/downloads/)
- [Nethermind](https://downloads.nethermind.io/)
diff --git a/src/content/developers/docs/scaling/optimistic-rollups/index.md b/src/content/developers/docs/scaling/optimistic-rollups/index.md
index 692da4e98f9..3074a9e077a 100644
--- a/src/content/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/developers/docs/scaling/optimistic-rollups/index.md
@@ -260,6 +260,6 @@ Multiple implementations of Optimistic rollups exist that you can integrate into
- [How do optimistic rollups work (The Complete guide)](https://www.alchemy.com/overviews/optimistic-rollups)
- [Everything you need to know about Optimistic Rollup](https://research.paradigm.xyz/rollups)
- [The Essential Guide to Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [How does Optimism's Rollup really work?](https://research.paradigm.xyz/optimism)
+- [How does Optimism's Rollup really work?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
- [What is the Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine)
diff --git a/src/content/guides/how-to-create-an-ethereum-account/wallet-box.png b/src/content/guides/how-to-create-an-ethereum-account/wallet-box.png
index 5d9ce916467..e56fd136d4b 100644
Binary files a/src/content/guides/how-to-create-an-ethereum-account/wallet-box.png and b/src/content/guides/how-to-create-an-ethereum-account/wallet-box.png differ
diff --git a/src/content/translations/de/developers/docs/accounts/accounts.png b/src/content/translations/de/developers/docs/accounts/accounts.png
new file mode 100644
index 00000000000..75e00bb0368
Binary files /dev/null and b/src/content/translations/de/developers/docs/accounts/accounts.png differ
diff --git a/src/content/translations/de/developers/docs/blocks/tx-block.png b/src/content/translations/de/developers/docs/blocks/tx-block.png
new file mode 100644
index 00000000000..edaaf573586
Binary files /dev/null and b/src/content/translations/de/developers/docs/blocks/tx-block.png differ
diff --git a/src/content/translations/de/developers/docs/evm/evm.png b/src/content/translations/de/developers/docs/evm/evm.png
new file mode 100644
index 00000000000..8e3271e2e29
Binary files /dev/null and b/src/content/translations/de/developers/docs/evm/evm.png differ
diff --git a/src/content/translations/de/developers/docs/gas/gas.png b/src/content/translations/de/developers/docs/gas/gas.png
new file mode 100644
index 00000000000..93e6ead39a0
Binary files /dev/null and b/src/content/translations/de/developers/docs/gas/gas.png differ
diff --git a/src/content/translations/de/developers/docs/nodes-and-clients/eth1eth2client.png b/src/content/translations/de/developers/docs/nodes-and-clients/eth1eth2client.png
new file mode 100644
index 00000000000..205f636b3a2
Binary files /dev/null and b/src/content/translations/de/developers/docs/nodes-and-clients/eth1eth2client.png differ
diff --git a/src/content/translations/de/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png b/src/content/translations/de/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png
new file mode 100644
index 00000000000..f658f984dd6
Binary files /dev/null and b/src/content/translations/de/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png differ
diff --git a/src/content/translations/de/developers/docs/nodes-and-clients/nodes.png b/src/content/translations/de/developers/docs/nodes-and-clients/nodes.png
new file mode 100644
index 00000000000..db2aa64bb0d
Binary files /dev/null and b/src/content/translations/de/developers/docs/nodes-and-clients/nodes.png differ
diff --git a/src/content/translations/de/developers/docs/nodes-and-clients/run-a-node/diagram.png b/src/content/translations/de/developers/docs/nodes-and-clients/run-a-node/diagram.png
new file mode 100644
index 00000000000..a220c3a5b44
Binary files /dev/null and b/src/content/translations/de/developers/docs/nodes-and-clients/run-a-node/diagram.png differ
diff --git a/src/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md
index 24e97bf7586..a5f937af37a 100644
--- a/src/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md
@@ -53,5 +53,5 @@ Es gibt mehrere Implementierungen von optimistischen Rollups, die Sie in Ihre dA
- [Alles, was Sie über Optimistic Rollup wissen müssen](https://research.paradigm.xyz/rollups)
- [Der Leitfaden zu Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Wie funktioniert das Rollup von Optimismus wirklich?](https://research.paradigm.xyz/optimism)
+- [Wie funktioniert das Rollup von Optimismus wirklich?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
diff --git a/src/content/translations/de/developers/docs/transactions/gas-tx.png b/src/content/translations/de/developers/docs/transactions/gas-tx.png
new file mode 100644
index 00000000000..c240e65ab7a
Binary files /dev/null and b/src/content/translations/de/developers/docs/transactions/gas-tx.png differ
diff --git a/src/content/translations/de/developers/docs/transactions/tx.png b/src/content/translations/de/developers/docs/transactions/tx.png
new file mode 100644
index 00000000000..ba6bbd3abf8
Binary files /dev/null and b/src/content/translations/de/developers/docs/transactions/tx.png differ
diff --git a/src/content/translations/de/energy-consumption/energy_consumption_pre_post_merge.png b/src/content/translations/de/energy-consumption/energy_consumption_pre_post_merge.png
new file mode 100644
index 00000000000..4d24a4e3cff
Binary files /dev/null and b/src/content/translations/de/energy-consumption/energy_consumption_pre_post_merge.png differ
diff --git a/src/content/translations/de/web3/web2.png b/src/content/translations/de/web3/web2.png
new file mode 100644
index 00000000000..6c11d933018
Binary files /dev/null and b/src/content/translations/de/web3/web2.png differ
diff --git a/src/content/translations/de/web3/web3.png b/src/content/translations/de/web3/web3.png
new file mode 100644
index 00000000000..6a39613dc95
Binary files /dev/null and b/src/content/translations/de/web3/web3.png differ
diff --git a/src/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md
index dec6b38bb2a..1088f1ee345 100644
--- a/src/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/es/developers/docs/scaling/optimistic-rollups/index.md
@@ -53,5 +53,5 @@ Existen múltiples implementaciones de rollups optimistas que puede integrar en
- [Todo lo que debes saber sobre Optimistic rollup](https://research.paradigm.xyz/rollups)
- [Guía esencial sobre Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [¿Cómo funciona realmente el rollup de Optimism?](https://research.paradigm.xyz/optimism)
+- [¿Cómo funciona realmente el rollup de Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [Análisis detallado de OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
diff --git a/src/content/translations/fa/developers/docs/accounts/accounts.png b/src/content/translations/fa/developers/docs/accounts/accounts.png
new file mode 100644
index 00000000000..6ccb76911d1
Binary files /dev/null and b/src/content/translations/fa/developers/docs/accounts/accounts.png differ
diff --git a/src/content/translations/fa/developers/docs/blocks/tx-block.png b/src/content/translations/fa/developers/docs/blocks/tx-block.png
new file mode 100644
index 00000000000..18ca975ebfe
Binary files /dev/null and b/src/content/translations/fa/developers/docs/blocks/tx-block.png differ
diff --git a/src/content/translations/fa/developers/docs/evm/evm.png b/src/content/translations/fa/developers/docs/evm/evm.png
new file mode 100644
index 00000000000..dd2ef30f1ce
Binary files /dev/null and b/src/content/translations/fa/developers/docs/evm/evm.png differ
diff --git a/src/content/translations/fa/developers/docs/gas/gas.png b/src/content/translations/fa/developers/docs/gas/gas.png
new file mode 100644
index 00000000000..63e12d54287
Binary files /dev/null and b/src/content/translations/fa/developers/docs/gas/gas.png differ
diff --git a/src/content/translations/fa/developers/docs/transactions/gas-tx.png b/src/content/translations/fa/developers/docs/transactions/gas-tx.png
new file mode 100644
index 00000000000..6a5ca117e8f
Binary files /dev/null and b/src/content/translations/fa/developers/docs/transactions/gas-tx.png differ
diff --git a/src/content/translations/fa/developers/docs/transactions/tx.png b/src/content/translations/fa/developers/docs/transactions/tx.png
new file mode 100644
index 00000000000..3c5f3bc2e0a
Binary files /dev/null and b/src/content/translations/fa/developers/docs/transactions/tx.png differ
diff --git a/src/content/translations/fa/energy-consumption/energy_consumption_pre_post_merge.png b/src/content/translations/fa/energy-consumption/energy_consumption_pre_post_merge.png
new file mode 100644
index 00000000000..81382b9b08a
Binary files /dev/null and b/src/content/translations/fa/energy-consumption/energy_consumption_pre_post_merge.png differ
diff --git a/src/content/translations/fa/energy-consumption/index.md b/src/content/translations/fa/energy-consumption/index.md
index 7a32dfd18d9..7f6fb0c2519 100644
--- a/src/content/translations/fa/energy-consumption/index.md
+++ b/src/content/translations/fa/energy-consumption/index.md
@@ -34,7 +34,7 @@ lang: fa
زنجیرهی بیکن در کنار اعتمادسازی برای مکانیزم اثبات مالکیت سهام، تخمینی از میزان مصرف انرژی اتریوم پس از ادغام نیز در اختیار ما قرار میدهد. [تخمینی جدید](https://blog.ethereum.org/2021/05/18/country-power-no-more/) پیشنهاد میدهد که ادغام به اثبات مالکیت سهام میتواند 99.95% میزان مصرف انرژی را کاهش دهد و اثبات مالکیت سهام از نظر مصرف انرژی بیش از 2000 برابر نسبت به اثبات کار بهصرفهتر است. مصرف انرژی اتریوم برای هر گره روی شبکه تقریباً برابر با مصرف انرژی یک کامپیوتر خانگی خواهد بود.
-
+
تخمین مصرف انرژی اثبات کار برای هر تراکنش در زمان نوشتن این متن بر مبنای دادههای مه 2021 برابر با 175.54 کیلووات در ساعت است
diff --git a/src/content/translations/fa/web3/web2.png b/src/content/translations/fa/web3/web2.png
new file mode 100644
index 00000000000..b553e3f75be
Binary files /dev/null and b/src/content/translations/fa/web3/web2.png differ
diff --git a/src/content/translations/fa/web3/web3.png b/src/content/translations/fa/web3/web3.png
new file mode 100644
index 00000000000..dc4b5dd159c
Binary files /dev/null and b/src/content/translations/fa/web3/web3.png differ
diff --git a/src/content/translations/fil/energy-consumption/energy_consumption_pre_post_merge.png b/src/content/translations/fil/energy-consumption/energy_consumption_pre_post_merge.png
new file mode 100644
index 00000000000..e6bf50694aa
Binary files /dev/null and b/src/content/translations/fil/energy-consumption/energy_consumption_pre_post_merge.png differ
diff --git a/src/content/translations/fil/web3/web2.png b/src/content/translations/fil/web3/web2.png
new file mode 100644
index 00000000000..4bdf9a2681f
Binary files /dev/null and b/src/content/translations/fil/web3/web2.png differ
diff --git a/src/content/translations/fil/web3/web3.png b/src/content/translations/fil/web3/web3.png
new file mode 100644
index 00000000000..3f9d10b4c89
Binary files /dev/null and b/src/content/translations/fil/web3/web3.png differ
diff --git a/src/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md
index 55930bf23cc..da2d83fb6e2 100644
--- a/src/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/fr/developers/docs/scaling/optimistic-rollups/index.md
@@ -260,6 +260,6 @@ Plusieurs implémentations de rollups optimistes existent, que vous pouvez inté
- [Comment fonctionnent les rollups optimistes (Le guide complet)](https://www.alchemy.com/overviews/optimistic-rollups)
- [Tout ce que vous devez savoir sur les rollups optimisés](https://research.paradigm.xyz/rollups)
- [Le guide essentiel pour Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Comment fonctionne réellement le rollup d'Optimism ?](https://research.paradigm.xyz/optimism)
+- [Comment fonctionne réellement le rollup d'Optimism ?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
- [Qu’est-ce que la machine virtuelle optimiste ?](https://www.alchemy.com/overviews/optimistic-virtual-machine)
diff --git a/src/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md b/src/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md
index 6fb6f1a8347..94aa4c26a03 100644
--- a/src/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md
+++ b/src/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md
@@ -143,7 +143,7 @@ Solusi hibrida ada dengan menggabungkan bagian terbaik dari berbagai teknologi l
- [Semua yang perlu Anda ketahui tentang Rollup Optimistic](https://research.paradigm.xyz/rollups)
- [Panduan Penting untuk Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Bagaimana Rollup Optimism benar-benar berfungsi?](https://research.paradigm.xyz/optimism)
+- [Bagaimana Rollup Optimism benar-benar berfungsi?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
**Solusi Hibrida**
diff --git a/src/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md
index 58e370a55b5..78c4f4b7ae3 100644
--- a/src/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md
@@ -260,6 +260,6 @@ Esistono molteplici implementazioni dei rollup ottimistici, che puoi integrare n
- [Come funzionano gli Optimistic Rollup (La guida completa)](https://www.alchemy.com/overviews/optimistic-rollups)
- [Everything you need to know about Optimistic Rollup](https://research.paradigm.xyz/rollups)
- [Guida essenziale ad Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Come funziona davvero il rollup di Optimism?](https://research.paradigm.xyz/optimism)
+- [Come funziona davvero il rollup di Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [Approfondimento su OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
- [What is the Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine)
diff --git a/src/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md
index 5021f079ddc..79da0a5be35 100644
--- a/src/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md
@@ -260,6 +260,6 @@ Dapp に統合可能な、既存のオプティミスティック・ロールア
- [オプティミスティック・ロールアップの仕組み(完全ガイド)](https://www.alchemy.com/overviews/optimistic-rollups)
- [オプティミスティック・ロールアップについて必要なすべての知識](https://research.paradigm.xyz/rollups)
- [Arbitrum の基本ガイド](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Optimism のロールアップはどのように機能するのか?](https://research.paradigm.xyz/optimism)
+- [Optimism のロールアップはどのように機能するのか?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [OVM の詳細を学ぶ](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
- [オプティミスティック仮想マシンとは何か?](https://www.alchemy.com/overviews/optimistic-virtual-machine)
diff --git a/src/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md b/src/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md
index 5c424d0f8e8..32ac3b95d60 100644
--- a/src/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md
+++ b/src/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md
@@ -126,7 +126,7 @@ Istnieją rozwiązania hybrydowe, które łączą w sobie najlepsze elementy wie
- [Wszystko, co musisz wiedzieć o optymistycznym pakiecie zbiorczym](https://research.paradigm.xyz/rollups)
- [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
-- [Jak faktycznie działa pakiet zbiorczy Optimism?](https://research.paradigm.xyz/optimism)
+- [Jak faktycznie działa pakiet zbiorczy Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
**Rozwiązania hybrydowe**
diff --git a/src/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md
index 9fe497d3a2c..7e03809f057 100644
--- a/src/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md
@@ -260,6 +260,6 @@ Há múltiplas implementações de optimistic rollups que você pode integrar ao
- [Como funcionam os optimistic rollups (o guia completo)](https://www.alchemy.com/overviews/optimistic-rollups)
- [Tudo o que você precisa saber sobre otimistic rollup](https://research.paradigm.xyz/rollups)
- [O guia essencial do Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Como o optimistic rollup realmente funciona?](https://research.paradigm.xyz/optimism)
+- [Como o optimistic rollup realmente funciona?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [OVM: aprofundamento](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
- [O que é a máquina virtual otimista?](https://www.alchemy.com/overviews/optimistic-virtual-machine)
diff --git a/src/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md
index 9a54b5c0a3d..53d5456d86e 100644
--- a/src/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/ro/developers/docs/scaling/optimistic-rollups/index.md
@@ -51,5 +51,5 @@ Există mai multe implementări ale rollup-urilor Optimistic pe care le puteți
- [Tot ce trebuie să știți despre Rollup-ul Optimistic](https://research.paradigm.xyz/rollups)
- [Ghidul esențial pentru Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Cum funcționează cu adevărat Rollup-ul Optimistic?](https://research.paradigm.xyz/optimism)
+- [Cum funcționează cu adevărat Rollup-ul Optimistic?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
diff --git a/src/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md
index 5889d345c4e..5eff8b3021e 100644
--- a/src/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/sl/developers/docs/scaling/optimistic-rollups/index.md
@@ -53,5 +53,5 @@ Obstaja več implementacij optimističnih zvitkov, ki jih lahko integrirate v sv
- [Vse kar morate vedeti o Optimističnih zvitkih](https://research.paradigm.xyz/rollups)
- [Ključni vodnik za Arbitrum](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Kako zares deluje zvitek Optimizma?](https://research.paradigm.xyz/optimism)
+- [Kako zares deluje zvitek Optimizma?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [Globoki vpogled v OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
diff --git a/src/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md
index 94d6c857e18..2dc5f93299a 100644
--- a/src/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md
@@ -53,5 +53,5 @@ Dapp'lerinize entegre edebileceğiniz birden çok İyimser toplama uygulaması m
- [Optimistik Toplama hakkında bilmeniz gereken her şey](https://research.paradigm.xyz/rollups)
- [Temel Arbitrum Rehberi](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [Optimism'in Toplaması aslında nasıl çalışıyor?](https://research.paradigm.xyz/optimism)
+- [Optimism'in Toplaması aslında nasıl çalışıyor?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
diff --git a/src/content/translations/zh-tw/developers/docs/accounts/accounts.png b/src/content/translations/zh-tw/developers/docs/accounts/accounts.png
new file mode 100644
index 00000000000..d34d9fc0d5e
Binary files /dev/null and b/src/content/translations/zh-tw/developers/docs/accounts/accounts.png differ
diff --git a/src/content/translations/zh-tw/developers/docs/blocks/tx-block.png b/src/content/translations/zh-tw/developers/docs/blocks/tx-block.png
new file mode 100644
index 00000000000..c3a3049b287
Binary files /dev/null and b/src/content/translations/zh-tw/developers/docs/blocks/tx-block.png differ
diff --git a/src/content/translations/zh-tw/developers/docs/evm/evm.png b/src/content/translations/zh-tw/developers/docs/evm/evm.png
new file mode 100644
index 00000000000..f219bd393c6
Binary files /dev/null and b/src/content/translations/zh-tw/developers/docs/evm/evm.png differ
diff --git a/src/content/translations/zh-tw/developers/docs/gas/gas.png b/src/content/translations/zh-tw/developers/docs/gas/gas.png
new file mode 100644
index 00000000000..3fb52626335
Binary files /dev/null and b/src/content/translations/zh-tw/developers/docs/gas/gas.png differ
diff --git a/src/content/translations/zh-tw/developers/docs/transactions/gas-tx.png b/src/content/translations/zh-tw/developers/docs/transactions/gas-tx.png
new file mode 100644
index 00000000000..5142e225041
Binary files /dev/null and b/src/content/translations/zh-tw/developers/docs/transactions/gas-tx.png differ
diff --git a/src/content/translations/zh-tw/developers/docs/transactions/tx.png b/src/content/translations/zh-tw/developers/docs/transactions/tx.png
new file mode 100644
index 00000000000..5bcc326ac44
Binary files /dev/null and b/src/content/translations/zh-tw/developers/docs/transactions/tx.png differ
diff --git a/src/content/translations/zh-tw/energy-consumption/energy_consumption_pre_post_merge.png b/src/content/translations/zh-tw/energy-consumption/energy_consumption_pre_post_merge.png
new file mode 100644
index 00000000000..87d03943010
Binary files /dev/null and b/src/content/translations/zh-tw/energy-consumption/energy_consumption_pre_post_merge.png differ
diff --git a/src/content/translations/zh-tw/web3/web2.png b/src/content/translations/zh-tw/web3/web2.png
new file mode 100644
index 00000000000..74c124b3c0e
Binary files /dev/null and b/src/content/translations/zh-tw/web3/web2.png differ
diff --git a/src/content/translations/zh-tw/web3/web3.png b/src/content/translations/zh-tw/web3/web3.png
new file mode 100644
index 00000000000..3c37211d03b
Binary files /dev/null and b/src/content/translations/zh-tw/web3/web3.png differ
diff --git a/src/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md b/src/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md
index 2ee58a4b577..35c8e4fae69 100644
--- a/src/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md
+++ b/src/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md
@@ -260,6 +260,6 @@ ii. 使用乐观卷叠的开发者和项目团队可以利用以太坊的基础
- [乐观卷叠如何工作(完整指南)](https://www.alchemy.com/overviews/optimistic-rollups)
- [乐观卷叠知识大全](https://research.paradigm.xyz/rollups)
- [Arbitrum 基本指南](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum)
-- [乐观卷叠究竟如何工作?](https://research.paradigm.xyz/optimism)
+- [乐观卷叠究竟如何工作?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work)
- [深入研究乐观虚拟机](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
- [什么是乐观虚拟机?](https://www.alchemy.com/overviews/optimistic-virtual-machine)
diff --git a/src/data/crowdin/combined-translators.json b/src/data/crowdin/combined-translators.json
index 1ca68238a48..68b814001bf 100644
--- a/src/data/crowdin/combined-translators.json
+++ b/src/data/crowdin/combined-translators.json
@@ -382,6 +382,12 @@
"totalCosts": 742.35,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787370/medium/9bb8a2d0d244e04f14b523e895b08100.jpg"
},
+ {
+ "id": 15804803,
+ "username": "sun_dariia",
+ "totalCosts": 32.32,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15804803/medium/e753b43a4cf480cd2a37c5795cdb83ba_default.png"
+ },
{
"id": 15904933,
"username": "Zumrud.I",
@@ -1111,18 +1117,18 @@
"totalCosts": 364.61,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15371878/medium/162454f1968a82ecbaceb7915709fe37_default.png"
},
+ {
+ "id": 15123193,
+ "username": "Coram_Deo",
+ "totalCosts": 14.14,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
+ },
{
"id": 15505160,
"username": "Niggl",
"totalCosts": 14.14,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15505160/medium/2af7b18903926af188f79fc706ba7610.png"
},
- {
- "id": 15123193,
- "username": "Coram_Deo",
- "totalCosts": 7.07,
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
- },
{
"id": 15469846,
"username": "VVS1",
@@ -1172,7 +1178,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 38.38,
+ "totalCosts": 58.58,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -1601,7 +1607,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 16.16,
+ "totalCosts": 72.72,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -2330,7 +2336,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 68.68,
+ "totalCosts": 69.69,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -3470,7 +3476,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 48.48,
+ "totalCosts": 91.91,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -3952,7 +3958,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 126.25,
+ "totalCosts": 153.52,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -4663,7 +4669,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 29.29,
+ "totalCosts": 36.36,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -4763,6 +4769,12 @@
"username": "Astronaut828",
"totalCosts": 30.3,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932515/medium/c41b45c87a237615839b37bfa2118e8b.jpeg"
+ },
+ {
+ "id": 15123193,
+ "username": "Coram_Deo",
+ "totalCosts": 25.25,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
}
]
},
@@ -4804,6 +4816,12 @@
"totalCosts": 646.4,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15947755/medium/cf9980cfafab6b7c43f6e16e1ca48324_default.png"
},
+ {
+ "id": 15123193,
+ "username": "Coram_Deo",
+ "totalCosts": 32.32,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
+ },
{
"id": 14952363,
"username": "ensingerphilipp",
@@ -4827,12 +4845,6 @@
"username": "SebastianSupreme",
"totalCosts": 3.03,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15455500/medium/529d1b028e7c3d98b67d4008773a75a9.png"
- },
- {
- "id": 15123193,
- "username": "Coram_Deo",
- "totalCosts": 0,
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
}
]
},
@@ -4866,7 +4878,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 17.17,
+ "totalCosts": 25.25,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -4918,7 +4930,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 1706.9,
+ "totalCosts": 1752.35,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -4982,7 +4994,7 @@
{
"id": 15123193,
"username": "Coram_Deo",
- "totalCosts": 1920.01,
+ "totalCosts": 1955.36,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
},
{
@@ -5029,6 +5041,12 @@
"username": "Astronaut828",
"totalCosts": 1113.02,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932515/medium/c41b45c87a237615839b37bfa2118e8b.jpeg"
+ },
+ {
+ "id": 15123193,
+ "username": "Coram_Deo",
+ "totalCosts": 18.18,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
}
]
},
@@ -5136,6 +5154,12 @@
"username": "johannt",
"totalCosts": 2021.01,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15421538/medium/7e1f5d90509951072c0de0d9684baa35.png"
+ },
+ {
+ "id": 15123193,
+ "username": "Coram_Deo",
+ "totalCosts": 20.2,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg"
}
]
},
@@ -6281,6 +6305,12 @@
"totalCosts": 34.34,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png"
},
+ {
+ "id": 15553253,
+ "username": "EmelyGarcia",
+ "totalCosts": 32.32,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png"
+ },
{
"id": 15655799,
"username": "Pipeguzman0000",
@@ -6586,11 +6616,23 @@
"totalCosts": 97.97,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564238/medium/e6feebc5a27754079a07907fffac8389.jpg"
},
+ {
+ "id": 16028920,
+ "username": "paopastorelli",
+ "totalCosts": 38.38,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16028920/medium/e3049f379e035388449ee79ea5b75888.jpeg"
+ },
{
"id": 15874711,
"username": "JHON38",
"totalCosts": 19.19,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15874711/medium/aa1137d9b988c12e00d7510a93e05dd8_default.png"
+ },
+ {
+ "id": 15553253,
+ "username": "EmelyGarcia",
+ "totalCosts": 2.02,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png"
}
]
},
@@ -6903,18 +6945,18 @@
"totalCosts": 432.28,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522923/medium/539a9115b9d375bde4eb4bc0fc37995c.png"
},
+ {
+ "id": 15553253,
+ "username": "EmelyGarcia",
+ "totalCosts": 60.6,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png"
+ },
{
"id": 15966607,
"username": "Hackedd.eth",
"totalCosts": 59.59,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966607/medium/233013bfe6b35fd53264071d722f63f1.png"
},
- {
- "id": 15553253,
- "username": "EmelyGarcia",
- "totalCosts": 59.59,
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png"
- },
{
"id": 15967747,
"username": "fernandostds9",
@@ -7075,6 +7117,12 @@
"totalCosts": 18.18,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15474196/medium/7d0c8d1b9a3745f3d1dbfaec3ab9e4a2.jpeg"
},
+ {
+ "id": 15553253,
+ "username": "EmelyGarcia",
+ "totalCosts": 16.16,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png"
+ },
{
"id": 15967747,
"username": "fernandostds9",
@@ -9125,6 +9173,12 @@
"totalCosts": 223.21,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15287132/medium/67c5a079a19f5b0cd46f8d628cff446d.png"
},
+ {
+ "id": 16040604,
+ "username": "CeciSakura",
+ "totalCosts": 157.56,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16040604/medium/46704125c8bb6dee2677db6eeaf8e80f.jpg"
+ },
{
"id": 15714091,
"username": "Karym_GG",
@@ -12287,6 +12341,12 @@
"username": "Alifarhani",
"totalCosts": 9.09,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg"
+ },
+ {
+ "id": 16069662,
+ "username": "Ruholla",
+ "totalCosts": 4.04,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16069662/medium/a637cb4df4ce9d016e7d76cc935b0a95_default.png"
}
]
},
@@ -13776,7 +13836,7 @@
{
"id": 15954931,
"username": "XofEE",
- "totalCosts": 1011.01,
+ "totalCosts": 1199.88,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png"
},
{
@@ -14942,6 +15002,12 @@
{
"fileId": "2778",
"contributors": [
+ {
+ "id": 15954931,
+ "username": "XofEE",
+ "totalCosts": 362.59,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png"
+ },
{
"id": 15528915,
"username": "J4yD3v",
@@ -15137,6 +15203,12 @@
"totalCosts": 2297.75,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15624473/medium/7790c08f2ef4a5ba028091b6393900be_default.png"
},
+ {
+ "id": 15954931,
+ "username": "XofEE",
+ "totalCosts": 1056.46,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png"
+ },
{
"id": 15683863,
"username": "zeyadoun12",
@@ -19362,6 +19434,260 @@
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15949345/medium/2eb9da6ad8eb6399c9aff2b21957916d.png"
}
]
+ },
+ {
+ "fileId": "7597",
+ "contributors": [
+ {
+ "id": 15954931,
+ "username": "XofEE",
+ "totalCosts": 123.22,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png"
+ }
+ ]
+ },
+ {
+ "fileId": "7525",
+ "contributors": [
+ {
+ "id": 14823260,
+ "username": "omahs",
+ "totalCosts": 296.94,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg"
+ },
+ {
+ "id": 15914449,
+ "username": "CoinHoodie",
+ "totalCosts": 286.84,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15914449/medium/8d2590e4c534ca5125f1d70b6d9c71cc.jpeg"
+ },
+ {
+ "id": 14499538,
+ "username": "nodhaiby",
+ "totalCosts": 125.24,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14499538/medium/b4afe4954488f1cbb0ff50dfdb2d97ae_default.png"
+ },
+ {
+ "id": 15795465,
+ "username": "Alex-fr",
+ "totalCosts": 123.22,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15795465/medium/10a5ef3ef5a492fd883eb55c239db5b3.jpeg"
+ },
+ {
+ "id": 15838213,
+ "username": "marjorie83",
+ "totalCosts": 78.78,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15838213/medium/06f6e246d0a81d73663b644838d0cde9.jpeg"
+ },
+ {
+ "id": 15816391,
+ "username": "Irvin_",
+ "totalCosts": 20.2,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15816391/medium/81fbadbb674cd22d4c0824d77586d1b1.png"
+ },
+ {
+ "id": 15730243,
+ "username": "louisfelixg",
+ "totalCosts": 14.14,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15730243/medium/9056c95317b5bc74f571e423f7251e0a_default.png"
+ },
+ {
+ "id": 15954931,
+ "username": "XofEE",
+ "totalCosts": 7.07,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png"
+ },
+ {
+ "id": 15318490,
+ "username": "arthursw",
+ "totalCosts": 6.06,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15318490/medium/673173431aeb53f29ca5516e9aa87bec_default.png"
+ }
+ ]
+ },
+ {
+ "fileId": "8027",
+ "contributors": [
+ {
+ "id": 14823260,
+ "username": "omahs",
+ "totalCosts": 926.17,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg"
+ },
+ {
+ "id": 15973859,
+ "username": "vblackwhale",
+ "totalCosts": 144.43,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15973859/medium/e81a181b32492c70a65c85400d6f2e35.jpg"
+ }
+ ]
+ },
+ {
+ "fileId": "7529",
+ "contributors": [
+ {
+ "id": 15795465,
+ "username": "Alex-fr",
+ "totalCosts": 623.17,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15795465/medium/10a5ef3ef5a492fd883eb55c239db5b3.jpeg"
+ },
+ {
+ "id": 15838213,
+ "username": "marjorie83",
+ "totalCosts": 58.58,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15838213/medium/06f6e246d0a81d73663b644838d0cde9.jpeg"
+ }
+ ]
+ },
+ {
+ "fileId": "7533",
+ "contributors": [
+ {
+ "id": 15795465,
+ "username": "Alex-fr",
+ "totalCosts": 267.65,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15795465/medium/10a5ef3ef5a492fd883eb55c239db5b3.jpeg"
+ },
+ {
+ "id": 15949345,
+ "username": "mehdibouzit",
+ "totalCosts": 38.38,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15949345/medium/2eb9da6ad8eb6399c9aff2b21957916d.png"
+ }
+ ]
+ },
+ {
+ "fileId": "7537",
+ "contributors": [
+ {
+ "id": 15966553,
+ "username": "bamcryptobam1",
+ "totalCosts": 211.09,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966553/medium/7fde8cf7f30af6c46453e25bbf5aa342.png"
+ },
+ {
+ "id": 15859719,
+ "username": "ilies-bel",
+ "totalCosts": 109.08,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15859719/medium/8a49812209a978d4e24ca6cf26777320.png"
+ },
+ {
+ "id": 15961437,
+ "username": "harpocryptes",
+ "totalCosts": 36.36,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15961437/medium/d495096dfb14721b3d4848a1bc7cfdd5.jpeg"
+ },
+ {
+ "id": 15752987,
+ "username": "eleashadock",
+ "totalCosts": 15.15,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15752987/medium/4e31f79c3a4f97d4b7b2f45ae5c4b5ad.png"
+ }
+ ]
+ },
+ {
+ "fileId": "7541",
+ "contributors": [
+ {
+ "id": 13997701,
+ "username": "i8008",
+ "totalCosts": 567.62,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13997701/medium/28a51e6f02f22b60225457043b3a8f6b.png"
+ },
+ {
+ "id": 15914449,
+ "username": "CoinHoodie",
+ "totalCosts": 127.26,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15914449/medium/8d2590e4c534ca5125f1d70b6d9c71cc.jpeg"
+ },
+ {
+ "id": 15954931,
+ "username": "XofEE",
+ "totalCosts": 25.25,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png"
+ },
+ {
+ "id": 15730243,
+ "username": "louisfelixg",
+ "totalCosts": 13.13,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15730243/medium/9056c95317b5bc74f571e423f7251e0a_default.png"
+ }
+ ]
+ },
+ {
+ "fileId": "7521",
+ "contributors": [
+ {
+ "id": 15954931,
+ "username": "XofEE",
+ "totalCosts": 168.67,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png"
+ },
+ {
+ "id": 15961437,
+ "username": "harpocryptes",
+ "totalCosts": 18.18,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15961437/medium/d495096dfb14721b3d4848a1bc7cfdd5.jpeg"
+ }
+ ]
+ },
+ {
+ "fileId": "8035",
+ "contributors": [
+ {
+ "id": 14823260,
+ "username": "omahs",
+ "totalCosts": 912.03,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg"
+ },
+ {
+ "id": 17361,
+ "username": "plamarque",
+ "totalCosts": 282.8,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/17361/medium/fecfafa7716ac9d6838b43c31f48f6b9.png"
+ }
+ ]
+ },
+ {
+ "fileId": "7919",
+ "contributors": [
+ {
+ "id": 15914449,
+ "username": "CoinHoodie",
+ "totalCosts": 1308.96,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15914449/medium/8d2590e4c534ca5125f1d70b6d9c71cc.jpeg"
+ },
+ {
+ "id": 17361,
+ "username": "plamarque",
+ "totalCosts": 37.37,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/17361/medium/fecfafa7716ac9d6838b43c31f48f6b9.png"
+ },
+ {
+ "id": 15949813,
+ "username": "massmr",
+ "totalCosts": 31.31,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15949813/medium/523c73497ca4fc2d5d83c8c54f0123b1_default.png"
+ },
+ {
+ "id": 14823260,
+ "username": "omahs",
+ "totalCosts": 21.21,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg"
+ },
+ {
+ "id": 15944249,
+ "username": "ANOKEY",
+ "totalCosts": 17.17,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15944249/medium/5bcfd0e2c58b676f2709481d9f4308ef_default.png"
+ },
+ {
+ "id": 15430214,
+ "username": "didierkrux",
+ "totalCosts": 5.05,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430214/medium/2b8391bf50f94b404bcd2967c0528ed7.png"
+ }
+ ]
}
]
},
@@ -20621,6 +20947,12 @@
"username": "RahayuRafika_12",
"totalCosts": 12.12,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861756/medium/68ce2b760b107d1cf2a5a1508aa8ee96.jpeg"
+ },
+ {
+ "id": 14708760,
+ "username": "hypebeans",
+ "totalCosts": 11.11,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/f039dc85a8469b65d9e3e2413f9c4710.png"
}
]
},
@@ -23424,6 +23756,12 @@
"totalCosts": 89.89,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15526713/medium/a65fab62bbc032697e4d12599f864085.jpeg"
},
+ {
+ "id": 14708760,
+ "username": "hypebeans",
+ "totalCosts": 35.35,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/f039dc85a8469b65d9e3e2413f9c4710.png"
+ },
{
"id": 15762357,
"username": "HA22",
@@ -23684,6 +24022,12 @@
"username": "RahayuRafika_12",
"totalCosts": 81.81,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861756/medium/68ce2b760b107d1cf2a5a1508aa8ee96.jpeg"
+ },
+ {
+ "id": 14708760,
+ "username": "hypebeans",
+ "totalCosts": 11.11,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/f039dc85a8469b65d9e3e2413f9c4710.png"
}
]
},
@@ -23762,6 +24106,12 @@
"username": "fuji.anggara10",
"totalCosts": 732.25,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15934037/medium/e913f10d6d3550452e0b7c072e15aa40.jpeg"
+ },
+ {
+ "id": 14708760,
+ "username": "hypebeans",
+ "totalCosts": 25.25,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/f039dc85a8469b65d9e3e2413f9c4710.png"
}
]
},
@@ -31181,6 +31531,12 @@
{
"fileId": "2804",
"contributors": [
+ {
+ "id": 15208868,
+ "username": "HiroyukiNaito",
+ "totalCosts": 939.3,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg"
+ },
{
"id": 15680077,
"username": "miyamo",
@@ -31192,12 +31548,6 @@
"username": "sekisanchi",
"totalCosts": 4.04,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14880458/medium/6b71180a926d6213e33b21e50df8e409_default.png"
- },
- {
- "id": 15208868,
- "username": "HiroyukiNaito",
- "totalCosts": 0,
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg"
}
]
},
@@ -34219,6 +34569,46 @@
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg"
}
]
+ },
+ {
+ "fileId": "7461",
+ "contributors": [
+ {
+ "id": 15750423,
+ "username": "less_explorer",
+ "totalCosts": 1000.91,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15750423/medium/44085a2751d1f337f4e4aee5459b2ccf.jpg"
+ },
+ {
+ "id": 15958911,
+ "username": "charlaiz",
+ "totalCosts": 453.49,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15958911/medium/8f11adb77af544d9fd33ec842e035832_default.png"
+ },
+ {
+ "id": 15084373,
+ "username": "tarcanhursit",
+ "totalCosts": 225.23,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg"
+ }
+ ]
+ },
+ {
+ "fileId": "8035",
+ "contributors": [
+ {
+ "id": 15958911,
+ "username": "charlaiz",
+ "totalCosts": 1190.79,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15958911/medium/8f11adb77af544d9fd33ec842e035832_default.png"
+ },
+ {
+ "id": 15084373,
+ "username": "tarcanhursit",
+ "totalCosts": 4.04,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg"
+ }
+ ]
}
]
},
@@ -35935,18 +36325,18 @@
{
"fileId": "2958",
"contributors": [
+ {
+ "id": 15894449,
+ "username": "wosek_",
+ "totalCosts": 2949.2,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg"
+ },
{
"id": 14775946,
"username": "Beas",
"totalCosts": 2648.22,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg"
},
- {
- "id": 15894449,
- "username": "wosek_",
- "totalCosts": 2533.08,
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg"
- },
{
"id": 15284800,
"username": "msliwinski123",
@@ -50564,6 +50954,12 @@
"username": "boyinlee",
"totalCosts": 85.85,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15201846/medium/3d9d29022427094faeb700ddbd5c078a.jpeg"
+ },
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 7.07,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
}
]
},
@@ -51283,6 +51679,12 @@
"totalCosts": 727.2,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350862/medium/1b276f211570491d54b0578678d35c83.png"
},
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 72.72,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
+ },
{
"id": 15451966,
"username": "sgtpepper0000",
@@ -51300,12 +51702,6 @@
"username": "iPhantasmLavender",
"totalCosts": 45.45,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15373768/medium/fb5b03de96ccb41bad412ed79ca8e690_default.png"
- },
- {
- "id": 15236832,
- "username": "Andypsl8",
- "totalCosts": 16.16,
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
}
]
},
@@ -52014,6 +52410,12 @@
"totalCosts": 34.34,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15438710/medium/453df635dde065170a853b44af4f0d31.png"
},
+ {
+ "id": 16072062,
+ "username": "Aaaa-2040",
+ "totalCosts": 32.32,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16072062/medium/f98dda376a3f55bce2703d631f5be0f6_default.png"
+ },
{
"id": 15242372,
"username": "billwang",
@@ -52845,6 +53247,12 @@
"totalCosts": 114.13,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14692406/medium/cd75843e806da42ffede4f72813bcd9e.JPG"
},
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 40.4,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
+ },
{
"id": 15193608,
"username": "yuping",
@@ -53445,6 +53853,12 @@
"totalCosts": 14.14,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15848653/medium/9506bee8d4f41073b7c7fb3523239878_default.png"
},
+ {
+ "id": 16072688,
+ "username": "lz895779981",
+ "totalCosts": 1.01,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16072688/medium/b6d67449825fad3ef2cc4b861e83e94e.png"
+ },
{
"id": 15524545,
"username": "sheepskin1",
@@ -53652,12 +54066,24 @@
"totalCosts": 176.75,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15633207/medium/41f81fc49a2b8d609f4d860e885e9748_default.png"
},
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 165.64,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
+ },
{
"id": 15657887,
"username": "DreamInMorning",
"totalCosts": 99.99,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg"
},
+ {
+ "id": 16072062,
+ "username": "Aaaa-2040",
+ "totalCosts": 14.14,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16072062/medium/f98dda376a3f55bce2703d631f5be0f6_default.png"
+ },
{
"id": 15911295,
"username": "Xin_Cheng",
@@ -56802,6 +57228,12 @@
"totalCosts": 59.59,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg"
},
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 43.43,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
+ },
{
"id": 15156816,
"username": "Fengfeng0157",
@@ -57243,6 +57675,12 @@
"totalCosts": 30.3,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15156816/medium/8ce4621e9192a27e8a0ec7e37d9e316e_default.png"
},
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 25.25,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
+ },
{
"id": 15851643,
"username": "dar.riall",
@@ -57722,6 +58160,12 @@
"totalCosts": 16.16,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg"
},
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 8.08,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
+ },
{
"id": 15680993,
"username": "nzinmymind",
@@ -57869,6 +58313,12 @@
"totalCosts": 27.27,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15101527/medium/d5363de72b7fd3067a430db7ac9ad8ab.jpeg"
},
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 27.27,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
+ },
{
"id": 15635039,
"username": "farmerlesheng",
@@ -58028,18 +58478,18 @@
"totalCosts": 275.73,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837531/medium/9e87f5dd936b94262f562adfe8a943e7_default.png"
},
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 149.48,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
+ },
{
"id": 15918181,
"username": "QuinnHou",
"totalCosts": 112.11,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15918181/medium/17e80957f6d7eef4f215c6cc41951dae_default.png"
},
- {
- "id": 15236832,
- "username": "Andypsl8",
- "totalCosts": 104.03,
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
- },
{
"id": 15086195,
"username": "saintchen",
@@ -58493,6 +58943,12 @@
"username": "Dionyse",
"totalCosts": 10.1,
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15751385/medium/f60b8dcda0d73383df200b62099513f2.png"
+ },
+ {
+ "id": 15236832,
+ "username": "Andypsl8",
+ "totalCosts": 7.07,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/a1111d9e0a5487395f4a0534038c2df8.png"
}
]
},
@@ -61258,6 +61714,102 @@
"avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967847/medium/76cc99da9c9731bac54edf64508ac14f.jpeg"
}
]
+ },
+ {
+ "fileId": "7316",
+ "contributors": [
+ {
+ "id": 15967185,
+ "username": "waseemnaik",
+ "totalCosts": 2016.97,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png"
+ },
+ {
+ "id": 15967847,
+ "username": "luniacllama",
+ "totalCosts": 166.65,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967847/medium/76cc99da9c9731bac54edf64508ac14f.jpeg"
+ }
+ ]
+ },
+ {
+ "fileId": "5561",
+ "contributors": [
+ {
+ "id": 15967185,
+ "username": "waseemnaik",
+ "totalCosts": 3109.79,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png"
+ }
+ ]
+ },
+ {
+ "fileId": "7461",
+ "contributors": [
+ {
+ "id": 15967847,
+ "username": "luniacllama",
+ "totalCosts": 1125.14,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967847/medium/76cc99da9c9731bac54edf64508ac14f.jpeg"
+ },
+ {
+ "id": 15967185,
+ "username": "waseemnaik",
+ "totalCosts": 545.4,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png"
+ }
+ ]
+ },
+ {
+ "fileId": "8035",
+ "contributors": [
+ {
+ "id": 15967185,
+ "username": "waseemnaik",
+ "totalCosts": 613.07,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png"
+ },
+ {
+ "id": 15967847,
+ "username": "luniacllama",
+ "totalCosts": 581.76,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967847/medium/76cc99da9c9731bac54edf64508ac14f.jpeg"
+ }
+ ]
+ },
+ {
+ "fileId": "6440",
+ "contributors": [
+ {
+ "id": 15967185,
+ "username": "waseemnaik",
+ "totalCosts": 469.65,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png"
+ },
+ {
+ "id": 15967847,
+ "username": "luniacllama",
+ "totalCosts": 248.46,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967847/medium/76cc99da9c9731bac54edf64508ac14f.jpeg"
+ }
+ ]
+ },
+ {
+ "fileId": "7314",
+ "contributors": [
+ {
+ "id": 15967185,
+ "username": "waseemnaik",
+ "totalCosts": 902.94,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png"
+ },
+ {
+ "id": 15967847,
+ "username": "luniacllama",
+ "totalCosts": 430.26,
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967847/medium/76cc99da9c9731bac54edf64508ac14f.jpeg"
+ }
+ ]
}
]
},
diff --git a/src/data/staking-products.json b/src/data/staking-products.json
index a1b009cc854..6351bea26b2 100644
--- a/src/data/staking-products.json
+++ b/src/data/staking-products.json
@@ -436,6 +436,49 @@
"eventName": "Clicked stakefish go to link"
}
},
+ {
+ "name": "P2P.org",
+ "imageName": "P2P",
+ "hue": 227,
+ "launchDate": "2023-01-10",
+ "url": "https://p2p.org/networks/ethereum/",
+ "audits": [
+ {
+ "name": "Mixbytes (v1)",
+ "url": "https://github.com/mixbytes/audits_public/blob/79cd8153bfb6098227b43dfba8d061881a94a248/P2P.org/ETH2%20Depositor%20%26%20ETH%20Staking%20Fee%20Distributor%20(v.1)/P2P.org_ETH2%20Depositor%20%26%20ETH%20Staking%20Fee%20Distributor%20Smart%20Contracts%20Audit%20Report.pdf"
+ },
+ {
+ "name": "Mixbytes (v2)",
+ "url": "https://github.com/mixbytes/audits_public/blob/79cd8153bfb6098227b43dfba8d061881a94a248/P2P.org/ETH2%20Depositor%20%26%20ETH%20Staking%20Fee%20Distributor%20(v.2)/ETH2%20Depositor%20%26%20ETH%20Staking%20Fee%20Distributor%20Security%20Audit%20Report%20(v.2).pdf"
+ }
+ ],
+ "minEth": 32,
+ "additionalStake": null,
+ "additionalStakeUnit": null,
+ "monthlyFee": 5,
+ "monthlyFeeUnit": "%",
+ "isFoss": false,
+ "hasBugBounty": false,
+ "isTrustless": true,
+ "isPermissionless": true,
+ "pctMajorityExecutionClient": 50,
+ "pctMajorityConsensusClient": 30,
+ "isSelfCustody": false,
+ "platforms": ["Browser"],
+ "ui": ["GUI"],
+ "socials": {
+ "linkedin": "https://www.linkedin.com/company/p2p-org/",
+ "twitter": "https://twitter.com/P2Pvalidator",
+ "telegram": "https://t.me/P2Pstaking",
+ "github": "https://github.com/p2p-org",
+ "youtube": "https://www.youtube.com/channel/UC9pRzyJx5YrUNfmg1vLZ-bQ/"
+ },
+ "matomo": {
+ "eventCategory": "StakingProductCard",
+ "eventAction": "Clicked",
+ "eventName": "Clicked P2P (saas) go to link"
+ }
+ },
{
"name": "Kiln",
"imageName": "Kiln",
diff --git a/src/pages-conditional/dapps.tsx b/src/pages-conditional/dapps.tsx
index 3c145752160..0048a92e7c9 100644
--- a/src/pages-conditional/dapps.tsx
+++ b/src/pages-conditional/dapps.tsx
@@ -1113,7 +1113,7 @@ const DappsPage = ({
{
title: "Lido",
description: t("page-dapps-dapp-description-lido"),
- link: "https://lido.is/",
+ link: "https://lido.fi/",
image: getImage(data.lido),
alt: t("page-dapps-lido-logo-alt"),
},
diff --git a/src/pages-conditional/eth.tsx b/src/pages-conditional/eth.tsx
index 3c4c1761255..a0981630121 100644
--- a/src/pages-conditional/eth.tsx
+++ b/src/pages-conditional/eth.tsx
@@ -1,7 +1,6 @@
import React, { ComponentProps } from "react"
import {
Box,
- Center,
Flex,
FlexProps,
Heading,
@@ -24,7 +23,7 @@ import InlineLink from "../components/Link"
import HorizontalCard from "../components/HorizontalCard"
import PageMetadata from "../components/PageMetadata"
import FeedbackCard from "../components/FeedbackCard"
-import QuizWidget from "../components/Quiz/QuizWidget"
+import { StandaloneQuizWidget } from "../components/Quiz/QuizWidget"
import Card from "../components/Card"
import Text from "../components/OldText"
import OldHeading from "../components/OldHeading"
@@ -590,9 +589,7 @@ const EthPage = (props: PageProps) => {
-
-
-
+
diff --git a/src/pages-conditional/wallets.tsx b/src/pages-conditional/wallets.tsx
index 897276a3901..99a026100f9 100644
--- a/src/pages-conditional/wallets.tsx
+++ b/src/pages-conditional/wallets.tsx
@@ -1,6 +1,5 @@
import React from "react"
import {
- Center,
Box,
Flex,
BoxProps,
@@ -20,7 +19,7 @@ import HorizontalCard, {
} from "../components/HorizontalCard"
import CardList from "../components/CardList"
import FeedbackCard from "../components/FeedbackCard"
-import QuizWidget from "../components/Quiz/QuizWidget"
+import { StandaloneQuizWidget } from "../components/Quiz/QuizWidget"
import Text from "../components/OldText"
import OldHeading from "../components/OldHeading"
import { Simulator } from "../components/Simulator"
@@ -489,9 +488,7 @@ const WalletsPage = ({
-
-
-
+
diff --git a/src/pages-conditional/what-is-ethereum.tsx b/src/pages-conditional/what-is-ethereum.tsx
index a46a6da21fb..f7701da650d 100644
--- a/src/pages-conditional/what-is-ethereum.tsx
+++ b/src/pages-conditional/what-is-ethereum.tsx
@@ -34,7 +34,7 @@ import AdoptionChart from "../components/AdoptionChart"
import EnergyConsumptionChart from "../components/EnergyConsumptionChart"
import Slider, { EmblaSlide } from "../components/Slider"
import FeedbackCard from "../components/FeedbackCard"
-import QuizWidget from "../components/Quiz/QuizWidget"
+import { StandaloneQuizWidget } from "../components/Quiz/QuizWidget"
import StatErrorMessage from "../components/StatErrorMessage"
import StatLoadingMessage from "../components/StatLoadingMessage"
import Text from "../components/OldText"
@@ -842,9 +842,7 @@ const WhatIsEthereumPage = ({
-
-
-
+
diff --git a/src/pages/community.tsx b/src/pages/community.tsx
index a6671f4b980..63c80573f7f 100644
--- a/src/pages/community.tsx
+++ b/src/pages/community.tsx
@@ -17,9 +17,9 @@ import Card from "../components/Card"
import ButtonLink, {
IProps as IButtonLinkProps,
} from "../components/Buttons/ButtonLink"
+import { HubHero, type HubHeroProps } from "../components/Hero"
import PageMetadata from "../components/PageMetadata"
import Translation from "../components/Translation"
-import PageHero from "../components/PageHero"
import FeedbackCard from "../components/FeedbackCard"
import GatsbyImage from "../components/GatsbyImage"
@@ -143,17 +143,9 @@ interface IGetInvolvedCard {
const CommunityPage = ({
data,
- location,
}: PageProps) => {
const { t } = useTranslation()
const theme = useTheme()
- const heroContent = {
- title: t("page-community-hero-title"),
- header: t("page-community-hero-header"),
- subtitle: t("page-community-hero-subtitle"),
- image: getImage(data.enterprise)!,
- alt: t("page-community-hero-alt"),
- }
const cards: Array = [
{
@@ -204,13 +196,20 @@ const CommunityPage = ({
},
]
+ const heroContent: HubHeroProps = {
+ title: t("page-community-hero-title"),
+ header: t("page-community-hero-header"),
+ description: t("page-community-hero-subtitle"),
+ heroImgSrc: getImage(data.heroImage)!,
+ }
+
return (
-
+
) => {
descriptionKey="Layer 2 extends Ethereum, reducing costs and increasing accessibility for decentralized applications."
>
- Use layer 2
+ Use layer 2
) => {
{/* Layer 2 Quiz Section */}
-
-
-
+
{/* Layer 2 Feedback Section */}
diff --git a/src/templates/static.tsx b/src/templates/static.tsx
index af2c7ba60a0..55cb65df6a8 100644
--- a/src/templates/static.tsx
+++ b/src/templates/static.tsx
@@ -41,7 +41,7 @@ import NetworkUpgradeSummary from "../components/History/NetworkUpgradeSummary"
import TranslationChartImage from "../components/TranslationChartImage"
import PostMergeBanner from "../components/Banners/PostMergeBanner"
import EnergyConsumptionChart from "../components/EnergyConsumptionChart"
-import QuizWidget from "../components/Quiz/QuizWidget"
+import { StandaloneQuizWidget } from "../components/Quiz/QuizWidget"
import { Item as ItemTableOfContents } from "../components/TableOfContents/utils"
import Text from "../components/OldText"
import GlossaryDefinition from "../components/Glossary/GlossaryDefinition"
@@ -208,7 +208,7 @@ const components = {
NetworkUpgradeSummary,
TranslationChartImage,
EnergyConsumptionChart,
- QuizWidget,
+ QuizWidget: StandaloneQuizWidget,
UpgradeStatus,
GlossaryDefinition,
GlossaryTooltip,
diff --git a/src/templates/upgrade.tsx b/src/templates/upgrade.tsx
index ca9008a6081..9ff3133b973 100644
--- a/src/templates/upgrade.tsx
+++ b/src/templates/upgrade.tsx
@@ -1,4 +1,4 @@
-import React, { ComponentProps, ComponentPropsWithRef } from "react"
+import React from "react"
import { graphql, PageProps } from "gatsby"
import { useI18next, useTranslation } from "gatsby-plugin-react-i18next"
import { MDXProvider } from "@mdx-js/react"
@@ -47,7 +47,7 @@ import Emoji from "../components/Emoji"
import YouTube from "../components/YouTube"
import MergeInfographic from "../components/MergeInfographic"
import FeedbackCard from "../components/FeedbackCard"
-import QuizWidget from "../components/Quiz/QuizWidget"
+import { StandaloneQuizWidget } from "../components/Quiz/QuizWidget"
import GlossaryTooltip from "../components/Glossary/GlossaryTooltip"
import MdLink from "../components/MdLink"
import OldHeading from "../components/OldHeading"
@@ -235,7 +235,7 @@ const components = {
YouTube,
ExpandableCard,
MergeInfographic,
- QuizWidget,
+ QuizWidget: StandaloneQuizWidget,
GlossaryTooltip,
}
diff --git a/src/templates/use-cases.tsx b/src/templates/use-cases.tsx
index d0e6f143062..e821c36d776 100644
--- a/src/templates/use-cases.tsx
+++ b/src/templates/use-cases.tsx
@@ -48,7 +48,7 @@ import SectionNav from "../components/SectionNav"
import Emoji from "../components/Emoji"
import YouTube from "../components/YouTube"
import FeedbackCard from "../components/FeedbackCard"
-import QuizWidget from "../components/Quiz/QuizWidget"
+import { StandaloneQuizWidget } from "../components/Quiz/QuizWidget"
import GlossaryTooltip from "../components/Glossary/GlossaryTooltip"
import MdLink from "../components/MdLink"
import OldHeading from "../components/OldHeading"
@@ -134,7 +134,7 @@ const components = {
DocLink,
ExpandableCard,
YouTube,
- QuizWidget,
+ QuizWidget: StandaloneQuizWidget,
GlossaryTooltip,
}
diff --git a/yarn.lock b/yarn.lock
index d03b8ba410e..ae769999992 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -214,6 +214,14 @@
dependencies:
"@babel/highlight" "^7.22.5"
+"@babel/code-frame@^7.22.13":
+ version "7.22.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
+ integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
+ dependencies:
+ "@babel/highlight" "^7.22.13"
+ chalk "^2.4.2"
+
"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9":
version "7.22.9"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730"
@@ -271,7 +279,7 @@
eslint-visitor-keys "^2.1.0"
semver "^6.3.1"
-"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.14.0", "@babel/generator@^7.15.4", "@babel/generator@^7.20.14", "@babel/generator@^7.22.7", "@babel/generator@^7.22.9":
+"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.14.0", "@babel/generator@^7.15.4", "@babel/generator@^7.20.14", "@babel/generator@^7.22.9":
version "7.22.9"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d"
integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==
@@ -281,6 +289,16 @@
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
+"@babel/generator@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
+ integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
+ dependencies:
+ "@babel/types" "^7.23.0"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
+ jsesc "^2.5.1"
+
"@babel/helper-annotate-as-pure@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
@@ -341,6 +359,11 @@
lodash.debounce "^4.0.8"
resolve "^1.14.2"
+"@babel/helper-environment-visitor@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
"@babel/helper-environment-visitor@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
@@ -354,6 +377,14 @@
"@babel/template" "^7.22.5"
"@babel/types" "^7.22.5"
+"@babel/helper-function-name@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+ integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.23.0"
+
"@babel/helper-hoist-variables@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
@@ -447,6 +478,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+"@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
"@babel/helper-validator-identifier@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
@@ -484,11 +520,25 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
+"@babel/highlight@^7.22.13":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
+ integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+
"@babel/parser@^7.1.0", "@babel/parser@^7.12.7", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.8", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7":
version "7.22.7"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae"
integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
+"@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
+ integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
+
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e"
@@ -1338,19 +1388,28 @@
"@babel/parser" "^7.22.5"
"@babel/types" "^7.22.5"
-"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.9", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.20.13", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8":
- version "7.22.8"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e"
- integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==
+"@babel/template@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
+ integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
dependencies:
- "@babel/code-frame" "^7.22.5"
- "@babel/generator" "^7.22.7"
- "@babel/helper-environment-visitor" "^7.22.5"
- "@babel/helper-function-name" "^7.22.5"
+ "@babel/code-frame" "^7.22.13"
+ "@babel/parser" "^7.22.15"
+ "@babel/types" "^7.22.15"
+
+"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.9", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.20.13", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
+ integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
+ dependencies:
+ "@babel/code-frame" "^7.22.13"
+ "@babel/generator" "^7.23.0"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
- "@babel/parser" "^7.22.7"
- "@babel/types" "^7.22.5"
+ "@babel/parser" "^7.23.0"
+ "@babel/types" "^7.23.0"
debug "^4.1.0"
globals "^11.1.0"
@@ -1363,6 +1422,15 @@
"@babel/helper-validator-identifier" "^7.22.5"
to-fast-properties "^2.0.0"
+"@babel/types@^7.22.15", "@babel/types@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
+ integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
"@base2/pretty-print-object@1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4"