function createETHERC20LoanLenderClone(
    address _borrowedTokenAddress,
    uint _borrowAmount,
    uint _paybackAmount,
    uint _collateralAmount,
    uint _daysPerInstallment,
    uint _remainingInstallment,
    string _loanId,
    address _borrowerAddress
  ) public payable returns (address) {
    require(!contractById[_loanId].exists, "contract already exists");

    address clone = createClone(ETHERC20LoanLenderMasterContractAddress);
    ETHERC20LoanLender(clone).init({
      _ownerAddress : owner,
      _borrowerAddress : _borrowerAddress,
      _lenderAddress : msg.sender,
      _borrowedTokenAddress : _borrowedTokenAddress,
      _borrowAmount : _borrowAmount,
      _paybackAmount : _paybackAmount,
      _collateralAmount : _collateralAmount,
      _daysPerInstallment : _daysPerInstallment,
      _remainingInstallment : _remainingInstallment,
      _loanId : _loanId});

    contractMap[msg.sender].push(clone);
    contractById[_loanId] = Library.contractAddress(clone, true);
    return clone;
  }