All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.knowm.xchange.coinbase.v2.service.CoinbaseTradeServiceRaw Maven / Gradle / Ivy

package org.knowm.xchange.coinbase.v2.service;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.math.BigDecimal;
import javax.ws.rs.core.MediaType;
import org.knowm.xchange.Exchange;
import org.knowm.xchange.coinbase.v2.Coinbase;
import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseBuyData.CoinbaseBuy;
import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseSellData.CoinbaseSell;
import org.knowm.xchange.currency.Currency;

class CoinbaseTradeServiceRaw extends CoinbaseBaseService {

  protected CoinbaseTradeServiceRaw(Exchange exchange) {
    super(exchange);
  }

  /**
   * Authenticated resource that lets you purchase Bitcoin using the primary bank account that is
   * linked to your account. (You must link and verify your bank account through the website before
   * this API call will work). The underlying optional parameter agree_btc_amount_varies is set to
   * false.
   *
   * @see developers.coinbase.com/api/v2#place-buy-order
   */
  public CoinbaseBuy buy(String accountId, BigDecimal total, Currency currency, boolean commit)
      throws IOException {

    String path = "/v2/accounts/" + accountId + "/buys";
    String apiKey = exchange.getExchangeSpecification().getApiKey();
    BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch();
    BuyPayload payload = new BuyPayload(total, currency.getCurrencyCode(), commit, false);
    String body = new ObjectMapper().writeValueAsString(payload);
    String signature = getSignature(timestamp, HttpMethod.POST, path, body);

    showCurl(HttpMethod.POST, apiKey, timestamp, signature, path, body);

    return coinbase
        .buy(
            MediaType.APPLICATION_JSON,
            Coinbase.CB_VERSION_VALUE,
            apiKey,
            signature,
            timestamp,
            accountId,
            payload)
        .getData();
  }

  /**
   * Authenticated resource that lets you convert Bitcoin crediting your primary bank account on
   * Coinbase. (You must link and verify your bank account through the website before this API call
   * will work).
   *
   * @see developers.coinbase.com/api/v2#place-sell-order
   */
  public CoinbaseSell sell(String accountId, BigDecimal total, Currency currency, boolean commit)
      throws IOException {

    return sellInternal(
        accountId, new SellPayload(total, currency.getCurrencyCode(), commit, false));
  }

  /**
   * Authenticated resource that lets you convert Bitcoin crediting your primary bank account on
   * Coinbase. (You must link and verify your bank account through the website before this API call
   * will work).
   *
   * @see developers.coinbase.com/api/v2#place-sell-order
   */
  public CoinbaseSell quote(String accountId, BigDecimal total, Currency currency)
      throws IOException {

    return sellInternal(accountId, new SellPayload(total, currency.getCurrencyCode(), false, true));
  }

  private CoinbaseSell sellInternal(String accountId, SellPayload payload) throws IOException {

    String path = "/v2/accounts/" + accountId + "/sells";
    String apiKey = exchange.getExchangeSpecification().getApiKey();
    BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch();
    String body = new ObjectMapper().writeValueAsString(payload);
    String signature = getSignature(timestamp, HttpMethod.POST, path, body);

    showCurl(HttpMethod.POST, apiKey, timestamp, signature, path, body);

    return coinbase
        .sell(
            MediaType.APPLICATION_JSON,
            Coinbase.CB_VERSION_VALUE,
            apiKey,
            signature,
            timestamp,
            accountId,
            payload)
        .getData();
  }

  class BuyPayload extends AbstractPayload {
    @JsonProperty String total;

    BuyPayload(BigDecimal total, String currency, boolean commit, boolean quote) {
      super(currency, commit, quote);
      this.total = total.toString();
    }
  }

  class SellPayload extends AbstractPayload {
    @JsonProperty String amount;

    SellPayload(BigDecimal amount, String currency, boolean commit, boolean quote) {
      super(currency, commit, quote);
      this.amount = amount.toString();
    }
  }

  abstract class AbstractPayload {
    @JsonProperty String currency;
    @JsonProperty boolean commit;
    @JsonProperty boolean quote;

    AbstractPayload(String currency, boolean commit, boolean quote) {
      this.currency = currency;
      this.commit = commit;
      this.quote = quote;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy