class BitbayAccountService extends BitbayAccountServiceRaw implements AccountService {

  public BitbayAccountService(Exchange exchange) {
    super(exchange);
  }

  @Override
  public AccountInfo getAccountInfo() throws IOException {
    return BitbayAdapters.adaptAccountInfo(
        exchange.getExchangeSpecification().getUserName(), getBitbayAccountInfo());
  }

  @Override
  public String withdrawFunds(Currency currency, BigDecimal amount, String address)
      throws IOException {
    return withdrawFunds(new DefaultWithdrawFundsParams(address, currency, amount));
  }

  @Override
  public String withdrawFunds(WithdrawFundsParams params) throws IOException {<FILL_FUNCTION_BODY>}

  @Override
  public String requestDepositAddress(Currency currency, String... args) throws IOException {
    throw new NotAvailableFromExchangeException();
  }

  @Override
  public TradeHistoryParams createFundingHistoryParams() {
    throw new NotAvailableFromExchangeException();
  }

  @Override
  public List<FundingRecord> getFundingHistory(TradeHistoryParams params) throws IOException {
    Currency currency = null;
    if (params instanceof TradeHistoryParamCurrency) {
      TradeHistoryParamCurrency tradeHistoryParamCurrency = (TradeHistoryParamCurrency) params;
      currency = tradeHistoryParamCurrency.getCurrency();
    }

    Integer limit = 1000;
    if (params instanceof TradeHistoryParamLimit) {
      limit = ((TradeHistoryParamLimit) params).getLimit();
    }

    return history(currency, limit);
  }

  public static class BitbayFundingHistory
      implements TradeHistoryParamCurrency, TradeHistoryParamLimit {

    private Currency currency;
    private Integer limit;

    public BitbayFundingHistory(Currency currency, Integer limit) {
      this.currency = currency;
      this.limit = limit;
    }

    public BitbayFundingHistory() {}

    @Override
    public Currency getCurrency() {
      return currency;
    }

    @Override
    public void setCurrency(Currency currency) {
      this.currency = currency;
    }

    @Override
    public Integer getLimit() {
      return limit;
    }

    @Override
    public void setLimit(Integer limit) {
      this.limit = limit;
    }
  }
}

    if (params instanceof DefaultWithdrawFundsParams) {
      DefaultWithdrawFundsParams defaultParams = (DefaultWithdrawFundsParams) params;
      transfer(defaultParams.getCurrency(), defaultParams.getAmount(), defaultParams.getAddress());
      return "Success";
    } else if (params instanceof BitbayWithdrawFundsSwiftParams) {
      BitbayWithdrawFundsSwiftParams bicParams = (BitbayWithdrawFundsSwiftParams) params;
      withdraw(
          bicParams.getCurrency(),
          bicParams.getAmount(),
          bicParams.getAccount(),
          bicParams.isExpress(),
          bicParams.getBic());
      return "Success";
    }

    throw new NotAvailableFromExchangeException();
  
<methods>public void <init>(org.knowm.xchange.Exchange) ,public org.knowm.xchange.bitbay.dto.acount.BitbayAccountInfoResponse getBitbayAccountInfo() throws java.io.IOException,public List<org.knowm.xchange.dto.account.FundingRecord> history(org.knowm.xchange.currency.Currency, int) ,public org.knowm.xchange.bitbay.dto.BitbayBaseResponse transfer(org.knowm.xchange.currency.Currency, java.math.BigDecimal, java.lang.String) ,public org.knowm.xchange.bitbay.dto.BitbayBaseResponse withdraw(org.knowm.xchange.currency.Currency, java.math.BigDecimal, java.lang.String, boolean, java.lang.String) <variables>