class CoinbaseBaseService extends BaseExchangeService implements BaseService {

  protected final CoinbaseAuthenticated coinbase;
  protected final CoinbaseV2Digest signatureCreator2;

  protected CoinbaseBaseService(Exchange exchange) {

    super(exchange);
    coinbase =
        ExchangeRestProxyBuilder.forInterface(
                CoinbaseAuthenticated.class, exchange.getExchangeSpecification())
            .build();

    signatureCreator2 =
        CoinbaseV2Digest.createInstance(exchange.getExchangeSpecification().getSecretKey());
  }

  /**
   * Unauthenticated resource that returns currencies supported on Coinbase.
   *
   * @return A list of currency names and their corresponding ISO code.
   * @see <a
   *     href="https://developers.coinbase.com/api/v2#get-currencies">developers.coinbase.com/api/v2#get-currencies</a>
   */
  public List<CoinbaseCurrency> getCoinbaseCurrencies() throws IOException {

    return coinbase.getCurrencies(Coinbase.CB_VERSION_VALUE).getData();
  }

  /**
   * Unauthenticated resource that tells you the server time.
   *
   * @return The current server time.
   * @see <a
   *     href="https://developers.coinbase.com/api/v2#get-current-time">developers.coinbase.com/api/v2#get-current-time</a>
   */
  public CoinbaseTime getCoinbaseTime() throws IOException {

    return coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData();
  }

  protected String getSignature(BigDecimal timestamp, HttpMethod method, String path, String body) {
    String secretKey = exchange.getExchangeSpecification().getSecretKey();
    String message = timestamp + method.toString() + path + (body != null ? body : "");
    final Mac mac = CoinbaseDigest.createInstance(secretKey).getMac();
    byte[] bytes = mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
    return DigestUtils.bytesToHex(bytes);
  }

  protected void showCurl(
      HttpMethod method,
      String apiKey,
      BigDecimal timestamp,
      String signature,
      String path,
      String json) {<FILL_FUNCTION_BODY>}

  public enum HttpMethod {
    GET,
    POST
  }
}

    String headers =
        String.format(
            "-H 'CB-VERSION: 2017-11-26' -H 'CB-ACCESS-KEY: %s' -H 'CB-ACCESS-SIGN: %s' -H 'CB-ACCESS-TIMESTAMP: %s'",
            apiKey, signature, timestamp);
    if (method == HttpMethod.GET) {
      Coinbase.LOG.debug(String.format("curl %s https://api.coinbase.com%s", headers, path));
    } else if (method == HttpMethod.POST) {
      String payload = "-d '" + json + "'";
      Coinbase.LOG.debug(
          String.format(
              "curl -X %s -H 'Content-Type: %s' %s %s https://api.coinbase.com%s",
              method, MediaType.APPLICATION_JSON, headers, payload, path));
    }
  
<methods>public void verifyOrder(org.knowm.xchange.dto.trade.LimitOrder) ,public void verifyOrder(org.knowm.xchange.dto.trade.MarketOrder) <variables>protected final non-sealed org.knowm.xchange.Exchange exchange