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..e1b3953 100644 --- a/packages/common/types.ts +++ b/packages/common/types.ts @@ -1,40 +1,40 @@ -import { BigNumberish } from "@ethersproject/bignumber"; +import { toSismoConnectResponseBytes } from "./utils/toSismoResponseBytes"; 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,283 @@ 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 SismoConnectResponseInterface = Pick & { + appId: string; + signedMessage?: string; + proofs: SismoConnectProof[]; +}; + +export class SismoConnectResponse implements SismoConnectResponseInterface { + namespace?: string; + version: string; + appId: string; + signedMessage?: string; + proofs: SismoConnectProof[]; + + constructor(params: SismoConnectResponseInterface) { + Object.assign(this, params); + } + + public getAuths(): Auth[] { + return this.proofs.reduce((auths: Auth[], proof) => { + if (proof.auths) { + return [...auths, ...proof.auths]; + } else { + return auths; + } + }, []); + } + + public toJson(): SismoConnectResponseInterface { + return { + namespace: this.namespace, + version: this.version, + appId: this.appId, + signedMessage: this.signedMessage, + proofs: this.proofs, + }; + } + + public toBytes(): string { + return toSismoConnectResponseBytes(this); + } + + public getUserId(authType: AuthType): string | undefined { + const auths = this.getAuths(); + if (auths?.length === 0) return undefined; + const userId = auths.find((verifiedAuth) => verifiedAuth.authType === authType)?.userId; + if (typeof userId !== "string") return undefined; + return resolveSismoIdentifier(userId, authType); + } + + public getUserIds(authType: AuthType): string[] { + const auths = this.getAuths(); + return auths + .filter((verifiedAuth) => verifiedAuth.authType === authType && verifiedAuth.userId) + .map((auth) => { + if (typeof auth.userId !== "string") return undefined; + return resolveSismoIdentifier(auth.userId, authType); + }) as string[]; + } + + public getSignedMessage(): string | undefined { + return this.signedMessage; + } } 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: SismoConnectResponseInterface; constructor({ response, claims, auths, }: { - response: SismoConnectResponse - claims: VerifiedClaim[] - auths: VerifiedAuth[] + response: SismoConnectResponseInterface; + 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 getClaims(groupId: `0x${string}`): VerifiedClaim[] { + return this.claims.filter( + (verifiedClaims) => verifiedClaims.groupId === groupId && verifiedClaims.groupId + ); } 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"; + if (authRequest.authType === AuthType.EVM_ACCOUNT) { + authRequest.userId = authRequest.userId.toLowerCase(); + } + 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/.npmrc b/packages/sismo-connect-client/.npmrc deleted file mode 100644 index d1cdf2f..0000000 --- a/packages/sismo-connect-client/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true \ No newline at end of file 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/package.json b/packages/sismo-connect-client/package.json index f43e06f..b4165bb 100644 --- a/packages/sismo-connect-client/package.json +++ b/packages/sismo-connect-client/package.json @@ -1,6 +1,6 @@ { "name": "@sismo-core/sismo-connect-client", - "version": "0.0.16", + "version": "0.0.17-beta.5", "description": "Sismo Connect client package", "main": "lib/cjs/index.js", "module": "lib/esm/index.js", @@ -32,9 +32,6 @@ "lib", "src" ], - "engines": { - "npm": "USE YARN INSTEAD OF NPM" - }, "repository": "git@github.com:sismo-core/sismo-connect-packages.git", "author": "leo@sismo.io", "license": "MIT", diff --git a/packages/sismo-connect-client/rollup.config.js b/packages/sismo-connect-client/rollup.config.js index 6304405..1060f63 100644 --- a/packages/sismo-connect-client/rollup.config.js +++ b/packages/sismo-connect-client/rollup.config.js @@ -2,6 +2,7 @@ import resolve from "@rollup/plugin-node-resolve"; import commonjs from "@rollup/plugin-commonjs"; import typescript from "@rollup/plugin-typescript"; import dts from "rollup-plugin-dts"; +import pkg from "./package.json"; export default [ { @@ -18,25 +19,23 @@ export default [ sourcemap: true, }, ], - plugins: [ - resolve(), - commonjs(), - typescript({ tsconfig: "./tsconfig.json" }), - ], + plugins: [resolve(), commonjs(), typescript({ tsconfig: "./tsconfig.json" })], external: [ + "@ethersproject/bignumber", "viem", "js-base64", - "pako" - ] + "pako", + ...Object.keys(pkg.devDependencies || {}), + ], }, { input: "lib/esm/types/index.d.ts", output: [ { - file: "lib/index.d.ts", - format: "esm" - } + file: "lib/index.d.ts", + format: "esm", + }, ], plugins: [dts.default()], - } -]; \ No newline at end of file + }, +]; diff --git a/packages/sismo-connect-client/src/common-types.ts b/packages/sismo-connect-client/src/common-types.ts index 64c1784..e1b3953 100644 --- a/packages/sismo-connect-client/src/common-types.ts +++ b/packages/sismo-connect-client/src/common-types.ts @@ -1,4 +1,4 @@ -import { BigNumberish } from "@ethersproject/bignumber"; +import { toSismoConnectResponseBytes } from "./utils/toSismoResponseBytes"; export const SISMO_CONNECT_VERSION = `sismo-connect-v1.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,12 +65,78 @@ export enum AuthType { TELEGRAM, } -export type SismoConnectResponse = Pick & { +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 SismoConnectResponseInterface = Pick & { appId: string; signedMessage?: string; proofs: SismoConnectProof[]; }; +export class SismoConnectResponse implements SismoConnectResponseInterface { + namespace?: string; + version: string; + appId: string; + signedMessage?: string; + proofs: SismoConnectProof[]; + + constructor(params: SismoConnectResponseInterface) { + Object.assign(this, params); + } + + public getAuths(): Auth[] { + return this.proofs.reduce((auths: Auth[], proof) => { + if (proof.auths) { + return [...auths, ...proof.auths]; + } else { + return auths; + } + }, []); + } + + public toJson(): SismoConnectResponseInterface { + return { + namespace: this.namespace, + version: this.version, + appId: this.appId, + signedMessage: this.signedMessage, + proofs: this.proofs, + }; + } + + public toBytes(): string { + return toSismoConnectResponseBytes(this); + } + + public getUserId(authType: AuthType): string | undefined { + const auths = this.getAuths(); + if (auths?.length === 0) return undefined; + const userId = auths.find((verifiedAuth) => verifiedAuth.authType === authType)?.userId; + if (typeof userId !== "string") return undefined; + return resolveSismoIdentifier(userId, authType); + } + + public getUserIds(authType: AuthType): string[] { + const auths = this.getAuths(); + return auths + .filter((verifiedAuth) => verifiedAuth.authType === authType && verifiedAuth.userId) + .map((auth) => { + if (typeof auth.userId !== "string") return undefined; + return resolveSismoIdentifier(auth.userId, authType); + }) as string[]; + } + + public getSignedMessage(): string | undefined { + return this.signedMessage; + } +} + export type SismoConnectProof = { auths?: Auth[]; claims?: Claim[]; @@ -109,14 +183,14 @@ export class SismoConnectVerifiedResult { public auths: VerifiedAuth[]; public claims: VerifiedClaim[]; public signedMessage: string | undefined; - public response: SismoConnectResponse; + public response: SismoConnectResponseInterface; constructor({ response, claims, auths, }: { - response: SismoConnectResponse; + response: SismoConnectResponseInterface; claims: VerifiedClaim[]; auths: VerifiedAuth[]; }) { @@ -137,6 +211,12 @@ export class SismoConnectVerifiedResult { .map((auth) => resolveSismoIdentifier(auth.userId, authType)) as string[]; } + public getClaims(groupId: `0x${string}`): VerifiedClaim[] { + return this.claims.filter( + (verifiedClaims) => verifiedClaims.groupId === groupId && verifiedClaims.groupId + ); + } + public getSignedMessage(): string | undefined { return this.signedMessage; } @@ -201,6 +281,9 @@ export class RequestBuilder { authRequest.isAnon = false; authRequest.isOptional = authRequest.isOptional ?? false; authRequest.userId = authRequest.userId ?? "0"; + if (authRequest.authType === AuthType.EVM_ACCOUNT) { + authRequest.userId = authRequest.userId.toLowerCase(); + } authRequest.extraData = authRequest.extraData ?? ""; if (authRequest.userId === "0") { diff --git a/packages/sismo-connect-client/src/sismo-connect.ts b/packages/sismo-connect-client/src/sismo-connect.ts index 9d3dc3e..c825d23 100644 --- a/packages/sismo-connect-client/src/sismo-connect.ts +++ b/packages/sismo-connect-client/src/sismo-connect.ts @@ -40,16 +40,6 @@ export class SismoConnectClient { this._sismoConnectConfig.displayRawResponse = false; } - if (this._sismoConnectConfig.displayRawResponse) { - console.warn("Sismo Connect displayRawResponse is true. Never use this mode in production!"); - } - - if (isImpersonationMode) { - console.warn( - `Sismo Connect redirects to the Impersonation Vault. The generated proofs are based on impersonated accounts: ${this._sismoConnectConfig.vault.impersonate}. Never use this mode in production!` - ); - } - this._sdk = new Sdk(this._sismoConnectConfig.sismoApiUrl); } diff --git a/packages/sismo-connect-client/tests/request-builder.test.ts b/packages/sismo-connect-client/tests/request-builder.test.ts index 74c8c09..d6358df 100644 --- a/packages/sismo-connect-client/tests/request-builder.test.ts +++ b/packages/sismo-connect-client/tests/request-builder.test.ts @@ -1,22 +1,36 @@ -import { resolveSismoIdentifier } from '../src/common-types'; -import { AuthType } from '../src/common-types'; +import { RequestBuilder } from "../src"; +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 + + describe("RequestBuilder", () => { + it("should put EVM account userIds in lower case", async () => { + const auths = RequestBuilder.buildAuths([ + { + authType: AuthType.EVM_ACCOUNT, + userId: "0xAa1BcC", + }, + { + authType: AuthType.EVM_ACCOUNT, + userId: "0xDaDBcD", + }, + ]); + expect(auths[0].userId).toEqual("0xaa1bcc"); + expect(auths[1].userId).toEqual("0xdadbcd"); + }); + }); +}); diff --git a/packages/sismo-connect-client/tests/sismo-connect-response.test.ts b/packages/sismo-connect-client/tests/sismo-connect-response.test.ts new file mode 100644 index 0000000..2231ddc --- /dev/null +++ b/packages/sismo-connect-client/tests/sismo-connect-response.test.ts @@ -0,0 +1,81 @@ +import { + AuthType, + SismoConnectResponse, + ProvingScheme, + SismoConnectResponseInterface, +} from "../src/common-types"; + +describe("SismoConnectResponse", () => { + let response: SismoConnectResponse; + let rawResponse: SismoConnectResponseInterface; + + beforeEach(() => { + rawResponse = { + appId: "0x1", + signedMessage: "Message signed", + proofs: [ + { + auths: [ + { + authType: AuthType.VAULT, + userId: "0x1", + }, + ], + provingScheme: ProvingScheme.HYDRA_S3, + proofData: "proof1", + extraData: null, + }, + { + auths: [ + { + authType: AuthType.TWITTER, + userId: "1", + }, + ], + provingScheme: ProvingScheme.HYDRA_S3, + proofData: "proof2", + extraData: null, + }, + { + auths: [ + { + authType: AuthType.TWITTER, + userId: "2", + }, + ], + provingScheme: ProvingScheme.HYDRA_S3, + proofData: "proof3", + extraData: null, + }, + ], + version: "sismo-connect-v1", + }; + response = new SismoConnectResponse(rawResponse); + }); + + it("should be N N-1 compatible", () => { + expect(JSON.stringify(rawResponse)).toEqual(JSON.stringify(response)); + }); + + it("should return the response as a json", () => { + expect(response.toJson()).toEqual(rawResponse); + }); + + it("should return the response as a bytes", () => { + expect(response.toBytes()).toEqual( + "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000b8e2054f8a912367e38a22ce773328ff000000000000000000000000000000007369736d6f2d636f6e6e6563742d76310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000000eMessage signed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000004a200000000000000000000000000000000000000000000000000000000000008e400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a068796472612d73332e310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000024200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006proof10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a068796472612d73332e310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000024200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006proof20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a068796472612d73332e310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000024200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006proof300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ); + }); + + it("should return vaultId", () => { + expect(response.getUserId(AuthType.VAULT)).toEqual("0x1"); + }); + + it("should return twitter userIds", () => { + expect(response.getUserIds(AuthType.TWITTER)).toEqual(["1", "2"]); + }); + + it("should return signed message", () => { + expect(response.getSignedMessage()).toEqual("Message signed"); + }); +}); diff --git a/packages/sismo-connect-client/tests/sismo-connect.test.ts b/packages/sismo-connect-client/tests/sismo-connect.test.ts index bef2507..cf1f3d8 100644 --- a/packages/sismo-connect-client/tests/sismo-connect.test.ts +++ b/packages/sismo-connect-client/tests/sismo-connect.test.ts @@ -1,74 +1,101 @@ import { + Auth, + AuthType, ClaimRequest, - SismoConnect, + SismoConnect, SismoConnectClient, SismoConnectConfig, -} from '../src' +} 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` - ) - }) -}) + ); + }); + + it("should put EVM account userIds in lower case", async () => { + const requestLink = sismoConnect.getRequestLink({ + auths: [ + { + authType: AuthType.EVM_ACCOUNT, + userId: "0xAa1BcC", + }, + { + authType: AuthType.EVM_ACCOUNT, + userId: "0xDaDBcD", + }, + ], + }); + const url = new URL(requestLink); + let params = new URLSearchParams(url.search); + let auths = JSON.parse(params.get("auths") as string) as Auth[]; + expect(auths[0].userId).toEqual("0xaa1bcc"); + expect(auths[1].userId).toEqual("0xdadbcd"); + }); +}); diff --git a/packages/sismo-connect-react/.npmrc b/packages/sismo-connect-react/.npmrc deleted file mode 100644 index d1cdf2f..0000000 --- a/packages/sismo-connect-react/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true \ No newline at end of file diff --git a/packages/sismo-connect-react/package.json b/packages/sismo-connect-react/package.json index 5703256..f8c9ee6 100644 --- a/packages/sismo-connect-react/package.json +++ b/packages/sismo-connect-react/package.json @@ -1,6 +1,6 @@ { "name": "@sismo-core/sismo-connect-react", - "version": "0.0.16", + "version": "0.0.17-beta.5", "description": "sismoConnect React package", "main": "lib/cjs/index.js", "module": "lib/esm/index.js", @@ -30,9 +30,6 @@ "lib", "src" ], - "engines": { - "npm": "USE YARN INSTEAD OF NPM" - }, "repository": "git@github.com:sismo-core/sismo-connect-packages.git", "author": "leo@sismo.io", "license": "MIT", @@ -44,6 +41,6 @@ }, "peerDependencies": {}, "dependencies": { - "@sismo-core/sismo-connect-client": "0.0.16" + "@sismo-core/sismo-connect-client": "0.0.17-beta.5" } } diff --git a/packages/sismo-connect-react/rollup.config.js b/packages/sismo-connect-react/rollup.config.js index 71770ee..a8bcac9 100644 --- a/packages/sismo-connect-react/rollup.config.js +++ b/packages/sismo-connect-react/rollup.config.js @@ -1,10 +1,11 @@ import resolve from "@rollup/plugin-node-resolve"; import commonjs from "@rollup/plugin-commonjs"; import typescript from "@rollup/plugin-typescript"; -import postcss from 'rollup-plugin-postcss'; +import postcss from "rollup-plugin-postcss"; import dts from "rollup-plugin-dts"; -import external from 'rollup-plugin-peer-deps-external'; -import packageJson from './package.json'; +import external from "rollup-plugin-peer-deps-external"; +import packageJson from "./package.json"; +import pkg from "./package.json"; export default [ { @@ -14,7 +15,7 @@ export default [ file: packageJson.module, format: "esm", sourcemap: true, - } + }, ], plugins: [ external(), @@ -23,23 +24,17 @@ export default [ typescript({ tsconfig: "./tsconfig.json" }), postcss(), ], - external: [ - "viem", - "js-base64", - "pako" - ] + external: ["@sismo-core/sismo-connect-client", ...Object.keys(pkg.devDependencies || {})], }, { input: "lib/esm/types/index.d.ts", output: [ { - file: "lib/index.d.ts", - format: "esm" - } + file: "lib/index.d.ts", + format: "esm", + }, ], external: [/\.css$/], - plugins: [ - dts.default() - ], - } -]; \ No newline at end of file + plugins: [dts.default()], + }, +]; diff --git a/packages/sismo-connect-react/src/components/Logo/Group.svg b/packages/sismo-connect-react/src/components/Logo/Group.svg new file mode 100644 index 0000000..0785024 --- /dev/null +++ b/packages/sismo-connect-react/src/components/Logo/Group.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/sismo-connect-react/src/components/Logo/Logo.tsx b/packages/sismo-connect-react/src/components/Logo/Logo.tsx index b68bada..3765ece 100644 --- a/packages/sismo-connect-react/src/components/Logo/Logo.tsx +++ b/packages/sismo-connect-react/src/components/Logo/Logo.tsx @@ -1,22 +1,145 @@ import React from "react"; export const Logo = () => { return ( - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); -} - - +}; diff --git a/packages/sismo-connect-react/src/components/SismoConnectButton/SismoConnectButton.css b/packages/sismo-connect-react/src/components/SismoConnectButton/SismoConnectButton.css index 85eab6f..30f810d 100644 --- a/packages/sismo-connect-react/src/components/SismoConnectButton/SismoConnectButton.css +++ b/packages/sismo-connect-react/src/components/SismoConnectButton/SismoConnectButton.css @@ -4,18 +4,22 @@ border: 1px solid #3F4973; border-radius: 10px; padding: 15px 25px; - display: flex; + cursor: pointer; + display: inline-flex; + padding: 15px 25px; + justify-content: center; align-items: center; gap: 10px; - cursor: pointer; } .sismoConnectButtonText { font-weight: 400; font-size: 18px; + line-height: 27px; } .sismoConnectButtonLogo { - height: 16px; - width: 16px; + width: 18.66px; + height: 24px; + } \ No newline at end of file diff --git a/packages/sismo-connect-react/yarn-error.log b/packages/sismo-connect-react/yarn-error.log index 15c9143..195dc73 100644 --- a/packages/sismo-connect-react/yarn-error.log +++ b/packages/sismo-connect-react/yarn-error.log @@ -1,5 +1,5 @@ Arguments: - /usr/local/bin/node /Users/dev/.cache/node/corepack/yarn/1.22.19/bin/yarn.js upgrade @sismo-core/sismo-connec-client@0.0.12-beta.14 + /usr/local/bin/node /Users/dev/.cache/node/corepack/yarn/1.22.19/bin/yarn.js add @simsmo-core/sismo-connect-client@0.0.17-beta.5 PATH: /opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Users/dev/.cargo/bin:/Users/dev/.foundry/bin @@ -8,28 +8,28 @@ Yarn version: 1.22.19 Node version: - 16.20.0 + 18.16.1 Platform: darwin arm64 Trace: - Error: https://registry.npmjs.org/@sismo-core%2fsismo-connec-client: Not found - at Request.params.callback [as _callback] (/Users/dev/.cache/node/corepack/yarn/1.22.19/lib/cli.js:66145:18) - at Request.self.callback (/Users/dev/.cache/node/corepack/yarn/1.22.19/lib/cli.js:140890:22) + Error: https://registry.npmjs.org/@simsmo-core%2fsismo-connect-client: Not found + at params.callback [as _callback] (/Users/dev/.cache/node/corepack/yarn/1.22.19/lib/cli.js:66145:18) + at self.callback (/Users/dev/.cache/node/corepack/yarn/1.22.19/lib/cli.js:140890:22) at Request.emit (node:events:513:28) at Request. (/Users/dev/.cache/node/corepack/yarn/1.22.19/lib/cli.js:141862:10) at Request.emit (node:events:513:28) at IncomingMessage. (/Users/dev/.cache/node/corepack/yarn/1.22.19/lib/cli.js:141784:12) at Object.onceWrapper (node:events:627:28) at IncomingMessage.emit (node:events:525:35) - at endReadableNT (node:internal/streams/readable:1358:12) - at processTicksAndRejections (node:internal/process/task_queues:83:21) + at endReadableNT (node:internal/streams/readable:1359:12) + at process.processTicksAndRejections (node:internal/process/task_queues:82:21) npm manifest: { "name": "@sismo-core/sismo-connect-react", - "version": "0.0.14-beta.10", + "version": "0.0.17-beta.4", "description": "sismoConnect React package", "main": "lib/cjs/index.js", "module": "lib/esm/index.js", @@ -59,9 +59,6 @@ npm manifest: "lib", "src" ], - "engines": { - "npm": "USE YARN INSTEAD OF NPM" - }, "repository": "git@github.com:sismo-core/sismo-connect-packages.git", "author": "leo@sismo.io", "license": "MIT", @@ -73,7 +70,7 @@ npm manifest: }, "peerDependencies": {}, "dependencies": { - "@sismo-core/sismo-connect-client": "0.0.12-beta.12" + "@sismo-core/sismo-connect-client": "0.0.17-beta.4" } } @@ -226,10 +223,10 @@ Lockfile: "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" - "@sismo-core/sismo-connect-client@0.0.12-beta.12": - version "0.0.12-beta.12" - resolved "https://registry.yarnpkg.com/@sismo-core/sismo-connect-client/-/sismo-connect-client-0.0.12-beta.12.tgz#99792ab9a527356adef82d74435a4a9dab05e7b3" - integrity sha512-alIbo5p7MLKM8+vJC4ZkRgeJ9/75M9BoreJo4BuRpi3nqttqoDglJNQn7BUCzeaOuGdmhlYT5BgfTqiG0JrFuQ== + "@sismo-core/sismo-connect-client@0.0.17-beta.4": + version "0.0.17-beta.4" + resolved "https://registry.yarnpkg.com/@sismo-core/sismo-connect-client/-/sismo-connect-client-0.0.17-beta.4.tgz#39968c5dc1245437b073735fe26b0b49d625439d" + integrity sha512-9qSUzoKkAGoAuuV+NANBe+bXq02PijVJ5wvbrhcQt6jr03bn2MfxVVfOhOzeTHrQ7vlg7Uyf3lJHmtJWymAa0w== dependencies: "@ethersproject/bignumber" "5.7.0" js-base64 "^3.7.5" diff --git a/packages/sismo-connect-react/yarn.lock b/packages/sismo-connect-react/yarn.lock index 26f7acf..4c1bd64 100644 --- a/packages/sismo-connect-react/yarn.lock +++ b/packages/sismo-connect-react/yarn.lock @@ -143,10 +143,10 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" -"@sismo-core/sismo-connect-client@0.0.16": - version "0.0.16" - resolved "https://registry.yarnpkg.com/@sismo-core/sismo-connect-client/-/sismo-connect-client-0.0.16.tgz#28f1c8e586509bf6272fc42969c8b13d837e3cbc" - integrity sha512-SO33SjpVPy2rVSIqE3B568+bQfNGe1T5ieh1pxNR68W6sAeLGU+PtzRegdKNbirFLVhVTi0Ky/vfmqI12Ehmng== +"@sismo-core/sismo-connect-client@0.0.17-beta.5": + version "0.0.17-beta.5" + resolved "https://registry.yarnpkg.com/@sismo-core/sismo-connect-client/-/sismo-connect-client-0.0.17-beta.5.tgz#33492ffbe269ac36a82b0e67e1cbabef7927f6ab" + integrity sha512-LF2e4aq3u/+TH8nwnbfPH7rYIVbiT2UAsWAPreBsZR/Vc31CXhRy7AYkoD51PhLK0vqsld5P8dmKpkz+u0Sncg== dependencies: "@ethersproject/bignumber" "5.7.0" js-base64 "^3.7.5" diff --git a/packages/sismo-connect-server/.npmrc b/packages/sismo-connect-server/.npmrc deleted file mode 100644 index d1cdf2f..0000000 --- a/packages/sismo-connect-server/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true \ No newline at end of file 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/package.json b/packages/sismo-connect-server/package.json index 0a9a60a..64de272 100644 --- a/packages/sismo-connect-server/package.json +++ b/packages/sismo-connect-server/package.json @@ -1,6 +1,6 @@ { "name": "@sismo-core/sismo-connect-server", - "version": "0.0.16", + "version": "0.0.17-beta.6", "description": "sismoConnect server package", "main": "lib/cjs/index.js", "module": "lib/esm/index.js", @@ -33,15 +33,13 @@ "lib", "src" ], - "engines": { - "npm": "USE YARN INSTEAD OF NPM" - }, "repository": "git@github.com:sismo-core/sismo-connect-packages.git", "author": "leo@sismo.io", "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", - "@sismo-core/hydra-s3": "^1.0.0" + "@sismo-core/hydra-s3": "^1.0.0", + "viem": "^1.2.13" }, "lint-staged": { "src/**/*": "prettier --write --ignore-unknown", diff --git a/packages/sismo-connect-server/rollup.config.js b/packages/sismo-connect-server/rollup.config.js index 8b25647..acb8289 100644 --- a/packages/sismo-connect-server/rollup.config.js +++ b/packages/sismo-connect-server/rollup.config.js @@ -1,8 +1,9 @@ import resolve from "@rollup/plugin-node-resolve"; import commonjs from "@rollup/plugin-commonjs"; import typescript from "@rollup/plugin-typescript"; -import json from '@rollup/plugin-json'; +import json from "@rollup/plugin-json"; import dts from "rollup-plugin-dts"; +import pkg from "./package.json"; export default [ { @@ -19,21 +20,17 @@ export default [ sourcemap: true, }, ], - plugins: [ - resolve(), - commonjs(), - json(), - typescript(), - ], + external: ["@ethersproject/bignumber", "viem", ...Object.keys(pkg.devDependencies || {})], + plugins: [resolve(), commonjs(), json(), typescript()], }, { input: "lib/esm/types/index.d.ts", output: [ { - file: "lib/index.d.ts", - format: "esm" - } + file: "lib/index.d.ts", + format: "esm", + }, ], plugins: [dts.default()], - } -]; \ No newline at end of file + }, +]; diff --git a/packages/sismo-connect-server/src/common-types.ts b/packages/sismo-connect-server/src/common-types.ts index 64c1784..e1b3953 100644 --- a/packages/sismo-connect-server/src/common-types.ts +++ b/packages/sismo-connect-server/src/common-types.ts @@ -1,4 +1,4 @@ -import { BigNumberish } from "@ethersproject/bignumber"; +import { toSismoConnectResponseBytes } from "./utils/toSismoResponseBytes"; export const SISMO_CONNECT_VERSION = `sismo-connect-v1.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,12 +65,78 @@ export enum AuthType { TELEGRAM, } -export type SismoConnectResponse = Pick & { +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 SismoConnectResponseInterface = Pick & { appId: string; signedMessage?: string; proofs: SismoConnectProof[]; }; +export class SismoConnectResponse implements SismoConnectResponseInterface { + namespace?: string; + version: string; + appId: string; + signedMessage?: string; + proofs: SismoConnectProof[]; + + constructor(params: SismoConnectResponseInterface) { + Object.assign(this, params); + } + + public getAuths(): Auth[] { + return this.proofs.reduce((auths: Auth[], proof) => { + if (proof.auths) { + return [...auths, ...proof.auths]; + } else { + return auths; + } + }, []); + } + + public toJson(): SismoConnectResponseInterface { + return { + namespace: this.namespace, + version: this.version, + appId: this.appId, + signedMessage: this.signedMessage, + proofs: this.proofs, + }; + } + + public toBytes(): string { + return toSismoConnectResponseBytes(this); + } + + public getUserId(authType: AuthType): string | undefined { + const auths = this.getAuths(); + if (auths?.length === 0) return undefined; + const userId = auths.find((verifiedAuth) => verifiedAuth.authType === authType)?.userId; + if (typeof userId !== "string") return undefined; + return resolveSismoIdentifier(userId, authType); + } + + public getUserIds(authType: AuthType): string[] { + const auths = this.getAuths(); + return auths + .filter((verifiedAuth) => verifiedAuth.authType === authType && verifiedAuth.userId) + .map((auth) => { + if (typeof auth.userId !== "string") return undefined; + return resolveSismoIdentifier(auth.userId, authType); + }) as string[]; + } + + public getSignedMessage(): string | undefined { + return this.signedMessage; + } +} + export type SismoConnectProof = { auths?: Auth[]; claims?: Claim[]; @@ -109,14 +183,14 @@ export class SismoConnectVerifiedResult { public auths: VerifiedAuth[]; public claims: VerifiedClaim[]; public signedMessage: string | undefined; - public response: SismoConnectResponse; + public response: SismoConnectResponseInterface; constructor({ response, claims, auths, }: { - response: SismoConnectResponse; + response: SismoConnectResponseInterface; claims: VerifiedClaim[]; auths: VerifiedAuth[]; }) { @@ -137,6 +211,12 @@ export class SismoConnectVerifiedResult { .map((auth) => resolveSismoIdentifier(auth.userId, authType)) as string[]; } + public getClaims(groupId: `0x${string}`): VerifiedClaim[] { + return this.claims.filter( + (verifiedClaims) => verifiedClaims.groupId === groupId && verifiedClaims.groupId + ); + } + public getSignedMessage(): string | undefined { return this.signedMessage; } @@ -201,6 +281,9 @@ export class RequestBuilder { authRequest.isAnon = false; authRequest.isOptional = authRequest.isOptional ?? false; authRequest.userId = authRequest.userId ?? "0"; + if (authRequest.authType === AuthType.EVM_ACCOUNT) { + authRequest.userId = authRequest.userId.toLowerCase(); + } authRequest.extraData = authRequest.extraData ?? ""; if (authRequest.userId === "0") { diff --git a/packages/sismo-connect-server/src/sismo-connect.ts b/packages/sismo-connect-server/src/sismo-connect.ts index 50bbd68..5e63753 100644 --- a/packages/sismo-connect-server/src/sismo-connect.ts +++ b/packages/sismo-connect-server/src/sismo-connect.ts @@ -9,6 +9,7 @@ import { SismoConnectVerifiedResult, SISMO_CONNECT_VERSION, SismoConnectConfig, + SismoConnectResponseInterface, } from "./common-types"; import { SismoConnectVerifier } from "./verifier"; import { SismoConnectProvider, JsonRpcProvider } from "./verifier/libs/onchain-provider"; @@ -43,12 +44,6 @@ export class SismoConnectServer { const isImpersonationMode: boolean = config.vault?.impersonate?.length > 0; - if (isImpersonationMode) { - console.warn( - `Sismo Connect redirects to the Impersonation Vault. The generated proofs are based on impersonated accounts: ${config.vault.impersonate}. Never use this mode in production!` - ); - } - //By default use public gnosis provider const sismoConnectProvider: SismoConnectProvider = options?.provider ?? new JsonRpcProvider({ url: "https://rpc.gnosis.gateway.fm" }); @@ -61,7 +56,7 @@ export class SismoConnectServer { } public verify = async ( - sismoConnectResponse: SismoConnectResponse, + sismoConnectResponse: SismoConnectResponseInterface, { auths, claims, signature, namespace }: VerifyParamsSismoConnect = {} ): Promise => { if (!sismoConnectResponse) { diff --git a/packages/sismo-connect-server/src/utils/toSismoResponseBytes.ts b/packages/sismo-connect-server/src/utils/toSismoResponseBytes.ts new file mode 100644 index 0000000..c45e748 --- /dev/null +++ b/packages/sismo-connect-server/src/utils/toSismoResponseBytes.ts @@ -0,0 +1,197 @@ +import { + Hex, + encodeAbiParameters, + pad, + sliceHex, + toHex, + keccak256, + isHex, + toBytes as toBytesViem, +} from "viem"; +import { SismoConnectResponse } from "../common-types"; + +const toBytes16 = (data) => { + if (isHex(data)) return pad(data, { size: 16 }); + else return sliceHex(keccak256(hexlify(data)), 0, 16); +}; + +const toBytes32 = (data) => { + return pad(hexlify(data), { size: 32, dir: "right" }); +}; + +const toBytes = (data) => { + return toHex(toBytesViem(data)); +}; + +export const hexlify = (data) => { + return isHex(data) ? (data as Hex) : toHex(data); +}; + +const formatResponseToEncode = (sismoConnectResponse: SismoConnectResponse) => { + return { + appId: toBytes16(sismoConnectResponse.appId), + namespace: toBytes16(sismoConnectResponse?.namespace ?? "main"), + version: toBytes32(sismoConnectResponse.version), + signedMessage: + (sismoConnectResponse.signedMessage as `0x${string}`) ?? + toBytes("0x0000000000000000000000000000000000000000000000000000000000000000"), + proofs: sismoConnectResponse.proofs?.map((proof) => { + return { + claims: + proof.claims?.map((claim) => { + return { + groupId: toBytes16(claim.groupId ?? "0x00"), + groupTimestamp: + !proof?.claims[0]?.groupTimestamp || proof?.claims[0]?.groupTimestamp === "latest" + ? pad(hexlify("latest"), { size: 16, dir: "right" }) + : toBytes(proof?.claims[0]?.groupTimestamp), + claimType: claim.claimType, + isSelectableByUser: claim?.isSelectableByUser ?? false, + value: BigInt(claim.value ?? 1), + extraData: toBytes(claim.extraData ?? ""), + }; + }) ?? [], + auths: + proof.auths?.map((auth) => { + return { + authType: auth?.authType, + isAnon: auth?.isAnon ?? false, + isSelectableByUser: auth?.isSelectableByUser ?? false, + userId: BigInt(auth?.userId ?? 0), + extraData: toBytes(auth.extraData ?? ""), + }; + }) ?? [], + proofData: proof.proofData as Hex, + provingScheme: toBytes32(proof?.provingScheme ?? "hydra-s3.1"), + extraData: toBytes(proof.extraData ?? ""), + }; + }), + }; +}; + +export const toSismoConnectResponseBytes = (sismoConnectResponse: SismoConnectResponse) => { + if (!sismoConnectResponse) return null; + return encodeAbiParameters( + [ + { + components: [ + { + internalType: "bytes16", + name: "appId", + type: "bytes16", + }, + { + internalType: "bytes16", + name: "namespace", + type: "bytes16", + }, + { + internalType: "bytes32", + name: "version", + type: "bytes32", + }, + { + internalType: "bytes", + name: "signedMessage", + type: "bytes", + }, + { + components: [ + { + components: [ + { + internalType: "enum AuthType", + name: "authType", + type: "uint8", + }, + { + internalType: "bool", + name: "isAnon", + type: "bool", + }, + { + internalType: "bool", + name: "isSelectableByUser", + type: "bool", + }, + { + internalType: "uint256", + name: "userId", + type: "uint256", + }, + { + internalType: "bytes", + name: "extraData", + type: "bytes", + }, + ], + internalType: "struct Auth[]", + name: "auths", + type: "tuple[]", + }, + { + components: [ + { + internalType: "enum ClaimType", + name: "claimType", + type: "uint8", + }, + { + internalType: "bytes16", + name: "groupId", + type: "bytes16", + }, + { + internalType: "bytes16", + name: "groupTimestamp", + type: "bytes16", + }, + { + internalType: "bool", + name: "isSelectableByUser", + type: "bool", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "extraData", + type: "bytes", + }, + ], + internalType: "struct Claim[]", + name: "claims", + type: "tuple[]", + }, + { + internalType: "bytes32", + name: "provingScheme", + type: "bytes32", + }, + { + internalType: "bytes", + name: "proofData", + type: "bytes", + }, + { + internalType: "bytes", + name: "extraData", + type: "bytes", + }, + ], + internalType: "struct SismoConnectProof[]", + name: "proofs", + type: "tuple[]", + }, + ], + internalType: "struct SismoConnectResponse", + name: "response", + type: "tuple", + }, + ], + [formatResponseToEncode(sismoConnectResponse)] + ); +}; 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..480405f 100644 --- a/packages/sismo-connect-server/src/verifier/verifier.ts +++ b/packages/sismo-connect-server/src/verifier/verifier.ts @@ -10,6 +10,9 @@ import { SignatureRequest, SismoConnectProof, AuthType, + authTypeLabels, + claimTypeLabels, + SismoConnectResponseInterface, } from "../common-types"; import { GNOSIS_AVAILABLE_ROOTS_REGISTRY_ADDRESS } from "../constants"; import { @@ -32,7 +35,7 @@ export type VerifierParams = { }; export type VerifyParams = { - sismoConnectResponse: SismoConnectResponse; + sismoConnectResponse: SismoConnectResponseInterface; claims?: ClaimRequest[]; auths?: AuthRequest[]; signature?: SignatureRequest; @@ -105,7 +108,7 @@ export class SismoConnectVerifier { } private async _checkRequiredRequests( - sismoConnectResponse: SismoConnectResponse, + sismoConnectResponse: SismoConnectResponseInterface, claimRequests: ClaimRequest[], authRequests: AuthRequest[] ) { @@ -131,7 +134,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 +169,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] + }` ); } } @@ -178,7 +187,7 @@ export class SismoConnectVerifier { private async _checkProofMatchRequest( proof: SismoConnectProof, - response: SismoConnectResponse, + response: SismoConnectResponseInterface, claimRequests: ClaimRequest[], authRequests: AuthRequest[], signatureRequest: SignatureRequest @@ -231,14 +240,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 +316,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..dad89be 100644 --- a/packages/sismo-connect-server/tests/mocks.ts +++ b/packages/sismo-connect-server/tests/mocks.ts @@ -1,56 +1,59 @@ -import { SismoConnectResponse } from "../src"; +import { SismoConnectResponseInterface } from "../src"; export const commitmentMapperPubKey = [ "3602196582082511412345093208859330584743530098298494929484637038525722574265", "14672613011011178056703002414016466661118036128791343632962870104486584019450", ]; -export const sismoConnectSimpleClaimResponseMock: SismoConnectResponse = { - "appId": "0xf4977993e52606cfd67b7a1cde717069", - "namespace": "main", - "version": "sismo-connect-v1.1", - "signedMessage": "Hello", - "proofs": [ +export const sismoConnectSimpleClaimResponseMock: SismoConnectResponseInterface = { + 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..ee42668 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,8 @@ import { SISMO_CONNECT_VERSION, AuthRequest, AuthType, + claimTypeLabels, + SismoConnectResponseInterface, } from "../src"; import { BigNumber } from "@ethersproject/bignumber"; import { decodeProofData } from "../src/verifier/utils/proofData"; @@ -17,7 +19,7 @@ import { sismoConnectSimpleClaimResponseMock } from "./mocks"; describe("SismoConnect", () => { let verifiedClaim: VerifiedClaim; let sismoConnect: SismoConnectServer; - let sismoConnectResponse: SismoConnectResponse; + let sismoConnectResponse: SismoConnectResponseInterface; let appId: string; let groupId: string; let namespace: string; @@ -181,7 +183,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 +206,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 +229,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); +}; diff --git a/packages/sismo-connect-server/yarn.lock b/packages/sismo-connect-server/yarn.lock index 45597de..0c6c4e2 100644 --- a/packages/sismo-connect-server/yarn.lock +++ b/packages/sismo-connect-server/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adraffy/ens-normalize@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" + integrity sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ== + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -948,6 +953,23 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@noble/curves@1.0.0", "@noble/curves@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.0.0.tgz#e40be8c7daf088aaf291887cbc73f43464a92932" + integrity sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw== + dependencies: + "@noble/hashes" "1.3.0" + +"@noble/hashes@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" + integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== + +"@noble/hashes@~1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + "@rollup/plugin-commonjs@^24.0.1": version "24.0.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz#d54ba26a3e3c495dc332bd27a81f7e9e2df46f90" @@ -996,6 +1018,28 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.0.tgz#6c8d980ef3f290987736acd0ee2e0f0d50068d87" + integrity sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q== + dependencies: + "@noble/curves" "~1.0.0" + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.0.tgz#a207e2ef96de354de7d0002292ba1503538fc77b" + integrity sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@sinclair/typebox@^0.25.16": version "0.25.22" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.22.tgz#2808d895e9c2722b20a622a9c8cb332f6720eb4a" @@ -1195,6 +1239,16 @@ dependencies: "@types/yargs-parser" "*" +"@wagmi/chains@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@wagmi/chains/-/chains-1.2.0.tgz#d59eaa70ec51a5fdcd113975926992acfb17ab12" + integrity sha512-dmDRipsE54JfyudOBkuhEexqQWcrZqxn/qiujG8SBzMh/az/AH5xlJSA+j1CPWTx9+QofSMF3B7A4gb6XRmSaQ== + +abitype@0.8.11: + version "0.8.11" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.8.11.tgz#66e1cf2cbf46f48d0e57132d7c1c392447536cc1" + integrity sha512-bM4v2dKvX08sZ9IU38IN5BKmN+ZkOSd2oI4a9f0ejHYZQYV6cDr7j+d95ga0z2XHG36Y4jzoG5Z7qDqxp7fi/A== + acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" @@ -2046,6 +2100,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-ws@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -3179,6 +3238,21 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" +viem@^1.2.13: + version "1.2.13" + resolved "https://registry.yarnpkg.com/viem/-/viem-1.2.13.tgz#03d20066a12e32d2205d8a32ec4c5a00ed1e1f00" + integrity sha512-BhBbL/JieVZvM1hiSvzoQCsj96j7HoOx/apvl4YYIR/0m/tue4JK/a03P1GKPJ9S316HEB/bT6AIJMlXS/SyiQ== + dependencies: + "@adraffy/ens-normalize" "1.9.0" + "@noble/curves" "1.0.0" + "@noble/hashes" "1.3.0" + "@scure/bip32" "1.3.0" + "@scure/bip39" "1.2.0" + "@wagmi/chains" "1.2.0" + abitype "0.8.11" + isomorphic-ws "5.0.0" + ws "8.12.0" + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -3244,6 +3318,11 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" + integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"