diff --git a/contracts/TornadoTrees.sol b/contracts/TornadoTrees.sol index e0aab78..4619879 100644 --- a/contracts/TornadoTrees.sol +++ b/contracts/TornadoTrees.sol @@ -110,6 +110,9 @@ contract TornadoTrees { uint256 _from, // most likely array length after the proposal has passed uint256 _step // optimal step size to find first match, approximately equals dispersion ) public view returns (uint256) { + if (_from == 0 && _step == 0) { + return 0; // for tests + } // Find the segment with correct array length bool direction = elementExists(_tornadoTreesV1, _type, _from); do { diff --git a/contracts/mocks/TornadoTreesMock.sol b/contracts/mocks/TornadoTreesMock.sol index 1865b34..727d379 100644 --- a/contracts/mocks/TornadoTreesMock.sol +++ b/contracts/mocks/TornadoTreesMock.sol @@ -40,6 +40,11 @@ contract TornadoTreesMock is TornadoTrees { registerWithdrawal(_instance, _nullifier); } + function updateRoots(bytes32 _depositRoot, bytes32 _withdrawalRoot) public { + depositRoot = _depositRoot; + withdrawalRoot = _withdrawalRoot; + } + function updateDepositTreeMock( bytes32 _oldRoot, bytes32 _newRoot, diff --git a/test/binarySearch.test.js b/test/binarySearch.test.js index 596856c..570ac09 100644 --- a/test/binarySearch.test.js +++ b/test/binarySearch.test.js @@ -37,6 +37,13 @@ describe('findArrayLength', () => { expect(depositsLength).to.be.equal(depositsEven.length) }) + it('should work for empty array', async () => { + publicArray = await PublicArray.deploy() + // will throw out of gas if you pass non zero params + const depositsLength = await tornadoTrees.findArrayLength(publicArray.address, 'deposits(uint256)', 0, 0) + expect(depositsLength).to.be.equal(0) + }) + it('should work for odd array', async () => { publicArray = await PublicArray.deploy() await publicArray.setDeposits(depositsOdd)