fix tests

This commit is contained in:
Alexey 2021-02-05 23:28:51 +03:00
parent e09f53652a
commit 822f268126
4 changed files with 76 additions and 22 deletions

View File

@ -79,42 +79,40 @@ contract TornadoTrees is EnsResolve {
uint256 depositLeaf = _tornadoTreesV1.lastProcessedDepositLeaf(); uint256 depositLeaf = _tornadoTreesV1.lastProcessedDepositLeaf();
require(depositLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state"); require(depositLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state");
lastProcessedDepositLeaf = depositLeaf; lastProcessedDepositLeaf = depositLeaf;
depositsLength = depositV1Length = 4; // todo depositsLength = depositV1Length = findArrayLength(_tornadoTreesV1, "deposits(uint256)", 3); // todo
uint256 withdrawalLeaf = _tornadoTreesV1.lastProcessedWithdrawalLeaf(); uint256 withdrawalLeaf = _tornadoTreesV1.lastProcessedWithdrawalLeaf();
require(withdrawalLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state"); require(withdrawalLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state");
lastProcessedWithdrawalLeaf = withdrawalLeaf; lastProcessedWithdrawalLeaf = withdrawalLeaf;
withdrawalsLength = withdrawalsV1Length = 4; // todo withdrawalsLength = withdrawalsV1Length = findArrayLength(_tornadoTreesV1, "withdrawals(uint256)", 3); // todo
} }
// todo implement binary search // todo implement binary search
function findDepositLength( function findArrayLength(
ITornadoTreesV1 _tornadoTreesV1, ITornadoTreesV1 _tornadoTreesV1,
uint256 _from, string memory _signature,
uint256 _to uint256 _from
) public view returns (uint256) { ) public view returns (uint256) {
bool success; bool success;
bytes memory data; bytes memory data;
uint256 previousTo;
(success, data) = address(_tornadoTreesV1).staticcall{ gas: 3000 }(abi.encodeWithSignature("deposits(uint256)", _to)); (success, data) = address(_tornadoTreesV1).staticcall{ gas: 3000 }(abi.encodeWithSignature(_signature, _from));
while (!success) { while (success) {
previousTo = _to; _from++;
_to = (_from + _to) / 2; (success, data) = address(_tornadoTreesV1).staticcall{ gas: 3000 }(abi.encodeWithSignature(_signature, _from));
(success, data) = address(_tornadoTreesV1).staticcall{ gas: 3000 }(abi.encodeWithSignature("deposits(uint256)", _to));
} }
return _to; return _from;
} }
function registerDeposit(address _instance, bytes32 _commitment) external onlyTornadoProxy { function registerDeposit(address _instance, bytes32 _commitment) public onlyTornadoProxy {
uint256 _depositsLength = depositsLength; uint256 _depositsLength = depositsLength;
deposits[_depositsLength] = keccak256(abi.encode(_instance, _commitment, blockNumber())); deposits[_depositsLength] = keccak256(abi.encode(_instance, _commitment, blockNumber()));
emit DepositData(_instance, _commitment, blockNumber(), _depositsLength); emit DepositData(_instance, _commitment, blockNumber(), _depositsLength);
depositsLength = _depositsLength + 1; depositsLength = _depositsLength + 1;
} }
function registerWithdrawal(address _instance, bytes32 _nullifierHash) external onlyTornadoProxy { function registerWithdrawal(address _instance, bytes32 _nullifierHash) public onlyTornadoProxy {
uint256 _withdrawalsLength = withdrawalsLength; uint256 _withdrawalsLength = withdrawalsLength;
withdrawals[_withdrawalsLength] = keccak256(abi.encode(_instance, _nullifierHash, blockNumber())); withdrawals[_withdrawalsLength] = keccak256(abi.encode(_instance, _nullifierHash, blockNumber()));
emit WithdrawalData(_instance, _nullifierHash, blockNumber(), _withdrawalsLength); emit WithdrawalData(_instance, _nullifierHash, blockNumber(), _withdrawalsLength);

View File

@ -37,12 +37,10 @@ contract TornadoTreesMock is TornadoTrees {
uint256 _withdrawBlockNumber uint256 _withdrawBlockNumber
) public { ) public {
setBlockNumber(_depositBlockNumber); setBlockNumber(_depositBlockNumber);
deposits[depositsLength] = keccak256(abi.encode(_instance, _commitment, blockNumber())); registerDeposit(_instance, _commitment);
depositsLength++;
setBlockNumber(_withdrawBlockNumber); setBlockNumber(_withdrawBlockNumber);
withdrawals[withdrawalsLength] = keccak256(abi.encode(_instance, _nullifier, blockNumber())); registerWithdrawal(_instance, _nullifier);
withdrawalsLength++;
} }
function updateDepositTreeMock( function updateDepositTreeMock(

View File

@ -24,6 +24,9 @@ const config = {
blockGasLimit: 950000000, blockGasLimit: 950000000,
}, },
}, },
mocha: {
timeout: 600000,
},
} }
if (process.env.NETWORK) { if (process.env.NETWORK) {

View File

@ -36,6 +36,7 @@ describe('TornadoTrees', function () {
let tornadoTrees let tornadoTrees
let tornadoTreesV1 let tornadoTreesV1
let notes let notes
let depositDataEventFilter
const depositEvents = [] const depositEvents = []
const withdrawalEvents = [] const withdrawalEvents = []
@ -77,6 +78,7 @@ describe('TornadoTrees', function () {
tornadoTreesV1.address, tornadoTreesV1.address,
verifier.address, verifier.address,
) )
depositDataEventFilter = tornadoTrees.filters.DepositData()
}) })
describe('#updateDepositTree', () => { describe('#updateDepositTree', () => {
@ -119,8 +121,7 @@ describe('TornadoTrees', function () {
let updatedRoot = await tornadoTrees.depositRoot() let updatedRoot = await tornadoTrees.depositRoot()
expect(updatedRoot).to.be.equal(tree.root()) expect(updatedRoot).to.be.equal(tree.root())
const filter = tornadoTrees.filters.DepositData() const migratedEvents = await tornadoTrees.queryFilter(depositDataEventFilter)
const migratedEvents = await tornadoTrees.queryFilter(filter)
migratedEvents.forEach((e, i) => { migratedEvents.forEach((e, i) => {
expect(e.args.index).to.be.equal(i) expect(e.args.index).to.be.equal(i)
}) })
@ -128,18 +129,72 @@ describe('TornadoTrees', function () {
for (let i = 0; i < notes.length; i++) { for (let i = 0; i < notes.length; i++) {
await register(notes[i], tornadoTrees, tornadoProxy) await register(notes[i], tornadoTrees, tornadoProxy)
} }
let registeredEvents = await tornadoTrees.queryFilter(filter) let registeredEvents = await tornadoTrees.queryFilter(depositDataEventFilter)
registeredEvents = registeredEvents.map((e) => ({ registeredEvents = registeredEvents.map((e) => ({
hash: toFixedHex(e.args.hash), hash: toFixedHex(e.args.hash),
instance: toFixedHex(e.args.instance, 20), instance: toFixedHex(e.args.instance, 20),
block: toFixedHex(e.args.block, 4), block: toFixedHex(e.args.block, 4),
})) }))
;({ input, args } = controller.batchTreeUpdate(tree, registeredEvents)) ;({ input, args } = controller.batchTreeUpdate(tree, registeredEvents.slice(0, 4)))
proof = await controller.prove(input, './artifacts/circuits/BatchTreeUpdate') proof = await controller.prove(input, './artifacts/circuits/BatchTreeUpdate')
await tornadoTrees.updateDepositTree(proof, ...args) await tornadoTrees.updateDepositTree(proof, ...args)
updatedRoot = await tornadoTrees.depositRoot() updatedRoot = await tornadoTrees.depositRoot()
expect(updatedRoot).to.be.equal(tree.root()) expect(updatedRoot).to.be.equal(tree.root())
}) })
// it('should work for batch+N filled v1 tree', async () => {
// for (let i = 4; i < 6; i++) {
// notes.push({
// instance: instances[i % instances.length],
// depositBlock: blocks[i % blocks.length],
// withdrawalBlock: 2 + i + i * 4 * 60 * 24,
// commitment: randomBN(),
// nullifierHash: randomBN(),
// })
// await register(notes[i], tornadoTreesV1, tornadoProxy)
// }
// const TornadoTrees = await ethers.getContractFactory('TornadoTreesMock')
// const newTornadoTrees = await TornadoTrees.deploy(
// operator.address,
// tornadoProxy.address,
// tornadoTreesV1.address,
// verifier.address,
// )
// let { input, args } = controller.batchTreeUpdate(tree, depositEvents)
// let proof = await controller.prove(input, './artifacts/circuits/BatchTreeUpdate')
// await newTornadoTrees.updateDepositTree(proof, ...args)
// let updatedRoot = await newTornadoTrees.depositRoot()
// expect(updatedRoot).to.be.equal(tree.root())
// // register 6 new deposits for the new trees
// for (let i = 0; i < notes.length; i++) {
// await register(notes[i], newTornadoTrees, tornadoProxy)
// }
// // get 2 events from v1 tress
// const events = notes.slice(4).map((note) => ({
// hash: toFixedHex(note.commitment),
// instance: toFixedHex(note.instance, 20),
// block: toFixedHex(note.depositBlock, 4),
// }))
// const registeredEvents = await newTornadoTrees.queryFilter(depositDataEventFilter)
// console.log('registeredEvents', JSON.stringify(registeredEvents, null, 2))
// // events = events.concat(
// // registeredEvents.slice(0, 2).map((e) => ({
// // hash: toFixedHex(e.args.hash),
// // instance: toFixedHex(e.args.instance, 20),
// // block: toFixedHex(e.args.block, 4),
// // })),
// // )
// // console.log('events', events)
// // ;({ input, args } = controller.batchTreeUpdate(tree, events))
// // proof = await controller.prove(input, './artifacts/circuits/BatchTreeUpdate')
// // await newTornadoTrees.updateDepositTree(proof, ...args)
// // updatedRoot = await newTornadoTrees.depositRoot()
// // expect(updatedRoot).to.be.equal(tree.root())
// })
it('should reject for partially filled tree') it('should reject for partially filled tree')
it('should reject for outdated deposit root') it('should reject for outdated deposit root')
it('should reject for incorrect insert index') it('should reject for incorrect insert index')