@@ -9,36 +9,46 @@ contract ZKPassportRootVerifier {
99 address public guardian;
1010 bool public paused;
1111
12- IZKPassportVerifier public verifier ;
12+ mapping ( uint256 => IZKPassportVerifier) public verifiers ;
1313
1414 // Events
1515 event AdminUpdated (address indexed oldAdmin , address indexed newAdmin );
1616 event GuardianUpdated (address indexed oldGuardian , address indexed newGuardian );
17- event VerifierUpdated (address indexed oldVerifier , address indexed newVerifier );
17+ event VerifierAdded (uint256 indexed version , address indexed verifier );
18+ event VerifierRemoved (uint256 indexed version , address indexed verifier );
19+ event VerifierUpdated (uint256 indexed version , address indexed oldVerifier , address indexed newVerifier );
1820 event PausedStatusChanged (bool paused );
1921
2022 /**
2123 * @dev Constructor
2224 * @param _admin The address of the admin
2325 * @param _guardian The address of the guardian
26+ * @param _version The initial version number for the verifier
2427 * @param _verifier The address of the ZKPassport verifier implementation
2528 */
26- constructor (address _admin , address _guardian , address _verifier ) {
29+ constructor (address _admin , address _guardian , uint256 _version , address _verifier ) {
2730 require (_admin != address (0 ), "Admin cannot be zero address " );
31+ require (_verifier != address (0 ), "Verifier cannot be zero address " );
32+ require (_version > 0 , "Version must be greater than 0 " );
2833 admin = _admin;
2934 guardian = _guardian;
30- verifier = IZKPassportVerifier (_verifier);
35+ verifiers[_version] = IZKPassportVerifier (_verifier);
36+ emit VerifierAdded (_version, _verifier);
3137 }
3238
3339 /**
34- * @notice Verifies a ZKPassport proof
40+ * @notice Verifies a ZKPassport proof using a specific verifier version
41+ * @param version The version number of the verifier to use
3542 * @param params The proof verification parameters
3643 * @return valid True if the proof is valid or false otherwise
3744 * @return uniqueIdentifier The unique identifier associated with the ID used to generate the proof
3845 */
3946 function verify (
47+ uint256 version ,
4048 ProofVerificationParams calldata params
4149 ) external view whenNotPaused returns (bool valid , bytes32 uniqueIdentifier ) {
50+ IZKPassportVerifier verifier = verifiers[version];
51+ require (address (verifier) != address (0 ), "Verifier not found for version " );
4252 (valid, uniqueIdentifier) = verifier.verifyProof (params);
4353 return (valid, uniqueIdentifier);
4454 }
@@ -71,10 +81,52 @@ contract ZKPassportRootVerifier {
7181 emit GuardianUpdated (oldGuardian, newGuardian);
7282 }
7383
74- function setVerifier (address newVerifier ) external onlyAdmin {
75- address oldVerifier = address (verifier);
76- verifier = IZKPassportVerifier (newVerifier);
77- emit VerifierUpdated (oldVerifier, newVerifier);
84+ /**
85+ * @notice Gets the verifier address for a specific version
86+ * @param version The version number
87+ * @return The verifier address for the given version
88+ */
89+ function getVerifier (uint256 version ) external view returns (address ) {
90+ return address (verifiers[version]);
91+ }
92+
93+ /**
94+ * @notice Adds a verifier for a specific version
95+ * @param version The version number
96+ * @param newVerifier The address of the verifier
97+ */
98+ function addVerifier (uint256 version , address newVerifier ) external onlyAdmin {
99+ require (newVerifier != address (0 ), "Verifier cannot be zero address " );
100+ require (version > 0 , "Version must be greater than 0 " );
101+ require ((address )(verifiers[version]) == address (0 ), "Verifier already exists for version " );
102+ verifiers[version] = IZKPassportVerifier (newVerifier);
103+ emit VerifierAdded (version, newVerifier);
104+ }
105+
106+ /**
107+ * @notice Removes a verifier for a specific version
108+ * @param version The version number
109+ */
110+ function removeVerifier (uint256 version ) external onlyAdmin {
111+ require (version > 0 , "Version must be greater than 0 " );
112+ address verifierAddress = address (verifiers[version]);
113+ require (verifierAddress != address (0 ), "Verifier not found for version " );
114+ delete verifiers[version];
115+ emit VerifierRemoved (version, verifierAddress);
116+ }
117+
118+ /**
119+ * @notice Updates a verifier for a specific version
120+ * @param version The version number
121+ * @param newVerifier The address of the verifier
122+ */
123+ function updateVerifier (uint256 version , address newVerifier ) external onlyAdmin {
124+ require (version > 0 , "Version must be greater than 0 " );
125+ require (newVerifier != address (0 ), "Verifier cannot be zero address " );
126+ require ((address )(verifiers[version]) != address (0 ), "Verifier not found for version " );
127+ address oldVerifier = address (verifiers[version]);
128+ verifiers[version] = IZKPassportVerifier (newVerifier);
129+ emit VerifierUpdated (version, oldVerifier, newVerifier);
78130 }
79131
80132 function setPaused (bool _paused ) external onlyGuardian {
0 commit comments