@@ -7,7 +7,9 @@ import {IMintableERC20} from "@aztec/shared/interfaces/IMintableERC20.sol";
77import {G1Point, G2Point} from "@aztec/shared/libraries/BN254Lib.sol " ;
88import {Ownable} from "@oz/access/Ownable.sol " ;
99import {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
0 commit comments