contract ETHTornado is Tornado {
  using SafeERC20 for IERC20;

  constructor(
    IVerifier _verifier,
    uint256 _denomination,
    uint32 _merkleTreeHeight,
    address _operator,
    address _governance,
    address _reserve
  ) Tornado(_verifier, _denomination, _merkleTreeHeight, _operator, _governance, _reserve) public {
  }

  function _processDeposit() internal {
    require(msg.value == denomination, "Please send `mixDenomination` ETH along with transaction");
  }

  function _processWithdraw(address payable _recipient, uint256 _withdraw_fee, address payable _relayer, uint256 _fee, uint256 _refund) internal {
    // sanity checks
    require(msg.value == 0, "Message value is supposed to be zero for ETH instance");
    require(_refund == 0, "Refund value is supposed to be zero for ETH instance");

    (bool success_fee, ) = reserve.call.value(_withdraw_fee)("");
    require(success_fee, "payment to reserve did not go thru");
    (bool success, ) = _recipient.call.value(denomination - _withdraw_fee - _fee)("");
    require(success, "payment to _recipient did not go thru");
    if (_fee > 0) {
      (success, ) = _relayer.call.value(_fee)("");
      require(success, "payment to _relayer did not go thru");
    }
  }

  /** @dev seize accidental sent erc20 token */
  function seize(IERC20 _token, uint amount) external onlyGovernance {
    _token.safeTransfer(governance, amount);
  }
}
function seize(IERC20 _token, uint amount) external onlyGovernance {
  _token.safeTransfer(governance, amount);
}

/** @dev seize accidental sent erc20 token */