mirror of
https://github.com/tornadocash/tornado-nova
synced 2024-02-02 14:53:56 +01:00
test for compliance
This commit is contained in:
parent
ecc3e6b0f5
commit
2a6fca70fa
@ -150,4 +150,4 @@ async function registerAndTransact({ tornadoPool, account, ...rest }) {
|
|||||||
await receipt.wait()
|
await receipt.wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { transaction, registerAndTransact, prepareTransaction }
|
module.exports = { transaction, registerAndTransact, prepareTransaction, buildMerkleTree }
|
||||||
|
@ -5,7 +5,8 @@ const { expect } = require('chai')
|
|||||||
const { utils } = ethers
|
const { utils } = ethers
|
||||||
|
|
||||||
const Utxo = require('../src/utxo')
|
const Utxo = require('../src/utxo')
|
||||||
const { transaction, registerAndTransact, prepareTransaction } = require('../src/index')
|
const { transaction, registerAndTransact, prepareTransaction, buildMerkleTree } = require('../src/index')
|
||||||
|
const { toFixedHex, poseidonHash } = require('../src/utils')
|
||||||
const { Keypair } = require('../src/keypair')
|
const { Keypair } = require('../src/keypair')
|
||||||
const { encodeDataForBridge } = require('./utils')
|
const { encodeDataForBridge } = require('./utils')
|
||||||
|
|
||||||
@ -336,4 +337,66 @@ describe('TornadoPool', function () {
|
|||||||
outputs: [aliceDepositUtxo],
|
outputs: [aliceDepositUtxo],
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should be compliant', async function () {
|
||||||
|
// basically verifier should check if a commitment and a nullifier hash are on chain
|
||||||
|
const { tornadoPool } = await loadFixture(fixture)
|
||||||
|
const aliceDepositAmount = utils.parseEther('0.07')
|
||||||
|
const aliceDepositUtxo = new Utxo({ amount: aliceDepositAmount })
|
||||||
|
const [sender] = await ethers.getSigners()
|
||||||
|
|
||||||
|
const { args, extData } = await prepareTransaction({
|
||||||
|
tornadoPool,
|
||||||
|
outputs: [aliceDepositUtxo],
|
||||||
|
})
|
||||||
|
const receipt = await tornadoPool.transact(args, extData, {
|
||||||
|
gasLimit: 2e6,
|
||||||
|
})
|
||||||
|
await receipt.wait()
|
||||||
|
|
||||||
|
// withdrawal
|
||||||
|
await transaction({
|
||||||
|
tornadoPool,
|
||||||
|
inputs: [aliceDepositUtxo],
|
||||||
|
outputs: [],
|
||||||
|
recipient: sender.address,
|
||||||
|
})
|
||||||
|
|
||||||
|
const tree = await buildMerkleTree({ tornadoPool })
|
||||||
|
const commitment = aliceDepositUtxo.getCommitment()
|
||||||
|
const index = tree.indexOf(toFixedHex(commitment)) // it's the same as merklePath and merklePathIndexes and index in the tree
|
||||||
|
aliceDepositUtxo.index = index
|
||||||
|
const nullifier = aliceDepositUtxo.getNullifier()
|
||||||
|
|
||||||
|
// commitment = hash(amount, pubKey, blinding)
|
||||||
|
// nullifier = hash(commitment, merklePath, sign(merklePath, privKey))
|
||||||
|
const dataForVerifier = {
|
||||||
|
commitment: {
|
||||||
|
amount: aliceDepositUtxo.amount,
|
||||||
|
pubkey: aliceDepositUtxo.keypair.pubkey,
|
||||||
|
blinding: aliceDepositUtxo.blinding,
|
||||||
|
},
|
||||||
|
nullifier: {
|
||||||
|
merklePath: index,
|
||||||
|
signature: aliceDepositUtxo.keypair.sign(index),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// generateReport(dataForVerifier) -> compliance report
|
||||||
|
// on the verifier side we compute commitment and nullifier and then check them onchain
|
||||||
|
const commitmentV = poseidonHash([...Object.values(dataForVerifier.commitment)])
|
||||||
|
const nullifierV = poseidonHash([
|
||||||
|
commitmentV,
|
||||||
|
dataForVerifier.nullifier.merklePath,
|
||||||
|
dataForVerifier.nullifier.signature,
|
||||||
|
])
|
||||||
|
|
||||||
|
expect(commitmentV).to.be.equal(commitment)
|
||||||
|
expect(nullifierV).to.be.equal(nullifier)
|
||||||
|
expect(await tornadoPool.nullifierHashes(nullifierV)).to.be.equal(true)
|
||||||
|
// expect commitmentV present onchain (it will be in NewCommitment events)
|
||||||
|
|
||||||
|
// in report we can see the tx with NewCommitment event (this is how alice got money)
|
||||||
|
// and the tx with NewNullifier event is where alice spent the UTXO
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user