This commit is contained in:
Roman Storm 2021-02-10 21:37:18 -08:00
parent 77af0c5bdd
commit 3c4def1e64
No known key found for this signature in database
GPG Key ID: 522F2A785F34E71F
12 changed files with 6724 additions and 78 deletions

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
// https://tornado.cash // https://tornado.cash
/* /*
* d888888P dP a88888b. dP * d888888P dP a88888b. dP
@ -9,7 +11,7 @@
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo * ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
*/ */
pragma solidity 0.5.17; pragma solidity 0.6.12;
import "./Tornado.sol"; import "./Tornado.sol";
@ -18,11 +20,11 @@ contract ERC20Tornado is Tornado {
constructor( constructor(
IVerifier _verifier, IVerifier _verifier,
Hasher _hasher,
uint256 _denomination, uint256 _denomination,
uint32 _merkleTreeHeight, uint32 _merkleTreeHeight,
address _operator,
address _token address _token
) Tornado(_verifier, _denomination, _merkleTreeHeight, _operator) public { ) Tornado(_verifier, _hasher, _denomination, _merkleTreeHeight) public {
token = _token; token = _token;
} }

View File

@ -1,3 +1,6 @@
// SPDX-License-Identifier: MIT
// SPDX-License-Identifier: MIT
// https://tornado.cash // https://tornado.cash
/* /*
* d888888P dP a88888b. dP * d888888P dP a88888b. dP
@ -9,17 +12,17 @@
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo * ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
*/ */
pragma solidity 0.5.17; pragma solidity 0.6.12;
import "./Tornado.sol"; import "./Tornado.sol";
contract ETHTornado is Tornado { contract ETHTornado is Tornado {
constructor( constructor(
IVerifier _verifier, IVerifier _verifier,
Hasher _hasher,
uint256 _denomination, uint256 _denomination,
uint32 _merkleTreeHeight, uint32 _merkleTreeHeight
address _operator ) Tornado(_verifier, _hasher, _denomination, _merkleTreeHeight) public {
) Tornado(_verifier, _denomination, _merkleTreeHeight, _operator) public {
} }
function _processDeposit() internal { function _processDeposit() internal {

View File

@ -1,3 +1,6 @@
// SPDX-License-Identifier: MIT
// SPDX-License-Identifier: MIT
// https://tornado.cash // https://tornado.cash
/* /*
* d888888P dP a88888b. dP * d888888P dP a88888b. dP
@ -9,9 +12,9 @@
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo * ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
*/ */
pragma solidity 0.5.17; pragma solidity 0.6.12;
library Hasher { interface Hasher {
function MiMCSponge(uint256 in_xL, uint256 in_xR) public pure returns (uint256 xL, uint256 xR); function MiMCSponge(uint256 in_xL, uint256 in_xR) public pure returns (uint256 xL, uint256 xR);
} }
@ -29,12 +32,15 @@ contract MerkleTreeWithHistory {
uint32 public nextIndex = 0; uint32 public nextIndex = 0;
uint32 public constant ROOT_HISTORY_SIZE = 100; uint32 public constant ROOT_HISTORY_SIZE = 100;
bytes32[ROOT_HISTORY_SIZE] public roots; bytes32[ROOT_HISTORY_SIZE] public roots;
Hasher public immutable hasher;
constructor(uint32 _treeLevels) public { constructor(uint32 _treeLevels, Hasher _hasher) public {
require(_treeLevels > 0, "_treeLevels should be greater than zero"); require(_treeLevels > 0, "_treeLevels should be greater than zero");
require(_treeLevels < 32, "_treeLevels should be less than 32"); require(_treeLevels < 32, "_treeLevels should be less than 32");
levels = _treeLevels; levels = _treeLevels;
hasher = _hasher;
bytes32 currentZero = bytes32(ZERO_VALUE); bytes32 currentZero = bytes32(ZERO_VALUE);
zeros.push(currentZero); zeros.push(currentZero);
filledSubtrees.push(currentZero); filledSubtrees.push(currentZero);
@ -56,9 +62,9 @@ contract MerkleTreeWithHistory {
require(uint256(_right) < FIELD_SIZE, "_right should be inside the field"); require(uint256(_right) < FIELD_SIZE, "_right should be inside the field");
uint256 R = uint256(_left); uint256 R = uint256(_left);
uint256 C = 0; uint256 C = 0;
(R, C) = Hasher.MiMCSponge(R, C); (R, C) = hasher.MiMCSponge(R, C);
R = addmod(R, uint256(_right), FIELD_SIZE); R = addmod(R, uint256(_right), FIELD_SIZE);
(R, C) = Hasher.MiMCSponge(R, C); (R, C) = hasher.MiMCSponge(R, C);
return bytes32(R); return bytes32(R);
} }

View File

@ -1,4 +1,6 @@
pragma solidity >=0.4.21 <0.6.0; // SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
contract Migrations { contract Migrations {
address public owner; address public owner;

View File

@ -1,7 +1,9 @@
pragma solidity ^0.5.0; // SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
contract BadRecipient { contract BadRecipient {
function() external { fallback() external {
require(false, "this contract does not accept ETH"); require(false, "this contract does not accept ETH");
} }
} }

View File

@ -1,10 +1,10 @@
pragma solidity ^0.5.0; // SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Mintable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";
contract ERC20Mock is ERC20Detailed, ERC20Mintable { contract ERC20Mock is ERC20 {
constructor() ERC20Detailed("DAIMock", "DAIM", 18) public { constructor() ERC20("DAIMock", "DAIM") public {
} }
} }

View File

@ -1,10 +1,12 @@
pragma solidity 0.5.17; // SPDX-License-Identifier: MIT
contract ERC20Basic { pragma solidity 0.6.12;
interface ERC20Basic {
uint public _totalSupply; uint public _totalSupply;
function totalSupply() public view returns (uint); function totalSupply() external view returns (uint);
function balanceOf(address who) public view returns (uint); function balanceOf(address who) external view returns (uint);
function transfer(address to, uint value) public; function transfer(address to, uint value) external;
event Transfer(address indexed from, address indexed to, uint value); event Transfer(address indexed from, address indexed to, uint value);
} }
@ -12,9 +14,9 @@ contract ERC20Basic {
* @title ERC20 interface * @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20 * @dev see https://github.com/ethereum/EIPs/issues/20
*/ */
contract IUSDT is ERC20Basic { interface IUSDT is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint); function allowance(address owner, address spender) external view returns (uint);
function transferFrom(address from, address to, uint value) public; function transferFrom(address from, address to, uint value) external;
function approve(address spender, uint value) public; function approve(address spender, uint value) external;
event Approval(address indexed owner, address indexed spender, uint value); event Approval(address indexed owner, address indexed spender, uint value);
} }

View File

@ -1,10 +1,12 @@
pragma solidity 0.5.17; // SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import '../MerkleTreeWithHistory.sol'; import '../MerkleTreeWithHistory.sol';
contract MerkleTreeWithHistoryMock is MerkleTreeWithHistory { contract MerkleTreeWithHistoryMock is MerkleTreeWithHistory {
constructor (uint32 _treeLevels) MerkleTreeWithHistory(_treeLevels) public {} constructor (uint32 _treeLevels, Hasher _hasher) MerkleTreeWithHistory(_treeLevels, _hasher) public {}
function insert(bytes32 _leaf) public { function insert(bytes32 _leaf) public {
_insert(_leaf); _insert(_leaf);

View File

@ -1,3 +1,5 @@
// SPDX-License-Identifier: MIT
// https://tornado.cash // https://tornado.cash
/* /*
* d888888P dP a88888b. dP * d888888P dP a88888b. dP
@ -9,7 +11,7 @@
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo * ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
*/ */
pragma solidity 0.5.17; pragma solidity 0.6.12;
import "./MerkleTreeWithHistory.sol"; import "./MerkleTreeWithHistory.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
@ -23,7 +25,7 @@ contract Tornado is MerkleTreeWithHistory, ReentrancyGuard {
mapping(bytes32 => bool) public nullifierHashes; mapping(bytes32 => bool) public nullifierHashes;
// we store all commitments just to prevent accidental deposits with the same commitment // we store all commitments just to prevent accidental deposits with the same commitment
mapping(bytes32 => bool) public commitments; mapping(bytes32 => bool) public commitments;
IVerifier public verifier; IVerifier public immutable verifier;
// operator can update snark verification key // operator can update snark verification key
// after the final trusted setup ceremony operator rights are supposed to be transferred to zero address // after the final trusted setup ceremony operator rights are supposed to be transferred to zero address
@ -45,13 +47,12 @@ contract Tornado is MerkleTreeWithHistory, ReentrancyGuard {
*/ */
constructor( constructor(
IVerifier _verifier, IVerifier _verifier,
Hasher _hasher,
uint256 _denomination, uint256 _denomination,
uint32 _merkleTreeHeight, uint32 _merkleTreeHeight
address _operator ) MerkleTreeWithHistory(_merkleTreeHeight, _hasher) public {
) MerkleTreeWithHistory(_merkleTreeHeight) public {
require(_denomination > 0, "denomination should be greater than 0"); require(_denomination > 0, "denomination should be greater than 0");
verifier = _verifier; verifier = _verifier;
operator = _operator;
denomination = _denomination; denomination = _denomination;
} }
@ -70,7 +71,7 @@ contract Tornado is MerkleTreeWithHistory, ReentrancyGuard {
} }
/** @dev this function is defined in a child contract */ /** @dev this function is defined in a child contract */
function _processDeposit() internal; function _processDeposit() internal virtual;
/** /**
@dev Withdraw a deposit from the contract. `proof` is a zkSNARK proof data, and input is an array of circuit public inputs @dev Withdraw a deposit from the contract. `proof` is a zkSNARK proof data, and input is an array of circuit public inputs
@ -92,7 +93,7 @@ contract Tornado is MerkleTreeWithHistory, ReentrancyGuard {
} }
/** @dev this function is defined in a child contract */ /** @dev this function is defined in a child contract */
function _processWithdraw(address payable _recipient, address payable _relayer, uint256 _fee, uint256 _refund) internal; function _processWithdraw(address payable _recipient, address payable _relayer, uint256 _fee, uint256 _refund) internal virtual;
/** @dev whether a note is already spent */ /** @dev whether a note is already spent */
function isSpent(bytes32 _nullifierHash) public view returns(bool) { function isSpent(bytes32 _nullifierHash) public view returns(bool) {
@ -109,16 +110,4 @@ contract Tornado is MerkleTreeWithHistory, ReentrancyGuard {
} }
} }
/**
@dev allow operator to update SNARK verification keys. This is needed to update keys after the final trusted setup ceremony is held.
After that operator rights are supposed to be transferred to zero address
*/
function updateVerifier(address _newVerifier) external onlyOperator {
verifier = IVerifier(_newVerifier);
}
/** @dev operator can change his address */
function changeOperator(address _newOperator) external onlyOperator {
operator = _newOperator;
}
} }

View File

@ -27,7 +27,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@openzeppelin/contracts": "^2.4.0", "@openzeppelin/contracts": "^3.4.0",
"@truffle/contract": "^4.0.39", "@truffle/contract": "^4.0.39",
"@truffle/hdwallet-provider": "^1.0.24", "@truffle/hdwallet-provider": "^1.0.24",
"axios": "^0.19.0", "axios": "^0.19.0",

View File

@ -1,6 +1,6 @@
require('dotenv').config() require("dotenv").config();
const HDWalletProvider = require('@truffle/hdwallet-provider') const HDWalletProvider = require("@truffle/hdwallet-provider");
const utils = require('web3-utils') const utils = require("web3-utils");
// const infuraKey = "fj4jll3k....."; // const infuraKey = "fj4jll3k.....";
// //
// const fs = require('fs'); // const fs = require('fs');
@ -25,9 +25,9 @@ module.exports = {
// options below to some value. // options below to some value.
development: { development: {
host: '127.0.0.1', // Localhost (default: none) host: "127.0.0.1", // Localhost (default: none)
port: 8545, // Standard Ethereum port (default: none) port: 8545, // Standard Ethereum port (default: none)
network_id: '*', // Any network (default: none) network_id: "*", // Any network (default: none)
}, },
// Another network with more advanced options... // Another network with more advanced options...
@ -43,31 +43,56 @@ module.exports = {
// Useful for deploying to a public network. // Useful for deploying to a public network.
// NB: It's important to wrap the provider as a function. // NB: It's important to wrap the provider as a function.
kovan: { kovan: {
provider: () => new HDWalletProvider(process.env.PRIVATE_KEY, 'https://kovan.infura.io/v3/97c8bf358b9942a9853fab1ba93dc5b3'), provider: () =>
new HDWalletProvider(
process.env.PRIVATE_KEY,
"https://kovan.infura.io/v3/97c8bf358b9942a9853fab1ba93dc5b3"
),
network_id: 42, network_id: 42,
gas: 6000000, gas: 6000000,
gasPrice: utils.toWei('1', 'gwei'), gasPrice: utils.toWei("1", "gwei"),
// confirmations: 0, // confirmations: 0,
// timeoutBlocks: 200, // timeoutBlocks: 200,
skipDryRun: true skipDryRun: true,
},
goerli: {
provider: () =>
new HDWalletProvider(
process.env.PRIVATE_KEY,
"https://goerli.infura.io/v3/d34c08f2cb7c4111b645d06ac7e35ba8"
),
network_id: 5,
gas: 6000000,
gasPrice: utils.toWei("1", "gwei"),
// confirmations: 0,
// timeoutBlocks: 200,
skipDryRun: true,
}, },
rinkeby: { rinkeby: {
provider: () => new HDWalletProvider(process.env.PRIVATE_KEY, 'https://rinkeby.infura.io/v3/97c8bf358b9942a9853fab1ba93dc5b3'), provider: () =>
new HDWalletProvider(
process.env.PRIVATE_KEY,
"https://rinkeby.infura.io/v3/97c8bf358b9942a9853fab1ba93dc5b3"
),
network_id: 4, network_id: 4,
gas: 6000000, gas: 6000000,
gasPrice: utils.toWei('1', 'gwei'), gasPrice: utils.toWei("1", "gwei"),
// confirmations: 0, // confirmations: 0,
// timeoutBlocks: 200, // timeoutBlocks: 200,
skipDryRun: true skipDryRun: true,
}, },
mainnet: { mainnet: {
provider: () => new HDWalletProvider(process.env.PRIVATE_KEY, 'http://ethereum-rpc.trustwalletapp.com'), provider: () =>
new HDWalletProvider(
process.env.PRIVATE_KEY,
"http://ethereum-rpc.trustwalletapp.com"
),
network_id: 1, network_id: 1,
gas: 6000000, gas: 6000000,
gasPrice: utils.toWei('2', 'gwei'), gasPrice: utils.toWei("2", "gwei"),
// confirmations: 0, // confirmations: 0,
// timeoutBlocks: 200, // timeoutBlocks: 200,
skipDryRun: true skipDryRun: true,
}, },
// Useful for private networks // Useful for private networks
@ -86,21 +111,24 @@ module.exports = {
// Configure your compilers // Configure your compilers
compilers: { compilers: {
solc: { solc: {
version: '0.5.17', // Fetch exact version from solc-bin (default: truffle's version) version: "0.6.12", // Fetch exact version from solc-bin (default: truffle's version)
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false) // docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
settings: { // See the solidity docs for advice about optimization and evmVersion settings: {
// See the solidity docs for advice about optimization and evmVersion
optimizer: { optimizer: {
enabled: true, enabled: true,
runs: 200 runs: 200,
}, },
// evmVersion: "byzantium" // evmVersion: "byzantium"
} },
}, },
external: { external: {
command: 'node ./compileHasher.js', command: "node ./compileHasher.js",
targets: [{ targets: [
path: './build/Hasher.json' {
}] path: "./build/Hasher.json",
} },
} ],
} },
},
};

6610
yarn.lock Normal file

File diff suppressed because it is too large Load Diff