@@ -5,14 +5,17 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own
55import {GenesisUtils} from "@iden3/contracts/lib/GenesisUtils.sol " ;
66import {ICircuitValidator} from "@iden3/contracts/interfaces/ICircuitValidator.sol " ;
77import {IVerifier} from "@iden3/contracts/interfaces/IVerifier.sol " ;
8- import {IState } from "@iden3/contracts/interfaces/IState .sol " ;
8+ import {StateV2 } from "@iden3/contracts/state/StateV2 .sol " ;
99
10- contract CredentialAtomicQuerySigValidator is OwnableUpgradeable , ICircuitValidator {
10+ contract CredentialAtomicQuerySigValidator is
11+ OwnableUpgradeable ,
12+ ICircuitValidator
13+ {
1114 string constant CIRCUIT_ID = "credentialAtomicQuerySigV2OnChain " ;
1215 uint256 constant CHALLENGE_INDEX = 5 ;
1316
1417 IVerifier public verifier;
15- IState public state;
18+ StateV2 public state;
1619
1720 uint256 public revocationStateExpirationTime;
1821 uint256 public proofGenerationExpirationTime;
@@ -24,15 +27,22 @@ contract CredentialAtomicQuerySigValidator is OwnableUpgradeable, ICircuitValida
2427 revocationStateExpirationTime = 1 hours ;
2528 proofGenerationExpirationTime = 1 hours ;
2629 verifier = IVerifier (_verifierContractAddr);
27- state = IState (_stateContractAddr);
30+ state = StateV2 (_stateContractAddr);
2831 __Ownable_init ();
2932 }
3033
31- function setRevocationStateExpirationTime (uint256 expirationTime ) public onlyOwner {
34+ function setRevocationStateExpirationTime (uint256 expirationTime )
35+ public
36+ onlyOwner
37+ {
3238 revocationStateExpirationTime = expirationTime;
3339 }
3440
35- function setProofGenerationExpirationTime (uint256 expirationTime ) public virtual onlyOwner {
41+ function setProofGenerationExpirationTime (uint256 expirationTime )
42+ public
43+ virtual
44+ onlyOwner
45+ {
3646 proofGenerationExpirationTime = expirationTime;
3747 }
3848
@@ -52,67 +62,92 @@ contract CredentialAtomicQuerySigValidator is OwnableUpgradeable, ICircuitValida
5262 uint256 queryHash
5363 ) external view returns (bool r ) {
5464 // verify that zkp is valid
55- require (verifier.verifyProof (a, b, c, inputs), "atomic query signature proof is not valid " );
56- require (inputs[2 ] == queryHash, "query hash does not match the requested one " );
65+ require (
66+ verifier.verifyProof (a, b, c, inputs),
67+ "atomic query signature proof is not valid "
68+ );
69+ require (
70+ inputs[2 ] == queryHash,
71+ "query hash does not match the requested one "
72+ );
5773
5874 uint256 issuerClaimAuthState = inputs[3 ];
5975 uint256 gistRoot = inputs[6 ];
6076 uint256 issuerId = inputs[7 ];
6177 uint256 issuerClaimNonRevState = inputs[9 ];
6278 uint256 proofGenerationTimestamp = inputs[10 ];
6379
64- IState .GistRootInfo memory rootInfo = state.getGISTRootInfo (gistRoot);
80+ StateV2 .GistRootInfo memory rootInfo = state.getGISTRootInfo (gistRoot);
6581
66- require (rootInfo.root == gistRoot, "Gist root state isn't in state contract " );
82+ require (
83+ rootInfo.root == gistRoot,
84+ "Gist root state isn't in state contract "
85+ );
6786
68- // 2. Issuer state must be registered in state contracts or be genesis
69- bool isIssuerStateGenesis = GenesisUtils.isGenesisState (issuerId, issuerClaimAuthState);
87+ // Issuer auth claim issuance must be registered in state contracts or be genesis
88+ bool isIssuerStateGenesis = GenesisUtils.isGenesisState (
89+ issuerId,
90+ issuerClaimAuthState
91+ );
7092
7193 if (! isIssuerStateGenesis) {
72- IState.StateInfo memory issuerStateInfo = state.getStateInfoByIdAndState (
73- issuerId, issuerClaimAuthState
94+ StateV2.StateInfo memory issuerStateInfo = state
95+ .getStateInfoByIdAndState (issuerId, issuerClaimAuthState);
96+ require (
97+ issuerId == issuerStateInfo.id,
98+ "Issuer state doesn't exist in state contract "
7499 );
75- require (issuerId == issuerStateInfo.id, "Issuer state doesn't exist in state contract " );
76100 }
77-
78- IState.StateInfo memory issuerClaimNonRevStateInfo = state.getStateInfoById (issuerId);
79-
80- if (issuerClaimNonRevStateInfo.state == 0 ) {
101+ // check if identity transited any state in contract
102+ bool idExists = state.idExists (issuerId);
103+
104+ // if identity didn't transit any state it must be genesis
105+ if (! idExists) {
106+ bool isIssuerRevocationStateGenesis = GenesisUtils.isGenesisState (
107+ issuerId,
108+ issuerClaimNonRevState
109+ );
81110 require (
82- GenesisUtils. isGenesisState (issuerId, issuerClaimNonRevState) ,
83- "Non-Revocation state isn 't in state contract and not genesis "
111+ isIssuerRevocationStateGenesis ,
112+ "Issuer revocation state doesn 't exist in state contract and is not genesis "
84113 );
85114 } else {
86- // The non-empty state is returned, and it's not equal to the state that the user has provided.
87- if (issuerClaimNonRevStateInfo.state != issuerClaimNonRevState) {
88- // Get the time of the latest state and compare it to the transition time of state provided by the user.
89- IState.StateInfo memory issuerClaimNonRevLatestStateInfo = state
90- .getStateInfoByIdAndState (issuerId, issuerClaimNonRevState);
115+ StateV2.StateInfo memory issuerLatestStateInfo = state
116+ .getStateInfoById (issuerId);
117+ if (issuerLatestStateInfo.state != issuerClaimNonRevState) {
118+ // Get the time of the latest state and compare it to the transition time of state provided by the user.
119+ StateV2.StateInfo memory issuerClaimNonRevStateInfo = state
120+ .getStateInfoByIdAndState (issuerId, issuerClaimNonRevState);
91121
92122 if (
93- issuerClaimNonRevLatestStateInfo .id == 0 ||
94- issuerClaimNonRevLatestStateInfo .id != issuerId
123+ issuerClaimNonRevStateInfo .id == 0 ||
124+ issuerClaimNonRevStateInfo .id != issuerId
95125 ) {
96126 revert ("state in transition info contains invalid id " );
97127 }
98128
99- if (issuerClaimNonRevLatestStateInfo.replacedAtTimestamp == 0 ) {
100- revert ("Non-Latest state doesn't contain replacement information " );
129+ if (issuerClaimNonRevStateInfo.replacedAtTimestamp == 0 ) {
130+ revert (
131+ "Non-Latest state doesn't contain replacement information "
132+ );
101133 }
102134
103135 if (
104- block .timestamp - issuerClaimNonRevLatestStateInfo.replacedAtTimestamp >
136+ block .timestamp -
137+ issuerClaimNonRevStateInfo.replacedAtTimestamp >
105138 revocationStateExpirationTime
106139 ) {
107140 revert ("Non-Revocation state of Issuer expired " );
108141 }
109-
110- if (block .timestamp - proofGenerationTimestamp > proofGenerationExpirationTime) {
111- revert ("Generated proof is outdated " );
112- }
113-
114142 }
115143 }
144+
145+ if (
146+ block .timestamp - proofGenerationTimestamp >
147+ proofGenerationExpirationTime
148+ ) {
149+ revert ("Generated proof is outdated " );
150+ }
116151 return (true );
117152 }
118- }
153+ }
0 commit comments