diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js index 24fe3a25..a8262f09 100644 --- a/public/mockServiceWorker.js +++ b/public/mockServiceWorker.js @@ -8,7 +8,7 @@ * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.3.1' +const PACKAGE_VERSION = '2.4.9' const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() diff --git a/src/components/LoadingPage/FAQ.tsx b/src/components/LoadingPage/FAQ.tsx index 1651b1d9..38e19088 100644 --- a/src/components/LoadingPage/FAQ.tsx +++ b/src/components/LoadingPage/FAQ.tsx @@ -13,13 +13,13 @@ export const FAQ = () => { const faqs = [ { - question: 'What is the Obol RAF?', answer: "The Obol RAF (Retroactive Fund) is a funding model by the Obol Collective aimed at supporting Ethereum's decentralization by rewarding projects that contribute significantly to its ecosystem. Users of Obol distributed validators (DV) contribute 1% of their staking rewards to this funding pool, which is then distributed to impactful projects through rounds of voting by $OBOL token delegates." + question: 'What is the Obol RAF?', answer: "The Obol RAF (Retroactive Fund) is a funding model which rewards projects strengthening and promotes the Obol Collective’s Decentralized Operator Ecosystem and its ability to scale decentralized infrastructure networks like Ethereum. The funding is designed to reward tangible impact while creating strong incentives for sustained innovation and collaboration by the community." }, - { question: 'Who can apply in the RAF?', answer: "Any project or team that aligns with the Obol Collective's mission can apply. Applications are submitted through the RAF portal, and may require certain eligibility criteria in the future, such as holding a minimum amount of $OBOL tokens." }, - { question: 'What criteria are used to evaluate projects for RAF funding?', answer: "Projects are evaluated based on their alignment with the Obol Collective's mission, impact on Ethereum's decentralization, and other project-specific metrics. Delegates are encouraged to assess each project's contributions, relying on both quantitative and qualitative impacts." }, - { question: 'When will the applications close?', answer: 'Application and voting dates are defined for each RAF round, with specific start and end dates provided per round.' }, - { question: 'Who is eligible to vote?', answer: 'Voting is conducted by $OBOL token delegates who have delegated voting power. Only addresses with sufficient delegation can vote, and contributors with conflicts of interest are restricted from voting on projects in which they have a direct stake. Voting power is based on the amount of $OBOL tokens delegated. A snapshot of voting power is taken at the start of each voting period to ensure accurate representation during voting rounds.'}, - { question: 'When are the rewards paid out?', answer: 'Rewards are disbursed after the voting round concludes, based on the votes by $OBOL delegates. The distribution uses a quadratic funding mechanism, ensuring compliance with legal standards and may require KYC completion by grant recipients.' }, + { question: 'Who can apply in the RAF?', answer: "Any project that meets the RAF round’s criteria can make an application through the RAF portal. For more information, please read the application guide on community.obol.org." }, + { question: 'What criteria are used to evaluate projects for RAF funding?', answer: "The Obol Collective has implemented impact metrics-based evaluation to ensure more informed decision-making during funding rounds. These metrics aim to provide delegates with objective data to assess the impact of each project, enabling them to allocate their votes effectively and in alignment with the Collective’s mission." }, + { question: 'When will the applications close?', answer: 'Application and voting dates are defined for each RAF round, with specific start and end dates provided per round. Please visit blog.obol.org for information about the latest round.' }, + { question: 'Who is eligible to vote?', answer: 'Voting is conducted by OBOL token delegates who have delegated voting power. Only addresses with sufficient delegation can vote, and contributors with conflicts of interest are restricted from voting on projects in which they have a direct stake. For more information, please read the delegate guide on community.obol.org.'}, + { question: 'When are the rewards paid out?', answer: 'Rewards are disbursed after the voting round concludes, based on the votes by delegates. The distribution uses a quadratic funding mechanism, ensuring compliance with legal standards and may require KYC completion by grant recipients.' }, { question: 'Can I submit feedback after participating in the RAF?', answer: 'Yes, participants are encouraged to provide feedback at the end of each RAF round. This feedback helps refine future rounds and strengthens the RAF governance process.' }, { question: 'What is the role of the Obol Association in RAF funding?', answer: 'The Obol Association oversees administrative tasks like moderating proposals, managing vote accuracy, and ensuring compliance for funding disbursement, including KYC verification as necessary.' }, diff --git a/src/components/LoadingPage/Footer.tsx b/src/components/LoadingPage/Footer.tsx index 359576b3..ab982430 100644 --- a/src/components/LoadingPage/Footer.tsx +++ b/src/components/LoadingPage/Footer.tsx @@ -16,12 +16,11 @@ export const Footer = () => { ); diff --git a/src/components/LoadingPage/InfoSection.tsx b/src/components/LoadingPage/InfoSection.tsx index 2747f5c0..01ff0234 100644 --- a/src/components/LoadingPage/InfoSection.tsx +++ b/src/components/LoadingPage/InfoSection.tsx @@ -14,13 +14,13 @@ const InfoUnit = ({ heading, description }: { heading: string, description: stri

What is RAF?

- - - + + +
- Learn more + Learn more
diff --git a/src/components/TwitterShareButton.tsx b/src/components/TwitterShareButton.tsx new file mode 100644 index 00000000..da6edaae --- /dev/null +++ b/src/components/TwitterShareButton.tsx @@ -0,0 +1,31 @@ +import type React from "react" +import { Button } from "./ui/Button" +import { TwitterIcon } from "public/Twitter" + +const getTwitterHref = (url: string) => { + const encodedUrl = encodeURIComponent(url) + return `https://twitter.com/intent/tweet?text=Checkout%20my%20project%20on%20Obol's%20RAF!%20&url=${encodedUrl}` +} + +export type TwitterShareButtonProps = { + url: string +} + +export const TwitterShareButton = ({ url }: TwitterShareButtonProps) => { + const handleClick = (e: React.MouseEvent) => { + e.preventDefault() + window.open(getTwitterHref(url), "_blank") + } + + return ( + + ) +} + diff --git a/src/pages/[domain]/index.tsx b/src/pages/[domain]/index.tsx index 32c5773d..3db033bd 100644 --- a/src/pages/[domain]/index.tsx +++ b/src/pages/[domain]/index.tsx @@ -74,7 +74,7 @@ export default function RoundPage() { } function TokenSymbol() { const token = useRoundToken(); - return <>{token.data?.symbol}; + return <>OBOL; } export const getServerSideProps = async (ctx: GetServerSidePropsContext) => { const { domain } = ctx.query; diff --git a/src/pages/[domain]/projects/[projectId]/index.tsx b/src/pages/[domain]/projects/[projectId]/index.tsx index dd58df1f..7ad3801a 100644 --- a/src/pages/[domain]/projects/[projectId]/index.tsx +++ b/src/pages/[domain]/projects/[projectId]/index.tsx @@ -1,5 +1,7 @@ import { type GetServerSideProps } from "next"; - +import { + TwitterShareButton, +} from "~/components/TwitterShareButton";; import { LayoutWithBallot } from "~/layouts/DefaultLayout"; import ProjectDetails from "~/features/projects/components/ProjectDetails"; import { useProjectById } from "~/features/projects/hooks/useProjects"; @@ -7,10 +9,13 @@ import { ProjectAddToBallot } from "~/features/projects/components/AddToBallot"; import { ProjectAwarded } from "~/features/projects/components/ProjectAwarded"; import { useRoundState } from "~/features/rounds/hooks/useRoundState"; import { ProjectComments } from "~/features/comments/components/ProjectComments"; +import { useCurrentDomain } from "~/features/rounds/hooks/useRound"; +import { metadata } from "~/config"; export default function ProjectDetailsPage({ projectId = "" }) { const project = useProjectById(projectId); const { name } = project.data ?? {}; + const domain = useCurrentDomain(); const action = useRoundState() === "RESULTS" ? ( @@ -22,7 +27,10 @@ export default function ProjectDetailsPage({ projectId = "" }) { - +
+ +
+ ); }