Fix merkle multiProof for single leaf tree (#3446)
This commit is contained in:
@ -105,7 +105,13 @@ library MerkleProof {
|
|||||||
hashes[i] = _hashPair(a, b);
|
hashes[i] = _hashPair(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (totalHashes > 0) {
|
||||||
return hashes[totalHashes - 1];
|
return hashes[totalHashes - 1];
|
||||||
|
} else if (leafsLen > 0) {
|
||||||
|
return leafs[0];
|
||||||
|
} else {
|
||||||
|
return proofs[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
|
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
|
||||||
|
|||||||
@ -127,5 +127,25 @@ contract('MerkleProof', function (accounts) {
|
|||||||
'reverted with panic code 0x32',
|
'reverted with panic code 0x32',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('limit case: works for tree containing a single leaf', async function () {
|
||||||
|
const leaves = ['a'].map(keccak256).sort(Buffer.compare);
|
||||||
|
const merkleTree = new MerkleTree(leaves, keccak256, { sort: true });
|
||||||
|
|
||||||
|
const root = merkleTree.getRoot();
|
||||||
|
const proofLeaves = ['a'].map(keccak256).sort(Buffer.compare);
|
||||||
|
const proof = merkleTree.getMultiProof(proofLeaves);
|
||||||
|
const proofFlags = merkleTree.getProofFlags(proofLeaves, proof);
|
||||||
|
|
||||||
|
expect(await this.merkleProof.multiProofVerify(root, proofLeaves, proof, proofFlags)).to.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('limit case: can prove empty leaves', async function () {
|
||||||
|
const leaves = ['a', 'b', 'c', 'd'].map(keccak256).sort(Buffer.compare);
|
||||||
|
const merkleTree = new MerkleTree(leaves, keccak256, { sort: true });
|
||||||
|
|
||||||
|
const root = merkleTree.getRoot();
|
||||||
|
expect(await this.merkleProof.multiProofVerify(root, [], [ root ], [])).to.equal(true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user