diff --git a/apps/web/app/api/passport-oracle/addStrategy/route.ts b/apps/web/app/api/passport-oracle/add-strategy/[chain]/route.ts similarity index 74% rename from apps/web/app/api/passport-oracle/addStrategy/route.ts rename to apps/web/app/api/passport-oracle/add-strategy/[chain]/route.ts index db4425c8d..b2f0de54e 100644 --- a/apps/web/app/api/passport-oracle/addStrategy/route.ts +++ b/apps/web/app/api/passport-oracle/add-strategy/[chain]/route.ts @@ -1,5 +1,6 @@ // api/add-strategy +import { Params } from "next/dist/shared/lib/router/utils/route-matcher"; import { NextResponse } from "next/server"; import { createPublicClient, @@ -19,26 +20,20 @@ import { getViemChain } from "@/utils/web3"; const LIST_MANAGER_PRIVATE_KEY = process.env.LIST_MANAGER_PRIVATE_KEY; -const CHAIN_ID = process.env.CHAIN_ID ? parseInt(process.env.CHAIN_ID) : 1337; const LOCAL_RPC = "http://127.0.0.1:8545"; -const RPC_URL = getConfigByChain(CHAIN_ID)?.rpcUrl ?? LOCAL_RPC; +export async function POST(req: Request, { params }: Params) { + const apiKey = req.headers.get("Authorization"); + const { chain } = params; -const PASSPORT_SCORER_ADDRESS = getConfigByChain(CHAIN_ID) - ?.passportScorer as Address; - -const client = createPublicClient({ - chain: getViemChain(CHAIN_ID), - transport: http(RPC_URL), -}); - -const walletClient = createWalletClient({ - account: privateKeyToAccount(`${LIST_MANAGER_PRIVATE_KEY}` as Address), - chain: getViemChain(CHAIN_ID), - transport: custom(client.transport), -}); + if (apiKey !== process.env.CRON_SECRET) { + console.error("Unauthorized", { + req: req.url, + chain, + }); + return NextResponse.json({ message: "Unauthorized" }, { status: 401 }); + } -export async function POST(req: Request) { const { strategy, threshold } = await req.json(); if (!strategy || !threshold) { @@ -52,6 +47,22 @@ export async function POST(req: Request) { } try { + const RPC_URL = getConfigByChain(chain)?.rpcUrl ?? LOCAL_RPC; + + const PASSPORT_SCORER_ADDRESS = getConfigByChain(chain) + ?.passportScorer as Address; + + const client = createPublicClient({ + chain: getViemChain(chain), + transport: http(RPC_URL), + }); + + const walletClient = createWalletClient({ + account: privateKeyToAccount(`${LIST_MANAGER_PRIVATE_KEY}` as Address), + chain: getViemChain(chain), + transport: custom(client.transport), + }); + // Get registryCommunity address from CVStrategy let registryCommunityAddress: Address; try { diff --git a/apps/web/app/api/passport-oracle/dailyJob/[chain]/route.ts b/apps/web/app/api/passport-oracle/daily-job/[chain]/route.ts similarity index 80% rename from apps/web/app/api/passport-oracle/dailyJob/[chain]/route.ts rename to apps/web/app/api/passport-oracle/daily-job/[chain]/route.ts index 3835aaf95..1374e3d82 100644 --- a/apps/web/app/api/passport-oracle/dailyJob/[chain]/route.ts +++ b/apps/web/app/api/passport-oracle/daily-job/[chain]/route.ts @@ -19,8 +19,11 @@ import { getViemChain } from "@/utils/web3"; const LIST_MANAGER_PRIVATE_KEY = process.env.LIST_MANAGER_PRIVATE_KEY ?? ""; const LOCAL_RPC = "http://127.0.0.1:8545"; +<<<<<<<< HEAD:apps/web/app/api/passport-oracle/dailyJob/[chain]/route.ts const API_ENDPOINT = "/api/passport/scores"; +======== +>>>>>>>> 648e2f64 (:recycle: Refactored daily job route for multi-chain support):apps/web/app/api/passport-oracle/daily-job/[chain]/route.ts interface PassportUser { id: string; @@ -52,12 +55,9 @@ const query = gql` `; const fetchScoresFromService = async (): Promise => { - const url = new URL( - API_ENDPOINT, - `http://${process.env.HOST ?? "localhost"}:${process.env.PORT ?? 3000}`, - ); + const url = `${process.env.VERCEL_URL ? "https://" + process.env.VERCEL_URL : "http://localhost:3000"}/api/passport/scores/`; - const response = await fetch(url.toString(), { + const response = await fetch(url, { method: "GET", headers: { "Content-Type": "application/json", @@ -172,18 +172,35 @@ const updateScores = async (chain: string) => { return updates; }; +<<<<<<<< HEAD:apps/web/app/api/passport-oracle/dailyJob/[chain]/route.ts export async function POST(req: Request, { params }: Params) { +======== +export async function GET(req: Request, { params }: Params) { +>>>>>>>> 648e2f64 (:recycle: Refactored daily job route for multi-chain support):apps/web/app/api/passport-oracle/daily-job/[chain]/route.ts const apiKey = req.headers.get("Authorization"); const { chain } = params; if (apiKey !== process.env.CRON_SECRET) { +<<<<<<<< HEAD:apps/web/app/api/passport-oracle/dailyJob/[chain]/route.ts +======== + console.error("Unauthorized", { + req: req.url, + chain, + }); +>>>>>>>> 648e2f64 (:recycle: Refactored daily job route for multi-chain support):apps/web/app/api/passport-oracle/daily-job/[chain]/route.ts return NextResponse.json({ message: "Unauthorized" }, { status: 401 }); } try { const updates = await updateScores(chain); return NextResponse.json( - { message: "Scores updated successfully", updates }, + { + message: + updates.length ? + "Scores updated successfully" + : "No updates required", + updates, + }, { status: 200 }, ); } catch (error) { diff --git a/apps/web/app/api/passport-oracle/writeScore/route.ts b/apps/web/app/api/passport-oracle/write-score/[chain]/route.ts similarity index 64% rename from apps/web/app/api/passport-oracle/writeScore/route.ts rename to apps/web/app/api/passport-oracle/write-score/[chain]/route.ts index 4718082cb..d7dac210d 100644 --- a/apps/web/app/api/passport-oracle/writeScore/route.ts +++ b/apps/web/app/api/passport-oracle/write-score/[chain]/route.ts @@ -1,5 +1,6 @@ // api/passport-oracle/write-score +import { Params } from "next/dist/shared/lib/router/utils/route-matcher"; import { NextResponse } from "next/server"; import { createPublicClient, @@ -15,33 +16,10 @@ import { CV_PERCENTAGE_SCALE } from "@/utils/numbers"; import { getViemChain } from "@/utils/web3"; const LIST_MANAGER_PRIVATE_KEY = process.env.LIST_MANAGER_PRIVATE_KEY; -const CHAIN_ID = process.env.CHAIN_ID ? parseInt(process.env.CHAIN_ID) : 1337; const LOCAL_RPC = "http://127.0.0.1:8545"; -const RPC_URL = getConfigByChain(CHAIN_ID)?.rpcUrl ?? LOCAL_RPC; - -const CONTRACT_ADDRESS = getConfigByChain(CHAIN_ID)?.passportScorer as Address; - -const API_ENDPOINT = "/api/passport"; - -const client = createPublicClient({ - chain: getViemChain(CHAIN_ID), - transport: http(RPC_URL), -}); - -const walletClient = createWalletClient({ - account: privateKeyToAccount( - (`${LIST_MANAGER_PRIVATE_KEY}` as Address) || "", - ), - chain: getViemChain(CHAIN_ID), - transport: custom(client.transport), -}); - const fetchScoreFromGitcoin = async (user: string) => { - const url = new URL( - API_ENDPOINT, - `http://${process.env.HOST ?? "localhost"}:${process.env.PORT ?? 3000}`, - ); + const url = `${process.env.VERCEL_URL ? "https://" + process.env.VERCEL_URL : "http://localhost:3000"}/api/passport`; const response = await fetch(`${url}/${user}`, { method: "GET", headers: { @@ -58,7 +36,18 @@ const fetchScoreFromGitcoin = async (user: string) => { } }; -export async function POST(req: Request) { +export async function POST(req: Request, { params }: Params) { + const apiKey = req.headers.get("Authorization"); + const { chain } = params; + + if (apiKey !== process.env.CRON_SECRET) { + console.error("Unauthorized", { + req: req.url, + chain, + }); + return NextResponse.json({ message: "Unauthorized" }, { status: 401 }); + } + const { user } = await req.json(); if (!user) { @@ -71,6 +60,23 @@ export async function POST(req: Request) { } try { + const RPC_URL = getConfigByChain(chain)?.rpcUrl ?? LOCAL_RPC; + + const CONTRACT_ADDRESS = getConfigByChain(chain)?.passportScorer as Address; + + const client = createPublicClient({ + chain: getViemChain(chain), + transport: http(RPC_URL), + }); + + const walletClient = createWalletClient({ + account: privateKeyToAccount( + (`${LIST_MANAGER_PRIVATE_KEY}` as Address) || "", + ), + chain: getViemChain(chain), + transport: custom(client.transport), + }); + const score = await fetchScoreFromGitcoin(user); const integerScore = Number(score) * CV_PERCENTAGE_SCALE; const data = { diff --git a/apps/web/app/api/passport/signMessage/route.ts b/apps/web/app/api/passport/sign-message/route.ts similarity index 100% rename from apps/web/app/api/passport/signMessage/route.ts rename to apps/web/app/api/passport/sign-message/route.ts diff --git a/apps/web/app/api/passport/submitPassport/route.ts b/apps/web/app/api/passport/submit-passport/route.ts similarity index 100% rename from apps/web/app/api/passport/submitPassport/route.ts rename to apps/web/app/api/passport/submit-passport/route.ts diff --git a/apps/web/components/CheckPassport.tsx b/apps/web/components/CheckPassport.tsx index 96805ef82..fd3560e0d 100644 --- a/apps/web/components/CheckPassport.tsx +++ b/apps/web/components/CheckPassport.tsx @@ -11,6 +11,7 @@ import { import { Button } from "./Button"; import { Modal } from "@/components"; import { isProd } from "@/configs/isProd"; +import { useChainIdFromPath } from "@/hooks/useChainIdFromPath"; import { useSubgraphQuery } from "@/hooks/useSubgraphQuery"; import { CV_PERCENTAGE_SCALE } from "@/utils/numbers"; @@ -39,6 +40,7 @@ export function CheckPassport({ const [score, setScore] = useState(0); const [shouldOpenModal, setShouldOpenModal] = useState(false); const [isSubmiting, setIsSubmiting] = useState(false); + const chainFromPath = useChainIdFromPath(); //pool threshold should be ready on! @@ -157,7 +159,7 @@ export function CheckPassport({ const submitPassport = async ( address: string, ): Promise => { - const SUBMIT_SIGNED_PASSPORT_URI = "/api/passport/submitPassport"; + const SUBMIT_SIGNED_PASSPORT_URI = "/api/passport/submit-passport"; try { const response = await fetch(SUBMIT_SIGNED_PASSPORT_URI, { @@ -187,7 +189,7 @@ export function CheckPassport({ }; const writeScorer = async (address: string): Promise => { - const WRITE_SCORER_URI = "/api/passport-oracle/writeScore"; + const WRITE_SCORER_URI = `/api/passport-oracle/writeScore/${chainFromPath}`; try { const response = await fetch(WRITE_SCORER_URI, { method: "POST", diff --git a/apps/web/components/Forms/PoolForm.tsx b/apps/web/components/Forms/PoolForm.tsx index 47c62cdb7..619a4f7ee 100644 --- a/apps/web/components/Forms/PoolForm.tsx +++ b/apps/web/components/Forms/PoolForm.tsx @@ -412,7 +412,7 @@ export function PoolForm({ token, communityAddr }: Props) { >["args"], ) => { try { - const res = await fetch("/api/passport-oracle/addStrategy", { + const res = await fetch(`/api/passport-oracle/addStrategy/${chain.id}`, { method: "POST", body: JSON.stringify({ strategy: newPoolData._strategy, diff --git a/apps/web/components/SubmitPassport.tsx b/apps/web/components/SubmitPassport.tsx index addd26556..64a425631 100644 --- a/apps/web/components/SubmitPassport.tsx +++ b/apps/web/components/SubmitPassport.tsx @@ -3,6 +3,7 @@ import React from "react"; import { toast } from "react-toastify"; import { useAccount } from "wagmi"; import { Button } from "@/components/"; +import { useChainIdFromPath } from "@/hooks/useChainIdFromPath"; interface SubmitPassportResponse { data: any; @@ -11,11 +12,12 @@ interface SubmitPassportResponse { export function SubmitPassport() { const { address: connectedAccount } = useAccount(); + const chainFromPath = useChainIdFromPath(); const submitPassport = async ( address: string, ): Promise => { - const SUBMIT_SIGNED_PASSPORT_URI = "/api/passport/submitPassport"; + const SUBMIT_SIGNED_PASSPORT_URI = "/api/passport/submit-passport"; try { const response = await fetch(SUBMIT_SIGNED_PASSPORT_URI, { @@ -47,7 +49,7 @@ export function SubmitPassport() { }; const writeScorer = async (address: string, score: string): Promise => { - const WRITE_SCORER_URI = "/api/passport-oracle/writeScore"; + const WRITE_SCORER_URI = `/api/passport-oracle/writeScore/${chainFromPath}`; try { const response = await fetch(WRITE_SCORER_URI, { diff --git a/turbo.json b/turbo.json index 9b9df7e83..9510a5e05 100644 --- a/turbo.json +++ b/turbo.json @@ -32,11 +32,9 @@ "SCORER_ID", "PASSPORT_SCORER_ADDRESS", "LIST_MANAGER_PRIVATE_KEY", - "CHAIN_ID", "NODE_ENV", "NEXT_ABLY_API_KEY", - "HOST", - "PORT", + "VERCEL_URL", "NEXT_PUBLIC_ENV_GARDENS", "NEXT_RUNTIME", "NEXT_PUBLIC_SENTRY_DSN",