From 6b23c4aedb521d9bcea0a25d65e3c0a69c4ec05c Mon Sep 17 00:00:00 2001 From: Greg <40721505+gregoreficint@users.noreply.github.com> Date: Thu, 13 Jan 2022 12:46:48 +0100 Subject: [PATCH] Adds DustLog History to Binance and adds additional response to Kraken. (#4370) * Adds the new response "EGeneral:Too many requests" from Kraken to the base service. See https://github.com/knowm/XChange/issues/4369#issue-1088385658 * Added new possibility to use the DustLog call (GET /sapi/v1/asset/dribblet) in Binance that gives you the history of your conversion results for small balances that are so small that they cannot be traded. See https://github.com/knowm/XChange/issues/4371. * Implemented suggestions from @walec51. --- .../xchange/binance/BinanceAuthenticated.java | 28 +++ .../dto/trade/BinanceDribbletDetails.java | 52 +++++ .../binance/dto/trade/BinanceDribblets.java | 47 ++++ .../binance/dto/trade/BinanceDustLog.java | 24 ++ .../binance/service/BinanceTradeService.java | 1 + .../service/BinanceTradeServiceRaw.java | 58 ++++- .../binance/BinanceExchangeIntegration.java | 17 +- .../trade/TradeServiceIntegration.java | 34 +++ .../src/test/resources/__files/dustlog.json | 206 ++++++++++++++++++ .../kraken/service/KrakenBaseService.java | 1 + 10 files changed, 455 insertions(+), 13 deletions(-) create mode 100644 xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDribbletDetails.java create mode 100644 xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDribblets.java create mode 100644 xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDustLog.java create mode 100644 xchange-binance/src/test/resources/__files/dustlog.json diff --git a/xchange-binance/src/main/java/org/knowm/xchange/binance/BinanceAuthenticated.java b/xchange-binance/src/main/java/org/knowm/xchange/binance/BinanceAuthenticated.java index 5d49840fde5..01c947f2467 100644 --- a/xchange-binance/src/main/java/org/knowm/xchange/binance/BinanceAuthenticated.java +++ b/xchange-binance/src/main/java/org/knowm/xchange/binance/BinanceAuthenticated.java @@ -18,6 +18,7 @@ import org.knowm.xchange.binance.dto.BinanceException; import org.knowm.xchange.binance.dto.account.*; import org.knowm.xchange.binance.dto.trade.BinanceCancelledOrder; +import org.knowm.xchange.binance.dto.trade.BinanceDustLog; import org.knowm.xchange.binance.dto.trade.BinanceListenKey; import org.knowm.xchange.binance.dto.trade.BinanceNewOrder; import org.knowm.xchange.binance.dto.trade.BinanceOrder; @@ -287,6 +288,33 @@ List myTrades( @QueryParam(SIGNATURE) ParamsDigest signature) throws IOException, BinanceException; + /** + * Retrieves the dust log from Binance. If you have many currencies with low amount (=dust) that + * cannot be traded, because their amount is less than the minimum amount required for trading + * them, you can convert all these currencies at once into BNB with the button "Convert Small + * Balance to BNB". + * + * @param startTime optional. If set, also the endTime must be set. If neither time is set, the + * 100 most recent dust logs are returned. + * @param endTime optional. If set, also the startTime must be set. If neither time is set, the + * 100 most recent dust logs are returned. + * @param recvWindow optional + * @param timestamp mandatory + * @return + * @throws IOException + * @throws BinanceException + */ + @GET + @Path("/sapi/v1/asset/dribblet") + BinanceDustLog getDustLog( + @QueryParam("startTime") Long startTime, + @QueryParam("endTime") Long endTime, + @QueryParam("recvWindow") Long recvWindow, + @QueryParam("timestamp") SynchronizedValueFactory timestamp, + @HeaderParam(X_MBX_APIKEY) String apiKey, + @QueryParam(SIGNATURE) ParamsDigest signature) + throws IOException, BinanceException; + /** * Submit a withdraw request. * diff --git a/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDribbletDetails.java b/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDribbletDetails.java new file mode 100644 index 00000000000..e59878015ec --- /dev/null +++ b/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDribbletDetails.java @@ -0,0 +1,52 @@ +package org.knowm.xchange.binance.dto.trade; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.math.BigDecimal; + +public final class BinanceDribbletDetails { + private final String transId; + private final BigDecimal serviceChargeAmount; + private final BigDecimal amount; + private final Long operateTime; + private final BigDecimal transferedAmount; + private final String fromAsset; + + public BinanceDribbletDetails( + @JsonProperty("transId") String transId, + @JsonProperty("serviceChargeAmount") BigDecimal serviceChargeAmount, + @JsonProperty("amount") BigDecimal amount, + @JsonProperty("operateTime") Long operateTime, + @JsonProperty("transferedAmount") BigDecimal transferedAmount, + @JsonProperty("fromAsset") String fromAsset) { + this.transId = transId; + this.serviceChargeAmount = serviceChargeAmount; + this.amount = amount; + this.operateTime = operateTime; + this.transferedAmount = transferedAmount; + this.fromAsset = fromAsset; + } + + public String getTransId() { + return transId; + } + + public BigDecimal getServiceChargeAmount() { + return serviceChargeAmount; + } + + public BigDecimal getAmount() { + return amount; + } + + public Long getOperateTime() { + return operateTime; + } + + public BigDecimal getTransferedAmount() { + return transferedAmount; + } + + public String getFromAsset() { + return fromAsset; + } +} diff --git a/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDribblets.java b/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDribblets.java new file mode 100644 index 00000000000..dce2d48e60c --- /dev/null +++ b/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDribblets.java @@ -0,0 +1,47 @@ +package org.knowm.xchange.binance.dto.trade; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.math.BigDecimal; +import java.util.List; + +public final class BinanceDribblets { + private final Long operateTime; + private final BigDecimal totalTransferedAmount; + private final BigDecimal totalServiceChargeAmount; + private final String transId; + private final List binanceDribbletDetails; + + public BinanceDribblets( + @JsonProperty("operateTime") Long operateTime, + @JsonProperty("totalTransferedAmount") BigDecimal totalTransferedAmount, + @JsonProperty("totalServiceChargeAmount") BigDecimal totalServiceChargeAmount, + @JsonProperty("transId") String transId, + @JsonProperty("userAssetDribbletDetails") + List binanceDribbletDetails) { + this.operateTime = operateTime; + this.totalTransferedAmount = totalTransferedAmount; + this.totalServiceChargeAmount = totalServiceChargeAmount; + this.transId = transId; + this.binanceDribbletDetails = binanceDribbletDetails; + } + + public Long getOperateTime() { + return operateTime; + } + + public BigDecimal getTotalTransferedAmount() { + return totalTransferedAmount; + } + + public BigDecimal getTotalServiceChargeAmount() { + return totalServiceChargeAmount; + } + + public String getTransId() { + return transId; + } + + public List getBinanceDribbletDetails() { + return binanceDribbletDetails; + } +} diff --git a/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDustLog.java b/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDustLog.java new file mode 100644 index 00000000000..08932f252e5 --- /dev/null +++ b/xchange-binance/src/main/java/org/knowm/xchange/binance/dto/trade/BinanceDustLog.java @@ -0,0 +1,24 @@ +package org.knowm.xchange.binance.dto.trade; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +public final class BinanceDustLog { + private final Integer total; + private final List dribblets; + + public BinanceDustLog( + @JsonProperty("total") Integer total, + @JsonProperty("userAssetDribblets") List dribblets) { + this.total = total; + this.dribblets = dribblets; + } + + public Integer getTotal() { + return total; + } + + public List getDribblets() { + return dribblets; + } +} diff --git a/xchange-binance/src/main/java/org/knowm/xchange/binance/service/BinanceTradeService.java b/xchange-binance/src/main/java/org/knowm/xchange/binance/service/BinanceTradeService.java index 1a4ecb9edcc..855a8806932 100644 --- a/xchange-binance/src/main/java/org/knowm/xchange/binance/service/BinanceTradeService.java +++ b/xchange-binance/src/main/java/org/knowm/xchange/binance/service/BinanceTradeService.java @@ -13,6 +13,7 @@ import org.knowm.xchange.binance.BinanceErrorAdapter; import org.knowm.xchange.binance.BinanceExchange; import org.knowm.xchange.binance.dto.BinanceException; +import org.knowm.xchange.binance.dto.trade.BinanceDustLog; import org.knowm.xchange.binance.dto.trade.BinanceNewOrder; import org.knowm.xchange.binance.dto.trade.BinanceOrder; import org.knowm.xchange.binance.dto.trade.BinanceTrade; diff --git a/xchange-binance/src/main/java/org/knowm/xchange/binance/service/BinanceTradeServiceRaw.java b/xchange-binance/src/main/java/org/knowm/xchange/binance/service/BinanceTradeServiceRaw.java index b8f51582d1e..340aff0dc9d 100644 --- a/xchange-binance/src/main/java/org/knowm/xchange/binance/service/BinanceTradeServiceRaw.java +++ b/xchange-binance/src/main/java/org/knowm/xchange/binance/service/BinanceTradeServiceRaw.java @@ -12,6 +12,7 @@ import org.knowm.xchange.binance.BinanceExchange; import org.knowm.xchange.binance.dto.BinanceException; import org.knowm.xchange.binance.dto.trade.BinanceCancelledOrder; +import org.knowm.xchange.binance.dto.trade.BinanceDustLog; import org.knowm.xchange.binance.dto.trade.BinanceListenKey; import org.knowm.xchange.binance.dto.trade.BinanceNewOrder; import org.knowm.xchange.binance.dto.trade.BinanceOrder; @@ -21,6 +22,7 @@ import org.knowm.xchange.binance.dto.trade.TimeInForce; import org.knowm.xchange.client.ResilienceRegistries; import org.knowm.xchange.currency.CurrencyPair; +import org.knowm.xchange.exceptions.ExchangeException; public class BinanceTradeServiceRaw extends BinanceBaseService { @@ -189,23 +191,55 @@ public List myTrades( CurrencyPair pair, Long orderId, Long startTime, Long endTime, Long fromId, Integer limit) throws BinanceException, IOException { return decorateApiCall( - () -> - binance.myTrades( - BinanceAdapters.toSymbol(pair), - orderId, - startTime, - endTime, - fromId, - limit, - getRecvWindow(), - getTimestampFactory(), - apiKey, - signatureCreator)) + () -> + binance.myTrades( + BinanceAdapters.toSymbol(pair), + orderId, + startTime, + endTime, + fromId, + limit, + getRecvWindow(), + getTimestampFactory(), + apiKey, + signatureCreator)) .withRetry(retry("myTrades")) .withRateLimiter(rateLimiter(REQUEST_WEIGHT_RATE_LIMITER), myTradesPermits(limit)) .call(); } + /** + * Retrieves the dust log from Binance. If you have many currencies with low amount (=dust) that + * cannot be traded, because their amount is less than the minimum amount required for trading + * them, you can convert all these currencies at once into BNB with the button "Convert Small + * Balance to BNB". + * + * @param startTime optional. If set, also the endTime must be set. If neither time is set, the + * 100 most recent dust logs are returned. + * @param endTime optional. If set, also the startTime must be set. If neither time is set, the + * 100 most recent dust logs are returned. + * @return + * @throws IOException + */ + public BinanceDustLog getDustLog(Long startTime, Long endTime) throws IOException { + + if (((startTime != null) && (endTime == null)) || (startTime == null) && (endTime != null)) + throw new ExchangeException("You need to specify both, the start and the end date, or none of them"); + + return decorateApiCall( + () -> + binance.getDustLog( + startTime, + endTime, + getRecvWindow(), + getTimestampFactory(), + apiKey, + signatureCreator)) + .withRetry(retry("myDustLog")) + .withRateLimiter(rateLimiter(REQUEST_WEIGHT_RATE_LIMITER)) + .call(); + } + public BinanceListenKey startUserDataStream() throws IOException { return decorateApiCall(() -> binance.startUserDataStream(apiKey)) .withRateLimiter(rateLimiter(REQUEST_WEIGHT_RATE_LIMITER)) diff --git a/xchange-binance/src/test/java/org/knowm/xchange/binance/BinanceExchangeIntegration.java b/xchange-binance/src/test/java/org/knowm/xchange/binance/BinanceExchangeIntegration.java index 67a6c54c972..be970993b68 100644 --- a/xchange-binance/src/test/java/org/knowm/xchange/binance/BinanceExchangeIntegration.java +++ b/xchange-binance/src/test/java/org/knowm/xchange/binance/BinanceExchangeIntegration.java @@ -2,9 +2,11 @@ import static org.assertj.core.api.Assertions.assertThat; +import com.github.tomakehurst.wiremock.junit.WireMockRule; import java.io.IOException; import org.junit.Assume; import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; import org.knowm.xchange.ExchangeFactory; import org.knowm.xchange.ExchangeSpecification; @@ -13,7 +15,8 @@ public class BinanceExchangeIntegration { protected static BinanceExchange exchange; - + @Rule + public WireMockRule wireMockRule = new WireMockRule(); @BeforeClass public static void beforeClass() throws Exception { createExchange(); @@ -42,4 +45,16 @@ protected static void createExchange() throws Exception { protected void assumeProduction() { Assume.assumeFalse("Using sandbox", exchange.usingSandbox()); } + + protected BinanceExchange createExchangeMocked() { + BinanceExchange exchangeMocked = + ExchangeFactory.INSTANCE.createExchangeWithoutSpecification(BinanceExchange.class); + ExchangeSpecification specification = exchangeMocked.getDefaultExchangeSpecification(); + specification.setHost("localhost"); + specification.setSslUri("http://localhost:" + wireMockRule.port() + "/"); + specification.setPort(wireMockRule.port()); + specification.setShouldLoadRemoteMetaData(false); + exchangeMocked.applySpecification(specification); + return exchangeMocked; + } } diff --git a/xchange-binance/src/test/java/org/knowm/xchange/binance/service/trade/TradeServiceIntegration.java b/xchange-binance/src/test/java/org/knowm/xchange/binance/service/trade/TradeServiceIntegration.java index c86189e9915..5b00b06c094 100644 --- a/xchange-binance/src/test/java/org/knowm/xchange/binance/service/trade/TradeServiceIntegration.java +++ b/xchange-binance/src/test/java/org/knowm/xchange/binance/service/trade/TradeServiceIntegration.java @@ -1,5 +1,14 @@ package org.knowm.xchange.binance.service.trade; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.ok; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; import static org.knowm.xchange.binance.dto.trade.OrderType.LIMIT; import static org.knowm.xchange.binance.dto.trade.OrderType.MARKET; import static org.knowm.xchange.binance.dto.trade.OrderType.STOP_LOSS_LIMIT; @@ -9,17 +18,22 @@ import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.Optional; import org.junit.Assume; import org.junit.Before; import org.junit.BeforeClass; + import org.junit.Test; +import org.knowm.xchange.binance.BinanceExchange; import org.knowm.xchange.binance.BinanceExchangeIntegration; +import org.knowm.xchange.binance.dto.trade.BinanceDustLog; import org.knowm.xchange.binance.dto.trade.TimeInForce; import org.knowm.xchange.binance.service.BinanceTradeService; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.trade.LimitOrder; import org.knowm.xchange.dto.trade.MarketOrder; import org.knowm.xchange.dto.trade.StopOrder; +import org.knowm.xchange.utils.ObjectMapperHelper; public class TradeServiceIntegration extends BinanceExchangeIntegration { @@ -128,4 +142,24 @@ private StopOrder sampleTakeProfitLimitOrder() throws IOException { .flag(TimeInForce.GTC) .build(); } + + @Test + public void testDustLog() throws IOException { + BinanceExchange exchangeMocked = createExchangeMocked(); + tradeService = (BinanceTradeService) exchangeMocked.getTradeService(); + stubFor( + get(urlPathEqualTo("/sapi/v1/asset/dribblet")) + .willReturn( + ok() + .withHeader("Content-Type", "application/json") + .withBodyFile("dustlog.json"))); + + BinanceDustLog dustLog = tradeService.getDustLog(1639094400000L, 1639180800000L); + assertEquals(1, dustLog.getDribblets().size()); + assertEquals(28, dustLog.getDribblets().get(0).getBinanceDribbletDetails().size()); + assertEquals((Long) 1639129045000L, dustLog.getDribblets().get(0).getOperateTime()); + assertEquals( + "90698471826", + dustLog.getDribblets().get(0).getBinanceDribbletDetails().get(0).getTransId()); + } } diff --git a/xchange-binance/src/test/resources/__files/dustlog.json b/xchange-binance/src/test/resources/__files/dustlog.json new file mode 100644 index 00000000000..1ad2acda931 --- /dev/null +++ b/xchange-binance/src/test/resources/__files/dustlog.json @@ -0,0 +1,206 @@ +{ + "total" : 1, + "dribblets" : [ { + "operateTime" : 1639129045000, + "totalTransferedAmount" : 0.0086914, + "totalServiceChargeAmount" : 0.00017367, + "transId" : "90698471826", + "binanceDribbletDetails" : [ { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000969, + "amount" : 0.27878109, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00048483, + "fromAsset" : "BUSD" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 4.5E-7, + "amount" : 0.2, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00002278, + "fromAsset" : "ZIL" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000121, + "amount" : 0.00023, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00006088, + "fromAsset" : "LTC" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000935, + "amount" : 0.009799, + "operateTime" : 1639129045000, + "transferedAmount" : 0.0004679, + "fromAsset" : "NEO" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000795, + "amount" : 0.03689108, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00039774, + "fromAsset" : "GAS" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000118, + "amount" : 0.5, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00005906, + "fromAsset" : "CELR" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000441, + "amount" : 0.0000311, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00022076, + "fromAsset" : "ETH" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000263, + "amount" : 0.6, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00013169, + "fromAsset" : "DATA" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00004903, + "amount" : 0.008, + "operateTime" : 1639129045000, + "transferedAmount" : 0.0024516, + "fromAsset" : "SOL" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000736, + "amount" : 33.31295809, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00036844, + "fromAsset" : "VTHO" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000378, + "amount" : 0.19953853, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00018939, + "fromAsset" : "FET" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 4.7E-7, + "amount" : 0.5, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00002387, + "fromAsset" : "COS" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000421, + "amount" : 0.03796232, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00021053, + "fromAsset" : "EOS" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000971, + "amount" : 0.00062, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00048563, + "fromAsset" : "BCH" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00001675, + "amount" : 0.58, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00083766, + "fromAsset" : "ZRX" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 5E-8, + "amount" : 0.051, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00000281, + "fromAsset" : "IOST" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 1.7E-7, + "amount" : 0.05670708, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00000888, + "fromAsset" : "TRX" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000301, + "amount" : 0.00444, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00015082, + "fromAsset" : "LINK" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000283, + "amount" : 0.3, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00014199, + "fromAsset" : "XLM" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000334, + "amount" : 0.115258, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00016742, + "fromAsset" : "XRP" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 3E-8, + "amount" : 0.08178211, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00000166, + "fromAsset" : "TROY" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000713, + "amount" : 0.13352395, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00035682, + "fromAsset" : "SXP" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00001635, + "amount" : 0.47007571, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00081791, + "fromAsset" : "USDT" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000316, + "amount" : 0.32, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00015843, + "fromAsset" : "DUSK" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 1.2E-7, + "amount" : 0.2, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00000636, + "fromAsset" : "XVG" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000121, + "amount" : 0.2, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00006065, + "fromAsset" : "ONE" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000621, + "amount" : 0.07, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00031068, + "fromAsset" : "ENJ" + }, { + "transId" : "90698471826", + "serviceChargeAmount" : 0.00000188, + "amount" : 0.639, + "operateTime" : 1639129045000, + "transferedAmount" : 0.00009421, + "fromAsset" : "VET" + } ] + } ] +} \ No newline at end of file diff --git a/xchange-kraken/src/main/java/org/knowm/xchange/kraken/service/KrakenBaseService.java b/xchange-kraken/src/main/java/org/knowm/xchange/kraken/service/KrakenBaseService.java index 777b5f31fa4..96c050a110b 100644 --- a/xchange-kraken/src/main/java/org/knowm/xchange/kraken/service/KrakenBaseService.java +++ b/xchange-kraken/src/main/java/org/knowm/xchange/kraken/service/KrakenBaseService.java @@ -87,6 +87,7 @@ public R checkResult(KrakenResult krakenResult) { throw new FrequencyLimitExceededException(error); case "EOrder:Insufficient funds": throw new FundsExceededException(error); + case "EGeneral:Too many requests": case "EAPI:Rate limit exceeded": case "EOrder:Rate limit exceeded": throw new RateLimitExceededException(error);