From e83844d8baeaa69f345fc6de7293f460bfa96132 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Fri, 4 Feb 2022 09:08:23 +0100 Subject: [PATCH 01/34] ETD:235-connectors-coinbase-api-block - bug fix - null point exception in case of cancelled transactions --- .../java/org/knowm/xchange/coinbase/CoinbaseAdapters.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java index 0647818a579..4ecadf0520e 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java @@ -57,6 +57,8 @@ public static UserTrades adaptTrades(List transactions, OrderTy } private static UserTrade adaptTrade(CoinbaseBuySell transaction, OrderType orderType) { + // Bug fix - Null point exception in case of cancelled transactions + String transactionId = transaction.getTransaction() == null ? null : (transaction.getTransaction().getId() == null ? null : transaction.getTransaction().getId()); return new UserTrade.Builder() .type(orderType) .originalAmount(transaction.getAmount().getAmount()) @@ -70,7 +72,7 @@ private static UserTrade adaptTrade(CoinbaseBuySell transaction, OrderType order .divide(transaction.getAmount().getAmount(), PRICE_SCALE, RoundingMode.HALF_UP)) .timestamp(Date.from(transaction.getCreatedAt().toInstant())) .id(transaction.getId()) - .orderId(transaction.getTransaction().getId()) + .orderId(transactionId) .feeAmount(transaction.getFee().getAmount()) .feeCurrency(Currency.getInstance(transaction.getFee().getCurrency())) .build(); From 1c6b959c69344841dbba9616aed22d5043871fe1 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Fri, 4 Feb 2022 10:07:29 +0100 Subject: [PATCH 02/34] ETD:235-connectors-coinbase-api-block - bug fix - null point exception in case of cancelled transactions --- .../java/org/knowm/xchange/coinbase/CoinbaseAdapters.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java index 4ecadf0520e..6e6dcf45c1b 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java @@ -58,7 +58,9 @@ public static UserTrades adaptTrades(List transactions, OrderTy private static UserTrade adaptTrade(CoinbaseBuySell transaction, OrderType orderType) { // Bug fix - Null point exception in case of cancelled transactions - String transactionId = transaction.getTransaction() == null ? null : (transaction.getTransaction().getId() == null ? null : transaction.getTransaction().getId()); + String transactionId = transaction.getTransaction() == null ? + null : (transaction.getTransaction().getId() == null ? + null : transaction.getTransaction().getId()); return new UserTrade.Builder() .type(orderType) .originalAmount(transaction.getAmount().getAmount()) From a580cbd9036033eb02e60148d72e88352e06c728 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Mon, 7 Feb 2022 16:25:46 +0100 Subject: [PATCH 03/34] ETD:191-connectors-coinbase-deposit/withdrawal --- .../xchange/coinbase/CoinbaseAdapters.java | 67 +++++++++++++++++++ .../coinbase/v2/CoinbaseAuthenticated.java | 24 +++++++ .../CoinbaseDepositWithdrawalResponse.java | 14 ++++ .../v2/service/CoinbaseAccountService.java | 53 ++++++++++++++- 4 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseDepositWithdrawalResponse.java diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java index 0647818a579..ab2dc1fbba3 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java @@ -20,6 +20,7 @@ import org.knowm.xchange.dto.Order.OrderType; import org.knowm.xchange.dto.account.AccountInfo; import org.knowm.xchange.dto.account.Balance; +import org.knowm.xchange.dto.account.FundingRecord; import org.knowm.xchange.dto.account.Wallet; import org.knowm.xchange.dto.marketdata.Ticker; import org.knowm.xchange.dto.marketdata.Trades.TradeSortType; @@ -56,6 +57,72 @@ public static UserTrades adaptTrades(List transactions, OrderTy return new UserTrades(trades, TradeSortType.SortByTimestamp); } + public static List adaptFundings(List trades) { + final List records = new ArrayList<>(); + + for (CoinbaseBuySell record : trades) { + records.add(adaptFunding(record)); + } + + return records; + } + + private static FundingRecord adaptFunding(CoinbaseBuySell transaction) { + + FundingRecord.Type type = null; + FundingRecord.Status status; + + switch (transaction.getResource()) { + case "WITHDRAWAL": + case "CREATE_VOUCHER": + type = FundingRecord.Type.WITHDRAWAL; + break; + case "deposit": + case "USED_VOUCHER": + case "NEW_USER_REWARD": + case "REFERRAL": + type = FundingRecord.Type.DEPOSIT; + break; + default: + // here we ignore the other types which are trading + } + + switch (transaction.getStatus().toUpperCase()) { + case "OK": + case "COMPLETED": + status = FundingRecord.Status.COMPLETE; + break; + case "NEW": + case "SENT": + case "CREATED": + case "WAITING": + case "PENDING": + status = FundingRecord.Status.PROCESSING; + break; + default: + status = FundingRecord.Status.FAILED; + } + + String internalId = transaction.getId(); + String description = transaction.getTransaction().getResource(); + + FundingRecord funding = + new FundingRecord( + null, + Date.from(transaction.getCreatedAt().toInstant()), + Currency.getInstance(transaction.getAmount().getCurrency()), + transaction.getAmount().getAmount(), + internalId, + null, + type, + status, + null, + transaction.getFee().getAmount(), + description); + + return funding; + } + private static UserTrade adaptTrade(CoinbaseBuySell transaction, OrderType orderType) { return new UserTrade.Builder() .type(orderType) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java index 97e1fe95b4f..ce929283bc0 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java @@ -84,6 +84,30 @@ CoinbaseBuySellResponse getSells( @QueryParam("starting_after") String startingAfter) throws IOException, CoinbaseException; + @GET + @Path("accounts/{accountId}/deposits") + CoinbaseBuySellResponse getAllDeposits( + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) CoinbaseV2Digest signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @PathParam("accountId") String accountId, + @QueryParam("limit") Integer limit, + @QueryParam("starting_after") String startingAfter) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{accountId}/withdrawals") + CoinbaseBuySellResponse getAllWithdrawals( + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) CoinbaseV2Digest signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @PathParam("accountId") String accountId, + @QueryParam("limit") Integer limit, + @QueryParam("starting_after") String startingAfter) + throws IOException, CoinbaseException; + @GET @Path("accounts/{accountId}/deposits") Map getDeposits( diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseDepositWithdrawalResponse.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseDepositWithdrawalResponse.java new file mode 100644 index 00000000000..3e5f47d60b7 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseDepositWithdrawalResponse.java @@ -0,0 +1,14 @@ +package org.knowm.xchange.coinbase.v2.dto.account.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import lombok.Getter; + +@Getter +public class CoinbaseDepositWithdrawalResponse { + private final List data; + + public CoinbaseDepositWithdrawalResponse(@JsonProperty("data") List data) { + this.data = data; + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java index c7e5ea7bcf7..aefaa1e4008 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java @@ -1,20 +1,28 @@ package org.knowm.xchange.coinbase.v2.service; import java.io.IOException; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.knowm.xchange.Exchange; +import org.knowm.xchange.coinbase.CoinbaseAdapters; +import org.knowm.xchange.coinbase.v2.Coinbase; import org.knowm.xchange.coinbase.v2.dto.CoinbaseAmount; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData; +import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseBuySellResponse; import org.knowm.xchange.currency.Currency; +import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.account.AccountInfo; import org.knowm.xchange.dto.account.Balance; +import org.knowm.xchange.dto.account.FundingRecord; import org.knowm.xchange.dto.account.Wallet; +import org.knowm.xchange.dto.trade.UserTrades; import org.knowm.xchange.exceptions.ExchangeException; import org.knowm.xchange.exceptions.NotAvailableFromExchangeException; import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; import org.knowm.xchange.service.account.AccountService; +import org.knowm.xchange.service.trade.params.DefaultTradeHistoryParamPaging; import org.knowm.xchange.service.trade.params.DefaultWithdrawFundsParams; import org.knowm.xchange.service.trade.params.TradeHistoryParams; import org.knowm.xchange.service.trade.params.WithdrawFundsParams; @@ -61,6 +69,49 @@ public String withdrawFunds(WithdrawFundsParams params) @Override public TradeHistoryParams createFundingHistoryParams() { - throw new NotAvailableFromExchangeException(); + return new CoinbaseTradeHistoryParams(); + } + + + /** + * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). + * To get it is necessary to know the accountId (wallet ID) see {@link AccountInfo#getWallets()} + */ +// public List getWithdrwalHistory(CoinbaseTradeHistoryParams params, String accountId) +// throws IOException { +// final String apiKey = exchange.getExchangeSpecification().getApiKey(); +// final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); +// final CoinbaseBuySellResponse withdrawals = +// (CoinbaseBuySellResponse) coinbase.getAllWithdrawals( +// Coinbase.CB_VERSION_VALUE, +// apiKey, +// signatureCreator2, +// timestamp, +// accountId, +// params.getLimit(), +// params.getStartId() +// ); +// return CoinbaseAdapters.adaptTrades(withdrawals.getData()); +// } + + /** + * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). + * To get it is necessary to know the accountId (wallet ID) from {@link AccountInfo#getWallets()} + */ + public List getDepositHistory(CoinbaseTradeHistoryParams params, String accountId) + throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); + final CoinbaseBuySellResponse deposits = + coinbase.getAllDeposits( + Coinbase.CB_VERSION_VALUE, + apiKey, + signatureCreator2, + timestamp, + accountId, + params.getLimit(), + params.getStartId() + ); + return CoinbaseAdapters.adaptFundings(deposits.getData()); } } From 7ab24f9cd6f77f4680eec3bbecbb05835ba2ba25 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Tue, 8 Feb 2022 08:25:09 +0100 Subject: [PATCH 04/34] ETD:191-connectors-coinbase-deposit/withdrawal --- .../xchange/coinbase/CoinbaseAdapters.java | 10 ++---- .../v2/service/CoinbaseAccountService.java | 33 +++++++++---------- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java index ab2dc1fbba3..6fef8f9b9be 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java @@ -77,7 +77,7 @@ private static FundingRecord adaptFunding(CoinbaseBuySell transaction) { case "CREATE_VOUCHER": type = FundingRecord.Type.WITHDRAWAL; break; - case "deposit": + case "DEPOSIT": case "USED_VOUCHER": case "NEW_USER_REWARD": case "REFERRAL": @@ -103,23 +103,19 @@ private static FundingRecord adaptFunding(CoinbaseBuySell transaction) { status = FundingRecord.Status.FAILED; } - String internalId = transaction.getId(); - String description = transaction.getTransaction().getResource(); - FundingRecord funding = new FundingRecord( null, Date.from(transaction.getCreatedAt().toInstant()), Currency.getInstance(transaction.getAmount().getCurrency()), transaction.getAmount().getAmount(), - internalId, + transaction.getId(), null, type, status, null, transaction.getFee().getAmount(), - description); - + null); return funding; } diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java index aefaa1e4008..1239d5edad1 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java @@ -72,27 +72,26 @@ public TradeHistoryParams createFundingHistoryParams() { return new CoinbaseTradeHistoryParams(); } - /** * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). * To get it is necessary to know the accountId (wallet ID) see {@link AccountInfo#getWallets()} */ -// public List getWithdrwalHistory(CoinbaseTradeHistoryParams params, String accountId) -// throws IOException { -// final String apiKey = exchange.getExchangeSpecification().getApiKey(); -// final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); -// final CoinbaseBuySellResponse withdrawals = -// (CoinbaseBuySellResponse) coinbase.getAllWithdrawals( -// Coinbase.CB_VERSION_VALUE, -// apiKey, -// signatureCreator2, -// timestamp, -// accountId, -// params.getLimit(), -// params.getStartId() -// ); -// return CoinbaseAdapters.adaptTrades(withdrawals.getData()); -// } + public List getWithdrwalHistory(CoinbaseTradeHistoryParams params, String accountId) + throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); + final CoinbaseBuySellResponse withdrawals = + coinbase.getAllWithdrawals( + Coinbase.CB_VERSION_VALUE, + apiKey, + signatureCreator2, + timestamp, + accountId, + params.getLimit(), + params.getStartId() + ); + return CoinbaseAdapters.adaptFundings(withdrawals.getData()); + } /** * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). From beb42644b59a486126fe7eefde69729d4c3e78a8 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Tue, 8 Feb 2022 08:30:11 +0100 Subject: [PATCH 05/34] ETD:191-connectors-coinbase-deposit/withdrawal --- .../xchange/coinbase/v2/service/CoinbaseAccountService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java index 1239d5edad1..e6a642653e8 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java @@ -76,7 +76,7 @@ public TradeHistoryParams createFundingHistoryParams() { * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). * To get it is necessary to know the accountId (wallet ID) see {@link AccountInfo#getWallets()} */ - public List getWithdrwalHistory(CoinbaseTradeHistoryParams params, String accountId) + public List getWithdrawalHistory(CoinbaseTradeHistoryParams params, String accountId) throws IOException { final String apiKey = exchange.getExchangeSpecification().getApiKey(); final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); From 36809c7ed0b07a25717f938e72e9b66aca5780a6 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Fri, 4 Feb 2022 09:08:23 +0100 Subject: [PATCH 06/34] ETD:235-connectors-coinbase-api-block - bug fix - null point exception in case of cancelled transactions --- .../java/org/knowm/xchange/coinbase/CoinbaseAdapters.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java index 6fef8f9b9be..9d8d9cbb192 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java @@ -120,6 +120,8 @@ private static FundingRecord adaptFunding(CoinbaseBuySell transaction) { } private static UserTrade adaptTrade(CoinbaseBuySell transaction, OrderType orderType) { + // Bug fix - Null point exception in case of cancelled transactions + String transactionId = transaction.getTransaction() == null ? null : (transaction.getTransaction().getId() == null ? null : transaction.getTransaction().getId()); return new UserTrade.Builder() .type(orderType) .originalAmount(transaction.getAmount().getAmount()) @@ -133,7 +135,7 @@ private static UserTrade adaptTrade(CoinbaseBuySell transaction, OrderType order .divide(transaction.getAmount().getAmount(), PRICE_SCALE, RoundingMode.HALF_UP)) .timestamp(Date.from(transaction.getCreatedAt().toInstant())) .id(transaction.getId()) - .orderId(transaction.getTransaction().getId()) + .orderId(transactionId) .feeAmount(transaction.getFee().getAmount()) .feeCurrency(Currency.getInstance(transaction.getFee().getCurrency())) .build(); From d12af682815af39ace00d76d2a678f1fd574e457 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Fri, 4 Feb 2022 10:07:29 +0100 Subject: [PATCH 07/34] ETD:235-connectors-coinbase-api-block - bug fix - null point exception in case of cancelled transactions --- .../java/org/knowm/xchange/coinbase/CoinbaseAdapters.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java index 9d8d9cbb192..b750f5eb9ec 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java @@ -121,7 +121,9 @@ private static FundingRecord adaptFunding(CoinbaseBuySell transaction) { private static UserTrade adaptTrade(CoinbaseBuySell transaction, OrderType orderType) { // Bug fix - Null point exception in case of cancelled transactions - String transactionId = transaction.getTransaction() == null ? null : (transaction.getTransaction().getId() == null ? null : transaction.getTransaction().getId()); + String transactionId = transaction.getTransaction() == null ? + null : (transaction.getTransaction().getId() == null ? + null : transaction.getTransaction().getId()); return new UserTrade.Builder() .type(orderType) .originalAmount(transaction.getAmount().getAmount()) From 92362a7c7e3a0305c6704cdfa73a4d68b069f843 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Wed, 23 Feb 2022 16:59:49 +0100 Subject: [PATCH 08/34] CoinbaseConnectorFixingAndAddingTransfers --- .../main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java index b750f5eb9ec..903d30a073d 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java @@ -121,6 +121,7 @@ private static FundingRecord adaptFunding(CoinbaseBuySell transaction) { private static UserTrade adaptTrade(CoinbaseBuySell transaction, OrderType orderType) { // Bug fix - Null point exception in case of cancelled transactions + String transactionId = transaction.getTransaction() == null ? null : (transaction.getTransaction().getId() == null ? null : transaction.getTransaction().getId()); From 136289732f459f489caa0cd4860f6dcd3b76712f Mon Sep 17 00:00:00 2001 From: martinkyov Date: Thu, 24 Feb 2022 09:55:14 +0100 Subject: [PATCH 09/34] CoinbaseConnectorFixingAndAddingTransfers --- .../main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java index 903d30a073d..217f5b2f316 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/CoinbaseAdapters.java @@ -71,8 +71,9 @@ private static FundingRecord adaptFunding(CoinbaseBuySell transaction) { FundingRecord.Type type = null; FundingRecord.Status status; + String recordType = transaction.getResource().toUpperCase(); - switch (transaction.getResource()) { + switch (recordType) { case "WITHDRAWAL": case "CREATE_VOUCHER": type = FundingRecord.Type.WITHDRAWAL; From 39a9d83deded846d0aae3f5067b0bdceb8015c4f Mon Sep 17 00:00:00 2001 From: MartinKyovsky Date: Mon, 27 Feb 2023 15:23:41 +0100 Subject: [PATCH 10/34] feature/ETD-755-connectors-coinbase-api---add-su --- .../xchange/coinbase/v2/CoinbaseV2Digest.java | 23 +++--- .../v2/service/CoinbaseBaseService.java | 20 +++-- .../service/CoinbaseTradeHistoryParams.java | 29 ++++++++ .../v2/service/CoinbaseTradeServiceRaw.java | 41 +++++++++- .../coinbase/v3/CoinbaseAuthenticatedV3.java | 74 +++++++++++++++++++ ...CoinbaseAdvancedTradeAccountsResponse.java | 25 +++++++ .../CoinbaseAdvancedTradeFills.java | 61 +++++++++++++++ ...inbaseAdvancedTradeOrderFillsResponse.java | 19 +++++ .../CoinbaseAdvancedTradesAccounts.java | 54 ++++++++++++++ 9 files changed, 328 insertions(+), 18 deletions(-) create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/CoinbaseAuthenticatedV3.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeAccountsResponse.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeFills.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeOrderFillsResponse.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradesAccounts.java diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java index dc0cfc9d7ef..2d300c4f33f 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java @@ -1,14 +1,17 @@ package org.knowm.xchange.coinbase.v2; -import static org.knowm.xchange.coinbase.v2.CoinbaseAuthenticated.CB_ACCESS_TIMESTAMP; - -import javax.ws.rs.HeaderParam; import org.knowm.xchange.service.BaseParamsDigest; import org.knowm.xchange.utils.DigestUtils; import si.mazi.rescu.RestInvocation; +import javax.ws.rs.HeaderParam; + +import static org.knowm.xchange.coinbase.v2.CoinbaseAuthenticated.CB_ACCESS_TIMESTAMP; + public class CoinbaseV2Digest extends BaseParamsDigest { + public static final String ADVANCED_TRADING_V3 = "/v3/brokerage/"; + private CoinbaseV2Digest(String secretKey) { super(secretKey, HMAC_SHA_256); } @@ -19,12 +22,14 @@ public static CoinbaseV2Digest createInstance(String secretKey) { @Override public String digestParams(RestInvocation restInvocation) { - final String pathWithQueryString = - restInvocation.getInvocationUrl().replace(restInvocation.getBaseUrl(), ""); - final String timestamp = - restInvocation.getParamValue(HeaderParam.class, CB_ACCESS_TIMESTAMP).toString(); - final String message = timestamp + restInvocation.getHttpMethod() + pathWithQueryString; - + String path = restInvocation.getInvocationUrl(); + final String timestamp = restInvocation.getParamValue(HeaderParam.class, CB_ACCESS_TIMESTAMP).toString(); + if (path.contains(ADVANCED_TRADING_V3)) { + path = restInvocation.getPath(); + } else { + path = path.replace(restInvocation.getBaseUrl(), ""); + } + final String message = timestamp + restInvocation.getHttpMethod() + path; return DigestUtils.bytesToHex(getMac().doFinal(message.getBytes())); } } diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseBaseService.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseBaseService.java index dc0a4f427ae..6d921e1701f 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseBaseService.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseBaseService.java @@ -1,11 +1,5 @@ package org.knowm.xchange.coinbase.v2.service; -import java.io.IOException; -import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; -import java.util.List; -import javax.crypto.Mac; -import javax.ws.rs.core.MediaType; import org.knowm.xchange.Exchange; import org.knowm.xchange.client.ExchangeRestProxyBuilder; import org.knowm.xchange.coinbase.service.CoinbaseDigest; @@ -14,13 +8,22 @@ import org.knowm.xchange.coinbase.v2.CoinbaseV2Digest; import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseCurrencyData.CoinbaseCurrency; import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseTimeData.CoinbaseTime; +import org.knowm.xchange.coinbase.v3.CoinbaseAuthenticatedV3; import org.knowm.xchange.service.BaseExchangeService; import org.knowm.xchange.service.BaseService; import org.knowm.xchange.utils.DigestUtils; +import javax.crypto.Mac; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.List; + public class CoinbaseBaseService extends BaseExchangeService implements BaseService { protected final CoinbaseAuthenticated coinbase; + protected final CoinbaseAuthenticatedV3 coinbaseV3; protected final CoinbaseV2Digest signatureCreator2; protected CoinbaseBaseService(Exchange exchange) { @@ -31,6 +34,11 @@ protected CoinbaseBaseService(Exchange exchange) { CoinbaseAuthenticated.class, exchange.getExchangeSpecification()) .build(); + coinbaseV3 = + ExchangeRestProxyBuilder.forInterface( + CoinbaseAuthenticatedV3.class, exchange.getExchangeSpecification()) + .build(); + signatureCreator2 = CoinbaseV2Digest.createInstance(exchange.getExchangeSpecification().getSecretKey()); } diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeHistoryParams.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeHistoryParams.java index 7153f3fb58c..55e1493d63f 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeHistoryParams.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeHistoryParams.java @@ -4,11 +4,16 @@ import org.knowm.xchange.service.trade.params.TradeHistoryParamLimit; import org.knowm.xchange.service.trade.params.TradeHistoryParamsIdSpan; +import java.time.Instant; + public class CoinbaseTradeHistoryParams implements TradeHistoryParamsIdSpan, TradeHistoryParamLimit { private String startId; private Integer limit; + private Instant startDatetime; + private Instant endDateTime; + private String cursor; @Override public Integer getLimit() { @@ -39,4 +44,28 @@ public String getEndId() { public void setEndId(String endId) { throw new NotAvailableFromExchangeException("Coinbase does not support ending transaction ID."); } + + public Instant getStartDatetime() { + return startDatetime; + } + + public void setStartDatetime(Instant startDatetime) { + this.startDatetime = startDatetime; + } + + public Instant getEndDateTime() { + return endDateTime; + } + + public void setEndDateTime(Instant endDateTime) { + this.endDateTime = endDateTime; + } + + public String getCursor() { + return cursor; + } + + public void setCursor(String cursor) { + this.cursor = cursor; + } } diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java index aea76fc1e3a..b9d6a13927f 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java @@ -2,15 +2,20 @@ 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.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeAccountsResponse; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeFills; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeOrderFillsResponse; import org.knowm.xchange.currency.Currency; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.List; + class CoinbaseTradeServiceRaw extends CoinbaseBaseService { protected CoinbaseTradeServiceRaw(Exchange exchange) { @@ -65,6 +70,36 @@ public CoinbaseSell sell(String accountId, BigDecimal total, Currency currency, accountId, new SellPayload(total, currency.getCurrencyCode(), commit, false)); } + /** + * + * @param params + * @return + * @throws IOException + */ + public List getAdvancedTradeOrderFills(CoinbaseTradeHistoryParams params) + throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); + String start = params.getStartDatetime().toString(); +// String end = params.getEndDateTime().toString(); + final CoinbaseAdvancedTradeOrderFillsResponse fills = coinbaseV3.getFills(Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, null + , null, start, null, params.getLimit(), params.getCursor()); + return fills.getFills(); + } + + /** + * + * @return + * @throws IOException + */ + public CoinbaseAdvancedTradeAccountsResponse getAdvancedTradeAccounts() throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); + final CoinbaseAdvancedTradeAccountsResponse accounts = coinbaseV3.getAccounts(Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, + timestamp, null, null); + return accounts; + } + /** * 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 diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/CoinbaseAuthenticatedV3.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/CoinbaseAuthenticatedV3.java new file mode 100644 index 00000000000..9fa07da4ba0 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/CoinbaseAuthenticatedV3.java @@ -0,0 +1,74 @@ +package org.knowm.xchange.coinbase.v3; + +import org.knowm.xchange.coinbase.v2.Coinbase; +import org.knowm.xchange.coinbase.v2.dto.CoinbaseException; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeAccountsResponse; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeOrderFillsResponse; +import si.mazi.rescu.ParamsDigest; + +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.math.BigDecimal; + +import static org.knowm.xchange.coinbase.v2.CoinbaseV2Digest.ADVANCED_TRADING_V3; + +@Path(ADVANCED_TRADING_V3) +@Produces(MediaType.APPLICATION_JSON) +public interface CoinbaseAuthenticatedV3 extends Coinbase { + + /** + * All API key requests must be signed and contain the following headers. + * + *

All request bodies should have content type application/json and be valid JSON. + * + *

The CB-ACCESS-SIGN header is generated by creating a sha256 HMAC using the secret key on the + * prehash string timestamp + method + requestPath + body (where + represents string + * concatenation). The timestamp value is the same as the CB-ACCESS-TIMESTAMP header. + * + *

The body is the request body string or omitted if there is no request body (typically for + * GET requests). + * + *

The method should be UPPER CASE. + * + *

developers.coinbase.com/api/v2#api-key + */ + String CB_ACCESS_KEY = "CB-ACCESS-KEY"; + + String CB_ACCESS_SIGN = "CB-ACCESS-SIGN"; + String CB_ACCESS_TIMESTAMP = "CB-ACCESS-TIMESTAMP"; + + // ok + @GET + @Path("accounts") + CoinbaseAdvancedTradeAccountsResponse getAccounts( + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) ParamsDigest signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @QueryParam("limit") Integer limit, + @QueryParam("cursor") String cursor) + throws IOException, CoinbaseException; + + @GET + @Path("orders/historical/fills") + CoinbaseAdvancedTradeOrderFillsResponse getFills( + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) ParamsDigest signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @QueryParam("order_id") String orderId, + @QueryParam("product_id") String productId, + @QueryParam("start_sequence_timestamp") String start, + @QueryParam("end_sequence_timestamp") String end, + @QueryParam("limit") int limit, + @QueryParam("cursor") String cursor + ) + throws IOException, CoinbaseException; + +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeAccountsResponse.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeAccountsResponse.java new file mode 100644 index 00000000000..9ddd0c392c8 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeAccountsResponse.java @@ -0,0 +1,25 @@ +package org.knowm.xchange.coinbase.v3.dto.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.List; + +@Getter +public class CoinbaseAdvancedTradeAccountsResponse { + public final List accounts; + private final boolean hasNext; + private final String cursor; + private final String size; + + public CoinbaseAdvancedTradeAccountsResponse(@JsonProperty("accounts") List accounts, + @JsonProperty( + "has_next") boolean hasNext, @JsonProperty("cursor") String cursor, @JsonProperty("size") String size + ) { + this.accounts = accounts; + this.hasNext = hasNext; + this.cursor = cursor; + this.size = size; + } + +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeFills.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeFills.java new file mode 100644 index 00000000000..41a2bac67ca --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeFills.java @@ -0,0 +1,61 @@ +package org.knowm.xchange.coinbase.v3.dto.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.experimental.FieldDefaults; + +import java.math.BigDecimal; + +import static lombok.AccessLevel.PRIVATE; + +@Getter +@FieldDefaults(level = PRIVATE, makeFinal = true) +public class CoinbaseAdvancedTradeFills { + + String entryId; + String tradeId; + String orderId; + String tradeTime; + String tradeType; + BigDecimal price; + BigDecimal size; + BigDecimal commission; + String productId; + String sequenceTimestamp; + String liquidityIndicator; + String sizeInQuote; + String userId; + String side; + + public CoinbaseAdvancedTradeFills( + @JsonProperty("entry_id") String entryId, + @JsonProperty("trade_id") String tradeId, + @JsonProperty("order_id") String orderId, + @JsonProperty("trade_time") String tradeTime, + @JsonProperty("trade_type") String tradeType, + @JsonProperty("price") BigDecimal price, + @JsonProperty("size") BigDecimal size, + @JsonProperty("commission") BigDecimal commission, + @JsonProperty("product_id") String productId, + @JsonProperty("sequence_timestamp") String sequenceTimestamp, + @JsonProperty("liquidity_indicator") String liquidityIndicator, + @JsonProperty("size_in_quote") String sizeInQuote, + @JsonProperty("user_id") String userId, + @JsonProperty("side") String side) { + + this.entryId = entryId; + this.tradeId = tradeId; + this.orderId = orderId; + this.tradeTime = tradeTime; + this.tradeType = tradeType; + this.price = price; + this.size = size; + this.commission = commission; + this.productId = productId; + this.sequenceTimestamp = sequenceTimestamp; + this.liquidityIndicator = liquidityIndicator; + this.sizeInQuote = sizeInQuote; + this.userId = userId; + this.side = side; + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeOrderFillsResponse.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeOrderFillsResponse.java new file mode 100644 index 00000000000..eb5d6a58d57 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradeOrderFillsResponse.java @@ -0,0 +1,19 @@ +package org.knowm.xchange.coinbase.v3.dto.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.List; + +@Getter +public class CoinbaseAdvancedTradeOrderFillsResponse { + private final List fills; + private final String cursor; + + public CoinbaseAdvancedTradeOrderFillsResponse(@JsonProperty("fills") List fills, @JsonProperty("cursor") String cursor ) { + this.fills = fills; + this.cursor = cursor; + + } + +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradesAccounts.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradesAccounts.java new file mode 100644 index 00000000000..b803775389b --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/dto/transactions/CoinbaseAdvancedTradesAccounts.java @@ -0,0 +1,54 @@ +package org.knowm.xchange.coinbase.v3.dto.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.experimental.FieldDefaults; + +import static lombok.AccessLevel.PRIVATE; + +@Getter +@FieldDefaults(level = PRIVATE, makeFinal = true) +public class CoinbaseAdvancedTradesAccounts { + + String uuid; + String name; + String currency; + Object availableBalance; + boolean def; + boolean active; + String createdAt; + String updatedAt; + String deletedAt; + String type; + boolean ready; + Object hold; + + public CoinbaseAdvancedTradesAccounts( + @JsonProperty("uuid") String uuid, + @JsonProperty("name") String name, + @JsonProperty("currency") String currency, + @JsonProperty("available_balance") Object availableBalance, + @JsonProperty("default") boolean def, + @JsonProperty("active") boolean active, + @JsonProperty("created_at") String createdAt, + @JsonProperty("updated_at") String updatedAt, + @JsonProperty("deleted_at") String deletedAt, + @JsonProperty("type") String type, + @JsonProperty("ready") boolean ready, + @JsonProperty("hold") Object hold + ) { + + this.uuid = uuid; + this.name = name; + this.currency = currency; + this.availableBalance = availableBalance; + this.def = def; + this.active = active; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + this.deletedAt = deletedAt; + this.type = type; + this.ready = ready; + this.hold = hold; + } +} From e55e846c55711644eec463b40d2a484e2092fbec Mon Sep 17 00:00:00 2001 From: MartinKyovsky Date: Wed, 1 Mar 2023 11:00:18 +0100 Subject: [PATCH 11/34] feature/ETD-755-connectors-coinbase-api---add-su --- .../xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java index b9d6a13927f..997788cedff 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java @@ -81,9 +81,9 @@ public List getAdvancedTradeOrderFills(CoinbaseTrade final String apiKey = exchange.getExchangeSpecification().getApiKey(); final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); String start = params.getStartDatetime().toString(); -// String end = params.getEndDateTime().toString(); + String end = params.getEndDateTime().toString(); final CoinbaseAdvancedTradeOrderFillsResponse fills = coinbaseV3.getFills(Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, null - , null, start, null, params.getLimit(), params.getCursor()); + , null, start, end, params.getLimit(), params.getCursor()); return fills.getFills(); } From 874ff9e8e4f86964368d5bff8969b35f9e2dc557 Mon Sep 17 00:00:00 2001 From: MartinKyovsky Date: Mon, 20 Mar 2023 11:40:55 +0100 Subject: [PATCH 12/34] feature/ETD-755-connectors-coinbase-api---add-su --- .../v2/service/CoinbaseTradeServiceRaw.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java index 997788cedff..e162517f363 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseTradeServiceRaw.java @@ -87,6 +87,22 @@ public List getAdvancedTradeOrderFills(CoinbaseTrade return fills.getFills(); } + /** + * + * @param params + * @return + * @throws IOException + */ + public CoinbaseAdvancedTradeOrderFillsResponse getAdvancedTradeOrderFillsRow(CoinbaseTradeHistoryParams params) + throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); + String start = params.getStartDatetime().toString(); + String end = params.getEndDateTime().toString(); + return coinbaseV3.getFills(Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, + timestamp, null, null, start, end, params.getLimit(), params.getCursor()); + } + /** * * @return From bccfa65e41829af2d6f0a7934c8c77a2233fa1fa Mon Sep 17 00:00:00 2001 From: martinkyov Date: Thu, 1 Feb 2024 12:30:20 +0100 Subject: [PATCH 13/34] bugfix/ETD-1107-connectors-coinbase-api- --- .../coinbase/v2/CoinbaseAuthenticated.java | 16 ++++ .../coinbase/v2/dto/CoinbaseUnitPrice.java | 28 +++++++ .../CoinbaseExpandTransactionsResponse.java | 20 +++++ .../transactions/CoinbasePagination.java | 34 ++++++++ .../CoinbaseShowTransactionV2.java | 79 +++++++++++++++++++ .../CoinbaseTransactionDetails.java | 38 +++++++++ .../CoinbaseTransactionV2Expand.java | 76 ++++++++++++++++++ .../v2/service/CoinbaseAccountServiceRaw.java | 37 +++++++++ .../coinbase/v2/service/TransactionType.java | 16 ++++ 9 files changed, 344 insertions(+) create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/CoinbaseExpandTransactionsResponse.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbasePagination.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionDetails.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/TransactionType.java diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java index ce929283bc0..3be6c52c96e 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Map; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -16,6 +17,7 @@ import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountsData; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseBuyData; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseExpandTransactionsResponse; import org.knowm.xchange.coinbase.v2.dto.account.CoinbasePaymentMethodsData; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseSellData; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseTransactionsResponse; @@ -60,6 +62,20 @@ CoinbaseTransactionsResponse getTransactions( @PathParam("accountId") String accountId) throws IOException, CoinbaseException; + @GET + @Path("accounts/{accountId}/transactions") + CoinbaseExpandTransactionsResponse getExpandedTransactions( + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) ParamsDigest signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @PathParam("accountId") String accountId, + @QueryParam("expand[]") ArrayList expand, + @QueryParam("limit") int limit, + @QueryParam("order") String orderType, + @QueryParam("starting_after") String startingFrom) + throws IOException, CoinbaseException; + @GET @Path("accounts/{accountId}/buys") CoinbaseBuySellResponse getBuys( diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java new file mode 100644 index 00000000000..db0d2b54edb --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java @@ -0,0 +1,28 @@ +package org.knowm.xchange.coinbase.v2.dto; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.ToString; +import org.knowm.xchange.currency.Currency; +import org.knowm.xchange.utils.Assert; + +import java.math.BigDecimal; + +@ToString +@JsonIgnoreProperties(ignoreUnknown = true) +public class CoinbaseUnitPrice { + + private final Currency currency; + private final BigDecimal amount; + private final int scale; + + @JsonCreator + public CoinbaseUnitPrice( + @JsonProperty("amount") BigDecimal amount, @JsonProperty("currency") String currency, @JsonProperty("scale") int scale) { + this.amount = amount; + this.currency = Currency.getInstance(currency); + this.scale = scale; + } + +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/CoinbaseExpandTransactionsResponse.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/CoinbaseExpandTransactionsResponse.java new file mode 100644 index 00000000000..7104fcf0a41 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/CoinbaseExpandTransactionsResponse.java @@ -0,0 +1,20 @@ +package org.knowm.xchange.coinbase.v2.dto.account; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbasePagination; +import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseShowTransactionV2; + +import java.util.List; + +@Getter +public class CoinbaseExpandTransactionsResponse { + private final List data; + private final CoinbasePagination pagination; + + public CoinbaseExpandTransactionsResponse(@JsonProperty("pagination") CoinbasePagination pagination, + @JsonProperty("data") List data) { + this.data = data; + this.pagination = pagination; + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbasePagination.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbasePagination.java new file mode 100644 index 00000000000..47dd0d023ba --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbasePagination.java @@ -0,0 +1,34 @@ +package org.knowm.xchange.coinbase.v2.dto.account.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.ToString; + +@ToString +@Getter +public class CoinbasePagination { + + + private final String endingBefore; + private final String startingAfter; + private final int limit; + private final String order; + private final String previousUri; + private final String nextUri; + + public CoinbasePagination( + @JsonProperty("ending_before") String endingBefore, + @JsonProperty("starting_after") String startingAfter, + @JsonProperty("limit") int limit, + @JsonProperty("order") String order, + @JsonProperty("previous_uri") String previousUri, + @JsonProperty("next_uri") String nextUri + ) { + this.endingBefore = endingBefore; + this.startingAfter = startingAfter; + this.limit = limit; + this.order = order; + this.previousUri = previousUri; + this.nextUri = nextUri; + } +} \ No newline at end of file diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java new file mode 100644 index 00000000000..041f6b4fd5b --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java @@ -0,0 +1,79 @@ +package org.knowm.xchange.coinbase.v2.dto.account.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.ToString; +import org.knowm.xchange.coinbase.v2.dto.CoinbaseAmount; + +@ToString +@Getter +public class CoinbaseShowTransactionV2 { + private final String id; + private final String idem; + private final String type; + private final String status; + private final CoinbaseAmount amount; + private final CoinbaseAmount nativeAmount; + private final String description; + private final String createdAt; + private final String updatedAt; + private final String resource; + private final String resourcePath; + private final boolean instantExchange; + private final CoinbaseTransactionV2Expand buy; + private final CoinbaseTransactionV2Expand sell; + private final CoinbaseTransactionV2Field trade; + private final CoinbaseTransactionV2FromField from; + private final CoinbaseTransactionV2ToField to; + private final CoinbaseTransactionV2NetworkField network; + private final CoinbaseTransactionV2Field application; + private final CoinbaseTransactionDetails details; + private final boolean hideNativeAmount; + + public CoinbaseShowTransactionV2( + @JsonProperty("id") String id, + @JsonProperty("idem") String idem, + @JsonProperty("type") String type, + @JsonProperty("status") String status, + @JsonProperty("amount") CoinbaseAmount amount, + @JsonProperty("native_amount") CoinbaseAmount nativeAmount, + @JsonProperty("description") String description, + @JsonProperty("created_at") String createdAt, + @JsonProperty("updated_at") String updatedAt, + @JsonProperty("resource") String resource, + @JsonProperty("resource_path") String resourcePath, + @JsonProperty("instant_exchange") boolean instantExchange, + @JsonProperty("buy") CoinbaseTransactionV2Expand buy, + @JsonProperty("sell") CoinbaseTransactionV2Expand sell, + @JsonProperty("trade") CoinbaseTransactionV2Field trade, + @JsonProperty("from") CoinbaseTransactionV2FromField from, + @JsonProperty("to") CoinbaseTransactionV2ToField to, + @JsonProperty("network") CoinbaseTransactionV2NetworkField network, + @JsonProperty("application") CoinbaseTransactionV2Field application, + @JsonProperty("details") CoinbaseTransactionDetails details, + @JsonProperty("hide_native_amount") boolean hideNativeAmount) { + + this.id = id; + this.idem = idem; + this.type = type; + this.status = status; + this.amount = amount; + this.nativeAmount = nativeAmount; + this.description = description; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + this.resource = resource; + this.resourcePath = resourcePath; + this.instantExchange = instantExchange; + this.buy = buy; + this.sell = sell; + this.trade = trade; + this.from = from; + this.to = to; + this.network = network; + this.application = application; + this.details = details; + this.hideNativeAmount = hideNativeAmount; + } + +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionDetails.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionDetails.java new file mode 100644 index 00000000000..fc2de0462eb --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionDetails.java @@ -0,0 +1,38 @@ +package org.knowm.xchange.coinbase.v2.dto.account.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +@Getter +public class CoinbaseTransactionDetails { + private final String title; + private final String subtitle; + private final String paymentMethodName; + + public CoinbaseTransactionDetails( + @JsonProperty("title") String title, + @JsonProperty("subtitle") String subtitle, + @JsonProperty("payment_method_name") String paymentMethodName) { + this.title = title; + this.subtitle = subtitle; + this.paymentMethodName = paymentMethodName; + } + + @Override + public String toString() { + return "{" + + "\"title\":" + + '\"' + + title + + '\"' + + ",\"subtitle\":" + + '\"' + + subtitle + + '\"' + + ",\"paymentMethodName\":" + + '\"' + + paymentMethodName + + '\"' + + "}"; + } +} \ No newline at end of file diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java new file mode 100644 index 00000000000..cc2dfad405a --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java @@ -0,0 +1,76 @@ +package org.knowm.xchange.coinbase.v2.dto.account.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.experimental.FieldDefaults; +import org.knowm.xchange.coinbase.v2.dto.CoinbaseAmount; +import org.knowm.xchange.coinbase.v2.dto.CoinbaseUnitPrice; + +import static lombok.AccessLevel.PROTECTED; + +@Getter +@FieldDefaults(level = PROTECTED) +public class CoinbaseTransactionV2Expand { + + String id; + String status; + CoinbaseTransactionV2 transaction; + String user_reference; + String created_at; + String updated_at; + String resource; + String resource_path; + CoinbaseTransactionV2Field payment_method; + boolean committed; + String payout_at; + boolean instant; + CoinbaseAmount fee; + CoinbaseAmount amount; + CoinbaseAmount total; + CoinbaseAmount subtotal; + CoinbaseUnitPrice unit_price; + String idem; + String next_step; + + public CoinbaseTransactionV2Expand( + @JsonProperty("id") String id, + @JsonProperty("status") String status, + @JsonProperty("transaction") CoinbaseTransactionV2 transaction, + @JsonProperty("user_reference") String userReference, + @JsonProperty("created_at") String createdAt, + @JsonProperty("updated_at") String updatedAt, + @JsonProperty("resource") String resource, + @JsonProperty("resource_path") String resourcePath, + @JsonProperty("payment_method") CoinbaseTransactionV2Field paymentMethod, + @JsonProperty("committed") boolean committed, + @JsonProperty("payout_at") String payoutAt, + @JsonProperty("instant") boolean instant, + @JsonProperty("fee") CoinbaseAmount fee, + @JsonProperty("amount") CoinbaseAmount amount, + @JsonProperty("total") CoinbaseAmount total, + @JsonProperty("subtotal") CoinbaseAmount subtotal, + @JsonProperty("unit_price") CoinbaseUnitPrice unitPrice, + @JsonProperty("idem") String idem, + @JsonProperty("next_step") String nextStep) { + + this.id = id; + this.status = status; + this.transaction = transaction; + this.user_reference = userReference; + this.created_at = createdAt; + this.updated_at = updatedAt; + this.resource = resource; + this.resource_path = resourcePath; + this.payment_method = paymentMethod; + this.committed = committed; + this.payout_at = payoutAt; + this.instant = instant; + this.fee = fee; + this.amount = amount; + this.total = total; + this.subtotal = subtotal; + this.unit_price = unitPrice; + this.idem = idem; + this.next_step = nextStep; + } +} \ No newline at end of file diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java index d02140d512f..09a2a78ef0c 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java @@ -8,12 +8,16 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; import javax.ws.rs.core.MediaType; +import lombok.NonNull; import org.knowm.xchange.Exchange; import org.knowm.xchange.coinbase.v2.Coinbase; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData.CoinbaseAccount; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseExpandTransactionsResponse; import org.knowm.xchange.coinbase.v2.dto.account.CoinbasePaymentMethodsData.CoinbasePaymentMethod; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseTransactionsResponse; +import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseShowTransactionV2; import org.knowm.xchange.currency.Currency; public class CoinbaseAccountServiceRaw extends CoinbaseBaseService { @@ -30,6 +34,39 @@ public CoinbaseTransactionsResponse getTransactions(String accountId) throws IOE Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); } + public List getExpandTransactions(String accountId, CoinbaseTradeHistoryParams params, + @NonNull TransactionType transactionType) throws IOException { + String apiKey = exchange.getExchangeSpecification().getApiKey(); + BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); + + ArrayList expandTypes = new ArrayList<>(); + expandTypes.add(TransactionType.BUY.getName()); + expandTypes.add(TransactionType.SELL.getName()); + + List result = new ArrayList<>(); + String orderType = "asc"; + boolean isNextPage = true; + while (isNextPage) { + CoinbaseExpandTransactionsResponse response = coinbase.getExpandedTransactions( + Coinbase.CB_VERSION_VALUE, apiKey, + signatureCreator2, timestamp, + accountId, + expandTypes, + params.getLimit(), + orderType, + params.getStartId()); + if(response.getPagination().getNextUri() == null) { + isNextPage = false; + } + if(!response.getData().isEmpty()) { + CoinbaseShowTransactionV2 lastTx = response.getData().get(0); + params.setStartId(lastTx.getId()); + result.addAll(response.getData()); + } + } + return result.stream().filter(tx -> tx.getType().equals(transactionType.getName())).collect(Collectors.toList()); + } + public Map getDeposits(String accountId) throws IOException { String apiKey = exchange.getExchangeSpecification().getApiKey(); BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/TransactionType.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/TransactionType.java new file mode 100644 index 00000000000..4931aa443bc --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/TransactionType.java @@ -0,0 +1,16 @@ +package org.knowm.xchange.coinbase.v2.service; + +public enum TransactionType { + BUY("buy"), + SELL("sell"); + + String name; + + TransactionType(String name) { + this.name = name; + } + + String getName() { + return name; + } +} \ No newline at end of file From 87ec0906a19e21bca9770dd2d787b451df76dba7 Mon Sep 17 00:00:00 2001 From: martinkyov Date: Thu, 1 Feb 2024 13:21:03 +0100 Subject: [PATCH 14/34] bugfix/ETD-1107-connectors-coinbase-api- --- .../org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java | 2 ++ .../dto/account/transactions/CoinbaseTransactionV2Expand.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java index db0d2b54edb..c98908fee91 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/CoinbaseUnitPrice.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; import lombok.ToString; import org.knowm.xchange.currency.Currency; import org.knowm.xchange.utils.Assert; @@ -10,6 +11,7 @@ import java.math.BigDecimal; @ToString +@Getter @JsonIgnoreProperties(ignoreUnknown = true) public class CoinbaseUnitPrice { diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java index cc2dfad405a..f7ddad8caf2 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java @@ -28,7 +28,7 @@ public class CoinbaseTransactionV2Expand { CoinbaseAmount amount; CoinbaseAmount total; CoinbaseAmount subtotal; - CoinbaseUnitPrice unit_price; + CoinbaseUnitPrice unitPrice; String idem; String next_step; @@ -69,7 +69,7 @@ public CoinbaseTransactionV2Expand( this.amount = amount; this.total = total; this.subtotal = subtotal; - this.unit_price = unitPrice; + this.unitPrice = unitPrice; this.idem = idem; this.next_step = nextStep; } From a6463899652d31ea413ac5b84aa0eabecc18ea19 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Mon, 13 May 2024 16:25:27 +0200 Subject: [PATCH 15/34] etd 1182 --- .../coinbase/v2/service/CoinbaseAccountServiceRaw.java | 2 ++ .../knowm/xchange/coinbase/v2/service/TransactionType.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java index 09a2a78ef0c..c589704bd3f 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java @@ -42,6 +42,8 @@ public List getExpandTransactions(String accountId, C ArrayList expandTypes = new ArrayList<>(); expandTypes.add(TransactionType.BUY.getName()); expandTypes.add(TransactionType.SELL.getName()); + expandTypes.add(TransactionType.RECEIVE.getName()); + expandTypes.add(TransactionType.SEND.getName()); List result = new ArrayList<>(); String orderType = "asc"; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/TransactionType.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/TransactionType.java index 4931aa443bc..c96bc268f9f 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/TransactionType.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/TransactionType.java @@ -2,7 +2,9 @@ public enum TransactionType { BUY("buy"), - SELL("sell"); + SELL("sell"), + RECEIVE("receive"), + SEND("send"); String name; From 1c3b1d85510fabd5dea742e40d45f4b143fb8c52 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 14 May 2024 10:23:57 +0200 Subject: [PATCH 16/34] etd 1182 --- .../coinbase/v2/CoinbaseAuthenticated.java | 1 - .../v2/service/CoinbaseAccountServiceRaw.java | 16 ++++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java index 3be6c52c96e..affd11c5238 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseAuthenticated.java @@ -70,7 +70,6 @@ CoinbaseExpandTransactionsResponse getExpandedTransactions( @HeaderParam(CB_ACCESS_SIGN) ParamsDigest signature, @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, @PathParam("accountId") String accountId, - @QueryParam("expand[]") ArrayList expand, @QueryParam("limit") int limit, @QueryParam("order") String orderType, @QueryParam("starting_after") String startingFrom) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java index c589704bd3f..6743217bec5 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java @@ -8,9 +8,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.stream.Collectors; import javax.ws.rs.core.MediaType; -import lombok.NonNull; import org.knowm.xchange.Exchange; import org.knowm.xchange.coinbase.v2.Coinbase; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData.CoinbaseAccount; @@ -34,17 +32,12 @@ public CoinbaseTransactionsResponse getTransactions(String accountId) throws IOE Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); } - public List getExpandTransactions(String accountId, CoinbaseTradeHistoryParams params, - @NonNull TransactionType transactionType) throws IOException { + public List getExpandTransactions(String accountId, CoinbaseTradeHistoryParams params) + throws IOException { + String apiKey = exchange.getExchangeSpecification().getApiKey(); BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); - ArrayList expandTypes = new ArrayList<>(); - expandTypes.add(TransactionType.BUY.getName()); - expandTypes.add(TransactionType.SELL.getName()); - expandTypes.add(TransactionType.RECEIVE.getName()); - expandTypes.add(TransactionType.SEND.getName()); - List result = new ArrayList<>(); String orderType = "asc"; boolean isNextPage = true; @@ -53,7 +46,6 @@ public List getExpandTransactions(String accountId, C Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId, - expandTypes, params.getLimit(), orderType, params.getStartId()); @@ -66,7 +58,7 @@ public List getExpandTransactions(String accountId, C result.addAll(response.getData()); } } - return result.stream().filter(tx -> tx.getType().equals(transactionType.getName())).collect(Collectors.toList()); + return result; } public Map getDeposits(String accountId) throws IOException { From c68f87cf62eccbe95a4818d35167e79c7e424fd6 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 14 May 2024 14:37:52 +0200 Subject: [PATCH 17/34] etd 1182 --- xchange-core/src/main/java/org/knowm/xchange/dto/Order.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java b/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java index b0cd25da0f3..d5f6cd11daa 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java +++ b/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java @@ -378,6 +378,8 @@ public enum OrderType { BID, /** Selling order (the trader is providing the base currency) */ ASK, + SEND, + RECEIVE, /** * This is to close a short position when trading crypto currency derivatives such as swaps, * futures for CFD's. From 1169721f1018552adc4dc8f1b5fc8be6ceca9eef Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 14 May 2024 14:54:43 +0200 Subject: [PATCH 18/34] etd 1182 ordertype --- xchange-core/src/main/java/org/knowm/xchange/dto/Order.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java b/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java index d5f6cd11daa..b673403848d 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java +++ b/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java @@ -380,6 +380,7 @@ public enum OrderType { ASK, SEND, RECEIVE, + /** * This is to close a short position when trading crypto currency derivatives such as swaps, * futures for CFD's. From 24cad0c309faf5b005db7c7e9aa98498570c2faf Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 14 May 2024 15:29:37 +0200 Subject: [PATCH 19/34] Revert "etd 1182 ordertype" This reverts commit 1169721f1018552adc4dc8f1b5fc8be6ceca9eef. --- xchange-core/src/main/java/org/knowm/xchange/dto/Order.java | 1 - 1 file changed, 1 deletion(-) diff --git a/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java b/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java index b673403848d..d5f6cd11daa 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java +++ b/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java @@ -380,7 +380,6 @@ public enum OrderType { ASK, SEND, RECEIVE, - /** * This is to close a short position when trading crypto currency derivatives such as swaps, * futures for CFD's. From 47e0f5c45da31864ab741ffe2b9b328d50928950 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 14 May 2024 15:29:45 +0200 Subject: [PATCH 20/34] Revert "etd 1182" This reverts commit c68f87cf62eccbe95a4818d35167e79c7e424fd6. --- xchange-core/src/main/java/org/knowm/xchange/dto/Order.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java b/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java index d5f6cd11daa..b0cd25da0f3 100644 --- a/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java +++ b/xchange-core/src/main/java/org/knowm/xchange/dto/Order.java @@ -378,8 +378,6 @@ public enum OrderType { BID, /** Selling order (the trader is providing the base currency) */ ASK, - SEND, - RECEIVE, /** * This is to close a short position when trading crypto currency derivatives such as swaps, * futures for CFD's. From b8ee3783b635cd921f503ad3a757fb4d75b76ea8 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 21 May 2024 10:44:01 +0200 Subject: [PATCH 21/34] bugfix/1179-connectors-fixed-bug-when-downl --- .../java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java index 2d300c4f33f..91f3e4d7164 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java @@ -10,7 +10,7 @@ public class CoinbaseV2Digest extends BaseParamsDigest { - public static final String ADVANCED_TRADING_V3 = "/v3/brokerage/"; + public static final String ADVANCED_TRADING_V3 = "api/v3/brokerage/"; private CoinbaseV2Digest(String secretKey) { super(secretKey, HMAC_SHA_256); From 8e989b994c1d813636b7712363cd4579817a61ee Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 21 May 2024 11:20:08 +0200 Subject: [PATCH 22/34] bugfix/1179-connectors-fixed-bug-when-downl --- .../java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java index 91f3e4d7164..8d055abe8cd 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java @@ -29,7 +29,10 @@ public String digestParams(RestInvocation restInvocation) { } else { path = path.replace(restInvocation.getBaseUrl(), ""); } - final String message = timestamp + restInvocation.getHttpMethod() + path; + String message = timestamp + restInvocation.getHttpMethod() + path; + if (path.contains(ADVANCED_TRADING_V3)){ + message = message.toLowerCase(); + } return DigestUtils.bytesToHex(getMac().doFinal(message.getBytes())); } } From da4c159008636ef23374a27e61f1f7547445df18 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 21 May 2024 12:04:28 +0200 Subject: [PATCH 23/34] bugfix/1179-connectors-fixed-bug-when-downl --- .../java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java index 8d055abe8cd..ed5338dd37f 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java @@ -30,9 +30,6 @@ public String digestParams(RestInvocation restInvocation) { path = path.replace(restInvocation.getBaseUrl(), ""); } String message = timestamp + restInvocation.getHttpMethod() + path; - if (path.contains(ADVANCED_TRADING_V3)){ - message = message.toLowerCase(); - } - return DigestUtils.bytesToHex(getMac().doFinal(message.getBytes())); + return DigestUtils.bytesToHex(getMac().doFinal(message.getBytes())).toLowerCase(); } } From a41a39fc44929ea8c4dbf86e879e978bb4b57c94 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 21 May 2024 16:41:16 +0200 Subject: [PATCH 24/34] bugfix/1179-connectors-fixed-bug-when-downl --- .../java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java index ed5338dd37f..cd7262e0f5c 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseV2Digest.java @@ -25,11 +25,11 @@ public String digestParams(RestInvocation restInvocation) { String path = restInvocation.getInvocationUrl(); final String timestamp = restInvocation.getParamValue(HeaderParam.class, CB_ACCESS_TIMESTAMP).toString(); if (path.contains(ADVANCED_TRADING_V3)) { - path = restInvocation.getPath(); + path = "/" + restInvocation.getPath(); } else { path = path.replace(restInvocation.getBaseUrl(), ""); } String message = timestamp + restInvocation.getHttpMethod() + path; - return DigestUtils.bytesToHex(getMac().doFinal(message.getBytes())).toLowerCase(); + return DigestUtils.bytesToHex(getMac().doFinal(message.getBytes())); } } From 620dea9a09d334b32a4f45e43107ab36b6a16976 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Wed, 22 May 2024 14:10:42 +0200 Subject: [PATCH 25/34] bugfix/1179-connectors-fixed-bug-when-downl --- .../CoinbaseAdvancedTradeFill.java | 28 +++++++++++ .../CoinbaseShowTransactionV2.java | 50 ++++++++----------- .../CoinbaseTransactionV2NetworkField.java | 15 +++++- 3 files changed, 62 insertions(+), 31 deletions(-) create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseAdvancedTradeFill.java diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseAdvancedTradeFill.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseAdvancedTradeFill.java new file mode 100644 index 00000000000..0754a9af702 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseAdvancedTradeFill.java @@ -0,0 +1,28 @@ +package org.knowm.xchange.coinbase.v2.dto.account.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +@Getter +public class CoinbaseAdvancedTradeFill { + + private final String fillPrice; + private final String productId; + private final String orderId; + private final String commission; + private final String orderSide; + + public CoinbaseAdvancedTradeFill( + @JsonProperty("fill_price") String fillPrice, + @JsonProperty("product_id") String productId, + @JsonProperty("order_id") String orderId, + @JsonProperty("commission") String commission, + @JsonProperty("order_side") String orderSide) { + this.fillPrice = fillPrice; + this.productId = productId; + this.orderId = orderId; + this.commission = commission; + this.orderSide = orderSide; + } + +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java index 041f6b4fd5b..0a97152ed0e 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java @@ -9,71 +9,63 @@ @Getter public class CoinbaseShowTransactionV2 { private final String id; - private final String idem; private final String type; private final String status; private final CoinbaseAmount amount; private final CoinbaseAmount nativeAmount; private final String description; private final String createdAt; - private final String updatedAt; private final String resource; private final String resourcePath; - private final boolean instantExchange; + private final CoinbaseAdvancedTradeFill advancedTradeFill; + private final CoinbaseTransactionV2NetworkField network; + private final CoinbaseTransactionV2ToField to; + private final CoinbaseTransactionV2Field from; + private final boolean cancelable; + private final String idem; private final CoinbaseTransactionV2Expand buy; private final CoinbaseTransactionV2Expand sell; private final CoinbaseTransactionV2Field trade; - private final CoinbaseTransactionV2FromField from; - private final CoinbaseTransactionV2ToField to; - private final CoinbaseTransactionV2NetworkField network; - private final CoinbaseTransactionV2Field application; - private final CoinbaseTransactionDetails details; - private final boolean hideNativeAmount; public CoinbaseShowTransactionV2( @JsonProperty("id") String id, - @JsonProperty("idem") String idem, @JsonProperty("type") String type, @JsonProperty("status") String status, @JsonProperty("amount") CoinbaseAmount amount, @JsonProperty("native_amount") CoinbaseAmount nativeAmount, @JsonProperty("description") String description, @JsonProperty("created_at") String createdAt, - @JsonProperty("updated_at") String updatedAt, @JsonProperty("resource") String resource, @JsonProperty("resource_path") String resourcePath, - @JsonProperty("instant_exchange") boolean instantExchange, + @JsonProperty("advanced_trade_fill") CoinbaseAdvancedTradeFill advancedTradeFill, + @JsonProperty("network") CoinbaseTransactionV2NetworkField network, + @JsonProperty("to") CoinbaseTransactionV2ToField to, + @JsonProperty("from") CoinbaseTransactionV2Field from, + @JsonProperty("cancelable") boolean cancelable, + @JsonProperty("idem") String idem, @JsonProperty("buy") CoinbaseTransactionV2Expand buy, @JsonProperty("sell") CoinbaseTransactionV2Expand sell, - @JsonProperty("trade") CoinbaseTransactionV2Field trade, - @JsonProperty("from") CoinbaseTransactionV2FromField from, - @JsonProperty("to") CoinbaseTransactionV2ToField to, - @JsonProperty("network") CoinbaseTransactionV2NetworkField network, - @JsonProperty("application") CoinbaseTransactionV2Field application, - @JsonProperty("details") CoinbaseTransactionDetails details, - @JsonProperty("hide_native_amount") boolean hideNativeAmount) { - + @JsonProperty("trade") CoinbaseTransactionV2Field trade + ) + { this.id = id; - this.idem = idem; this.type = type; this.status = status; this.amount = amount; this.nativeAmount = nativeAmount; this.description = description; this.createdAt = createdAt; - this.updatedAt = updatedAt; this.resource = resource; this.resourcePath = resourcePath; - this.instantExchange = instantExchange; + this.advancedTradeFill = advancedTradeFill; + this.network = network; + this.to = to; + this.from = from; + this.idem = idem; this.buy = buy; this.sell = sell; this.trade = trade; - this.from = from; - this.to = to; - this.network = network; - this.application = application; - this.details = details; - this.hideNativeAmount = hideNativeAmount; + this.cancelable = cancelable; } } diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2NetworkField.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2NetworkField.java index 0aa284dbd5a..743ce8ec43c 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2NetworkField.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2NetworkField.java @@ -6,10 +6,21 @@ @Getter public class CoinbaseTransactionV2NetworkField { - private String status; + private final String status; + private final String networkName; + private final String transactionFee; + private final String hash; - public CoinbaseTransactionV2NetworkField(@JsonProperty("status") String status) { + public CoinbaseTransactionV2NetworkField( + @JsonProperty("status") String status, + @JsonProperty("network_name") String networkName, + @JsonProperty("transaction_fee") String transactionFee, + @JsonProperty("hash") String hash + ) { this.status = status; + this.networkName = networkName; + this.transactionFee = transactionFee; + this.hash = hash; } @Override From a6f6015321a8f454566e4488a4bf8dfd7c7cde02 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Wed, 22 May 2024 16:25:31 +0200 Subject: [PATCH 26/34] bugfix/1179-connectors-fixed-bug-when-downl --- .../account/transactions/CoinbaseTransactionV2Expand.java | 6 +++--- .../transactions/CoinbaseTransactionV2NetworkField.java | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java index f7ddad8caf2..2b86abb7e5e 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java @@ -23,7 +23,7 @@ public class CoinbaseTransactionV2Expand { CoinbaseTransactionV2Field payment_method; boolean committed; String payout_at; - boolean instant; + String paymentMethodName; CoinbaseAmount fee; CoinbaseAmount amount; CoinbaseAmount total; @@ -44,7 +44,7 @@ public CoinbaseTransactionV2Expand( @JsonProperty("payment_method") CoinbaseTransactionV2Field paymentMethod, @JsonProperty("committed") boolean committed, @JsonProperty("payout_at") String payoutAt, - @JsonProperty("instant") boolean instant, + @JsonProperty("payment_method_name") String paymentMethodName, @JsonProperty("fee") CoinbaseAmount fee, @JsonProperty("amount") CoinbaseAmount amount, @JsonProperty("total") CoinbaseAmount total, @@ -64,7 +64,7 @@ public CoinbaseTransactionV2Expand( this.payment_method = paymentMethod; this.committed = committed; this.payout_at = payoutAt; - this.instant = instant; + this.paymentMethodName = paymentMethodName; this.fee = fee; this.amount = amount; this.total = total; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2NetworkField.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2NetworkField.java index 743ce8ec43c..95624ac56f2 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2NetworkField.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2NetworkField.java @@ -2,20 +2,21 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; +import org.knowm.xchange.coinbase.v2.dto.CoinbaseAmount; @Getter public class CoinbaseTransactionV2NetworkField { private final String status; private final String networkName; - private final String transactionFee; + private final CoinbaseAmount transactionFee; private final String hash; public CoinbaseTransactionV2NetworkField( @JsonProperty("status") String status, @JsonProperty("network_name") String networkName, - @JsonProperty("transaction_fee") String transactionFee, - @JsonProperty("hash") String hash + @JsonProperty("transaction_fee") CoinbaseAmount transactionFee, + @JsonProperty("hash") String hash ) { this.status = status; this.networkName = networkName; From 926bec046b8d52fe9ab6c027c5064abbc7da882d Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Wed, 22 May 2024 16:56:31 +0200 Subject: [PATCH 27/34] bugfix/1179-connectors-fixed-bug-when-downl --- .../CoinbaseAdvancedTradeFill.java | 10 +++ .../CoinbaseTransactionV2Expand.java | 67 ++++++------------- 2 files changed, 29 insertions(+), 48 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseAdvancedTradeFill.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseAdvancedTradeFill.java index 0754a9af702..ddee60c8f33 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseAdvancedTradeFill.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseAdvancedTradeFill.java @@ -25,4 +25,14 @@ public CoinbaseAdvancedTradeFill( this.orderSide = orderSide; } + @Override + public String toString() { + return "{\"CoinbaseAdvancedTradeFill\":{" + + "\"fillPrice\":\"" + fillPrice + "\"" + + ", \"productId\":\"" + productId + "\"" + + ", \"orderId\":\"" + orderId + "\"" + + ", \"commission\":\"" + commission + "\"" + + ", \"orderSide\":\"" + orderSide + "\"" + + "}}"; + } } diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java index 2b86abb7e5e..d4164a9bcc6 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTransactionV2Expand.java @@ -4,7 +4,6 @@ import lombok.Getter; import lombok.experimental.FieldDefaults; import org.knowm.xchange.coinbase.v2.dto.CoinbaseAmount; -import org.knowm.xchange.coinbase.v2.dto.CoinbaseUnitPrice; import static lombok.AccessLevel.PROTECTED; @@ -12,65 +11,37 @@ @FieldDefaults(level = PROTECTED) public class CoinbaseTransactionV2Expand { - String id; - String status; - CoinbaseTransactionV2 transaction; - String user_reference; - String created_at; - String updated_at; - String resource; - String resource_path; - CoinbaseTransactionV2Field payment_method; - boolean committed; - String payout_at; - String paymentMethodName; - CoinbaseAmount fee; - CoinbaseAmount amount; - CoinbaseAmount total; - CoinbaseAmount subtotal; - CoinbaseUnitPrice unitPrice; - String idem; - String next_step; + private final String id; + private final String paymentMethodName; + private final CoinbaseAmount fee; + private final CoinbaseAmount total; + private final CoinbaseAmount subtotal; + private final String idem; public CoinbaseTransactionV2Expand( @JsonProperty("id") String id, - @JsonProperty("status") String status, - @JsonProperty("transaction") CoinbaseTransactionV2 transaction, - @JsonProperty("user_reference") String userReference, - @JsonProperty("created_at") String createdAt, - @JsonProperty("updated_at") String updatedAt, - @JsonProperty("resource") String resource, - @JsonProperty("resource_path") String resourcePath, - @JsonProperty("payment_method") CoinbaseTransactionV2Field paymentMethod, - @JsonProperty("committed") boolean committed, - @JsonProperty("payout_at") String payoutAt, @JsonProperty("payment_method_name") String paymentMethodName, @JsonProperty("fee") CoinbaseAmount fee, - @JsonProperty("amount") CoinbaseAmount amount, @JsonProperty("total") CoinbaseAmount total, @JsonProperty("subtotal") CoinbaseAmount subtotal, - @JsonProperty("unit_price") CoinbaseUnitPrice unitPrice, - @JsonProperty("idem") String idem, - @JsonProperty("next_step") String nextStep) { - + @JsonProperty("idem") String idem) { this.id = id; - this.status = status; - this.transaction = transaction; - this.user_reference = userReference; - this.created_at = createdAt; - this.updated_at = updatedAt; - this.resource = resource; - this.resource_path = resourcePath; - this.payment_method = paymentMethod; - this.committed = committed; - this.payout_at = payoutAt; this.paymentMethodName = paymentMethodName; this.fee = fee; - this.amount = amount; this.total = total; this.subtotal = subtotal; - this.unitPrice = unitPrice; this.idem = idem; - this.next_step = nextStep; + } + + @Override + public String toString() { + return "{\"CoinbaseTransactionV2Expand\":{" + + "\"id\":\"" + id + "\"" + + ", \"paymentMethodName\":\"" + paymentMethodName + "\"" + + ", \"fee\":" + fee + + ", \"total\":" + total + + ", \"subtotal\":" + subtotal + + ", \"idem\":\"" + idem + "\"" + + "}}"; } } \ No newline at end of file From 34ff4e3f41402da8b20d1736d5ad83d13a07afea Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Thu, 23 May 2024 12:07:50 +0200 Subject: [PATCH 28/34] bugfix/1179-connectors-fixed-bug-when-downl --- .../CoinbaseShowTransactionV2.java | 4 +- .../account/transactions/CoinbaseTrade.java | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTrade.java diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java index 0a97152ed0e..b5c32365937 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseShowTransactionV2.java @@ -25,7 +25,7 @@ public class CoinbaseShowTransactionV2 { private final String idem; private final CoinbaseTransactionV2Expand buy; private final CoinbaseTransactionV2Expand sell; - private final CoinbaseTransactionV2Field trade; + private final CoinbaseTrade trade; public CoinbaseShowTransactionV2( @JsonProperty("id") String id, @@ -45,7 +45,7 @@ public CoinbaseShowTransactionV2( @JsonProperty("idem") String idem, @JsonProperty("buy") CoinbaseTransactionV2Expand buy, @JsonProperty("sell") CoinbaseTransactionV2Expand sell, - @JsonProperty("trade") CoinbaseTransactionV2Field trade + @JsonProperty("trade") CoinbaseTrade trade ) { this.id = id; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTrade.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTrade.java new file mode 100644 index 00000000000..75c9bd56270 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/dto/account/transactions/CoinbaseTrade.java @@ -0,0 +1,46 @@ +package org.knowm.xchange.coinbase.v2.dto.account.transactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +@Getter +public class CoinbaseTrade { + + private final String id; + private final String paymentMethodName; + private final String resource; + private final String resourcePath; + + public CoinbaseTrade( + @JsonProperty("id") String id, + @JsonProperty("payment_method_name") String paymentMethodName, + @JsonProperty("resource") String resource, + @JsonProperty("resource_path") String resourcePath) { + this.id = id; + this.paymentMethodName = paymentMethodName; + this.resource = resource; + this.resourcePath = resourcePath; + } + + @Override + public String toString() { + return "{" + + "\"id\":" + + '\"' + + id + + '\"' + + ",\"paymentMethodName\":" + + '\"' + + paymentMethodName + + '\"' + + ",\"resource\":" + + '\"' + + resource + + '\"' + + ",\"resourcePath\":" + + '\"' + + resourcePath + + '\"' + + '}'; + } +} From dbbf4aa799af852f2083bc61d6c4975dd2f32ce4 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 4 Jun 2024 12:08:41 +0200 Subject: [PATCH 29/34] bugfix/ETD-1285-connectors-coinbase-api-review- --- .../xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java index 6743217bec5..0bcb8753385 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java @@ -36,12 +36,13 @@ public List getExpandTransactions(String accountId, C throws IOException { String apiKey = exchange.getExchangeSpecification().getApiKey(); - BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); List result = new ArrayList<>(); String orderType = "asc"; boolean isNextPage = true; while (isNextPage) { + BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); + CoinbaseExpandTransactionsResponse response = coinbase.getExpandedTransactions( Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, From 6728cccecccdd552cbd31bbe150cb05965f48935 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Wed, 5 Jun 2024 12:20:00 +0200 Subject: [PATCH 30/34] bugfix/ETD-1285-connectors-coinbase-api-review- --- .../coinbase/v2/service/CoinbaseAccountServiceRaw.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java index 0bcb8753385..cf3c326dc3b 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java @@ -40,6 +40,7 @@ public List getExpandTransactions(String accountId, C List result = new ArrayList<>(); String orderType = "asc"; boolean isNextPage = true; + while (isNextPage) { BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); @@ -54,9 +55,8 @@ public List getExpandTransactions(String accountId, C isNextPage = false; } if(!response.getData().isEmpty()) { - CoinbaseShowTransactionV2 lastTx = response.getData().get(0); - params.setStartId(lastTx.getId()); result.addAll(response.getData()); + params.setStartId(response.getData().get(response.getData().size() - 1).getId()); } } return result; From 4d445a2cef5b08bdd44cb4074035711993722b1b Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Thu, 6 Jun 2024 10:12:57 +0200 Subject: [PATCH 31/34] bugfix/ETD-1285-connectors-coinbase-api-review- --- .../v2/service/CoinbaseAccountServiceRaw.java | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java index cf3c326dc3b..6e0ffbe9bcc 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java @@ -32,34 +32,19 @@ public CoinbaseTransactionsResponse getTransactions(String accountId) throws IOE Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); } - public List getExpandTransactions(String accountId, CoinbaseTradeHistoryParams params) + public CoinbaseExpandTransactionsResponse getExpandTransactions(String accountId, CoinbaseTradeHistoryParams params, String orderType) throws IOException { String apiKey = exchange.getExchangeSpecification().getApiKey(); + BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); - List result = new ArrayList<>(); - String orderType = "asc"; - boolean isNextPage = true; - - while (isNextPage) { - BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); - - CoinbaseExpandTransactionsResponse response = coinbase.getExpandedTransactions( + return coinbase.getExpandedTransactions( Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId, params.getLimit(), orderType, params.getStartId()); - if(response.getPagination().getNextUri() == null) { - isNextPage = false; - } - if(!response.getData().isEmpty()) { - result.addAll(response.getData()); - params.setStartId(response.getData().get(response.getData().size() - 1).getId()); - } - } - return result; } public Map getDeposits(String accountId) throws IOException { From 37859ce675bd95093a03c8ce31286c3c6a6ab435 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Mon, 10 Jun 2024 13:47:31 +0200 Subject: [PATCH 32/34] feature/ETD-1237-connectors-coinbase-cdp-api-key --- xchange-coinbase/pom.xml | 21 ++ .../v3/CoinbaseAuthenticatedV3CDP.java | 63 ++++++ .../coinbase/v4/CoinbaseAuthenticatedCDP.java | 174 +++++++++++++++++ .../xchange/coinbase/v4/CoinbaseCDP.java | 70 +++++++ .../coinbase/v4/CoinbaseExchangeCDP.java | 30 +++ .../coinbase/v4/CoinbaseV2DigestCDP.java | 115 +++++++++++ .../v4/service/CoinbaseAccountServiceCDP.java | 109 +++++++++++ .../service/CoinbaseAccountServiceRawCDP.java | 167 ++++++++++++++++ .../v4/service/CoinbaseBaseServiceCDP.java | 104 ++++++++++ .../v4/service/CoinbaseTradeServiceCDP.java | 107 ++++++++++ .../service/CoinbaseTradeServiceRawCDP.java | 182 ++++++++++++++++++ 11 files changed, 1142 insertions(+) create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/CoinbaseAuthenticatedV3CDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseCDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseExchangeCDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseV2DigestCDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceCDP.java create mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java diff --git a/xchange-coinbase/pom.xml b/xchange-coinbase/pom.xml index bd1b63c0acb..72e9c13561d 100644 --- a/xchange-coinbase/pom.xml +++ b/xchange-coinbase/pom.xml @@ -33,6 +33,27 @@ org.projectlombok lombok + + + + com.nimbusds + nimbus-jose-jwt + 9.40 + + + + + org.bouncycastle + bcprov-jdk18on + 1.78.1 + + + + + org.bouncycastle + bcpkix-jdk18on + 1.78.1 + diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/CoinbaseAuthenticatedV3CDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/CoinbaseAuthenticatedV3CDP.java new file mode 100644 index 00000000000..930c11ca3a6 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v3/CoinbaseAuthenticatedV3CDP.java @@ -0,0 +1,63 @@ +package org.knowm.xchange.coinbase.v3; + +import org.knowm.xchange.coinbase.v2.Coinbase; +import org.knowm.xchange.coinbase.v2.dto.CoinbaseException; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeAccountsResponse; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeOrderFillsResponse; +import si.mazi.rescu.ParamsDigest; + +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import java.io.IOException; + +import static org.knowm.xchange.coinbase.v2.CoinbaseV2Digest.ADVANCED_TRADING_V3; + +@Path(ADVANCED_TRADING_V3) +@Produces(MediaType.APPLICATION_JSON) +public interface CoinbaseAuthenticatedV3CDP extends Coinbase { + + /** + * All API key requests must be signed and contain the following headers. + * + *

All request bodies should have content type application/json and be valid JSON. + * + *

The CB-ACCESS-SIGN header is generated by creating a sha256 HMAC using the secret key on the + * prehash string timestamp + method + requestPath + body (where + represents string + * concatenation). The timestamp value is the same as the CB-ACCESS-TIMESTAMP header. + * + *

The body is the request body string or omitted if there is no request body (typically for + * GET requests). + * + *

The method should be UPPER CASE. + * + *

developers.coinbase.com/api/v2#api-key + */ + + // ok + @GET + @Path("accounts") + CoinbaseAdvancedTradeAccountsResponse getAccounts( + @HeaderParam("Authorization") ParamsDigest signature, + @QueryParam("limit") Integer limit, + @QueryParam("cursor") String cursor) + throws IOException, CoinbaseException; + + @GET + @Path("orders/historical/fills") + CoinbaseAdvancedTradeOrderFillsResponse getFills( + @HeaderParam("Authorization") ParamsDigest signature, + @QueryParam("order_id") String orderId, + @QueryParam("product_id") String productId, + @QueryParam("start_sequence_timestamp") String start, + @QueryParam("end_sequence_timestamp") String end, + @QueryParam("limit") int limit, + @QueryParam("cursor") String cursor + ) + throws IOException, CoinbaseException; + +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java new file mode 100644 index 00000000000..3693d4e221f --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java @@ -0,0 +1,174 @@ +package org.knowm.xchange.coinbase.v4; + +import org.knowm.xchange.coinbase.v2.dto.CoinbaseException; +import org.knowm.xchange.coinbase.v2.dto.account.*; +import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseBuySellResponse; +import si.mazi.rescu.ParamsDigest; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.Map; + +@Path("/v2") +@Produces(MediaType.APPLICATION_JSON) +public interface CoinbaseAuthenticatedCDP extends CoinbaseCDP { + + /** + * All API key requests must be signed and contain the following headers. + * + *

All request bodies should have content type application/json and be valid JSON. + * + *

The CB-ACCESS-SIGN header is generated by creating a sha256 HMAC using the secret key on the + * prehash string timestamp + method + requestPath + body (where + represents string + * concatenation). The timestamp value is the same as the CB-ACCESS-TIMESTAMP header. + * + *

The body is the request body string or omitted if there is no request body (typically for + * GET requests). + * + *

The method should be UPPER CASE. + * + *

developers.coinbase.com/api/v2#api-key + */ + String CB_ACCESS_KEY = "CB-ACCESS-KEY"; + + + String CB_ACCESS_SIGN = "CB-ACCESS-SIGN"; + String CB_ACCESS_TIMESTAMP = "CB-ACCESS-TIMESTAMP"; + + String CONTENT_TYPE = "Content-Type"; + + @GET + @Path("accounts/{accountId}/transactions") + CoinbaseTransactionsResponse getTransactions( + @HeaderParam(CB_ACCESS_SIGN) ParamsDigest signature, + @PathParam("accountId") String accountId) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{accountId}/transactions") + CoinbaseExpandTransactionsResponse getExpandedTransactions( + @HeaderParam("Authorization") ParamsDigest signature, + @PathParam("accountId") String accountId, + @QueryParam("limit") int limit, + @QueryParam("order") String orderType, + @QueryParam("starting_after") String startingFrom) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{accountId}/buys") + CoinbaseBuySellResponse getBuys( + @HeaderParam("Authorization") ParamsDigest signature, + @PathParam("accountId") String accountId, + @QueryParam("limit") Integer limit, + @QueryParam("starting_after") String startingAfter) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{accountId}/sells") + CoinbaseBuySellResponse getSells( + @HeaderParam("Authorization") ParamsDigest signature, + @PathParam("accountId") String accountId, + @QueryParam("limit") Integer limit, + @QueryParam("starting_after") String startingAfter) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{accountId}/deposits") + CoinbaseBuySellResponse getAllDeposits( + @HeaderParam("Authorization") ParamsDigest signature, + @PathParam("accountId") String accountId, + @QueryParam("limit") Integer limit, + @QueryParam("starting_after") String startingAfter) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{accountId}/withdrawals") + CoinbaseBuySellResponse getAllWithdrawals( + @HeaderParam("Authorization") ParamsDigest signature, + @PathParam("accountId") String accountId, + @QueryParam("limit") Integer limit, + @QueryParam("starting_after") String startingAfter) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{accountId}/deposits") + Map getDeposits( + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) ParamsDigest signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @PathParam("accountId") String accountId) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{accountId}/withdrawals") + Map getWithdrawals( + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) ParamsDigest signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @PathParam("accountId") String accountId) + throws IOException, CoinbaseException; + + @GET + @Path("accounts") + CoinbaseAccountsData getAccounts( + @HeaderParam("Authorization") ParamsDigest signature, + @QueryParam("limit") Integer limit, + @QueryParam("starting_after") String starting_after) + throws IOException, CoinbaseException; + + @GET + @Path("accounts/{currency}") + CoinbaseAccountData getAccount( + @HeaderParam("Authorization") ParamsDigest signature, + @PathParam("currency") String currency) + throws IOException, CoinbaseException; + + @POST + @Path("accounts") + @Consumes(MediaType.APPLICATION_JSON) + CoinbaseAccountData createAccount( + @HeaderParam(CONTENT_TYPE) String contentType, + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) String signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + Object payload) + throws IOException, CoinbaseException; + + @GET + @Path("payment-methods") + CoinbasePaymentMethodsData getPaymentMethods( + @HeaderParam("Authorization") ParamsDigest signature) + throws IOException, CoinbaseException; + + @POST + @Path("accounts/{account}/buys") + @Consumes(MediaType.APPLICATION_JSON) + CoinbaseBuyData buy( + @HeaderParam(CONTENT_TYPE) String contentType, + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) String signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @PathParam("account") String accountId, + Object payload) + throws IOException, CoinbaseException; + + @POST + @Path("accounts/{account}/sells") + @Consumes(MediaType.APPLICATION_JSON) + CoinbaseSellData sell( + @HeaderParam(CONTENT_TYPE) String contentType, + @HeaderParam(CB_VERSION) String apiVersion, + @HeaderParam(CB_ACCESS_KEY) String apiKey, + @HeaderParam(CB_ACCESS_SIGN) String signature, + @HeaderParam(CB_ACCESS_TIMESTAMP) BigDecimal timestamp, + @PathParam("account") String accountId, + Object payload) + throws IOException, CoinbaseException; +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseCDP.java new file mode 100644 index 00000000000..f13372ba2f4 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseCDP.java @@ -0,0 +1,70 @@ +package org.knowm.xchange.coinbase.v4; + +import org.knowm.xchange.coinbase.v2.dto.CoinbaseException; +import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseCurrencyData; +import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseExchangeRateData; +import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbasePriceData; +import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseTimeData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import java.io.IOException; + +@Path("/") +@Produces(MediaType.APPLICATION_JSON) +public interface CoinbaseCDP { + + public static Logger LOG = LoggerFactory.getLogger(CoinbaseCDP.class.getPackage().getName()); + + /** + * All API calls should be made with a CB-VERSION header which guarantees that your call is using + * the correct API version. developers.coinbase.com/api/v2#versioning + */ + final String CB_VERSION = "CB-VERSION"; + + final String CB_VERSION_VALUE = "2018-04-08"; + + @GET + @Path("currencies") + CoinbaseCurrencyData getCurrencies(@HeaderParam(CB_VERSION) String apiVersion) + throws IOException, CoinbaseException; + + @GET + @Path("exchange-rates") + CoinbaseExchangeRateData getCurrencyExchangeRates(@HeaderParam(CB_VERSION) String apiVersion) + throws IOException, CoinbaseException; + + @GET + @Path("prices/{pair}/buy") + CoinbasePriceData getBuyPrice( + @HeaderParam(CB_VERSION) String apiVersion, @PathParam("pair") String pair) + throws IOException, CoinbaseException; + + @GET + @Path("prices/{pair}/sell") + CoinbasePriceData getSellPrice( + @HeaderParam(CB_VERSION) String apiVersion, @PathParam("pair") String pair) + throws IOException, CoinbaseException; + + @GET + @Path("prices/{pair}/spot") + CoinbasePriceData getSpotRate( + @HeaderParam(CB_VERSION) String apiVersion, @PathParam("pair") String pair) + throws IOException, CoinbaseException; + + @GET + @Path("prices/{pair}/spot") + CoinbasePriceData getHistoricalSpotRate( + @HeaderParam(CB_VERSION) String apiVersion, + @PathParam("pair") String pair, + @QueryParam("date") String date) + throws IOException, CoinbaseException; + + @GET + @Path("time") + CoinbaseTimeData getTime(@HeaderParam(CB_VERSION) String apiVersion) + throws IOException, CoinbaseException; +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseExchangeCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseExchangeCDP.java new file mode 100644 index 00000000000..40950fb85ce --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseExchangeCDP.java @@ -0,0 +1,30 @@ +package org.knowm.xchange.coinbase.v4; + +import org.knowm.xchange.BaseExchange; +import org.knowm.xchange.Exchange; +import org.knowm.xchange.ExchangeSpecification; +import org.knowm.xchange.coinbase.v2.service.CoinbaseMarketDataService; +import org.knowm.xchange.coinbase.v4.service.CoinbaseAccountServiceCDP; +import org.knowm.xchange.coinbase.v4.service.CoinbaseTradeServiceCDP; + +public class CoinbaseExchangeCDP extends BaseExchange implements Exchange { + + @Override + protected void initServices() { + this.marketDataService = new CoinbaseMarketDataService(this); + this.accountService = new CoinbaseAccountServiceCDP(this); + this.tradeService = new CoinbaseTradeServiceCDP(this); + } + + @Override + public ExchangeSpecification getDefaultExchangeSpecification() { + + final ExchangeSpecification exchangeSpecification = new ExchangeSpecification(this.getClass()); + exchangeSpecification.setSslUri("https://api.coinbase.com"); + exchangeSpecification.setHost("api.coinbase.com"); + exchangeSpecification.setExchangeName("Coinbase"); + exchangeSpecification.setExchangeDescription( + "Founded in June of 2012, Coinbase is a bitcoin wallet and platform where merchants and consumers can transact with the new digital currency bitcoin."); + return exchangeSpecification; + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseV2DigestCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseV2DigestCDP.java new file mode 100644 index 00000000000..90adf03894d --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseV2DigestCDP.java @@ -0,0 +1,115 @@ +package org.knowm.xchange.coinbase.v4; + +import com.nimbusds.jose.JWSAlgorithm; +import com.nimbusds.jose.JWSHeader; +import com.nimbusds.jose.JWSSigner; +import com.nimbusds.jose.crypto.ECDSASigner; +import com.nimbusds.jwt.JWTClaimsSet; +import com.nimbusds.jwt.SignedJWT; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.openssl.PEMParser; +import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; +import org.knowm.xchange.service.BaseParamsDigest; +import si.mazi.rescu.RestInvocation; + +import java.io.StringReader; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.Security; +import java.security.interfaces.ECPrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; + +public class CoinbaseV2DigestCDP extends BaseParamsDigest { + + private final String cdpPrivateKey; + private final String cdpName; + + private CoinbaseV2DigestCDP(String cdpPrivateKey, String cdpName) { + super("nothing","HmacSHA256"); + this.cdpPrivateKey = cdpPrivateKey; + this.cdpName = cdpName; + } + + public static CoinbaseV2DigestCDP createInstance(String cdpPrivateKey, String cdpName) { + return (cdpPrivateKey == null || cdpName == null) ? null : new CoinbaseV2DigestCDP(cdpPrivateKey, cdpName); + } + + @Override + public String digestParams(RestInvocation restInvocation) { + String path = restInvocation.getInvocationUrl().replaceFirst("https://", "").replaceAll("\\?" + restInvocation.getQueryString(), ""); + String requestMethod = restInvocation.getHttpMethod(); + try { + return generateJwt(path, cdpPrivateKey, cdpName, requestMethod); + } catch (Exception e) { + throw new RuntimeException("Failed to generate JWT", e); + } + } + + public String generateJwt(String urlString, String cdpPrivateKey, String cdpName, String httpMethod) throws Exception { + // Register BouncyCastle as a security provider + Security.addProvider(new BouncyCastleProvider()); + + // Load environment variables + String privateKeyPEM = cdpPrivateKey; + String name = cdpName; + + // create header object + Map header = new HashMap<>(); + header.put("alg", "ES256"); + header.put("typ", "JWT"); + header.put("kid", name); + header.put("nonce", String.valueOf(Instant.now().getEpochSecond())); + + // create uri string for current request + String requestMethod = httpMethod; + String url = urlString; + String uri = requestMethod + " " + url; + + // create data object + Map data = new HashMap<>(); + data.put("iss", "cdp"); + data.put("nbf", Instant.now().getEpochSecond()); + data.put("exp", Instant.now().getEpochSecond() + 120); + data.put("sub", name); + data.put("uri", uri); + + // Load private key + PEMParser pemParser = new PEMParser(new StringReader(privateKeyPEM)); + JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); + Object object = pemParser.readObject(); + PrivateKey privateKey; + + if (object instanceof PrivateKey) { + privateKey = (PrivateKey) object; + } else if (object instanceof org.bouncycastle.openssl.PEMKeyPair) { + privateKey = converter.getPrivateKey(((org.bouncycastle.openssl.PEMKeyPair) object).getPrivateKeyInfo()); + } else { + throw new Exception("Unexpected private key format"); + } + pemParser.close(); + + // Convert to ECPrivateKey + KeyFactory keyFactory = KeyFactory.getInstance("EC"); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded()); + ECPrivateKey ecPrivateKey = (ECPrivateKey) keyFactory.generatePrivate(keySpec); + + // create JWT + JWTClaimsSet.Builder claimsSetBuilder = new JWTClaimsSet.Builder(); + for (Map.Entry entry : data.entrySet()) { + claimsSetBuilder.claim(entry.getKey(), entry.getValue()); + } + JWTClaimsSet claimsSet = claimsSetBuilder.build(); + + JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.ES256).customParams(header).build(); + SignedJWT signedJWT = new SignedJWT(jwsHeader, claimsSet); + + JWSSigner signer = new ECDSASigner(ecPrivateKey); + signedJWT.sign(signer); + + String sJWT = signedJWT.serialize(); + return "Bearer " + sJWT; + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java new file mode 100644 index 00000000000..a267a91e90c --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java @@ -0,0 +1,109 @@ +package org.knowm.xchange.coinbase.v4.service; + +import org.knowm.xchange.Exchange; +import org.knowm.xchange.coinbase.CoinbaseAdapters; +import org.knowm.xchange.coinbase.v2.service.CoinbaseTradeHistoryParams; +import org.knowm.xchange.coinbase.v4.CoinbaseCDP; +import org.knowm.xchange.coinbase.v2.dto.CoinbaseAmount; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData; +import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseBuySellResponse; +import org.knowm.xchange.currency.Currency; +import org.knowm.xchange.dto.account.AccountInfo; +import org.knowm.xchange.dto.account.Balance; +import org.knowm.xchange.dto.account.FundingRecord; +import org.knowm.xchange.dto.account.Wallet; +import org.knowm.xchange.exceptions.ExchangeException; +import org.knowm.xchange.exceptions.NotAvailableFromExchangeException; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; +import org.knowm.xchange.service.account.AccountService; +import org.knowm.xchange.service.trade.params.DefaultWithdrawFundsParams; +import org.knowm.xchange.service.trade.params.TradeHistoryParams; +import org.knowm.xchange.service.trade.params.WithdrawFundsParams; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public final class CoinbaseAccountServiceCDP extends CoinbaseAccountServiceRawCDP + implements AccountService { + + public CoinbaseAccountServiceCDP(Exchange exchange) { + + super(exchange); + } + + @Override + public AccountInfo getAccountInfo() throws IOException { + List wallets = new ArrayList<>(); + + List coinbaseAccounts = getCoinbaseAccounts(); + for (CoinbaseAccountData.CoinbaseAccount coinbaseAccount : coinbaseAccounts) { + CoinbaseAmount balance = coinbaseAccount.getBalance(); + Wallet wallet = + Wallet.Builder.from( + Arrays.asList( + new Balance( + Currency.getInstance(balance.getCurrency()), balance.getAmount()))) + .id(coinbaseAccount.getId()) + .build(); + wallets.add(wallet); + } + + return new AccountInfo(wallets); + } + + @Override + public String withdrawFunds(WithdrawFundsParams params) + throws ExchangeException, NotAvailableFromExchangeException, + NotYetImplementedForExchangeException, IOException { + 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); + } + + @Override + public TradeHistoryParams createFundingHistoryParams() { + return new CoinbaseTradeHistoryParams(); + } + + /** + * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). + * To get it is necessary to know the accountId (wallet ID) see {@link AccountInfo#getWallets()} + */ + public List getWithdrawalHistory(CoinbaseTradeHistoryParams params, String accountId) + throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + final CoinbaseBuySellResponse withdrawals = + coinbase.getAllWithdrawals( + signatureCreator2, + accountId, + params.getLimit(), + params.getStartId() + ); + return CoinbaseAdapters.adaptFundings(withdrawals.getData()); + } + + /** + * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). + * To get it is necessary to know the accountId (wallet ID) from {@link AccountInfo#getWallets()} + */ + public List getDepositHistory(CoinbaseTradeHistoryParams params, String accountId) + throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + final CoinbaseBuySellResponse deposits = + coinbase.getAllDeposits( + signatureCreator2, + accountId, + params.getLimit(), + params.getStartId() + ); + return CoinbaseAdapters.adaptFundings(deposits.getData()); + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java new file mode 100644 index 00000000000..9485e5486fc --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java @@ -0,0 +1,167 @@ +package org.knowm.xchange.coinbase.v4.service; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.knowm.xchange.Exchange; +import org.knowm.xchange.coinbase.v2.service.CoinbaseTradeHistoryParams; +import org.knowm.xchange.coinbase.v4.CoinbaseCDP; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData.CoinbaseAccount; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseExpandTransactionsResponse; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbasePaymentMethodsData.CoinbasePaymentMethod; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseTransactionsResponse; +import org.knowm.xchange.currency.Currency; + +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class CoinbaseAccountServiceRawCDP extends CoinbaseBaseServiceCDP { + + public CoinbaseAccountServiceRawCDP(Exchange exchange) { + super(exchange); + } + + public CoinbaseTransactionsResponse getTransactions(String accountId) throws IOException { + + return coinbase.getTransactions( + signatureCreator2, accountId); + } + + public CoinbaseExpandTransactionsResponse getExpandTransactions(String accountId, CoinbaseTradeHistoryParams params, String orderType) + throws IOException { + + return coinbase.getExpandedTransactions( + signatureCreator2, + accountId, + params.getLimit(), + orderType, + params.getStartId()); + } + + public Map getDeposits(String accountId) throws IOException { + String apiKey = exchange.getExchangeSpecification().getApiKey(); + BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + + return coinbase.getDeposits( + CoinbaseCDP.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); + } + + public Map getWithdrawals(String accountId) throws IOException { + String apiKey = exchange.getExchangeSpecification().getApiKey(); + BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + + return coinbase.getWithdrawals( + CoinbaseCDP.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); + } + + /** + * Authenticated resource that shows the current user accounts. + * + * @see developers.coinbase.com/api/v2#list-accounts + */ + public List getCoinbaseAccounts() throws IOException { + + List returnList = new ArrayList<>(); + List tmpList = null; + + String lastAccount = null; + do { + try { + tmpList = + coinbase + .getAccounts( + signatureCreator2, 100, lastAccount) + .getData(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + lastAccount = null; + if (tmpList != null && tmpList.size() > 0) { + returnList.addAll(tmpList); + lastAccount = tmpList.get(tmpList.size() - 1).getId(); + } + + } while (lastAccount != null && isValidUUID(lastAccount)); + + return returnList; + } + + private boolean isValidUUID(String uuid) { + try { + UUID.fromString(uuid); + return true; + } catch (IllegalArgumentException exception) { + return false; + } + } + + /** + * Authenticated resource that shows the current user account for the give currency. + * + * @see developers.coinbase.com/api/v2#show-an-account + */ + public CoinbaseAccount getCoinbaseAccount(Currency currency) throws IOException { + + return coinbase + .getAccount( + signatureCreator2, + currency.getCurrencyCode()) + .getData(); + } + + /** + * Authenticated resource that creates a new BTC account for the current user. + * + * @see developers.coinbase.com/api/v2#create-account + */ + public CoinbaseAccount createCoinbaseAccount(String name) throws IOException { + + CreateCoinbaseAccountPayload payload = new CreateCoinbaseAccountPayload(name); + + String path = "/v2/accounts"; + String apiKey = exchange.getExchangeSpecification().getApiKey(); + BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.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 + .createAccount( + MediaType.APPLICATION_JSON, + CoinbaseCDP.CB_VERSION_VALUE, + apiKey, + signature, + timestamp, + payload) + .getData(); + } + + /** + * Authenticated resource that shows the current user payment methods. + * + * @see developers.coinbase.com/api/v2?shell#list-payment-methods + */ + public List getCoinbasePaymentMethods() throws IOException { + + return coinbase + .getPaymentMethods(signatureCreator2) + .getData(); + } + + public static class CreateCoinbaseAccountPayload { + @JsonProperty String name; + + CreateCoinbaseAccountPayload(String name) { + this.name = name; + } + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java new file mode 100644 index 00000000000..3c113bdcdfe --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java @@ -0,0 +1,104 @@ +package org.knowm.xchange.coinbase.v4.service; + +import org.knowm.xchange.Exchange; +import org.knowm.xchange.client.ExchangeRestProxyBuilder; +import org.knowm.xchange.coinbase.service.CoinbaseDigest; +import org.knowm.xchange.coinbase.v3.CoinbaseAuthenticatedV3CDP; +import org.knowm.xchange.coinbase.v4.CoinbaseCDP; +import org.knowm.xchange.coinbase.v4.CoinbaseAuthenticatedCDP; +import org.knowm.xchange.coinbase.v4.CoinbaseV2DigestCDP; +import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseCurrencyData.CoinbaseCurrency; +import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseTimeData.CoinbaseTime; +import org.knowm.xchange.service.BaseExchangeService; +import org.knowm.xchange.service.BaseService; +import org.knowm.xchange.utils.DigestUtils; + +import javax.crypto.Mac; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.List; + +public class CoinbaseBaseServiceCDP extends BaseExchangeService implements BaseService { + + protected final CoinbaseAuthenticatedCDP coinbase; + protected final CoinbaseAuthenticatedV3CDP coinbaseV3; + protected final CoinbaseV2DigestCDP signatureCreator2; + + protected CoinbaseBaseServiceCDP(Exchange exchange) { + + super(exchange); + coinbase = + ExchangeRestProxyBuilder.forInterface( + CoinbaseAuthenticatedCDP.class, exchange.getExchangeSpecification()) + .build(); + + coinbaseV3 = + ExchangeRestProxyBuilder.forInterface( + CoinbaseAuthenticatedV3CDP.class, exchange.getExchangeSpecification()) + .build(); + + signatureCreator2 = + CoinbaseV2DigestCDP.createInstance(exchange.getExchangeSpecification().getSecretKey(), exchange.getExchangeSpecification().getApiKey()); + } + + /** + * Unauthenticated resource that returns currencies supported on Coinbase. + * + * @return A list of currency names and their corresponding ISO code. + * @see developers.coinbase.com/api/v2#get-currencies + */ + public List getCoinbaseCurrencies() throws IOException { + + return coinbase.getCurrencies(CoinbaseCDP.CB_VERSION_VALUE).getData(); + } + + /** + * Unauthenticated resource that tells you the server time. + * + * @return The current server time. + * @see developers.coinbase.com/api/v2#get-current-time + */ + public CoinbaseTime getCoinbaseTime() throws IOException { + + return coinbase.getTime(CoinbaseCDP.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) { + 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) { + CoinbaseCDP.LOG.debug(String.format("curl %s https://api.coinbase.com%s", headers, path)); + } else if (method == HttpMethod.POST) { + String payload = "-d '" + json + "'"; + CoinbaseCDP.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)); + } + } + + public enum HttpMethod { + GET, + POST + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceCDP.java new file mode 100644 index 00000000000..31e1fe1c585 --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceCDP.java @@ -0,0 +1,107 @@ +package org.knowm.xchange.coinbase.v4.service; + +import org.knowm.xchange.Exchange; +import org.knowm.xchange.coinbase.CoinbaseAdapters; +import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseBuySellResponse; +import org.knowm.xchange.coinbase.v2.service.CoinbaseTradeHistoryParams; +import org.knowm.xchange.dto.Order; +import org.knowm.xchange.dto.account.AccountInfo; +import org.knowm.xchange.dto.trade.LimitOrder; +import org.knowm.xchange.dto.trade.OpenOrders; +import org.knowm.xchange.dto.trade.StopOrder; +import org.knowm.xchange.dto.trade.UserTrades; +import org.knowm.xchange.exceptions.ExchangeException; +import org.knowm.xchange.exceptions.NotAvailableFromExchangeException; +import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; +import org.knowm.xchange.service.trade.TradeService; +import org.knowm.xchange.service.trade.params.CancelOrderParams; +import org.knowm.xchange.service.trade.params.TradeHistoryParams; +import org.knowm.xchange.service.trade.params.orders.OpenOrdersParams; + +import java.io.IOException; + +public final class CoinbaseTradeServiceCDP extends CoinbaseTradeServiceRawCDP implements TradeService { + + public CoinbaseTradeServiceCDP(Exchange exchange) { + super(exchange); + } + + /** + * ******************************************************************************************************************************************************** + */ + @Override + public OpenOrders getOpenOrders() throws NotAvailableFromExchangeException, IOException { + return getOpenOrders(createOpenOrdersParams()); + } + + @Override + public OpenOrders getOpenOrders(OpenOrdersParams params) + throws ExchangeException, NotAvailableFromExchangeException, + NotYetImplementedForExchangeException, IOException { + throw new NotAvailableFromExchangeException(); + } + + @Override + public String placeLimitOrder(LimitOrder limitOrder) throws NotAvailableFromExchangeException { + + throw new NotAvailableFromExchangeException(); + } + + @Override + public String placeStopOrder(StopOrder stopOrder) throws IOException { + throw new NotAvailableFromExchangeException(); + } + + @Override + public boolean cancelOrder(String orderId) throws NotAvailableFromExchangeException { + + throw new NotAvailableFromExchangeException(); + } + + @Override + public boolean cancelOrder(CancelOrderParams orderParams) + throws ExchangeException, NotAvailableFromExchangeException, + NotYetImplementedForExchangeException, IOException { + throw new NotAvailableFromExchangeException(); + } + + @Override + public TradeHistoryParams createTradeHistoryParams() { + return new CoinbaseTradeHistoryParams(); + } + + @Override + public OpenOrdersParams createOpenOrdersParams() { + return null; + } + + /** + * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). + * To get it is necessary to know the accountId (wallet ID) see {@link AccountInfo#getWallets()} + */ + public UserTrades getBuyTradeHistory(CoinbaseTradeHistoryParams params, String accountId) + throws IOException { + final CoinbaseBuySellResponse buys = + coinbase.getBuys( + signatureCreator2, + accountId, + params.getLimit(), + params.getStartId()); + return CoinbaseAdapters.adaptTrades(buys.getData(), Order.OrderType.BID); + } + + /** + * The Coinbase is not typical exchange. It has splitted buys and sells into wallets (accounts). + * To get it is necessary to know the accountId (wallet ID) from {@link AccountInfo#getWallets()} + */ + public UserTrades getSellTradeHistory(CoinbaseTradeHistoryParams params, String accountId) + throws IOException { + final CoinbaseBuySellResponse sells = + coinbase.getSells( + signatureCreator2, + accountId, + params.getLimit(), + params.getStartId()); + return CoinbaseAdapters.adaptTrades(sells.getData(), Order.OrderType.ASK); + } +} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java new file mode 100644 index 00000000000..4f4af07965a --- /dev/null +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java @@ -0,0 +1,182 @@ +package org.knowm.xchange.coinbase.v4.service; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.knowm.xchange.Exchange; +import org.knowm.xchange.coinbase.v2.service.CoinbaseTradeHistoryParams; +import org.knowm.xchange.coinbase.v4.CoinbaseCDP; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseBuyData.CoinbaseBuy; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseSellData.CoinbaseSell; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeAccountsResponse; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeFills; +import org.knowm.xchange.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeOrderFillsResponse; +import org.knowm.xchange.currency.Currency; + +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.List; + +class CoinbaseTradeServiceRawCDP extends CoinbaseBaseServiceCDP { + + protected CoinbaseTradeServiceRawCDP(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(CoinbaseCDP.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, + CoinbaseCDP.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)); + } + + /** + * + * @param params + * @return + * @throws IOException + */ + public List getAdvancedTradeOrderFills(CoinbaseTradeHistoryParams params) + throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + String start = params.getStartDatetime().toString(); + String end = params.getEndDateTime().toString(); + return coinbaseV3.getFills( + signatureCreator2, null, null, start, end, params.getLimit(), params.getCursor()) + .getFills(); + } + + /** + * + * @param params + * @return + * @throws IOException + */ + public CoinbaseAdvancedTradeOrderFillsResponse getAdvancedTradeOrderFillsRow(CoinbaseTradeHistoryParams params) + throws IOException { + String start = params.getStartDatetime().toString(); + String end = params.getEndDateTime().toString(); + return coinbaseV3.getFills( + signatureCreator2, null, null, start, end, params.getLimit(), params.getCursor()); + } + + /** + * + * @return + * @throws IOException + */ + public CoinbaseAdvancedTradeAccountsResponse getAdvancedTradeAccounts() throws IOException { + final String apiKey = exchange.getExchangeSpecification().getApiKey(); + final BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + return coinbaseV3.getAccounts( + signatureCreator2, null, null); + } + + /** + * 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(CoinbaseCDP.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, + CoinbaseCDP.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; + } + } +} From cf69e6b9ccd78ad3373f6df7162fb23e57c50ac1 Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Mon, 10 Jun 2024 13:55:16 +0200 Subject: [PATCH 33/34] feature/ETD-1237-connectors-coinbase-cdp-api-key --- .../coinbase/v4/CoinbaseAuthenticatedCDP.java | 21 +++++- .../xchange/coinbase/v4/CoinbaseCDP.java | 70 ------------------- .../v4/service/CoinbaseAccountServiceCDP.java | 6 +- .../service/CoinbaseAccountServiceRawCDP.java | 14 ++-- .../v4/service/CoinbaseBaseServiceCDP.java | 10 +-- .../service/CoinbaseTradeServiceRawCDP.java | 14 ++-- 6 files changed, 40 insertions(+), 95 deletions(-) delete mode 100644 xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseCDP.java diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java index 3693d4e221f..615bd60a5d0 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java @@ -1,11 +1,26 @@ package org.knowm.xchange.coinbase.v4; +import org.knowm.xchange.coinbase.v2.Coinbase; import org.knowm.xchange.coinbase.v2.dto.CoinbaseException; -import org.knowm.xchange.coinbase.v2.dto.account.*; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountsData; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseBuyData; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseExpandTransactionsResponse; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbasePaymentMethodsData; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseSellData; +import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseTransactionsResponse; import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseBuySellResponse; import si.mazi.rescu.ParamsDigest; -import javax.ws.rs.*; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import java.io.IOException; import java.math.BigDecimal; @@ -13,7 +28,7 @@ @Path("/v2") @Produces(MediaType.APPLICATION_JSON) -public interface CoinbaseAuthenticatedCDP extends CoinbaseCDP { +public interface CoinbaseAuthenticatedCDP extends Coinbase { /** * All API key requests must be signed and contain the following headers. diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseCDP.java deleted file mode 100644 index f13372ba2f4..00000000000 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseCDP.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.knowm.xchange.coinbase.v4; - -import org.knowm.xchange.coinbase.v2.dto.CoinbaseException; -import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseCurrencyData; -import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseExchangeRateData; -import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbasePriceData; -import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseTimeData; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import java.io.IOException; - -@Path("/") -@Produces(MediaType.APPLICATION_JSON) -public interface CoinbaseCDP { - - public static Logger LOG = LoggerFactory.getLogger(CoinbaseCDP.class.getPackage().getName()); - - /** - * All API calls should be made with a CB-VERSION header which guarantees that your call is using - * the correct API version. developers.coinbase.com/api/v2#versioning - */ - final String CB_VERSION = "CB-VERSION"; - - final String CB_VERSION_VALUE = "2018-04-08"; - - @GET - @Path("currencies") - CoinbaseCurrencyData getCurrencies(@HeaderParam(CB_VERSION) String apiVersion) - throws IOException, CoinbaseException; - - @GET - @Path("exchange-rates") - CoinbaseExchangeRateData getCurrencyExchangeRates(@HeaderParam(CB_VERSION) String apiVersion) - throws IOException, CoinbaseException; - - @GET - @Path("prices/{pair}/buy") - CoinbasePriceData getBuyPrice( - @HeaderParam(CB_VERSION) String apiVersion, @PathParam("pair") String pair) - throws IOException, CoinbaseException; - - @GET - @Path("prices/{pair}/sell") - CoinbasePriceData getSellPrice( - @HeaderParam(CB_VERSION) String apiVersion, @PathParam("pair") String pair) - throws IOException, CoinbaseException; - - @GET - @Path("prices/{pair}/spot") - CoinbasePriceData getSpotRate( - @HeaderParam(CB_VERSION) String apiVersion, @PathParam("pair") String pair) - throws IOException, CoinbaseException; - - @GET - @Path("prices/{pair}/spot") - CoinbasePriceData getHistoricalSpotRate( - @HeaderParam(CB_VERSION) String apiVersion, - @PathParam("pair") String pair, - @QueryParam("date") String date) - throws IOException, CoinbaseException; - - @GET - @Path("time") - CoinbaseTimeData getTime(@HeaderParam(CB_VERSION) String apiVersion) - throws IOException, CoinbaseException; -} diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java index a267a91e90c..e2e721c533c 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java @@ -3,7 +3,7 @@ import org.knowm.xchange.Exchange; import org.knowm.xchange.coinbase.CoinbaseAdapters; import org.knowm.xchange.coinbase.v2.service.CoinbaseTradeHistoryParams; -import org.knowm.xchange.coinbase.v4.CoinbaseCDP; +import org.knowm.xchange.coinbase.v2.Coinbase; import org.knowm.xchange.coinbase.v2.dto.CoinbaseAmount; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData; import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseBuySellResponse; @@ -78,7 +78,7 @@ public TradeHistoryParams createFundingHistoryParams() { public List getWithdrawalHistory(CoinbaseTradeHistoryParams params, String accountId) throws IOException { final String apiKey = exchange.getExchangeSpecification().getApiKey(); - final BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); final CoinbaseBuySellResponse withdrawals = coinbase.getAllWithdrawals( signatureCreator2, @@ -96,7 +96,7 @@ public List getWithdrawalHistory(CoinbaseTradeHistoryParams param public List getDepositHistory(CoinbaseTradeHistoryParams params, String accountId) throws IOException { final String apiKey = exchange.getExchangeSpecification().getApiKey(); - final BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); final CoinbaseBuySellResponse deposits = coinbase.getAllDeposits( signatureCreator2, diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java index 9485e5486fc..660ba3c1189 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.knowm.xchange.Exchange; import org.knowm.xchange.coinbase.v2.service.CoinbaseTradeHistoryParams; -import org.knowm.xchange.coinbase.v4.CoinbaseCDP; +import org.knowm.xchange.coinbase.v2.Coinbase; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData.CoinbaseAccount; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseExpandTransactionsResponse; import org.knowm.xchange.coinbase.v2.dto.account.CoinbasePaymentMethodsData.CoinbasePaymentMethod; @@ -44,18 +44,18 @@ public CoinbaseExpandTransactionsResponse getExpandTransactions(String accountId public Map getDeposits(String accountId) throws IOException { String apiKey = exchange.getExchangeSpecification().getApiKey(); - BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); return coinbase.getDeposits( - CoinbaseCDP.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); + Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); } public Map getWithdrawals(String accountId) throws IOException { String apiKey = exchange.getExchangeSpecification().getApiKey(); - BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); return coinbase.getWithdrawals( - CoinbaseCDP.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); + Coinbase.CB_VERSION_VALUE, apiKey, signatureCreator2, timestamp, accountId); } /** @@ -128,7 +128,7 @@ public CoinbaseAccount createCoinbaseAccount(String name) throws IOException { String path = "/v2/accounts"; String apiKey = exchange.getExchangeSpecification().getApiKey(); - BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + 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); @@ -136,7 +136,7 @@ public CoinbaseAccount createCoinbaseAccount(String name) throws IOException { return coinbase .createAccount( MediaType.APPLICATION_JSON, - CoinbaseCDP.CB_VERSION_VALUE, + Coinbase.CB_VERSION_VALUE, apiKey, signature, timestamp, diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java index 3c113bdcdfe..3b27e47edd1 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java @@ -4,7 +4,7 @@ import org.knowm.xchange.client.ExchangeRestProxyBuilder; import org.knowm.xchange.coinbase.service.CoinbaseDigest; import org.knowm.xchange.coinbase.v3.CoinbaseAuthenticatedV3CDP; -import org.knowm.xchange.coinbase.v4.CoinbaseCDP; +import org.knowm.xchange.coinbase.v2.Coinbase; import org.knowm.xchange.coinbase.v4.CoinbaseAuthenticatedCDP; import org.knowm.xchange.coinbase.v4.CoinbaseV2DigestCDP; import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseCurrencyData.CoinbaseCurrency; @@ -52,7 +52,7 @@ protected CoinbaseBaseServiceCDP(Exchange exchange) { */ public List getCoinbaseCurrencies() throws IOException { - return coinbase.getCurrencies(CoinbaseCDP.CB_VERSION_VALUE).getData(); + return coinbase.getCurrencies(Coinbase.CB_VERSION_VALUE).getData(); } /** @@ -64,7 +64,7 @@ public List getCoinbaseCurrencies() throws IOException { */ public CoinbaseTime getCoinbaseTime() throws IOException { - return coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData(); + return coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData(); } protected String getSignature(BigDecimal timestamp, HttpMethod method, String path, String body) { @@ -87,10 +87,10 @@ protected void showCurl( "-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) { - CoinbaseCDP.LOG.debug(String.format("curl %s https://api.coinbase.com%s", headers, path)); + Coinbase.LOG.debug(String.format("curl %s https://api.coinbase.com%s", headers, path)); } else if (method == HttpMethod.POST) { String payload = "-d '" + json + "'"; - CoinbaseCDP.LOG.debug( + 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)); diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java index 4f4af07965a..8db0d25b485 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.knowm.xchange.Exchange; import org.knowm.xchange.coinbase.v2.service.CoinbaseTradeHistoryParams; -import org.knowm.xchange.coinbase.v4.CoinbaseCDP; +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.coinbase.v3.dto.transactions.CoinbaseAdvancedTradeAccountsResponse; @@ -37,7 +37,7 @@ public CoinbaseBuy buy(String accountId, BigDecimal total, Currency currency, bo String path = "/v2/accounts/" + accountId + "/buys"; String apiKey = exchange.getExchangeSpecification().getApiKey(); - BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + 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); @@ -47,7 +47,7 @@ public CoinbaseBuy buy(String accountId, BigDecimal total, Currency currency, bo return coinbase .buy( MediaType.APPLICATION_JSON, - CoinbaseCDP.CB_VERSION_VALUE, + Coinbase.CB_VERSION_VALUE, apiKey, signature, timestamp, @@ -80,7 +80,7 @@ public CoinbaseSell sell(String accountId, BigDecimal total, Currency currency, public List getAdvancedTradeOrderFills(CoinbaseTradeHistoryParams params) throws IOException { final String apiKey = exchange.getExchangeSpecification().getApiKey(); - final BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); String start = params.getStartDatetime().toString(); String end = params.getEndDateTime().toString(); return coinbaseV3.getFills( @@ -109,7 +109,7 @@ public CoinbaseAdvancedTradeOrderFillsResponse getAdvancedTradeOrderFillsRow(Coi */ public CoinbaseAdvancedTradeAccountsResponse getAdvancedTradeAccounts() throws IOException { final String apiKey = exchange.getExchangeSpecification().getApiKey(); - final BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + final BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); return coinbaseV3.getAccounts( signatureCreator2, null, null); } @@ -132,7 +132,7 @@ private CoinbaseSell sellInternal(String accountId, SellPayload payload) throws String path = "/v2/accounts/" + accountId + "/sells"; String apiKey = exchange.getExchangeSpecification().getApiKey(); - BigDecimal timestamp = coinbase.getTime(CoinbaseCDP.CB_VERSION_VALUE).getData().getEpoch(); + BigDecimal timestamp = coinbase.getTime(Coinbase.CB_VERSION_VALUE).getData().getEpoch(); String body = new ObjectMapper().writeValueAsString(payload); String signature = getSignature(timestamp, HttpMethod.POST, path, body); @@ -141,7 +141,7 @@ private CoinbaseSell sellInternal(String accountId, SellPayload payload) throws return coinbase .sell( MediaType.APPLICATION_JSON, - CoinbaseCDP.CB_VERSION_VALUE, + Coinbase.CB_VERSION_VALUE, apiKey, signature, timestamp, From 3ded337bb7e3e78c3d256fc3993cd3a6f059f45e Mon Sep 17 00:00:00 2001 From: MiroDoan Date: Tue, 11 Jun 2024 11:00:08 +0200 Subject: [PATCH 34/34] feature/ETD-1237-connectors-coinbase-cdp-api-key --- .../{v4 => cdp}/CoinbaseAuthenticatedCDP.java | 4 ++-- .../{v4 => cdp}/CoinbaseExchangeCDP.java | 6 +++--- .../{v4 => cdp}/CoinbaseV2DigestCDP.java | 4 ++-- .../service/CoinbaseAccountServiceCDP.java | 2 +- .../service/CoinbaseAccountServiceRawCDP.java | 2 +- .../service/CoinbaseBaseServiceCDP.java | 6 +++--- .../service/CoinbaseTradeServiceCDP.java | 2 +- .../service/CoinbaseTradeServiceRawCDP.java | 2 +- .../xchange/coinbase/v2/CoinbaseExchange.java | 11 +++++++++-- .../v2/service/CoinbaseAccountService.java | 14 ++++++-------- .../v2/service/CoinbaseAccountServiceRaw.java | 16 ++++++++-------- 11 files changed, 37 insertions(+), 32 deletions(-) rename xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/{v4 => cdp}/CoinbaseAuthenticatedCDP.java (98%) rename xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/{v4 => cdp}/CoinbaseExchangeCDP.java (85%) rename xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/{v4 => cdp}/CoinbaseV2DigestCDP.java (97%) rename xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/{v4 => cdp}/service/CoinbaseAccountServiceCDP.java (98%) rename xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/{v4 => cdp}/service/CoinbaseAccountServiceRawCDP.java (99%) rename xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/{v4 => cdp}/service/CoinbaseBaseServiceCDP.java (95%) rename xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/{v4 => cdp}/service/CoinbaseTradeServiceCDP.java (98%) rename xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/{v4 => cdp}/service/CoinbaseTradeServiceRawCDP.java (99%) diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseAuthenticatedCDP.java similarity index 98% rename from xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java rename to xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseAuthenticatedCDP.java index 615bd60a5d0..229810d292e 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseAuthenticatedCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseAuthenticatedCDP.java @@ -1,4 +1,4 @@ -package org.knowm.xchange.coinbase.v4; +package org.knowm.xchange.coinbase.cdp; import org.knowm.xchange.coinbase.v2.Coinbase; import org.knowm.xchange.coinbase.v2.dto.CoinbaseException; @@ -58,7 +58,7 @@ public interface CoinbaseAuthenticatedCDP extends Coinbase { @GET @Path("accounts/{accountId}/transactions") CoinbaseTransactionsResponse getTransactions( - @HeaderParam(CB_ACCESS_SIGN) ParamsDigest signature, + @HeaderParam("Authorization") ParamsDigest signature, @PathParam("accountId") String accountId) throws IOException, CoinbaseException; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseExchangeCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseExchangeCDP.java similarity index 85% rename from xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseExchangeCDP.java rename to xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseExchangeCDP.java index 40950fb85ce..cedb4c2ce9e 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseExchangeCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseExchangeCDP.java @@ -1,11 +1,11 @@ -package org.knowm.xchange.coinbase.v4; +package org.knowm.xchange.coinbase.cdp; import org.knowm.xchange.BaseExchange; import org.knowm.xchange.Exchange; import org.knowm.xchange.ExchangeSpecification; import org.knowm.xchange.coinbase.v2.service.CoinbaseMarketDataService; -import org.knowm.xchange.coinbase.v4.service.CoinbaseAccountServiceCDP; -import org.knowm.xchange.coinbase.v4.service.CoinbaseTradeServiceCDP; +import org.knowm.xchange.coinbase.cdp.service.CoinbaseAccountServiceCDP; +import org.knowm.xchange.coinbase.cdp.service.CoinbaseTradeServiceCDP; public class CoinbaseExchangeCDP extends BaseExchange implements Exchange { diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseV2DigestCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseV2DigestCDP.java similarity index 97% rename from xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseV2DigestCDP.java rename to xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseV2DigestCDP.java index 90adf03894d..674ddac0e36 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/CoinbaseV2DigestCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/CoinbaseV2DigestCDP.java @@ -1,4 +1,4 @@ -package org.knowm.xchange.coinbase.v4; +package org.knowm.xchange.coinbase.cdp; import com.nimbusds.jose.JWSAlgorithm; import com.nimbusds.jose.JWSHeader; @@ -53,7 +53,7 @@ public String generateJwt(String urlString, String cdpPrivateKey, String cdpName Security.addProvider(new BouncyCastleProvider()); // Load environment variables - String privateKeyPEM = cdpPrivateKey; + String privateKeyPEM = cdpPrivateKey.replace("\\n", "\n"); String name = cdpName; // create header object diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseAccountServiceCDP.java similarity index 98% rename from xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java rename to xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseAccountServiceCDP.java index e2e721c533c..c2d8eb8fdd5 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseAccountServiceCDP.java @@ -1,4 +1,4 @@ -package org.knowm.xchange.coinbase.v4.service; +package org.knowm.xchange.coinbase.cdp.service; import org.knowm.xchange.Exchange; import org.knowm.xchange.coinbase.CoinbaseAdapters; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseAccountServiceRawCDP.java similarity index 99% rename from xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java rename to xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseAccountServiceRawCDP.java index 660ba3c1189..1efb2d366c9 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseAccountServiceRawCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseAccountServiceRawCDP.java @@ -1,4 +1,4 @@ -package org.knowm.xchange.coinbase.v4.service; +package org.knowm.xchange.coinbase.cdp.service; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseBaseServiceCDP.java similarity index 95% rename from xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java rename to xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseBaseServiceCDP.java index 3b27e47edd1..5b459d5e937 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseBaseServiceCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseBaseServiceCDP.java @@ -1,12 +1,12 @@ -package org.knowm.xchange.coinbase.v4.service; +package org.knowm.xchange.coinbase.cdp.service; import org.knowm.xchange.Exchange; import org.knowm.xchange.client.ExchangeRestProxyBuilder; import org.knowm.xchange.coinbase.service.CoinbaseDigest; import org.knowm.xchange.coinbase.v3.CoinbaseAuthenticatedV3CDP; import org.knowm.xchange.coinbase.v2.Coinbase; -import org.knowm.xchange.coinbase.v4.CoinbaseAuthenticatedCDP; -import org.knowm.xchange.coinbase.v4.CoinbaseV2DigestCDP; +import org.knowm.xchange.coinbase.cdp.CoinbaseAuthenticatedCDP; +import org.knowm.xchange.coinbase.cdp.CoinbaseV2DigestCDP; import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseCurrencyData.CoinbaseCurrency; import org.knowm.xchange.coinbase.v2.dto.marketdata.CoinbaseTimeData.CoinbaseTime; import org.knowm.xchange.service.BaseExchangeService; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseTradeServiceCDP.java similarity index 98% rename from xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceCDP.java rename to xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseTradeServiceCDP.java index 31e1fe1c585..fbee5f6b508 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseTradeServiceCDP.java @@ -1,4 +1,4 @@ -package org.knowm.xchange.coinbase.v4.service; +package org.knowm.xchange.coinbase.cdp.service; import org.knowm.xchange.Exchange; import org.knowm.xchange.coinbase.CoinbaseAdapters; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseTradeServiceRawCDP.java similarity index 99% rename from xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java rename to xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseTradeServiceRawCDP.java index 8db0d25b485..1598cb85840 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v4/service/CoinbaseTradeServiceRawCDP.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/cdp/service/CoinbaseTradeServiceRawCDP.java @@ -1,4 +1,4 @@ -package org.knowm.xchange.coinbase.v4.service; +package org.knowm.xchange.coinbase.cdp.service; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseExchange.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseExchange.java index 7c95f4e19bd..5ea465d82a1 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseExchange.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/CoinbaseExchange.java @@ -6,14 +6,21 @@ import org.knowm.xchange.coinbase.v2.service.CoinbaseAccountService; import org.knowm.xchange.coinbase.v2.service.CoinbaseMarketDataService; import org.knowm.xchange.coinbase.v2.service.CoinbaseTradeService; +import org.knowm.xchange.coinbase.cdp.service.CoinbaseAccountServiceCDP; +import org.knowm.xchange.coinbase.cdp.service.CoinbaseTradeServiceCDP; public class CoinbaseExchange extends BaseExchange implements Exchange { @Override protected void initServices() { this.marketDataService = new CoinbaseMarketDataService(this); - this.accountService = new CoinbaseAccountService(this); - this.tradeService = new CoinbaseTradeService(this); + if (exchangeSpecification.getApiKey().startsWith("organizations")){ + this.accountService = new CoinbaseAccountServiceCDP(this); + this.tradeService = new CoinbaseTradeServiceCDP(this); + } else { + this.accountService = new CoinbaseAccountService(this); + this.tradeService = new CoinbaseTradeService(this); + } } @Override diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java index e6a642653e8..d8e085bca72 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountService.java @@ -1,10 +1,5 @@ package org.knowm.xchange.coinbase.v2.service; -import java.io.IOException; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import org.knowm.xchange.Exchange; import org.knowm.xchange.coinbase.CoinbaseAdapters; import org.knowm.xchange.coinbase.v2.Coinbase; @@ -12,21 +7,24 @@ import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseAccountData; import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseBuySellResponse; import org.knowm.xchange.currency.Currency; -import org.knowm.xchange.dto.Order; import org.knowm.xchange.dto.account.AccountInfo; import org.knowm.xchange.dto.account.Balance; import org.knowm.xchange.dto.account.FundingRecord; import org.knowm.xchange.dto.account.Wallet; -import org.knowm.xchange.dto.trade.UserTrades; import org.knowm.xchange.exceptions.ExchangeException; import org.knowm.xchange.exceptions.NotAvailableFromExchangeException; import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException; import org.knowm.xchange.service.account.AccountService; -import org.knowm.xchange.service.trade.params.DefaultTradeHistoryParamPaging; import org.knowm.xchange.service.trade.params.DefaultWithdrawFundsParams; import org.knowm.xchange.service.trade.params.TradeHistoryParams; import org.knowm.xchange.service.trade.params.WithdrawFundsParams; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public final class CoinbaseAccountService extends CoinbaseAccountServiceRaw implements AccountService { diff --git a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java index 6e0ffbe9bcc..c2f71312ef1 100644 --- a/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java +++ b/xchange-coinbase/src/main/java/org/knowm/xchange/coinbase/v2/service/CoinbaseAccountServiceRaw.java @@ -2,22 +2,22 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; -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.CoinbaseAccountData.CoinbaseAccount; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseExpandTransactionsResponse; import org.knowm.xchange.coinbase.v2.dto.account.CoinbasePaymentMethodsData.CoinbasePaymentMethod; import org.knowm.xchange.coinbase.v2.dto.account.CoinbaseTransactionsResponse; -import org.knowm.xchange.coinbase.v2.dto.account.transactions.CoinbaseShowTransactionV2; import org.knowm.xchange.currency.Currency; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + public class CoinbaseAccountServiceRaw extends CoinbaseBaseService { public CoinbaseAccountServiceRaw(Exchange exchange) {