From 4574fd56e0e9e6f7e5d82bac14a8cf399809f93b Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Mon, 4 Aug 2025 17:11:26 +0200 Subject: [PATCH 01/15] Fetch builders and users data from SRE --- .../app/admin/_components/GrantReview.tsx | 3 ++- packages/nextjs/app/api/admin/signin/route.ts | 7 ++--- .../api/builders/[builderAddress]/route.ts | 9 ++++--- .../app/api/grants/[grantId]/review/route.tsx | 7 +++-- .../nextjs/app/api/grants/[grantId]/route.ts | 6 ++--- packages/nextjs/app/api/grants/new/route.ts | 17 +++--------- .../nextjs/app/api/grants/review/route.tsx | 10 +++---- packages/nextjs/services/database/builders.ts | 24 +++++++++++++++++ packages/nextjs/services/database/grants.ts | 7 +++-- packages/nextjs/services/database/schema.ts | 27 +++++++------------ packages/nextjs/services/database/users.ts | 21 --------------- 11 files changed, 62 insertions(+), 76 deletions(-) create mode 100644 packages/nextjs/services/database/builders.ts delete mode 100644 packages/nextjs/services/database/users.ts diff --git a/packages/nextjs/app/admin/_components/GrantReview.tsx b/packages/nextjs/app/admin/_components/GrantReview.tsx index 90456dc3..db65fd9c 100644 --- a/packages/nextjs/app/admin/_components/GrantReview.tsx +++ b/packages/nextjs/app/admin/_components/GrantReview.tsx @@ -163,13 +163,14 @@ export const GrantReview = ({ grant, selected, toggleSelection }: GrantReviewPro {grant.builderData?.batch?.number && (
Batch #{grant.builderData.batch?.number}
)} + {/* TODO: Should we add to SRE data? {grant.builderData?.builderCohort?.map(cohort => { return (
{cohort.name}
); - })} + })} */}
diff --git a/packages/nextjs/app/api/admin/signin/route.ts b/packages/nextjs/app/api/admin/signin/route.ts index 7db51516..0bf4c328 100644 --- a/packages/nextjs/app/api/admin/signin/route.ts +++ b/packages/nextjs/app/api/admin/signin/route.ts @@ -1,8 +1,8 @@ import { NextResponse } from "next/server"; import { recoverTypedDataAddress } from "viem"; -import { findUserByAddress } from "~~/services/database/users"; import { EIP_712_DOMAIN, EIP_712_TYPES__ADMIN_SIGN_IN } from "~~/utils/eip712"; import { validateSafeSignature } from "~~/utils/safe-signature"; +import { fetchBuilderData } from "~~/services/database/builders"; type AdminSignInBody = { signer?: string; @@ -10,6 +10,7 @@ type AdminSignInBody = { isSafeSignature?: boolean; chainId?: number; }; + export async function POST(req: Request) { try { const { signer, signature, isSafeSignature, chainId } = (await req.json()) as AdminSignInBody; @@ -18,8 +19,8 @@ export async function POST(req: Request) { return new Response("Missing signer or signature", { status: 400 }); } - const signerData = await findUserByAddress(signer); - if (signerData.data?.role !== "admin") { + const userData = await fetchBuilderData(signer); + if (userData?.role !== "admin") { console.error("Unauthorized", signer); return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } diff --git a/packages/nextjs/app/api/builders/[builderAddress]/route.ts b/packages/nextjs/app/api/builders/[builderAddress]/route.ts index 12f3f416..f13abb77 100644 --- a/packages/nextjs/app/api/builders/[builderAddress]/route.ts +++ b/packages/nextjs/app/api/builders/[builderAddress]/route.ts @@ -1,11 +1,14 @@ import { NextResponse } from "next/server"; -import { findUserByAddress } from "~~/services/database/users"; +import { fetchBuilderData } from "~~/services/database/builders"; export async function GET(_request: Request, { params }: { params: { builderAddress: string } }) { try { const builderAddress = params.builderAddress; - const builderData = await findUserByAddress(builderAddress); - return NextResponse.json(builderData); + const builderData = await fetchBuilderData(builderAddress); + if (!builderData) { + return NextResponse.json({ exists: false }); + } + return NextResponse.json({ exists: true, data: builderData }); } catch (error) { return NextResponse.json( { error: "Internal Server Error" }, diff --git a/packages/nextjs/app/api/grants/[grantId]/review/route.tsx b/packages/nextjs/app/api/grants/[grantId]/review/route.tsx index 52ae0e6f..4a462c06 100644 --- a/packages/nextjs/app/api/grants/[grantId]/review/route.tsx +++ b/packages/nextjs/app/api/grants/[grantId]/review/route.tsx @@ -1,8 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; import { EIP712TypedData } from "@safe-global/safe-core-sdk-types"; import { recoverTypedDataAddress } from "viem"; +import { fetchBuilderData } from "~~/services/database/builders"; import { reviewGrant } from "~~/services/database/grants"; -import { findUserByAddress } from "~~/services/database/users"; import { EIP_712_DOMAIN, EIP_712_TYPES__REVIEW_GRANT, EIP_712_TYPES__REVIEW_GRANT_WITH_NOTE } from "~~/utils/eip712"; import { PROPOSAL_STATUS, ProposalStatusType } from "~~/utils/grants"; import { validateSafeSignature } from "~~/utils/safe-signature"; @@ -89,9 +89,8 @@ export async function POST(req: NextRequest, { params }: { params: { grantId: st } // Only admins can review grants - const signerData = await findUserByAddress(signer); - - if (signerData.data?.role !== "admin") { + const signerData = await fetchBuilderData(signer); + if (signerData?.role !== "admin") { console.error("Unauthorized", signer); return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } diff --git a/packages/nextjs/app/api/grants/[grantId]/route.ts b/packages/nextjs/app/api/grants/[grantId]/route.ts index 5aed5cb2..620c9200 100644 --- a/packages/nextjs/app/api/grants/[grantId]/route.ts +++ b/packages/nextjs/app/api/grants/[grantId]/route.ts @@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from "next/server"; import { EIP712TypedData } from "@safe-global/safe-core-sdk-types"; import { recoverTypedDataAddress } from "viem"; import { updateGrant } from "~~/services/database/grants"; -import { findUserByAddress } from "~~/services/database/users"; +import { fetchBuilderData } from "~~/services/database/builders"; import { EIP_712_DOMAIN, EIP_712_TYPES__EDIT_GRANT } from "~~/utils/eip712"; import { validateSafeSignature } from "~~/utils/safe-signature"; @@ -55,8 +55,8 @@ export async function PATCH(req: NextRequest, { params }: { params: { grantId: s } // Only admins can edit grant - const signerData = await findUserByAddress(signer); - if (signerData.data?.role !== "admin") { + const signerData = await fetchBuilderData(signer); + if (signerData?.role !== "admin") { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } await updateGrant(grantId, { title, description, askAmount }, private_note); diff --git a/packages/nextjs/app/api/grants/new/route.ts b/packages/nextjs/app/api/grants/new/route.ts index 785aaf1f..ef42a4fa 100644 --- a/packages/nextjs/app/api/grants/new/route.ts +++ b/packages/nextjs/app/api/grants/new/route.ts @@ -1,7 +1,6 @@ import { NextResponse } from "next/server"; import { recoverTypedDataAddress } from "viem"; import { createGrant } from "~~/services/database/grants"; -import { findUserByAddress } from "~~/services/database/users"; import { EIP_712_DOMAIN, EIP_712_TYPES__APPLY_FOR_GRANT } from "~~/utils/eip712"; import { REQUIRED_CHALLENGE_COUNT, fetchAcceptedChallengeCount } from "~~/utils/eligibility-criteria"; @@ -24,19 +23,9 @@ export async function POST(req: Request) { return NextResponse.json({ error: "Invalid form details submitted" }, { status: 400 }); } - // Verify if the builder is present (legacy BG check) - const builder = await findUserByAddress(signer); - let eligible = false; - if (builder.exists) { - eligible = true; - } else { - // New SRE challenge check - const completed = await fetchAcceptedChallengeCount(signer); - if (completed >= REQUIRED_CHALLENGE_COUNT) { - eligible = true; - } - } - if (!eligible) { + // Legacy BG builder presence check removed. All eligibility is now based on the new SpeedRunEthereum system. If needed we could try do some kind of ROLE validation and make sure OG BuidlGuidl members that that certain ROLE in new SRE database. + const completed = await fetchAcceptedChallengeCount(signer); + if (completed < REQUIRED_CHALLENGE_COUNT) { return NextResponse.json( { error: `Only builders with at least ${REQUIRED_CHALLENGE_COUNT} accepted SpeedRun Ethereum challenges can submit for grants`, diff --git a/packages/nextjs/app/api/grants/review/route.tsx b/packages/nextjs/app/api/grants/review/route.tsx index bb7847fa..59ba81d6 100644 --- a/packages/nextjs/app/api/grants/review/route.tsx +++ b/packages/nextjs/app/api/grants/review/route.tsx @@ -2,8 +2,8 @@ import { headers } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; import { EIP712TypedData } from "@safe-global/safe-core-sdk-types"; import { recoverTypedDataAddress } from "viem"; +import { fetchBuilderData } from "~~/services/database/builders"; import { getAllGrantsForReview, reviewGrant } from "~~/services/database/grants"; -import { findUserByAddress } from "~~/services/database/users"; import { EIP_712_DOMAIN, EIP_712_TYPES__REVIEW_GRANT_BATCH } from "~~/utils/eip712"; import { PROPOSAL_STATUS, ProposalStatusType } from "~~/utils/grants"; import { validateSafeSignature } from "~~/utils/safe-signature"; @@ -26,8 +26,8 @@ export async function GET() { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } - const signerData = await findUserByAddress(address); - if (signerData.data?.role !== "admin") { + const signerData = await fetchBuilderData(address); + if (signerData?.role !== "admin") { console.error("Unauthorized", address); return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } @@ -76,8 +76,8 @@ export async function POST(req: NextRequest) { } // Only admins can review grants - const signerData = await findUserByAddress(signer); - if (signerData.data?.role !== "admin") { + const signerData = await fetchBuilderData(signer); + if (signerData?.role !== "admin") { console.error("Unauthorized", signer); return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } diff --git a/packages/nextjs/services/database/builders.ts b/packages/nextjs/services/database/builders.ts new file mode 100644 index 00000000..fdbc4b66 --- /dev/null +++ b/packages/nextjs/services/database/builders.ts @@ -0,0 +1,24 @@ +import { BuilderData, SocialLinks } from "./schema"; + +export async function fetchBuilderData(address: string): Promise { + const res = await fetch(`https://speedrunethereum.com/api/users/${address}`); + if (!res.ok) return undefined; + const apiData = await res.json(); + const user = apiData.user; + const socialLinks: SocialLinks = { + telegram: user.socialTelegram, + twitter: user.socialX, + github: user.socialGithub, + instagram: user.socialInstagram, + discord: user.socialDiscord, + email: user.socialEmail, + }; + return { + id: user.userAddress, + role: user.role ? user.role.toLowerCase() : undefined, + socialLinks, + batch: user.batchId + ? { number: String(Number(user.batchId) - 1), status: user.batchStatus } + : undefined, + }; +} diff --git a/packages/nextjs/services/database/grants.ts b/packages/nextjs/services/database/grants.ts index 5021239d..15a08486 100644 --- a/packages/nextjs/services/database/grants.ts +++ b/packages/nextjs/services/database/grants.ts @@ -1,7 +1,7 @@ import { getFirestoreConnector } from "./firestoreDB"; import { BuilderData, GrantData, GrantDataWithPrivateNote } from "./schema"; +import { fetchBuilderData } from "./builders"; import ecosystemGrants from "~~/services/database/ecosystemGrants.json"; -import { findUserByAddress } from "~~/services/database/users"; import { PROPOSAL_STATUS, ProposalStatusType } from "~~/utils/grants"; const firestoreDB = getFirestoreConnector(); @@ -63,13 +63,12 @@ export const getAllGrantsForReview = async () => { const privateNotes = doc.ref.collection("private_note"); const privateNotesSnapshot = await privateNotes.get(); const private_note = privateNotesSnapshot.empty ? undefined : privateNotesSnapshot.docs[0].data().note; - const builderDataResponse = await findUserByAddress(grantData.builder); - + const builderData = await fetchBuilderData(grantData.builder); return { id: doc.id, ...grantData, private_note, - builderData: builderDataResponse.exists ? (builderDataResponse.data as BuilderData) : undefined, + builderData, } as GrantDataWithPrivateNote; }); diff --git a/packages/nextjs/services/database/schema.ts b/packages/nextjs/services/database/schema.ts index 25d32699..c4a99fb2 100644 --- a/packages/nextjs/services/database/schema.ts +++ b/packages/nextjs/services/database/schema.ts @@ -26,26 +26,17 @@ type Graduated = { export type BuilderData = { id: string; - socialLinks?: SocialLinks; - role?: "anonymous" | "builder" | "admin"; - function?: string; - creationTimestamp?: number; + role?: "anonymous" | "user" | "admin"; builds?: Build[]; - status?: Status; - graduated?: Graduated; - batch?: { - number: string; - status: string; - }; - builderCohort?: { id: string; name: string; url: string }[]; - stream?: { - balance: string; - cap: string; - frequency: number; - lastContract: number; - lastIndexedBlock: number; - streamAddress: string; + socialLinks?: { + telegram?: string; + twitter?: string; + github?: string; + instagram?: string; + discord?: string; + email?: string; }; + batch?: { number: string; status: string }; }; export type BuilderDataResponse = { diff --git a/packages/nextjs/services/database/users.ts b/packages/nextjs/services/database/users.ts deleted file mode 100644 index a30753f8..00000000 --- a/packages/nextjs/services/database/users.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { getFirestoreConnector } from "./firestoreDB"; -import { BuilderDataResponse } from "./schema"; -import { DocumentData } from "firebase-admin/firestore"; - -const firestoreDB = getFirestoreConnector(); -const getUserDoc = (id: string) => firestoreDB.collection("users").doc(id); -const getUserSnapshotById = (id: string) => getUserDoc(id).get(); - -export const findUserByAddress = async (builderAddress: string): Promise => { - try { - const builderSnapshot = await getUserSnapshotById(builderAddress); - if (!builderSnapshot.exists) { - return { exists: false }; - } - const data = builderSnapshot.data() as DocumentData; - return { exists: true, data: { id: builderSnapshot.id, ...data } }; - } catch (error) { - console.error("Error finding user by address:", error); - throw error; - } -}; From 3ce9d53a8c3c558725ecfbe8926eb763eac4d8a8 Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Mon, 4 Aug 2025 17:27:08 +0200 Subject: [PATCH 02/15] Use type --- packages/nextjs/services/database/schema.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/nextjs/services/database/schema.ts b/packages/nextjs/services/database/schema.ts index c4a99fb2..a73bfd63 100644 --- a/packages/nextjs/services/database/schema.ts +++ b/packages/nextjs/services/database/schema.ts @@ -28,14 +28,7 @@ export type BuilderData = { id: string; role?: "anonymous" | "user" | "admin"; builds?: Build[]; - socialLinks?: { - telegram?: string; - twitter?: string; - github?: string; - instagram?: string; - discord?: string; - email?: string; - }; + socialLinks?: SocialLinks; batch?: { number: string; status: string }; }; From 199aa5b87c14c7d108733fe5ca5a4cd42d8a6446 Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:02:54 +0200 Subject: [PATCH 03/15] Fix lint errors --- packages/nextjs/app/api/admin/signin/route.ts | 2 +- packages/nextjs/app/api/grants/[grantId]/route.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nextjs/app/api/admin/signin/route.ts b/packages/nextjs/app/api/admin/signin/route.ts index 0bf4c328..5ddf9a87 100644 --- a/packages/nextjs/app/api/admin/signin/route.ts +++ b/packages/nextjs/app/api/admin/signin/route.ts @@ -1,8 +1,8 @@ import { NextResponse } from "next/server"; import { recoverTypedDataAddress } from "viem"; +import { fetchBuilderData } from "~~/services/database/builders"; import { EIP_712_DOMAIN, EIP_712_TYPES__ADMIN_SIGN_IN } from "~~/utils/eip712"; import { validateSafeSignature } from "~~/utils/safe-signature"; -import { fetchBuilderData } from "~~/services/database/builders"; type AdminSignInBody = { signer?: string; diff --git a/packages/nextjs/app/api/grants/[grantId]/route.ts b/packages/nextjs/app/api/grants/[grantId]/route.ts index 620c9200..fec27e2d 100644 --- a/packages/nextjs/app/api/grants/[grantId]/route.ts +++ b/packages/nextjs/app/api/grants/[grantId]/route.ts @@ -1,8 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; import { EIP712TypedData } from "@safe-global/safe-core-sdk-types"; import { recoverTypedDataAddress } from "viem"; -import { updateGrant } from "~~/services/database/grants"; import { fetchBuilderData } from "~~/services/database/builders"; +import { updateGrant } from "~~/services/database/grants"; import { EIP_712_DOMAIN, EIP_712_TYPES__EDIT_GRANT } from "~~/utils/eip712"; import { validateSafeSignature } from "~~/utils/safe-signature"; From fb82146f13a60424303a07027ff3a5f2866ef6d7 Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:10:32 +0200 Subject: [PATCH 04/15] Add new service for sre api and refactor --- packages/nextjs/app/api/admin/signin/route.ts | 2 +- .../api/builders/[builderAddress]/route.ts | 2 +- .../app/api/grants/[grantId]/review/route.tsx | 2 +- .../nextjs/app/api/grants/[grantId]/route.ts | 2 +- .../nextjs/app/api/grants/review/route.tsx | 2 +- packages/nextjs/hooks/useBGBuilderData.ts | 2 +- .../{database => api/sre}/builders.ts | 0 packages/nextjs/services/api/sre/schema.ts | 20 ++++++++++++++++ packages/nextjs/services/database/grants.ts | 4 ++-- packages/nextjs/services/database/schema.ts | 23 +------------------ 10 files changed, 29 insertions(+), 30 deletions(-) rename packages/nextjs/services/{database => api/sre}/builders.ts (100%) create mode 100644 packages/nextjs/services/api/sre/schema.ts diff --git a/packages/nextjs/app/api/admin/signin/route.ts b/packages/nextjs/app/api/admin/signin/route.ts index 5ddf9a87..45820a2d 100644 --- a/packages/nextjs/app/api/admin/signin/route.ts +++ b/packages/nextjs/app/api/admin/signin/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from "next/server"; import { recoverTypedDataAddress } from "viem"; -import { fetchBuilderData } from "~~/services/database/builders"; +import { fetchBuilderData } from "~~/services/api/sre/builders"; import { EIP_712_DOMAIN, EIP_712_TYPES__ADMIN_SIGN_IN } from "~~/utils/eip712"; import { validateSafeSignature } from "~~/utils/safe-signature"; diff --git a/packages/nextjs/app/api/builders/[builderAddress]/route.ts b/packages/nextjs/app/api/builders/[builderAddress]/route.ts index f13abb77..aee9b73a 100644 --- a/packages/nextjs/app/api/builders/[builderAddress]/route.ts +++ b/packages/nextjs/app/api/builders/[builderAddress]/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from "next/server"; -import { fetchBuilderData } from "~~/services/database/builders"; +import { fetchBuilderData } from "~~/services/api/sre/builders"; export async function GET(_request: Request, { params }: { params: { builderAddress: string } }) { try { diff --git a/packages/nextjs/app/api/grants/[grantId]/review/route.tsx b/packages/nextjs/app/api/grants/[grantId]/review/route.tsx index 4a462c06..008f1e4a 100644 --- a/packages/nextjs/app/api/grants/[grantId]/review/route.tsx +++ b/packages/nextjs/app/api/grants/[grantId]/review/route.tsx @@ -1,7 +1,7 @@ import { NextRequest, NextResponse } from "next/server"; import { EIP712TypedData } from "@safe-global/safe-core-sdk-types"; import { recoverTypedDataAddress } from "viem"; -import { fetchBuilderData } from "~~/services/database/builders"; +import { fetchBuilderData } from "~~/services/api/sre/builders"; import { reviewGrant } from "~~/services/database/grants"; import { EIP_712_DOMAIN, EIP_712_TYPES__REVIEW_GRANT, EIP_712_TYPES__REVIEW_GRANT_WITH_NOTE } from "~~/utils/eip712"; import { PROPOSAL_STATUS, ProposalStatusType } from "~~/utils/grants"; diff --git a/packages/nextjs/app/api/grants/[grantId]/route.ts b/packages/nextjs/app/api/grants/[grantId]/route.ts index fec27e2d..59c7ee7d 100644 --- a/packages/nextjs/app/api/grants/[grantId]/route.ts +++ b/packages/nextjs/app/api/grants/[grantId]/route.ts @@ -1,7 +1,7 @@ import { NextRequest, NextResponse } from "next/server"; import { EIP712TypedData } from "@safe-global/safe-core-sdk-types"; import { recoverTypedDataAddress } from "viem"; -import { fetchBuilderData } from "~~/services/database/builders"; +import { fetchBuilderData } from "~~/services/api/sre/builders"; import { updateGrant } from "~~/services/database/grants"; import { EIP_712_DOMAIN, EIP_712_TYPES__EDIT_GRANT } from "~~/utils/eip712"; import { validateSafeSignature } from "~~/utils/safe-signature"; diff --git a/packages/nextjs/app/api/grants/review/route.tsx b/packages/nextjs/app/api/grants/review/route.tsx index 59ba81d6..eaa1cbbc 100644 --- a/packages/nextjs/app/api/grants/review/route.tsx +++ b/packages/nextjs/app/api/grants/review/route.tsx @@ -2,7 +2,7 @@ import { headers } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; import { EIP712TypedData } from "@safe-global/safe-core-sdk-types"; import { recoverTypedDataAddress } from "viem"; -import { fetchBuilderData } from "~~/services/database/builders"; +import { fetchBuilderData } from "~~/services/api/sre/builders"; import { getAllGrantsForReview, reviewGrant } from "~~/services/database/grants"; import { EIP_712_DOMAIN, EIP_712_TYPES__REVIEW_GRANT_BATCH } from "~~/utils/eip712"; import { PROPOSAL_STATUS, ProposalStatusType } from "~~/utils/grants"; diff --git a/packages/nextjs/hooks/useBGBuilderData.ts b/packages/nextjs/hooks/useBGBuilderData.ts index 65f2c83b..863f179a 100644 --- a/packages/nextjs/hooks/useBGBuilderData.ts +++ b/packages/nextjs/hooks/useBGBuilderData.ts @@ -1,5 +1,5 @@ import useSWRImmutable from "swr/immutable"; -import { BuilderDataResponse } from "~~/services/database/schema"; +import { BuilderDataResponse } from "~~/services/api/sre/schema"; export const useBGBuilderData = (address?: string) => { const { diff --git a/packages/nextjs/services/database/builders.ts b/packages/nextjs/services/api/sre/builders.ts similarity index 100% rename from packages/nextjs/services/database/builders.ts rename to packages/nextjs/services/api/sre/builders.ts diff --git a/packages/nextjs/services/api/sre/schema.ts b/packages/nextjs/services/api/sre/schema.ts new file mode 100644 index 00000000..c9aacdb3 --- /dev/null +++ b/packages/nextjs/services/api/sre/schema.ts @@ -0,0 +1,20 @@ +export type SocialLinks = { + twitter?: string; + github?: string; + discord?: string; + telegram?: string; + instagram?: string; + email?: string; +}; + +export type BuilderData = { + id: string; + role?: "anonymous" | "user" | "admin"; + socialLinks?: SocialLinks; + batch?: { number: string; status: string }; +}; + +export type BuilderDataResponse = { + exists: boolean; + data?: BuilderData; +}; diff --git a/packages/nextjs/services/database/grants.ts b/packages/nextjs/services/database/grants.ts index 15a08486..064e896f 100644 --- a/packages/nextjs/services/database/grants.ts +++ b/packages/nextjs/services/database/grants.ts @@ -1,6 +1,6 @@ import { getFirestoreConnector } from "./firestoreDB"; -import { BuilderData, GrantData, GrantDataWithPrivateNote } from "./schema"; -import { fetchBuilderData } from "./builders"; +import { GrantData, GrantDataWithPrivateNote } from "./schema"; +import { fetchBuilderData } from "../api/sre/builders"; import ecosystemGrants from "~~/services/database/ecosystemGrants.json"; import { PROPOSAL_STATUS, ProposalStatusType } from "~~/utils/grants"; diff --git a/packages/nextjs/services/database/schema.ts b/packages/nextjs/services/database/schema.ts index a73bfd63..3a18ed1d 100644 --- a/packages/nextjs/services/database/schema.ts +++ b/packages/nextjs/services/database/schema.ts @@ -1,13 +1,5 @@ import type { Simplify } from "type-fest"; - -export type SocialLinks = { - twitter?: string; - github?: string; - discord?: string; - telegram?: string; - instagram?: string; - email?: string; -}; +import type { BuilderData } from "../api/sre/schema"; type Build = { submittedTimestamp: number; @@ -24,19 +16,6 @@ type Graduated = { status: boolean; }; -export type BuilderData = { - id: string; - role?: "anonymous" | "user" | "admin"; - builds?: Build[]; - socialLinks?: SocialLinks; - batch?: { number: string; status: string }; -}; - -export type BuilderDataResponse = { - exists: boolean; - data?: BuilderData; -}; - export type GrantWithoutTimestamps = { id: string; title: string; From 324ff40448c8a40a275a5777c6720796232d20c4 Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:13:46 +0200 Subject: [PATCH 05/15] Fix SocialLinks import --- packages/nextjs/app/admin/_components/GrantReview.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/app/admin/_components/GrantReview.tsx b/packages/nextjs/app/admin/_components/GrantReview.tsx index db65fd9c..f8689997 100644 --- a/packages/nextjs/app/admin/_components/GrantReview.tsx +++ b/packages/nextjs/app/admin/_components/GrantReview.tsx @@ -11,7 +11,8 @@ import TelegramIcon from "~~/components/assets/TelegramIcon"; import TwitterIcon from "~~/components/assets/TwitterIcon"; import { Address } from "~~/components/scaffold-eth"; import { useScaffoldContractWrite } from "~~/hooks/scaffold-eth"; -import { GrantData, GrantDataWithPrivateNote, SocialLinks } from "~~/services/database/schema"; +import { SocialLinks } from "~~/services/api/sre/schema"; +import { GrantData, GrantDataWithPrivateNote } from "~~/services/database/schema"; import { PROPOSAL_STATUS, ProposalStatusType } from "~~/utils/grants"; const BuilderSocials = ({ socialLinks }: { socialLinks?: SocialLinks }) => { From 0ddef3ce18233a028b2fc242d0deb3220d0030dd Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Tue, 19 Aug 2025 18:19:20 +0200 Subject: [PATCH 06/15] Delete unused types --- packages/nextjs/services/database/schema.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/packages/nextjs/services/database/schema.ts b/packages/nextjs/services/database/schema.ts index 3a18ed1d..bdbe0469 100644 --- a/packages/nextjs/services/database/schema.ts +++ b/packages/nextjs/services/database/schema.ts @@ -1,21 +1,6 @@ import type { Simplify } from "type-fest"; import type { BuilderData } from "../api/sre/schema"; -type Build = { - submittedTimestamp: number; - id: string; -}; - -type Status = { - text: string; - timestamp: number; -}; - -type Graduated = { - reason: string; - status: boolean; -}; - export type GrantWithoutTimestamps = { id: string; title: string; From ce964648165a9ecfa56e1c5041e1d693a6b38b25 Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:19:55 +0200 Subject: [PATCH 07/15] Update schema to match SRE api response --- packages/nextjs/services/api/sre/schema.ts | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/packages/nextjs/services/api/sre/schema.ts b/packages/nextjs/services/api/sre/schema.ts index c9aacdb3..a6b8783f 100644 --- a/packages/nextjs/services/api/sre/schema.ts +++ b/packages/nextjs/services/api/sre/schema.ts @@ -1,20 +1,15 @@ export type SocialLinks = { - twitter?: string; - github?: string; - discord?: string; - telegram?: string; - instagram?: string; - email?: string; + socialX?: string; + socialGithub?: string; + socialDiscord?: string; + socialTelegram?: string; + socialInstagram?: string; + socialEmail?: string; }; export type BuilderData = { - id: string; + userAddress: string; role?: "anonymous" | "user" | "admin"; socialLinks?: SocialLinks; - batch?: { number: string; status: string }; -}; - -export type BuilderDataResponse = { - exists: boolean; - data?: BuilderData; + batchId?: { number: string; status: string }; }; From e6f63dc3c2c007c8e1e956943ddb48d6e0470467 Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:22:32 +0200 Subject: [PATCH 08/15] Add try catch and tweak field naming --- packages/nextjs/services/api/sre/builders.ts | 49 ++++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/packages/nextjs/services/api/sre/builders.ts b/packages/nextjs/services/api/sre/builders.ts index fdbc4b66..507a3683 100644 --- a/packages/nextjs/services/api/sre/builders.ts +++ b/packages/nextjs/services/api/sre/builders.ts @@ -1,24 +1,33 @@ import { BuilderData, SocialLinks } from "./schema"; export async function fetchBuilderData(address: string): Promise { - const res = await fetch(`https://speedrunethereum.com/api/users/${address}`); - if (!res.ok) return undefined; - const apiData = await res.json(); - const user = apiData.user; - const socialLinks: SocialLinks = { - telegram: user.socialTelegram, - twitter: user.socialX, - github: user.socialGithub, - instagram: user.socialInstagram, - discord: user.socialDiscord, - email: user.socialEmail, - }; - return { - id: user.userAddress, - role: user.role ? user.role.toLowerCase() : undefined, - socialLinks, - batch: user.batchId - ? { number: String(Number(user.batchId) - 1), status: user.batchStatus } - : undefined, - }; + try { + const res = await fetch(`https://speedrunethereum.com/api/users/${address}`); + + if (!res.ok) return undefined; + + const apiData = await res.json(); + const user = apiData.user; + + const socialLinks: SocialLinks = { + socialX: user.socialX, + socialGithub: user.socialGithub, + socialDiscord: user.socialDiscord, + socialTelegram: user.socialTelegram, + socialInstagram: user.socialInstagram, + socialEmail: user.socialEmail, + }; + + return { + userAddress: user.userAddress, + role: user.role ? user.role.toLowerCase() : undefined, + socialLinks, + batchId: user.batchId + ? { number: String(Number(user.batchId) - 1), status: user.batchStatus } + : undefined, + }; + } catch (error) { + console.error('Failed to fetch builder data:', error); + return undefined; + } } From 59c729c90dc534d0d4499e0d2255aa4779761893 Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:24:00 +0200 Subject: [PATCH 09/15] Delete intermediate api and delete isBuilderPresent --- .../api/builders/[builderAddress]/route.ts | 20 ------------------- packages/nextjs/hooks/useBGBuilderData.ts | 15 +++++++------- 2 files changed, 8 insertions(+), 27 deletions(-) delete mode 100644 packages/nextjs/app/api/builders/[builderAddress]/route.ts diff --git a/packages/nextjs/app/api/builders/[builderAddress]/route.ts b/packages/nextjs/app/api/builders/[builderAddress]/route.ts deleted file mode 100644 index aee9b73a..00000000 --- a/packages/nextjs/app/api/builders/[builderAddress]/route.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NextResponse } from "next/server"; -import { fetchBuilderData } from "~~/services/api/sre/builders"; - -export async function GET(_request: Request, { params }: { params: { builderAddress: string } }) { - try { - const builderAddress = params.builderAddress; - const builderData = await fetchBuilderData(builderAddress); - if (!builderData) { - return NextResponse.json({ exists: false }); - } - return NextResponse.json({ exists: true, data: builderData }); - } catch (error) { - return NextResponse.json( - { error: "Internal Server Error" }, - { - status: 500, - }, - ); - } -} diff --git a/packages/nextjs/hooks/useBGBuilderData.ts b/packages/nextjs/hooks/useBGBuilderData.ts index 863f179a..64c99aca 100644 --- a/packages/nextjs/hooks/useBGBuilderData.ts +++ b/packages/nextjs/hooks/useBGBuilderData.ts @@ -1,15 +1,16 @@ import useSWRImmutable from "swr/immutable"; -import { BuilderDataResponse } from "~~/services/api/sre/schema"; +import { BuilderData } from "~~/services/api/sre/schema"; +import { fetchBuilderData } from "~~/services/api/sre/builders"; export const useBGBuilderData = (address?: string) => { const { - data: responseData, + data, isLoading, error, - } = useSWRImmutable(address ? `/api/builders/${address}` : null); + } = useSWRImmutable( + address ? `builder-${address}` : null, + () => fetchBuilderData(address!) + ); - const data = responseData?.data; - const isBuilderPresent = responseData?.exists ?? false; - - return { isLoading, error, data, isBuilderPresent }; + return { isLoading, error, data }; }; From 999854d3dcc4517e72db7722f0503e3c52512dcf Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:24:36 +0200 Subject: [PATCH 10/15] Update field naming --- .../nextjs/app/admin/_components/GrantReview.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/nextjs/app/admin/_components/GrantReview.tsx b/packages/nextjs/app/admin/_components/GrantReview.tsx index f8689997..6a08ac80 100644 --- a/packages/nextjs/app/admin/_components/GrantReview.tsx +++ b/packages/nextjs/app/admin/_components/GrantReview.tsx @@ -20,20 +20,20 @@ const BuilderSocials = ({ socialLinks }: { socialLinks?: SocialLinks }) => { return ( <> - {socialLinks?.twitter && ( + {socialLinks?.socialX && ( )} - {socialLinks?.telegram && ( + {socialLinks?.socialTelegram && ( @@ -161,8 +161,8 @@ export const GrantReview = ({ grant, selected, toggleSelection }: GrantReviewPro
- {grant.builderData?.batch?.number && ( -
Batch #{grant.builderData.batch?.number}
+ {grant.builderData?.batchId?.number && ( +
Batch #{grant.builderData.batchId?.number}
)} {/* TODO: Should we add to SRE data? {grant.builderData?.builderCohort?.map(cohort => { From eb27a38a80fb3852111263398247c82d3736c482 Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:25:10 +0200 Subject: [PATCH 11/15] Delete isBuilderPresent logic --- .../app/_components/ApplyEligibilityLink.tsx | 15 ++++----------- .../nextjs/app/apply/_component/SubmitButton.tsx | 14 +++----------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/packages/nextjs/app/_components/ApplyEligibilityLink.tsx b/packages/nextjs/app/_components/ApplyEligibilityLink.tsx index 93d05f28..da903ade 100644 --- a/packages/nextjs/app/_components/ApplyEligibilityLink.tsx +++ b/packages/nextjs/app/_components/ApplyEligibilityLink.tsx @@ -61,25 +61,18 @@ const FeedbackMessage = ({ export const ApplyEligibilityLink = () => { const { isConnected, address: connectedAddress } = useAccount(); - const { isBuilderPresent, isLoading: isFetchingBuilderData } = useBGBuilderData(connectedAddress); const { openConnectModal } = useConnectModal(); - const { - isLoading: isLoadingSRE, - isEligible: isEligibleSRE, - completedChallengesCount, - } = useSpeedRunChallengeEligibility(connectedAddress); + const { isLoading, isEligible, completedChallengesCount } = useSpeedRunChallengeEligibility(connectedAddress); let builderStatus: BuilderStatus = "notConnected"; - if (!isConnected || isLoadingSRE) { + if (!isConnected || isLoading) { builderStatus = "notConnected"; - } else if (isEligibleSRE || isBuilderPresent) { + } else if (isEligible) { builderStatus = "eligible"; } else { builderStatus = "notElegible"; } - const isFetching = isLoadingSRE || (isEligibleSRE === false && isFetchingBuilderData); - return (

Do you qualify?

@@ -101,7 +94,7 @@ export const ApplyEligibilityLink = () => { if (!isConnected && openConnectModal) openConnectModal(); }} > - {isFetching ? ( + {isLoading ? ( ) : ( diff --git a/packages/nextjs/app/apply/_component/SubmitButton.tsx b/packages/nextjs/app/apply/_component/SubmitButton.tsx index 397046e6..d5debd40 100644 --- a/packages/nextjs/app/apply/_component/SubmitButton.tsx +++ b/packages/nextjs/app/apply/_component/SubmitButton.tsx @@ -2,7 +2,6 @@ import { useFormStatus } from "react-dom"; import { useAccount } from "wagmi"; -import { useBGBuilderData } from "~~/hooks/useBGBuilderData"; import { useSpeedRunChallengeEligibility } from "~~/hooks/useSpeedRunChallengeEligibility"; import { REQUIRED_CHALLENGE_COUNT } from "~~/utils/eligibility-criteria"; @@ -10,16 +9,9 @@ import { REQUIRED_CHALLENGE_COUNT } from "~~/utils/eligibility-criteria"; const SubmitButton = () => { const { pending } = useFormStatus(); const { isConnected, address: connectedAddress } = useAccount(); - const { isBuilderPresent, isLoading: isFetchingBuilderData } = useBGBuilderData(connectedAddress); - const { - isLoading: isLoadingSRE, - isEligible: isEligibleSRE, - completedChallengesCount, - } = useSpeedRunChallengeEligibility(connectedAddress); + const { isLoading, isEligible, completedChallengesCount } = useSpeedRunChallengeEligibility(connectedAddress); - const isEligible = isEligibleSRE || isBuilderPresent; - const isFetching = isLoadingSRE || (isEligibleSRE === false && isFetchingBuilderData); - const isSubmitDisabled = !isConnected || isFetching || !isEligible || pending; + const isSubmitDisabled = !isConnected || isLoading || !isEligible || pending; let tooltip = ""; if (!isConnected) { @@ -33,7 +25,7 @@ const SubmitButton = () => { return (
From c8fa6768f8a9247ea2b0efecbfcfe98ffe7dd17f Mon Sep 17 00:00:00 2001 From: Pablo Alayeto <55535804+Pabl0cks@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:30:16 +0200 Subject: [PATCH 12/15] Delete unsed useBGBuilderData --- packages/nextjs/app/_components/ApplyEligibilityLink.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nextjs/app/_components/ApplyEligibilityLink.tsx b/packages/nextjs/app/_components/ApplyEligibilityLink.tsx index da903ade..0fc31818 100644 --- a/packages/nextjs/app/_components/ApplyEligibilityLink.tsx +++ b/packages/nextjs/app/_components/ApplyEligibilityLink.tsx @@ -4,7 +4,6 @@ import Link from "next/link"; import { useConnectModal } from "@rainbow-me/rainbowkit"; import { useAccount } from "wagmi"; import { LockClosedIcon, LockOpenIcon } from "@heroicons/react/24/outline"; -import { useBGBuilderData } from "~~/hooks/useBGBuilderData"; import { useSpeedRunChallengeEligibility } from "~~/hooks/useSpeedRunChallengeEligibility"; import { REQUIRED_CHALLENGE_COUNT } from "~~/utils/eligibility-criteria"; From 2f33fe5ae9a4db694e1f83130ab07c385234a4d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20S=C3=A1nchez?= Date: Wed, 20 Aug 2025 10:10:34 +0200 Subject: [PATCH 13/15] Extract SRE ENDPOINT --- packages/nextjs/services/api/sre/builders.ts | 10 +++++----- packages/nextjs/utils/eligibility-criteria.ts | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/nextjs/services/api/sre/builders.ts b/packages/nextjs/services/api/sre/builders.ts index 507a3683..83474819 100644 --- a/packages/nextjs/services/api/sre/builders.ts +++ b/packages/nextjs/services/api/sre/builders.ts @@ -1,8 +1,10 @@ import { BuilderData, SocialLinks } from "./schema"; +export const SRE_ENDPOINT = "https://speedrunethereum.com"; + export async function fetchBuilderData(address: string): Promise { try { - const res = await fetch(`https://speedrunethereum.com/api/users/${address}`); + const res = await fetch(`${SRE_ENDPOINT}/api/users/${address}`); if (!res.ok) return undefined; @@ -22,12 +24,10 @@ export async function fetchBuilderData(address: string): Promise { if (!address) return 0; try { - const res = await fetch(`https://speedrunethereum.com/api/user-challenges/${address}`); + const res = await fetch(`${SRE_ENDPOINT}/api/user-challenges/${address}`); if (!res.ok) return 0; const data = await res.json(); return data.challenges?.filter((ch: any) => ch.reviewAction === "ACCEPTED").length ?? 0; From 9ac344e999eb2112f7adf0060081b12962dbd7bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20S=C3=A1nchez?= Date: Wed, 20 Aug 2025 10:21:19 +0200 Subject: [PATCH 14/15] Twitter => x. Links and Icon --- packages/nextjs/app/_components/EcosystemGrants.tsx | 13 +++++++------ .../nextjs/app/admin/_components/GrantReview.tsx | 6 +++--- packages/nextjs/components/assets/TwitterIcon.tsx | 13 ------------- packages/nextjs/components/assets/XIcon.tsx | 12 ++++++++++++ .../nextjs/services/database/ecosystemGrants.json | 12 ++++++------ 5 files changed, 28 insertions(+), 28 deletions(-) delete mode 100644 packages/nextjs/components/assets/TwitterIcon.tsx create mode 100644 packages/nextjs/components/assets/XIcon.tsx diff --git a/packages/nextjs/app/_components/EcosystemGrants.tsx b/packages/nextjs/app/_components/EcosystemGrants.tsx index 75148900..96d106ab 100644 --- a/packages/nextjs/app/_components/EcosystemGrants.tsx +++ b/packages/nextjs/app/_components/EcosystemGrants.tsx @@ -1,4 +1,5 @@ import Image from "next/image"; +import XIcon from "~~/components/assets/XIcon"; import { getAllEcosystemGrants } from "~~/services/database/grants"; const EcosystemGrantsCard = ({ @@ -6,13 +7,13 @@ const EcosystemGrantsCard = ({ description, imageLink, amountGranted, - twitterLink, + xLink, }: { title: string; description: string; imageLink: string; amountGranted: string; - twitterLink: string; + xLink: string; }) => { return (
@@ -24,13 +25,13 @@ const EcosystemGrantsCard = ({

{description}

-
+
Amount: {Number(amountGranted).toFixed(2)} ETH
-
- Twitter + +
@@ -58,7 +59,7 @@ export const EcosystemGrants = async () => { description={grant.description} imageLink={grant.imgLink} amountGranted={grant.amountGranted} - twitterLink={grant.twitterLink} + xLink={grant.xLink} /> ))}
diff --git a/packages/nextjs/app/admin/_components/GrantReview.tsx b/packages/nextjs/app/admin/_components/GrantReview.tsx index 6a08ac80..f4772ca4 100644 --- a/packages/nextjs/app/admin/_components/GrantReview.tsx +++ b/packages/nextjs/app/admin/_components/GrantReview.tsx @@ -8,7 +8,7 @@ import { useNetwork } from "wagmi"; import { ArrowTopRightOnSquareIcon, QuestionMarkCircleIcon } from "@heroicons/react/20/solid"; import { PencilSquareIcon } from "@heroicons/react/24/outline"; import TelegramIcon from "~~/components/assets/TelegramIcon"; -import TwitterIcon from "~~/components/assets/TwitterIcon"; +import XIcon from "~~/components/assets/XIcon"; import { Address } from "~~/components/scaffold-eth"; import { useScaffoldContractWrite } from "~~/hooks/scaffold-eth"; import { SocialLinks } from "~~/services/api/sre/schema"; @@ -23,11 +23,11 @@ const BuilderSocials = ({ socialLinks }: { socialLinks?: SocialLinks }) => { {socialLinks?.socialX && ( - + )} {socialLinks?.socialTelegram && ( diff --git a/packages/nextjs/components/assets/TwitterIcon.tsx b/packages/nextjs/components/assets/TwitterIcon.tsx deleted file mode 100644 index 5d4c946d..00000000 --- a/packages/nextjs/components/assets/TwitterIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from "react"; - -const TwitterIcon = (props: React.JSX.IntrinsicAttributes & React.SVGProps) => ( - - Twitter - - -); - -export default TwitterIcon; diff --git a/packages/nextjs/components/assets/XIcon.tsx b/packages/nextjs/components/assets/XIcon.tsx new file mode 100644 index 00000000..ac68516d --- /dev/null +++ b/packages/nextjs/components/assets/XIcon.tsx @@ -0,0 +1,12 @@ +import { SVGProps } from "react"; + +type XIconProps = SVGProps; + +const XIcon = ({ ...props }: XIconProps) => ( + + X + + +); + +export default XIcon; diff --git a/packages/nextjs/services/database/ecosystemGrants.json b/packages/nextjs/services/database/ecosystemGrants.json index 0e82f4ad..7f0ae228 100644 --- a/packages/nextjs/services/database/ecosystemGrants.json +++ b/packages/nextjs/services/database/ecosystemGrants.json @@ -4,42 +4,42 @@ "name": "Jessy's Hacker House", "description": "Jessy is helping the BuidlGuidl find high-impact up-and-coming devs. Our goal is to fund developers on the edge and help them remain free agents to have the most open source impact.", "amountGranted": "0", - "twitterLink": "https://twitter.com/wehack247", + "xLink": "https://x.com/wehack247", "imgLink": "/assets/jessy-hacker-house.png" }, { "name": "Solidity By Example", "description": "Solidity-by-example is the best solidity resource out there. It stays up-to-date and Taz is always adding new examples.", "amountGranted": "13", - "twitterLink": "https://twitter.com/ProgrammerSmart", + "xLink": "https://x.com/ProgrammerSmart", "imgLink": "/assets/solidity-by-example.png" }, { "name": "W1nt3r", "description": "W1nt3r created EVMFromScratch.com and many other engaging onchain apps. He is a model app builder on Ethereum.", "amountGranted": "13", - "twitterLink": "https://x.com/w1nt3r_eth", + "xLink": "https://x.com/w1nt3r_eth", "imgLink": "/assets/w1nt3r-evm.png" } , { "name": "jtriley.eth", "description": "Ether Deck Mk2: A reasonably optimized, extensible smart account.", "amountGranted": "2.262", - "twitterLink": "https://twitter.com/jtriley_eth", + "xLink": "https://x.com/jtriley_eth", "imgLink": "/assets/etherdeck.png" } , { "name": "erhant.eth", "description": "Circomkit is a Circom circuit development & testing toolkit. It provides a simple CLI that abstracts away pathing & setups for SnarkJS commands...", "amountGranted": "2.262", - "twitterLink": "https://twitter.com/0xerhant", + "xLink": "https://x.com/0xerhant", "imgLink": "/assets/circomkit.png" } , { "name": "bytes032.eth", "description": "FindAudit is a public good platform that allows protocols to connect with over 100 auditors/audit firms in less than 48 hours.", "amountGranted": "2.262", - "twitterLink": "https://twitter.com/bytes032", + "xLink": "https://x.com/bytes032", "imgLink": "/assets/findaudit.png" } ] From 2f506efd18a1e829a6ed4810e272049606477c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20S=C3=A1nchez?= Date: Wed, 20 Aug 2025 10:22:10 +0200 Subject: [PATCH 15/15] Remove cohort commented out --- packages/nextjs/app/admin/_components/GrantReview.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/nextjs/app/admin/_components/GrantReview.tsx b/packages/nextjs/app/admin/_components/GrantReview.tsx index f4772ca4..121849fd 100644 --- a/packages/nextjs/app/admin/_components/GrantReview.tsx +++ b/packages/nextjs/app/admin/_components/GrantReview.tsx @@ -164,14 +164,6 @@ export const GrantReview = ({ grant, selected, toggleSelection }: GrantReviewPro {grant.builderData?.batchId?.number && (
Batch #{grant.builderData.batchId?.number}
)} - {/* TODO: Should we add to SRE data? - {grant.builderData?.builderCohort?.map(cohort => { - return ( - -
{cohort.name}
-
- ); - })} */}