mirror of
https://github.com/tornadocash/tornado-nova
synced 2024-02-02 14:53:56 +01:00
encode fix
This commit is contained in:
parent
995302bd77
commit
6fa861ce8f
@ -27,8 +27,8 @@ Check config.js for actual values.
|
|||||||
|
|
||||||
With `salt` = `0x0000000000000000000000000000000000000000000000000000000047941987` addresses must be:
|
With `salt` = `0x0000000000000000000000000000000000000000000000000000000047941987` addresses must be:
|
||||||
|
|
||||||
1. `L1Unwrapper` - `0x095f741D37DfB3C798327377467eD40EE21b3B24`
|
1. `L1Unwrapper` - `0x3F615bA21Bc6Cc5D4a6D798c5950cc5c42937fbd`
|
||||||
2. `TornadoPool` - `0x85a3C2E4f0FcD4e881e0a3D1078496660C74bb35`
|
2. `TornadoPool` - `0x0CDD3705aF7979fBe80A64288Ebf8A9Fe1151cE1`
|
||||||
|
|
||||||
Check addresses with current config:
|
Check addresses with current config:
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ module.exports = {
|
|||||||
hasher: '0x94c92f096437ab9958fc0a37f09348f30389ae79',
|
hasher: '0x94c92f096437ab9958fc0a37f09348f30389ae79',
|
||||||
gcWeth: '0x6a023ccd1ff6f2045c3309768ead9e68f978f6e1',
|
gcWeth: '0x6a023ccd1ff6f2045c3309768ead9e68f978f6e1',
|
||||||
gcOmniBridge: '0xf6a78083ca3e2a662d6dd1703c939c8ace2e268d',
|
gcOmniBridge: '0xf6a78083ca3e2a662d6dd1703c939c8ace2e268d',
|
||||||
l1Unwrapper: '0x095f741D37DfB3C798327377467eD40EE21b3B24',
|
l1Unwrapper: '0x3F615bA21Bc6Cc5D4a6D798c5950cc5c42937fbd',
|
||||||
govAddress: '0x5efda50f22d34f262c29268506c5fa42cb56a1ce',
|
govAddress: '0x5efda50f22d34f262c29268506c5fa42cb56a1ce',
|
||||||
l1ChainId: 1,
|
l1ChainId: 1,
|
||||||
gcMultisig: '0x1f727de610030a88863d7da45bdea4eb84655b52',
|
gcMultisig: '0x1f727de610030a88863d7da45bdea4eb84655b52',
|
||||||
|
@ -35,7 +35,7 @@ contract TornadoPool is MerkleTreeWithHistory, IERC20Receiver, ReentrancyGuard,
|
|||||||
address public immutable multisig;
|
address public immutable multisig;
|
||||||
|
|
||||||
uint256 public lastBalance;
|
uint256 public lastBalance;
|
||||||
uint256 public minimalWithdrawalAmount;
|
uint256 public __gap; // storage padding to prevent storage collision
|
||||||
uint256 public maximumDepositAmount;
|
uint256 public maximumDepositAmount;
|
||||||
mapping(bytes32 => bool) public nullifierHashes;
|
mapping(bytes32 => bool) public nullifierHashes;
|
||||||
|
|
||||||
@ -109,8 +109,8 @@ contract TornadoPool is MerkleTreeWithHistory, IERC20Receiver, ReentrancyGuard,
|
|||||||
multisig = _multisig;
|
multisig = _multisig;
|
||||||
}
|
}
|
||||||
|
|
||||||
function initialize(uint256 _minimalWithdrawalAmount, uint256 _maximumDepositAmount) external initializer {
|
function initialize(uint256 _maximumDepositAmount) external initializer {
|
||||||
_configureLimits(_minimalWithdrawalAmount, _maximumDepositAmount);
|
_configureLimits(_maximumDepositAmount);
|
||||||
super._initialize();
|
super._initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,8 +188,8 @@ contract TornadoPool is MerkleTreeWithHistory, IERC20Receiver, ReentrancyGuard,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function configureLimits(uint256 _minimalWithdrawalAmount, uint256 _maximumDepositAmount) public onlyMultisig {
|
function configureLimits(uint256 _maximumDepositAmount) public onlyMultisig {
|
||||||
_configureLimits(_minimalWithdrawalAmount, _maximumDepositAmount);
|
_configureLimits(_maximumDepositAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
function calculatePublicAmount(int256 _extAmount, uint256 _fee) public pure returns (uint256) {
|
function calculatePublicAmount(int256 _extAmount, uint256 _fee) public pure returns (uint256) {
|
||||||
@ -275,12 +275,11 @@ contract TornadoPool is MerkleTreeWithHistory, IERC20Receiver, ReentrancyGuard,
|
|||||||
token.transferAndCall(
|
token.transferAndCall(
|
||||||
omniBridge,
|
omniBridge,
|
||||||
uint256(-_extData.extAmount),
|
uint256(-_extData.extAmount),
|
||||||
abi.encodePacked(l1Unwrapper, _extData.recipient, _extData.l1Fee)
|
abi.encodePacked(l1Unwrapper, abi.encode(_extData.recipient, _extData.l1Fee))
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
token.transfer(_extData.recipient, uint256(-_extData.extAmount));
|
token.transfer(_extData.recipient, uint256(-_extData.extAmount));
|
||||||
}
|
}
|
||||||
require(uint256(-_extData.extAmount) >= minimalWithdrawalAmount, "amount is less than minimalWithdrawalAmount"); // prevents ddos attack to Bridge
|
|
||||||
}
|
}
|
||||||
if (_extData.fee > 0) {
|
if (_extData.fee > 0) {
|
||||||
token.transfer(_extData.relayer, _extData.fee);
|
token.transfer(_extData.relayer, _extData.fee);
|
||||||
@ -295,9 +294,7 @@ contract TornadoPool is MerkleTreeWithHistory, IERC20Receiver, ReentrancyGuard,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _configureLimits(uint256 _minimalWithdrawalAmount, uint256 _maximumDepositAmount) internal {
|
function _configureLimits(uint256 _maximumDepositAmount) internal {
|
||||||
require(_minimalWithdrawalAmount <= MIN_EXT_AMOUNT_LIMIT, "minimalWithdrawal over limit");
|
|
||||||
minimalWithdrawalAmount = _minimalWithdrawalAmount;
|
|
||||||
maximumDepositAmount = _maximumDepositAmount;
|
maximumDepositAmount = _maximumDepositAmount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@ pragma abicoder v2;
|
|||||||
|
|
||||||
import "omnibridge/contracts/helpers/WETHOmnibridgeRouter.sol";
|
import "omnibridge/contracts/helpers/WETHOmnibridgeRouter.sol";
|
||||||
import "@openzeppelin/contracts/math/SafeMath.sol";
|
import "@openzeppelin/contracts/math/SafeMath.sol";
|
||||||
import { BytesHelper } from "../libraries/Bytes.sol";
|
|
||||||
|
|
||||||
/// @dev Extension for original WETHOmnibridgeRouter that stores TornadoPool account registrations.
|
/// @dev Extension for original WETHOmnibridgeRouter that stores TornadoPool account registrations.
|
||||||
contract L1Unwrapper is WETHOmnibridgeRouter {
|
contract L1Unwrapper is WETHOmnibridgeRouter {
|
||||||
@ -88,17 +87,19 @@ contract L1Unwrapper is WETHOmnibridgeRouter {
|
|||||||
) external override {
|
) external override {
|
||||||
require(_token == address(WETH), "only WETH token");
|
require(_token == address(WETH), "only WETH token");
|
||||||
require(msg.sender == address(bridge), "only from bridge address");
|
require(msg.sender == address(bridge), "only from bridge address");
|
||||||
require(_data.length == 52, "incorrect data length");
|
require(_data.length == 64, "incorrect data length");
|
||||||
|
|
||||||
WETH.withdraw(_value);
|
WETH.withdraw(_value);
|
||||||
|
|
||||||
uint256 l1Fee = BytesHelper.sliceToUint(_data, 20);
|
(address payable receipient, uint256 l1Fee) = abi.decode(_data, (address, uint256));
|
||||||
|
|
||||||
AddressHelper.safeSendValue(payable(BytesHelper.bytesToAddress(_data)), _value.sub(l1Fee));
|
AddressHelper.safeSendValue(receipient, _value.sub(l1Fee));
|
||||||
|
|
||||||
|
if (l1Fee > 0) {
|
||||||
address payable l1FeeTo = l1FeeReceiver != payable(address(0)) ? l1FeeReceiver : payable(tx.origin);
|
address payable l1FeeTo = l1FeeReceiver != payable(address(0)) ? l1FeeReceiver : payable(tx.origin);
|
||||||
AddressHelper.safeSendValue(l1FeeTo, l1Fee);
|
AddressHelper.safeSendValue(l1FeeTo, l1Fee);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev Sets l1FeeReceiver address.
|
* @dev Sets l1FeeReceiver address.
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
|
||||||
pragma solidity ^0.7.0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @title Bytes
|
|
||||||
* @dev Helper methods to transform bytes to other solidity types.
|
|
||||||
*/
|
|
||||||
library BytesHelper {
|
|
||||||
/**
|
|
||||||
* @dev Truncate bytes array if its size is more than 20 bytes.
|
|
||||||
* NOTE: This function does not perform any checks on the received parameter.
|
|
||||||
* Make sure that the _bytes argument has a correct length, not less than 20 bytes.
|
|
||||||
* A case when _bytes has length less than 20 will lead to the undefined behaviour,
|
|
||||||
* since assembly will read data from memory that is not related to the _bytes argument.
|
|
||||||
* @param _bytes to be converted to address type
|
|
||||||
* @return addr address included in the firsts 20 bytes of the bytes array in parameter.
|
|
||||||
*/
|
|
||||||
function bytesToAddress(bytes memory _bytes) internal pure returns (address addr) {
|
|
||||||
assembly {
|
|
||||||
addr := mload(add(_bytes, 20))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param _bytes it's 32 length slice to be converted to uint type
|
|
||||||
* @param _start start index of slice
|
|
||||||
* @return x uint included in the 32 length slice of the bytes array in parameter.
|
|
||||||
*/
|
|
||||||
function sliceToUint(bytes memory _bytes, uint256 _start) internal pure returns (uint256 x) {
|
|
||||||
require(_bytes.length >= _start + 32, "slicing out of range");
|
|
||||||
assembly {
|
|
||||||
x := mload(add(_bytes, add(0x20, _start)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -14,7 +14,6 @@ const { generate } = require('../src/0_generateAddresses')
|
|||||||
|
|
||||||
const MERKLE_TREE_HEIGHT = 5
|
const MERKLE_TREE_HEIGHT = 5
|
||||||
const l1ChainId = 1
|
const l1ChainId = 1
|
||||||
const MINIMUM_WITHDRAWAL_AMOUNT = utils.parseEther(process.env.MINIMUM_WITHDRAWAL_AMOUNT || '0.05')
|
|
||||||
const MAXIMUM_DEPOSIT_AMOUNT = utils.parseEther(process.env.MAXIMUM_DEPOSIT_AMOUNT || '1')
|
const MAXIMUM_DEPOSIT_AMOUNT = utils.parseEther(process.env.MAXIMUM_DEPOSIT_AMOUNT || '1')
|
||||||
|
|
||||||
describe('TornadoPool', function () {
|
describe('TornadoPool', function () {
|
||||||
@ -69,7 +68,6 @@ describe('TornadoPool', function () {
|
|||||||
)
|
)
|
||||||
|
|
||||||
const { data } = await tornadoPoolImpl.populateTransaction.initialize(
|
const { data } = await tornadoPoolImpl.populateTransaction.initialize(
|
||||||
MINIMUM_WITHDRAWAL_AMOUNT,
|
|
||||||
MAXIMUM_DEPOSIT_AMOUNT,
|
MAXIMUM_DEPOSIT_AMOUNT,
|
||||||
)
|
)
|
||||||
const proxy = await deploy(
|
const proxy = await deploy(
|
||||||
@ -105,13 +103,11 @@ describe('TornadoPool', function () {
|
|||||||
|
|
||||||
it('should configure', async () => {
|
it('should configure', async () => {
|
||||||
const { tornadoPool, multisig } = await loadFixture(fixture)
|
const { tornadoPool, multisig } = await loadFixture(fixture)
|
||||||
const newWithdrawalLimit = utils.parseEther('0.01337')
|
|
||||||
const newDepositLimit = utils.parseEther('1337')
|
const newDepositLimit = utils.parseEther('1337')
|
||||||
|
|
||||||
await tornadoPool.connect(multisig).configureLimits(newWithdrawalLimit, newDepositLimit)
|
await tornadoPool.connect(multisig).configureLimits(newDepositLimit)
|
||||||
|
|
||||||
expect(await tornadoPool.maximumDepositAmount()).to.be.equal(newDepositLimit)
|
expect(await tornadoPool.maximumDepositAmount()).to.be.equal(newDepositLimit)
|
||||||
expect(await tornadoPool.minimalWithdrawalAmount()).to.be.equal(newWithdrawalLimit)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -337,7 +333,7 @@ describe('TornadoPool', function () {
|
|||||||
const fromBlock = await ethers.provider.getBlock()
|
const fromBlock = await ethers.provider.getBlock()
|
||||||
const events = await omniBridge.queryFilter(filter, fromBlock.number)
|
const events = await omniBridge.queryFilter(filter, fromBlock.number)
|
||||||
onTokenBridgedData = events[0].args.data
|
onTokenBridgedData = events[0].args.data
|
||||||
const hexL1Fee = '0x' + events[0].args.data.toString().slice(42)
|
const hexL1Fee = '0x' + events[0].args.data.toString().slice(66)
|
||||||
expect(ethers.BigNumber.from(hexL1Fee)).to.be.equal(l1Fee)
|
expect(ethers.BigNumber.from(hexL1Fee)).to.be.equal(l1Fee)
|
||||||
|
|
||||||
const recipientBalance = await token.balanceOf(recipient)
|
const recipientBalance = await token.balanceOf(recipient)
|
||||||
@ -444,7 +440,7 @@ describe('TornadoPool', function () {
|
|||||||
const fromBlock = await ethers.provider.getBlock()
|
const fromBlock = await ethers.provider.getBlock()
|
||||||
const events = await omniBridge.queryFilter(filter, fromBlock.number)
|
const events = await omniBridge.queryFilter(filter, fromBlock.number)
|
||||||
onTokenBridgedData = events[0].args.data
|
onTokenBridgedData = events[0].args.data
|
||||||
const hexL1Fee = '0x' + events[0].args.data.toString().slice(42)
|
const hexL1Fee = '0x' + events[0].args.data.toString().slice(66)
|
||||||
expect(ethers.BigNumber.from(hexL1Fee)).to.be.equal(l1Fee)
|
expect(ethers.BigNumber.from(hexL1Fee)).to.be.equal(l1Fee)
|
||||||
|
|
||||||
const recipientBalance = await token.balanceOf(recipient)
|
const recipientBalance = await token.balanceOf(recipient)
|
||||||
|
Loading…
Reference in New Issue
Block a user