diff --git a/README.md b/README.md index 99de881..1df16ab 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,7 @@ You can see example usage in cli.js, it works both in console and in browser. 1. `npm install` 1. `cp .env.example .env` -1. `npm run build:circuit` - this may take 10 minutes or more -1. `npm run build:contract` -1. `npm run browserify` +1. `npm run build` - this may take 10 minutes or more 1. `npx ganache-cli` 1. `npm run test` - optionally run tests. It may fail for the first time, just run one more time. diff --git a/contracts/ERC20Mixer.sol b/contracts/ERC20Mixer.sol index 9ba94db..5941f0e 100644 --- a/contracts/ERC20Mixer.sol +++ b/contracts/ERC20Mixer.sol @@ -18,11 +18,11 @@ contract ERC20Mixer is Mixer { constructor( address _verifier, + uint256 _denomination, uint8 _merkleTreeHeight, uint256 _emptyElement, address payable _operator, - address _token, - uint256 _denomination + address _token ) Mixer(_verifier, _denomination, _merkleTreeHeight, _emptyElement, _operator) public { token = _token; } diff --git a/migrations/5_deploy_erc20_mixer.js b/migrations/5_deploy_erc20_mixer.js index d71b920..d16e5f4 100644 --- a/migrations/5_deploy_erc20_mixer.js +++ b/migrations/5_deploy_erc20_mixer.js @@ -20,11 +20,11 @@ module.exports = function(deployer, network, accounts) { const mixer = await deployer.deploy( ERC20Mixer, verifier.address, + TOKEN_AMOUNT, MERKLE_TREE_HEIGHT, EMPTY_ELEMENT, accounts[0], token, - TOKEN_AMOUNT ) console.log('ERC20Mixer\'s address ', mixer.address) }) diff --git a/test/ERC20Mixer.test.js b/test/ERC20Mixer.test.js index c6b9048..e244017 100644 --- a/test/ERC20Mixer.test.js +++ b/test/ERC20Mixer.test.js @@ -52,11 +52,11 @@ contract('ERC20Mixer', accounts => { const levels = MERKLE_TREE_HEIGHT || 16 const zeroValue = EMPTY_ELEMENT || 1337 let tokenDenomination = TOKEN_AMOUNT || '1000000000000000000' // 1 ether - const value = ETH_AMOUNT || '1000000000000000000' // 1 ether let snapshotId let prefix = 'test' let tree const fee = bigInt(ETH_AMOUNT).shr(1) || bigInt(1e17) + const refund = ETH_AMOUNT || '1000000000000000000' // 1 ether const receiver = getRandomReceiver() const relayer = accounts[1] let groth16 @@ -96,7 +96,7 @@ contract('ERC20Mixer', accounts => { const commitment = 43 await token.approve(mixer.address, tokenDenomination) - let { logs } = await mixer.deposit(commitment, { value, from: sender }) + let { logs } = await mixer.deposit(commitment, { from: sender }) logs[0].event.should.be.equal('Deposit') logs[0].args.commitment.should.be.eq.BN(toBN(commitment)) @@ -114,9 +114,9 @@ contract('ERC20Mixer', accounts => { const balanceUserBefore = await token.balanceOf(user) await token.approve(mixer.address, tokenDenomination, { from: user }) // Uncomment to measure gas usage - // let gas = await mixer.deposit.estimateGas(toBN(deposit.commitment.toString()), { value, from: user, gasPrice: '0' }) + // let gas = await mixer.deposit.estimateGas(toBN(deposit.commitment.toString()), { from: user, gasPrice: '0' }) // console.log('deposit gas:', gas) - await mixer.deposit(toBN(deposit.commitment.toString()), { value, from: user, gasPrice: '0' }) + await mixer.deposit(toBN(deposit.commitment.toString()), { from: user, gasPrice: '0' }) const balanceUserAfter = await token.balanceOf(user) balanceUserAfter.should.be.eq.BN(toBN(balanceUserBefore).sub(toBN(tokenDenomination))) @@ -130,6 +130,7 @@ contract('ERC20Mixer', accounts => { relayer, receiver, fee, + refund, // private nullifier: deposit.nullifier, @@ -152,7 +153,7 @@ contract('ERC20Mixer', accounts => { // Uncomment to measure gas usage // gas = await mixer.withdraw.estimateGas(proof, publicSignals, { from: relayer, gasPrice: '0' }) // console.log('withdraw gas:', gas) - const { logs } = await mixer.withdraw(proof, publicSignals, { from: relayer, gasPrice: '0' }) + const { logs } = await mixer.withdraw(proof, publicSignals, { value: refund, from: relayer, gasPrice: '0' }) const balanceMixerAfter = await token.balanceOf(mixer.address) const balanceRelayerAfter = await token.balanceOf(relayer) @@ -164,7 +165,7 @@ contract('ERC20Mixer', accounts => { balanceRelayerAfter.should.be.eq.BN(toBN(balanceRelayerBefore).add(feeBN)) ethBalanceOperatorAfter.should.be.eq.BN(toBN(ethBalanceOperatorBefore)) balanceRecieverAfter.should.be.eq.BN(toBN(balanceRecieverBefore).add(toBN(tokenDenomination).sub(feeBN))) - ethBalanceRecieverAfter.should.be.eq.BN(toBN(ethBalanceRecieverBefore).add(toBN(value))) + ethBalanceRecieverAfter.should.be.eq.BN(toBN(ethBalanceRecieverBefore).add(toBN(refund))) logs[0].event.should.be.equal('Withdraw') logs[0].args.nullifierHash.should.be.eq.BN(toBN(input.nullifierHash.toString())) @@ -196,7 +197,7 @@ contract('ERC20Mixer', accounts => { console.log('approve done') const allowanceUser = await usdtToken.allowance(user, mixer.address) console.log('allowanceUser', allowanceUser.toString()) - await mixer.deposit(toBN(deposit.commitment.toString()), { value, from: user, gasPrice: '0' }) + await mixer.deposit(toBN(deposit.commitment.toString()), { from: user, gasPrice: '0' }) console.log('deposit done') const balanceUserAfter = await usdtToken.balanceOf(user) @@ -212,6 +213,7 @@ contract('ERC20Mixer', accounts => { relayer: operator, receiver, fee, + refund, // private nullifier: deposit.nullifier, @@ -235,7 +237,7 @@ contract('ERC20Mixer', accounts => { // Uncomment to measure gas usage // gas = await mixer.withdraw.estimateGas(proof, publicSignals, { from: relayer, gasPrice: '0' }) // console.log('withdraw gas:', gas) - const { logs } = await mixer.withdraw(proof, publicSignals, { from: relayer, gasPrice: '0' }) + const { logs } = await mixer.withdraw(proof, publicSignals, { value: refund, from: relayer, gasPrice: '0' }) const balanceMixerAfter = await usdtToken.balanceOf(mixer.address) const balanceRelayerAfter = await usdtToken.balanceOf(relayer) @@ -247,7 +249,7 @@ contract('ERC20Mixer', accounts => { balanceRelayerAfter.should.be.eq.BN(toBN(balanceRelayerBefore)) ethBalanceOperatorAfter.should.be.eq.BN(toBN(ethBalanceOperatorBefore).add(feeBN)) balanceRecieverAfter.should.be.eq.BN(toBN(balanceRecieverBefore).add(toBN(tokenDenomination))) - ethBalanceRecieverAfter.should.be.eq.BN(toBN(ethBalanceRecieverBefore).add(toBN(value)).sub(feeBN)) + ethBalanceRecieverAfter.should.be.eq.BN(toBN(ethBalanceRecieverBefore).add(toBN(refund)).sub(feeBN)) logs[0].event.should.be.equal('Withdraw') @@ -276,7 +278,7 @@ contract('ERC20Mixer', accounts => { console.log('balanceUserBefore', balanceUserBefore.toString()) await token.approve(mixer.address, tokenDenomination, { from: user }) console.log('approve done') - await mixer.deposit(toBN(deposit.commitment.toString()), { value, from: user, gasPrice: '0' }) + await mixer.deposit(toBN(deposit.commitment.toString()), { from: user, gasPrice: '0' }) console.log('deposit done') const balanceUserAfter = await token.balanceOf(user) @@ -292,6 +294,7 @@ contract('ERC20Mixer', accounts => { relayer: operator, receiver, fee, + refund, // private nullifier: deposit.nullifier, @@ -315,7 +318,7 @@ contract('ERC20Mixer', accounts => { // Uncomment to measure gas usage // gas = await mixer.withdraw.estimateGas(proof, publicSignals, { from: relayer, gasPrice: '0' }) // console.log('withdraw gas:', gas) - const { logs } = await mixer.withdraw(proof, publicSignals, { from: relayer, gasPrice: '0' }) + const { logs } = await mixer.withdraw(proof, publicSignals, { value: refund, from: relayer, gasPrice: '0' }) console.log('withdraw done') const balanceMixerAfter = await token.balanceOf(mixer.address) @@ -328,7 +331,7 @@ contract('ERC20Mixer', accounts => { balanceRelayerAfter.should.be.eq.BN(toBN(balanceRelayerBefore)) ethBalanceOperatorAfter.should.be.eq.BN(toBN(ethBalanceOperatorBefore).add(feeBN)) balanceRecieverAfter.should.be.eq.BN(toBN(balanceRecieverBefore).add(toBN(tokenDenomination))) - ethBalanceRecieverAfter.should.be.eq.BN(toBN(ethBalanceRecieverBefore).add(toBN(value)).sub(feeBN)) + ethBalanceRecieverAfter.should.be.eq.BN(toBN(ethBalanceRecieverBefore).add(toBN(refund)).sub(feeBN)) logs[0].event.should.be.equal('Withdraw') diff --git a/test/ETHMixer.test.js b/test/ETHMixer.test.js index affc2c9..ef4ff66 100644 --- a/test/ETHMixer.test.js +++ b/test/ETHMixer.test.js @@ -68,6 +68,7 @@ contract('ETHMixer', accounts => { let prefix = 'test' let tree const fee = bigInt(ETH_AMOUNT).shr(1) || bigInt(1e17) + const refund = bigInt(0) const receiver = getRandomReceiver() const relayer = accounts[1] let groth16 @@ -144,6 +145,7 @@ contract('ETHMixer', accounts => { relayer: operator, receiver, fee, + refund, secret: deposit.secret, pathElements: path_elements, pathIndex: path_index, @@ -200,6 +202,7 @@ contract('ETHMixer', accounts => { relayer: operator, receiver, fee, + refund, // private nullifier: deposit.nullifier, @@ -257,6 +260,7 @@ contract('ETHMixer', accounts => { relayer: operator, receiver, fee, + refund, secret: deposit.secret, pathElements: path_elements, pathIndex: path_index, @@ -282,6 +286,7 @@ contract('ETHMixer', accounts => { relayer: operator, receiver, fee, + refund, secret: deposit.secret, pathElements: path_elements, pathIndex: path_index, @@ -307,6 +312,7 @@ contract('ETHMixer', accounts => { relayer: operator, receiver, fee: oneEtherFee, + refund, secret: deposit.secret, pathElements: path_elements, pathIndex: path_index, @@ -332,6 +338,7 @@ contract('ETHMixer', accounts => { relayer: operator, receiver, fee, + refund, secret: deposit.secret, pathElements: path_elements, pathIndex: path_index, @@ -360,6 +367,7 @@ contract('ETHMixer', accounts => { relayer: operator, receiver, fee, + refund, secret: deposit.secret, pathElements: path_elements, pathIndex: path_index,