func: function lend(
          IERC20[] memory tokens,
          uint256[] memory amounts,
          address target,
          bytes memory data
      )
          public
          notInLendingMode
      {
          _inLendingMode = true;
  
          
          uint256[] memory prevAmounts = new uint256[](tokens.length);
          for (uint i = 0; i < tokens.length; i++) {
              prevAmounts[i] = tokens[i].balanceOf(address(this));
              require(tokens[i].transfer(target, amounts[i]));
          }
  
          
          (bool res,) = target.call(data);    
          require(res, "Invalid arbitrary call");
  
          
          for (uint i = 0; i < tokens.length; i++) {
              uint256 expectedFees = amounts[i].mul(_feesPercent).div(100);
              require(tokens[i].balanceOf(address(this)) >= prevAmounts[i].add(expectedFees));
              if (_feesReceiver != address(this)) {
                  require(tokens[i].transfer(_feesReceiver, expectedFees));
              }
          }
  
          _inLendingMode = false;
      }