function forwardPayment(IERC20 src, uint256 srcAmount, IERC20 dest, address destAddress, uint256 minConversionRate, uint256 minDestAmount, bytes memory encodedFunctionCall) public nonReentrant payable returns(uint256) {
    if (address(src) != ETH_TOKEN_ADDRESS) {
      require(msg.value == 0);
      src.safeTransferFrom(msg.sender, address(this), srcAmount);
      src.safeApprove(address(KYBER_NETWORK_PROXY), srcAmount);
    }

    uint256 destAmount = KYBER_NETWORK_PROXY.trade.value((address(src) == ETH_TOKEN_ADDRESS) ? srcAmount : 0)(src, srcAmount, dest, address(this), ~uint256(0), minConversionRate, LAND_REGISTRY_PROXY.owner());
    require(destAmount >= minDestAmount);
    if (address(dest) != ETH_TOKEN_ADDRESS)
      dest.safeApprove(destAddress, destAmount);

    (bool success, ) = destAddress.call.value((address(dest) == ETH_TOKEN_ADDRESS) ? destAmount : 0)(encodedFunctionCall);
    require(success, "dest call failed");

    emit PaymentForwarded(src, srcAmount, dest, destAddress, destAmount);
    return destAmount;
  }