class LykkeExchange extends BaseExchange implements Exchange {

  @Override
  protected void initServices() {
    this.marketDataService = new LykkeMarketDataService(this);
    this.tradeService = new LykkeTradeService(this);
    this.accountService = new LykkeAccountService(this);
  }

  @Override
  public ExchangeSpecification getDefaultExchangeSpecification() {
    ExchangeSpecification exchangeSpecification = new ExchangeSpecification(this.getClass());
    exchangeSpecification.setSslUri("https://hft-api.lykke.com/");
    exchangeSpecification.setHost("lykke.com");
    exchangeSpecification.setPort(80);
    exchangeSpecification.setExchangeName("Lykke");
    exchangeSpecification.setExchangeDescription(
        "Lykke is a bitcoin and altcoin wallet and exchange.");

    return exchangeSpecification;
  }

  @Override
  public void remoteInit() throws IOException, ExchangeException {<FILL_FUNCTION_BODY>}
}

    try {
      // populate currency pair keys only, exchange does not provide any other metadata for download
      Map<Instrument, InstrumentMetaData> currencyPairs = exchangeMetaData.getInstruments();
      Map<Currency, CurrencyMetaData> currencies = exchangeMetaData.getCurrencies();
      List<Instrument> currencyPairList = getExchangeInstruments();
      List<FeeTier> feeTiers = new ArrayList<>();
      feeTiers.add(new FeeTier(BigDecimal.ZERO, new Fee(BigDecimal.ZERO, BigDecimal.ZERO)));

      LykkeMarketDataService marketDataService = (LykkeMarketDataService) this.marketDataService;
      List<LykkeAssetPair> assetPairList = marketDataService.getAssetPairs();

      for (LykkeAssetPair lykkeAssetPair : assetPairList) {
        CurrencyPair currencyPair =
            new CurrencyPair(
                lykkeAssetPair.getName().split("/")[0], lykkeAssetPair.getQuotingAssetId());
        InstrumentMetaData currencyPairMetaData =
            new InstrumentMetaData.Builder()
                .feeTiers(feeTiers.toArray(new FeeTier[feeTiers.size()]))
                .priceScale(lykkeAssetPair.getAccuracy())
                .build();
        currencyPairs.put(currencyPair, currencyPairMetaData);
        currencyPairList.add(currencyPair);
      }
      for (LykkeAsset lykkeAsset : marketDataService.getLykkeAssets()) {
        if (lykkeAsset.getSymbol() != null) {
          Currency currency = new Currency(lykkeAsset.getSymbol());
          CurrencyMetaData currencyMetaData = new CurrencyMetaData(lykkeAsset.getAccuracy(), null);
          currencies.put(currency, currencyMetaData);
        }
      }
    } catch (Exception e) {
      logger.warn("An exception occurred while loading the metadata", e);
    }
  
<methods>public non-sealed void <init>() ,public void applySpecification(org.knowm.xchange.ExchangeSpecification) ,public org.knowm.xchange.service.account.AccountService getAccountService() ,public List<org.knowm.xchange.instrument.Instrument> getExchangeInstruments() ,public org.knowm.xchange.dto.meta.ExchangeMetaData getExchangeMetaData() ,public org.knowm.xchange.ExchangeSpecification getExchangeSpecification() ,public org.knowm.xchange.service.marketdata.MarketDataService getMarketDataService() ,public java.lang.String getMetaDataFileName(org.knowm.xchange.ExchangeSpecification) ,public SynchronizedValueFactory<java.lang.Long> getNonceFactory() ,public org.knowm.xchange.service.trade.TradeService getTradeService() ,public void remoteInit() throws java.io.IOException, org.knowm.xchange.exceptions.ExchangeException,public java.lang.String toString() <variables>protected org.knowm.xchange.service.account.AccountService accountService,protected org.knowm.xchange.dto.meta.ExchangeMetaData exchangeMetaData,protected org.knowm.xchange.ExchangeSpecification exchangeSpecification,protected final Logger logger,protected org.knowm.xchange.service.marketdata.MarketDataService marketDataService,private final SynchronizedValueFactory<java.lang.Long> nonceFactory,protected org.knowm.xchange.service.trade.TradeService tradeService