class GeminiAccountService extends GeminiAccountServiceRaw implements AccountService {

  /**
   * Constructor
   *
   * @param exchange
   */
  public GeminiAccountService(Exchange exchange) {

    super(exchange);
  }

  @Override
  public AccountInfo getAccountInfo() throws IOException {

    return new AccountInfo(GeminiAdapters.adaptWallet(getGeminiAccountInfo()));
  }

  /**
   * Withdrawal support
   *
   * @param currency
   * @param amount
   * @param address
   * @return
   * @throws IOException
   */
  @Override
  public String withdrawFunds(Currency currency, BigDecimal amount, String address)
      throws IOException {
    return withdraw(currency, amount, address);
  }

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

  /** This will result in a new address being created each time, and is severely rate-limited */
  @Override
  public String requestDepositAddress(Currency currency, String... arguments) throws IOException {
    GeminiDepositAddressResponse response = super.requestDepositAddressRaw(currency);
    return response.getAddress();
  }

  @Override
  public List<FundingRecord> getFundingHistory(TradeHistoryParams params) throws IOException {
    Date since = null;
    Integer limit = 50;

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

    if (params instanceof TradeHistoryParamsTimeSpan) {
      since = ((TradeHistoryParamsTimeSpan) params).getStartTime();
    }

    List<FundingRecord> results = new ArrayList<>();

    for (GeminiTransfer transfer : transfers(since, limit)) {
      results.add(GeminiAdapters.adapt(transfer));
    }

    return results;
  }

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

  @Override
  public Map<Instrument, Fee> getDynamicTradingFeesByInstrument() throws IOException {
    GeminiTrailingVolumeResponse volumes = Get30DayTrailingVolumeDescription();
    return GeminiAdapters.AdaptDynamicTradingFees(volumes, allCurrencyPairs);
  }
}

    if (params instanceof DefaultWithdrawFundsParams) {
      DefaultWithdrawFundsParams defaultParams = (DefaultWithdrawFundsParams) params;
      return withdrawFunds(
          defaultParams.getCurrency(), defaultParams.getAmount(), defaultParams.getAddress());
    }
    throw new IllegalStateException("Don't know how to withdraw: " + params);
  
<methods>public void <init>(org.knowm.xchange.Exchange) ,public org.knowm.xchange.gemini.v1.dto.account.GeminiTrailingVolumeResponse Get30DayTrailingVolumeDescription() throws java.io.IOException,public org.knowm.xchange.gemini.v1.dto.account.GeminiBalancesResponse[] getGeminiAccountInfo() throws java.io.IOException,public org.knowm.xchange.gemini.v1.dto.account.GeminiDepositAddressResponse requestDepositAddressRaw(org.knowm.xchange.currency.Currency) throws java.io.IOException,public List<org.knowm.xchange.gemini.v1.dto.account.GeminiTransfer> transfers(java.util.Date, java.lang.Integer) throws java.io.IOException,public java.lang.String withdraw(org.knowm.xchange.currency.Currency, java.math.BigDecimal, java.lang.String) throws java.io.IOException<variables>protected final non-sealed List<org.knowm.xchange.instrument.Instrument> allCurrencyPairs