Skip to content

Commit

Permalink
fix checkUserState function (#89)
Browse files Browse the repository at this point in the history
* fix checkUserState function
  • Loading branch information
volodymyr-basiuk committed Apr 9, 2024
1 parent aad0e2d commit 1cdd2bb
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 17 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@iden3/js-iden3-auth",
"version": "1.3.1",
"version": "1.3.2",
"description": "iden3-auth implementation in JavaScript",
"main": "dist/cjs/index.js",
"source": "./src/index.ts",
Expand Down
6 changes: 5 additions & 1 deletion src/circuits/atomicMtpV2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,11 @@ export class AtomicQueryMTPV2PubSignalsVerifier
throw new Error(`resolver not found for issuerID ${this.pubSignals.issuerID.string()}`);
}

await checkUserState(resolver, this.pubSignals.issuerID, this.pubSignals.issuerClaimIdenState);
await checkUserState(
resolver,
this.pubSignals.issuerID,
this.pubSignals.issuerClaimIdenState
);

if (this.pubSignals.isRevocationChecked === 0) {
return;
Expand Down
16 changes: 3 additions & 13 deletions src/circuits/common.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Id, DID } from '@iden3/js-iden3-core';
import { IStateResolver, ResolvedState, Resolvers } from '@lib/state/resolver';
import { Hash } from '@iden3/js-merkletree';

export const userStateError = new Error(`user state is not valid`);
export const gistStateError = new Error(`gist state is not valid`);

Expand All @@ -10,34 +9,25 @@ export async function checkUserState(
userId: Id,
userState: Hash
): Promise<ResolvedState> {
const userStateResolved: ResolvedState = await resolver.resolve(
userId.bigInt(),
userState.bigInt()
);
if (!userStateResolved.latest) {
throw userStateError;
}
return userStateResolved;
return await resolver.resolve(userId.bigInt(), userState.bigInt());
}

export async function checkGlobalState(
resolver: IStateResolver,
state: Hash
): Promise<ResolvedState> {
const gistStateResolved: ResolvedState = await resolver.rootResolve(state.bigInt());
return gistStateResolved;
return await resolver.rootResolve(state.bigInt());
}

export async function checkIssuerNonRevState(
resolver: IStateResolver,
issuerId: Id,
issuerClaimNonRevState: Hash
): Promise<ResolvedState> {
const issuerNonRevStateResolved: ResolvedState = await resolver.resolve(
return await resolver.resolve(
issuerId.bigInt(),
issuerClaimNonRevState.bigInt()
);
return issuerNonRevStateResolved;
}

export function getResolverByID(resolvers: Resolvers, id: Id): IStateResolver {
Expand Down
20 changes: 20 additions & 0 deletions test/common.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { DID } from '@iden3/js-iden3-core';
import { checkUserState } from '@lib/circuits/common';
import { mockResolverWithNoStateInContract, mockResolverWithNotLatesState } from './mocks';
import { Hash } from '@iden3/js-merkletree';

describe('Common', () => {
const issuerDID = DID.parse('did:iden3:polygon:mumbai:x6suHR8HkEYczV9yVeAKKiXCZAd25P8WS6QvNhszk');
const issuerID = DID.idFromDID(issuerDID);
const hash = Hash.fromBigInt(
BigInt('13483594486393726782589954979757194488582220051583949915340451442108840786819')
);
it('checkUserState fails', async () => {
await expect(
checkUserState(mockResolverWithNoStateInContract, issuerID, hash)
).rejects.toThrow('State is not genesis and not registered in the smart contract');
});
it('checkUserState', async () => {
await checkUserState(mockResolverWithNotLatesState, issuerID, hash);
});
});
33 changes: 33 additions & 0 deletions test/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,36 @@ class MockResolver implements IStateResolver {
}
}

class MockResolverWithNoStateInContract implements IStateResolver {
resolve(): Promise<ResolvedState> {
throw new Error('State is not genesis and not registered in the smart contract');
}
rootResolve(): Promise<ResolvedState> {
throw new Error('GIST root does not exist in the smart contract');
}
}

class MockResolverWithNotLatesState implements IStateResolver {
resolve(): Promise<ResolvedState> {
const t: ResolvedState = {
latest: false,
state: null,
genesis: false,
transitionTimestamp: 1712653265
};
return Promise.resolve(t);
}
rootResolve(): Promise<ResolvedState> {
const t: ResolvedState = {
latest: false,
state: null,
genesis: false,
transitionTimestamp: 1712653265
};
return Promise.resolve(t);
}
}

export const exampleDidDoc = {
'@context': [
'https://www.w3.org/ns/did/v1',
Expand Down Expand Up @@ -53,6 +83,9 @@ export const testOpts: VerifyOpts = {
};

const mockStateResolver: MockResolver = new MockResolver();
export const mockResolverWithNoStateInContract: MockResolver =
new MockResolverWithNoStateInContract();
export const mockResolverWithNotLatesState: MockResolver = new MockResolverWithNotLatesState();
export const resolvers: Resolvers = {
'polygon:amoy': mockStateResolver,
'polygon:mumbai': mockStateResolver
Expand Down

0 comments on commit 1cdd2bb

Please sign in to comment.