diff --git a/src/data/db/find.ts b/src/data/db/find.ts index 398a936..8ca1f6c 100644 --- a/src/data/db/find.ts +++ b/src/data/db/find.ts @@ -1,6 +1,6 @@ import { PrismaClient } from '@prisma/client'; import { MessageI, RoomI } from 'discreetly-interfaces'; -import { ClaimCodeI, GateWayIdentityI } from '../../types/'; +import { ClaimCodeI, GateWayIdentityI, Jubmojis } from '../../types/'; const prisma = new PrismaClient(); /** @@ -155,11 +155,15 @@ export async function findRoomWithMessageId( } export async function findAllJubmojiNullifiers() { - const jubmojiNullifiers = await prisma.gateWayIdentity.findMany({ + const jubmojiNullifiers: Jubmojis[] = await prisma.gateWayIdentity.findMany({ select: { jubmoji: true } }) + const usedSigNullifiers: string[] = []; - return jubmojiNullifiers; + jubmojiNullifiers.forEach((nullifier) => { + usedSigNullifiers.push(...nullifier.jubmoji as string[]); + }); + return usedSigNullifiers } diff --git a/src/endpoints/gateways/jubmojis.ts b/src/endpoints/gateways/jubmojis.ts index 526820d..3332a12 100644 --- a/src/endpoints/gateways/jubmojis.ts +++ b/src/endpoints/gateways/jubmojis.ts @@ -8,6 +8,7 @@ import { RoomI } from 'discreetly-interfaces'; import { jubmojiVerifier } from '../../gateways/jubmojis/jubmoji'; import { JubmojiRequestI } from '../../gateways/jubmojis/jubmoji.types'; + const router = express.Router(); const prisma = new PrismaClient(); diff --git a/src/gateways/jubmojis/jubmoji.ts b/src/gateways/jubmojis/jubmoji.ts index 517d018..b199236 100644 --- a/src/gateways/jubmojis/jubmoji.ts +++ b/src/gateways/jubmojis/jubmoji.ts @@ -13,6 +13,7 @@ import { VerificationResult, VerifyArgs, ZKP, ZKPPublicSignals } from './jubmoji import { hexToBigInt } from './utils'; import vkey from './vkey'; import { cardPubKeys } from './pubkeys'; +import { findAllJubmojiNullifiers } from '../../data/db'; export async function jubmojiVerifier(serializedMembershipProof): Promise { const merkleRoot = await getMerkleRootFromCache(collectionPubKeys); @@ -61,9 +62,12 @@ const verifyMembership = async ({ return { verified: false }; } // TODO! This is where we need to check and make sure someone can't join more than once - // if (usedSigNullifiers && usedSigNullifiers.includes(publicSignals.sigNullifier)) { - // return { verified: false }; - // } + + const usedSigNullifiers: string[] = await findAllJubmojiNullifiers(); + + if (usedSigNullifiers && usedSigNullifiers.includes(String(publicSignals.sigNullifier))) { + return { verified: false }; + } const verified = await verifyMembershipZKP(vkey, proof.zkp); if (!verified) { return { verified: false }; diff --git a/src/types/index.ts b/src/types/index.ts index 7c096c3..ff11fab 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -67,3 +67,7 @@ export interface addRoomData { admin?: boolean; discordIds?: string[]; } + +export interface Jubmojis { + jubmoji: any[]; +}