@zkpassport/sdk 0.13.1 → 0.14.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/constants.ts","../../src/public-input-checker.ts","../../src/assets/abi/ZKPassportVerifier.json","../../src/solidity-verifier.ts","../../src/index.ts"],"names":["VERSION","DEFAULT_DATE_VALUE","ZKPASSPORT_IOS_APP_ID_HASH","ZKPASSPORT_ANDROID_APP_ID_HASH","APPLE_APP_ATTEST_ROOT_KEY_HASH","GOOGLE_APP_ATTEST_RSA_ROOT_KEY_HASH","GOOGLE_APP_ATTEST_ECDSA_P384_ROOT_KEY_HASH","PublicInputChecker","proof","originalQuery","queryResult","queryResultErrors","isCorrect","disclosedBytes","disclosedDataPassport","DisclosedData","disclosedDataIDCard","birthdatePassport","birthdateIDCard","areDatesEqual","expiryDatePassport","expiryDateIDCard","nationalityPassport","nationalityIDCard","documentNumberPassport","documentNumberIDCard","genderPassport","genderIDCard","issuingCountryPassport","issuingCountryIDCard","fullnamePassport","fullnameIDCard","formatName","firstnamePassport","firstnameIDCard","lastnamePassport","lastnameIDCard","currentTime","minAge","getMinAgeFromCommittedInputs","maxAge","getMaxAgeFromCommittedInputs","minDate","getBirthdateMinDateTimestamp","SECONDS_BETWEEN_1900_AND_1970","maxDate","getBirthdateMaxDateTimestamp","expectedPlusOneDay","expectedMinusOneDay","getMinDateFromCommittedInputs","getMaxDateFromCommittedInputs","countryList","country","i","domain","proofData","key","scope","getServiceScopeHash","getServiceScopeFromDisclosureProof","getScopeHash","getServiceSubScopeFromDisclosureProof","root","outer","devMode","RegistryClient","error","boundData","bindMismatches","sanctionsCommittedInputs","sanctionsBuilder","EXPECTED_ROOT","facematchCommittedInputs","EXPECTED_ENVIRONMENT","circuitName","validity","today","currentDate","getCurrentDateFromDisclosureProof","todayToCurrentDate","expectedDifference","proofs","oprfKeyId","commitmentIn","commitmentOut","uniqueIdentifier","uniqueIdentifierType","sortedProofs","a","b","proofOrder","getIndex","name","p","getProofData","getNumberOfPublicInputs","isForEVM","certificateRegistryRoot","getCertificateRegistryRootFromOuterProof","isCorrectCertificateRegistryRoot","queryResultErrorsCertificateRegistryRoot","circuitRegistryRoot","getCircuitRegistryRootFromOuterProof","isCorrectCircuitRegistryRoot","queryResultErrorsCircuitRegistryRoot","getCurrentDateFromOuterProof","paramCommitments","getParamCommitmentsFromOuterProof","committedInputs","keysInCommittedInputs","getScopeFromOuterProof","getSubscopeFromOuterProof","ageCommittedInputs","ageParameterCommitment","getAgeEVMParameterCommitment","getAgeParameterCommitment","isCorrectAge","queryResultErrorsAge","birthdateCommittedInputs","birthdateParameterCommitment","getDateEVMParameterCommitment","ProofType","getDateParameterCommitment","isCorrectBirthdate","queryResultErrorsBirthdate","expiryCommittedInputs","expiryParameterCommitment","isCorrectExpiryDate","queryResultErrorsExpiryDate","discloseCommittedInputs","discloseParameterCommitment","getDiscloseEVMParameterCommitment","getDiscloseParameterCommitment","isCorrectDisclose","queryResultErrorsDisclose","inclusionCheckNationalityCommittedInputs","inclusionCheckNationalityParameterCommitment","getCountryEVMParameterCommitment","getCountryParameterCommitment","isCorrectNationalityInclusion","queryResultErrorsNationalityInclusion","inclusionCheckIssuingCountryCommittedInputs","inclusionCheckIssuingCountryParameterCommitment","isCorrectIssuingCountryInclusion","queryResultErrorsIssuingCountryInclusion","exclusionCheckNationalityCommittedInputs","exclusionCheckNationalityParameterCommitment","isCorrectNationalityExclusion","queryResultErrorsNationalityExclusion","exclusionCheckIssuingCountryCommittedInputs","exclusionCheckIssuingCountryParameterCommitment","isCorrectIssuingCountryExclusion","queryResultErrorsIssuingCountryExclusion","bindCommittedInputs","bindParameterCommitment","getBindEVMParameterCommitment","formatBoundData","getBindParameterCommitment","isCorrectBind","queryResultErrorsBind","SanctionsBuilder","exclusionCheckSanctionsCommittedInputs","exclusionCheckSanctionsParameterCommitment","isCorrectSanctionsExclusion","queryResultErrorsSanctionsExclusion","facematchParameterCommitment","getFacematchEvmParameterCommitment","getFacematchParameterCommitment","isCorrectFacematch","queryResultErrorsFacematch","getNullifierFromOuterProof","getNullifierTypeFromOuterProof","getCommitmentFromDSCProof","merkleRoot","getMerkleRootFromDSCProof","getCommitmentInFromIDDataProof","getCommitmentOutFromIDDataProof","getCommitmentInFromIntegrityProof","getCommitmentOutFromIntegrityProof","getCommitmentInFromDisclosureProof","paramCommitment","getParameterCommitmentFromDisclosureProof","calculatedParamCommitment","isCorrectScope","queryResultErrorsScope","isCorrectCurrentDate","queryResultErrorsCurrentDate","getNullifierFromDisclosureProof","getNullifierTypeFromDisclosureProof","paramCommittment","NullifierType","oprfPk","getOprfPublicKey","OPRF_DEFAULT_KEY_ID","expectedPkHash","hashOprfPublicKey","disclosureProof","dpData","getOprfPkHashFromDisclosureProof","ZKPassportVerifier_default","SolidityVerifier","validityPeriodInSeconds","committedInputCounts","committedInputCount","getCommittedInputCount","compressedCommittedInputs","formattedCountries","proofType","ProofTypeLength","rightPadArrayWithZeros","c","value","minDateBytes","numberToBytesBE","maxDateBytes","x","parameterCommitments","commitment","committedInput","rawHashedInputs","sha256","hexToBytes","hashedInputs","bytesToHex","count","versionParts","versionBytes","versionBytes32","oprfPkHash","getOprfPkHashFromOuterProof","Buffer","registerLocale","i18en","normalizeCountry","normalizedCountry","getAlpha3Code","numericalCompare","fnName","requestId","requestIdToConfig","rangeCompare","generalCompare","ZKPassport","_domain","topic","result","verified","hasFailedProofs","callback","request","formatQueryResultDates","start","end","v","countries","lists","options","mode","query","localConfig","hasStrictFacematch","logo","purpose","projectID","topicOverride","keyPairOverride","cloudProverUrl","bridgeUrl","bridge","Bridge","reconnection","message","writingDirectory","formattedResult","UltraHonkVerifierBackend","Barretenberg","barretenberg","verifier","uniqueIdentifierFromPublicInputs","uniqueIdentifierTypeFromPublicInputs","queryResultErrorsFromPublicInputs","registryClient","circuitManifest","isOuterEVM","proofName","hostedPackagedCircuit","createPublicClient","http","sepolia","address","abi","functionName","client","params","vkeyBytes","e","base64Config","base64Service","pubkey","timestamp","nullifierType","url"],"mappings":"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","file":"index.js","sourcesContent":["export const VERSION = \"0.12.0\"\nexport const DEFAULT_VALIDITY = 7 * 24 * 60 * 60 // 7 days\nexport const DEFAULT_DATE_VALUE = new Date(0)\n\n// This is the app id hash for the ZKPassport app\n// i.e. hash of `YL5MS3Z639.app.zkpassport.zkpassport`\nexport const ZKPASSPORT_IOS_APP_ID_HASH =\n \"0x1fa73686cf510f8f85757b0602de0dd72a13e68ae2092462be8b72662e7f179b\"\n\n// This is the app id hash for the ZKPassport app on Android\n// i.e. hash of `app.zkpassport.zkpassport`\nexport const ZKPASSPORT_ANDROID_APP_ID_HASH =\n \"0x24d9929b248be7eeecaa98e105c034a50539610f3fdd4cb9c8983ef4100d615d\"\n\n// This is the hash of the root key of Apple's App Attest\n// c.f. https://www.apple.com/certificateauthority/Apple_App_Attestation_Root_CA.pem\nexport const APPLE_APP_ATTEST_ROOT_KEY_HASH =\n \"0x2532418a107c5306fa8308c22255792cf77e4a290cbce8a840a642a3e591340b\"\n\n// This is the hash of the RSA root key of Google's App Attest\n// c.f. https://developer.android.com/privacy-and-security/security-key-attestation#root_certificate\nexport const GOOGLE_APP_ATTEST_RSA_ROOT_KEY_HASH =\n \"0x16700a2d9168a194fc85f237af5829b5a2be05b8ae8ac4879ada34cf54a9c211\"\n\n// This is the hash of the ECDSA P384 root key of Google's App Attest\n// c.f. https://developer.android.com/privacy-and-security/security-key-attestation#root_certificate\nexport const GOOGLE_APP_ATTEST_ECDSA_P384_ROOT_KEY_HASH =\n \"0x0e1889bec6c1d686abcf08360ff404f803ab345881ea8cba6aad33b7f7f7ffe0\"\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n type ProofResult,\n type QueryResult,\n getProofData,\n getCommitmentFromDSCProof,\n getCommitmentInFromIDDataProof,\n getCommitmentOutFromIDDataProof,\n getNullifierFromDisclosureProof,\n getCommitmentInFromIntegrityProof,\n getCommitmentOutFromIntegrityProof,\n getCommitmentInFromDisclosureProof,\n getMerkleRootFromDSCProof,\n getCurrentDateFromDisclosureProof,\n DisclosedData,\n formatName,\n getNumberOfPublicInputs,\n getParameterCommitmentFromDisclosureProof,\n getCountryParameterCommitment,\n getDiscloseParameterCommitment,\n getDateParameterCommitment,\n getCertificateRegistryRootFromOuterProof,\n getParamCommitmentsFromOuterProof,\n AgeCommittedInputs,\n DiscloseCommittedInputs,\n getMinAgeFromCommittedInputs,\n getMaxAgeFromCommittedInputs,\n getAgeParameterCommitment,\n DateCommittedInputs,\n CountryCommittedInputs,\n getMinDateFromCommittedInputs,\n getMaxDateFromCommittedInputs,\n getCurrentDateFromOuterProof,\n getNullifierFromOuterProof,\n getAgeEVMParameterCommitment,\n getDateEVMParameterCommitment,\n getDiscloseEVMParameterCommitment,\n getCountryEVMParameterCommitment,\n ProofType,\n getScopeHash,\n ProofData,\n getScopeFromOuterProof,\n getSubscopeFromOuterProof,\n getServiceScopeHash,\n BoundData,\n BindCommittedInputs,\n getBindEVMParameterCommitment,\n getBindParameterCommitment,\n formatBoundData,\n getCircuitRegistryRootFromOuterProof,\n areDatesEqual,\n getBirthdateMinDateTimestamp,\n getBirthdateMaxDateTimestamp,\n SanctionsCommittedInputs,\n SanctionsBuilder,\n SECONDS_BETWEEN_1900_AND_1970,\n FacematchCommittedInputs,\n getFacematchEvmParameterCommitment,\n getFacematchParameterCommitment,\n NullifierType,\n getNullifierTypeFromOuterProof,\n getNullifierTypeFromDisclosureProof,\n getServiceScopeFromDisclosureProof,\n getServiceSubScopeFromDisclosureProof,\n getOprfPkHashFromDisclosureProof,\n OPRF_DEFAULT_KEY_ID,\n getOprfPublicKey,\n hashOprfPublicKey,\n Query,\n} from \"@zkpassport/utils\"\nimport { QueryResultErrors } from \"./types\"\nimport { RegistryClient } from \"@zkpassport/registry\"\n// import { MockRegistryClient as RegistryClient } from \"@zkpassport/registry/mock\"\nimport {\n APPLE_APP_ATTEST_ROOT_KEY_HASH,\n DEFAULT_DATE_VALUE,\n DEFAULT_VALIDITY,\n GOOGLE_APP_ATTEST_RSA_ROOT_KEY_HASH,\n GOOGLE_APP_ATTEST_ECDSA_P384_ROOT_KEY_HASH,\n ZKPASSPORT_ANDROID_APP_ID_HASH,\n ZKPASSPORT_IOS_APP_ID_HASH,\n} from \"./constants\"\n\nexport class PublicInputChecker {\n public static checkDiscloseBytesPublicInputs(\n proof: ProofResult,\n originalQuery: Query,\n queryResult: QueryResult,\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n // We can't be certain that the disclosed data is for a passport or an ID card\n // so we need to check both (unless the document type is revealed)\n const disclosedBytes =\n (proof.committedInputs?.disclose_bytes as DiscloseCommittedInputs)?.disclosedBytes ??\n (proof.committedInputs?.disclose_bytes_evm as DiscloseCommittedInputs)?.disclosedBytes\n const disclosedDataPassport = DisclosedData.fromDisclosedBytes(disclosedBytes, \"passport\")\n const disclosedDataIDCard = DisclosedData.fromDisclosedBytes(disclosedBytes, \"id_card\")\n if (queryResult.document_type) {\n // Document type is always at the same index in the disclosed data\n if (\n queryResult.document_type.eq &&\n queryResult.document_type.eq.result &&\n queryResult.document_type.eq.expected !== disclosedDataPassport.documentType\n ) {\n console.warn(\"Document type does not match the expected document type\")\n isCorrect = false\n queryResultErrors.document_type = {\n ...queryResultErrors.document_type,\n eq: {\n expected: `${queryResult.document_type.eq.expected}`,\n received: `${disclosedDataPassport.documentType ?? disclosedDataIDCard.documentType}`,\n message: \"Document type does not match the expected document type\",\n },\n }\n }\n if (\n queryResult.document_type.disclose &&\n queryResult.document_type.disclose.result !== disclosedDataIDCard.documentType\n ) {\n console.warn(\"Document type does not match the disclosed document type in query result\")\n isCorrect = false\n queryResultErrors.document_type = {\n ...queryResultErrors.document_type,\n disclose: {\n expected: `${queryResult.document_type.disclose?.result}`,\n received: `${disclosedDataIDCard.documentType ?? disclosedDataPassport.documentType}`,\n message: \"Document type does not match the disclosed document type in query result\",\n },\n }\n }\n if (\n queryResult.document_type.eq &&\n (originalQuery.document_type?.eq === undefined ||\n queryResult.document_type.eq.expected !== originalQuery.document_type.eq)\n ) {\n console.warn(\"Document type eq does not match the original query\")\n isCorrect = false\n queryResultErrors.document_type = {\n ...queryResultErrors.document_type,\n eq: {\n expected: `${originalQuery.document_type?.eq}`,\n received: `${queryResult.document_type.eq.expected}`,\n message: \"Document type eq does not match the original query\",\n },\n }\n }\n if (queryResult.document_type.disclose && !originalQuery.document_type?.disclose) {\n console.warn(\"Document type disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.document_type = {\n ...queryResultErrors.document_type,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.document_type.disclose.result}`,\n message: \"Document type disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.birthdate) {\n const birthdatePassport = disclosedDataPassport.dateOfBirth\n const birthdateIDCard = disclosedDataIDCard.dateOfBirth\n if (\n queryResult.birthdate.eq &&\n queryResult.birthdate.eq.result &&\n !areDatesEqual(queryResult.birthdate.eq.expected, birthdatePassport) &&\n !areDatesEqual(queryResult.birthdate.eq.expected, birthdateIDCard)\n ) {\n console.warn(\"Birthdate does not match the expected birthdate\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n eq: {\n expected: `${queryResult.birthdate.eq.expected.toISOString()}`,\n received: `${birthdatePassport?.toISOString() ?? birthdateIDCard?.toISOString()}`,\n message: \"Birthdate does not match the expected birthdate\",\n },\n }\n }\n if (\n queryResult.birthdate.disclose &&\n !areDatesEqual(queryResult.birthdate.disclose.result, birthdatePassport) &&\n !areDatesEqual(queryResult.birthdate.disclose.result, birthdateIDCard)\n ) {\n console.warn(\"Birthdate does not match the disclosed birthdate in query result\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n disclose: {\n expected: `${queryResult.birthdate.disclose.result.toISOString()}`,\n received: `${birthdatePassport?.toISOString() ?? birthdateIDCard?.toISOString()}`,\n message: \"Birthdate does not match the disclosed birthdate in query result\",\n },\n }\n }\n if (\n queryResult.birthdate.eq &&\n (originalQuery.birthdate?.eq === undefined ||\n !areDatesEqual(queryResult.birthdate.eq.expected, originalQuery.birthdate.eq as Date))\n ) {\n console.warn(\"Birthdate eq does not match the original query\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n eq: {\n expected: `${(originalQuery.birthdate?.eq as Date)?.toISOString?.() ?? \"undefined\"}`,\n received: `${queryResult.birthdate.eq.expected.toISOString()}`,\n message: \"Birthdate eq does not match the original query\",\n },\n }\n }\n if (queryResult.birthdate.disclose && !originalQuery.birthdate?.disclose) {\n console.warn(\"Birthdate disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.birthdate.disclose.result}`,\n message: \"Birthdate disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.expiry_date) {\n const expiryDatePassport = disclosedDataPassport.dateOfExpiry\n const expiryDateIDCard = disclosedDataIDCard.dateOfExpiry\n if (\n queryResult.expiry_date.eq &&\n queryResult.expiry_date.eq.result &&\n !areDatesEqual(queryResult.expiry_date.eq.expected, expiryDatePassport) &&\n !areDatesEqual(queryResult.expiry_date.eq.expected, expiryDateIDCard)\n ) {\n console.warn(\"Expiry date does not match the expected expiry date\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n eq: {\n expected: `${queryResult.expiry_date.eq.expected.toISOString()}`,\n received: `${expiryDatePassport?.toISOString() ?? expiryDateIDCard?.toISOString()}`,\n message: \"Expiry date does not match the expected expiry date\",\n },\n }\n }\n if (\n queryResult.expiry_date.disclose &&\n !areDatesEqual(queryResult.expiry_date.disclose.result, expiryDatePassport) &&\n !areDatesEqual(queryResult.expiry_date.disclose.result, expiryDateIDCard)\n ) {\n console.warn(\"Expiry date does not match the disclosed expiry date in query result\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n disclose: {\n expected: `${queryResult.expiry_date.disclose.result.toISOString()}`,\n received: `${expiryDatePassport?.toISOString() ?? expiryDateIDCard?.toISOString()}`,\n message: \"Expiry date does not match the disclosed expiry date in query result\",\n },\n }\n }\n if (\n queryResult.expiry_date.eq &&\n (originalQuery.expiry_date?.eq === undefined ||\n !areDatesEqual(queryResult.expiry_date.eq.expected, originalQuery.expiry_date.eq as Date))\n ) {\n console.warn(\"Expiry date eq does not match the original query\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n eq: {\n expected: `${(originalQuery.expiry_date?.eq as Date)?.toISOString?.() ?? \"undefined\"}`,\n received: `${queryResult.expiry_date.eq.expected.toISOString()}`,\n message: \"Expiry date eq does not match the original query\",\n },\n }\n }\n if (queryResult.expiry_date.disclose && !originalQuery.expiry_date?.disclose) {\n console.warn(\"Expiry date disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.expiry_date.disclose.result}`,\n message: \"Expiry date disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.nationality) {\n const nationalityPassport = disclosedDataPassport.nationality\n const nationalityIDCard = disclosedDataIDCard.nationality\n if (\n queryResult.nationality.eq &&\n queryResult.nationality.eq.result &&\n queryResult.nationality.eq.expected !== nationalityPassport &&\n queryResult.nationality.eq.expected !== nationalityIDCard\n ) {\n console.warn(\"Nationality does not match the expected nationality\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n eq: {\n expected: `${queryResult.nationality.eq.expected}`,\n received: `${nationalityPassport ?? nationalityIDCard}`,\n message: \"Nationality does not match the expected nationality\",\n },\n }\n }\n if (\n queryResult.nationality.disclose &&\n queryResult.nationality.disclose.result !== nationalityPassport &&\n queryResult.nationality.disclose.result !== nationalityIDCard\n ) {\n console.warn(\"Nationality does not match the disclosed nationality in query result\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n disclose: {\n expected: `${queryResult.nationality.disclose.result}`,\n received: `${nationalityPassport ?? nationalityIDCard}`,\n message: \"Nationality does not match the disclosed nationality in query result\",\n },\n }\n }\n if (\n queryResult.nationality.eq &&\n (originalQuery.nationality?.eq === undefined ||\n queryResult.nationality.eq.expected !== originalQuery.nationality.eq)\n ) {\n console.warn(\"Nationality eq does not match the original query\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n eq: {\n expected: `${originalQuery.nationality?.eq}`,\n received: `${queryResult.nationality.eq.expected}`,\n message: \"Nationality eq does not match the original query\",\n },\n }\n }\n if (queryResult.nationality.disclose && !originalQuery.nationality?.disclose) {\n console.warn(\"Nationality disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.nationality.disclose.result}`,\n message: \"Nationality disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.document_number) {\n const documentNumberPassport = disclosedDataPassport.documentNumber\n const documentNumberIDCard = disclosedDataIDCard.documentNumber\n if (\n queryResult.document_number.eq &&\n queryResult.document_number.eq.result &&\n queryResult.document_number.eq.expected !== documentNumberPassport &&\n queryResult.document_number.eq.expected !== documentNumberIDCard\n ) {\n console.warn(\"Document number does not match the expected document number\")\n isCorrect = false\n queryResultErrors.document_number = {\n ...queryResultErrors.document_number,\n eq: {\n expected: `${queryResult.document_number.eq.expected}`,\n received: `${documentNumberPassport ?? documentNumberIDCard}`,\n message: \"Document number does not match the expected document number\",\n },\n }\n }\n if (\n queryResult.document_number.disclose &&\n queryResult.document_number.disclose.result !== documentNumberPassport &&\n queryResult.document_number.disclose.result !== documentNumberIDCard\n ) {\n console.warn(\"Document number does not match the disclosed document number in query result\")\n isCorrect = false\n queryResultErrors.document_number = {\n ...queryResultErrors.document_number,\n disclose: {\n expected: `${queryResult.document_number.disclose.result}`,\n received: `${documentNumberPassport ?? documentNumberIDCard}`,\n message: \"Document number does not match the disclosed document number in query result\",\n },\n }\n }\n if (\n queryResult.document_number.eq &&\n (originalQuery.document_number?.eq === undefined ||\n queryResult.document_number.eq.expected !== originalQuery.document_number.eq)\n ) {\n console.warn(\"Document number eq does not match the original query\")\n isCorrect = false\n queryResultErrors.document_number = {\n ...queryResultErrors.document_number,\n eq: {\n expected: `${originalQuery.document_number?.eq}`,\n received: `${queryResult.document_number.eq.expected}`,\n message: \"Document number eq does not match the original query\",\n },\n }\n }\n if (queryResult.document_number.disclose && !originalQuery.document_number?.disclose) {\n console.warn(\"Document number disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.document_number = {\n ...queryResultErrors.document_number,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.document_number.disclose.result}`,\n message: \"Document number disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.gender) {\n const genderPassport = disclosedDataPassport.gender\n const genderIDCard = disclosedDataIDCard.gender\n if (\n queryResult.gender.eq &&\n queryResult.gender.eq.result &&\n queryResult.gender.eq.expected !== genderPassport &&\n queryResult.gender.eq.expected !== genderIDCard\n ) {\n console.warn(\"Gender does not match the expected gender\")\n isCorrect = false\n queryResultErrors.gender = {\n ...queryResultErrors.gender,\n eq: {\n expected: `${queryResult.gender.eq.expected}`,\n received: `${genderPassport ?? genderIDCard}`,\n message: \"Gender does not match the expected gender\",\n },\n }\n }\n if (\n queryResult.gender.disclose &&\n queryResult.gender.disclose.result !== genderPassport &&\n queryResult.gender.disclose.result !== genderIDCard\n ) {\n console.warn(\"Gender does not match the disclosed gender in query result\")\n isCorrect = false\n queryResultErrors.gender = {\n ...queryResultErrors.gender,\n disclose: {\n expected: `${queryResult.gender.disclose.result}`,\n received: `${genderPassport ?? genderIDCard}`,\n message: \"Gender does not match the disclosed gender in query result\",\n },\n }\n }\n if (\n queryResult.gender.eq &&\n (originalQuery.gender?.eq === undefined ||\n queryResult.gender.eq.expected !== originalQuery.gender.eq)\n ) {\n console.warn(\"Gender eq does not match the original query\")\n isCorrect = false\n queryResultErrors.gender = {\n ...queryResultErrors.gender,\n eq: {\n expected: `${originalQuery.gender?.eq}`,\n received: `${queryResult.gender.eq.expected}`,\n message: \"Gender eq does not match the original query\",\n },\n }\n }\n if (queryResult.gender.disclose && !originalQuery.gender?.disclose) {\n console.warn(\"Gender disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.gender = {\n ...queryResultErrors.gender,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.gender.disclose.result}`,\n message: \"Gender disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.issuing_country) {\n const issuingCountryPassport = disclosedDataPassport.issuingCountry\n const issuingCountryIDCard = disclosedDataIDCard.issuingCountry\n if (\n queryResult.issuing_country.eq &&\n queryResult.issuing_country.eq.result &&\n queryResult.issuing_country.eq.expected !== issuingCountryPassport &&\n queryResult.issuing_country.eq.expected !== issuingCountryIDCard\n ) {\n console.warn(\"Issuing country does not match the expected issuing country\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n eq: {\n expected: `${queryResult.issuing_country.eq.expected}`,\n received: `${issuingCountryPassport ?? issuingCountryIDCard}`,\n message: \"Issuing country does not match the expected issuing country\",\n },\n }\n }\n if (\n queryResult.issuing_country.disclose &&\n queryResult.issuing_country.disclose.result !== issuingCountryPassport &&\n queryResult.issuing_country.disclose.result !== issuingCountryIDCard\n ) {\n console.warn(\"Issuing country does not match the disclosed issuing country in query result\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n disclose: {\n expected: `${queryResult.issuing_country.disclose.result}`,\n received: `${issuingCountryPassport ?? issuingCountryIDCard}`,\n message: \"Issuing country does not match the disclosed issuing country in query result\",\n },\n }\n }\n if (\n queryResult.issuing_country.eq &&\n (originalQuery.issuing_country?.eq === undefined ||\n queryResult.issuing_country.eq.expected !== originalQuery.issuing_country.eq)\n ) {\n console.warn(\"Issuing country eq does not match the original query\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n eq: {\n expected: `${originalQuery.issuing_country?.eq}`,\n received: `${queryResult.issuing_country.eq.expected}`,\n message: \"Issuing country eq does not match the original query\",\n },\n }\n }\n if (queryResult.issuing_country.disclose && !originalQuery.issuing_country?.disclose) {\n console.warn(\"Issuing country disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.issuing_country.disclose.result}`,\n message: \"Issuing country disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.fullname) {\n const fullnamePassport = disclosedDataPassport.name\n const fullnameIDCard = disclosedDataIDCard.name\n if (\n queryResult.fullname.eq &&\n queryResult.fullname.eq.result &&\n formatName(queryResult.fullname.eq.expected).toLowerCase() !==\n fullnamePassport.toLowerCase() &&\n formatName(queryResult.fullname.eq.expected).toLowerCase() !== fullnameIDCard.toLowerCase()\n ) {\n console.warn(\"Fullname does not match the expected fullname\")\n isCorrect = false\n queryResultErrors.fullname = {\n ...queryResultErrors.fullname,\n eq: {\n expected: `${queryResult.fullname.eq.expected}`,\n received: `${fullnamePassport ?? fullnameIDCard}`,\n message: \"Fullname does not match the expected fullname\",\n },\n }\n }\n if (\n queryResult.fullname.disclose &&\n formatName(queryResult.fullname.disclose.result).toLowerCase() !==\n fullnamePassport.toLowerCase() &&\n formatName(queryResult.fullname.disclose.result).toLowerCase() !==\n fullnameIDCard.toLowerCase()\n ) {\n console.warn(\"Fullname does not match the disclosed fullname in query result\")\n isCorrect = false\n queryResultErrors.fullname = {\n ...queryResultErrors.fullname,\n disclose: {\n expected: `${queryResult.fullname.disclose.result}`,\n received: `${fullnamePassport ?? fullnameIDCard}`,\n message: \"Fullname does not match the disclosed fullname in query result\",\n },\n }\n }\n if (\n queryResult.fullname.eq &&\n (originalQuery.fullname?.eq === undefined ||\n formatName(queryResult.fullname.eq.expected).toLowerCase() !==\n formatName(originalQuery.fullname.eq as string).toLowerCase())\n ) {\n console.warn(\"Fullname eq does not match the original query\")\n isCorrect = false\n queryResultErrors.fullname = {\n ...queryResultErrors.fullname,\n eq: {\n expected: `${originalQuery.fullname?.eq}`,\n received: `${queryResult.fullname.eq.expected}`,\n message: \"Fullname eq does not match the original query\",\n },\n }\n }\n if (queryResult.fullname.disclose && !originalQuery.fullname?.disclose) {\n console.warn(\"Fullname disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.fullname = {\n ...queryResultErrors.fullname,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.fullname.disclose.result}`,\n message: \"Fullname disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.firstname) {\n // If fullname was not revealed, then the name could be either the first name or last name\n const firstnamePassport =\n disclosedDataPassport.firstName && disclosedDataPassport.firstName.length > 0\n ? disclosedDataPassport.firstName\n : disclosedDataPassport.name\n const firstnameIDCard =\n disclosedDataIDCard.firstName && disclosedDataIDCard.firstName.length > 0\n ? disclosedDataIDCard.firstName\n : disclosedDataIDCard.name\n if (\n queryResult.firstname.eq &&\n queryResult.firstname.eq.result &&\n formatName(queryResult.firstname.eq.expected).toLowerCase() !==\n firstnamePassport.toLowerCase() &&\n formatName(queryResult.firstname.eq.expected).toLowerCase() !==\n firstnameIDCard.toLowerCase()\n ) {\n console.warn(\"Firstname does not match the expected firstname\")\n isCorrect = false\n queryResultErrors.firstname = {\n ...queryResultErrors.firstname,\n eq: {\n expected: `${queryResult.firstname.eq.expected}`,\n received: `${firstnamePassport ?? firstnameIDCard}`,\n message: \"Firstname does not match the expected firstname\",\n },\n }\n }\n if (\n queryResult.firstname.disclose &&\n formatName(queryResult.firstname.disclose.result).toLowerCase() !==\n firstnamePassport.toLowerCase() &&\n formatName(queryResult.firstname.disclose.result).toLowerCase() !==\n firstnameIDCard.toLowerCase()\n ) {\n console.warn(\"Firstname does not match the disclosed firstname in query result\")\n isCorrect = false\n queryResultErrors.firstname = {\n ...queryResultErrors.firstname,\n disclose: {\n expected: `${queryResult.firstname.disclose.result}`,\n received: `${firstnamePassport ?? firstnameIDCard}`,\n message: \"Firstname does not match the disclosed firstname in query result\",\n },\n }\n }\n if (\n queryResult.firstname.eq &&\n (originalQuery.firstname?.eq === undefined ||\n formatName(queryResult.firstname.eq.expected).toLowerCase() !==\n formatName(originalQuery.firstname.eq as string).toLowerCase())\n ) {\n console.warn(\"Firstname eq does not match the original query\")\n isCorrect = false\n queryResultErrors.firstname = {\n ...queryResultErrors.firstname,\n eq: {\n expected: `${originalQuery.firstname?.eq}`,\n received: `${queryResult.firstname.eq.expected}`,\n message: \"Firstname eq does not match the original query\",\n },\n }\n }\n if (queryResult.firstname.disclose && !originalQuery.firstname?.disclose) {\n console.warn(\"Firstname disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.firstname = {\n ...queryResultErrors.firstname,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.firstname.disclose.result}`,\n message: \"Firstname disclose is not in the original query\",\n },\n }\n }\n }\n if (queryResult.lastname) {\n // If fullname was not revealed, then the name could be either the first name or last name\n const lastnamePassport =\n disclosedDataPassport.lastName && disclosedDataPassport.lastName.length > 0\n ? disclosedDataPassport.lastName\n : disclosedDataPassport.name\n const lastnameIDCard =\n disclosedDataIDCard.lastName && disclosedDataIDCard.lastName.length > 0\n ? disclosedDataIDCard.lastName\n : disclosedDataIDCard.name\n if (\n queryResult.lastname.eq &&\n queryResult.lastname.eq.result &&\n formatName(queryResult.lastname.eq.expected).toLowerCase() !==\n lastnamePassport.toLowerCase() &&\n formatName(queryResult.lastname.eq.expected).toLowerCase() !== lastnameIDCard.toLowerCase()\n ) {\n console.warn(\"Lastname does not match the expected lastname\")\n isCorrect = false\n queryResultErrors.lastname = {\n ...queryResultErrors.lastname,\n eq: {\n expected: `${queryResult.lastname.eq.expected}`,\n received: `${lastnamePassport ?? lastnameIDCard}`,\n message: \"Lastname does not match the expected lastname\",\n },\n }\n }\n if (\n queryResult.lastname.disclose &&\n formatName(queryResult.lastname.disclose.result).toLowerCase() !==\n lastnamePassport.toLowerCase() &&\n formatName(queryResult.lastname.disclose.result).toLowerCase() !==\n lastnameIDCard.toLowerCase()\n ) {\n console.warn(\"Lastname does not match the disclosed lastname in query result\")\n isCorrect = false\n queryResultErrors.lastname = {\n ...queryResultErrors.lastname,\n disclose: {\n expected: `${queryResult.lastname.disclose.result}`,\n received: `${lastnamePassport ?? lastnameIDCard}`,\n message: \"Lastname does not match the disclosed lastname in query result\",\n },\n }\n }\n if (\n queryResult.lastname.eq &&\n (originalQuery.lastname?.eq === undefined ||\n formatName(queryResult.lastname.eq.expected).toLowerCase() !==\n formatName(originalQuery.lastname.eq as string).toLowerCase())\n ) {\n console.warn(\"Lastname eq does not match the original query\")\n isCorrect = false\n queryResultErrors.lastname = {\n ...queryResultErrors.lastname,\n eq: {\n expected: `${originalQuery.lastname?.eq}`,\n received: `${queryResult.lastname.eq.expected}`,\n message: \"Lastname eq does not match the original query\",\n },\n }\n }\n if (queryResult.lastname.disclose && !originalQuery.lastname?.disclose) {\n console.warn(\"Lastname disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.lastname = {\n ...queryResultErrors.lastname,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.lastname.disclose.result}`,\n message: \"Lastname disclose is not in the original query\",\n },\n }\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkAgePublicInputs(\n proof: ProofResult,\n originalQuery: Query,\n queryResult: QueryResult,\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n const currentTime = new Date()\n // TODO: Fix unused variable\n const _today = new Date(\n currentTime.getFullYear(),\n currentTime.getMonth(),\n currentTime.getDate(),\n 0,\n 0,\n 0,\n 0,\n )\n const minAge = getMinAgeFromCommittedInputs(\n (proof.committedInputs?.compare_age as AgeCommittedInputs) ??\n (proof.committedInputs?.compare_age_evm as AgeCommittedInputs),\n )\n const maxAge = getMaxAgeFromCommittedInputs(\n (proof.committedInputs?.compare_age as AgeCommittedInputs) ??\n (proof.committedInputs?.compare_age_evm as AgeCommittedInputs),\n )\n if (queryResult.age) {\n if (\n queryResult.age.gte &&\n queryResult.age.gte.result &&\n minAge !== (queryResult.age.gte.expected as number)\n ) {\n console.warn(\"Age is not greater than or equal to the expected age\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n gte: {\n expected: queryResult.age.gte.expected,\n received: minAge,\n message: \"Age is not greater than or equal to the expected age\",\n },\n }\n }\n if (\n queryResult.age.gt &&\n queryResult.age.gt.result &&\n minAge !== (queryResult.age.gt.expected as number) + 1\n ) {\n console.warn(\"Age is not greater than the expected age\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n gt: {\n expected: queryResult.age.gt.expected,\n received: minAge,\n message: \"Age is not greater than the expected age\",\n },\n }\n }\n if (\n queryResult.age.lt &&\n queryResult.age.lt.result &&\n maxAge !== (queryResult.age.lt.expected as number) - 1\n ) {\n console.warn(\"Age is not less than the expected age\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n lt: {\n expected: queryResult.age.lt.expected,\n received: maxAge,\n message: \"Age is not less than the expected age\",\n },\n }\n }\n if (\n queryResult.age.lte &&\n queryResult.age.lte.result &&\n maxAge !== (queryResult.age.lte.expected as number)\n ) {\n console.warn(\"Age is not less than or equal to the expected age\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n lte: {\n expected: queryResult.age.lte.expected,\n received: maxAge,\n message: \"Age is not less than or equal to the expected age\",\n },\n }\n }\n if (\n queryResult.age.eq &&\n queryResult.age.eq.result &&\n (minAge !== (queryResult.age.eq.expected as number) ||\n maxAge !== (queryResult.age.eq.expected as number))\n ) {\n console.warn(\"Age does not match the expected age\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n eq: {\n expected: queryResult.age.eq.expected,\n received: minAge !== (queryResult.age.eq.expected as number) ? minAge : maxAge,\n message: \"Age does not match the expected age\",\n },\n }\n }\n if (queryResult.age.range) {\n if (\n queryResult.age.range.result &&\n (minAge !== (queryResult.age.range.expected[0] as number) ||\n maxAge !== (queryResult.age.range.expected[1] as number))\n ) {\n console.warn(\"Age is not in the expected range\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n range: {\n expected: queryResult.age.range.expected,\n received: [minAge, maxAge],\n message: \"Age is not in the expected range\",\n },\n }\n }\n }\n if (\n !queryResult.age.lt &&\n !queryResult.age.lte &&\n !queryResult.age.eq &&\n !queryResult.age.range &&\n maxAge != 0\n ) {\n console.warn(\"Maximum age should be equal to 0\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n disclose: {\n expected: 0,\n received: maxAge,\n message: \"Maximum age should be equal to 0\",\n },\n }\n }\n if (\n !queryResult.age.gte &&\n !queryResult.age.gt &&\n !queryResult.age.eq &&\n !queryResult.age.range &&\n minAge != 0\n ) {\n console.warn(\"Minimum age should be equal to 0\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n disclose: {\n expected: 0,\n received: minAge,\n message: \"Minimum age should be equal to 0\",\n },\n }\n }\n if (\n queryResult.age.disclose &&\n (queryResult.age.disclose.result !== minAge || queryResult.age.disclose.result !== maxAge)\n ) {\n console.warn(\"Age does not match the disclosed age in query result\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n disclose: {\n expected: `${minAge}`,\n received: `${queryResult.age.disclose.result}`,\n message: \"Age does not match the disclosed age in query result\",\n },\n }\n }\n } else {\n console.warn(\"Age is not set in the query result\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n disclose: {\n message: \"Age is not set in the query result\",\n },\n }\n }\n if (\n queryResult.age?.gte &&\n (originalQuery.age?.gte === undefined ||\n queryResult.age.gte.expected !== originalQuery.age.gte)\n ) {\n console.warn(\"Age gte does not match the original query\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n gte: {\n expected: originalQuery.age?.gte,\n received: queryResult.age.gte.expected,\n message: \"Age gte does not match the original query\",\n },\n }\n }\n if (\n queryResult.age?.gt &&\n (originalQuery.age?.gt === undefined || queryResult.age.gt.expected !== originalQuery.age.gt)\n ) {\n console.warn(\"Age gt does not match the original query\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n gt: {\n expected: originalQuery.age?.gt,\n received: queryResult.age.gt.expected,\n message: \"Age gt does not match the original query\",\n },\n }\n }\n if (\n queryResult.age?.lt &&\n (originalQuery.age?.lt === undefined || queryResult.age.lt.expected !== originalQuery.age.lt)\n ) {\n console.warn(\"Age lt does not match the original query\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n lt: {\n expected: originalQuery.age?.lt,\n received: queryResult.age.lt.expected,\n message: \"Age lt does not match the original query\",\n },\n }\n }\n if (\n queryResult.age?.lte &&\n (originalQuery.age?.lte === undefined ||\n queryResult.age.lte.expected !== originalQuery.age.lte)\n ) {\n console.warn(\"Age lte does not match the original query\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n lte: {\n expected: originalQuery.age?.lte,\n received: queryResult.age.lte.expected,\n message: \"Age lte does not match the original query\",\n },\n }\n }\n if (\n queryResult.age?.eq &&\n (originalQuery.age?.eq === undefined || queryResult.age.eq.expected !== originalQuery.age.eq)\n ) {\n console.warn(\"Age eq does not match the original query\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n eq: {\n expected: originalQuery.age?.eq,\n received: queryResult.age.eq.expected,\n message: \"Age eq does not match the original query\",\n },\n }\n }\n if (\n queryResult.age?.range &&\n (originalQuery.age?.range === undefined ||\n queryResult.age.range.expected[0] !== originalQuery.age.range[0] ||\n queryResult.age.range.expected[1] !== originalQuery.age.range[1])\n ) {\n console.warn(\"Age range does not match the original query\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n range: {\n expected: originalQuery.age?.range,\n received: queryResult.age.range.expected,\n message: \"Age range does not match the original query\",\n },\n }\n }\n if (queryResult.age?.disclose && !originalQuery.age?.disclose) {\n console.warn(\"Age disclose is not in the original query\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n disclose: {\n expected: \"Not requested in original query\",\n received: `${queryResult.age.disclose.result}`,\n message: \"Age disclose is not in the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkBirthdatePublicInputs(\n proof: ProofResult,\n originalQuery: Query,\n queryResult: QueryResult,\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n const currentTime = new Date()\n // TODO: Fix unused variable\n const _today = new Date(\n currentTime.getFullYear(),\n currentTime.getMonth(),\n currentTime.getDate(),\n 0,\n 0,\n 0,\n )\n const minDate = getBirthdateMinDateTimestamp(\n (proof.committedInputs?.compare_birthdate as DateCommittedInputs) ??\n (proof.committedInputs?.compare_birthdate_evm as DateCommittedInputs),\n -1 * SECONDS_BETWEEN_1900_AND_1970,\n )\n const maxDate = getBirthdateMaxDateTimestamp(\n (proof.committedInputs?.compare_birthdate as DateCommittedInputs) ??\n (proof.committedInputs?.compare_birthdate_evm as DateCommittedInputs),\n -1 * SECONDS_BETWEEN_1900_AND_1970,\n )\n if (queryResult.birthdate) {\n if (\n queryResult.birthdate.gte &&\n queryResult.birthdate.gte.result &&\n !areDatesEqual(minDate, queryResult.birthdate.gte.expected)\n ) {\n console.warn(\"Birthdate is not greater than or equal to the expected birthdate\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n gte: {\n expected: queryResult.birthdate.gte.expected,\n received: minDate,\n message: \"Birthdate is not greater than or equal to the expected birthdate\",\n },\n }\n }\n if (queryResult.birthdate.gt && queryResult.birthdate.gt.result) {\n const expectedPlusOneDay = new Date(queryResult.birthdate.gt.expected as Date)\n expectedPlusOneDay.setDate(expectedPlusOneDay.getDate() + 1)\n if (!areDatesEqual(minDate, expectedPlusOneDay)) {\n console.warn(\"Birthdate is not greater than the expected birthdate\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n gt: {\n expected: queryResult.birthdate.gt.expected,\n received: minDate,\n message: \"Birthdate is not greater than the expected birthdate\",\n },\n }\n }\n }\n if (\n queryResult.birthdate.lte &&\n queryResult.birthdate.lte.result &&\n !areDatesEqual(maxDate, queryResult.birthdate.lte.expected)\n ) {\n console.warn(\"Birthdate is not less than the expected birthdate\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n lte: {\n expected: queryResult.birthdate.lte.expected,\n received: maxDate,\n message: \"Birthdate is not less than the expected birthdate\",\n },\n }\n }\n if (queryResult.birthdate.lt && queryResult.birthdate.lt.result) {\n const expectedMinusOneDay = new Date(queryResult.birthdate.lt.expected as Date)\n expectedMinusOneDay.setDate(expectedMinusOneDay.getDate() - 1)\n if (!areDatesEqual(maxDate, expectedMinusOneDay)) {\n console.warn(\"Birthdate is not less than the expected birthdate\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n lt: {\n expected: queryResult.birthdate.lt.expected,\n received: maxDate,\n message: \"Birthdate is not less than the expected birthdate\",\n },\n }\n }\n }\n if (queryResult.birthdate.range) {\n if (\n queryResult.birthdate.range.result &&\n (!areDatesEqual(minDate, queryResult.birthdate.range.expected[0]) ||\n !areDatesEqual(maxDate, queryResult.birthdate.range.expected[1]))\n ) {\n console.warn(\"Birthdate is not in the expected range\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n range: {\n expected: queryResult.birthdate.range.expected,\n received: [minDate, maxDate],\n message: \"Birthdate is not in the expected range\",\n },\n }\n }\n }\n if (\n !queryResult.birthdate.lte &&\n !queryResult.birthdate.lt &&\n !queryResult.birthdate.eq &&\n !queryResult.birthdate.range &&\n !areDatesEqual(maxDate, DEFAULT_DATE_VALUE)\n ) {\n console.warn(\"Maximum birthdate should be equal to default date value\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n disclose: {\n expected: `${DEFAULT_DATE_VALUE.toISOString()}`,\n received: `${maxDate.toISOString()}`,\n message: \"Maximum birthdate should be equal to default date value\",\n },\n }\n }\n if (\n !queryResult.birthdate.gte &&\n !queryResult.birthdate.gt &&\n !queryResult.birthdate.eq &&\n !queryResult.birthdate.range &&\n !areDatesEqual(minDate, DEFAULT_DATE_VALUE)\n ) {\n console.warn(\"Minimum birthdate should be equal to default date value\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n disclose: {\n expected: `${DEFAULT_DATE_VALUE.toISOString()}`,\n received: `${minDate.toISOString()}`,\n message: \"Minimum birthdate should be equal to default date value\",\n },\n }\n }\n } else {\n console.warn(\"Birthdate is not set in the query result\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n disclose: {\n message: \"Birthdate is not set in the query result\",\n },\n }\n }\n if (\n queryResult.birthdate?.gte &&\n (originalQuery.birthdate?.gte === undefined ||\n !areDatesEqual(queryResult.birthdate.gte.expected, originalQuery.birthdate.gte as Date))\n ) {\n console.warn(\"Birthdate gte does not match the original query\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n gte: {\n expected: originalQuery.birthdate?.gte,\n received: queryResult.birthdate.gte.expected,\n message: \"Birthdate gte does not match the original query\",\n },\n }\n }\n if (\n queryResult.birthdate?.gt &&\n (originalQuery.birthdate?.gt === undefined ||\n !areDatesEqual(queryResult.birthdate.gt.expected, originalQuery.birthdate.gt as Date))\n ) {\n console.warn(\"Birthdate gt does not match the original query\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n gt: {\n expected: originalQuery.birthdate?.gt,\n received: queryResult.birthdate.gt.expected,\n message: \"Birthdate gt does not match the original query\",\n },\n }\n }\n if (\n queryResult.birthdate?.lte &&\n (originalQuery.birthdate?.lte === undefined ||\n !areDatesEqual(queryResult.birthdate.lte.expected, originalQuery.birthdate.lte as Date))\n ) {\n console.warn(\"Birthdate lte does not match the original query\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n lte: {\n expected: originalQuery.birthdate?.lte,\n received: queryResult.birthdate.lte.expected,\n message: \"Birthdate lte does not match the original query\",\n },\n }\n }\n if (\n queryResult.birthdate?.lt &&\n (originalQuery.birthdate?.lt === undefined ||\n !areDatesEqual(queryResult.birthdate.lt.expected, originalQuery.birthdate.lt as Date))\n ) {\n console.warn(\"Birthdate lt does not match the original query\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n lt: {\n expected: originalQuery.birthdate?.lt,\n received: queryResult.birthdate.lt.expected,\n message: \"Birthdate lt does not match the original query\",\n },\n }\n }\n if (\n queryResult.birthdate?.range &&\n (originalQuery.birthdate?.range === undefined ||\n !areDatesEqual(\n queryResult.birthdate.range.expected[0],\n originalQuery.birthdate.range[0] as Date,\n ) ||\n !areDatesEqual(\n queryResult.birthdate.range.expected[1],\n originalQuery.birthdate.range[1] as Date,\n ))\n ) {\n console.warn(\"Birthdate range does not match the original query\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n range: {\n expected: originalQuery.birthdate?.range,\n received: queryResult.birthdate.range.expected,\n message: \"Birthdate range does not match the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkExpiryDatePublicInputs(\n proof: ProofResult,\n originalQuery: Query,\n queryResult: QueryResult,\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n const currentTime = new Date()\n // TODO: Fix unused variable\n const _today = new Date(\n currentTime.getFullYear(),\n currentTime.getMonth(),\n currentTime.getDate(),\n 0,\n 0,\n 0,\n )\n const minDate = getMinDateFromCommittedInputs(\n (proof.committedInputs?.compare_expiry as DateCommittedInputs) ??\n (proof.committedInputs?.compare_expiry_evm as DateCommittedInputs),\n )\n const maxDate = getMaxDateFromCommittedInputs(\n (proof.committedInputs?.compare_expiry as DateCommittedInputs) ??\n (proof.committedInputs?.compare_expiry_evm as DateCommittedInputs),\n )\n if (queryResult.expiry_date) {\n if (\n queryResult.expiry_date.gte &&\n queryResult.expiry_date.gte.result &&\n !areDatesEqual(minDate, queryResult.expiry_date.gte.expected)\n ) {\n console.warn(\"Expiry date is not greater than or equal to the expected expiry date\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n gte: {\n expected: queryResult.expiry_date.gte.expected,\n received: minDate,\n message: \"Expiry date is not greater than or equal to the expected expiry date\",\n },\n }\n }\n if (\n queryResult.expiry_date.lte &&\n queryResult.expiry_date.lte.result &&\n !areDatesEqual(maxDate, queryResult.expiry_date.lte.expected)\n ) {\n console.warn(\"Expiry date is not less than the expected expiry date\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n lte: {\n expected: queryResult.expiry_date.lte.expected,\n received: maxDate,\n message: \"Expiry date is not less than the expected expiry date\",\n },\n }\n }\n if (queryResult.expiry_date.range) {\n if (\n queryResult.expiry_date.range.result &&\n (!areDatesEqual(minDate, queryResult.expiry_date.range.expected[0]) ||\n !areDatesEqual(maxDate, queryResult.expiry_date.range.expected[1]))\n ) {\n console.warn(\"Expiry date is not in the expected range\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n range: {\n expected: queryResult.expiry_date.range.expected,\n received: [minDate, maxDate],\n message: \"Expiry date is not in the expected range\",\n },\n }\n }\n }\n if (\n !queryResult.expiry_date.lte &&\n !queryResult.expiry_date.lt &&\n !queryResult.expiry_date.eq &&\n !queryResult.expiry_date.range &&\n !areDatesEqual(maxDate, DEFAULT_DATE_VALUE)\n ) {\n console.warn(\"Maximum expiry date should be equal to default date value\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n disclose: {\n expected: `${DEFAULT_DATE_VALUE.toISOString()}`,\n received: `${maxDate.toISOString()}`,\n message: \"Maximum expiry date should be equal to default date value\",\n },\n }\n }\n if (\n !queryResult.expiry_date.gte &&\n !queryResult.expiry_date.gt &&\n !queryResult.expiry_date.eq &&\n !queryResult.expiry_date.range &&\n !areDatesEqual(minDate, DEFAULT_DATE_VALUE)\n ) {\n console.warn(\"Minimum expiry date should be equal to default date value\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n disclose: {\n expected: `${DEFAULT_DATE_VALUE.toISOString()}`,\n received: `${minDate.toISOString()}`,\n message: \"Minimum expiry date should be equal to default date value\",\n },\n }\n }\n } else {\n console.warn(\"Expiry date is not set in the query result\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n disclose: {\n message: \"Expiry date is not set in the query result\",\n },\n }\n }\n if (\n queryResult.expiry_date?.gte &&\n (originalQuery.expiry_date?.gte === undefined ||\n !areDatesEqual(queryResult.expiry_date.gte.expected, originalQuery.expiry_date.gte as Date))\n ) {\n console.warn(\"Expiry date gte does not match the original query\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n gte: {\n expected: originalQuery.expiry_date?.gte,\n received: queryResult.expiry_date.gte.expected,\n message: \"Expiry date gte does not match the original query\",\n },\n }\n }\n if (\n queryResult.expiry_date?.gt &&\n (originalQuery.expiry_date?.gt === undefined ||\n !areDatesEqual(queryResult.expiry_date.gt.expected, originalQuery.expiry_date.gt as Date))\n ) {\n console.warn(\"Expiry date gt does not match the original query\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n gt: {\n expected: originalQuery.expiry_date?.gt,\n received: queryResult.expiry_date.gt.expected,\n message: \"Expiry date gt does not match the original query\",\n },\n }\n }\n if (\n queryResult.expiry_date?.lte &&\n (originalQuery.expiry_date?.lte === undefined ||\n !areDatesEqual(queryResult.expiry_date.lte.expected, originalQuery.expiry_date.lte as Date))\n ) {\n console.warn(\"Expiry date lte does not match the original query\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n lte: {\n expected: originalQuery.expiry_date?.lte,\n received: queryResult.expiry_date.lte.expected,\n message: \"Expiry date lte does not match the original query\",\n },\n }\n }\n if (\n queryResult.expiry_date?.lt &&\n (originalQuery.expiry_date?.lt === undefined ||\n !areDatesEqual(queryResult.expiry_date.lt.expected, originalQuery.expiry_date.lt as Date))\n ) {\n console.warn(\"Expiry date lt does not match the original query\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n lt: {\n expected: originalQuery.expiry_date?.lt,\n received: queryResult.expiry_date.lt.expected,\n message: \"Expiry date lt does not match the original query\",\n },\n }\n }\n if (\n queryResult.expiry_date?.range &&\n (originalQuery.expiry_date?.range === undefined ||\n !areDatesEqual(\n queryResult.expiry_date.range.expected[0],\n originalQuery.expiry_date.range[0] as Date,\n ) ||\n !areDatesEqual(\n queryResult.expiry_date.range.expected[1],\n originalQuery.expiry_date.range[1] as Date,\n ))\n ) {\n console.warn(\"Expiry date range does not match the original query\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n range: {\n expected: originalQuery.expiry_date?.range,\n received: queryResult.expiry_date.range.expected,\n message: \"Expiry date range does not match the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkNationalityExclusionPublicInputs(\n originalQuery: Query,\n queryResult: QueryResult,\n countryList: string[],\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n if (\n queryResult.nationality &&\n queryResult.nationality.out &&\n queryResult.nationality.out.result\n ) {\n if (\n !queryResult.nationality.out.expected?.every((country) => countryList.includes(country))\n ) {\n console.warn(\"Nationality exclusion list does not match the one from the query results\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n out: {\n expected: queryResult.nationality.out.expected,\n received: countryList,\n message: \"Nationality exclusion list does not match the one from the query results\",\n },\n }\n }\n } else if (!queryResult.nationality || !queryResult.nationality.out) {\n console.warn(\"Nationality exclusion is not set in the query result\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n out: {\n message: \"Nationality exclusion is not set in the query result\",\n },\n }\n }\n // Check the countryList is in ascending order\n // If the prover doesn't use a sorted list then the proof cannot be trusted\n // as it is requirement in the circuit for the exclusion check to work\n for (let i = 1; i < countryList.length; i++) {\n if (countryList[i] < countryList[i - 1]) {\n console.warn(\n \"The nationality exclusion list has not been sorted, and thus the proof cannot be trusted\",\n )\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n out: {\n message:\n \"The nationality exclusion list has not been sorted, and thus the proof cannot be trusted\",\n },\n }\n }\n }\n if (\n queryResult.nationality?.out &&\n (originalQuery.nationality?.out === undefined ||\n queryResult.nationality.out.expected?.length !==\n (originalQuery.nationality.out as string[]).length ||\n !queryResult.nationality.out.expected?.every((country) =>\n (originalQuery.nationality!.out as string[]).includes(country),\n ))\n ) {\n console.warn(\"Nationality exclusion list does not match the original query\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n out: {\n expected: originalQuery.nationality?.out as string[],\n received: queryResult.nationality.out.expected,\n message: \"Nationality exclusion list does not match the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkIssuingCountryExclusionPublicInputs(\n originalQuery: Query,\n queryResult: QueryResult,\n countryList: string[],\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n\n if (\n queryResult.issuing_country &&\n queryResult.issuing_country.out &&\n queryResult.issuing_country.out.result\n ) {\n if (\n !queryResult.issuing_country.out.expected?.every((country) => countryList.includes(country))\n ) {\n console.warn(\"Issuing country exclusion list does not match the one from the query results\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n out: {\n expected: queryResult.issuing_country.out.expected,\n received: countryList,\n message: \"Issuing country exclusion list does not match the one from the query results\",\n },\n }\n }\n } else if (!queryResult.issuing_country || !queryResult.issuing_country.out) {\n console.warn(\"Issuing country exclusion is not set in the query result\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n out: {\n message: \"Issuing country exclusion is not set in the query result\",\n },\n }\n }\n // Check the countryList is in ascending order\n // If the prover doesn't use a sorted list then the proof cannot be trusted\n // as it is requirement in the circuit for the exclusion check to work\n for (let i = 1; i < countryList.length; i++) {\n if (countryList[i] < countryList[i - 1]) {\n console.warn(\n \"The issuing country exclusion list has not been sorted, and thus the proof cannot be trusted\",\n )\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n out: {\n message:\n \"The issuing country exclusion list has not been sorted, and thus the proof cannot be trusted\",\n },\n }\n }\n }\n if (\n queryResult.issuing_country?.out &&\n (originalQuery.issuing_country?.out === undefined ||\n queryResult.issuing_country.out.expected?.length !==\n (originalQuery.issuing_country.out as string[]).length ||\n !queryResult.issuing_country.out.expected?.every((country) =>\n (originalQuery.issuing_country!.out as string[]).includes(country),\n ))\n ) {\n console.warn(\"Issuing country exclusion list does not match the original query\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n out: {\n expected: originalQuery.issuing_country?.out as string[],\n received: queryResult.issuing_country.out.expected,\n message: \"Issuing country exclusion list does not match the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkNationalityInclusionPublicInputs(\n originalQuery: Query,\n queryResult: QueryResult,\n countryList: string[],\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n if (\n queryResult.nationality &&\n queryResult.nationality.in &&\n queryResult.nationality.in.result\n ) {\n if (!queryResult.nationality.in.expected?.every((country) => countryList.includes(country))) {\n console.warn(\"Nationality inclusion list does not match the one from the query results\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n in: {\n expected: queryResult.nationality.in.expected,\n received: countryList,\n message: \"Nationality inclusion list does not match the one from the query results\",\n },\n }\n }\n } else if (!queryResult.nationality || !queryResult.nationality.in) {\n console.warn(\"Nationality inclusion is not set in the query result\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n in: {\n message: \"Nationality inclusion is not set in the query result\",\n },\n }\n }\n if (\n queryResult.nationality?.in &&\n (originalQuery.nationality?.in === undefined ||\n queryResult.nationality.in.expected?.length !==\n (originalQuery.nationality.in as string[]).length ||\n !queryResult.nationality.in.expected?.every((country) =>\n (originalQuery.nationality!.in as string[]).includes(country),\n ))\n ) {\n console.warn(\"Nationality inclusion list does not match the original query\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n in: {\n expected: originalQuery.nationality?.in as string[],\n received: queryResult.nationality.in.expected,\n message: \"Nationality inclusion list does not match the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkIssuingCountryInclusionPublicInputs(\n originalQuery: Query,\n queryResult: QueryResult,\n countryList: string[],\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n\n if (\n queryResult.issuing_country &&\n queryResult.issuing_country.in &&\n queryResult.issuing_country.in.result\n ) {\n if (\n !queryResult.issuing_country.in.expected?.every((country) => countryList.includes(country))\n ) {\n console.warn(\"Issuing country inclusion list does not match the one from the query results\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n in: {\n expected: queryResult.issuing_country.in.expected,\n received: countryList,\n message: \"Issuing country inclusion list does not match the one from the query results\",\n },\n }\n }\n } else if (!queryResult.issuing_country || !queryResult.issuing_country.in) {\n console.warn(\"Issuing country inclusion is not set in the query result\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n in: {\n message: \"Issuing country inclusion is not set in the query result\",\n },\n }\n }\n if (\n queryResult.issuing_country?.in &&\n (originalQuery.issuing_country?.in === undefined ||\n queryResult.issuing_country.in.expected?.length !==\n (originalQuery.issuing_country.in as string[]).length ||\n !queryResult.issuing_country.in.expected?.every((country) =>\n (originalQuery.issuing_country!.in as string[]).includes(country),\n ))\n ) {\n console.warn(\"Issuing country inclusion list does not match the original query\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n in: {\n expected: originalQuery.issuing_country?.in as string[],\n received: queryResult.issuing_country.in.expected,\n message: \"Issuing country inclusion list does not match the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkScopeFromDisclosureProof(\n domain: string,\n proofData: ProofData,\n queryResultErrors: Partial<QueryResultErrors>,\n key: string,\n scope?: string,\n ) {\n let isCorrect = true\n if (domain && getServiceScopeHash(domain) !== getServiceScopeFromDisclosureProof(proofData)) {\n console.warn(\"The proof comes from a different domain than the one expected\")\n isCorrect = false\n if (!queryResultErrors[key as keyof QueryResultErrors]) {\n queryResultErrors[key as keyof QueryResultErrors] = {}\n }\n queryResultErrors[key as keyof QueryResultErrors]!.scope = {\n expected: `Scope: ${getServiceScopeHash(domain).toString()}`,\n received: `Scope: ${BigInt(proofData.publicInputs[1]).toString()}`,\n message: \"The proof comes from a different domain than the one expected\",\n }\n }\n if (scope && getScopeHash(scope) !== getServiceSubScopeFromDisclosureProof(proofData)) {\n console.warn(\"The proof uses a different scope than the one expected\")\n isCorrect = false\n if (!queryResultErrors[key as keyof QueryResultErrors]) {\n queryResultErrors[key as keyof QueryResultErrors] = {}\n }\n queryResultErrors[key as keyof QueryResultErrors]!.scope = {\n expected: `Scope: ${getScopeHash(scope).toString()}`,\n received: `Scope: ${BigInt(proofData.publicInputs[2]).toString()}`,\n message: \"The proof uses a different scope than the one expected\",\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static async checkCertificateRegistryRoot(\n root: string,\n queryResultErrors: any,\n outer?: boolean,\n devMode?: boolean,\n ) {\n let isCorrect = true\n try {\n const registryClient = new RegistryClient({ chainId: devMode ? 11155111 : 1 })\n const isValid = await registryClient.isCertificateRootValid(root)\n if (!isValid) {\n console.warn(\"The ID was signed by an unrecognized root certificate\")\n isCorrect = false\n if (!queryResultErrors[outer ? \"outer\" : \"sig_check_dsc\"]) {\n queryResultErrors[outer ? \"outer\" : \"sig_check_dsc\"] = {}\n }\n queryResultErrors[outer ? \"outer\" : \"sig_check_dsc\"].certificate = {\n expected: `A valid root from ZKPassport Registry`,\n received: `Got invalid certificate registry root: ${root}`,\n message: \"The ID was signed by an unrecognized root certificate\",\n }\n }\n } catch (error) {\n console.warn(error)\n console.warn(\"The ID was signed by an unrecognized root certificate\")\n isCorrect = false\n if (!queryResultErrors[outer ? \"outer\" : \"sig_check_dsc\"]) {\n queryResultErrors[outer ? \"outer\" : \"sig_check_dsc\"] = {}\n }\n queryResultErrors[outer ? \"outer\" : \"sig_check_dsc\"].certificate = {\n expected: `A valid root from ZKPassport Registry`,\n received: `Got invalid certificate registry root: ${root}`,\n message: \"The ID was signed by an unrecognized root certificate\",\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static async checkCircuitRegistryRoot(\n root: string,\n queryResultErrors: any,\n devMode?: boolean,\n ) {\n let isCorrect = true\n try {\n const registryClient = new RegistryClient({ chainId: devMode ? 11155111 : 1 })\n const isValid = await registryClient.isCircuitRootValid(root)\n if (!isValid) {\n console.warn(\"The proof uses unrecognized circuits\")\n isCorrect = false\n if (!queryResultErrors.outer) queryResultErrors.outer = {}\n queryResultErrors.outer.circuit = {\n expected: `A valid circuit from ZKPassport Registry`,\n received: `Got invalid circuit registry root: ${root}`,\n message: \"The proof uses an unrecognized circuit\",\n }\n }\n } catch (error) {\n console.warn(error)\n console.warn(\"The proof uses unrecognized circuits\")\n isCorrect = false\n if (!queryResultErrors.outer) queryResultErrors.outer = {}\n queryResultErrors.outer.circuit = {\n expected: `A valid circuit from ZKPassport Registry`,\n received: `Got invalid circuit registry root: ${root}`,\n message: \"The proof uses an unrecognized circuit\",\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static checkBindPublicInputs(\n originalQuery: Query,\n queryResult: QueryResult,\n boundData: BoundData,\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n\n if (queryResult.bind) {\n const bindMismatches: string[] = []\n if (\n queryResult.bind.user_address?.toLowerCase().replace(\"0x\", \"\") !==\n boundData.user_address?.toLowerCase().replace(\"0x\", \"\")\n ) {\n console.warn(\"Bound user address does not match the one from the query results\")\n isCorrect = false\n bindMismatches.push(\n `user_address: expected ${queryResult.bind.user_address}, received ${boundData.user_address}`,\n )\n }\n if (queryResult.bind.chain !== boundData.chain) {\n console.warn(\"Bound chain id does not match the one from the query results\")\n isCorrect = false\n bindMismatches.push(\n `chain: expected ${queryResult.bind.chain}, received ${boundData.chain}`,\n )\n }\n if (\n queryResult.bind.custom_data?.trim().toLowerCase() !==\n boundData.custom_data?.trim().toLowerCase()\n ) {\n console.warn(\"Bound custom data does not match the one from the query results\")\n isCorrect = false\n bindMismatches.push(\n `custom_data: expected ${queryResult.bind.custom_data}, received ${boundData.custom_data}`,\n )\n }\n if (bindMismatches.length > 0) {\n queryResultErrors.bind = {\n ...queryResultErrors.bind,\n eq: {\n expected: `${queryResult.bind.user_address}, ${queryResult.bind.chain}, ${queryResult.bind.custom_data}`,\n received: `${boundData.user_address}, ${boundData.chain}, ${boundData.custom_data}`,\n message: `Bound data does not match: ${bindMismatches.join(\"; \")}`,\n },\n }\n }\n }\n if (\n queryResult.bind &&\n (originalQuery.bind === undefined ||\n queryResult.bind.user_address?.toLowerCase().replace(\"0x\", \"\") !==\n originalQuery.bind.user_address?.toLowerCase().replace(\"0x\", \"\") ||\n queryResult.bind.chain !== originalQuery.bind.chain ||\n queryResult.bind.custom_data?.trim().toLowerCase() !==\n originalQuery.bind.custom_data?.trim().toLowerCase())\n ) {\n console.warn(\"Bound data does not match the original query\")\n isCorrect = false\n queryResultErrors.bind = {\n ...queryResultErrors.bind,\n eq: {\n expected: `${originalQuery.bind?.user_address}, ${originalQuery.bind?.chain}, ${originalQuery.bind?.custom_data}`,\n received: `${queryResult.bind.user_address}, ${queryResult.bind.chain}, ${queryResult.bind.custom_data}`,\n message: \"Bound data does not match the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static async checkSanctionsExclusionPublicInputs(\n originalQuery: Query,\n queryResult: QueryResult,\n sanctionsCommittedInputs: SanctionsCommittedInputs,\n sanctionsBuilder: SanctionsBuilder,\n ) {\n const queryResultErrors: Partial<QueryResultErrors> = {}\n let isCorrect = true\n if (queryResult.sanctions && queryResult.sanctions.passed) {\n // For now it's fixed until we streamline the update of the sanctions registry\n const EXPECTED_ROOT = await sanctionsBuilder.getRoot()\n if (sanctionsCommittedInputs.rootHash !== EXPECTED_ROOT) {\n console.warn(\"Invalid sanctions registry root\")\n isCorrect = false\n queryResultErrors.sanctions = {\n ...queryResultErrors.sanctions,\n eq: {\n expected: EXPECTED_ROOT,\n received: sanctionsCommittedInputs.rootHash,\n message: \"Invalid sanctions registry root\",\n },\n }\n }\n if (queryResult.sanctions.isStrict !== sanctionsCommittedInputs.isStrict) {\n console.warn(\"Invalid sanctions strict mode\")\n isCorrect = false\n queryResultErrors.sanctions = {\n ...queryResultErrors.sanctions,\n eq: {\n expected: queryResult.sanctions.isStrict.toString(),\n received: sanctionsCommittedInputs.isStrict.toString(),\n message: \"Invalid sanctions strict mode\",\n },\n }\n }\n }\n if (\n queryResult.sanctions &&\n (originalQuery.sanctions === undefined ||\n queryResult.sanctions.isStrict !== (originalQuery.sanctions.strict ?? false))\n ) {\n console.warn(\"Sanctions config does not match the original query\")\n isCorrect = false\n queryResultErrors.sanctions = {\n ...queryResultErrors.sanctions,\n eq: {\n expected: `strict: ${originalQuery.sanctions?.strict ?? false}`,\n received: `strict: ${queryResult.sanctions.isStrict}`,\n message: \"Sanctions config does not match the original query\",\n },\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static async checkFacematchPublicInputs(\n originalQuery: Query,\n queryResult: QueryResult,\n facematchCommittedInputs: FacematchCommittedInputs,\n ) {\n let isCorrect = true\n const queryResultErrors: Partial<QueryResultErrors> = {}\n if (queryResult.facematch && queryResult.facematch.passed) {\n // Check if the root key is either from Apple (iOS) or Google (Android)\n if (\n facematchCommittedInputs.rootKeyLeaf !== APPLE_APP_ATTEST_ROOT_KEY_HASH &&\n facematchCommittedInputs.rootKeyLeaf !== GOOGLE_APP_ATTEST_RSA_ROOT_KEY_HASH &&\n facematchCommittedInputs.rootKeyLeaf !== GOOGLE_APP_ATTEST_ECDSA_P384_ROOT_KEY_HASH\n ) {\n console.warn(\"Invalid facematch root key hash\")\n isCorrect = false\n queryResultErrors.facematch = {\n ...queryResultErrors.facematch,\n eq: {\n expected: `${APPLE_APP_ATTEST_ROOT_KEY_HASH} (iOS) or ${GOOGLE_APP_ATTEST_RSA_ROOT_KEY_HASH} (Android) or ${GOOGLE_APP_ATTEST_ECDSA_P384_ROOT_KEY_HASH} (Android)`,\n received: facematchCommittedInputs.rootKeyLeaf,\n message: \"Invalid facematch root key hash\",\n },\n }\n }\n const EXPECTED_ENVIRONMENT = \"production\"\n if (facematchCommittedInputs.environment !== EXPECTED_ENVIRONMENT) {\n console.warn(\"Invalid facematch environment, it should be production\")\n isCorrect = false\n queryResultErrors.facematch = {\n ...queryResultErrors.facematch,\n eq: {\n expected: EXPECTED_ENVIRONMENT,\n received: facematchCommittedInputs.environment,\n message: \"Invalid facematch environment, it should be production\",\n },\n }\n }\n if (\n facematchCommittedInputs.appIdHash !== ZKPASSPORT_IOS_APP_ID_HASH &&\n facematchCommittedInputs.appIdHash !== ZKPASSPORT_ANDROID_APP_ID_HASH\n ) {\n console.warn(\n \"Invalid facematch app id hash, the attestation should be coming from the ZKPassport app\",\n )\n isCorrect = false\n queryResultErrors.facematch = {\n ...queryResultErrors.facematch,\n eq: {\n expected: `${ZKPASSPORT_IOS_APP_ID_HASH} (iOS) or ${ZKPASSPORT_ANDROID_APP_ID_HASH} (Android)`,\n received: facematchCommittedInputs.appIdHash,\n message:\n \"Invalid facematch app id hash, the attestation should be coming from the ZKPassport app\",\n },\n }\n }\n if (\n facematchCommittedInputs.mode !== queryResult.facematch?.mode ||\n facematchCommittedInputs.mode !== originalQuery.facematch?.mode\n ) {\n console.warn(\"Invalid facematch mode\")\n isCorrect = false\n queryResultErrors.facematch = {\n ...queryResultErrors.facematch,\n eq: {\n expected: originalQuery.facematch?.mode,\n received: facematchCommittedInputs.mode,\n message: \"Invalid facematch mode\",\n },\n }\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n private static async checkCurrentDate(\n circuitName: keyof QueryResultErrors,\n proofData: ProofData,\n validity: number,\n queryResultErrors: Partial<QueryResultErrors>,\n ) {\n const currentTime = new Date()\n const today = new Date(\n currentTime.getFullYear(),\n currentTime.getMonth(),\n currentTime.getDate(),\n 0,\n 0,\n 0,\n 0,\n )\n const currentDate = getCurrentDateFromDisclosureProof(proofData)\n const todayToCurrentDate = today.getTime() - currentDate.getTime()\n const expectedDifference = validity ? validity * 1000 : DEFAULT_VALIDITY * 1000\n let isCorrect = true\n if (todayToCurrentDate >= expectedDifference) {\n console.warn(\"The date used to check the validity of the ID falls out of the validity period\")\n isCorrect = false\n if (!queryResultErrors[circuitName as keyof QueryResultErrors]) {\n queryResultErrors[circuitName as keyof QueryResultErrors] = {}\n }\n queryResultErrors[circuitName as keyof QueryResultErrors]!.date = {\n expected: `Difference: ${validity} seconds`,\n received: `Difference: ${Math.round(todayToCurrentDate / 1000)} seconds`,\n message: \"The date used to check the validity of the ID falls out of the validity period\",\n }\n }\n return { isCorrect, queryResultErrors }\n }\n\n public static async checkPublicInputs(\n domain: string,\n proofs: Array<ProofResult>,\n originalQuery: Query,\n queryResult: QueryResult,\n validity?: number,\n scope?: string,\n oprfKeyId?: string,\n devMode?: boolean,\n ) {\n let commitmentIn: bigint | undefined\n let commitmentOut: bigint | undefined\n let isCorrect = true\n let uniqueIdentifier: string | undefined\n let uniqueIdentifierType: NullifierType | undefined\n const currentTime = new Date()\n const today = new Date(\n currentTime.getFullYear(),\n currentTime.getMonth(),\n currentTime.getDate(),\n 0,\n 0,\n 0,\n 0,\n )\n let queryResultErrors: Partial<QueryResultErrors> = {}\n\n // Since the order is important for the commitments, we need to sort the proofs\n // by their expected order: root signature check -> ID signature check -> integrity check -> disclosure\n const sortedProofs = proofs.sort((a, b) => {\n const proofOrder = [\n \"sig_check_dsc\",\n \"sig_check_id_data\",\n \"data_check_integrity\",\n \"disclose_bytes\",\n \"compare_age\",\n \"compare_birthdate\",\n \"compare_expiry\",\n \"exclusion_check_nationality\",\n \"inclusion_check_nationality\",\n \"exclusion_check_issuing_country\",\n \"inclusion_check_issuing_country\",\n \"bind\",\n \"exclusion_check_sanctions\",\n \"facematch\",\n ]\n const getIndex = (proof: ProofResult) => {\n const name = proof.name || \"\"\n return proofOrder.findIndex((p) => name.startsWith(p))\n }\n return getIndex(a) - getIndex(b)\n })\n\n for (const proof of sortedProofs!) {\n const proofData = getProofData(proof.proof as string, getNumberOfPublicInputs(proof.name!))\n if (proof.name?.startsWith(\"outer\")) {\n const isForEVM = proof.name?.startsWith(\"outer_evm\")\n const certificateRegistryRoot = getCertificateRegistryRootFromOuterProof(proofData)\n const {\n isCorrect: isCorrectCertificateRegistryRoot,\n queryResultErrors: queryResultErrorsCertificateRegistryRoot,\n } = await this.checkCertificateRegistryRoot(\n certificateRegistryRoot.toString(16),\n queryResultErrors,\n true,\n devMode,\n )\n isCorrect = isCorrect && isCorrectCertificateRegistryRoot\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCertificateRegistryRoot,\n }\n\n const circuitRegistryRoot = getCircuitRegistryRootFromOuterProof(proofData)\n const {\n isCorrect: isCorrectCircuitRegistryRoot,\n queryResultErrors: queryResultErrorsCircuitRegistryRoot,\n } = await this.checkCircuitRegistryRoot(\n circuitRegistryRoot.toString(16),\n queryResultErrors,\n devMode,\n )\n isCorrect = isCorrect && isCorrectCircuitRegistryRoot\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCircuitRegistryRoot,\n }\n\n const currentDate = getCurrentDateFromOuterProof(proofData)\n const todayToCurrentDate = today.getTime() - currentDate.getTime()\n const expectedDifference = validity ? validity * 1000 : DEFAULT_VALIDITY * 1000\n if (todayToCurrentDate >= expectedDifference) {\n console.warn(\n `The date used to check the validity of the ID is older than the validity period`,\n )\n isCorrect = false\n queryResultErrors.outer = {\n ...queryResultErrors.outer,\n date: {\n expected: `Difference: ${validity} seconds`,\n received: `Difference: ${Math.round(todayToCurrentDate / 1000)} seconds`,\n message:\n \"The date used to check the validity of the ID is older than the validity period\",\n },\n }\n }\n const paramCommitments = getParamCommitmentsFromOuterProof(proofData)\n const committedInputs = proof.committedInputs\n const keysInCommittedInputs = Object.keys(committedInputs || {})\n if (keysInCommittedInputs.length !== paramCommitments.length) {\n console.warn(\"The proof does not verify all the requested conditions and information\")\n isCorrect = false\n queryResultErrors.outer = {\n ...queryResultErrors.outer,\n commitment: {\n expected: `Number of parameter commitments: ${paramCommitments.length}`,\n received: `Number of disclosure proofs provided: ${keysInCommittedInputs.length}`,\n message: \"The proof does not verify all the requested conditions and information\",\n },\n }\n }\n if (domain && getServiceScopeHash(domain) !== getScopeFromOuterProof(proofData)) {\n console.warn(\"The proof comes from a different domain than the one expected\")\n isCorrect = false\n queryResultErrors.outer = {\n ...queryResultErrors.outer,\n scope: {\n expected: `Scope: ${getServiceScopeHash(domain).toString()}`,\n received: `Scope: ${getScopeFromOuterProof(proofData).toString()}`,\n message: \"The proof comes from a different domain than the one expected\",\n },\n }\n }\n if (scope && getScopeHash(scope) !== getSubscopeFromOuterProof(proofData)) {\n console.warn(\"The proof uses a different scope than the one expected\")\n isCorrect = false\n queryResultErrors.outer = {\n ...queryResultErrors.outer,\n scope: {\n expected: `Scope: ${getScopeHash(scope).toString()}`,\n received: `Scope: ${getSubscopeFromOuterProof(proofData).toString()}`,\n message: \"The proof uses a different scope than the one expected\",\n },\n }\n }\n if (!!committedInputs?.compare_age || !!committedInputs?.compare_age_evm) {\n const ageCommittedInputs =\n (committedInputs?.compare_age as AgeCommittedInputs) ??\n (committedInputs?.compare_age_evm as AgeCommittedInputs)\n const ageParameterCommitment = isForEVM\n ? await getAgeEVMParameterCommitment(\n ageCommittedInputs.minAge,\n ageCommittedInputs.maxAge,\n )\n : await getAgeParameterCommitment(ageCommittedInputs.minAge, ageCommittedInputs.maxAge)\n if (!paramCommitments.includes(ageParameterCommitment)) {\n console.warn(\"This proof does not verify the age\")\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n commitment: {\n expected: `Age parameter commitment: ${ageParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the age\",\n },\n }\n }\n const { isCorrect: isCorrectAge, queryResultErrors: queryResultErrorsAge } =\n this.checkAgePublicInputs(proof, originalQuery, queryResult)\n isCorrect = isCorrect && isCorrectAge\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsAge,\n }\n }\n if (!!committedInputs?.compare_birthdate || !!committedInputs?.compare_birthdate_evm) {\n const birthdateCommittedInputs =\n (committedInputs?.compare_birthdate as DateCommittedInputs) ??\n (committedInputs?.compare_birthdate_evm as DateCommittedInputs)\n const birthdateParameterCommitment = isForEVM\n ? await getDateEVMParameterCommitment(\n ProofType.BIRTHDATE,\n birthdateCommittedInputs.minDateTimestamp,\n birthdateCommittedInputs.maxDateTimestamp,\n 0,\n )\n : await getDateParameterCommitment(\n ProofType.BIRTHDATE,\n birthdateCommittedInputs.minDateTimestamp,\n birthdateCommittedInputs.maxDateTimestamp,\n 0,\n )\n if (!paramCommitments.includes(birthdateParameterCommitment)) {\n console.warn(\"This proof does not verify the birthdate\")\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n commitment: {\n expected: `Birthdate parameter commitment: ${birthdateParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the birthdate\",\n },\n }\n }\n const { isCorrect: isCorrectBirthdate, queryResultErrors: queryResultErrorsBirthdate } =\n this.checkBirthdatePublicInputs(proof, originalQuery, queryResult)\n isCorrect = isCorrect && isCorrectBirthdate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsBirthdate,\n }\n }\n if (!!committedInputs?.compare_expiry || !!committedInputs?.compare_expiry_evm) {\n const expiryCommittedInputs =\n (committedInputs?.compare_expiry as DateCommittedInputs) ??\n (committedInputs?.compare_expiry_evm as DateCommittedInputs)\n const expiryParameterCommitment = isForEVM\n ? await getDateEVMParameterCommitment(\n ProofType.EXPIRY_DATE,\n expiryCommittedInputs.minDateTimestamp,\n expiryCommittedInputs.maxDateTimestamp,\n )\n : await getDateParameterCommitment(\n ProofType.EXPIRY_DATE,\n expiryCommittedInputs.minDateTimestamp,\n expiryCommittedInputs.maxDateTimestamp,\n )\n if (!paramCommitments.includes(expiryParameterCommitment)) {\n console.warn(\"This proof does not verify the expiry date\")\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n commitment: {\n expected: `Expiry date parameter commitment: ${expiryParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the expiry date\",\n },\n }\n }\n const { isCorrect: isCorrectExpiryDate, queryResultErrors: queryResultErrorsExpiryDate } =\n this.checkExpiryDatePublicInputs(proof, originalQuery, queryResult)\n isCorrect = isCorrect && isCorrectExpiryDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsExpiryDate,\n }\n }\n if (!!committedInputs?.disclose_bytes || !!committedInputs?.disclose_bytes_evm) {\n const discloseCommittedInputs =\n (committedInputs?.disclose_bytes as DiscloseCommittedInputs) ??\n (committedInputs?.disclose_bytes_evm as DiscloseCommittedInputs)\n const discloseParameterCommitment = isForEVM\n ? await getDiscloseEVMParameterCommitment(\n discloseCommittedInputs.discloseMask,\n discloseCommittedInputs.disclosedBytes,\n )\n : await getDiscloseParameterCommitment(\n discloseCommittedInputs.discloseMask,\n discloseCommittedInputs.disclosedBytes,\n )\n if (!paramCommitments.includes(discloseParameterCommitment)) {\n console.warn(\"This proof does not verify any of the data disclosed\")\n isCorrect = false\n queryResultErrors.disclose = {\n ...queryResultErrors.disclose,\n commitment: {\n expected: `Disclosure parameter commitment: ${discloseParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify any of the data disclosed\",\n },\n }\n }\n const { isCorrect: isCorrectDisclose, queryResultErrors: queryResultErrorsDisclose } =\n this.checkDiscloseBytesPublicInputs(proof, originalQuery, queryResult)\n isCorrect = isCorrect && isCorrectDisclose\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsDisclose,\n }\n }\n if (\n !!committedInputs?.inclusion_check_nationality ||\n !!committedInputs?.inclusion_check_nationality_evm\n ) {\n const inclusionCheckNationalityCommittedInputs =\n (committedInputs?.inclusion_check_nationality as CountryCommittedInputs) ??\n (committedInputs?.inclusion_check_nationality_evm as CountryCommittedInputs)\n const inclusionCheckNationalityParameterCommitment = isForEVM\n ? await getCountryEVMParameterCommitment(\n ProofType.NATIONALITY_INCLUSION,\n inclusionCheckNationalityCommittedInputs.countries,\n )\n : await getCountryParameterCommitment(\n ProofType.NATIONALITY_INCLUSION,\n inclusionCheckNationalityCommittedInputs.countries,\n )\n if (!paramCommitments.includes(inclusionCheckNationalityParameterCommitment)) {\n console.warn(\"This proof does not verify the inclusion of the nationality\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n commitment: {\n expected: `Nationality parameter commitment: ${inclusionCheckNationalityParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the inclusion of the nationality\",\n },\n }\n }\n const countryList = inclusionCheckNationalityCommittedInputs.countries\n const {\n isCorrect: isCorrectNationalityInclusion,\n queryResultErrors: queryResultErrorsNationalityInclusion,\n } = this.checkNationalityInclusionPublicInputs(originalQuery, queryResult, countryList)\n isCorrect = isCorrect && isCorrectNationalityInclusion\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsNationalityInclusion,\n }\n }\n if (\n !!committedInputs?.inclusion_check_issuing_country ||\n !!committedInputs?.inclusion_check_issuing_country_evm\n ) {\n const inclusionCheckIssuingCountryCommittedInputs =\n (committedInputs?.inclusion_check_issuing_country as CountryCommittedInputs) ??\n (committedInputs?.inclusion_check_issuing_country_evm as CountryCommittedInputs)\n const inclusionCheckIssuingCountryParameterCommitment = isForEVM\n ? await getCountryEVMParameterCommitment(\n ProofType.ISSUING_COUNTRY_INCLUSION,\n inclusionCheckIssuingCountryCommittedInputs.countries,\n )\n : await getCountryParameterCommitment(\n ProofType.ISSUING_COUNTRY_INCLUSION,\n inclusionCheckIssuingCountryCommittedInputs.countries,\n )\n if (!paramCommitments.includes(inclusionCheckIssuingCountryParameterCommitment)) {\n console.warn(\"This proof does not verify the inclusion of the issuing country\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n commitment: {\n expected: `Issuing country parameter commitment: ${inclusionCheckIssuingCountryParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the inclusion of the issuing country\",\n },\n }\n }\n const countryList = inclusionCheckIssuingCountryCommittedInputs.countries\n const {\n isCorrect: isCorrectIssuingCountryInclusion,\n queryResultErrors: queryResultErrorsIssuingCountryInclusion,\n } = this.checkIssuingCountryInclusionPublicInputs(originalQuery, queryResult, countryList)\n isCorrect = isCorrect && isCorrectIssuingCountryInclusion\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsIssuingCountryInclusion,\n }\n }\n if (\n !!committedInputs?.exclusion_check_nationality ||\n !!committedInputs?.exclusion_check_nationality_evm\n ) {\n const exclusionCheckNationalityCommittedInputs =\n (committedInputs?.exclusion_check_nationality as CountryCommittedInputs) ??\n (committedInputs?.exclusion_check_nationality_evm as CountryCommittedInputs)\n const exclusionCheckNationalityParameterCommitment = isForEVM\n ? await getCountryEVMParameterCommitment(\n ProofType.NATIONALITY_EXCLUSION,\n exclusionCheckNationalityCommittedInputs.countries,\n )\n : await getCountryParameterCommitment(\n ProofType.NATIONALITY_EXCLUSION,\n exclusionCheckNationalityCommittedInputs.countries,\n )\n if (!paramCommitments.includes(exclusionCheckNationalityParameterCommitment)) {\n console.warn(\"This proof does not verify the exclusion of the nationality\")\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n commitment: {\n expected: `Nationality parameter commitment: ${exclusionCheckNationalityParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the exclusion of the nationality\",\n },\n }\n }\n const countryList = exclusionCheckNationalityCommittedInputs.countries\n const {\n isCorrect: isCorrectNationalityExclusion,\n queryResultErrors: queryResultErrorsNationalityExclusion,\n } = this.checkNationalityExclusionPublicInputs(originalQuery, queryResult, countryList)\n isCorrect = isCorrect && isCorrectNationalityExclusion\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsNationalityExclusion,\n }\n }\n if (\n !!committedInputs?.exclusion_check_issuing_country ||\n !!committedInputs?.exclusion_check_issuing_country_evm\n ) {\n const exclusionCheckIssuingCountryCommittedInputs =\n (committedInputs?.exclusion_check_issuing_country as CountryCommittedInputs) ??\n (committedInputs?.exclusion_check_issuing_country_evm as CountryCommittedInputs)\n const exclusionCheckIssuingCountryParameterCommitment = isForEVM\n ? await getCountryEVMParameterCommitment(\n ProofType.ISSUING_COUNTRY_EXCLUSION,\n exclusionCheckIssuingCountryCommittedInputs.countries,\n )\n : await getCountryParameterCommitment(\n ProofType.ISSUING_COUNTRY_EXCLUSION,\n exclusionCheckIssuingCountryCommittedInputs.countries,\n )\n if (!paramCommitments.includes(exclusionCheckIssuingCountryParameterCommitment)) {\n console.warn(\"This proof does not verify the exclusion of the issuing country\")\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n commitment: {\n expected: `Issuing country parameter commitment: ${exclusionCheckIssuingCountryParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the exclusion of the issuing country\",\n },\n }\n }\n const countryList = exclusionCheckIssuingCountryCommittedInputs.countries\n const {\n isCorrect: isCorrectIssuingCountryExclusion,\n queryResultErrors: queryResultErrorsIssuingCountryExclusion,\n } = this.checkIssuingCountryExclusionPublicInputs(originalQuery, queryResult, countryList)\n isCorrect = isCorrect && isCorrectIssuingCountryExclusion\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsIssuingCountryExclusion,\n }\n }\n if (!!committedInputs?.bind || !!committedInputs?.bind_evm) {\n const bindCommittedInputs =\n (committedInputs?.bind as BindCommittedInputs) ??\n (committedInputs?.bind_evm as BindCommittedInputs)\n const bindParameterCommitment = isForEVM\n ? await getBindEVMParameterCommitment(formatBoundData(bindCommittedInputs.data))\n : await getBindParameterCommitment(formatBoundData(bindCommittedInputs.data))\n if (!paramCommitments.includes(bindParameterCommitment)) {\n console.warn(\"This proof does not verify the bound data\")\n isCorrect = false\n queryResultErrors.bind = {\n ...queryResultErrors.bind,\n commitment: {\n expected: `Bind parameter commitment: ${bindParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the bound data\",\n },\n }\n }\n const { isCorrect: isCorrectBind, queryResultErrors: queryResultErrorsBind } =\n this.checkBindPublicInputs(originalQuery, queryResult, bindCommittedInputs.data)\n isCorrect = isCorrect && isCorrectBind\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsBind,\n }\n }\n if (\n !!committedInputs?.exclusion_check_sanctions ||\n !!committedInputs?.exclusion_check_sanctions_evm\n ) {\n const sanctionsBuilder = await SanctionsBuilder.create()\n const exclusionCheckSanctionsCommittedInputs =\n (committedInputs?.exclusion_check_sanctions as SanctionsCommittedInputs) ??\n (committedInputs?.exclusion_check_sanctions_evm as SanctionsCommittedInputs)\n const exclusionCheckSanctionsParameterCommitment = isForEVM\n ? await sanctionsBuilder.getSanctionsEvmParameterCommitment(\n exclusionCheckSanctionsCommittedInputs.isStrict,\n )\n : await sanctionsBuilder.getSanctionsParameterCommitment(\n exclusionCheckSanctionsCommittedInputs.isStrict,\n )\n if (!paramCommitments.includes(exclusionCheckSanctionsParameterCommitment)) {\n console.warn(\"This proof does not verify the exclusion from the sanction lists\")\n isCorrect = false\n queryResultErrors.sanctions = {\n ...queryResultErrors.sanctions,\n commitment: {\n expected: `Sanctions parameter commitment: ${exclusionCheckSanctionsParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify the exclusion from the sanction lists\",\n },\n }\n }\n const {\n isCorrect: isCorrectSanctionsExclusion,\n queryResultErrors: queryResultErrorsSanctionsExclusion,\n } = await this.checkSanctionsExclusionPublicInputs(\n originalQuery,\n queryResult,\n exclusionCheckSanctionsCommittedInputs,\n sanctionsBuilder,\n )\n isCorrect = isCorrect && isCorrectSanctionsExclusion\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsSanctionsExclusion,\n }\n }\n if (!!committedInputs?.facematch || !!committedInputs?.facematch_evm) {\n const facematchCommittedInputs =\n (committedInputs?.facematch as FacematchCommittedInputs) ??\n (committedInputs?.facematch_evm as FacematchCommittedInputs)\n const facematchParameterCommitment = isForEVM\n ? await getFacematchEvmParameterCommitment(\n BigInt(facematchCommittedInputs.rootKeyLeaf),\n facematchCommittedInputs.environment === \"development\" ? 0n : 1n,\n BigInt(facematchCommittedInputs.appIdHash),\n facematchCommittedInputs.mode === \"regular\" ? 1n : 2n,\n )\n : await getFacematchParameterCommitment(\n BigInt(facematchCommittedInputs.rootKeyLeaf),\n facematchCommittedInputs.environment === \"development\" ? 0n : 1n,\n BigInt(facematchCommittedInputs.appIdHash),\n facematchCommittedInputs.mode === \"regular\" ? 1n : 2n,\n )\n if (!paramCommitments.includes(facematchParameterCommitment)) {\n console.warn(\"This proof does not verify FaceMatch\")\n isCorrect = false\n queryResultErrors.facematch = {\n ...queryResultErrors.facematch,\n commitment: {\n expected: `Facematch parameter commitment: ${facematchParameterCommitment.toString()}`,\n received: `Parameter commitments included: ${paramCommitments.join(\", \")}`,\n message: \"This proof does not verify FaceMatch\",\n },\n }\n }\n const { isCorrect: isCorrectFacematch, queryResultErrors: queryResultErrorsFacematch } =\n await this.checkFacematchPublicInputs(\n originalQuery,\n queryResult,\n facematchCommittedInputs,\n )\n isCorrect = isCorrect && isCorrectFacematch\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsFacematch,\n }\n }\n uniqueIdentifier = getNullifierFromOuterProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromOuterProof(proofData)\n } else if (proof.name?.startsWith(\"sig_check_dsc\")) {\n commitmentOut = getCommitmentFromDSCProof(proofData)\n const merkleRoot = getMerkleRootFromDSCProof(proofData)\n const {\n isCorrect: isCorrectCertificateRegistryRoot,\n queryResultErrors: queryResultErrorsCertificateRegistryRoot,\n } = await this.checkCertificateRegistryRoot(\n merkleRoot.toString(16),\n queryResultErrors,\n false,\n devMode,\n )\n isCorrect = isCorrect && isCorrectCertificateRegistryRoot\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCertificateRegistryRoot,\n }\n } else if (proof.name?.startsWith(\"sig_check_id_data\")) {\n commitmentIn = getCommitmentInFromIDDataProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the certificate signature and ID signature\",\n )\n isCorrect = false\n queryResultErrors.sig_check_id_data = {\n ...queryResultErrors.sig_check_id_data,\n commitment: {\n expected: `Commitment: ${commitmentOut?.toString() || \"undefined\"}`,\n received: `Commitment: ${commitmentIn?.toString() || \"undefined\"}`,\n message:\n \"Failed to check the link between the certificate signature and ID signature\",\n },\n }\n }\n commitmentOut = getCommitmentOutFromIDDataProof(proofData)\n } else if (proof.name?.startsWith(\"data_check_integrity\")) {\n commitmentIn = getCommitmentInFromIntegrityProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\"Failed to check the link between the ID signature and the data signed\")\n isCorrect = false\n queryResultErrors.data_check_integrity = {\n ...queryResultErrors.data_check_integrity,\n commitment: {\n expected: `Commitment: ${commitmentOut?.toString() || \"undefined\"}`,\n received: `Commitment: ${commitmentIn?.toString() || \"undefined\"}`,\n message: \"Failed to check the link between the ID signature and the data signed\",\n },\n }\n }\n commitmentOut = getCommitmentOutFromIntegrityProof(proofData)\n } else if (proof.name === \"disclose_bytes\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the data to disclose\",\n )\n isCorrect = false\n queryResultErrors.disclose = {\n ...queryResultErrors.disclose,\n commitment: {\n expected: `Commitment: ${commitmentOut?.toString() || \"undefined\"}`,\n received: `Commitment: ${commitmentIn?.toString() || \"undefined\"}`,\n message:\n \"Failed to check the link between the validity of the ID and the data to disclose\",\n },\n }\n }\n const paramCommitment = getParameterCommitmentFromDisclosureProof(proofData)\n const calculatedParamCommitment = await getDiscloseParameterCommitment(\n (proof.committedInputs?.disclose_bytes as DiscloseCommittedInputs).discloseMask!,\n (proof.committedInputs?.disclose_bytes as DiscloseCommittedInputs).disclosedBytes!,\n )\n if (paramCommitment !== calculatedParamCommitment) {\n console.warn(\"The disclosed data does not match the data committed by the proof\")\n isCorrect = false\n queryResultErrors.disclose = {\n ...queryResultErrors.disclose,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommitment}`,\n message: \"The disclosed data does not match the data committed by the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"disclose\",\n scope,\n )\n isCorrect = isCorrect && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectDisclose, queryResultErrors: queryResultErrorsDisclose } =\n this.checkDiscloseBytesPublicInputs(proof, originalQuery, queryResult)\n isCorrect = isCorrect && isCorrectDisclose && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsDisclose,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"disclose\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"compare_age\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the age derived from it\",\n )\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and the age derived from it\",\n },\n }\n }\n const paramCommitment = getParameterCommitmentFromDisclosureProof(proofData)\n const committedInputs = proof.committedInputs?.compare_age as AgeCommittedInputs\n const calculatedParamCommitment = await getAgeParameterCommitment(\n committedInputs.minAge,\n committedInputs.maxAge,\n )\n if (paramCommitment !== calculatedParamCommitment) {\n console.warn(\n \"The conditions for the age check do not match the conditions checked by the proof\",\n )\n isCorrect = false\n queryResultErrors.age = {\n ...queryResultErrors.age,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommitment}`,\n message:\n \"The conditions for the age check do not match the conditions checked by the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(domain, proofData, queryResultErrors, \"age\", scope)\n const { isCorrect: isCorrectAge, queryResultErrors: queryResultErrorsAge } =\n this.checkAgePublicInputs(proof, originalQuery, queryResult)\n isCorrect = isCorrect && isCorrectAge && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsAge,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"age\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"compare_birthdate\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the birthdate derived from it\",\n )\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and the birthdate derived from it\",\n },\n }\n }\n const paramCommitment = getParameterCommitmentFromDisclosureProof(proofData)\n const committedInputs = proof.committedInputs?.compare_birthdate as DateCommittedInputs\n const calculatedParamCommitment = await getDateParameterCommitment(\n ProofType.BIRTHDATE,\n committedInputs.minDateTimestamp,\n committedInputs.maxDateTimestamp,\n 0,\n )\n if (paramCommitment !== calculatedParamCommitment) {\n console.warn(\n \"The conditions for the birthdate check do not match the conditions checked by the proof\",\n )\n isCorrect = false\n queryResultErrors.birthdate = {\n ...queryResultErrors.birthdate,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommitment}`,\n message:\n \"The conditions for the birthdate check do not match the conditions checked by the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"birthdate\",\n scope,\n )\n const { isCorrect: isCorrectBirthdate, queryResultErrors: queryResultErrorsBirthdate } =\n this.checkBirthdatePublicInputs(proof, originalQuery, queryResult)\n isCorrect = isCorrect && isCorrectBirthdate && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsBirthdate,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"birthdate\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"compare_expiry\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and its expiry date\",\n )\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and its expiry date\",\n },\n }\n }\n const paramCommitment = getParameterCommitmentFromDisclosureProof(proofData)\n const committedInputs = proof.committedInputs?.compare_expiry as DateCommittedInputs\n const calculatedParamCommitment = await getDateParameterCommitment(\n ProofType.EXPIRY_DATE,\n committedInputs.minDateTimestamp,\n committedInputs.maxDateTimestamp,\n )\n if (paramCommitment !== calculatedParamCommitment) {\n console.warn(\n \"The conditions for the expiry date check do not match the conditions checked by the proof\",\n )\n isCorrect = false\n queryResultErrors.expiry_date = {\n ...queryResultErrors.expiry_date,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommitment}`,\n message:\n \"The conditions for the expiry date check do not match the conditions checked by the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"expiry_date\",\n scope,\n )\n const { isCorrect: isCorrectExpiryDate, queryResultErrors: queryResultErrorsExpiryDate } =\n this.checkExpiryDatePublicInputs(proof, originalQuery, queryResult)\n isCorrect = isCorrect && isCorrectExpiryDate && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsExpiryDate,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"expiry_date\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"exclusion_check_nationality\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the nationality exclusion check\",\n )\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and the nationality exclusion check\",\n },\n }\n }\n const countryList = (\n proof.committedInputs?.exclusion_check_nationality as CountryCommittedInputs\n ).countries\n const paramCommittment = getParameterCommitmentFromDisclosureProof(proofData)\n const calculatedParamCommitment = await getCountryParameterCommitment(\n ProofType.NATIONALITY_EXCLUSION,\n countryList,\n true,\n )\n if (paramCommittment !== calculatedParamCommitment) {\n console.warn(\n \"The committed country list for the exclusion check does not match the one from the proof\",\n )\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommittment}`,\n message:\n \"The committed country list for the exclusion check does not match the one from the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"nationality\",\n scope,\n )\n const {\n isCorrect: isCorrectNationalityExclusion,\n queryResultErrors: queryResultErrorsNationalityExclusion,\n } = this.checkNationalityExclusionPublicInputs(originalQuery, queryResult, countryList)\n isCorrect = isCorrect && isCorrectNationalityExclusion && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsNationalityExclusion,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"nationality\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"exclusion_check_issuing_country\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the issuing country exclusion check\",\n )\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and the issuing country exclusion check\",\n },\n }\n }\n const countryList = (\n proof.committedInputs?.exclusion_check_issuing_country as CountryCommittedInputs\n ).countries\n const paramCommittment = getParameterCommitmentFromDisclosureProof(proofData)\n const calculatedParamCommitment = await getCountryParameterCommitment(\n ProofType.ISSUING_COUNTRY_EXCLUSION,\n countryList,\n true,\n )\n if (paramCommittment !== calculatedParamCommitment) {\n console.warn(\n \"The committed country list for the issuing country exclusion check does not match the one from the proof\",\n )\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommittment}`,\n message:\n \"The committed country list for the issuing country exclusion check does not match the one from the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"issuing_country\",\n scope,\n )\n const {\n isCorrect: isCorrectIssuingCountryExclusion,\n queryResultErrors: queryResultErrorsIssuingCountryExclusion,\n } = this.checkIssuingCountryExclusionPublicInputs(originalQuery, queryResult, countryList)\n isCorrect = isCorrect && isCorrectIssuingCountryExclusion && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsIssuingCountryExclusion,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"issuing_country\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"inclusion_check_nationality\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the nationality inclusion check\",\n )\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and the nationality inclusion check\",\n },\n }\n }\n const countryList = (\n proof.committedInputs?.inclusion_check_nationality as CountryCommittedInputs\n ).countries\n const paramCommittment = getParameterCommitmentFromDisclosureProof(proofData)\n const calculatedParamCommitment = await getCountryParameterCommitment(\n ProofType.NATIONALITY_INCLUSION,\n countryList,\n false,\n )\n if (paramCommittment !== calculatedParamCommitment) {\n console.warn(\n \"The committed country list for the nationality inclusion check does not match the one from the proof\",\n )\n isCorrect = false\n queryResultErrors.nationality = {\n ...queryResultErrors.nationality,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommittment}`,\n message:\n \"The committed country list for the nationality inclusion check does not match the one from the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"nationality\",\n scope,\n )\n const {\n isCorrect: isCorrectNationalityInclusion,\n queryResultErrors: queryResultErrorsNationalityInclusion,\n } = this.checkNationalityInclusionPublicInputs(originalQuery, queryResult, countryList)\n isCorrect = isCorrect && isCorrectNationalityInclusion && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsNationalityInclusion,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"nationality\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"inclusion_check_issuing_country\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the issuing country inclusion check\",\n )\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and the issuing country inclusion check\",\n },\n }\n }\n const countryList = (\n proof.committedInputs?.inclusion_check_issuing_country as CountryCommittedInputs\n ).countries\n const paramCommittment = getParameterCommitmentFromDisclosureProof(proofData)\n const calculatedParamCommitment = await getCountryParameterCommitment(\n ProofType.ISSUING_COUNTRY_INCLUSION,\n countryList,\n false,\n )\n if (paramCommittment !== calculatedParamCommitment) {\n console.warn(\n \"The committed country list for the issuing country inclusion check does not match the one from the proof\",\n )\n isCorrect = false\n queryResultErrors.issuing_country = {\n ...queryResultErrors.issuing_country,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommittment}`,\n message:\n \"The committed country list for the issuing country inclusion check does not match the one from the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"issuing_country\",\n scope,\n )\n const {\n isCorrect: isCorrectIssuingCountryInclusion,\n queryResultErrors: queryResultErrorsIssuingCountryInclusion,\n } = this.checkIssuingCountryInclusionPublicInputs(originalQuery, queryResult, countryList)\n isCorrect = isCorrect && isCorrectIssuingCountryInclusion && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsIssuingCountryInclusion,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"issuing_country\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"bind\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\"Failed to check the link between the validity of the ID and the bound data\")\n isCorrect = false\n queryResultErrors.bind = {\n ...queryResultErrors.bind,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message: \"Failed to check the link between the validity of the ID and the bound data\",\n },\n }\n }\n const bindCommittedInputs = proof.committedInputs?.bind as BindCommittedInputs\n const paramCommittment = getParameterCommitmentFromDisclosureProof(proofData)\n const calculatedParamCommitment = await getBindParameterCommitment(\n formatBoundData(bindCommittedInputs.data),\n )\n if (paramCommittment !== calculatedParamCommitment) {\n console.warn(\"The bound data does not match the one from the proof\")\n isCorrect = false\n queryResultErrors.bind = {\n ...queryResultErrors.bind,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment}`,\n received: `Commitment: ${paramCommittment}`,\n message: \"The bound data does not match the one from the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(domain, proofData, queryResultErrors, \"bind\", scope)\n const { isCorrect: isCorrectBind, queryResultErrors: queryResultErrorsBind } =\n this.checkBindPublicInputs(originalQuery, queryResult, bindCommittedInputs.data)\n isCorrect = isCorrect && isCorrectBind && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsBind,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"bind\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name === \"exclusion_check_sanctions\") {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the sanctions exclusion check\",\n )\n isCorrect = false\n queryResultErrors.sanctions = {\n ...queryResultErrors.sanctions,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and the sanctions exclusion check\",\n },\n }\n }\n const sanctionsBuilder = await SanctionsBuilder.create()\n const exclusionCheckSanctionsCommittedInputs = proof.committedInputs\n ?.exclusion_check_sanctions as SanctionsCommittedInputs\n const calculatedParamCommitment = await sanctionsBuilder.getSanctionsParameterCommitment(\n exclusionCheckSanctionsCommittedInputs.isStrict,\n )\n const paramCommittment = getParameterCommitmentFromDisclosureProof(proofData)\n if (paramCommittment !== calculatedParamCommitment) {\n console.warn(\n \"The sanction lists check against do not match the sanction lists from the proof\",\n )\n isCorrect = false\n queryResultErrors.sanctions = {\n ...queryResultErrors.sanctions,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment.toString()}`,\n received: `Commitment: ${paramCommittment.toString()}`,\n message:\n \"The sanction lists check against do not match the sanction lists from the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"sanctions\",\n scope,\n )\n const {\n isCorrect: isCorrectSanctionsExclusion,\n queryResultErrors: queryResultErrorsSanctionsExclusion,\n } = await this.checkSanctionsExclusionPublicInputs(\n originalQuery,\n queryResult,\n exclusionCheckSanctionsCommittedInputs,\n sanctionsBuilder,\n )\n isCorrect = isCorrect && isCorrectSanctionsExclusion && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsSanctionsExclusion,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"sanctions\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n } else if (proof.name?.startsWith(\"facematch\") && !proof.name?.endsWith(\"_evm\")) {\n commitmentIn = getCommitmentInFromDisclosureProof(proofData)\n if (commitmentIn !== commitmentOut) {\n console.warn(\n \"Failed to check the link between the validity of the ID and the facematch check\",\n )\n isCorrect = false\n queryResultErrors.facematch = {\n ...queryResultErrors.facematch,\n commitment: {\n expected: `Commitment: ${commitmentOut}`,\n received: `Commitment: ${commitmentIn}`,\n message:\n \"Failed to check the link between the validity of the ID and the facematch check\",\n },\n }\n }\n const facematchCommittedInputs = proof.committedInputs\n ?.facematch as FacematchCommittedInputs\n const paramCommittment = getParameterCommitmentFromDisclosureProof(proofData)\n const calculatedParamCommitment = await getFacematchParameterCommitment(\n BigInt(facematchCommittedInputs.rootKeyLeaf),\n facematchCommittedInputs.environment === \"development\" ? 0n : 1n,\n BigInt(facematchCommittedInputs.appIdHash),\n facematchCommittedInputs.mode === \"regular\" ? 1n : 2n,\n )\n if (paramCommittment !== calculatedParamCommitment) {\n console.warn(\"The FaceMatch verification does not match the ones from the proof\")\n isCorrect = false\n queryResultErrors.facematch = {\n ...queryResultErrors.facematch,\n commitment: {\n expected: `Commitment: ${calculatedParamCommitment.toString()}`,\n received: `Commitment: ${paramCommittment.toString()}`,\n message: \"The FaceMatch verification does not match the ones from the proof\",\n },\n }\n }\n const { isCorrect: isCorrectScope, queryResultErrors: queryResultErrorsScope } =\n this.checkScopeFromDisclosureProof(\n domain,\n proofData,\n queryResultErrors,\n \"facematch\",\n scope,\n )\n const { isCorrect: isCorrectFacematch, queryResultErrors: queryResultErrorsFacematch } =\n await this.checkFacematchPublicInputs(\n originalQuery,\n queryResult,\n facematchCommittedInputs,\n )\n isCorrect = isCorrect && isCorrectFacematch && isCorrectScope\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsFacematch,\n ...queryResultErrorsScope,\n }\n const { isCorrect: isCorrectCurrentDate, queryResultErrors: queryResultErrorsCurrentDate } =\n await this.checkCurrentDate(\n \"facematch\",\n proofData,\n validity ?? DEFAULT_VALIDITY,\n queryResultErrors,\n )\n isCorrect = isCorrect && isCorrectCurrentDate\n queryResultErrors = {\n ...queryResultErrors,\n ...queryResultErrorsCurrentDate,\n }\n // Don't use the nullifier from the proof for FaceMatch as it may be 0\n // but will always come with at least one other disclosure proof with a non-zero nullifier\n // uniqueIdentifier = getNullifierFromDisclosureProof(proofData).toString(10)\n // uniqueIdentifierType = getNullifierTypeFromDisclosureProof(proofData)\n }\n }\n\n // Verify OPRF public key if the proof uses a salted nullifier\n if (\n isCorrect &&\n uniqueIdentifierType &&\n (uniqueIdentifierType === NullifierType.SALTED ||\n uniqueIdentifierType === NullifierType.SALTED_MOCK)\n ) {\n try {\n const oprfPk = await getOprfPublicKey(oprfKeyId ?? OPRF_DEFAULT_KEY_ID)\n const expectedPkHash = await hashOprfPublicKey(oprfPk)\n\n // Find a disclosure proof to extract oprfPkHash from\n const disclosureProof = sortedProofs.find(\n (p) =>\n p.name &&\n !p.name.startsWith(\"sig_check_\") &&\n !p.name.startsWith(\"data_check_\") &&\n !p.name.startsWith(\"outer\") &&\n !p.name.startsWith(\"facematch\"),\n )\n if (disclosureProof) {\n const dpData = getProofData(\n disclosureProof.proof as string,\n getNumberOfPublicInputs(disclosureProof.name!),\n )\n const proofPkHash = getOprfPkHashFromDisclosureProof(dpData)\n if (proofPkHash !== expectedPkHash) {\n console.warn(\"OPRF public key hash mismatch: proof uses an unknown OPRF key\")\n isCorrect = false\n }\n }\n } catch (error) {\n console.warn(\"Failed to verify OPRF public key:\", error)\n isCorrect = false\n }\n }\n\n return { isCorrect, uniqueIdentifier, uniqueIdentifierType, queryResultErrors }\n }\n}\n","{\n \"abi\": [\n {\n \"type\": \"constructor\",\n \"inputs\": [\n { \"name\": \"_admin\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"_guardian\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"_rootRegistry\", \"type\": \"address\", \"internalType\": \"contract IRootRegistry\" }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"addHelper\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"newHelper\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"addSubVerifier\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n {\n \"name\": \"subVerifier\",\n \"type\": \"address\",\n \"internalType\": \"contract ZKPassportSubVerifier\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"admin\",\n \"inputs\": [],\n \"outputs\": [{ \"name\": \"\", \"type\": \"address\", \"internalType\": \"address\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"config\",\n \"inputs\": [{ \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }],\n \"outputs\": [{ \"name\": \"value\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getHelper\",\n \"inputs\": [{ \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }],\n \"outputs\": [{ \"name\": \"\", \"type\": \"address\", \"internalType\": \"address\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getSubVerifier\",\n \"inputs\": [{ \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }],\n \"outputs\": [{ \"name\": \"\", \"type\": \"address\", \"internalType\": \"address\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"guardian\",\n \"inputs\": [],\n \"outputs\": [{ \"name\": \"\", \"type\": \"address\", \"internalType\": \"address\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"helperCount\",\n \"inputs\": [],\n \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\", \"internalType\": \"uint256\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"helpers\",\n \"inputs\": [{ \"name\": \"\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }],\n \"outputs\": [{ \"name\": \"\", \"type\": \"address\", \"internalType\": \"contract ZKPassportHelper\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"pause\",\n \"inputs\": [],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"paused\",\n \"inputs\": [],\n \"outputs\": [{ \"name\": \"\", \"type\": \"bool\", \"internalType\": \"bool\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"removeHelper\",\n \"inputs\": [{ \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"removeSubVerifier\",\n \"inputs\": [{ \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"rootRegistry\",\n \"inputs\": [],\n \"outputs\": [{ \"name\": \"\", \"type\": \"address\", \"internalType\": \"contract IRootRegistry\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"setGuardian\",\n \"inputs\": [{ \"name\": \"newGuardian\", \"type\": \"address\", \"internalType\": \"address\" }],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"subverifierCount\",\n \"inputs\": [],\n \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\", \"internalType\": \"uint256\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"subverifiers\",\n \"inputs\": [{ \"name\": \"\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }],\n \"outputs\": [\n { \"name\": \"\", \"type\": \"address\", \"internalType\": \"contract ZKPassportSubVerifier\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"transferAdmin\",\n \"inputs\": [{ \"name\": \"newAdmin\", \"type\": \"address\", \"internalType\": \"address\" }],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"unpause\",\n \"inputs\": [],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"updateConfig\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"value\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"updateHelper\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"newHelper\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"updateSubVerifier\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"newSubVerifier\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"verify\",\n \"inputs\": [\n {\n \"name\": \"params\",\n \"type\": \"tuple\",\n \"internalType\": \"struct ProofVerificationParams\",\n \"components\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n {\n \"name\": \"proofVerificationData\",\n \"type\": \"tuple\",\n \"internalType\": \"struct ProofVerificationData\",\n \"components\": [\n { \"name\": \"vkeyHash\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"proof\", \"type\": \"bytes\", \"internalType\": \"bytes\" },\n { \"name\": \"publicInputs\", \"type\": \"bytes32[]\", \"internalType\": \"bytes32[]\" }\n ]\n },\n { \"name\": \"committedInputs\", \"type\": \"bytes\", \"internalType\": \"bytes\" },\n {\n \"name\": \"serviceConfig\",\n \"type\": \"tuple\",\n \"internalType\": \"struct ServiceConfig\",\n \"components\": [\n { \"name\": \"validityPeriodInSeconds\", \"type\": \"uint256\", \"internalType\": \"uint256\" },\n { \"name\": \"domain\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"scope\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"devMode\", \"type\": \"bool\", \"internalType\": \"bool\" }\n ]\n }\n ]\n }\n ],\n \"outputs\": [\n { \"name\": \"valid\", \"type\": \"bool\", \"internalType\": \"bool\" },\n { \"name\": \"uniqueIdentifier\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"helper\", \"type\": \"address\", \"internalType\": \"contract ZKPassportHelper\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"event\",\n \"name\": \"AdminUpdated\",\n \"inputs\": [\n { \"name\": \"oldAdmin\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" },\n { \"name\": \"newAdmin\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"ConfigUpdated\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"indexed\": true, \"internalType\": \"bytes32\" },\n { \"name\": \"oldValue\", \"type\": \"bytes32\", \"indexed\": false, \"internalType\": \"bytes32\" },\n { \"name\": \"newValue\", \"type\": \"bytes32\", \"indexed\": false, \"internalType\": \"bytes32\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"GuardianUpdated\",\n \"inputs\": [\n { \"name\": \"oldGuardian\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" },\n { \"name\": \"newGuardian\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"HelperAdded\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true, \"internalType\": \"bytes32\" },\n { \"name\": \"helper\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"HelperRemoved\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true, \"internalType\": \"bytes32\" },\n { \"name\": \"helper\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"HelperUpdated\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true, \"internalType\": \"bytes32\" },\n { \"name\": \"oldHelper\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" },\n { \"name\": \"newHelper\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"PausedStatusChanged\",\n \"inputs\": [{ \"name\": \"paused\", \"type\": \"bool\", \"indexed\": false, \"internalType\": \"bool\" }],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"RootRegistryUpdated\",\n \"inputs\": [\n {\n \"name\": \"oldRootRegistry\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n { \"name\": \"newRootRegistry\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"RootVerifierDeployed\",\n \"inputs\": [\n { \"name\": \"admin\", \"type\": \"address\", \"indexed\": false, \"internalType\": \"address\" },\n { \"name\": \"guardian\", \"type\": \"address\", \"indexed\": false, \"internalType\": \"address\" },\n { \"name\": \"rootRegistry\", \"type\": \"address\", \"indexed\": false, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"SubVerifierAdded\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true, \"internalType\": \"bytes32\" },\n { \"name\": \"subVerifier\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"SubVerifierRemoved\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true, \"internalType\": \"bytes32\" },\n { \"name\": \"subVerifier\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"SubVerifierUpdated\",\n \"inputs\": [\n { \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true, \"internalType\": \"bytes32\" },\n { \"name\": \"oldSubVerifier\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" },\n { \"name\": \"newSubVerifier\", \"type\": \"address\", \"indexed\": true, \"internalType\": \"address\" }\n ],\n \"anonymous\": false\n }\n ],\n \"bytecode\": {\n \"object\": \"0x608060405234801561000f575f5ffd5b506040516114d33803806114d383398101604081905261002e91610125565b6001600160a01b0383166100885760405162461bcd60e51b815260206004820152601c60248201527f41646d696e2063616e6e6f74206265207a65726f206164647265737300000000604482015260640160405180910390fd5b5f80546001600160a01b038581166001600160a01b0319928316811790935560018054868316908416811790915560028054928616929093168217909255604080519384526020840192909252908201527f49958336430bdf59d989fb74186fd9ed78af011655d4ffe62fa2fbe5193edbda9060600160405180910390a150505061016f565b6001600160a01b0381168114610122575f5ffd5b50565b5f5f5f60608486031215610137575f5ffd5b83516101428161010e565b60208501519093506101538161010e565b60408501519092506101648161010e565b809150509250925092565b6113578061017c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063889eba3b116100bf578063ba5f3f9d11610079578063ba5f3f9d1461030e578063c961ba7e14610321578063cc718f7614610338578063da0ff2c614610357578063f264980714610360578063f851a44014610388575f5ffd5b8063889eba3b146102875780638a0dac4a1461029a5780639bfefbfd146102ad578063a7ad58bf146102c0578063b3c83d99146102e8578063b96b161c146102fb575f5ffd5b8063578bd92111610110578063578bd921146101d45780635c975abb1461020d5780635dd41f2f146102315780636f9076381461025957806375829def1461026c5780638456cb591461027f575f5ffd5b8063079154391461014c5780633f4ba83a14610161578063452a932014610169578063492f34fb1461019957806352741df5146101c1575b5f5ffd5b61015f61015a366004610ef0565b61039a565b005b61015f61049f565b60015461017c906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61017c6101a7366004610f1e565b60036020525f90815260409020546001600160a01b031681565b61015f6101cf366004610ef0565b61050b565b6101e76101e2366004610f35565b610687565b60408051931515845260208401929092526001600160a01b031690820152606001610190565b60015461022190600160a01b900460ff1681565b6040519015158152602001610190565b61017c61023f366004610f1e565b5f908152600560205260409020546001600160a01b031690565b61015f610267366004610f1e565b6107b4565b61015f61027a366004610f73565b610895565b61015f610963565b61015f610295366004610f8e565b610a23565b61015f6102a8366004610f73565b610aa1565b61015f6102bb366004610f1e565b610b1b565b61017c6102ce366004610f1e565b60056020525f90815260409020546001600160a01b031681565b61015f6102f6366004610ef0565b610c2c565b60025461017c906001600160a01b031681565b61015f61031c366004610ef0565b610d7d565b61032a60045481565b604051908152602001610190565b61032a610346366004610f1e565b60076020525f908152604090205481565b61032a60065481565b61017c61036e366004610f1e565b5f908152600360205260409020546001600160a01b031690565b5f5461017c906001600160a01b031681565b5f546001600160a01b031633146103cc5760405162461bcd60e51b81526004016103c390610fae565b60405180910390fd5b816103e95760405162461bcd60e51b81526004016103c390610fe5565b6001600160a01b03811661040f5760405162461bcd60e51b81526004016103c390611015565b5f828152600360205260409020546001600160a01b03166104425760405162461bcd60e51b81526004016103c390611057565b5f8281526003602052604080822080546001600160a01b031981166001600160a01b038681169182179093559251911692839186917fa643a1aa11f9709b2990b31638a0b368d6d0c3b8f025a98a3249fea2bd5821d791a4505050565b5f546001600160a01b031633146104c85760405162461bcd60e51b81526004016103c390610fae565b6001805460ff60a01b191690556040515f81527f9a506b30e47f3823b09f67e4c0dfa5c3d8023b71825b7ceaa97677129128c9c5906020015b60405180910390a1565b5f546001600160a01b031633146105345760405162461bcd60e51b81526004016103c390610fae565b6001600160a01b03811661058a5760405162461bcd60e51b815260206004820152601d60248201527f48656c7065722063616e6e6f74206265207a65726f206164647265737300000060448201526064016103c3565b816105a75760405162461bcd60e51b81526004016103c390610fe5565b5f828152600560205260409020546001600160a01b0316156106155760405162461bcd60e51b815260206004820152602160248201527f48656c70657220616c72656164792065786973747320666f722076657273696f6044820152603760f91b60648201526084016103c3565b5f82815260056020526040812080546001600160a01b0319166001600160a01b0384161790556006805491610649836110ac565b90915550506040516001600160a01b0382169083907fe3eccbb854b4a5c161cda43f1e76981a22f8c4a4190a1e1b44bb8c69039b85b2905f90a35050565b5f5f5f600160149054906101000a900460ff16156106e75760405162461bcd60e51b815260206004820152601760248201527f526f6f742076657269666965722069732070617573656400000000000000000060448201526064016103c3565b83355f908152600360205260409020546001600160a01b03168061071d5760405162461bcd60e51b81526004016103c390611057565b600254604051637446a77360e11b81526001600160a01b038381169263e88d4ee692610751929091169089906004016111ce565b6040805180830381865afa15801561076b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078f9190611309565b95355f9081526005602052604090205490966001600160a01b03909116945092505050565b5f546001600160a01b031633146107dd5760405162461bcd60e51b81526004016103c390610fae565b806107fa5760405162461bcd60e51b81526004016103c390610fe5565b5f818152600360205260409020546001600160a01b03168061082e5760405162461bcd60e51b81526004016103c390611057565b5f82815260036020526040812080546001600160a01b0319169055600480549161085783611335565b90915550506040516001600160a01b0382169083907f2632c7adc4cecbf41bb3ee7c156aae99b0bcd9da3efa5b9315f77dcdf6ef3e66905f90a35050565b5f546001600160a01b031633146108be5760405162461bcd60e51b81526004016103c390610fae565b6001600160a01b0381166109145760405162461bcd60e51b815260206004820152601c60248201527f41646d696e2063616e6e6f74206265207a65726f20616464726573730000000060448201526064016103c3565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a35050565b5f546001600160a01b031633148061098557506001546001600160a01b031633145b6109e05760405162461bcd60e51b815260206004820152602660248201527f4e6f7420617574686f72697a65643a2061646d696e206f7220677561726469616044820152656e206f6e6c7960d01b60648201526084016103c3565b6001805460ff60a01b1916600160a01b1781556040519081527f9a506b30e47f3823b09f67e4c0dfa5c3d8023b71825b7ceaa97677129128c9c590602001610501565b5f546001600160a01b03163314610a4c5760405162461bcd60e51b81526004016103c390610fae565b5f8281526007602090815260409182902080549084905582518181529182018490529184917fbb4f63ec43349b7ec7c292d3e97704824bcdd2d758200521ad62d3e9a127f782910160405180910390a2505050565b5f546001600160a01b03163314610aca5760405162461bcd60e51b81526004016103c390610fae565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f064d28d3d3071c5cbc271a261c10c2f0f0d9e319390397101aa0eb23c6bad909905f90a35050565b5f546001600160a01b03163314610b445760405162461bcd60e51b81526004016103c390610fae565b80610b615760405162461bcd60e51b81526004016103c390610fe5565b5f818152600560205260409020546001600160a01b031680610bc55760405162461bcd60e51b815260206004820152601c60248201527f48656c706572206e6f7420666f756e6420666f722076657273696f6e0000000060448201526064016103c3565b5f82815260056020526040812080546001600160a01b03191690556006805491610bee83611335565b90915550506040516001600160a01b0382169083907f6a7d5ce7bf32942d5ee1a06318777e6921ab7173478635304ac93845d7de61e0905f90a35050565b5f546001600160a01b03163314610c555760405162461bcd60e51b81526004016103c390610fae565b6001600160a01b038116610c7b5760405162461bcd60e51b81526004016103c390611015565b81610c985760405162461bcd60e51b81526004016103c390610fe5565b5f828152600360205260409020546001600160a01b031615610d0b5760405162461bcd60e51b815260206004820152602660248201527f537562766572696669657220616c72656164792065786973747320666f72207660448201526532b939b4b7b760d11b60648201526084016103c3565b5f82815260036020526040812080546001600160a01b0319166001600160a01b0384161790556004805491610d3f836110ac565b90915550506040516001600160a01b0382169083907fa65f9939af3939f730447054d525d5526c5f9e75ccea14966e1de1876631f404905f90a35050565b5f546001600160a01b03163314610da65760405162461bcd60e51b81526004016103c390610fae565b81610dc35760405162461bcd60e51b81526004016103c390610fe5565b6001600160a01b038116610e195760405162461bcd60e51b815260206004820152601d60248201527f48656c7065722063616e6e6f74206265207a65726f206164647265737300000060448201526064016103c3565b5f828152600560205260409020546001600160a01b0316610e7c5760405162461bcd60e51b815260206004820152601c60248201527f48656c706572206e6f7420666f756e6420666f722076657273696f6e0000000060448201526064016103c3565b5f8281526005602052604080822080546001600160a01b031981166001600160a01b038681169182179093559251911692839186917fb9393e6de8fe36cc235a7d08d2fa004db98bbb2a2be241250df83a276bc0d62e91a4505050565b6001600160a01b0381168114610eed575f5ffd5b50565b5f5f60408385031215610f01575f5ffd5b823591506020830135610f1381610ed9565b809150509250929050565b5f60208284031215610f2e575f5ffd5b5035919050565b5f60208284031215610f45575f5ffd5b813567ffffffffffffffff811115610f5b575f5ffd5b820160808185031215610f6c575f5ffd5b9392505050565b5f60208284031215610f83575f5ffd5b8135610f6c81610ed9565b5f5f60408385031215610f9f575f5ffd5b50508035926020909101359150565b6020808252601a908201527f4e6f7420617574686f72697a65643a2061646d696e206f6e6c79000000000000604082015260600190565b60208082526016908201527556657273696f6e2063616e6e6f74206265207a65726f60501b604082015260600190565b60208082526022908201527f53756276657269666965722063616e6e6f74206265207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526021908201527f5375627665726966696572206e6f7420666f756e6420666f722076657273696f6040820152603760f91b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016110bd576110bd611098565b5060010190565b5f5f8335601e198436030181126110d9575f5ffd5b830160208101925035905067ffffffffffffffff8111156110f8575f5ffd5b803603821315611106575f5ffd5b9250929050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8235607e19833603018112611149575f5ffd5b90910192915050565b8015158114610eed575f5ffd5b803582525f61117160208301836110c4565b6080602086015261118660808601828461110d565b91505061119660408401846110c4565b85830360408701526111a983828461110d565b9250505060608301356111bb81611152565b8015156060860152508091505092915050565b6001600160a01b0383168152604060208083018290528335918301919091525f9083013536849003605e19018112611204575f5ffd5b608060608401528301803560c084015261122160208201826110c4565b606060e08601526112376101208601828461110d565b9150506040820135601e19833603018112611250575f5ffd5b60209201918201913567ffffffffffffffff81111561126d575f5ffd5b8060051b80360384131561127f575f5ffd5b85830360bf19016101008701528183526001600160fb1b038211156112a2575f5ffd5b8084602085013780830193505050506112be60408501856110c4565b601f198584030160808601526112d860208401828461110d565b925050506112e96060850185611135565b838203603f190160a08501526112ff828261115f565b9695505050505050565b5f5f6040838503121561131a575f5ffd5b825161132581611152565b6020939093015192949293505050565b5f8161134357611343611098565b505f19019056fea164736f6c634300081e000a\",\n \"sourceMap\": \"681:9071:30:-:0;;;2414:300;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2504:20:30;;2496:61;;;;-1:-1:-1;;;2496:61:30;;899:2:50;2496:61:30;;;881:21:50;938:2;918:18;;;911:30;977;957:18;;;950:58;1025:18;;2496:61:30;;;;;;;;2563:5;:14;;-1:-1:-1;;;;;2563:14:30;;;-1:-1:-1;;;;;;2563:14:30;;;;;;;;-1:-1:-1;2583:20:30;;;;;;;;;;;;;2609:12;:28;;;;;;;;;;;;;;2648:61;;;1256:51:50;;;1338:2;1323:18;;1316:60;;;;1392:18;;;1385:60;2648:61:30;;1244:2:50;1229:18;2648:61:30;;;;;;;2414:300;;;681:9071;;14:131:50;-1:-1:-1;;;;;89:31:50;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:542::-;261:6;269;277;330:2;318:9;309:7;305:23;301:32;298:52;;;346:1;343;336:12;298:52;378:9;372:16;397:31;422:5;397:31;:::i;:::-;497:2;482:18;;476:25;447:5;;-1:-1:-1;510:33:50;476:25;510:33;:::i;:::-;614:2;599:18;;593:25;562:7;;-1:-1:-1;627:33:50;593:25;627:33;:::i;:::-;679:7;669:17;;;150:542;;;;;:::o;1054:397::-;681:9071:30;;;;;;\",\n \"linkReferences\": {}\n },\n \"deployedBytecode\": {\n \"object\": \"0x608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063889eba3b116100bf578063ba5f3f9d11610079578063ba5f3f9d1461030e578063c961ba7e14610321578063cc718f7614610338578063da0ff2c614610357578063f264980714610360578063f851a44014610388575f5ffd5b8063889eba3b146102875780638a0dac4a1461029a5780639bfefbfd146102ad578063a7ad58bf146102c0578063b3c83d99146102e8578063b96b161c146102fb575f5ffd5b8063578bd92111610110578063578bd921146101d45780635c975abb1461020d5780635dd41f2f146102315780636f9076381461025957806375829def1461026c5780638456cb591461027f575f5ffd5b8063079154391461014c5780633f4ba83a14610161578063452a932014610169578063492f34fb1461019957806352741df5146101c1575b5f5ffd5b61015f61015a366004610ef0565b61039a565b005b61015f61049f565b60015461017c906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61017c6101a7366004610f1e565b60036020525f90815260409020546001600160a01b031681565b61015f6101cf366004610ef0565b61050b565b6101e76101e2366004610f35565b610687565b60408051931515845260208401929092526001600160a01b031690820152606001610190565b60015461022190600160a01b900460ff1681565b6040519015158152602001610190565b61017c61023f366004610f1e565b5f908152600560205260409020546001600160a01b031690565b61015f610267366004610f1e565b6107b4565b61015f61027a366004610f73565b610895565b61015f610963565b61015f610295366004610f8e565b610a23565b61015f6102a8366004610f73565b610aa1565b61015f6102bb366004610f1e565b610b1b565b61017c6102ce366004610f1e565b60056020525f90815260409020546001600160a01b031681565b61015f6102f6366004610ef0565b610c2c565b60025461017c906001600160a01b031681565b61015f61031c366004610ef0565b610d7d565b61032a60045481565b604051908152602001610190565b61032a610346366004610f1e565b60076020525f908152604090205481565b61032a60065481565b61017c61036e366004610f1e565b5f908152600360205260409020546001600160a01b031690565b5f5461017c906001600160a01b031681565b5f546001600160a01b031633146103cc5760405162461bcd60e51b81526004016103c390610fae565b60405180910390fd5b816103e95760405162461bcd60e51b81526004016103c390610fe5565b6001600160a01b03811661040f5760405162461bcd60e51b81526004016103c390611015565b5f828152600360205260409020546001600160a01b03166104425760405162461bcd60e51b81526004016103c390611057565b5f8281526003602052604080822080546001600160a01b031981166001600160a01b038681169182179093559251911692839186917fa643a1aa11f9709b2990b31638a0b368d6d0c3b8f025a98a3249fea2bd5821d791a4505050565b5f546001600160a01b031633146104c85760405162461bcd60e51b81526004016103c390610fae565b6001805460ff60a01b191690556040515f81527f9a506b30e47f3823b09f67e4c0dfa5c3d8023b71825b7ceaa97677129128c9c5906020015b60405180910390a1565b5f546001600160a01b031633146105345760405162461bcd60e51b81526004016103c390610fae565b6001600160a01b03811661058a5760405162461bcd60e51b815260206004820152601d60248201527f48656c7065722063616e6e6f74206265207a65726f206164647265737300000060448201526064016103c3565b816105a75760405162461bcd60e51b81526004016103c390610fe5565b5f828152600560205260409020546001600160a01b0316156106155760405162461bcd60e51b815260206004820152602160248201527f48656c70657220616c72656164792065786973747320666f722076657273696f6044820152603760f91b60648201526084016103c3565b5f82815260056020526040812080546001600160a01b0319166001600160a01b0384161790556006805491610649836110ac565b90915550506040516001600160a01b0382169083907fe3eccbb854b4a5c161cda43f1e76981a22f8c4a4190a1e1b44bb8c69039b85b2905f90a35050565b5f5f5f600160149054906101000a900460ff16156106e75760405162461bcd60e51b815260206004820152601760248201527f526f6f742076657269666965722069732070617573656400000000000000000060448201526064016103c3565b83355f908152600360205260409020546001600160a01b03168061071d5760405162461bcd60e51b81526004016103c390611057565b600254604051637446a77360e11b81526001600160a01b038381169263e88d4ee692610751929091169089906004016111ce565b6040805180830381865afa15801561076b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078f9190611309565b95355f9081526005602052604090205490966001600160a01b03909116945092505050565b5f546001600160a01b031633146107dd5760405162461bcd60e51b81526004016103c390610fae565b806107fa5760405162461bcd60e51b81526004016103c390610fe5565b5f818152600360205260409020546001600160a01b03168061082e5760405162461bcd60e51b81526004016103c390611057565b5f82815260036020526040812080546001600160a01b0319169055600480549161085783611335565b90915550506040516001600160a01b0382169083907f2632c7adc4cecbf41bb3ee7c156aae99b0bcd9da3efa5b9315f77dcdf6ef3e66905f90a35050565b5f546001600160a01b031633146108be5760405162461bcd60e51b81526004016103c390610fae565b6001600160a01b0381166109145760405162461bcd60e51b815260206004820152601c60248201527f41646d696e2063616e6e6f74206265207a65726f20616464726573730000000060448201526064016103c3565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a35050565b5f546001600160a01b031633148061098557506001546001600160a01b031633145b6109e05760405162461bcd60e51b815260206004820152602660248201527f4e6f7420617574686f72697a65643a2061646d696e206f7220677561726469616044820152656e206f6e6c7960d01b60648201526084016103c3565b6001805460ff60a01b1916600160a01b1781556040519081527f9a506b30e47f3823b09f67e4c0dfa5c3d8023b71825b7ceaa97677129128c9c590602001610501565b5f546001600160a01b03163314610a4c5760405162461bcd60e51b81526004016103c390610fae565b5f8281526007602090815260409182902080549084905582518181529182018490529184917fbb4f63ec43349b7ec7c292d3e97704824bcdd2d758200521ad62d3e9a127f782910160405180910390a2505050565b5f546001600160a01b03163314610aca5760405162461bcd60e51b81526004016103c390610fae565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f064d28d3d3071c5cbc271a261c10c2f0f0d9e319390397101aa0eb23c6bad909905f90a35050565b5f546001600160a01b03163314610b445760405162461bcd60e51b81526004016103c390610fae565b80610b615760405162461bcd60e51b81526004016103c390610fe5565b5f818152600560205260409020546001600160a01b031680610bc55760405162461bcd60e51b815260206004820152601c60248201527f48656c706572206e6f7420666f756e6420666f722076657273696f6e0000000060448201526064016103c3565b5f82815260056020526040812080546001600160a01b03191690556006805491610bee83611335565b90915550506040516001600160a01b0382169083907f6a7d5ce7bf32942d5ee1a06318777e6921ab7173478635304ac93845d7de61e0905f90a35050565b5f546001600160a01b03163314610c555760405162461bcd60e51b81526004016103c390610fae565b6001600160a01b038116610c7b5760405162461bcd60e51b81526004016103c390611015565b81610c985760405162461bcd60e51b81526004016103c390610fe5565b5f828152600360205260409020546001600160a01b031615610d0b5760405162461bcd60e51b815260206004820152602660248201527f537562766572696669657220616c72656164792065786973747320666f72207660448201526532b939b4b7b760d11b60648201526084016103c3565b5f82815260036020526040812080546001600160a01b0319166001600160a01b0384161790556004805491610d3f836110ac565b90915550506040516001600160a01b0382169083907fa65f9939af3939f730447054d525d5526c5f9e75ccea14966e1de1876631f404905f90a35050565b5f546001600160a01b03163314610da65760405162461bcd60e51b81526004016103c390610fae565b81610dc35760405162461bcd60e51b81526004016103c390610fe5565b6001600160a01b038116610e195760405162461bcd60e51b815260206004820152601d60248201527f48656c7065722063616e6e6f74206265207a65726f206164647265737300000060448201526064016103c3565b5f828152600560205260409020546001600160a01b0316610e7c5760405162461bcd60e51b815260206004820152601c60248201527f48656c706572206e6f7420666f756e6420666f722076657273696f6e0000000060448201526064016103c3565b5f8281526005602052604080822080546001600160a01b031981166001600160a01b038681169182179093559251911692839186917fb9393e6de8fe36cc235a7d08d2fa004db98bbb2a2be241250df83a276bc0d62e91a4505050565b6001600160a01b0381168114610eed575f5ffd5b50565b5f5f60408385031215610f01575f5ffd5b823591506020830135610f1381610ed9565b809150509250929050565b5f60208284031215610f2e575f5ffd5b5035919050565b5f60208284031215610f45575f5ffd5b813567ffffffffffffffff811115610f5b575f5ffd5b820160808185031215610f6c575f5ffd5b9392505050565b5f60208284031215610f83575f5ffd5b8135610f6c81610ed9565b5f5f60408385031215610f9f575f5ffd5b50508035926020909101359150565b6020808252601a908201527f4e6f7420617574686f72697a65643a2061646d696e206f6e6c79000000000000604082015260600190565b60208082526016908201527556657273696f6e2063616e6e6f74206265207a65726f60501b604082015260600190565b60208082526022908201527f53756276657269666965722063616e6e6f74206265207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526021908201527f5375627665726966696572206e6f7420666f756e6420666f722076657273696f6040820152603760f91b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016110bd576110bd611098565b5060010190565b5f5f8335601e198436030181126110d9575f5ffd5b830160208101925035905067ffffffffffffffff8111156110f8575f5ffd5b803603821315611106575f5ffd5b9250929050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8235607e19833603018112611149575f5ffd5b90910192915050565b8015158114610eed575f5ffd5b803582525f61117160208301836110c4565b6080602086015261118660808601828461110d565b91505061119660408401846110c4565b85830360408701526111a983828461110d565b9250505060608301356111bb81611152565b8015156060860152508091505092915050565b6001600160a01b0383168152604060208083018290528335918301919091525f9083013536849003605e19018112611204575f5ffd5b608060608401528301803560c084015261122160208201826110c4565b606060e08601526112376101208601828461110d565b9150506040820135601e19833603018112611250575f5ffd5b60209201918201913567ffffffffffffffff81111561126d575f5ffd5b8060051b80360384131561127f575f5ffd5b85830360bf19016101008701528183526001600160fb1b038211156112a2575f5ffd5b8084602085013780830193505050506112be60408501856110c4565b601f198584030160808601526112d860208401828461110d565b925050506112e96060850185611135565b838203603f190160a08501526112ff828261115f565b9695505050505050565b5f5f6040838503121561131a575f5ffd5b825161132581611152565b6020939093015192949293505050565b5f8161134357611343611098565b505f19019056fea164736f6c634300081e000a\",\n \"sourceMap\": \"681:9071:30:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5964:529;;;;;;:::i;:::-;;:::i;:::-;;9650:100;;;:::i;741:23::-;;;;;-1:-1:-1;;;;;741:23:30;;;;;;-1:-1:-1;;;;;686:32:50;;;668:51;;656:2;641:18;741:23:30;;;;;;;;884:61;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;884:61:30;;;7056:416;;;;;;:::i;:::-;;:::i;3196:473::-;;;;;;:::i;:::-;;:::i;:::-;;;;1856:14:50;;1849:22;1831:41;;1903:2;1888:18;;1881:34;;;;-1:-1:-1;;;;;1951:32:50;1931:18;;;1924:60;1819:2;1804:18;3196:473:30;1609:381:50;768:18:30;;;;;-1:-1:-1;;;768:18:30;;;;;;;;;2160:14:50;;2153:22;2135:41;;2123:2;2108:18;768::30;1995:187:50;8806:111:30;;;;;;:::i;:::-;8865:7;8895:16;;;:7;:16;;;;;;-1:-1:-1;;;;;8895:16:30;;8806:111;5411:374;;;;;;:::i;:::-;;:::i;4123:229::-;;;;;;:::i;:::-;;:::i;9438:106::-;;;:::i;9034:181::-;;;;;;:::i;:::-;;:::i;4470:182::-;;;;;;:::i;:::-;;:::i;7584:329::-;;;;;;:::i;:::-;;:::i;1049:51::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1049:51:30;;;4821:473;;;;;;:::i;:::-;;:::i;821:33::-;;;;;-1:-1:-1;;;;;821:33:30;;;8077:459;;;;;;:::i;:::-;;:::i;993:31::-;;;;;;;;;3804:25:50;;;3792:2;3777:18;993:31:30;3658:177:50;1194:51:30;;;;;;:::i;:::-;;;;;;;;;;;;;;1143:26;;;;;;6778:121;;;;;;:::i;:::-;6842:7;6872:21;;;:12;:21;;;;;;-1:-1:-1;;;;;6872:21:30;;6778:121;717:20;;;;;-1:-1:-1;;;;;717:20:30;;;5964:529;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;;;;;;;;;6065:7;6057:56:::1;;;;-1:-1:-1::0;;;6057:56:30::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6127:28:30;::::1;6119:75;;;;-1:-1:-1::0;;;6119:75:30::1;;;;;;;:::i;:::-;6250:1;6216:21:::0;;;:12:::1;:21;::::0;;;;;-1:-1:-1;;;;;6216:21:30::1;6200:90;;;;-1:-1:-1::0;;;6200:90:30::1;;;;;;;:::i;:::-;6296:22;6329:21:::0;;;:12:::1;:21;::::0;;;;;;;-1:-1:-1;;;;;;6357:61:30;::::1;-1:-1:-1::0;;;;;6357:61:30;;::::1;::::0;;::::1;::::0;;;6429:59;;6329:21;::::1;::::0;;;;;6429:59:::1;::::0;::::1;6051:442;5964:529:::0;;:::o;9650:100::-;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;9694:6:::1;:14:::0;;-1:-1:-1;;;;9694:14:30::1;::::0;;9719:26:::1;::::0;-1:-1:-1;2135:41:50;;9719:26:30::1;::::0;2123:2:50;2108:18;9719:26:30::1;;;;;;;;9650:100::o:0;7056:416::-;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;-1:-1:-1;;;;;7144:23:30;::::1;7136:65;;;::::0;-1:-1:-1;;;7136:65:30;;5735:2:50;7136:65:30::1;::::0;::::1;5717:21:50::0;5774:2;5754:18;;;5747:30;5813:31;5793:18;;;5786:59;5862:18;;7136:65:30::1;5533:353:50::0;7136:65:30::1;7215:7:::0;7207:56:::1;;;;-1:-1:-1::0;;;7207:56:30::1;;;;;;;:::i;:::-;7314:1;7285:16:::0;;;:7:::1;:16;::::0;;;;;-1:-1:-1;;;;;7285:16:30::1;7277:39:::0;7269:85:::1;;;::::0;-1:-1:-1;;;7269:85:30;;6093:2:50;7269:85:30::1;::::0;::::1;6075:21:50::0;6132:2;6112:18;;;6105:30;6171:34;6151:18;;;6144:62;-1:-1:-1;;;6222:18:50;;;6215:31;6263:19;;7269:85:30::1;5891:397:50::0;7269:85:30::1;7360:16;::::0;;;:7:::1;:16;::::0;;;;:46;;-1:-1:-1;;;;;;7360:46:30::1;-1:-1:-1::0;;;;;7360:46:30;::::1;;::::0;;7412:11:::1;:13:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;7436:31:30::1;::::0;-1:-1:-1;;;;;7436:31:30;::::1;::::0;7448:7;;7436:31:::1;::::0;;;::::1;7056:416:::0;;:::o;3196:473::-;3306:10;3318:24;3344:23;3963:6;;;;;;;;;;;3962:7;3954:43;;;;-1:-1:-1;;;3954:43:30;;6767:2:50;3954:43:30;;;6749:21:50;6806:2;6786:18;;;6779:30;6845:25;6825:18;;;6818:53;6888:18;;3954:43:30;6565:347:50;3954:43:30;3426:14;::::1;3377:33;3413:28:::0;;;:12:::1;:28;::::0;;;;;-1:-1:-1;;;;;3413:28:30::1;::::0;3447:80:::1;;;;-1:-1:-1::0;;;3447:80:30::1;;;;;;;:::i;:::-;3580:12;::::0;3561:40:::1;::::0;-1:-1:-1;;;3561:40:30;;-1:-1:-1;;;;;3561:18:30;;::::1;::::0;::::1;::::0;:40:::1;::::0;3580:12;;::::1;::::0;3594:6;;3561:40:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3648:14:::0;::::1;3640:23;::::0;;;:7:::1;:23;::::0;;;;;3533:68;;-1:-1:-1;;;;;3640:23:30;;::::1;::::0;-1:-1:-1;3196:473:30;-1:-1:-1;;;3196:473:30:o;5411:374::-;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;5488:7;5480:56:::1;;;;-1:-1:-1::0;;;5480:56:30::1;;;;;;;:::i;:::-;5542:19;5572:21:::0;;;:12:::1;:21;::::0;;;;;-1:-1:-1;;;;;5572:21:30::1;::::0;5600:71:::1;;;;-1:-1:-1::0;;;5600:71:30::1;;;;;;;:::i;:::-;5684:21;::::0;;;:12:::1;:21;::::0;;;;5677:28;;-1:-1:-1;;;;;;5677:28:30::1;::::0;;5711:16:::1;:18:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;5740:40:30::1;::::0;-1:-1:-1;;;;;5740:40:30;::::1;::::0;5759:7;;5740:40:::1;::::0;;;::::1;5474:311;5411:374:::0;:::o;4123:229::-;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;-1:-1:-1;;;;;4197:22:30;::::1;4189:63;;;::::0;-1:-1:-1;;;4189:63:30;;11849:2:50;4189:63:30::1;::::0;::::1;11831:21:50::0;11888:2;11868:18;;;11861:30;11927;11907:18;;;11900:58;11975:18;;4189:63:30::1;11647:352:50::0;4189:63:30::1;4258:16;4277:5:::0;;-1:-1:-1;;;;;4288:16:30;;::::1;-1:-1:-1::0;;;;;;4288:16:30;::::1;::::0;::::1;::::0;;4315:32:::1;::::0;4277:5;;;::::1;::::0;;;4315:32:::1;::::0;4258:16;4315:32:::1;4183:169;4123:229:::0;:::o;9438:106::-;3833:5;;-1:-1:-1;;;;;3833:5:30;3819:10;:19;;:45;;-1:-1:-1;3856:8:30;;-1:-1:-1;;;;;3856:8:30;3842:10;:22;3819:45;3811:96;;;;-1:-1:-1;;;3811:96:30;;12206:2:50;3811:96:30;;;12188:21:50;12245:2;12225:18;;;12218:30;12284:34;12264:18;;;12257:62;-1:-1:-1;;;12335:18:50;;;12328:36;12381:19;;3811:96:30;12004:402:50;3811:96:30;9499:4:::1;9490:13:::0;;-1:-1:-1;;;;9490:13:30::1;-1:-1:-1::0;;;9490:13:30::1;::::0;;9514:25:::1;::::0;2135:41:50;;;9514:25:30::1;::::0;2123:2:50;2108:18;9514:25:30::1;1995:187:50::0;9034:181:30;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;9109:16:::1;9128:11:::0;;;:6:::1;:11;::::0;;;;;;;;;;9145:19;;;;9175:35;;12585:25:50;;;12626:18;;;12619:34;;;9128:11:30;;;9175:35:::1;::::0;12558:18:50;9175:35:30::1;;;;;;;9103:112;9034:181:::0;;:::o;4470:182::-;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;4559:8:::1;::::0;;-1:-1:-1;;;;;4573:22:30;;::::1;-1:-1:-1::0;;;;;;4573:22:30;::::1;::::0;::::1;::::0;;;4606:41:::1;::::0;4559:8;::::1;::::0;4573:22;4559:8;;4606:41:::1;::::0;4537:19:::1;::::0;4606:41:::1;4531:121;4470:182:::0;:::o;7584:329::-;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;7656:7;7648:56:::1;;;;-1:-1:-1::0;;;7648:56:30::1;;;;;;;:::i;:::-;7710:14;7735:16:::0;;;:7:::1;:16;::::0;;;;;-1:-1:-1;;;;;7735:16:30::1;::::0;7758:61:::1;;;::::0;-1:-1:-1;;;7758:61:30;;12866:2:50;7758:61:30::1;::::0;::::1;12848:21:50::0;12905:2;12885:18;;;12878:30;12944;12924:18;;;12917:58;12992:18;;7758:61:30::1;12664:352:50::0;7758:61:30::1;7832:16;::::0;;;:7:::1;:16;::::0;;;;7825:23;;-1:-1:-1;;;;;;7825:23:30::1;::::0;;7854:11:::1;:13:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;7878:30:30::1;::::0;-1:-1:-1;;;;;7878:30:30;::::1;::::0;7892:7;;7878:30:::1;::::0;;;::::1;7642:271;7584:329:::0;:::o;4821:473::-;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;-1:-1:-1;;;;;4930:34:30;::::1;4922:81;;;;-1:-1:-1::0;;;4922:81:30::1;;;;;;;:::i;:::-;5017:7:::0;5009:56:::1;;;;-1:-1:-1::0;;;5009:56:30::1;;;;;;;:::i;:::-;5121:1;5087:21:::0;;;:12:::1;:21;::::0;;;;;-1:-1:-1;;;;;5087:21:30::1;5079:44:::0;5071:95:::1;;;::::0;-1:-1:-1;;;5071:95:30;;13223:2:50;5071:95:30::1;::::0;::::1;13205:21:50::0;13262:2;13242:18;;;13235:30;13301:34;13281:18;;;13274:62;-1:-1:-1;;;13352:18:50;;;13345:36;13398:19;;5071:95:30::1;13021:402:50::0;5071:95:30::1;5172:21;::::0;;;:12:::1;:21;::::0;;;;:35;;-1:-1:-1;;;;;;5172:35:30::1;-1:-1:-1::0;;;;;5172:35:30;::::1;;::::0;;5213:16:::1;:18:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;5242:47:30::1;::::0;-1:-1:-1;;;;;5242:47:30;::::1;::::0;5259:7;;5242:47:::1;::::0;;;::::1;4821:473:::0;;:::o;8077:459::-;3722:5;;-1:-1:-1;;;;;3722:5:30;3708:10;:19;3700:58;;;;-1:-1:-1;;;3700:58:30;;;;;;;:::i;:::-;8168:7;8160:56:::1;;;;-1:-1:-1::0;;;8160:56:30::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8230:23:30;::::1;8222:65;;;::::0;-1:-1:-1;;;8222:65:30;;5735:2:50;8222:65:30::1;::::0;::::1;5717:21:50::0;5774:2;5754:18;;;5747:30;5813:31;5793:18;;;5786:59;5862:18;;8222:65:30::1;5533:353:50::0;8222:65:30::1;8338:1;8309:16:::0;;;:7:::1;:16;::::0;;;;;-1:-1:-1;;;;;8309:16:30::1;8293:80;;;::::0;-1:-1:-1;;;8293:80:30;;12866:2:50;8293:80:30::1;::::0;::::1;12848:21:50::0;12905:2;12885:18;;;12878:30;12944;12924:18;;;12917:58;12992:18;;8293:80:30::1;12664:352:50::0;8293:80:30::1;8379:17;8407:16:::0;;;:7:::1;:16;::::0;;;;;;;-1:-1:-1;;;;;;8430:46:30;::::1;-1:-1:-1::0;;;;;8430:46:30;;::::1;::::0;;::::1;::::0;;;8487:44;;8407:16;::::1;::::0;;;;;8487:44:::1;::::0;::::1;8154:382;8077:459:::0;;:::o;14:131:50:-;-1:-1:-1;;;;;89:31:50;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:367::-;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;340:23;;;-1:-1:-1;439:2:50;424:18;;411:32;452:33;411:32;452:33;:::i;:::-;504:7;494:17;;;150:367;;;;;:::o;730:226::-;789:6;842:2;830:9;821:7;817:23;813:32;810:52;;;858:1;855;848:12;810:52;-1:-1:-1;903:23:50;;730:226;-1:-1:-1;730:226:50:o;1200:404::-;1303:6;1356:2;1344:9;1335:7;1331:23;1327:32;1324:52;;;1372:1;1369;1362:12;1324:52;1412:9;1399:23;1445:18;1437:6;1434:30;1431:50;;;1477:1;1474;1467:12;1431:50;1500:22;;1556:3;1538:16;;;1534:26;1531:46;;;1573:1;1570;1563:12;1531:46;1596:2;1200:404;-1:-1:-1;;;1200:404:50:o;2187:247::-;2246:6;2299:2;2287:9;2278:7;2274:23;2270:32;2267:52;;;2315:1;2312;2305:12;2267:52;2354:9;2341:23;2373:31;2398:5;2373:31;:::i;2439:346::-;2507:6;2515;2568:2;2556:9;2547:7;2543:23;2539:32;2536:52;;;2584:1;2581;2574:12;2536:52;-1:-1:-1;;2629:23:50;;;2749:2;2734:18;;;2721:32;;-1:-1:-1;2439:346:50:o;4022:350::-;4224:2;4206:21;;;4263:2;4243:18;;;4236:30;4302:28;4297:2;4282:18;;4275:56;4363:2;4348:18;;4022:350::o;4377:346::-;4579:2;4561:21;;;4618:2;4598:18;;;4591:30;-1:-1:-1;;;4652:2:50;4637:18;;4630:52;4714:2;4699:18;;4377:346::o;4728:398::-;4930:2;4912:21;;;4969:2;4949:18;;;4942:30;5008:34;5003:2;4988:18;;4981:62;-1:-1:-1;;;5074:2:50;5059:18;;5052:32;5116:3;5101:19;;4728:398::o;5131:397::-;5333:2;5315:21;;;5372:2;5352:18;;;5345:30;5411:34;5406:2;5391:18;;5384:62;-1:-1:-1;;;5477:2:50;5462:18;;5455:31;5518:3;5503:19;;5131:397::o;6293:127::-;6354:10;6349:3;6345:20;6342:1;6335:31;6385:4;6382:1;6375:15;6409:4;6406:1;6399:15;6425:135;6464:3;6485:17;;;6482:43;;6505:18;;:::i;:::-;-1:-1:-1;6552:1:50;6541:13;;6425:135::o;6917:500::-;6975:5;6982:6;7042:3;7029:17;7128:2;7124:7;7113:8;7097:14;7093:29;7089:43;7069:18;7065:68;7055:96;;7147:1;7144;7137:12;7055:96;7175:33;;7279:4;7266:18;;;-1:-1:-1;7227:21:50;;-1:-1:-1;7307:18:50;7296:30;;7293:50;;;7339:1;7336;7329:12;7293:50;7386:6;7370:14;7366:27;7359:5;7355:39;7352:59;;;7407:1;7404;7397:12;7352:59;6917:500;;;;;:::o;7422:266::-;7510:6;7505:3;7498:19;7562:6;7555:5;7548:4;7543:3;7539:14;7526:43;-1:-1:-1;7614:1:50;7589:16;;;7607:4;7585:27;;;7578:38;;;;7670:2;7649:15;;;-1:-1:-1;;7645:29:50;7636:39;;;7632:50;;7422:266::o;7693:299::-;7766:5;7825:3;7812:17;7911:3;7907:8;7896;7880:14;7876:29;7872:44;7852:18;7848:69;7838:97;;7931:1;7928;7921:12;7838:97;7953:33;;;;7693:299;-1:-1:-1;;7693:299:50:o;7997:118::-;8083:5;8076:13;8069:21;8062:5;8059:32;8049:60;;8105:1;8102;8095:12;8120:752;8228:5;8215:19;8210:3;8203:32;8185:3;8278:55;8327:4;8320:5;8316:16;8309:5;8278:55;:::i;:::-;8365:4;8358;8353:3;8349:14;8342:28;8391:69;8454:4;8449:3;8445:14;8431:12;8417;8391:69;:::i;:::-;8379:81;;;8507:55;8556:4;8549:5;8545:16;8538:5;8507:55;:::i;:::-;8604:3;8598:4;8594:14;8587:4;8582:3;8578:14;8571:38;8632:63;8690:4;8674:14;8658;8632:63;:::i;:::-;8618:77;;;;8743:4;8736:5;8732:16;8719:30;8758;8780:7;8758:30;:::i;:::-;8834:7;8827:15;8820:23;8813:4;8808:3;8804:14;8797:47;;8860:6;8853:13;;;8120:752;;;;:::o;8877:2313::-;-1:-1:-1;;;;;9143:32:50;;9125:51;;9212:2;9207;9192:18;;;9185:30;;;9256:20;;9292:18;;;9285:33;;;;-1:-1:-1;;9366:15:50;;9353:29;9433:14;9429:27;;;-1:-1:-1;;9425:41:50;9401:66;;9391:94;;9481:1;9478;9471:12;9391:94;9576:4;9571:2;9556:18;;9549:32;9509:31;;9626:21;;9678:3;9663:19;;9656:36;9735:57;9788:2;9775:16;;9509:31;9735:57;:::i;:::-;9829:2;9823:3;9812:9;9808:19;9801:31;9855:74;9924:3;9913:9;9909:19;9895:12;9881;9855:74;:::i;:::-;9841:88;;;9992:2;9983:7;9979:16;9966:30;10079:2;10075:7;10065;10049:14;10045:28;10041:42;10019:20;10015:69;10005:97;;10098:1;10095;10088:12;10005:97;10241:2;10126:34;;10228:16;;;;10183:21;10267:18;10256:30;;10253:50;;;10299:1;10296;10289:12;10253:50;10329:6;10326:1;10322:14;10381:2;10365:14;10361:23;10352:7;10348:37;10345:57;;;10398:1;10395;10388:12;10345:57;10443:22;;;-1:-1:-1;;10439:37:50;10433:3;10418:19;;10411:66;10486:22;;;-1:-1:-1;;;;;10520:31:50;;10517:51;;;10564:1;10561;10554:12;10517:51;10616:2;10607:7;10602:2;10594:6;10590:15;10577:42;10650:2;10642:6;10638:15;10628:25;;;;;10700:55;10751:2;10743:6;10739:15;10731:6;10700:55;:::i;:::-;-1:-1:-1;;10801:18:50;;;10793:41;10786:4;10771:20;;10764:71;10858:70;10821:2;10916:11;;10900:14;10884;10858:70;:::i;:::-;10844:84;;;;10959:70;11025:2;11017:6;11013:15;11005:6;10959:70;:::i;:::-;11070:22;;;-1:-1:-1;;11066:36:50;11060:3;11045:19;;11038:65;11120:64;11074:6;11161:14;11120:64;:::i;:::-;11112:72;8877:2313;-1:-1:-1;;;;;;8877:2313:50:o;11195:306::-;11271:6;11279;11332:2;11320:9;11311:7;11307:23;11303:32;11300:52;;;11348:1;11345;11338:12;11300:52;11380:9;11374:16;11399:28;11421:5;11399:28;:::i;:::-;11491:2;11476:18;;;;11470:25;11446:5;;11470:25;;-1:-1:-1;;;11195:306:50:o;11506:136::-;11545:3;11573:5;11563:39;;11582:18;;:::i;:::-;-1:-1:-1;;;11618:18:50;;11506:136::o\",\n \"linkReferences\": {}\n },\n \"methodIdentifiers\": {\n \"addHelper(bytes32,address)\": \"52741df5\",\n \"addSubVerifier(bytes32,address)\": \"b3c83d99\",\n \"admin()\": \"f851a440\",\n \"config(bytes32)\": \"cc718f76\",\n \"getHelper(bytes32)\": \"5dd41f2f\",\n \"getSubVerifier(bytes32)\": \"f2649807\",\n \"guardian()\": \"452a9320\",\n \"helperCount()\": \"da0ff2c6\",\n \"helpers(bytes32)\": \"a7ad58bf\",\n \"pause()\": \"8456cb59\",\n \"paused()\": \"5c975abb\",\n \"removeHelper(bytes32)\": \"9bfefbfd\",\n \"removeSubVerifier(bytes32)\": \"6f907638\",\n \"rootRegistry()\": \"b96b161c\",\n \"setGuardian(address)\": \"8a0dac4a\",\n \"subverifierCount()\": \"c961ba7e\",\n \"subverifiers(bytes32)\": \"492f34fb\",\n \"transferAdmin(address)\": \"75829def\",\n \"unpause()\": \"3f4ba83a\",\n \"updateConfig(bytes32,bytes32)\": \"889eba3b\",\n \"updateHelper(bytes32,address)\": \"ba5f3f9d\",\n \"updateSubVerifier(bytes32,address)\": \"07915439\",\n \"verify((bytes32,(bytes32,bytes,bytes32[]),bytes,(uint256,string,string,bool)))\": \"578bd921\"\n },\n \"rawMetadata\": \"{\\\"compiler\\\":{\\\"version\\\":\\\"0.8.30+commit.73712a01\\\"},\\\"language\\\":\\\"Solidity\\\",\\\"output\\\":{\\\"abi\\\":[{\\\"inputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"_admin\\\",\\\"type\\\":\\\"address\\\"},{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"_guardian\\\",\\\"type\\\":\\\"address\\\"},{\\\"internalType\\\":\\\"contract IRootRegistry\\\",\\\"name\\\":\\\"_rootRegistry\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"constructor\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"oldAdmin\\\",\\\"type\\\":\\\"address\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newAdmin\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"AdminUpdated\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"key\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"indexed\\\":false,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"oldValue\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"indexed\\\":false,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"newValue\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"ConfigUpdated\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"oldGuardian\\\",\\\"type\\\":\\\"address\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newGuardian\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"GuardianUpdated\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"helper\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"HelperAdded\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"helper\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"HelperRemoved\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"oldHelper\\\",\\\"type\\\":\\\"address\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newHelper\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"HelperUpdated\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":false,\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"paused\\\",\\\"type\\\":\\\"bool\\\"}],\\\"name\\\":\\\"PausedStatusChanged\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"oldRootRegistry\\\",\\\"type\\\":\\\"address\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newRootRegistry\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"RootRegistryUpdated\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":false,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"admin\\\",\\\"type\\\":\\\"address\\\"},{\\\"indexed\\\":false,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"guardian\\\",\\\"type\\\":\\\"address\\\"},{\\\"indexed\\\":false,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"rootRegistry\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"RootVerifierDeployed\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"subVerifier\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"SubVerifierAdded\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"subVerifier\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"SubVerifierRemoved\\\",\\\"type\\\":\\\"event\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":true,\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"oldSubVerifier\\\",\\\"type\\\":\\\"address\\\"},{\\\"indexed\\\":true,\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newSubVerifier\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"SubVerifierUpdated\\\",\\\"type\\\":\\\"event\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newHelper\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"addHelper\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"internalType\\\":\\\"contract ZKPassportSubVerifier\\\",\\\"name\\\":\\\"subVerifier\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"addSubVerifier\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"admin\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"key\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"config\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"getHelper\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"getSubVerifier\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"guardian\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"helperCount\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint256\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"helpers\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"contract ZKPassportHelper\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"pause\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"paused\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"bool\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"removeHelper\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"removeSubVerifier\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"rootRegistry\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"contract IRootRegistry\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newGuardian\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"setGuardian\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"subverifierCount\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint256\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"subverifiers\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"contract ZKPassportSubVerifier\\\",\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newAdmin\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"transferAdmin\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[],\\\"name\\\":\\\"unpause\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"key\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"bytes32\\\"}],\\\"name\\\":\\\"updateConfig\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newHelper\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"updateHelper\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"internalType\\\":\\\"address\\\",\\\"name\\\":\\\"newSubVerifier\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"updateSubVerifier\\\",\\\"outputs\\\":[],\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"components\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"version\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"components\\\":[{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"vkeyHash\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"internalType\\\":\\\"bytes\\\",\\\"name\\\":\\\"proof\\\",\\\"type\\\":\\\"bytes\\\"},{\\\"internalType\\\":\\\"bytes32[]\\\",\\\"name\\\":\\\"publicInputs\\\",\\\"type\\\":\\\"bytes32[]\\\"}],\\\"internalType\\\":\\\"struct ProofVerificationData\\\",\\\"name\\\":\\\"proofVerificationData\\\",\\\"type\\\":\\\"tuple\\\"},{\\\"internalType\\\":\\\"bytes\\\",\\\"name\\\":\\\"committedInputs\\\",\\\"type\\\":\\\"bytes\\\"},{\\\"components\\\":[{\\\"internalType\\\":\\\"uint256\\\",\\\"name\\\":\\\"validityPeriodInSeconds\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"internalType\\\":\\\"string\\\",\\\"name\\\":\\\"domain\\\",\\\"type\\\":\\\"string\\\"},{\\\"internalType\\\":\\\"string\\\",\\\"name\\\":\\\"scope\\\",\\\"type\\\":\\\"string\\\"},{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"devMode\\\",\\\"type\\\":\\\"bool\\\"}],\\\"internalType\\\":\\\"struct ServiceConfig\\\",\\\"name\\\":\\\"serviceConfig\\\",\\\"type\\\":\\\"tuple\\\"}],\\\"internalType\\\":\\\"struct ProofVerificationParams\\\",\\\"name\\\":\\\"params\\\",\\\"type\\\":\\\"tuple\\\"}],\\\"name\\\":\\\"verify\\\",\\\"outputs\\\":[{\\\"internalType\\\":\\\"bool\\\",\\\"name\\\":\\\"valid\\\",\\\"type\\\":\\\"bool\\\"},{\\\"internalType\\\":\\\"bytes32\\\",\\\"name\\\":\\\"uniqueIdentifier\\\",\\\"type\\\":\\\"bytes32\\\"},{\\\"internalType\\\":\\\"contract ZKPassportHelper\\\",\\\"name\\\":\\\"helper\\\",\\\"type\\\":\\\"address\\\"}],\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"}],\\\"devdoc\\\":{\\\"kind\\\":\\\"dev\\\",\\\"methods\\\":{\\\"addHelper(bytes32,address)\\\":{\\\"params\\\":{\\\"newHelper\\\":\\\"The address of the helper\\\",\\\"version\\\":\\\"The version identifier\\\"}},\\\"addSubVerifier(bytes32,address)\\\":{\\\"params\\\":{\\\"subVerifier\\\":\\\"The address of the subverifier\\\",\\\"version\\\":\\\"The version identifier\\\"}},\\\"constructor\\\":{\\\"params\\\":{\\\"_admin\\\":\\\"The admin address\\\",\\\"_guardian\\\":\\\"The guardian address\\\",\\\"_rootRegistry\\\":\\\"The root registry address\\\"}},\\\"getHelper(bytes32)\\\":{\\\"details\\\":\\\"Returns zero address if no helper exists for the given version\\\",\\\"params\\\":{\\\"version\\\":\\\"The version identifier\\\"},\\\"returns\\\":{\\\"_0\\\":\\\"The address of the helper contract, or zero address if not found\\\"}},\\\"getSubVerifier(bytes32)\\\":{\\\"details\\\":\\\"Returns zero address if no subverifier exists for the given version\\\",\\\"params\\\":{\\\"version\\\":\\\"The version identifier\\\"},\\\"returns\\\":{\\\"_0\\\":\\\"The address of the subverifier contract, or zero address if not found\\\"}},\\\"pause()\\\":{\\\"details\\\":\\\"Only admin or guardian can pause the root verifierThis is a security measure to pause all proof verification operations in the event of an emergency\\\"},\\\"removeHelper(bytes32)\\\":{\\\"params\\\":{\\\"version\\\":\\\"The version identifier\\\"}},\\\"removeSubVerifier(bytes32)\\\":{\\\"params\\\":{\\\"version\\\":\\\"The version identifier\\\"}},\\\"setGuardian(address)\\\":{\\\"params\\\":{\\\"newGuardian\\\":\\\"The new guardian address\\\"}},\\\"transferAdmin(address)\\\":{\\\"params\\\":{\\\"newAdmin\\\":\\\"The new admin address\\\"}},\\\"unpause()\\\":{\\\"details\\\":\\\"Only admin can unpause the root verifier\\\"},\\\"updateConfig(bytes32,bytes32)\\\":{\\\"params\\\":{\\\"key\\\":\\\"The config key\\\",\\\"value\\\":\\\"The config value\\\"}},\\\"updateHelper(bytes32,address)\\\":{\\\"params\\\":{\\\"newHelper\\\":\\\"The address of the new helper\\\",\\\"version\\\":\\\"The version identifier\\\"}},\\\"updateSubVerifier(bytes32,address)\\\":{\\\"params\\\":{\\\"newSubVerifier\\\":\\\"The address of the new subverifier\\\",\\\"version\\\":\\\"The version identifier\\\"}},\\\"verify((bytes32,(bytes32,bytes,bytes32[]),bytes,(uint256,string,string,bool)))\\\":{\\\"details\\\":\\\"This function is called by the root verifier to verify a proof for a specific version\\\",\\\"params\\\":{\\\"params\\\":\\\"The proof verification parameters\\\"},\\\"returns\\\":{\\\"helper\\\":\\\"The helper for the calling contract to use to verify the committed inputs\\\",\\\"uniqueIdentifier\\\":\\\"The unique identifier associated with the ID used to generate the proof\\\",\\\"valid\\\":\\\"True if the proof is valid or false otherwise\\\"}}},\\\"title\\\":\\\"ZKPassport Root Verifier\\\",\\\"version\\\":1},\\\"userdoc\\\":{\\\"kind\\\":\\\"user\\\",\\\"methods\\\":{\\\"addHelper(bytes32,address)\\\":{\\\"notice\\\":\\\"Adds a helper for a specific version\\\"},\\\"addSubVerifier(bytes32,address)\\\":{\\\"notice\\\":\\\"Adds a subverifier for a specific version\\\"},\\\"constructor\\\":{\\\"notice\\\":\\\"Constructor\\\"},\\\"getHelper(bytes32)\\\":{\\\"notice\\\":\\\"Gets the helper address for a specific version\\\"},\\\"getSubVerifier(bytes32)\\\":{\\\"notice\\\":\\\"Gets the subverifier address for a specific version\\\"},\\\"pause()\\\":{\\\"notice\\\":\\\"Pause the root verifier\\\"},\\\"removeHelper(bytes32)\\\":{\\\"notice\\\":\\\"Removes a helper for a specific version\\\"},\\\"removeSubVerifier(bytes32)\\\":{\\\"notice\\\":\\\"Removes a subverifier for a specific version\\\"},\\\"setGuardian(address)\\\":{\\\"notice\\\":\\\"Sets the guardian role to a new address\\\"},\\\"transferAdmin(address)\\\":{\\\"notice\\\":\\\"Transfers the admin role to a new address\\\"},\\\"unpause()\\\":{\\\"notice\\\":\\\"Unpause the root verifier\\\"},\\\"updateConfig(bytes32,bytes32)\\\":{\\\"notice\\\":\\\"Update a config value\\\"},\\\"updateHelper(bytes32,address)\\\":{\\\"notice\\\":\\\"Updates a helper for a specific version\\\"},\\\"updateSubVerifier(bytes32,address)\\\":{\\\"notice\\\":\\\"Updates a subverifier for a specific version\\\"},\\\"verify((bytes32,(bytes32,bytes,bytes32[]),bytes,(uint256,string,string,bool)))\\\":{\\\"notice\\\":\\\"Verifies a ZKPassport zero-knowledge proof\\\"}},\\\"notice\\\":\\\"Main entry point for verifying ZKPassport identity proofs\\\",\\\"version\\\":1}},\\\"settings\\\":{\\\"compilationTarget\\\":{\\\"src/ZKPassportRootVerifier.sol\\\":\\\"ZKPassportRootVerifier\\\"},\\\"evmVersion\\\":\\\"prague\\\",\\\"libraries\\\":{},\\\"metadata\\\":{\\\"bytecodeHash\\\":\\\"none\\\"},\\\"optimizer\\\":{\\\"enabled\\\":true,\\\"runs\\\":200},\\\"remappings\\\":[\\\":forge-std/=lib/forge-std/src/\\\"]},\\\"sources\\\":{\\\"src/Constants.sol\\\":{\\\"keccak256\\\":\\\"0x70cb81262ae099d738f4b172d880f51bd76a0a629d602c19fa29e35297c0a324\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://e56b1934ba3562be3bdfbe2a1fb2e8fd0a452255921a3899fefcc2568354f09b\\\",\\\"dweb:/ipfs/QmNcFc9ACdwcdRNJwhkUXgawB2p7BS4jUDAXyHyApYNZG1\\\"]},\\\"src/DateUtils.sol\\\":{\\\"keccak256\\\":\\\"0x4176feda967f91ccf0a1cdecc75bbf7e5aaad7b46f95e133887e3ac6ae9126f6\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://6774599f7320a37f2e5cc22e0d8e59a1f46841a6ac94d7d45b072a809237e1ab\\\",\\\"dweb:/ipfs/QmdrX9uQKsvN9gTgCD1zd1kigvJGsgHbvabvdWaWHuSeY4\\\"]},\\\"src/IProofVerifier.sol\\\":{\\\"keccak256\\\":\\\"0xf8acc6ee390c406eaa8415863f156e251935f8de51bcd3c876871fbe5b5b4f14\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://64016d156d15fd43d407e832fd7b333e07e80b42f0ed9d845a8cc114d3857aa6\\\",\\\"dweb:/ipfs/QmP7zSvchyDqov13cyuWxLJDYBBpYZxrPEdGQcheyoJkUm\\\"]},\\\"src/IRootRegistry.sol\\\":{\\\"keccak256\\\":\\\"0xc994fab81ea1202a93620e7e7a01ba1e61f055498ed5b09503f4b384d0554b2a\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://12a19bab224c63ee4a0e3b4048c24e80b3ef5a3459070816c20f2c32b2ad5f72\\\",\\\"dweb:/ipfs/QmW1DF8mAwBfacrG2r2R3uyY92i6q1h1hZvHPuwMdXTANg\\\"]},\\\"src/InputsExtractor.sol\\\":{\\\"keccak256\\\":\\\"0xd8d08cc68a571c9efdddd90ea274c18694284d40a9f1d0a1112a4999fd6a58da\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://000752a284d1df5c0687d32554c83e99afedab49e23d7213679ed93424760450\\\",\\\"dweb:/ipfs/QmWrFS4ChUv4okqnEgSLiuSsxohDnTnYLWeyYviVbPTgcH\\\"]},\\\"src/StringUtils.sol\\\":{\\\"keccak256\\\":\\\"0xd52eb407eef932c9a343f1225fc997b7194ff0f05c488661a7adb4a37f980306\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://60bfaf52ebd50633d6eff5ea346d25283962495c630b37f4c0cd6008e8d8fd11\\\",\\\"dweb:/ipfs/QmWVtJnjcaowsFUBRRQ7eNTntghZ4FekXXgeQNAV4PkDWe\\\"]},\\\"src/Types.sol\\\":{\\\"keccak256\\\":\\\"0x66d73b090401a5f424e1feacf1b503dcd906163f4c749189db3dc108d6dfd668\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://d90eff17b597915e95c01a171c4378e7e4e287d35ca25dbd3f684373e93cda0c\\\",\\\"dweb:/ipfs/QmYe1wixU4zZAogteHT5eubcB4qzScCYzLtYFpFBitpZeR\\\"]},\\\"src/ZKPassportHelper.sol\\\":{\\\"keccak256\\\":\\\"0x902d97e8609effd60e632eddd425c0ab8c089466bd932ff631b8a79b84064755\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://8ade7be5536d07a3abb6a6468ff5966f021311df1d006dde60cefb0bc6e2f4bf\\\",\\\"dweb:/ipfs/QmNaRCxFRfHShkHgzDSxc1YS5RDr5nc1LXDUhMdxBjGc2E\\\"]},\\\"src/ZKPassportRootVerifier.sol\\\":{\\\"keccak256\\\":\\\"0x5fb7a856f66496a36e4de2ff2dca8fcce5a2c3db3adbf20910b1b20f24e6a009\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://c2693f7a086c3ff60441a12a5d72c6a2fbd811123c03d73b0887474cbefe6355\\\",\\\"dweb:/ipfs/QmbTgqop8Fb9nxcUveDSDgyMXzVBY1xw2u8eMxaFfVVp1s\\\"]},\\\"src/ZKPassportSubVerifier.sol\\\":{\\\"keccak256\\\":\\\"0xa78975774cb39e6ee44ee5806435a5abb7a7143c893fc2b8f9a0dfec56c149f9\\\",\\\"license\\\":\\\"Apache-2.0\\\",\\\"urls\\\":[\\\"bzz-raw://58d6ec604e06d90fa3c7fd20e59504a44ae6a81e2a97dcdffe66e0754bf4aa94\\\",\\\"dweb:/ipfs/QmbeyfyvkktggXCzfTu896Zg15UPJaoVr1WrqxKQn31RdF\\\"]}},\\\"version\\\":1}\",\n \"metadata\": {\n \"compiler\": { \"version\": \"0.8.30+commit.73712a01\" },\n \"language\": \"Solidity\",\n \"output\": {\n \"abi\": [\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"_admin\", \"type\": \"address\" },\n { \"internalType\": \"address\", \"name\": \"_guardian\", \"type\": \"address\" },\n { \"internalType\": \"contract IRootRegistry\", \"name\": \"_rootRegistry\", \"type\": \"address\" }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"oldAdmin\", \"type\": \"address\", \"indexed\": true },\n { \"internalType\": \"address\", \"name\": \"newAdmin\", \"type\": \"address\", \"indexed\": true }\n ],\n \"type\": \"event\",\n \"name\": \"AdminUpdated\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"key\", \"type\": \"bytes32\", \"indexed\": true },\n { \"internalType\": \"bytes32\", \"name\": \"oldValue\", \"type\": \"bytes32\", \"indexed\": false },\n { \"internalType\": \"bytes32\", \"name\": \"newValue\", \"type\": \"bytes32\", \"indexed\": false }\n ],\n \"type\": \"event\",\n \"name\": \"ConfigUpdated\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"oldGuardian\",\n \"type\": \"address\",\n \"indexed\": true\n },\n { \"internalType\": \"address\", \"name\": \"newGuardian\", \"type\": \"address\", \"indexed\": true }\n ],\n \"type\": \"event\",\n \"name\": \"GuardianUpdated\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true },\n { \"internalType\": \"address\", \"name\": \"helper\", \"type\": \"address\", \"indexed\": true }\n ],\n \"type\": \"event\",\n \"name\": \"HelperAdded\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true },\n { \"internalType\": \"address\", \"name\": \"helper\", \"type\": \"address\", \"indexed\": true }\n ],\n \"type\": \"event\",\n \"name\": \"HelperRemoved\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true },\n { \"internalType\": \"address\", \"name\": \"oldHelper\", \"type\": \"address\", \"indexed\": true },\n { \"internalType\": \"address\", \"name\": \"newHelper\", \"type\": \"address\", \"indexed\": true }\n ],\n \"type\": \"event\",\n \"name\": \"HelperUpdated\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bool\", \"name\": \"paused\", \"type\": \"bool\", \"indexed\": false }\n ],\n \"type\": \"event\",\n \"name\": \"PausedStatusChanged\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"oldRootRegistry\",\n \"type\": \"address\",\n \"indexed\": true\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newRootRegistry\",\n \"type\": \"address\",\n \"indexed\": true\n }\n ],\n \"type\": \"event\",\n \"name\": \"RootRegistryUpdated\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"admin\", \"type\": \"address\", \"indexed\": false },\n { \"internalType\": \"address\", \"name\": \"guardian\", \"type\": \"address\", \"indexed\": false },\n {\n \"internalType\": \"address\",\n \"name\": \"rootRegistry\",\n \"type\": \"address\",\n \"indexed\": false\n }\n ],\n \"type\": \"event\",\n \"name\": \"RootVerifierDeployed\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true },\n { \"internalType\": \"address\", \"name\": \"subVerifier\", \"type\": \"address\", \"indexed\": true }\n ],\n \"type\": \"event\",\n \"name\": \"SubVerifierAdded\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true },\n { \"internalType\": \"address\", \"name\": \"subVerifier\", \"type\": \"address\", \"indexed\": true }\n ],\n \"type\": \"event\",\n \"name\": \"SubVerifierRemoved\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\", \"indexed\": true },\n {\n \"internalType\": \"address\",\n \"name\": \"oldSubVerifier\",\n \"type\": \"address\",\n \"indexed\": true\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newSubVerifier\",\n \"type\": \"address\",\n \"indexed\": true\n }\n ],\n \"type\": \"event\",\n \"name\": \"SubVerifierUpdated\",\n \"anonymous\": false\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" },\n { \"internalType\": \"address\", \"name\": \"newHelper\", \"type\": \"address\" }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"addHelper\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" },\n {\n \"internalType\": \"contract ZKPassportSubVerifier\",\n \"name\": \"subVerifier\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"addSubVerifier\"\n },\n {\n \"inputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"admin\",\n \"outputs\": [{ \"internalType\": \"address\", \"name\": \"\", \"type\": \"address\" }]\n },\n {\n \"inputs\": [{ \"internalType\": \"bytes32\", \"name\": \"key\", \"type\": \"bytes32\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"config\",\n \"outputs\": [{ \"internalType\": \"bytes32\", \"name\": \"value\", \"type\": \"bytes32\" }]\n },\n {\n \"inputs\": [{ \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"getHelper\",\n \"outputs\": [{ \"internalType\": \"address\", \"name\": \"\", \"type\": \"address\" }]\n },\n {\n \"inputs\": [{ \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"getSubVerifier\",\n \"outputs\": [{ \"internalType\": \"address\", \"name\": \"\", \"type\": \"address\" }]\n },\n {\n \"inputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"guardian\",\n \"outputs\": [{ \"internalType\": \"address\", \"name\": \"\", \"type\": \"address\" }]\n },\n {\n \"inputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"helperCount\",\n \"outputs\": [{ \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" }]\n },\n {\n \"inputs\": [{ \"internalType\": \"bytes32\", \"name\": \"\", \"type\": \"bytes32\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"helpers\",\n \"outputs\": [\n { \"internalType\": \"contract ZKPassportHelper\", \"name\": \"\", \"type\": \"address\" }\n ]\n },\n { \"inputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"pause\" },\n {\n \"inputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"paused\",\n \"outputs\": [{ \"internalType\": \"bool\", \"name\": \"\", \"type\": \"bool\" }]\n },\n {\n \"inputs\": [{ \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" }],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"removeHelper\"\n },\n {\n \"inputs\": [{ \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" }],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"removeSubVerifier\"\n },\n {\n \"inputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"rootRegistry\",\n \"outputs\": [{ \"internalType\": \"contract IRootRegistry\", \"name\": \"\", \"type\": \"address\" }]\n },\n {\n \"inputs\": [{ \"internalType\": \"address\", \"name\": \"newGuardian\", \"type\": \"address\" }],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"setGuardian\"\n },\n {\n \"inputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"subverifierCount\",\n \"outputs\": [{ \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" }]\n },\n {\n \"inputs\": [{ \"internalType\": \"bytes32\", \"name\": \"\", \"type\": \"bytes32\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"subverifiers\",\n \"outputs\": [\n { \"internalType\": \"contract ZKPassportSubVerifier\", \"name\": \"\", \"type\": \"address\" }\n ]\n },\n {\n \"inputs\": [{ \"internalType\": \"address\", \"name\": \"newAdmin\", \"type\": \"address\" }],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"transferAdmin\"\n },\n { \"inputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"function\", \"name\": \"unpause\" },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"key\", \"type\": \"bytes32\" },\n { \"internalType\": \"bytes32\", \"name\": \"value\", \"type\": \"bytes32\" }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"updateConfig\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" },\n { \"internalType\": \"address\", \"name\": \"newHelper\", \"type\": \"address\" }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"updateHelper\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" },\n { \"internalType\": \"address\", \"name\": \"newSubVerifier\", \"type\": \"address\" }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\",\n \"name\": \"updateSubVerifier\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"struct ProofVerificationParams\",\n \"name\": \"params\",\n \"type\": \"tuple\",\n \"components\": [\n { \"internalType\": \"bytes32\", \"name\": \"version\", \"type\": \"bytes32\" },\n {\n \"internalType\": \"struct ProofVerificationData\",\n \"name\": \"proofVerificationData\",\n \"type\": \"tuple\",\n \"components\": [\n { \"internalType\": \"bytes32\", \"name\": \"vkeyHash\", \"type\": \"bytes32\" },\n { \"internalType\": \"bytes\", \"name\": \"proof\", \"type\": \"bytes\" },\n { \"internalType\": \"bytes32[]\", \"name\": \"publicInputs\", \"type\": \"bytes32[]\" }\n ]\n },\n { \"internalType\": \"bytes\", \"name\": \"committedInputs\", \"type\": \"bytes\" },\n {\n \"internalType\": \"struct ServiceConfig\",\n \"name\": \"serviceConfig\",\n \"type\": \"tuple\",\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"validityPeriodInSeconds\",\n \"type\": \"uint256\"\n },\n { \"internalType\": \"string\", \"name\": \"domain\", \"type\": \"string\" },\n { \"internalType\": \"string\", \"name\": \"scope\", \"type\": \"string\" },\n { \"internalType\": \"bool\", \"name\": \"devMode\", \"type\": \"bool\" }\n ]\n }\n ]\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\",\n \"name\": \"verify\",\n \"outputs\": [\n { \"internalType\": \"bool\", \"name\": \"valid\", \"type\": \"bool\" },\n { \"internalType\": \"bytes32\", \"name\": \"uniqueIdentifier\", \"type\": \"bytes32\" },\n { \"internalType\": \"contract ZKPassportHelper\", \"name\": \"helper\", \"type\": \"address\" }\n ]\n }\n ],\n \"devdoc\": {\n \"kind\": \"dev\",\n \"methods\": {\n \"addHelper(bytes32,address)\": {\n \"params\": {\n \"newHelper\": \"The address of the helper\",\n \"version\": \"The version identifier\"\n }\n },\n \"addSubVerifier(bytes32,address)\": {\n \"params\": {\n \"subVerifier\": \"The address of the subverifier\",\n \"version\": \"The version identifier\"\n }\n },\n \"constructor\": {\n \"params\": {\n \"_admin\": \"The admin address\",\n \"_guardian\": \"The guardian address\",\n \"_rootRegistry\": \"The root registry address\"\n }\n },\n \"getHelper(bytes32)\": {\n \"details\": \"Returns zero address if no helper exists for the given version\",\n \"params\": { \"version\": \"The version identifier\" },\n \"returns\": { \"_0\": \"The address of the helper contract, or zero address if not found\" }\n },\n \"getSubVerifier(bytes32)\": {\n \"details\": \"Returns zero address if no subverifier exists for the given version\",\n \"params\": { \"version\": \"The version identifier\" },\n \"returns\": {\n \"_0\": \"The address of the subverifier contract, or zero address if not found\"\n }\n },\n \"pause()\": {\n \"details\": \"Only admin or guardian can pause the root verifierThis is a security measure to pause all proof verification operations in the event of an emergency\"\n },\n \"removeHelper(bytes32)\": { \"params\": { \"version\": \"The version identifier\" } },\n \"removeSubVerifier(bytes32)\": { \"params\": { \"version\": \"The version identifier\" } },\n \"setGuardian(address)\": { \"params\": { \"newGuardian\": \"The new guardian address\" } },\n \"transferAdmin(address)\": { \"params\": { \"newAdmin\": \"The new admin address\" } },\n \"unpause()\": { \"details\": \"Only admin can unpause the root verifier\" },\n \"updateConfig(bytes32,bytes32)\": {\n \"params\": { \"key\": \"The config key\", \"value\": \"The config value\" }\n },\n \"updateHelper(bytes32,address)\": {\n \"params\": {\n \"newHelper\": \"The address of the new helper\",\n \"version\": \"The version identifier\"\n }\n },\n \"updateSubVerifier(bytes32,address)\": {\n \"params\": {\n \"newSubVerifier\": \"The address of the new subverifier\",\n \"version\": \"The version identifier\"\n }\n },\n \"verify((bytes32,(bytes32,bytes,bytes32[]),bytes,(uint256,string,string,bool)))\": {\n \"details\": \"This function is called by the root verifier to verify a proof for a specific version\",\n \"params\": { \"params\": \"The proof verification parameters\" },\n \"returns\": {\n \"helper\": \"The helper for the calling contract to use to verify the committed inputs\",\n \"uniqueIdentifier\": \"The unique identifier associated with the ID used to generate the proof\",\n \"valid\": \"True if the proof is valid or false otherwise\"\n }\n }\n },\n \"version\": 1\n },\n \"userdoc\": {\n \"kind\": \"user\",\n \"methods\": {\n \"addHelper(bytes32,address)\": { \"notice\": \"Adds a helper for a specific version\" },\n \"addSubVerifier(bytes32,address)\": {\n \"notice\": \"Adds a subverifier for a specific version\"\n },\n \"constructor\": { \"notice\": \"Constructor\" },\n \"getHelper(bytes32)\": { \"notice\": \"Gets the helper address for a specific version\" },\n \"getSubVerifier(bytes32)\": {\n \"notice\": \"Gets the subverifier address for a specific version\"\n },\n \"pause()\": { \"notice\": \"Pause the root verifier\" },\n \"removeHelper(bytes32)\": { \"notice\": \"Removes a helper for a specific version\" },\n \"removeSubVerifier(bytes32)\": {\n \"notice\": \"Removes a subverifier for a specific version\"\n },\n \"setGuardian(address)\": { \"notice\": \"Sets the guardian role to a new address\" },\n \"transferAdmin(address)\": { \"notice\": \"Transfers the admin role to a new address\" },\n \"unpause()\": { \"notice\": \"Unpause the root verifier\" },\n \"updateConfig(bytes32,bytes32)\": { \"notice\": \"Update a config value\" },\n \"updateHelper(bytes32,address)\": { \"notice\": \"Updates a helper for a specific version\" },\n \"updateSubVerifier(bytes32,address)\": {\n \"notice\": \"Updates a subverifier for a specific version\"\n },\n \"verify((bytes32,(bytes32,bytes,bytes32[]),bytes,(uint256,string,string,bool)))\": {\n \"notice\": \"Verifies a ZKPassport zero-knowledge proof\"\n }\n },\n \"version\": 1\n }\n },\n \"settings\": {\n \"remappings\": [\"forge-std/=lib/forge-std/src/\"],\n \"optimizer\": { \"enabled\": true, \"runs\": 200 },\n \"metadata\": { \"bytecodeHash\": \"none\" },\n \"compilationTarget\": { \"src/ZKPassportRootVerifier.sol\": \"ZKPassportRootVerifier\" },\n \"evmVersion\": \"prague\",\n \"libraries\": {}\n },\n \"sources\": {\n \"src/Constants.sol\": {\n \"keccak256\": \"0x70cb81262ae099d738f4b172d880f51bd76a0a629d602c19fa29e35297c0a324\",\n \"urls\": [\n \"bzz-raw://e56b1934ba3562be3bdfbe2a1fb2e8fd0a452255921a3899fefcc2568354f09b\",\n \"dweb:/ipfs/QmNcFc9ACdwcdRNJwhkUXgawB2p7BS4jUDAXyHyApYNZG1\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/DateUtils.sol\": {\n \"keccak256\": \"0x4176feda967f91ccf0a1cdecc75bbf7e5aaad7b46f95e133887e3ac6ae9126f6\",\n \"urls\": [\n \"bzz-raw://6774599f7320a37f2e5cc22e0d8e59a1f46841a6ac94d7d45b072a809237e1ab\",\n \"dweb:/ipfs/QmdrX9uQKsvN9gTgCD1zd1kigvJGsgHbvabvdWaWHuSeY4\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/IProofVerifier.sol\": {\n \"keccak256\": \"0xf8acc6ee390c406eaa8415863f156e251935f8de51bcd3c876871fbe5b5b4f14\",\n \"urls\": [\n \"bzz-raw://64016d156d15fd43d407e832fd7b333e07e80b42f0ed9d845a8cc114d3857aa6\",\n \"dweb:/ipfs/QmP7zSvchyDqov13cyuWxLJDYBBpYZxrPEdGQcheyoJkUm\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/IRootRegistry.sol\": {\n \"keccak256\": \"0xc994fab81ea1202a93620e7e7a01ba1e61f055498ed5b09503f4b384d0554b2a\",\n \"urls\": [\n \"bzz-raw://12a19bab224c63ee4a0e3b4048c24e80b3ef5a3459070816c20f2c32b2ad5f72\",\n \"dweb:/ipfs/QmW1DF8mAwBfacrG2r2R3uyY92i6q1h1hZvHPuwMdXTANg\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/InputsExtractor.sol\": {\n \"keccak256\": \"0xd8d08cc68a571c9efdddd90ea274c18694284d40a9f1d0a1112a4999fd6a58da\",\n \"urls\": [\n \"bzz-raw://000752a284d1df5c0687d32554c83e99afedab49e23d7213679ed93424760450\",\n \"dweb:/ipfs/QmWrFS4ChUv4okqnEgSLiuSsxohDnTnYLWeyYviVbPTgcH\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/StringUtils.sol\": {\n \"keccak256\": \"0xd52eb407eef932c9a343f1225fc997b7194ff0f05c488661a7adb4a37f980306\",\n \"urls\": [\n \"bzz-raw://60bfaf52ebd50633d6eff5ea346d25283962495c630b37f4c0cd6008e8d8fd11\",\n \"dweb:/ipfs/QmWVtJnjcaowsFUBRRQ7eNTntghZ4FekXXgeQNAV4PkDWe\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/Types.sol\": {\n \"keccak256\": \"0x66d73b090401a5f424e1feacf1b503dcd906163f4c749189db3dc108d6dfd668\",\n \"urls\": [\n \"bzz-raw://d90eff17b597915e95c01a171c4378e7e4e287d35ca25dbd3f684373e93cda0c\",\n \"dweb:/ipfs/QmYe1wixU4zZAogteHT5eubcB4qzScCYzLtYFpFBitpZeR\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/ZKPassportHelper.sol\": {\n \"keccak256\": \"0x902d97e8609effd60e632eddd425c0ab8c089466bd932ff631b8a79b84064755\",\n \"urls\": [\n \"bzz-raw://8ade7be5536d07a3abb6a6468ff5966f021311df1d006dde60cefb0bc6e2f4bf\",\n \"dweb:/ipfs/QmNaRCxFRfHShkHgzDSxc1YS5RDr5nc1LXDUhMdxBjGc2E\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/ZKPassportRootVerifier.sol\": {\n \"keccak256\": \"0x5fb7a856f66496a36e4de2ff2dca8fcce5a2c3db3adbf20910b1b20f24e6a009\",\n \"urls\": [\n \"bzz-raw://c2693f7a086c3ff60441a12a5d72c6a2fbd811123c03d73b0887474cbefe6355\",\n \"dweb:/ipfs/QmbTgqop8Fb9nxcUveDSDgyMXzVBY1xw2u8eMxaFfVVp1s\"\n ],\n \"license\": \"Apache-2.0\"\n },\n \"src/ZKPassportSubVerifier.sol\": {\n \"keccak256\": \"0xa78975774cb39e6ee44ee5806435a5abb7a7143c893fc2b8f9a0dfec56c149f9\",\n \"urls\": [\n \"bzz-raw://58d6ec604e06d90fa3c7fd20e59504a44ae6a81e2a97dcdffe66e0754bf4aa94\",\n \"dweb:/ipfs/QmbeyfyvkktggXCzfTu896Zg15UPJaoVr1WrqxKQn31RdF\"\n ],\n \"license\": \"Apache-2.0\"\n }\n },\n \"version\": 1\n },\n \"id\": 30\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n AgeCommittedInputs,\n BindCommittedInputs,\n CountryCommittedInputs,\n DateCommittedInputs,\n DiscloseCommittedInputs,\n DisclosureCircuitName,\n FacematchCommittedInputs,\n formatBoundData,\n getCommittedInputCount,\n getNumberOfPublicInputs,\n getOprfPkHashFromOuterProof,\n getParamCommitmentsFromOuterProof,\n getProofData,\n numberToBytesBE,\n ProofResult,\n ProofType,\n ProofTypeLength,\n rightPadArrayWithZeros,\n SanctionsCommittedInputs,\n} from \"@zkpassport/utils\"\nimport { SolidityVerifierParameters } from \"./types\"\nimport { DEFAULT_VALIDITY } from \"./constants\"\nimport { sha256 } from \"@noble/hashes/sha2.js\"\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils.js\"\nimport ZKPassportVerifierAbi from \"./assets/abi/ZKPassportVerifier.json\"\n\nexport class SolidityVerifier {\n /**\n * Get the details for the Solidity verifier contract for a given network.\n * Rather than using the chain id directly, we restrict to the actual networks\n * supported by ZKPassport.\n * @param network The network to get the details for\n * @returns The address, function name, and ABI for the verifier contract\n */\n public static getDetails(): {\n address: `0x${string}`\n functionName: string\n abi: {\n type: \"function\" | \"event\" | \"constructor\"\n name: string\n inputs: { name: string; type: string; internalType: string }[]\n outputs: { name: string; type: string; internalType: string }[]\n }[]\n } {\n const baseConfig = {\n functionName: \"verify\",\n abi: ZKPassportVerifierAbi.abi as any,\n }\n return {\n ...baseConfig,\n // The Root Verifier has a deterministic address on all networks\n address: \"0x1D000001000EFD9a6371f4d90bB8920D5431c0D8\",\n }\n }\n\n /**\n * Format the proof for the Solidity verifier contract.\n * @param proof The proof to format\n * @param validityPeriodInSeconds The validity period in seconds\n * @param domain The domain to use for the service config\n * @param scope The scope to use for the service config\n * @param devMode Whether to use the dev mode\n * Note that on mainnets, the dev mode will be ignored as verification\n * will always fail for mock passports. It only applies to testnets.\n * @returns The parameters for the Solidity verifier contract\n */\n public static getParameters({\n proof,\n validityPeriodInSeconds = DEFAULT_VALIDITY,\n domain,\n scope,\n devMode = false,\n }: {\n proof: ProofResult\n validityPeriodInSeconds?: number\n domain: string\n scope?: string\n devMode?: boolean\n }) {\n if (!proof.name?.startsWith(\"outer_evm\")) {\n throw new Error(\n \"This proof cannot be verified on an EVM chain. Please make sure to use the `compressed-evm` mode.\",\n )\n }\n const proofData = getProofData(proof.proof as string, getNumberOfPublicInputs(proof.name!))\n const committedInputCounts: { circuitName: DisclosureCircuitName; count: number }[] = []\n const committedInputs: { circuitName: DisclosureCircuitName; inputs: string }[] = []\n for (const key in proof.committedInputs) {\n const committedInputCount = getCommittedInputCount(key as DisclosureCircuitName)\n const circuitName = key as DisclosureCircuitName\n committedInputCounts.push({ circuitName, count: committedInputCount })\n let compressedCommittedInputs = \"\"\n if (\n circuitName === \"inclusion_check_issuing_country_evm\" ||\n circuitName === \"inclusion_check_nationality_evm\" ||\n circuitName === \"exclusion_check_issuing_country_evm\" ||\n circuitName === \"exclusion_check_nationality_evm\"\n ) {\n const value = proof.committedInputs[circuitName] as CountryCommittedInputs\n const formattedCountries = value.countries\n if (\n circuitName === \"exclusion_check_issuing_country_evm\" ||\n circuitName === \"exclusion_check_nationality_evm\"\n ) {\n formattedCountries.sort((a, b) => a.localeCompare(b))\n }\n const proofType = (() => {\n switch (circuitName) {\n case \"exclusion_check_issuing_country_evm\":\n return ProofType.ISSUING_COUNTRY_EXCLUSION\n case \"exclusion_check_nationality_evm\":\n return ProofType.NATIONALITY_EXCLUSION\n case \"inclusion_check_issuing_country_evm\":\n return ProofType.ISSUING_COUNTRY_INCLUSION\n case \"inclusion_check_nationality_evm\":\n return ProofType.NATIONALITY_INCLUSION\n }\n })()\n compressedCommittedInputs =\n proofType.toString(16).padStart(2, \"0\") +\n ProofTypeLength[proofType].evm.toString(16).padStart(4, \"0\") +\n rightPadArrayWithZeros(\n formattedCountries.map((c) => Array.from(new TextEncoder().encode(c))).flat(),\n 600,\n )\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n } else if (circuitName === \"compare_age_evm\") {\n const value = proof.committedInputs[circuitName] as AgeCommittedInputs\n compressedCommittedInputs =\n ProofType.AGE.toString(16).padStart(2, \"0\") +\n ProofTypeLength[ProofType.AGE].evm.toString(16).padStart(4, \"0\") +\n value.minAge.toString(16).padStart(2, \"0\") +\n value.maxAge.toString(16).padStart(2, \"0\")\n } else if (circuitName === \"compare_birthdate_evm\") {\n const value = proof.committedInputs[circuitName] as DateCommittedInputs\n const minDateBytes = Array.from(numberToBytesBE(value.minDateTimestamp, 8))\n const maxDateBytes = Array.from(numberToBytesBE(value.maxDateTimestamp, 8))\n compressedCommittedInputs =\n ProofType.BIRTHDATE.toString(16).padStart(2, \"0\") +\n ProofTypeLength[ProofType.BIRTHDATE].evm.toString(16).padStart(4, \"0\") +\n minDateBytes.map((x) => x.toString(16).padStart(2, \"0\")).join(\"\") +\n maxDateBytes.map((x) => x.toString(16).padStart(2, \"0\")).join(\"\")\n } else if (circuitName === \"compare_expiry_evm\") {\n const value = proof.committedInputs[circuitName] as DateCommittedInputs\n const minDateBytes = Array.from(numberToBytesBE(value.minDateTimestamp, 8))\n const maxDateBytes = Array.from(numberToBytesBE(value.maxDateTimestamp, 8))\n compressedCommittedInputs =\n ProofType.EXPIRY_DATE.toString(16).padStart(2, \"0\") +\n ProofTypeLength[ProofType.EXPIRY_DATE].evm.toString(16).padStart(4, \"0\") +\n minDateBytes.map((x) => x.toString(16).padStart(2, \"0\")).join(\"\") +\n maxDateBytes.map((x) => x.toString(16).padStart(2, \"0\")).join(\"\")\n } else if (circuitName === \"disclose_bytes_evm\") {\n const value = proof.committedInputs[circuitName] as DiscloseCommittedInputs\n compressedCommittedInputs =\n ProofType.DISCLOSE.toString(16).padStart(2, \"0\") +\n ProofTypeLength[ProofType.DISCLOSE].evm.toString(16).padStart(4, \"0\") +\n value.discloseMask.map((x) => x.toString(16).padStart(2, \"0\")).join(\"\") +\n value.disclosedBytes.map((x) => x.toString(16).padStart(2, \"0\")).join(\"\")\n } else if (circuitName === \"bind_evm\") {\n const value = proof.committedInputs[circuitName] as BindCommittedInputs\n compressedCommittedInputs =\n ProofType.BIND.toString(16).padStart(2, \"0\") +\n ProofTypeLength[ProofType.BIND].evm.toString(16).padStart(4, \"0\") +\n rightPadArrayWithZeros(formatBoundData(value.data), 509)\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n } else if (circuitName === \"exclusion_check_sanctions_evm\") {\n const value = proof.committedInputs[circuitName] as SanctionsCommittedInputs\n compressedCommittedInputs += ProofType.SANCTIONS_EXCLUSION.toString(16).padStart(2, \"0\")\n compressedCommittedInputs += ProofTypeLength[ProofType.SANCTIONS_EXCLUSION].evm\n .toString(16)\n .padStart(4, \"0\")\n compressedCommittedInputs += Array.from(numberToBytesBE(BigInt(value.rootHash), 32))\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n compressedCommittedInputs += value.isStrict ? \"01\" : \"00\"\n } else if (circuitName.startsWith(\"facematch\") && circuitName.endsWith(\"_evm\")) {\n const value = proof.committedInputs[circuitName] as FacematchCommittedInputs\n compressedCommittedInputs += ProofType.FACEMATCH.toString(16).padStart(2, \"0\")\n compressedCommittedInputs += ProofTypeLength[ProofType.FACEMATCH].evm\n .toString(16)\n .padStart(4, \"0\")\n compressedCommittedInputs += Array.from(numberToBytesBE(BigInt(value.rootKeyLeaf), 32))\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n compressedCommittedInputs += value.environment === \"development\" ? \"00\" : \"01\"\n compressedCommittedInputs += Array.from(numberToBytesBE(BigInt(value.appIdHash), 32))\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n compressedCommittedInputs += Array.from(\n numberToBytesBE(BigInt(value.integrityPubkeyHash), 32),\n )\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n compressedCommittedInputs += value.mode === \"regular\" ? \"01\" : \"02\"\n } else {\n throw new Error(`Unsupported circuit for EVM verification: ${circuitName}`)\n }\n committedInputs.push({ circuitName, inputs: compressedCommittedInputs })\n }\n const parameterCommitments = getParamCommitmentsFromOuterProof(proofData).map((x) =>\n x.toString(16).padStart(64, \"0\"),\n )\n let compressedCommittedInputs = \"\"\n const committedInputCountsArray = []\n for (const commitment of parameterCommitments) {\n const committedInput = committedInputs.find((x) => {\n const rawHashedInputs = sha256(hexToBytes(x.inputs))\n // Shift the hash 8 bits to the right (1 byte)\n // as one byte is dropped in the circuit to fit in the 254-bit field size\n const hashedInputs = new Uint8Array(rawHashedInputs.length)\n // Move each byte 1 position to the right (shifting 8 bits)\n for (let i = 0; i < rawHashedInputs.length - 1; i++) {\n hashedInputs[i + 1] = rawHashedInputs[i]\n }\n // First byte becomes 0 (since we're shifting right)\n hashedInputs[0] = 0\n\n return bytesToHex(hashedInputs) === commitment.replace(\"0x\", \"\")\n })\n if (committedInput) {\n const count = committedInputCounts.find(\n (x) => x.circuitName === committedInput.circuitName,\n )?.count\n if (count) {\n committedInputCountsArray.push(count)\n compressedCommittedInputs += committedInput.inputs\n } else {\n throw new Error(`Unknown circuit name: ${committedInput.circuitName}`)\n }\n } else {\n throw new Error(`Invalid commitment: ${commitment}`)\n }\n }\n const versionParts = proof.version?.split(\".\").map((x) => Number(x))\n if (!versionParts || versionParts.length !== 3) {\n throw new Error(\"Invalid version format\")\n }\n const versionBytes = new Uint8Array([\n ...numberToBytesBE(versionParts[0], 2),\n ...numberToBytesBE(versionParts[1], 2),\n ...numberToBytesBE(versionParts[2], 2),\n ])\n const versionBytes32 = `0x${bytesToHex(versionBytes).padEnd(64, \"0\")}`\n const oprfPkHash = getOprfPkHashFromOuterProof(proofData)\n const params: SolidityVerifierParameters = {\n version: versionBytes32,\n proofVerificationData: {\n // Make sure the vkeyHash is 32 bytes\n vkeyHash: `0x${proof.vkeyHash!.replace(\"0x\", \"\").padStart(64, \"0\")}`,\n proof: `0x${proofData.proof.join(\"\")}`,\n publicInputs: proofData.publicInputs,\n },\n committedInputs: `0x${compressedCommittedInputs}`,\n serviceConfig: {\n validityPeriodInSeconds,\n domain,\n scope: scope ?? \"\",\n devMode,\n },\n oprfPkHash: `0x${oprfPkHash.toString(16).padStart(64, \"0\")}`,\n }\n return params\n }\n}\n","import { Alpha3Code, getAlpha3Code, registerLocale } from \"i18n-iso-countries\"\nimport {\n type DisclosableIDCredential,\n type IDCredential,\n type IDCredentialValue,\n type NumericalIDCredential,\n type ProofResult,\n type QueryResult,\n type CountryName,\n type JsonRpcRequest,\n type Query,\n type FacematchMode,\n type SanctionsCountries,\n type SanctionsLists,\n type SupportedChain,\n type ProofMode,\n type BoundData,\n type Service,\n NullifierType,\n getProofData,\n getNumberOfPublicInputs,\n formatQueryResultDates,\n OPRF_DEFAULT_KEY_ID,\n} from \"@zkpassport/utils\"\nimport { noLogger as logger } from \"./logger\"\nimport i18en from \"i18n-iso-countries/langs/en.json\"\nimport { Buffer } from \"buffer/\"\nimport { RegistryClient } from \"@zkpassport/registry\"\n// import { MockRegistryClient as RegistryClient } from \"@zkpassport/registry/mock\"\nimport { Bridge, BridgeInterface } from \"@obsidion/bridge\"\nimport {\n QueryBuilder,\n QueryBuilderResult,\n OfflineQueryBuilderResult,\n QueryResultErrors,\n} from \"./types\"\nimport { PublicInputChecker } from \"./public-input-checker\"\nimport { SolidityVerifier } from \"./solidity-verifier\"\nimport { DEFAULT_VALIDITY, VERSION } from \"./constants\"\n\n// If Buffer is not defined, then we use the Buffer from the buffer package\nif (typeof globalThis.Buffer === \"undefined\") {\n globalThis.Buffer = Buffer as any // eslint-disable-line\n if (typeof window !== \"undefined\") {\n window.Buffer = Buffer as any // eslint-disable-line\n }\n}\n\nregisterLocale(i18en)\n\nfunction normalizeCountry(country: CountryName | Alpha3Code) {\n if (country === \"Zero Knowledge Republic\") {\n return \"ZKR\"\n }\n let normalizedCountry: Alpha3Code | \"ZKR\" | undefined = undefined\n const alpha3 = getAlpha3Code(country as CountryName, \"en\") as Alpha3Code | \"ZKR\" | undefined\n normalizedCountry = alpha3 || (country as Alpha3Code) || \"ZKR\"\n return normalizedCountry as Alpha3Code | \"ZKR\"\n}\n\nfunction numericalCompare(\n fnName: \"gte\" | \"gt\" | \"lte\" | \"lt\",\n key: NumericalIDCredential,\n value: number | Date,\n requestId: string,\n requestIdToConfig: Record<string, Query>,\n) {\n requestIdToConfig[requestId][key] = {\n ...requestIdToConfig[requestId][key],\n [fnName]: value,\n }\n}\n\nfunction rangeCompare(\n key: NumericalIDCredential,\n value: [number | Date, number | Date],\n requestId: string,\n requestIdToConfig: Record<string, Query>,\n) {\n requestIdToConfig[requestId][key] = {\n ...requestIdToConfig[requestId][key],\n range: value,\n }\n}\n\nfunction generalCompare(\n fnName: \"in\" | \"out\" | \"eq\",\n key: IDCredential,\n value: any, // eslint-disable-line\n requestId: string,\n requestIdToConfig: Record<string, Query>,\n) {\n requestIdToConfig[requestId][key] = {\n ...requestIdToConfig[requestId][key],\n [fnName]: value,\n }\n}\n\nexport {\n SANCTIONED_COUNTRIES,\n EU_COUNTRIES,\n EEA_COUNTRIES,\n SCHENGEN_COUNTRIES,\n ASEAN_COUNTRIES,\n MERCOSUR_COUNTRIES,\n ProofType,\n ProofTypeLength,\n NullifierType,\n type ProofResult,\n type DisclosableIDCredential,\n type IDCredential,\n type IDCredentialValue,\n type NumericalIDCredential,\n type QueryResult,\n type CountryName,\n type JsonRpcRequest,\n type Query,\n type FacematchMode,\n type SanctionsCountries,\n type SanctionsLists,\n type SupportedChain,\n type ProofMode,\n type BoundData,\n type Service,\n} from \"@zkpassport/utils\"\n\nexport * from \"./types\"\n\nexport class ZKPassport {\n private domain: string\n private topicToConfig: Record<string, Query> = {}\n private topicToLocalConfig: Record<\n string,\n {\n validity: number\n mode: ProofMode\n devMode: boolean\n uniqueIdentifierType: NullifierType | undefined\n oprfKeyId: string | null\n }\n > = {}\n private topicToPublicKey: Record<string, string> = {}\n private topicToBridge: Record<string, BridgeInterface> = {}\n private topicToRequestReceived: Record<string, boolean> = {}\n private topicToService: Record<string, Service> = {}\n private topicToProofs: Record<string, Array<ProofResult>> = {}\n private topicToFailedProofCount: Record<string, number> = {}\n private topicToResults: Record<string, QueryResult> = {}\n\n private onRequestReceivedCallbacks: Record<string, Array<() => void>> = {}\n private onGeneratingProofCallbacks: Record<string, Array<(topic: string) => void>> = {}\n private onBridgeConnectCallbacks: Record<string, Array<() => void>> = {}\n private onProofGeneratedCallbacks: Record<string, Array<(proof: ProofResult) => void>> = {}\n private onResultCallbacks: Record<\n string,\n Array<\n (response: {\n uniqueIdentifier: string | undefined\n uniqueIdentifierType: NullifierType | undefined\n verified: boolean\n result: QueryResult\n queryResultErrors?: Partial<QueryResultErrors>\n }) => void\n >\n > = {}\n private onRejectCallbacks: Record<string, Array<() => void>> = {}\n private onErrorCallbacks: Record<string, Array<(topic: string) => void>> = {}\n //private wasmVerifierInit: boolean = false\n\n private normalizeDomain(domain: string) {\n return (\n domain\n .trim()\n // Remove protocol\n .replace(/^https?:\\/\\//, \"\")\n // Remove trailing slash and anything after it\n .replace(/\\/[^/]*$/, \"\")\n // Remove port\n .replace(/:[0-9]+/, \"\")\n // Remove query parameters\n .replace(/\\?.*$/, \"\")\n // Remove hash\n .replace(/#.*$/, \"\")\n .toLowerCase()\n )\n }\n\n constructor(_domain?: string) {\n if (!_domain && typeof window === \"undefined\") {\n throw new Error(\"Domain argument is required in Node.js environment\")\n }\n this.domain = this.normalizeDomain(_domain || window.location.hostname)\n }\n\n private async handleResult(topic: string) {\n const result = this.topicToResults[topic]\n // Clear the results straight away to avoid concurrency issues\n delete this.topicToResults[topic]\n // Verify the proofs and extract the unique identifier (aka nullifier) and the verification result\n const { uniqueIdentifier, uniqueIdentifierType, verified, queryResultErrors } =\n await this.verify({\n proofs: this.topicToProofs[topic],\n originalQuery: this.topicToConfig[topic],\n queryResult: result,\n validity: this.topicToLocalConfig[topic]?.validity,\n scope: this.topicToService[topic]?.scope,\n devMode: this.topicToLocalConfig[topic]?.devMode,\n oprfKeyId: this.topicToLocalConfig[topic]?.oprfKeyId ?? undefined,\n })\n delete this.topicToProofs[topic]\n const hasFailedProofs = this.topicToFailedProofCount[topic] > 0\n await Promise.all(\n this.onResultCallbacks[topic].map((callback) =>\n callback({\n // If there are failed proofs, we don't return the unique identifier\n // and we set the verified result to false\n uniqueIdentifier: hasFailedProofs ? undefined : uniqueIdentifier,\n uniqueIdentifierType: hasFailedProofs ? undefined : uniqueIdentifierType,\n verified: hasFailedProofs ? false : verified,\n result,\n queryResultErrors,\n }),\n ),\n )\n // Clear the expected proof count and failed proof count\n delete this.topicToFailedProofCount[topic]\n }\n\n /**\n * @notice Handle an encrypted message.\n * @param request The request.\n * @param outerRequest The outer request.\n */\n private async handleEncryptedMessage(topic: string, request: JsonRpcRequest) {\n logger.debug(\"Received encrypted message:\", request)\n if (request.method === \"accept\") {\n logger.debug(`User accepted the request and is generating a proof`)\n await Promise.all(this.onGeneratingProofCallbacks[topic].map((callback) => callback(topic)))\n } else if (request.method === \"reject\") {\n logger.debug(`User rejected the request`)\n await Promise.all(this.onRejectCallbacks[topic].map((callback) => callback()))\n } else if (request.method === \"proof\") {\n logger.debug(`User generated proof`)\n this.topicToProofs[topic].push(request.params)\n await Promise.all(\n this.onProofGeneratedCallbacks[topic].map((callback) => callback(request.params)),\n )\n // If the results were received before all the proofs were generated,\n // we can handle the result now\n if (\n this.topicToResults[topic] &&\n request.params.total ===\n this.topicToProofs[topic].length + this.topicToFailedProofCount[topic]\n ) {\n await this.handleResult(topic)\n }\n } else if (request.method === \"done\") {\n logger.debug(`User sent the query result`)\n this.topicToResults[topic] = formatQueryResultDates(request.params)\n // Make sure all the proofs have been received, otherwise we'll handle the result later\n // once the proofs have all been received\n if (\n this.topicToProofs[topic].length > 0 &&\n this.topicToProofs[topic].length + this.topicToFailedProofCount[topic] ===\n this.topicToProofs[topic][0].total\n ) {\n await this.handleResult(topic)\n }\n } else if (request.method === \"error\") {\n const error = request.params.error\n if (error && error === \"This ID is not supported yet\") {\n // This means the user has an ID that is not supported yet\n // So we won't receive any proofs and we can handle the result now\n if (this.topicToResults[topic]) {\n await this.handleResult(topic)\n }\n } else if (error && error.startsWith(\"Cannot generate proof\")) {\n // This means one of the disclosure proofs failed to be generated\n // So we need to keep track of the failed proof count\n this.topicToFailedProofCount[topic] += 1\n // If the expected proof count is now equal to the number of proofs received\n // and the results were received, we can handle the result now\n if (\n this.topicToResults[topic] &&\n this.topicToProofs[topic].length > 0 &&\n this.topicToProofs[topic].length + this.topicToFailedProofCount[topic] ===\n this.topicToProofs[topic][0].total\n ) {\n await this.handleResult(topic)\n }\n }\n await Promise.all(this.onErrorCallbacks[topic].map((callback) => callback(error)))\n }\n }\n\n private getZkPassportRequest<T extends \"online\" | \"offline\" = \"online\">(\n topic: string,\n ): QueryBuilder<T> {\n return {\n eq: <T extends IDCredential>(key: T, value: IDCredentialValue<T>) => {\n if (key === \"issuing_country\" || key === \"nationality\") {\n value = normalizeCountry(value as CountryName) as IDCredentialValue<T>\n }\n generalCompare(\"eq\", key, value, topic, this.topicToConfig)\n return this.getZkPassportRequest(topic)\n },\n gte: <T extends NumericalIDCredential>(key: T, value: IDCredentialValue<T>) => {\n numericalCompare(\"gte\", key, value, topic, this.topicToConfig)\n if (key === \"age\" && ((value as number) < 1 || (value as number) >= 100)) {\n throw new Error(\"Age must be between 1 and 99 (inclusive)\")\n }\n return this.getZkPassportRequest(topic)\n },\n gt: <T extends NumericalIDCredential>(key: T, value: IDCredentialValue<T>) => {\n numericalCompare(\"gt\", key, value, topic, this.topicToConfig)\n return this.getZkPassportRequest(topic)\n },\n lte: <T extends NumericalIDCredential>(key: T, value: IDCredentialValue<T>) => {\n numericalCompare(\"lte\", key, value, topic, this.topicToConfig)\n return this.getZkPassportRequest(topic)\n },\n lt: <T extends NumericalIDCredential>(key: T, value: IDCredentialValue<T>) => {\n numericalCompare(\"lt\", key, value, topic, this.topicToConfig)\n return this.getZkPassportRequest(topic)\n },\n range: <T extends NumericalIDCredential>(\n key: T,\n start: IDCredentialValue<T>,\n end: IDCredentialValue<T>,\n ) => {\n rangeCompare(key, [start, end], topic, this.topicToConfig)\n return this.getZkPassportRequest(topic)\n },\n in: <T extends \"nationality\" | \"issuing_country\">(key: T, value: IDCredentialValue<T>[]) => {\n value = value.map((v) => normalizeCountry(v as CountryName)) as IDCredentialValue<T>[]\n generalCompare(\"in\", key, value, topic, this.topicToConfig)\n return this.getZkPassportRequest(topic)\n },\n out: <T extends \"nationality\" | \"issuing_country\">(key: T, value: IDCredentialValue<T>[]) => {\n value = value.map((v) => normalizeCountry(v as CountryName)) as IDCredentialValue<T>[]\n generalCompare(\"out\", key, value, topic, this.topicToConfig)\n return this.getZkPassportRequest(topic)\n },\n disclose: (key: DisclosableIDCredential) => {\n this.topicToConfig[topic][key] = {\n ...this.topicToConfig[topic][key],\n disclose: true,\n }\n return this.getZkPassportRequest(topic)\n },\n bind: <T extends keyof BoundData>(\n key: T,\n value: T extends \"chain\"\n ? SupportedChain\n : T extends \"user_address\"\n ? `0x${string}`\n : string | undefined,\n ) => {\n this.topicToConfig[topic].bind = {\n ...this.topicToConfig[topic].bind,\n [key]: value,\n }\n return this.getZkPassportRequest(topic)\n },\n sanctions: (\n countries: SanctionsCountries = \"all\",\n lists: SanctionsLists = \"all\",\n options: { strict?: boolean } = { strict: false },\n ) => {\n this.topicToConfig[topic].sanctions = {\n ...this.topicToConfig[topic].sanctions,\n countries,\n // TODO: enable this once the circuits support custom lists\n /*countries === \"all\"\n ? \"all\"\n : Array.isArray(countries)\n ? ([\n ...(this.topicToConfig[topic].sanctions?.countries ?? []),\n ...countries,\n ] as SanctionsCountries)\n : ([\n ...(this.topicToConfig[topic].sanctions?.countries ?? []),\n countries,\n ] as SanctionsCountries),*/\n lists,\n // TODO: enable this once the circuits support custom lists\n /*lists === \"all\"\n ? \"all\"\n : Array.isArray(lists)\n ? [...(this.topicToConfig[topic].sanctions?.lists ?? []), ...lists]\n : [...(this.topicToConfig[topic].sanctions?.lists ?? []), lists],*/\n strict: options.strict ?? false,\n }\n return this.getZkPassportRequest(topic)\n },\n facematch: (mode: FacematchMode = \"regular\") => {\n this.topicToConfig[topic].facematch = {\n mode,\n }\n return this.getZkPassportRequest(topic)\n },\n done: (() => {\n this.topicToFailedProofCount[topic] = 0\n if (topic === \"offline-query\") {\n const query = this.topicToConfig[topic]\n delete this.topicToConfig[topic]\n return { query }\n }\n\n const localConfig = this.topicToLocalConfig[topic]\n const query = this.topicToConfig[topic]\n const hasStrictFacematch = !!query.facematch && query.facematch?.mode === \"strict\"\n\n // If nullifier type wasn't explicitly set, default to SALTED only for strict facematch\n // if (localConfig.uniqueIdentifierType === undefined) {\n // if (hasStrictFacematch) {\n // localConfig.uniqueIdentifierType = NullifierType.SALTED\n // if (!localConfig.oprfKeyId) {\n // localConfig.oprfKeyId = OPRF_DEFAULT_KEY_ID\n // }\n // }\n // }\n\n // Validate: SALTED requires strict facematch\n if (localConfig.uniqueIdentifierType === NullifierType.SALTED && !hasStrictFacematch) {\n throw new Error(\n \"Salted nullifier requires strict facematch. Add .facematch('strict') to your query or remove the salted nullifier option.\",\n )\n }\n\n return {\n url: this._getUrl(topic),\n query: this.topicToConfig[topic],\n requestId: topic,\n onRequestReceived: (callback: () => void) =>\n this.onRequestReceivedCallbacks[topic].push(callback),\n onGeneratingProof: (callback: () => void) =>\n this.onGeneratingProofCallbacks[topic].push(callback),\n onBridgeConnect: (callback: () => void) =>\n this.onBridgeConnectCallbacks[topic].push(callback),\n onProofGenerated: (callback: (proof: ProofResult) => void) =>\n this.onProofGeneratedCallbacks[topic].push(callback),\n onResult: (\n callback: (response: {\n uniqueIdentifier: string | undefined\n uniqueIdentifierType: NullifierType | undefined\n verified: boolean\n result: QueryResult\n queryResultErrors?: Partial<QueryResultErrors>\n }) => void,\n ) => this.onResultCallbacks[topic].push(callback),\n onReject: (callback: () => void) => this.onRejectCallbacks[topic].push(callback),\n onError: (callback: (error: string) => void) =>\n this.onErrorCallbacks[topic].push(callback),\n isBridgeConnected: () => this.topicToBridge[topic].isBridgeConnected(),\n requestReceived: () => this.topicToRequestReceived[topic] === true,\n }\n }) as () => T extends \"online\" ? QueryBuilderResult : OfflineQueryBuilderResult,\n }\n }\n\n /**\n * @notice Create a new request\n * @param name Your service name\n * @param logo The logo of your service\n * @param purpose To explain what you want to do with the user's data\n * @param scope Scope this request to a specific use case\n * @param projectID The project ID of your service\n * @param validity How many seconds ago the proof checking the expiry date of the ID should have been generated\n * @param devMode Whether to enable dev mode. This will allow you to verify mock proofs (i.e. from ZKR)\n * @returns The query builder object.\n */\n public async request({\n name,\n logo,\n purpose,\n scope,\n projectID,\n mode,\n validity,\n devMode,\n uniqueIdentifierType,\n oprfKeyId,\n topicOverride,\n keyPairOverride,\n cloudProverUrl,\n bridgeUrl,\n }: {\n name: string\n logo: string\n purpose: string\n scope?: string\n mode?: ProofMode\n projectID?: string\n validity?: number\n devMode?: boolean\n uniqueIdentifierType?: NullifierType.NON_SALTED | NullifierType.SALTED\n oprfKeyId?: string\n topicOverride?: string\n keyPairOverride?: { privateKey: Uint8Array; publicKey: Uint8Array }\n cloudProverUrl?: string\n bridgeUrl?: string\n }): Promise<QueryBuilder> {\n if (topicOverride === \"offline-query\") {\n throw new Error(\"You cannot override the topic with 'offline-query'\")\n }\n\n const bridge = await Bridge.create({\n keyPair: keyPairOverride,\n bridgeId: topicOverride,\n bridgeUrl,\n })\n\n const topic = bridge.connection.getBridgeId()\n\n this.topicToConfig[topic] = {}\n this.topicToService[topic] = {\n name,\n logo,\n purpose,\n scope,\n projectID,\n cloudProverUrl,\n bridgeUrl,\n }\n this.topicToProofs[topic] = []\n this.topicToLocalConfig[topic] = {\n // Default to 7 days\n validity: validity || DEFAULT_VALIDITY,\n mode: mode || \"fast\",\n devMode: devMode || false,\n uniqueIdentifierType: oprfKeyId ? NullifierType.SALTED : uniqueIdentifierType,\n oprfKeyId: oprfKeyId ?? null,\n }\n\n this.onRequestReceivedCallbacks[topic] = []\n this.onGeneratingProofCallbacks[topic] = []\n this.onBridgeConnectCallbacks[topic] = []\n this.onProofGeneratedCallbacks[topic] = []\n this.onResultCallbacks[topic] = []\n this.onRejectCallbacks[topic] = []\n this.onErrorCallbacks[topic] = []\n\n this.topicToPublicKey[topic] = bridge.getPublicKey()\n\n this.topicToBridge[topic] = bridge\n bridge.onConnect(async (reconnection: boolean) => {\n logger.debug(\"Bridge connected\")\n logger.debug(\"Is reconnection:\", reconnection)\n await Promise.all(this.onBridgeConnectCallbacks[topic].map((callback) => callback()))\n })\n bridge.onSecureChannelEstablished(async () => {\n logger.debug(\"Secure channel established\")\n await Promise.all(this.onRequestReceivedCallbacks[topic].map((callback) => callback()))\n })\n // eslint-disable-next-line\n bridge.onSecureMessage(async (message: any) => {\n logger.debug(\"Received message:\", message)\n this.handleEncryptedMessage(topic, message)\n })\n return this.getZkPassportRequest(topic)\n }\n\n /**\n * @notice Create a new offline query\n * Unlike request(), this function does not connect to the bridge.\n * It returns only the query object and no callbacks and no URL.\n * This can be useful to recreate the same query server-side when calling `verify()`\n * to ensure the original query wasn't tampered with.\n * @returns The query builder object.\n */\n public createQuery(): QueryBuilder<\"offline\"> {\n this.topicToConfig[\"offline-query\"] = {}\n return this.getZkPassportRequest(\"offline-query\")\n }\n\n /**\n * @notice Verify the proofs received from the mobile app.\n * @param proofs The proofs to verify.\n * @param originalQuery The original query that was sent to the mobile app.\n * @param queryResult The query result to verify against\n * @param validity How many seconds ago the proof checking the expiry date of the ID should have been generated\n * @param scope Scope this request to a specific use case\n * @param devMode Whether to enable dev mode. This will allow you to verify mock proofs (i.e. from ZKR)\n * @param writingDirectory The directory (e.g. `./tmp`) where the necessary temporary artifacts for verification are written to.\n * It should only be needed when running the `verify` function on a server with restricted write access (e.g. Vercel)\n * @returns An object containing the unique identifier associated to the user\n * and a boolean indicating whether the proofs were successfully verified.\n */\n public async verify({\n proofs,\n originalQuery,\n queryResult,\n validity,\n scope,\n devMode = false,\n writingDirectory,\n oprfKeyId,\n }: {\n proofs: Array<ProofResult>\n originalQuery: Query\n queryResult: QueryResult\n validity?: number\n scope?: string\n devMode?: boolean\n writingDirectory?: string\n oprfKeyId?: string\n }): Promise<{\n uniqueIdentifier: string | undefined\n uniqueIdentifierType: NullifierType | undefined\n verified: boolean\n queryResultErrors?: Partial<QueryResultErrors>\n }> {\n // If no proofs were generated, the results can't be trusted.\n // We still return it but verified will be false\n if (!proofs || proofs.length === 0) {\n return {\n uniqueIdentifier: undefined,\n uniqueIdentifierType: undefined,\n verified: false,\n }\n }\n const formattedResult: QueryResult = formatQueryResultDates(queryResult)\n\n const { UltraHonkVerifierBackend, Barretenberg } = await import(\"@aztec/bb.js\")\n // Automatically set the writing directory to `/tmp` if it is not provided\n // and the code is not running in the browser\n if (typeof window === \"undefined\" && !writingDirectory) {\n writingDirectory = \"/tmp\"\n }\n const barretenberg = await Barretenberg.new({\n crsPath: writingDirectory ? writingDirectory + \"/.bb-crs\" : undefined,\n })\n const verifier = new UltraHonkVerifierBackend(barretenberg)\n let verified = true\n let uniqueIdentifier: string | undefined\n let uniqueIdentifierType: NullifierType | undefined\n let queryResultErrors: Partial<QueryResultErrors> | undefined = undefined\n const {\n isCorrect,\n uniqueIdentifier: uniqueIdentifierFromPublicInputs,\n uniqueIdentifierType: uniqueIdentifierTypeFromPublicInputs,\n queryResultErrors: queryResultErrorsFromPublicInputs,\n } = await PublicInputChecker.checkPublicInputs(\n this.domain,\n proofs,\n originalQuery,\n formattedResult,\n validity,\n scope,\n oprfKeyId,\n devMode,\n )\n uniqueIdentifier = uniqueIdentifierFromPublicInputs\n uniqueIdentifierType = uniqueIdentifierTypeFromPublicInputs\n verified = isCorrect\n queryResultErrors = isCorrect ? undefined : queryResultErrorsFromPublicInputs\n if (\n uniqueIdentifier &&\n uniqueIdentifierType &&\n (uniqueIdentifierType === NullifierType.SALTED_MOCK ||\n uniqueIdentifierType === NullifierType.NON_SALTED_MOCK) &&\n !devMode\n ) {\n // If the unique identifier type is a mock nullifier and it is not in dev mode,\n // the proofs are considered invalid as these are mock proofs only meant\n // for testing purposes\n verified = false\n console.warn(\n \"You are trying to verify a mock proof. This is only allowed in dev mode. To enable dev mode, set the `devMode` parameter to `true` in the request function parameters.\",\n )\n }\n // Only proceed with the proof verification if the public inputs are correct\n if (verified) {\n const registryClient = new RegistryClient({ chainId: devMode ? 11155111 : 1 })\n const circuitManifest = await registryClient.getCircuitManifest(undefined, {\n // We assume all proofs have the same version\n version: proofs[0].version,\n })\n for (const proof of proofs) {\n const isOuterEVM = proof.name?.startsWith(\"outer_evm_\")\n const proofName = proof.name!\n const proofData = getProofData(proof.proof as string, getNumberOfPublicInputs(proofName))\n const hostedPackagedCircuit = await registryClient.getPackagedCircuit(\n proofName,\n circuitManifest,\n // TODO: set to always validate when the issue is vkey hash calculation is fixed\n { validate: !isOuterEVM },\n )\n if (isOuterEVM) {\n try {\n const { createPublicClient, http } = await import(\"viem\")\n const { sepolia } = await import(\"viem/chains\")\n const { address, abi, functionName } = this.getSolidityVerifierDetails()\n const client = createPublicClient({\n chain: sepolia,\n transport: http(\"https://ethereum-sepolia-rpc.publicnode.com\"),\n })\n const params = this.getSolidityVerifierParameters({\n proof,\n domain: this.domain,\n scope,\n devMode,\n })\n const result = await client.readContract({\n address,\n abi,\n functionName,\n args: [params],\n })\n const isVerified = Array.isArray(result) ? Boolean(result[0]) : false\n verified = isVerified\n } catch (error) {\n console.warn(\"Error verifying proof\", error)\n verified = false\n }\n } else {\n const vkeyBytes = Buffer.from(hostedPackagedCircuit.vkey, \"base64\")\n try {\n verified = await verifier.verifyProof({\n proof: Buffer.from(proofData.proof.join(\"\"), \"hex\"),\n publicInputs: proofData.publicInputs,\n verificationKey: new Uint8Array(vkeyBytes),\n })\n } catch (e) {\n console.warn(`Error verifying proof ${proofName}`, e)\n verified = false\n }\n }\n if (!verified) {\n // Break the loop if the proof is not valid\n // and don't bother checking the other proofs\n break\n }\n }\n }\n\n // If the proofs are not verified, we don't return the unique identifier\n uniqueIdentifier = verified ? uniqueIdentifier : undefined\n uniqueIdentifierType = verified ? uniqueIdentifierType : undefined\n return { uniqueIdentifier, uniqueIdentifierType, verified, queryResultErrors }\n }\n\n public getSolidityVerifierDetails(): {\n address: `0x${string}`\n functionName: string\n abi: {\n type: \"function\" | \"event\" | \"constructor\"\n name: string\n inputs: { name: string; type: string; internalType: string }[]\n outputs: { name: string; type: string; internalType: string }[]\n }[]\n } {\n return SolidityVerifier.getDetails()\n }\n\n public getSolidityVerifierParameters({\n proof,\n validityPeriodInSeconds = DEFAULT_VALIDITY,\n domain,\n scope,\n devMode = false,\n }: {\n proof: ProofResult\n validityPeriodInSeconds?: number\n domain?: string\n scope?: string\n devMode?: boolean\n }) {\n return SolidityVerifier.getParameters({\n proof,\n validityPeriodInSeconds,\n domain: domain ?? this.domain,\n scope,\n devMode,\n })\n }\n\n private _getUrl(requestId: string) {\n const base64Config = Buffer.from(JSON.stringify(this.topicToConfig[requestId])).toString(\n \"base64\",\n )\n const base64Service = Buffer.from(JSON.stringify(this.topicToService[requestId])).toString(\n \"base64\",\n )\n const pubkey = this.topicToPublicKey[requestId]\n // The timestamp is the current time minus the validity period\n // essentially, the data integrity check proof needs to have been generated after the timestamp\n const timestamp = Math.floor(Date.now() / 1000) - this.topicToLocalConfig[requestId].validity\n const nullifierType = this.topicToLocalConfig[requestId].uniqueIdentifierType\n const oprfKeyId = this.topicToLocalConfig[requestId].oprfKeyId\n let url = `https://zkpassport.id/r?d=${this.domain}&t=${requestId}&c=${base64Config}&s=${base64Service}&p=${pubkey}&m=${this.topicToLocalConfig[requestId].mode}&v=${VERSION}&dt=${timestamp}&dev=${this.topicToLocalConfig[requestId].devMode ? \"1\" : \"0\"}`\n if (nullifierType) {\n url += `&nt=${nullifierType}`\n }\n if (oprfKeyId) {\n url += `&oprf_k=${oprfKeyId}`\n }\n return url\n }\n\n /**\n * @notice Returns the URL of the request.\n * @param requestId The request ID.\n * @returns The URL of the request.\n */\n public getUrl(requestId: string) {\n return this._getUrl(requestId)\n }\n\n /**\n * @notice Cancels a request by closing the WebSocket connection and deleting the associated data.\n * @param requestId The request ID.\n */\n public cancelRequest(requestId: string) {\n if (this.topicToBridge[requestId]) {\n this.topicToBridge[requestId].close()\n delete this.topicToBridge[requestId]\n }\n delete this.topicToPublicKey[requestId]\n delete this.topicToConfig[requestId]\n delete this.topicToLocalConfig[requestId]\n delete this.topicToProofs[requestId]\n delete this.topicToFailedProofCount[requestId]\n delete this.topicToResults[requestId]\n this.onRequestReceivedCallbacks[requestId] = []\n this.onGeneratingProofCallbacks[requestId] = []\n this.onBridgeConnectCallbacks[requestId] = []\n this.onProofGeneratedCallbacks[requestId] = []\n this.onRejectCallbacks[requestId] = []\n this.onErrorCallbacks[requestId] = []\n }\n\n /**\n * @notice Clears all requests.\n */\n public clearAllRequests() {\n for (const requestId in this.topicToBridge) {\n this.cancelRequest(requestId)\n }\n }\n}\n"]}