Skip to content

Commit f92db72

Browse files
authored
chore: update zkpassport version to 0.10.0 (#17824)
Please read [contributing guidelines](CONTRIBUTING.md) and remove this line. For audit-related pull requests, please use the [audit PR template](?expand=1&template=audit.md).
2 parents f1967a8 + ebeac95 commit f92db72

File tree

10 files changed

+108
-85
lines changed

10 files changed

+108
-85
lines changed

l1-contracts/lib/circuits

Submodule circuits updated 410 files

l1-contracts/script/StakingAssetHandler.s.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ contract StakingAssetHandlerScript is Test {
3030
bytes32 public constant DEPOSIT_MERKLE_ROOT = bytes32(0);
3131

3232
ZKPassportVerifier internal constant zkPassportVerifier =
33-
ZKPassportVerifier(0xf7480fd0A9289c062C52532f11D31e0b7A30ABe3);
33+
ZKPassportVerifier(0x3101Bad9eA5fACadA5554844a1a88F7Fe48D4DE0);
3434

3535
TestERC20 public constant stakingAsset = TestERC20(0x6732CEDafCBF85Afa9B5C83f0385967840BBCe47);
3636
IRegistry public constant registry = IRegistry(0xc2F24280F5c7F4897370dFDEb30f79Ded14f1c81);

l1-contracts/src/mock/StakingAssetHandler.sol

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import {IMintableERC20} from "@aztec/shared/interfaces/IMintableERC20.sol";
77
import {G1Point, G2Point} from "@aztec/shared/libraries/BN254Lib.sol";
88
import {Ownable} from "@oz/access/Ownable.sol";
99
import {MerkleProof} from "@oz/utils/cryptography/MerkleProof.sol";
10-
import {ZKPassportVerifier, ProofVerificationParams, BoundData} from "@zkpassport/ZKPassportVerifier.sol";
10+
import {
11+
ZKPassportVerifier, ProofVerificationParams, BoundData, OS, FaceMatchMode
12+
} from "@zkpassport/ZKPassportVerifier.sol";
1113

1214
/**
1315
* @title StakingAssetHandler
@@ -56,6 +58,7 @@ interface IStakingAssetHandler {
5658
error InvalidAge();
5759
error InvalidCountry();
5860
error InvalidValidityPeriod();
61+
error InvalidFaceMatch();
5962
error ExtraDiscloseDataNonZero();
6063
error SybilDetected(bytes32 _nullifier);
6164
error AttesterDoesNotExist(address _attester);
@@ -120,6 +123,12 @@ contract StakingAssetHandler is IStakingAssetHandler, Ownable {
120123
string internal constant IRN = "IRN";
121124
string internal constant CUB = "CUB";
122125

126+
// Minimum age
127+
uint8 public constant MIN_AGE = 18;
128+
129+
// Validity period in seconds
130+
uint256 public constant VALIDITY_PERIOD = 7 days;
131+
123132
IMintableERC20 public immutable STAKING_ASSET;
124133
IRegistry public immutable REGISTRY;
125134

@@ -143,9 +152,6 @@ contract StakingAssetHandler is IStakingAssetHandler, Ownable {
143152
// ZKPassport constraints
144153
string public validDomain;
145154
string public validScope;
146-
uint256 public validValidityPeriodInSeconds = 7 days;
147-
uint8 public minAge = 18;
148-
string[] internal excludedCountries;
149155

150156
constructor(StakingAssetHandlerArgs memory _args) Ownable(_args.owner) {
151157
require(_args.depositsPerMint > 0, CannotMintZeroAmount());
@@ -181,12 +187,6 @@ contract StakingAssetHandler is IStakingAssetHandler, Ownable {
181187
validDomain = _args.domain;
182188
validScope = _args.scope;
183189

184-
excludedCountries = new string[](4);
185-
excludedCountries[0] = CUB;
186-
excludedCountries[1] = IRN;
187-
excludedCountries[2] = PKR;
188-
excludedCountries[3] = UKR;
189-
190190
skipBindCheck = _args.skipBindCheck;
191191
skipMerkleCheck = _args.skipMerkleCheck;
192192
}
@@ -323,18 +323,19 @@ contract StakingAssetHandler is IStakingAssetHandler, Ownable {
323323
function _validatePassportProof(address _attester, ProofVerificationParams calldata _params) internal {
324324
// Must NOT be using dev mode - https://docs.zkpassport.id/getting-started/dev-mode
325325
// If active, nullifiers will end up being zero, but it is user provided input, so we are sanity checking it
326-
require(_params.devMode == false, InvalidProof());
326+
require(_params.serviceConfig.devMode == false, InvalidProof());
327327

328-
require(keccak256(bytes(_params.domain)) == keccak256(bytes(validDomain)), InvalidDomain());
329-
require(keccak256(bytes(_params.scope)) == keccak256(bytes(validScope)), InvalidScope());
328+
require(keccak256(bytes(_params.serviceConfig.domain)) == keccak256(bytes(validDomain)), InvalidDomain());
329+
require(keccak256(bytes(_params.serviceConfig.scope)) == keccak256(bytes(validScope)), InvalidScope());
330+
require(_params.serviceConfig.validityPeriodInSeconds == VALIDITY_PERIOD, InvalidValidityPeriod());
330331

331332
(bool verified, bytes32 nullifier) = zkPassportVerifier.verifyProof(_params);
332333

333334
require(verified, InvalidProof());
334335
require(!nullifiers[nullifier], SybilDetected(nullifier));
335336

336337
if (!skipBindCheck) {
337-
BoundData memory boundData = zkPassportVerifier.getBoundData(_params);
338+
BoundData memory boundData = zkPassportVerifier.getBoundData(_params.commitments);
338339

339340
// Make sure the bound user address is the same as the _attester
340341
require(boundData.senderAddress == _attester, InvalidBoundAddress(boundData.senderAddress, _attester));
@@ -343,19 +344,26 @@ contract StakingAssetHandler is IStakingAssetHandler, Ownable {
343344
// Make sure the custom data is empty
344345
require(bytes(boundData.customData).length == 0, ExtraDiscloseDataNonZero());
345346

346-
// Validity period check
347-
require(validValidityPeriodInSeconds == _params.validityPeriodInSeconds, InvalidValidityPeriod());
348-
349347
// Age check
350-
bool isAgeValid = zkPassportVerifier.isAgeAboveOrEqual(minAge, _params);
348+
bool isAgeValid = zkPassportVerifier.isAgeAboveOrEqual(MIN_AGE, _params.commitments, _params.serviceConfig);
351349
require(isAgeValid, InvalidAge());
352350

353351
// Country exclusion check
354-
bool isCountryValid = zkPassportVerifier.isNationalityOut(excludedCountries, _params);
352+
string[] memory excludedCountries = new string[](4);
353+
excludedCountries[0] = CUB;
354+
excludedCountries[1] = IRN;
355+
excludedCountries[2] = PKR;
356+
excludedCountries[3] = UKR;
357+
bool isCountryValid = zkPassportVerifier.isNationalityOut(excludedCountries, _params.commitments);
355358
require(isCountryValid, InvalidCountry());
356359

357360
// Sanctions check
358-
zkPassportVerifier.enforceSanctionsRoot(_params);
361+
zkPassportVerifier.enforceSanctionsRoot(_params.commitments);
362+
363+
// Face match check
364+
bool isFaceMatchValid =
365+
zkPassportVerifier.isFaceMatchVerified(FaceMatchMode.STRICT, OS.ANY, _params.commitments, _params.serviceConfig);
366+
require(isFaceMatchValid, InvalidFaceMatch());
359367
}
360368

361369
// Set nullifier to consumed

l1-contracts/test/staking_asset_handler/addValidator.t.sol

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,11 @@ contract AddValidatorTest is StakingAssetHandlerBase {
183183
_attester, validMerkleProof, _proof, BN254Lib.g1Zero(), BN254Lib.g2Zero(), BN254Lib.g1Zero()
184184
);
185185

186-
uint256 uniqueIdentifierLocation = _proof.publicInputs.length - 1;
186+
uint256 uniqueIdentifierLocation = _proof.proofVerificationData.publicInputs.length - 1;
187187
vm.expectRevert(
188-
abi.encodeWithSelector(IStakingAssetHandler.SybilDetected.selector, _proof.publicInputs[uniqueIdentifierLocation])
188+
abi.encodeWithSelector(
189+
IStakingAssetHandler.SybilDetected.selector, _proof.proofVerificationData.publicInputs[uniqueIdentifierLocation]
190+
)
189191
);
190192
// Call from somebody else
191193
vm.prank(_caller);
@@ -201,7 +203,7 @@ contract AddValidatorTest is StakingAssetHandlerBase {
201203
givenPassportProofIsValid
202204
{
203205
// it reverts
204-
_proof.devMode = true;
206+
_proof.serviceConfig.devMode = true;
205207

206208
vm.assume(
207209
_attester != address(0) && _caller != address(this) && _attester != address(this) && _attester != unhinged

l1-contracts/test/staking_asset_handler/zkpassport/ZKPassportBase.sol

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,34 @@ pragma solidity >=0.8.27;
44

55
import {ZKPassportVerifier, ProofVerificationParams} from "@zkpassport/ZKPassportVerifier.sol";
66
import {IRootRegistry} from "@zkpassport/IRootRegistry.sol";
7-
import {HonkVerifier as OuterVerifier7} from "@zkpassport/ultra-honk-verifiers/OuterCount7.sol";
7+
import {HonkVerifier as OuterVerifier8} from "@zkpassport/ultra-honk-verifiers/OuterCount8.sol";
88
import {MockRootRegistry} from "./MockRootRegistry.sol";
99
import {MockZKPassportVerifier} from "@aztec/mock/staking_asset_handler/MockZKPassportVerifier.sol";
1010
import {CommittedInputLen} from "@zkpassport/Constants.sol";
11+
import {ProofVerificationData, Commitments, ServiceConfig} from "@zkpassport/Types.sol";
1112

1213
import {Test} from "forge-std/Test.sol";
1314

1415
contract ZKPassportBase is Test {
1516
ZKPassportVerifier public zkPassportVerifier;
1617
MockZKPassportVerifier public mockZKPassportVerifier;
1718

18-
OuterVerifier7 public verifier;
19+
OuterVerifier8 public verifier;
1920
IRootRegistry public rootRegistry;
2021

2122
ProofVerificationParams internal fakeProof;
2223
ProofVerificationParams internal realProof;
2324

2425
// Path to the proof file - using files directly in project root
2526
// Fixtures copied from within the zk passport subrepo
26-
bytes32 constant VKEY_HASH = 0x2992c925ad8932475d5784bf202b58f1c9d043d6ec04e236a7c761593caea5ce;
27+
bytes32 constant VKEY_HASH = 0x254314c80a8cc3efc785643a0a6aeeba6ae268a45e69a98affd4a4155f01e186;
2728

2829
// From fixtures - see lib/circuits/src/solidity/test/SampleContract.t.sol
2930
string constant CORRECT_DOMAIN = "zkpassport.id";
3031
string constant CORRECT_SCOPE = "bigproof";
3132

32-
// Time when the proof was generated - 2025-09-26T15:46:45.835Z
33-
uint256 public PROOF_GENERATION_TIMESTAMP = 1_758_901_597;
33+
// Time when the proof was generated - October 19, 2025 7:29:51Z
34+
uint256 public PROOF_GENERATION_TIMESTAMP = 1_760_906_062;
3435

3536
// Using this base contract will make a zkpassport verifier and proof available for testing purposes
3637
constructor() {
@@ -40,7 +41,7 @@ contract ZKPassportBase is Test {
4041
// Deploy wrapper verifier
4142
zkPassportVerifier = new ZKPassportVerifier(address(rootRegistry));
4243
// Deploy actual circuit verifier
43-
verifier = new OuterVerifier7();
44+
verifier = new OuterVerifier8();
4445

4546
// Add to the zk passport verifier
4647
bytes32[] memory vkeyHashes = new bytes32[](1);
@@ -66,22 +67,22 @@ contract ZKPassportBase is Test {
6667
bytes memory committedInputs = loadBytesFromFile("valid_committed_inputs.hex");
6768

6869
// Order of bytes of committed inputs for each disclosure proof
69-
uint256[] memory committedInputCounts = new uint256[](4);
70+
uint256[] memory committedInputCounts = new uint256[](5);
7071
committedInputCounts[0] = CommittedInputLen.BIND;
7172
committedInputCounts[1] = CommittedInputLen.SANCTIONS;
7273
committedInputCounts[2] = CommittedInputLen.EXCL_NATIONALITY;
7374
committedInputCounts[3] = CommittedInputLen.COMPARE_AGE;
75+
committedInputCounts[4] = CommittedInputLen.FACEMATCH;
7476

7577
params = ProofVerificationParams({
76-
vkeyHash: VKEY_HASH,
77-
proof: proof,
78-
publicInputs: publicInputs,
79-
committedInputs: committedInputs,
80-
committedInputCounts: committedInputCounts,
81-
validityPeriodInSeconds: 7 days,
82-
domain: "zkpassport.id",
83-
scope: "bigproof",
84-
devMode: false
78+
proofVerificationData: ProofVerificationData({vkeyHash: VKEY_HASH, proof: proof, publicInputs: publicInputs}),
79+
commitments: Commitments({committedInputs: committedInputs, committedInputCounts: committedInputCounts}),
80+
serviceConfig: ServiceConfig({
81+
validityPeriodInSeconds: 7 days,
82+
domain: CORRECT_DOMAIN,
83+
scope: CORRECT_SCOPE,
84+
devMode: false
85+
})
8586
});
8687
}
8788

@@ -102,15 +103,14 @@ contract ZKPassportBase is Test {
102103
committedInputCounts[7] = 25;
103104

104105
params = ProofVerificationParams({
105-
vkeyHash: VKEY_HASH,
106-
proof: proof,
107-
publicInputs: publicInputs,
108-
committedInputs: committedInputs,
109-
committedInputCounts: committedInputCounts,
110-
validityPeriodInSeconds: 7 days,
111-
domain: "zkpassport.id",
112-
scope: "bigproof",
113-
devMode: true
106+
proofVerificationData: ProofVerificationData({vkeyHash: VKEY_HASH, proof: proof, publicInputs: publicInputs}),
107+
commitments: Commitments({committedInputs: committedInputs, committedInputCounts: committedInputCounts}),
108+
serviceConfig: ServiceConfig({
109+
validityPeriodInSeconds: 7 days,
110+
domain: "zkpassport.id",
111+
scope: "bigproof",
112+
devMode: true
113+
})
114114
});
115115
}
116116

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0801001404fb06e8bf44ec60b6a99d2f98551172b2f2ded80200027a690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009099699583ea7729a4a05821667645e927b74feb4e6e5382c6e4370e35ed2b23c0543554249524e50524b554b52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000068d6b1141200
1+
0801001404fb06e8bf44ec60b6a99d2f98551172b2f2ded80200027a690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009099699583ea7729a4a05821667645e927b74feb4e6e5382c6e4370e35ed2b23c0543554249524e50524b554b52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000068f54aab12000a2532418a107c5306fa8308c22255792cf77e4a290cbce8a840a642a3e591340b011fa73686cf510f8f85757b0602de0dd72a13e68ae2092462be8b72662e7f179b000000000000000000000000000000000000000000000000000000000000000002

l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_proof.hex

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

l1-contracts/test/staking_asset_handler/zkpassport/fixtures/valid_public_inputs.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
{
22
"inputs": [
3-
"0x27eb6ee351be62a96a3209749074c8641d2b15845a37d3f312ad805b0f4ec4d0",
4-
"0x1b84a41b213ad424e50a306f4ea6c961a66caac76915241df4dc93b6757dd9cd",
5-
"0x0000000000000000000000000000000000000000000000000000000068d6b132",
3+
"0x166a7b95f72ab538ed181b0888ccee18204f98dca373187c42503aacc290a72c",
4+
"0x2d88250ced89385b0135ba36f190f858fd329b2694f479c5a605884c7f194384",
5+
"0x0000000000000000000000000000000000000000000000000000000068f54abb",
66
"0x008d535e2a7f4ee38a4d12aa88bcf21d2c2f6fa051d12eafba6655bf37e8c11c",
77
"0x00f54fbb0f658e7013ec2114ef095a29bb3e2f95b96dbd93e46f12f67863111a",
88
"0x00ed45ee6335b3285f58a3c472e398fc6754d1eaa9d7043a60b2daa0a67332e7",
99
"0x000105354ff92c66a5d42a8d34033ace18d259e4dc04b35a584dc370c00586ba",
1010
"0x0037e4a54fb3f1500058797f475d37f2f8cd9b87f20762c21497a2ab2f655f64",
11-
"0x00123482330ec434a086016334db04fdd2ac4764617511c8904dcf2a0343327b",
11+
"0x0031f315a5531bb674ebe625f9ff8298ed0c0a07a173287b47e57691138fb09e",
12+
"0x00dcec2b86a5267e6e92db9cc0017a2e89d62df782c4254d856bff5eaef8c391",
1213
"0x0000000000000000000000000000000000000000000000000000000000000000",
1314
"0x171de101deed3f056917faecfe6cc04db2ef02689a8a483962a688948ce44461"
1415
]

yarn-project/ethereum/src/zkPassportVerifierAddress.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { EthAddress } from '@aztec/foundation/eth-address';
44
* The address of the zk passport verifier on sepolia
55
* get address from: ROOT/l1-contracts/lib/circuits/src/solidity/deployments/deployment-11155111.json
66
*/
7-
export const ZK_PASSPORT_VERIFIER_ADDRESS = EthAddress.fromString('0xBec82dec0747C9170D760D5aba9cc44929B17C05');
7+
export const ZK_PASSPORT_VERIFIER_ADDRESS = EthAddress.fromString('0x3101Bad9eA5fACadA5554844a1a88F7Fe48D4DE0');
88
/**
99
* The default domain of the zk passport site
1010
*/

0 commit comments

Comments
 (0)