From 0f4d0bd94b90fcb147feb18effb0beab46f85328 Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 12 Jul 2023 19:43:35 +0200 Subject: [PATCH] fix: error improvement transfor AuthType and ClaimType to labels --- package.json | 4 +- packages/common/types.ts | 288 +++++++++--------- packages/sismo-connect-client/jest.config.ts | 6 +- .../sismo-connect-client/src/common-types.ts | 16 + .../tests/request-builder.test.ts | 30 +- .../tests/sismo-connect.test.ts | 74 ++--- packages/sismo-connect-server/jest.config.ts | 6 +- packages/sismo-connect-server/jest.setup.ts | 2 +- .../sismo-connect-server/src/common-types.ts | 16 + .../hydra-verifiers/hydra-verifier.ts | 5 +- .../src/verifier/verifier.ts | 22 +- .../tests/hydras3-verifier-mocked.ts | 12 +- .../tests/hydras3-verifier.test.ts | 8 +- packages/sismo-connect-server/tests/mocks.ts | 87 +++--- .../tests/sismo-connect-e2e.test.ts | 19 +- .../tests/utils/updateProofDataInput.ts | 15 +- 16 files changed, 336 insertions(+), 274 deletions(-) diff --git a/package.json b/package.json index ef4dcc6..aecdd4f 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "prepare:client": "cd ./packages/sismo-connect-client && yarn", "prepare:server": "cd ./packages/sismo-connect-server && yarn", "eslint": "eslint --max-warnings=0", - "prettier": "prettier --write 'packages/**/src/**/*.ts'", - "prettier:check": "prettier --check 'packages/**/src/**/*.ts'", + "prettier": "prettier --write 'packages/**/*.ts'", + "prettier:check": "prettier --check 'packages/**/*.ts'", "test": "yarn test:client && yarn test:server", "test:client": "cd ./packages/sismo-connect-client && yarn test", "test:server": "cd ./packages/sismo-connect-server && yarn test" diff --git a/packages/common/types.ts b/packages/common/types.ts index a995f1d..1a52037 100644 --- a/packages/common/types.ts +++ b/packages/common/types.ts @@ -3,38 +3,38 @@ import { BigNumberish } from "@ethersproject/bignumber"; export const SISMO_CONNECT_VERSION = `sismo-connect-v1.1`; export type SismoConnectRequest = { - namespace?: string - auths?: AuthRequest[] - claims?: ClaimRequest[] - signature?: SignatureRequest + namespace?: string; + auths?: AuthRequest[]; + claims?: ClaimRequest[]; + signature?: SignatureRequest; - callbackPath?: string - version: string -} + callbackPath?: string; + version: string; +}; export type SignatureRequest = { - message: string - isSelectableByUser?: boolean - extraData?: any -} + message: string; + isSelectableByUser?: boolean; + extraData?: any; +}; export enum Vault { - Main = 'main', - Dev = 'dev', - Demo = 'demo', + Main = "main", + Dev = "dev", + Demo = "demo", } export type SismoConnectConfig = { - appId: string - vault?: VaultConfig // default Vault.Main - displayRawResponse?: boolean // - sismoApiUrl?: string // api to fetch group informations, prod API by default - vaultAppBaseUrl?: string // here for debugging purposes, determined by vaultEnv field if not specified -} + appId: string; + vault?: VaultConfig; // default Vault.Main + displayRawResponse?: boolean; // + sismoApiUrl?: string; // api to fetch group informations, prod API by default + vaultAppBaseUrl?: string; // here for debugging purposes, determined by vaultEnv field if not specified +}; export type VaultConfig = { - impersonate: string[] -} + impersonate: string[]; +}; export enum ProvingScheme { HYDRA_S2 = "hydra-s2.1", @@ -49,6 +49,14 @@ export enum ClaimType { LTE, } +export const claimTypeLabels: { [claimType in ClaimType]: string } = { + [ClaimType.GTE]: "GTE", + [ClaimType.GT]: "GT", + [ClaimType.EQ]: "EQ", + [ClaimType.LT]: "LT", + [ClaimType.LTE]: "LTE", +}; + export enum AuthType { VAULT, GITHUB, @@ -57,224 +65,216 @@ export enum AuthType { TELEGRAM, } -export type SismoConnectResponse = Pick< - SismoConnectRequest, - 'namespace' | 'version' -> & { - appId: string - signedMessage?: string - proofs: SismoConnectProof[] -} +export const authTypeLabels: { [authType in AuthType]: string } = { + [AuthType.VAULT]: "Vault", + [AuthType.GITHUB]: "Github", + [AuthType.TWITTER]: "Twitter", + [AuthType.EVM_ACCOUNT]: "EVM Account", + [AuthType.TELEGRAM]: "Telegram", +}; + +export type SismoConnectResponse = Pick & { + appId: string; + signedMessage?: string; + proofs: SismoConnectProof[]; +}; export type SismoConnectProof = { - auths?: Auth[] - claims?: Claim[] - provingScheme: string - proofData: string - extraData: any -} + auths?: Auth[]; + claims?: Claim[]; + provingScheme: string; + proofData: string; + extraData: any; +}; export type AuthRequest = { - authType: AuthType - isAnon?: boolean //false - userId?: string - isOptional?: boolean - isSelectableByUser?: boolean - extraData?: any -} + authType: AuthType; + isAnon?: boolean; //false + userId?: string; + isOptional?: boolean; + isSelectableByUser?: boolean; + extraData?: any; +}; -export type Auth = Omit +export type Auth = Omit; export type ClaimRequest = { - claimType?: ClaimType - groupId?: string - groupTimestamp?: number | 'latest' - value?: number + claimType?: ClaimType; + groupId?: string; + groupTimestamp?: number | "latest"; + value?: number; - isOptional?: boolean - isSelectableByUser?: boolean + isOptional?: boolean; + isSelectableByUser?: boolean; - extraData?: any -} + extraData?: any; +}; -export type Claim = Omit +export type Claim = Omit; export type VerifiedClaim = Claim & { - proofId: string - proofData: string -} + proofId: string; + proofData: string; +}; export type VerifiedAuth = Auth & { - proofData: string -} + proofData: string; +}; export class SismoConnectVerifiedResult { - public auths: VerifiedAuth[] - public claims: VerifiedClaim[] - public signedMessage: string | undefined - public response: SismoConnectResponse + public auths: VerifiedAuth[]; + public claims: VerifiedClaim[]; + public signedMessage: string | undefined; + public response: SismoConnectResponse; constructor({ response, claims, auths, }: { - response: SismoConnectResponse - claims: VerifiedClaim[] - auths: VerifiedAuth[] + response: SismoConnectResponse; + claims: VerifiedClaim[]; + auths: VerifiedAuth[]; }) { - this.response = response - this.claims = claims - this.auths = auths - this.signedMessage = response.signedMessage + this.response = response; + this.claims = claims; + this.auths = auths; + this.signedMessage = response.signedMessage; } public getUserId(authType: AuthType): string | undefined { - const userId = this.auths.find( - (verifiedAuth) => verifiedAuth.authType === authType - )?.userId - return resolveSismoIdentifier(userId, authType) + const userId = this.auths.find((verifiedAuth) => verifiedAuth.authType === authType)?.userId; + return resolveSismoIdentifier(userId, authType); } public getUserIds(authType: AuthType): string[] { return this.auths - .filter( - (verifiedAuth) => - verifiedAuth.authType === authType && verifiedAuth.userId - ) - .map((auth) => resolveSismoIdentifier(auth.userId, authType)) as string[] + .filter((verifiedAuth) => verifiedAuth.authType === authType && verifiedAuth.userId) + .map((auth) => resolveSismoIdentifier(auth.userId, authType)) as string[]; } public getSignedMessage(): string | undefined { - return this.signedMessage + return this.signedMessage; } } const startsWithHexadecimal = (str) => { - let hexRegex = /^0x[0-9a-fA-F]{6}/ - return hexRegex.test(str) -} + let hexRegex = /^0x[0-9a-fA-F]{6}/; + return hexRegex.test(str); +}; -export const resolveSismoIdentifier = ( - sismoIdentifier: string, - authType: AuthType -) => { - if (authType === AuthType.EVM_ACCOUNT || authType === AuthType.VAULT) - return sismoIdentifier - if (!startsWithHexadecimal(sismoIdentifier)) return sismoIdentifier +export const resolveSismoIdentifier = (sismoIdentifier: string, authType: AuthType) => { + if (authType === AuthType.EVM_ACCOUNT || authType === AuthType.VAULT) return sismoIdentifier; + if (!startsWithHexadecimal(sismoIdentifier)) return sismoIdentifier; const removeLeadingZeros = (str) => { - let arr = str.split('') - while (arr.length > 1 && arr[0] === '0') { - arr.shift() + let arr = str.split(""); + while (arr.length > 1 && arr[0] === "0") { + arr.shift(); } - return arr.join('') - } - sismoIdentifier = sismoIdentifier.substring(6) - sismoIdentifier = removeLeadingZeros(sismoIdentifier) - return sismoIdentifier -} + return arr.join(""); + }; + sismoIdentifier = sismoIdentifier.substring(6); + sismoIdentifier = removeLeadingZeros(sismoIdentifier); + return sismoIdentifier; +}; export const toSismoIdentifier = (identifier: string, authType: AuthType) => { - if (authType === AuthType.EVM_ACCOUNT || authType === AuthType.VAULT) - return identifier - if (startsWithHexadecimal(identifier)) return identifier + if (authType === AuthType.EVM_ACCOUNT || authType === AuthType.VAULT) return identifier; + if (startsWithHexadecimal(identifier)) return identifier; - let prefix = '' + let prefix = ""; if (authType === AuthType.GITHUB) { - prefix = '0x1001' + prefix = "0x1001"; } if (authType === AuthType.TWITTER) { - prefix = '0x1002' + prefix = "0x1002"; } if (authType === AuthType.TELEGRAM) { - prefix = '0x1003' + prefix = "0x1003"; } - identifier = '0'.repeat(36 - identifier.length) + identifier - identifier = prefix + identifier - return identifier -} + identifier = "0".repeat(36 - identifier.length) + identifier; + identifier = prefix + identifier; + return identifier; +}; export class RequestBuilder { static buildAuths(auths: AuthRequest[] | AuthRequest): AuthRequest[] { if (!auths) { - return [] + return []; } if (!(auths as any).length) { - auths = [auths as AuthRequest] + auths = [auths as AuthRequest]; } - auths = auths as AuthRequest[] + auths = auths as AuthRequest[]; for (let authRequest of auths) { - if (authRequest.isAnon) throw new Error('isAnon not supported yet') + if (authRequest.isAnon) throw new Error("isAnon not supported yet"); if (typeof authRequest.authType === undefined) { - throw new Error('you must provide a authType') + throw new Error("you must provide a authType"); } - authRequest.isAnon = false - authRequest.isOptional = authRequest.isOptional ?? false - authRequest.userId = authRequest.userId ?? '0' - authRequest.extraData = authRequest.extraData ?? '' + authRequest.isAnon = false; + authRequest.isOptional = authRequest.isOptional ?? false; + authRequest.userId = authRequest.userId ?? "0"; + authRequest.extraData = authRequest.extraData ?? ""; - if (authRequest.userId === '0') { - authRequest.isSelectableByUser = authRequest.isSelectableByUser ?? true + if (authRequest.userId === "0") { + authRequest.isSelectableByUser = authRequest.isSelectableByUser ?? true; } else { - authRequest.isSelectableByUser = false + authRequest.isSelectableByUser = false; } if (authRequest.authType === AuthType.VAULT) { - authRequest.isSelectableByUser = false - authRequest.userId = '0' + authRequest.isSelectableByUser = false; + authRequest.userId = "0"; } - if (authRequest.userId !== '0') { - authRequest.userId = toSismoIdentifier( - authRequest.userId, - authRequest.authType - ) + if (authRequest.userId !== "0") { + authRequest.userId = toSismoIdentifier(authRequest.userId, authRequest.authType); } } - return auths + return auths; } static buildClaims(claims: ClaimRequest[] | ClaimRequest): ClaimRequest[] { if (!claims) { - return [] + return []; } if ((claims as ClaimRequest)?.groupId) { - claims = [claims as ClaimRequest] + claims = [claims as ClaimRequest]; } - claims = claims as AuthRequest[] + claims = claims as AuthRequest[]; for (let claimRequest of claims) { if (typeof claimRequest.claimType === undefined) { - throw new Error('you must provide a claimType') + throw new Error("you must provide a claimType"); } if (typeof claimRequest.groupId === undefined) { - throw new Error('you must provide a groupId') + throw new Error("you must provide a groupId"); } - claimRequest.claimType = claimRequest.claimType ?? ClaimType.GTE - claimRequest.extraData = claimRequest.extraData ?? '' - claimRequest.groupTimestamp = claimRequest.groupTimestamp ?? 'latest' - claimRequest.value = claimRequest.value ?? 1 + claimRequest.claimType = claimRequest.claimType ?? ClaimType.GTE; + claimRequest.extraData = claimRequest.extraData ?? ""; + claimRequest.groupTimestamp = claimRequest.groupTimestamp ?? "latest"; + claimRequest.value = claimRequest.value ?? 1; } - return claims + return claims; } static buildSignature(signature: SignatureRequest) { if (!signature) { - return null + return null; } if (typeof signature.message === undefined) { - throw new Error('you must provide a message') + throw new Error("you must provide a message"); } - signature.isSelectableByUser = signature.isSelectableByUser ?? false - signature.extraData = signature.extraData ?? '' + signature.isSelectableByUser = signature.isSelectableByUser ?? false; + signature.extraData = signature.extraData ?? ""; - return signature + return signature; } } diff --git a/packages/sismo-connect-client/jest.config.ts b/packages/sismo-connect-client/jest.config.ts index aedfa1f..c46fb9d 100644 --- a/packages/sismo-connect-client/jest.config.ts +++ b/packages/sismo-connect-client/jest.config.ts @@ -1,6 +1,6 @@ -import type {Config} from '@jest/types'; +import type { Config } from "@jest/types"; const config: Config.InitialOptions = { - preset: "ts-jest" + preset: "ts-jest", }; -export default config; \ No newline at end of file +export default config; diff --git a/packages/sismo-connect-client/src/common-types.ts b/packages/sismo-connect-client/src/common-types.ts index 64c1784..1a52037 100644 --- a/packages/sismo-connect-client/src/common-types.ts +++ b/packages/sismo-connect-client/src/common-types.ts @@ -49,6 +49,14 @@ export enum ClaimType { LTE, } +export const claimTypeLabels: { [claimType in ClaimType]: string } = { + [ClaimType.GTE]: "GTE", + [ClaimType.GT]: "GT", + [ClaimType.EQ]: "EQ", + [ClaimType.LT]: "LT", + [ClaimType.LTE]: "LTE", +}; + export enum AuthType { VAULT, GITHUB, @@ -57,6 +65,14 @@ export enum AuthType { TELEGRAM, } +export const authTypeLabels: { [authType in AuthType]: string } = { + [AuthType.VAULT]: "Vault", + [AuthType.GITHUB]: "Github", + [AuthType.TWITTER]: "Twitter", + [AuthType.EVM_ACCOUNT]: "EVM Account", + [AuthType.TELEGRAM]: "Telegram", +}; + export type SismoConnectResponse = Pick & { appId: string; signedMessage?: string; diff --git a/packages/sismo-connect-client/tests/request-builder.test.ts b/packages/sismo-connect-client/tests/request-builder.test.ts index 74c8c09..e381e87 100644 --- a/packages/sismo-connect-client/tests/request-builder.test.ts +++ b/packages/sismo-connect-client/tests/request-builder.test.ts @@ -1,22 +1,18 @@ -import { resolveSismoIdentifier } from '../src/common-types'; -import { AuthType } from '../src/common-types'; +import { resolveSismoIdentifier } from "../src/common-types"; +import { AuthType } from "../src/common-types"; -describe('RequestBuilder', () => { - describe('resolveSismoIdentifier', () => { - it('should resolve the right identifier', () => { - const identifier = "0x00010000000000123"; - const sismoIdentifier = resolveSismoIdentifier(identifier, AuthType.GITHUB); - expect(sismoIdentifier).toEqual( - `123` - ) +describe("RequestBuilder", () => { + describe("resolveSismoIdentifier", () => { + it("should resolve the right identifier", () => { + const identifier = "0x00010000000000123"; + const sismoIdentifier = resolveSismoIdentifier(identifier, AuthType.GITHUB); + expect(sismoIdentifier).toEqual(`123`); }); - it('should keep the same identifier', () => { - const identifier = "123"; - const sismoIdentifier = resolveSismoIdentifier(identifier, AuthType.GITHUB); - expect(sismoIdentifier).toEqual( - `123` - ) + it("should keep the same identifier", () => { + const identifier = "123"; + const sismoIdentifier = resolveSismoIdentifier(identifier, AuthType.GITHUB); + expect(sismoIdentifier).toEqual(`123`); }); }); -}); \ No newline at end of file +}); diff --git a/packages/sismo-connect-client/tests/sismo-connect.test.ts b/packages/sismo-connect-client/tests/sismo-connect.test.ts index bef2507..59bf035 100644 --- a/packages/sismo-connect-client/tests/sismo-connect.test.ts +++ b/packages/sismo-connect-client/tests/sismo-connect.test.ts @@ -1,74 +1,74 @@ -import { - ClaimRequest, - SismoConnect, - SismoConnectClient, - SismoConnectConfig, -} from '../src' +import { ClaimRequest, SismoConnect, SismoConnectClient, SismoConnectConfig } from "../src"; -describe('Sismo Connect Client', () => { - let appId: string - let groupId: string - let claim: ClaimRequest - let config: SismoConnectConfig +describe("Sismo Connect Client", () => { + let appId: string; + let groupId: string; + let claim: ClaimRequest; + let config: SismoConnectConfig; - let sismoConnect: SismoConnectClient + let sismoConnect: SismoConnectClient; beforeAll(() => { - appId = '0xf68985adfc209fafebfb1a956913e7fa' - groupId = '0x682544d549b8a461d7fe3e589846bb7b' + appId = "0xf68985adfc209fafebfb1a956913e7fa"; + groupId = "0x682544d549b8a461d7fe3e589846bb7b"; config = { appId, - } + }; claim = { - groupId: '0x1', - } + groupId: "0x1", + }; - sismoConnect = SismoConnect({config}) - }) + sismoConnect = SismoConnect({ config }); + }); - it('should generate a request link', async () => { + it("should generate a request link", async () => { expect( sismoConnect.getRequestLink({ claims: [claim], }) ).toEqual( `https://vault-beta.sismo.io/connect?version=sismo-connect-v1.1&appId=0xf68985adfc209fafebfb1a956913e7fa&claims=[{\"groupId\":\"0x1\",\"claimType\":0,\"extraData\":\"\",\"groupTimestamp\":\"latest\",\"value\":1}]&compressed=true` - ) - }) + ); + }); - it('should generate a request link with a namespace', async () => { + it("should generate a request link with a namespace", async () => { expect( sismoConnect.getRequestLink({ claims: [claim], - namespace: 'my-namespace', + namespace: "my-namespace", }) ).toEqual( `https://vault-beta.sismo.io/connect?version=sismo-connect-v1.1&appId=0xf68985adfc209fafebfb1a956913e7fa&claims=[{\"groupId\":\"0x1\",\"claimType\":0,\"extraData\":\"\",\"groupTimestamp\":\"latest\",\"value\":1}]&namespace=my-namespace&compressed=true` - ) - }) + ); + }); - it('should generate a request link with a callbackPath', async () => { + it("should generate a request link with a callbackPath", async () => { expect( sismoConnect.getRequestLink({ claims: [claim], - callbackPath: '/my-callback-path', + callbackPath: "/my-callback-path", }) ).toEqual( `https://vault-beta.sismo.io/connect?version=sismo-connect-v1.1&appId=0xf68985adfc209fafebfb1a956913e7fa&claims=[{\"groupId\":\"0x1\",\"claimType\":0,\"extraData\":\"\",\"groupTimestamp\":\"latest\",\"value\":1}]&callbackPath=/my-callback-path&compressed=true` - ) - }) + ); + }); - it('should generate a request link with impersonated addresses', async () => { - sismoConnect = SismoConnect({config: {appId, vault: { - impersonate: ['0x123', '0x345'] - }}}) + it("should generate a request link with impersonated addresses", async () => { + sismoConnect = SismoConnect({ + config: { + appId, + vault: { + impersonate: ["0x123", "0x345"], + }, + }, + }); expect( sismoConnect.getRequestLink({ claims: [claim], }) ).toEqual( `https://vault-beta.sismo.io/connect?version=sismo-connect-v1.1&appId=0xf68985adfc209fafebfb1a956913e7fa&claims=[{\"groupId\":\"0x1\",\"claimType\":0,\"extraData\":\"\",\"groupTimestamp\":\"latest\",\"value\":1}]&vault={\"impersonate\":[\"0x123\",\"0x345\"]}&compressed=true` - ) - }) -}) + ); + }); +}); diff --git a/packages/sismo-connect-server/jest.config.ts b/packages/sismo-connect-server/jest.config.ts index 9cd3735..a949084 100644 --- a/packages/sismo-connect-server/jest.config.ts +++ b/packages/sismo-connect-server/jest.config.ts @@ -1,8 +1,8 @@ -import type {Config} from '@jest/types'; +import type { Config } from "@jest/types"; const config: Config.InitialOptions = { testEnvironment: "node", preset: "ts-jest", - setupFilesAfterEnv: ['./jest.setup.ts'], + setupFilesAfterEnv: ["./jest.setup.ts"], }; -export default config; \ No newline at end of file +export default config; diff --git a/packages/sismo-connect-server/jest.setup.ts b/packages/sismo-connect-server/jest.setup.ts index 56bdf55..b5062b8 100644 --- a/packages/sismo-connect-server/jest.setup.ts +++ b/packages/sismo-connect-server/jest.setup.ts @@ -1 +1 @@ -jest.setTimeout(10000); \ No newline at end of file +jest.setTimeout(10000); diff --git a/packages/sismo-connect-server/src/common-types.ts b/packages/sismo-connect-server/src/common-types.ts index 64c1784..1a52037 100644 --- a/packages/sismo-connect-server/src/common-types.ts +++ b/packages/sismo-connect-server/src/common-types.ts @@ -49,6 +49,14 @@ export enum ClaimType { LTE, } +export const claimTypeLabels: { [claimType in ClaimType]: string } = { + [ClaimType.GTE]: "GTE", + [ClaimType.GT]: "GT", + [ClaimType.EQ]: "EQ", + [ClaimType.LT]: "LT", + [ClaimType.LTE]: "LTE", +}; + export enum AuthType { VAULT, GITHUB, @@ -57,6 +65,14 @@ export enum AuthType { TELEGRAM, } +export const authTypeLabels: { [authType in AuthType]: string } = { + [AuthType.VAULT]: "Vault", + [AuthType.GITHUB]: "Github", + [AuthType.TWITTER]: "Twitter", + [AuthType.EVM_ACCOUNT]: "EVM Account", + [AuthType.TELEGRAM]: "Telegram", +}; + export type SismoConnectResponse = Pick & { appId: string; signedMessage?: string; diff --git a/packages/sismo-connect-server/src/verifier/hydra-verifiers/hydra-verifier.ts b/packages/sismo-connect-server/src/verifier/hydra-verifiers/hydra-verifier.ts index 7de16a3..29c5d7a 100644 --- a/packages/sismo-connect-server/src/verifier/hydra-verifiers/hydra-verifier.ts +++ b/packages/sismo-connect-server/src/verifier/hydra-verifiers/hydra-verifier.ts @@ -23,6 +23,7 @@ import { SismoConnectProof, VerifiedAuth, VerifiedClaim, + claimTypeLabels, resolveSismoIdentifier, } from "../../common-types"; import { SNARK_FIELD } from "@sismo-core/hydra-s3"; @@ -345,7 +346,9 @@ export abstract class HydraVerifier { const claimTypeFromProof = claim.claimType === ClaimType.EQ; if (claimTypFromInput !== claimTypeFromProof) { throw new Error( - `on proofId "${proofIdentifier}" claimType "${claim.claimType}" mismatch with proof input claimType "${claimTypFromInput}"` + `on proofId "${proofIdentifier}" claimType "${ + claimTypeLabels[claim.claimType] + }" mismatch with proof input claimType "${claimTypeLabels[proofPublicInputs.claimType]}"` ); } diff --git a/packages/sismo-connect-server/src/verifier/verifier.ts b/packages/sismo-connect-server/src/verifier/verifier.ts index 28998dc..62e8b50 100644 --- a/packages/sismo-connect-server/src/verifier/verifier.ts +++ b/packages/sismo-connect-server/src/verifier/verifier.ts @@ -10,6 +10,8 @@ import { SignatureRequest, SismoConnectProof, AuthType, + authTypeLabels, + claimTypeLabels, } from "../common-types"; import { GNOSIS_AVAILABLE_ROOTS_REGISTRY_ADDRESS } from "../constants"; import { @@ -131,7 +133,11 @@ export class SismoConnectVerifier { }); if (!proofFounded) { throw new Error( - `A required proof is missing for the claimRequest with groupId ${claimRequest.groupId}, groupTimestamp ${claimRequest.groupTimestamp} and claimType ${claimRequest.claimType}` + `A required proof is missing for the claimRequest with groupId ${ + claimRequest.groupId + }, groupTimestamp ${claimRequest.groupTimestamp} and claimType ${ + claimTypeLabels[claimRequest.claimType] + }` ); } } @@ -162,7 +168,9 @@ export class SismoConnectVerifier { }); if (!proofFounded) { throw new Error( - `A required proof is missing for the authRequest with authType ${authRequest.authType}` + `A required proof is missing for the authRequest with authType ${ + authTypeLabels[authRequest.authType] + }` ); } } @@ -231,14 +239,16 @@ export class SismoConnectVerifier { if (!claimRequest) { throw new Error( - `No claimRequest found for groupId ${groupId}, groupTimestamp ${groupTimestamp} and claimType ${claimType}` + `No claimRequest found for groupId ${groupId}, groupTimestamp ${groupTimestamp} and claimType ${claimTypeLabels[claimType]}` ); } const requestedClaimType = claimRequest.claimType; if (requestedClaimType !== claim.claimType) { throw new Error( - `The proof claimType ${claim.claimType} does not match the requested claimType ${requestedClaimType}` + `The proof claimType ${ + claimTypeLabels[claim.claimType] + } does not match the requested claimType ${claimTypeLabels[requestedClaimType]}` ); } const requestedValue = claimRequest.value; @@ -305,7 +315,9 @@ export class SismoConnectVerifier { }); if (!authRequest) { - throw new Error(`No authRequest found for authType ${authType} and isAnon ${isAnon}`); + throw new Error( + `No authRequest found for authType ${authTypeLabels[authType]} and isAnon ${isAnon}` + ); } const requestedUserId = authRequest.userId; if (requestedUserId !== "0") { diff --git a/packages/sismo-connect-server/tests/hydras3-verifier-mocked.ts b/packages/sismo-connect-server/tests/hydras3-verifier-mocked.ts index d85e0b5..ca06d90 100644 --- a/packages/sismo-connect-server/tests/hydras3-verifier-mocked.ts +++ b/packages/sismo-connect-server/tests/hydras3-verifier-mocked.ts @@ -9,15 +9,13 @@ type VerifierMockedParams = { export class HydraS3VerifierMocked extends HydraS3Verifier { constructor(mockedParams: VerifierMockedParams) { - const provider = new JsonRpcProviderMock() - const availableRootsRegistry = new AvailableRootsRegistryContractMock(true) - const pubKeysAsStrings = mockedParams.commitmentMapperPubKey.map((x) => - x.toHexString() - ) + const provider = new JsonRpcProviderMock(); + const availableRootsRegistry = new AvailableRootsRegistryContractMock(true); + const pubKeysAsStrings = mockedParams.commitmentMapperPubKey.map((x) => x.toHexString()); super({ provider, availableRootsRegistry, - commitmentMapperPubKeys: [pubKeysAsStrings[0], pubKeysAsStrings[1]] - }) + commitmentMapperPubKeys: [pubKeysAsStrings[0], pubKeysAsStrings[1]], + }); } } diff --git a/packages/sismo-connect-server/tests/hydras3-verifier.test.ts b/packages/sismo-connect-server/tests/hydras3-verifier.test.ts index a826b48..1683621 100644 --- a/packages/sismo-connect-server/tests/hydras3-verifier.test.ts +++ b/packages/sismo-connect-server/tests/hydras3-verifier.test.ts @@ -8,6 +8,7 @@ import { AuthType, AuthRequest, VerifiedAuth, + claimTypeLabels, } from "../src"; import { decodeProofData, encodeProofData } from "../src/verifier/utils/proofData"; import { ethers } from "ethers"; @@ -209,13 +210,14 @@ describe("HydraS3 Verifier test", () => { invalidProof.claims = invalidProof.claims as ClaimRequest[]; invalidProof.claims[0].claimType = ClaimType.EQ; - const claimTypeFromInput = claimProofPublicInputs.claimType === "0"; await expectVerifyClaimToThrow( invalidProof, `on proofId "${proofIdentifier}" claimType "${ - invalidProof.claims[0].claimType - }" mismatch with proof input claimType "${!claimTypeFromInput}"` + claimTypeLabels[invalidProof.claims[0].claimType] + }" mismatch with proof input claimType "${ + claimTypeLabels[claimProofPublicInputs.claimType] + }"` ); }); diff --git a/packages/sismo-connect-server/tests/mocks.ts b/packages/sismo-connect-server/tests/mocks.ts index a9e1cf1..6fa56f2 100644 --- a/packages/sismo-connect-server/tests/mocks.ts +++ b/packages/sismo-connect-server/tests/mocks.ts @@ -6,51 +6,54 @@ export const commitmentMapperPubKey = [ ]; export const sismoConnectSimpleClaimResponseMock: SismoConnectResponse = { - "appId": "0xf4977993e52606cfd67b7a1cde717069", - "namespace": "main", - "version": "sismo-connect-v1.1", - "signedMessage": "Hello", - "proofs": [ + appId: "0xf4977993e52606cfd67b7a1cde717069", + namespace: "main", + version: "sismo-connect-v1.1", + signedMessage: "Hello", + proofs: [ + { + claims: [ { - "claims": [ - { - "claimType": 0, - "groupId": "0x8543f5652418334ff011c1888fd8d96f", - "groupTimestamp": "latest", - "value": 1, - "extraData": "", - "isSelectableByUser": false - } - ], - "proofData": "0x09456be18e642dd7ae231febd989ff49b67dbbeb4ef0a98197c52b1b7b1ad0f222a764e1decc38131eab20bb0c783c18c43546dc3d96a032d0577406d60475ba119ab5de6741b6b6f73ef061005e6dcaa4d29302840bb4be0b4f832d7a849bb8276671e9cd99d05bbb00b7f7b868f3547a76983ad34ddd8c0ff1738f30d81e931b2b744800e8e3f5c388c188ea3085a7ceb01e82066bc487469803f5a2d9e6511666ed92bc4f0661e2cde85ca02d4675b6c335219268eb06e1d5473c05bd510b29e131a8aedd4f7c46e5512afc7e868aff1c576232fefea2578014caab1f0a581fac22af449deb9737cf7a999ede99ac1d1f97ca70ef2d559ff42fb7a1a69d41000000000000000000000000000000000000000000000000000000000000000006b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd22ab71fb864979b71106135acfa84afc1d756cda74f8f258896f896b4864f025630423b4c502f1cd4179a425723bf1e15c843733af2ecdee9aef6a0451ef2db742fbe05b44247e14786e642186f1f9b39387da7dd33a84c33ba1b85a80d80891603b0db8355957ac4450f8578ea3ec9655bd66633b1220c47f126063381dd8b0118a1aa1b29962cebe16468c3367d3a5fcaf5d103467324fff2b298f6ebbe86100000000000000000000000000000000000000000000000000000000000000001247b587f61b4f2fc7f71361b8cd628b51bf9a3d480011edd783c14d81ffffffe0000000000000000000000000000000000000000000000000000000000000000106e40fa5d1d2ace741f7cab6f9d55c614bf25c3febebe148a2fa09e3bbaa09602c02b0c8903e5f139b466d5bc5ceda4a647c4c72486e6d61de22fc3805abdd000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000", - "extraData": "", - "provingScheme": "hydra-s3.1" + claimType: 0, + groupId: "0x8543f5652418334ff011c1888fd8d96f", + groupTimestamp: "latest", + value: 1, + extraData: "", + isSelectableByUser: false, }, + ], + proofData: + "0x09456be18e642dd7ae231febd989ff49b67dbbeb4ef0a98197c52b1b7b1ad0f222a764e1decc38131eab20bb0c783c18c43546dc3d96a032d0577406d60475ba119ab5de6741b6b6f73ef061005e6dcaa4d29302840bb4be0b4f832d7a849bb8276671e9cd99d05bbb00b7f7b868f3547a76983ad34ddd8c0ff1738f30d81e931b2b744800e8e3f5c388c188ea3085a7ceb01e82066bc487469803f5a2d9e6511666ed92bc4f0661e2cde85ca02d4675b6c335219268eb06e1d5473c05bd510b29e131a8aedd4f7c46e5512afc7e868aff1c576232fefea2578014caab1f0a581fac22af449deb9737cf7a999ede99ac1d1f97ca70ef2d559ff42fb7a1a69d41000000000000000000000000000000000000000000000000000000000000000006b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd22ab71fb864979b71106135acfa84afc1d756cda74f8f258896f896b4864f025630423b4c502f1cd4179a425723bf1e15c843733af2ecdee9aef6a0451ef2db742fbe05b44247e14786e642186f1f9b39387da7dd33a84c33ba1b85a80d80891603b0db8355957ac4450f8578ea3ec9655bd66633b1220c47f126063381dd8b0118a1aa1b29962cebe16468c3367d3a5fcaf5d103467324fff2b298f6ebbe86100000000000000000000000000000000000000000000000000000000000000001247b587f61b4f2fc7f71361b8cd628b51bf9a3d480011edd783c14d81ffffffe0000000000000000000000000000000000000000000000000000000000000000106e40fa5d1d2ace741f7cab6f9d55c614bf25c3febebe148a2fa09e3bbaa09602c02b0c8903e5f139b466d5bc5ceda4a647c4c72486e6d61de22fc3805abdd000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000", + extraData: "", + provingScheme: "hydra-s3.1", + }, + { + auths: [ { - "auths": [ - { - "authType": 0, - "userId": "0x106e40fa5d1d2ace741f7cab6f9d55c614bf25c3febebe148a2fa09e3bbaa096", - "extraData": "", - "isSelectableByUser": true - } - ], - "proofData": "0x24de01c8f8b531ca2a8968b3f8f878d80f4ada41dcb2817844ec29f41057b3062ee4e2f6b7ded941bd16b5e0fc6642e0ae96cfd3f2718c388a0608e026b2aed12d3480daad41a5833d9acdd0507a087cf4dd965367525085c2d72b63a5a81f24118e05c591b16eac95a4dedfc8f246b8b29d2ed75db0fa74b635bab8babea8c42bb581307822a1fdba97c1191c3b8898f0c8417adce86cf5995efd9ec39a17e718f0f76e822ac800307b6045be7185f7fe49093905a91fdb84c79ad3f39b36f80755f5de931013b398785dffa1777b6f961b0c774dc7d3eeb5de04965ea8b3262b19712398add0f8b3fa0fb8638a6dbca6ff3bf0eb06a72fdd4db04fbd43b3df000000000000000000000000000000000000000000000000000000000000000006b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd22ab71fb864979b71106135acfa84afc1d756cda74f8f258896f896b4864f025630423b4c502f1cd4179a425723bf1e15c843733af2ecdee9aef6a0451ef2db74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106e40fa5d1d2ace741f7cab6f9d55c614bf25c3febebe148a2fa09e3bbaa09602c02b0c8903e5f139b466d5bc5ceda4a647c4c72486e6d61de22fc3805abdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "extraData": "", - "provingScheme": "hydra-s3.1" + authType: 0, + userId: "0x106e40fa5d1d2ace741f7cab6f9d55c614bf25c3febebe148a2fa09e3bbaa096", + extraData: "", + isSelectableByUser: true, }, + ], + proofData: + "0x24de01c8f8b531ca2a8968b3f8f878d80f4ada41dcb2817844ec29f41057b3062ee4e2f6b7ded941bd16b5e0fc6642e0ae96cfd3f2718c388a0608e026b2aed12d3480daad41a5833d9acdd0507a087cf4dd965367525085c2d72b63a5a81f24118e05c591b16eac95a4dedfc8f246b8b29d2ed75db0fa74b635bab8babea8c42bb581307822a1fdba97c1191c3b8898f0c8417adce86cf5995efd9ec39a17e718f0f76e822ac800307b6045be7185f7fe49093905a91fdb84c79ad3f39b36f80755f5de931013b398785dffa1777b6f961b0c774dc7d3eeb5de04965ea8b3262b19712398add0f8b3fa0fb8638a6dbca6ff3bf0eb06a72fdd4db04fbd43b3df000000000000000000000000000000000000000000000000000000000000000006b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd22ab71fb864979b71106135acfa84afc1d756cda74f8f258896f896b4864f025630423b4c502f1cd4179a425723bf1e15c843733af2ecdee9aef6a0451ef2db74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106e40fa5d1d2ace741f7cab6f9d55c614bf25c3febebe148a2fa09e3bbaa09602c02b0c8903e5f139b466d5bc5ceda4a647c4c72486e6d61de22fc3805abdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + extraData: "", + provingScheme: "hydra-s3.1", + }, + { + auths: [ { - "auths": [ - { - "authType": 2, - "userId": "0x1002000000000000000001553049041977724928", - "extraData": "", - "isSelectableByUser": true - } - ], - "proofData": "0x2b323fab3af000bbe1127ab611406074346c070c7da301028060fc0b94414dcc04f3258be8e80b0a5bc46c25272c51971f66317babe478e741b56d488cd3b8da0c12bb6b6b659213c71a4af0cc17e48ce6412befebece240e1e94d2ec43dfe0127f8008c6a26b13aab9e824e52165c1eae52b723afd0fcaffa76b5d907d15dfe0506ee9b87fe60ca59e006d4adde2e76a8ada040d5b106571722d42b514c6ccf2d2348ea8cb6dd9995cbe00af03cb502cad444e44f6a5f73538979cb935d0dcf1d588abfd26177234541b9f6bb7b0690dd61ea7c735eb5599025a13b8435c9b003e82096bf0f5a933c33f1de3ead0860daddb08818536516c54dfa1f96e04e48000000000000000000000000100200000000000000000155304904197772492806b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd22ab71fb864979b71106135acfa84afc1d756cda74f8f258896f896b4864f025630423b4c502f1cd4179a425723bf1e15c843733af2ecdee9aef6a0451ef2db74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106e40fa5d1d2ace741f7cab6f9d55c614bf25c3febebe148a2fa09e3bbaa09602c02b0c8903e5f139b466d5bc5ceda4a647c4c72486e6d61de22fc3805abdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - "extraData": "", - "provingScheme": "hydra-s3.1" + authType: 2, + userId: "0x1002000000000000000001553049041977724928", + extraData: "", + isSelectableByUser: true, }, - ] -} \ No newline at end of file + ], + proofData: + "0x2b323fab3af000bbe1127ab611406074346c070c7da301028060fc0b94414dcc04f3258be8e80b0a5bc46c25272c51971f66317babe478e741b56d488cd3b8da0c12bb6b6b659213c71a4af0cc17e48ce6412befebece240e1e94d2ec43dfe0127f8008c6a26b13aab9e824e52165c1eae52b723afd0fcaffa76b5d907d15dfe0506ee9b87fe60ca59e006d4adde2e76a8ada040d5b106571722d42b514c6ccf2d2348ea8cb6dd9995cbe00af03cb502cad444e44f6a5f73538979cb935d0dcf1d588abfd26177234541b9f6bb7b0690dd61ea7c735eb5599025a13b8435c9b003e82096bf0f5a933c33f1de3ead0860daddb08818536516c54dfa1f96e04e48000000000000000000000000100200000000000000000155304904197772492806b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd22ab71fb864979b71106135acfa84afc1d756cda74f8f258896f896b4864f025630423b4c502f1cd4179a425723bf1e15c843733af2ecdee9aef6a0451ef2db74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106e40fa5d1d2ace741f7cab6f9d55c614bf25c3febebe148a2fa09e3bbaa09602c02b0c8903e5f139b466d5bc5ceda4a647c4c72486e6d61de22fc3805abdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + extraData: "", + provingScheme: "hydra-s3.1", + }, + ], +}; diff --git a/packages/sismo-connect-server/tests/sismo-connect-e2e.test.ts b/packages/sismo-connect-server/tests/sismo-connect-e2e.test.ts index bf0fe8b..f93de2f 100644 --- a/packages/sismo-connect-server/tests/sismo-connect-e2e.test.ts +++ b/packages/sismo-connect-server/tests/sismo-connect-e2e.test.ts @@ -8,6 +8,7 @@ import { SISMO_CONNECT_VERSION, AuthRequest, AuthType, + claimTypeLabels, } from "../src"; import { BigNumber } from "@ethersproject/bignumber"; import { decodeProofData } from "../src/verifier/utils/proofData"; @@ -181,7 +182,11 @@ describe("SismoConnect", () => { }) ).rejects.toEqual( Error( - `A required proof is missing for the claimRequest with groupId ${claimRequest.groupId}, groupTimestamp ${claimRequest.groupTimestamp} and claimType ${claimRequest.claimType}` + `A required proof is missing for the claimRequest with groupId ${ + claimRequest.groupId + }, groupTimestamp ${claimRequest.groupTimestamp} and claimType ${ + claimTypeLabels[claimRequest.claimType as ClaimType] + }` ) ); }); @@ -200,7 +205,11 @@ describe("SismoConnect", () => { }) ).rejects.toEqual( Error( - `A required proof is missing for the claimRequest with groupId ${claimRequest.groupId}, groupTimestamp ${claimRequest.groupTimestamp} and claimType ${claimRequest.claimType}` + `A required proof is missing for the claimRequest with groupId ${ + claimRequest.groupId + }, groupTimestamp ${claimRequest.groupTimestamp} and claimType ${ + claimTypeLabels[claimRequest.claimType as ClaimType] + }` ) ); }); @@ -219,7 +228,11 @@ describe("SismoConnect", () => { }) ).rejects.toEqual( Error( - `A required proof is missing for the claimRequest with groupId ${claimRequest.groupId}, groupTimestamp ${claimRequest.groupTimestamp} and claimType ${claimRequest.claimType}` + `A required proof is missing for the claimRequest with groupId ${ + claimRequest.groupId + }, groupTimestamp ${claimRequest.groupTimestamp} and claimType ${ + claimTypeLabels[claimRequest.claimType as ClaimType] + }` ) ); }); diff --git a/packages/sismo-connect-server/tests/utils/updateProofDataInput.ts b/packages/sismo-connect-server/tests/utils/updateProofDataInput.ts index fb04fbe..df8a7e6 100644 --- a/packages/sismo-connect-server/tests/utils/updateProofDataInput.ts +++ b/packages/sismo-connect-server/tests/utils/updateProofDataInput.ts @@ -1,8 +1,11 @@ import { decodeProofData, encodeProofData } from "../../src/verifier/utils/proofData"; - -export const updateProofDataInput = (proofData: string, input: number, updatedValue: string): string => { - const proofDecoded = decodeProofData(proofData); - proofDecoded.input[input] = updatedValue; - return encodeProofData(proofDecoded.a, proofDecoded.b, proofDecoded.c, proofDecoded.input); -} \ No newline at end of file +export const updateProofDataInput = ( + proofData: string, + input: number, + updatedValue: string +): string => { + const proofDecoded = decodeProofData(proofData); + proofDecoded.input[input] = updatedValue; + return encodeProofData(proofDecoded.a, proofDecoded.b, proofDecoded.c, proofDecoded.input); +};