Skip to content

Commit

Permalink
Add support of ERC165 to basic validator
Browse files Browse the repository at this point in the history
  • Loading branch information
Andriian Chestnykh committed Jan 29, 2024
1 parent 566fcd1 commit 624f6f7
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
10 changes: 9 additions & 1 deletion contracts/validators/CredentialAtomicQueryValidator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
pragma solidity 0.8.16;

import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import {GenesisUtils} from "../lib/GenesisUtils.sol";
import {ICircuitValidator} from "../interfaces/ICircuitValidator.sol";
import {ICircuitValidatorExtended} from "../interfaces/ICircuitValidatorExtended.sol";
import {IVerifier} from "../interfaces/IVerifier.sol";
import {IState} from "../interfaces/IState.sol";
import {PoseidonFacade} from "../lib/Poseidon.sol";

abstract contract CredentialAtomicQueryValidator is OwnableUpgradeable, ICircuitValidatorExtended {
abstract contract CredentialAtomicQueryValidator is OwnableUpgradeable, ICircuitValidatorExtended, ERC165 {
struct CredentialAtomicQuery {
uint256 schema;
uint256 claimPathKey;
Expand Down Expand Up @@ -108,6 +109,13 @@ abstract contract CredentialAtomicQueryValidator is OwnableUpgradeable, ICircuit
return --index; // we save 1-based index, but return 0-based
}

/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(ICircuitValidatorExtended).interfaceId || super.supportsInterface(interfaceId);
}

function _verify(
uint256[] calldata inputs,
uint256[2] calldata a,
Expand Down
6 changes: 5 additions & 1 deletion contracts/verifiers/UniversalVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
pragma solidity ^0.8.0;

import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import {ICircuitValidator} from "../interfaces/ICircuitValidator.sol";
import {IZKPVerifier} from "../interfaces/IZKPVerifier.sol";
import {ArrayUtils} from "../lib/ArrayUtils.sol";
Expand Down Expand Up @@ -260,8 +261,11 @@ contract UniversalVerifier is OwnableUpgradeable {
uint256[2] calldata c
) public view requestEnabled(requestId) checkValidatorIsSet(requestId) {
IZKPVerifier.ZKPRequestExtended memory request = _getMainStorage().requests[requestId];
require(
IERC165(address(request.validator)).supportsInterface(type(ICircuitValidatorExtended).interfaceId),
"Validator doesn't support extended interface"
);

// TODO check with standard interface detection here!!!
request.validator.verifyWithSender(inputs, a, b, c, request.data, _msgSender());
}

Expand Down

0 comments on commit 624f6f7

Please sign in to comment.