@ -1,11 +1,8 @@
require ( '@openzeppelin/test-helpers' ) ;
const { expectRevert } = require ( '@openzeppelin/test-helpers' ) ;
const { expect } = require ( 'chai' ) ;
const { MerkleTree } = require ( 'merkletreejs' ) ;
const keccak256 = require ( 'keccak256' ) ;
const { expect } = require ( 'chai' ) ;
const MerkleProof = artifacts . require ( '$MerkleProof' ) ;
contract ( 'MerkleProof' , function ( ) {
@ -176,5 +173,28 @@ contract('MerkleProof', function () {
expect ( await this . merkleProof . $multiProofVerify ( [ root ] , [ ] , root , [ ] ) ) . to . equal ( true ) ;
expect ( await this . merkleProof . $multiProofVerifyCalldata ( [ root ] , [ ] , root , [ ] ) ) . to . equal ( true ) ;
} ) ;
it ( 'reverts processing manipulated proofs with a zero-value node at depth 1' , async function ( ) {
// Create a merkle tree that contains a zero leaf at depth 1
const leaves = [ keccak256 ( 'real leaf' ) , Buffer . alloc ( 32 , 0 ) ] ;
const merkleTree = new MerkleTree ( leaves , keccak256 , { sortPairs : true } ) ;
const root = merkleTree . getRoot ( ) ;
// Now we can pass any ** malicious ** fake leaves as valid!
const maliciousLeaves = [ 'some' , 'malicious' , 'leaves' ] . map ( keccak256 ) . sort ( Buffer . compare ) ;
const maliciousProof = [ leaves [ 0 ] , leaves [ 0 ] ] ;
const maliciousProofFlags = [ true , true , false ] ;
await expectRevert (
this . merkleProof . $multiProofVerify ( maliciousProof , maliciousProofFlags , root , maliciousLeaves ) ,
'MerkleProof: invalid multiproof' ,
) ;
await expectRevert (
this . merkleProof . $multiProofVerifyCalldata ( maliciousProof , maliciousProofFlags , root , maliciousLeaves ) ,
'MerkleProof: invalid multiproof' ,
) ;
} ) ;
} ) ;
} ) ;