mirror of
https://github.com/tornadocash/tornado-core.git
synced 2024-12-25 06:19:22 -05:00
wip
This commit is contained in:
parent
77af0c5bdd
commit
3c4def1e64
@ -1,3 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// https://tornado.cash
|
||||
/*
|
||||
* d888888P dP a88888b. dP
|
||||
@ -9,7 +11,7 @@
|
||||
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
|
||||
*/
|
||||
|
||||
pragma solidity 0.5.17;
|
||||
pragma solidity 0.6.12;
|
||||
|
||||
import "./Tornado.sol";
|
||||
|
||||
@ -18,11 +20,11 @@ contract ERC20Tornado is Tornado {
|
||||
|
||||
constructor(
|
||||
IVerifier _verifier,
|
||||
Hasher _hasher,
|
||||
uint256 _denomination,
|
||||
uint32 _merkleTreeHeight,
|
||||
address _operator,
|
||||
address _token
|
||||
) Tornado(_verifier, _denomination, _merkleTreeHeight, _operator) public {
|
||||
) Tornado(_verifier, _hasher, _denomination, _merkleTreeHeight) public {
|
||||
token = _token;
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// https://tornado.cash
|
||||
/*
|
||||
* d888888P dP a88888b. dP
|
||||
@ -9,17 +12,17 @@
|
||||
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
|
||||
*/
|
||||
|
||||
pragma solidity 0.5.17;
|
||||
pragma solidity 0.6.12;
|
||||
|
||||
import "./Tornado.sol";
|
||||
|
||||
contract ETHTornado is Tornado {
|
||||
constructor(
|
||||
IVerifier _verifier,
|
||||
Hasher _hasher,
|
||||
uint256 _denomination,
|
||||
uint32 _merkleTreeHeight,
|
||||
address _operator
|
||||
) Tornado(_verifier, _denomination, _merkleTreeHeight, _operator) public {
|
||||
uint32 _merkleTreeHeight
|
||||
) Tornado(_verifier, _hasher, _denomination, _merkleTreeHeight) public {
|
||||
}
|
||||
|
||||
function _processDeposit() internal {
|
||||
|
@ -1,3 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// https://tornado.cash
|
||||
/*
|
||||
* d888888P dP a88888b. dP
|
||||
@ -9,9 +12,9 @@
|
||||
* 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);
|
||||
}
|
||||
|
||||
@ -29,12 +32,15 @@ contract MerkleTreeWithHistory {
|
||||
uint32 public nextIndex = 0;
|
||||
uint32 public constant ROOT_HISTORY_SIZE = 100;
|
||||
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 < 32, "_treeLevels should be less than 32");
|
||||
levels = _treeLevels;
|
||||
|
||||
hasher = _hasher;
|
||||
|
||||
bytes32 currentZero = bytes32(ZERO_VALUE);
|
||||
zeros.push(currentZero);
|
||||
filledSubtrees.push(currentZero);
|
||||
@ -56,9 +62,9 @@ contract MerkleTreeWithHistory {
|
||||
require(uint256(_right) < FIELD_SIZE, "_right should be inside the field");
|
||||
uint256 R = uint256(_left);
|
||||
uint256 C = 0;
|
||||
(R, C) = Hasher.MiMCSponge(R, C);
|
||||
(R, C) = hasher.MiMCSponge(R, C);
|
||||
R = addmod(R, uint256(_right), FIELD_SIZE);
|
||||
(R, C) = Hasher.MiMCSponge(R, C);
|
||||
(R, C) = hasher.MiMCSponge(R, C);
|
||||
return bytes32(R);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,6 @@
|
||||
pragma solidity >=0.4.21 <0.6.0;
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity 0.6.12;
|
||||
|
||||
contract Migrations {
|
||||
address public owner;
|
||||
|
@ -1,7 +1,9 @@
|
||||
pragma solidity ^0.5.0;
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity 0.6.12;
|
||||
|
||||
contract BadRecipient {
|
||||
function() external {
|
||||
fallback() external {
|
||||
require(false, "this contract does not accept ETH");
|
||||
}
|
||||
}
|
||||
|
@ -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/ERC20Mintable.sol";
|
||||
import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";
|
||||
|
||||
contract ERC20Mock is ERC20Detailed, ERC20Mintable {
|
||||
constructor() ERC20Detailed("DAIMock", "DAIM", 18) public {
|
||||
contract ERC20Mock is ERC20 {
|
||||
constructor() ERC20("DAIMock", "DAIM") public {
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
function totalSupply() public view returns (uint);
|
||||
function balanceOf(address who) public view returns (uint);
|
||||
function transfer(address to, uint value) public;
|
||||
function totalSupply() external view returns (uint);
|
||||
function balanceOf(address who) external view returns (uint);
|
||||
function transfer(address to, uint value) external;
|
||||
event Transfer(address indexed from, address indexed to, uint value);
|
||||
}
|
||||
|
||||
@ -12,9 +14,9 @@ contract ERC20Basic {
|
||||
* @title ERC20 interface
|
||||
* @dev see https://github.com/ethereum/EIPs/issues/20
|
||||
*/
|
||||
contract IUSDT is ERC20Basic {
|
||||
function allowance(address owner, address spender) public view returns (uint);
|
||||
function transferFrom(address from, address to, uint value) public;
|
||||
function approve(address spender, uint value) public;
|
||||
interface IUSDT is ERC20Basic {
|
||||
function allowance(address owner, address spender) external view returns (uint);
|
||||
function transferFrom(address from, address to, uint value) external;
|
||||
function approve(address spender, uint value) external;
|
||||
event Approval(address indexed owner, address indexed spender, uint value);
|
||||
}
|
||||
|
@ -1,10 +1,12 @@
|
||||
pragma solidity 0.5.17;
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity 0.6.12;
|
||||
|
||||
import '../MerkleTreeWithHistory.sol';
|
||||
|
||||
contract MerkleTreeWithHistoryMock is MerkleTreeWithHistory {
|
||||
|
||||
constructor (uint32 _treeLevels) MerkleTreeWithHistory(_treeLevels) public {}
|
||||
constructor (uint32 _treeLevels, Hasher _hasher) MerkleTreeWithHistory(_treeLevels, _hasher) public {}
|
||||
|
||||
function insert(bytes32 _leaf) public {
|
||||
_insert(_leaf);
|
||||
|
@ -1,3 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// https://tornado.cash
|
||||
/*
|
||||
* d888888P dP a88888b. dP
|
||||
@ -9,7 +11,7 @@
|
||||
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
|
||||
*/
|
||||
|
||||
pragma solidity 0.5.17;
|
||||
pragma solidity 0.6.12;
|
||||
|
||||
import "./MerkleTreeWithHistory.sol";
|
||||
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
|
||||
@ -23,7 +25,7 @@ contract Tornado is MerkleTreeWithHistory, ReentrancyGuard {
|
||||
mapping(bytes32 => bool) public nullifierHashes;
|
||||
// we store all commitments just to prevent accidental deposits with the same commitment
|
||||
mapping(bytes32 => bool) public commitments;
|
||||
IVerifier public verifier;
|
||||
IVerifier public immutable verifier;
|
||||
|
||||
// operator can update snark verification key
|
||||
// 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(
|
||||
IVerifier _verifier,
|
||||
Hasher _hasher,
|
||||
uint256 _denomination,
|
||||
uint32 _merkleTreeHeight,
|
||||
address _operator
|
||||
) MerkleTreeWithHistory(_merkleTreeHeight) public {
|
||||
uint32 _merkleTreeHeight
|
||||
) MerkleTreeWithHistory(_merkleTreeHeight, _hasher) public {
|
||||
require(_denomination > 0, "denomination should be greater than 0");
|
||||
verifier = _verifier;
|
||||
operator = _operator;
|
||||
denomination = _denomination;
|
||||
}
|
||||
|
||||
@ -70,7 +71,7 @@ contract Tornado is MerkleTreeWithHistory, ReentrancyGuard {
|
||||
}
|
||||
|
||||
/** @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
|
||||
@ -92,7 +93,7 @@ contract Tornado is MerkleTreeWithHistory, ReentrancyGuard {
|
||||
}
|
||||
|
||||
/** @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 */
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@openzeppelin/contracts": "^2.4.0",
|
||||
"@openzeppelin/contracts": "^3.4.0",
|
||||
"@truffle/contract": "^4.0.39",
|
||||
"@truffle/hdwallet-provider": "^1.0.24",
|
||||
"axios": "^0.19.0",
|
||||
|
@ -1,6 +1,6 @@
|
||||
require('dotenv').config()
|
||||
const HDWalletProvider = require('@truffle/hdwallet-provider')
|
||||
const utils = require('web3-utils')
|
||||
require("dotenv").config();
|
||||
const HDWalletProvider = require("@truffle/hdwallet-provider");
|
||||
const utils = require("web3-utils");
|
||||
// const infuraKey = "fj4jll3k.....";
|
||||
//
|
||||
// const fs = require('fs');
|
||||
@ -25,9 +25,9 @@ module.exports = {
|
||||
// options below to some value.
|
||||
|
||||
development: {
|
||||
host: '127.0.0.1', // Localhost (default: none)
|
||||
port: 8545, // Standard Ethereum port (default: none)
|
||||
network_id: '*', // Any network (default: none)
|
||||
host: "127.0.0.1", // Localhost (default: none)
|
||||
port: 8545, // Standard Ethereum port (default: none)
|
||||
network_id: "*", // Any network (default: none)
|
||||
},
|
||||
|
||||
// Another network with more advanced options...
|
||||
@ -43,31 +43,56 @@ module.exports = {
|
||||
// Useful for deploying to a public network.
|
||||
// NB: It's important to wrap the provider as a function.
|
||||
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,
|
||||
gas: 6000000,
|
||||
gasPrice: utils.toWei('1', 'gwei'),
|
||||
gasPrice: utils.toWei("1", "gwei"),
|
||||
// confirmations: 0,
|
||||
// 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: {
|
||||
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,
|
||||
gas: 6000000,
|
||||
gasPrice: utils.toWei('1', 'gwei'),
|
||||
gasPrice: utils.toWei("1", "gwei"),
|
||||
// confirmations: 0,
|
||||
// timeoutBlocks: 200,
|
||||
skipDryRun: true
|
||||
skipDryRun: true,
|
||||
},
|
||||
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,
|
||||
gas: 6000000,
|
||||
gasPrice: utils.toWei('2', 'gwei'),
|
||||
gasPrice: utils.toWei("2", "gwei"),
|
||||
// confirmations: 0,
|
||||
// timeoutBlocks: 200,
|
||||
skipDryRun: true
|
||||
skipDryRun: true,
|
||||
},
|
||||
|
||||
// Useful for private networks
|
||||
@ -86,21 +111,24 @@ module.exports = {
|
||||
// Configure your compilers
|
||||
compilers: {
|
||||
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)
|
||||
settings: { // See the solidity docs for advice about optimization and evmVersion
|
||||
settings: {
|
||||
// See the solidity docs for advice about optimization and evmVersion
|
||||
optimizer: {
|
||||
enabled: true,
|
||||
runs: 200
|
||||
runs: 200,
|
||||
},
|
||||
// evmVersion: "byzantium"
|
||||
}
|
||||
},
|
||||
},
|
||||
external: {
|
||||
command: 'node ./compileHasher.js',
|
||||
targets: [{
|
||||
path: './build/Hasher.json'
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
command: "node ./compileHasher.js",
|
||||
targets: [
|
||||
{
|
||||
path: "./build/Hasher.json",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user