diff --git a/src/utils/MerkleTreeLib.sol b/src/utils/MerkleTreeLib.sol index 46f352de1b..260fac58cd 100644 --- a/src/utils/MerkleTreeLib.sol +++ b/src/utils/MerkleTreeLib.sol @@ -258,13 +258,16 @@ library MerkleTreeLib { assembly { result := mload(0x40) let l := mload(leaves) - if iszero(l) { + let p := sub(l, 1) + if iszero(lt(p, 0xffffffff)) { mstore(0x00, 0xe7171dc4) // `MerkleTreeLeavesEmpty()`. - revert(0x1c, 0x04) + revert(0x1c, mul(iszero(l), 0x04)) // If `p > 2**32 - 1`, revert with empty. } - let p := sub(mload(leaves), 1) - for { let i := 1 } lt(i, 0x80) { i := add(i, i) } { p := or(p, shr(i, p)) } - p := add(p, 1) + p := or(shr(1, p), p) + p := or(shr(2, p), p) + p := or(shr(4, p), p) + p := or(shr(8, p), p) + p := add(1, or(shr(16, p), p)) // Supports up to `2**32 - 1`. mstore(result, p) // Store length. mstore(0x40, add(result, add(0x20, shl(5, p)))) // Allocate memory. let d := sub(result, leaves)