contract TornadoCash_Eth_01 is ETHTornado {
  bool public isMigrated = false;

  constructor(
    IVerifier _verifier,
    uint256 _denomination,
    uint32 _merkleTreeHeight,
    address _operator
  ) ETHTornado(_verifier, _denomination, _merkleTreeHeight, _operator) public {
  }

  /**
    @dev Migrate state from old v1 tornado.cash instance to this contract.
    @dev only applies to eth 0.1 deposits
    @param _commitments deposited commitments from previous contract
    @param _nullifierHashes spent nullifiers from previous contract
  */
  function migrateState(bytes32[] calldata _commitments, bytes32[] calldata _nullifierHashes) external onlyOperator {
    require(!isMigrated, "Migration is disabled");
    for (uint32 i = 0; i < _commitments.length; i++) {
      commitments[_commitments[i]] = true;
      emit Deposit(_commitments[i], nextIndex + i, block.timestamp);
    }

    nextIndex += uint32(_commitments.length);

    for (uint256 i = 0; i < _nullifierHashes.length; i++) {
      nullifierHashes[_nullifierHashes[i]] = true;
      emit Withdrawal(address(0), _nullifierHashes[i], address(0), 0);
    }
  }

  function initializeTreeForMigration(bytes32[] calldata _filledSubtrees, bytes32 _root) external onlyOperator {
    require(!isMigrated, "already migrated");
    filledSubtrees = _filledSubtrees;
    roots[0] = _root;
  }

  function finishMigration() external payable onlyOperator {
    isMigrated = true;
  }
}
function migrateState(bytes32[] calldata _commitments, bytes32[] calldata _nullifierHashes) external onlyOperator {
  require(!isMigrated, "Migration is disabled");
  for (uint32 i = 0; i < _commitments.length; i++) {
    commitments[_commitments[i]] = true;
    emit Deposit(_commitments[i], nextIndex + i, block.timestamp);
  }

  nextIndex += uint32(_commitments.length);

  for (uint256 i = 0; i < _nullifierHashes.length; i++) {
    nullifierHashes[_nullifierHashes[i]] = true;
    emit Withdrawal(address(0), _nullifierHashes[i], address(0), 0);
  }
}

/**
 @dev Migrate state from old v1 tornado.cash instance to this contract.
 @dev only applies to eth 0.1 deposits
 @param _commitments deposited commitments from previous contract
 @param _nullifierHashes spent nullifiers from previous contract
 */