diff --git a/packages/lean-imt/src/lean-imt.ts b/packages/lean-imt/src/lean-imt.ts index f453ff1dc..f153ea198 100644 --- a/packages/lean-imt/src/lean-imt.ts +++ b/packages/lean-imt/src/lean-imt.ts @@ -222,7 +222,10 @@ export default class LeanIMT { // (like the 'insert' function). const sibling = this._nodes[level][index + 1] - if (sibling) { + // If the sibling node does not exist, it means that the node at + // this level has the same value as its child. Therefore, there + // no hash to calculate. + if (sibling !== undefined) { node = this._hash(node, sibling) } } diff --git a/packages/lean-imt/tests/lean-imt.test.ts b/packages/lean-imt/tests/lean-imt.test.ts index 38212c1c5..7505d691c 100644 --- a/packages/lean-imt/tests/lean-imt.test.ts +++ b/packages/lean-imt/tests/lean-imt.test.ts @@ -443,6 +443,30 @@ describe("Lean IMT", () => { } expect(LeanIMT.verifyProof(proof, badHash)).toBe(false) }) + + it(`Should insert members,remove member,update member and verifyProof`, () => { + const tree = new LeanIMT(poseidon) + + tree.insert(BigInt(1)) + + tree.insert(BigInt(2)) + + tree.insert(BigInt(3)) + + // Remove the third member. + tree.update(2, BigInt(0)) + + let proof = tree.generateProof(1) + + expect(tree.verifyProof(proof)).toBe(true) + + // Update the second member. + tree.update(1, BigInt(3)) + + // Validating a proof generated by the first member + proof = tree.generateProof(1) + expect(tree.verifyProof(proof)).toBe(true) + }) }) describe("# import/export", () => {