diff --git a/package-lock.json b/package-lock.json index b880c65..bf1bd79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@iden3/js-iden3-auth", - "version": "1.3.1", + "version": "1.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@iden3/js-iden3-auth", - "version": "1.3.1", + "version": "1.3.2", "license": "AGPL-3.0", "dependencies": { "@0xpolygonid/js-sdk": "1.10.3", diff --git a/package.json b/package.json index 025ef03..1777604 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/circuits/atomicMtpV2.ts b/src/circuits/atomicMtpV2.ts index 9b6f73c..aa0fbab 100644 --- a/src/circuits/atomicMtpV2.ts +++ b/src/circuits/atomicMtpV2.ts @@ -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; diff --git a/src/circuits/common.ts b/src/circuits/common.ts index daeceef..235af9d 100644 --- a/src/circuits/common.ts +++ b/src/circuits/common.ts @@ -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`); @@ -10,22 +9,14 @@ export async function checkUserState( userId: Id, userState: Hash ): Promise { - 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 { - const gistStateResolved: ResolvedState = await resolver.rootResolve(state.bigInt()); - return gistStateResolved; + return await resolver.rootResolve(state.bigInt()); } export async function checkIssuerNonRevState( @@ -33,11 +24,10 @@ export async function checkIssuerNonRevState( issuerId: Id, issuerClaimNonRevState: Hash ): Promise { - const issuerNonRevStateResolved: ResolvedState = await resolver.resolve( + return await resolver.resolve( issuerId.bigInt(), issuerClaimNonRevState.bigInt() ); - return issuerNonRevStateResolved; } export function getResolverByID(resolvers: Resolvers, id: Id): IStateResolver { diff --git a/test/common.test.ts b/test/common.test.ts new file mode 100644 index 0000000..eae7e2c --- /dev/null +++ b/test/common.test.ts @@ -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); + }); +}); diff --git a/test/mocks.ts b/test/mocks.ts index 3ed2400..2c836ae 100644 --- a/test/mocks.ts +++ b/test/mocks.ts @@ -25,6 +25,36 @@ class MockResolver implements IStateResolver { } } +class MockResolverWithNoStateInContract implements IStateResolver { + resolve(): Promise { + throw new Error('State is not genesis and not registered in the smart contract'); + } + rootResolve(): Promise { + throw new Error('GIST root does not exist in the smart contract'); + } +} + +class MockResolverWithNotLatesState implements IStateResolver { + resolve(): Promise { + const t: ResolvedState = { + latest: false, + state: null, + genesis: false, + transitionTimestamp: 1712653265 + }; + return Promise.resolve(t); + } + rootResolve(): Promise { + 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', @@ -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