diff --git a/pom.xml b/pom.xml index 76e35d7..ac92724 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.binance.dex.api binance-dex-api-client - 1.1.1 + 1.1.2 2.6.0 diff --git a/src/main/java/com/binance/dex/api/client/BinanceDexApiClientFactory.java b/src/main/java/com/binance/dex/api/client/BinanceDexApiClientFactory.java index f503b55..20002c1 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexApiClientFactory.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexApiClientFactory.java @@ -21,8 +21,12 @@ public BinanceDexApiRestClient newRestClient(String baseUrl) { return new BinanceDexApiRestClientImpl(baseUrl); } - public BinanceDexApiRestClient newRestClient(String baseUrl,String apiKey){ - return new BinanceDexApiRestClientImpl(baseUrl,apiKey); + public BinanceDexApiRestClient newRestClient(String baseUrl, String apiKey) { + return new BinanceDexApiRestClientImpl(baseUrl, apiKey); + } + + public BinanceDexApiRestClient newRestClient(String baseUrl, String apiKey, Long timeout) { + return new BinanceDexApiRestClientImpl(baseUrl, apiKey, timeout); } public BinanceDexApiNodeClient newNodeRpcClient() { @@ -33,6 +37,10 @@ public BinanceDexApiNodeClient newNodeRpcClient(String baseUrl, String hrp, Stri return new BinanceDexApiNodeClientImpl(baseUrl, hrp, valHrp); } + public BinanceDexApiNodeClient newNodeRpcClient(String baseUrl, String hrp, String valHrp, Long timeout) { + return new BinanceDexApiNodeClientImpl(baseUrl, hrp, valHrp, timeout); + } + public BinanceDexApiAsyncRestClient newAsyncRestClient() { return newAsyncRestClient(BinanceDexEnvironment.PROD.getBaseUrl()); } @@ -41,8 +49,8 @@ public BinanceDexApiAsyncRestClient newAsyncRestClient(String baseUrl) { return new BinanceDexApiAsyncRestClientImpl(baseUrl); } - public BinanceDexApiAsyncRestClient newAsyncRestClient(String baseUrl,String apiKey) { - return new BinanceDexApiAsyncRestClientImpl(baseUrl,apiKey); + public BinanceDexApiAsyncRestClient newAsyncRestClient(String baseUrl, String apiKey) { + return new BinanceDexApiAsyncRestClientImpl(baseUrl, apiKey); } public BinanceDexApiWebSocketClient newWebSocketClient() { @@ -53,8 +61,8 @@ public BinanceDexApiWebSocketClient newWebSocketClient(String baseUrl) { return new BinanceDexApiWebSocketClientImpl(baseUrl); } - public BinanceDexApiWebSocketClient newWebSocketClient(String baseUrl,String apiKey) { - return new BinanceDexApiWebSocketClientImpl(baseUrl,apiKey); + public BinanceDexApiWebSocketClient newWebSocketClient(String baseUrl, String apiKey) { + return new BinanceDexApiWebSocketClientImpl(baseUrl, apiKey); } } diff --git a/src/main/java/com/binance/dex/api/client/BinanceDexApiClientGenerator.java b/src/main/java/com/binance/dex/api/client/BinanceDexApiClientGenerator.java index 87de40a..964b6a9 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexApiClientGenerator.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexApiClientGenerator.java @@ -28,42 +28,48 @@ public class BinanceDexApiClientGenerator { BinanceDexApiError.class, new Annotation[0], null); private static OkHttpClient sharedClient; + static { Dispatcher dispatcher = new Dispatcher(); dispatcher.setMaxRequestsPerHost(500); dispatcher.setMaxRequests(500); sharedClient = new OkHttpClient.Builder() - .dispatcher(dispatcher) - .pingInterval(20, TimeUnit.SECONDS) - .build(); + .dispatcher(dispatcher) + .pingInterval(20, TimeUnit.SECONDS) + .retryOnConnectionFailure(false) + .build(); } - public static S createService(Class serviceClass, String baseUrl) { - Retrofit.Builder retrofitBuilder = new Retrofit.Builder() - .baseUrl(baseUrl) - .addConverterFactory(converterFactory); - - retrofitBuilder.client(sharedClient); - Retrofit retrofit = retrofitBuilder.build(); + public static S createService(Class serviceClass, String baseUrl) { + return createService(serviceClass, null, baseUrl); + } - return retrofit.create(serviceClass); + public static S createService(Class serviceClass, String baseUrl, Long timeout) { + return createService(serviceClass, null, baseUrl, timeout); } public static S createService(Class serviceClass, String apiKey, String baseUrl) { + return createService(serviceClass, apiKey, baseUrl, null); + } + + public static S createService(Class serviceClass, String apiKey, String baseUrl, Long timeout) { Retrofit.Builder retrofitBuilder = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(converterFactory); - if (StringUtils.isEmpty(apiKey)) { - retrofitBuilder.client(sharedClient); - } else { + OkHttpClient.Builder adaptedClientBuilder = sharedClient.newBuilder(); + if (!StringUtils.isEmpty(apiKey)) { // `adaptedClient` will use its own interceptor, but share thread pool etc with the 'parent' client InternalInvokeInterceptor interceptor = new InternalInvokeInterceptor(apiKey); - OkHttpClient adaptedClient = sharedClient.newBuilder().addInterceptor(interceptor).build(); - retrofitBuilder.client(adaptedClient); + adaptedClientBuilder.addInterceptor(interceptor); + } + + if (timeout != null) { + adaptedClientBuilder.readTimeout(timeout, TimeUnit.SECONDS); } + retrofitBuilder.client(adaptedClientBuilder.build()); Retrofit retrofit = retrofitBuilder.build(); return retrofit.create(serviceClass); } diff --git a/src/main/java/com/binance/dex/api/client/domain/jsonrpc/CommitBroadcastResult.java b/src/main/java/com/binance/dex/api/client/domain/jsonrpc/CommitBroadcastResult.java index 963608b..5ad7f7b 100644 --- a/src/main/java/com/binance/dex/api/client/domain/jsonrpc/CommitBroadcastResult.java +++ b/src/main/java/com/binance/dex/api/client/domain/jsonrpc/CommitBroadcastResult.java @@ -13,6 +13,9 @@ public class CommitBroadcastResult { @JsonProperty("check_tx") private CheckTx checkTx; + @JsonProperty("deliver_tx") + private DeliverTx deliverTx; + @JsonIgnoreProperties(ignoreUnknown = true) public static class CheckTx { @@ -37,6 +40,30 @@ public void setLog(String log) { } } + @JsonIgnoreProperties(ignoreUnknown = true) + public static class DeliverTx { + + private Integer code = 0; + + private String log; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getLog() { + return log; + } + + public void setLog(String log) { + this.log = log; + } + } + public CheckTx getCheckTx() { return checkTx; } @@ -45,6 +72,14 @@ public void setCheckTx(CheckTx checkTx) { this.checkTx = checkTx; } + public DeliverTx getDeliverTx() { + return deliverTx; + } + + public void setDeliverTx(DeliverTx deliverTx) { + this.deliverTx = deliverTx; + } + public String getHash() { return hash; } @@ -60,4 +95,6 @@ public Long getHeight() { public void setHeight(Long height) { this.height = height; } + + } diff --git a/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiNodeClientImpl.java b/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiNodeClientImpl.java index e2312f4..31e605d 100644 --- a/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiNodeClientImpl.java +++ b/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiNodeClientImpl.java @@ -72,6 +72,19 @@ public BinanceDexApiNodeClientImpl(String nodeUrl, String hrp, String valHrp) { oracleQueryDelegate = new NodeQueryDelegateOracle(binanceDexNodeApi, hrp, valHrp); } + public BinanceDexApiNodeClientImpl(String nodeUrl, String hrp, String valHrp, Long timeout) { + this.binanceDexNodeApi = BinanceDexApiClientGenerator.createService(BinanceDexNodeApi.class, nodeUrl, timeout); + this.hrp = hrp; + this.valHrp = valHrp; + transactionConverter = new TransactionConverter(hrp, valHrp); + feeConverter = new FeeConverter(); + + sideChainStakingTxDelegate = new NodeTxDelegateSideChainStaking(binanceDexNodeApi, hrp, valHrp); + bridgeTxDelegate = new NodeTxDelegateBridge(binanceDexNodeApi, hrp, valHrp); + sideChainQueryDelegate = new NodeQueryDelegateSideChainStaking(binanceDexNodeApi, hrp, valHrp); + oracleQueryDelegate = new NodeQueryDelegateOracle(binanceDexNodeApi, hrp, valHrp); + } + @Override public AccountSequence getAccountSequence(String address) { Account account = this.getAccount(address); @@ -655,18 +668,24 @@ protected com.binance.dex.api.client.domain.MiniToken convert(MiniTokenInfo toke protected List syncBroadcast(String requestBody, Wallet wallet) { try { JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.commitBroadcast(requestBody)); + if (rpcResponse.getResult() == null){ + if (rpcResponse.getError() != null){ + throw new BinanceDexApiException(rpcResponse.getError().getCode(), rpcResponse.getError().getData()); + } + throw new BinanceDexApiException(new RuntimeException("internal error")); + } CommitBroadcastResult commitBroadcastResult = rpcResponse.getResult(); TransactionMetadata transactionMetadata = new TransactionMetadata(); - transactionMetadata.setCode(commitBroadcastResult.getCheckTx().getCode()); + transactionMetadata.setCode(commitBroadcastResult.getDeliverTx().getCode()); if (commitBroadcastResult.getHeight() != null && StringUtils.isNoneBlank(commitBroadcastResult.getHash()) && transactionMetadata.getCode() == 0) { wallet.increaseAccountSequence(); transactionMetadata.setHash(commitBroadcastResult.getHash()); transactionMetadata.setHeight(commitBroadcastResult.getHeight()); - transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setLog(commitBroadcastResult.getDeliverTx().getLog()); transactionMetadata.setOk(true); } else { wallet.invalidAccountSequence(); - transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setLog(commitBroadcastResult.getDeliverTx().getLog()); transactionMetadata.setOk(false); } @@ -680,16 +699,22 @@ protected List syncBroadcast(String requestBody, Wallet wal protected List syncBroadcast(String requestBody) { try { JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.commitBroadcast(requestBody)); + if (rpcResponse.getResult() == null){ + if (rpcResponse.getError() != null){ + throw new BinanceDexApiException(rpcResponse.getError().getCode(), rpcResponse.getError().getData()); + } + throw new BinanceDexApiException(new RuntimeException("internal error")); + } CommitBroadcastResult commitBroadcastResult = rpcResponse.getResult(); TransactionMetadata transactionMetadata = new TransactionMetadata(); - transactionMetadata.setCode(commitBroadcastResult.getCheckTx().getCode()); + transactionMetadata.setCode(commitBroadcastResult.getDeliverTx().getCode()); if (commitBroadcastResult.getHeight() != null && StringUtils.isNoneBlank(commitBroadcastResult.getHash()) && transactionMetadata.getCode() == 0) { transactionMetadata.setHash(commitBroadcastResult.getHash()); transactionMetadata.setHeight(commitBroadcastResult.getHeight()); - transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setLog(commitBroadcastResult.getDeliverTx().getLog()); transactionMetadata.setOk(true); } else { - transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setLog(commitBroadcastResult.getDeliverTx().getLog()); transactionMetadata.setOk(false); } diff --git a/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiRestClientImpl.java b/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiRestClientImpl.java index b090354..8b38990 100644 --- a/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiRestClientImpl.java +++ b/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiRestClientImpl.java @@ -28,6 +28,10 @@ public BinanceDexApiRestClientImpl(String baseUrl) { this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class, baseUrl); } + public BinanceDexApiRestClientImpl(String baseUrl, Long timeout) { + this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class, baseUrl, timeout); + } + public BinanceDexApiRestClientImpl(String baseUrl,String apiKey){ if(StringUtils.isBlank(apiKey)){ this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class, baseUrl); @@ -36,6 +40,14 @@ public BinanceDexApiRestClientImpl(String baseUrl,String apiKey){ } } + public BinanceDexApiRestClientImpl(String baseUrl,String apiKey, Long timeout){ + if(StringUtils.isBlank(apiKey)){ + this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class, baseUrl, timeout); + }else{ + this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class,apiKey,baseUrl + "/internal/", timeout); + } + } + public Time getTime() { return BinanceDexApiClientGenerator.executeSync(binanceDexApi.getTime()); } diff --git a/src/main/java/com/binance/dex/api/client/impl/node/NodeTx.java b/src/main/java/com/binance/dex/api/client/impl/node/NodeTx.java index 3daa362..baeb2fd 100644 --- a/src/main/java/com/binance/dex/api/client/impl/node/NodeTx.java +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeTx.java @@ -49,18 +49,24 @@ protected List broadcast(BinanceDexTransactionMessage messa protected List syncBroadcast(String requestBody, Wallet wallet) { try { JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.commitBroadcast(requestBody)); + if (rpcResponse.getResult() == null){ + if (rpcResponse.getError() != null){ + throw new BinanceDexApiException(rpcResponse.getError().getCode(), rpcResponse.getError().getData()); + } + throw new BinanceDexApiException(new RuntimeException("internal error")); + } CommitBroadcastResult commitBroadcastResult = rpcResponse.getResult(); TransactionMetadata transactionMetadata = new TransactionMetadata(); - transactionMetadata.setCode(commitBroadcastResult.getCheckTx().getCode()); + transactionMetadata.setCode(commitBroadcastResult.getDeliverTx().getCode()); if (commitBroadcastResult.getHeight() != null && StringUtils.isNoneBlank(commitBroadcastResult.getHash()) && transactionMetadata.getCode() == 0) { wallet.increaseAccountSequence(); transactionMetadata.setHash(commitBroadcastResult.getHash()); transactionMetadata.setHeight(commitBroadcastResult.getHeight()); - transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setLog(commitBroadcastResult.getDeliverTx().getLog()); transactionMetadata.setOk(true); } else { wallet.invalidAccountSequence(); - transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setLog(commitBroadcastResult.getDeliverTx().getLog()); transactionMetadata.setOk(false); } @@ -74,16 +80,22 @@ protected List syncBroadcast(String requestBody, Wallet wal protected List syncBroadcast(String requestBody) { try { JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.commitBroadcast(requestBody)); + if (rpcResponse.getResult() == null){ + if (rpcResponse.getError() != null){ + throw new BinanceDexApiException(rpcResponse.getError().getCode(), rpcResponse.getError().getData()); + } + throw new BinanceDexApiException(new RuntimeException("internal error")); + } CommitBroadcastResult commitBroadcastResult = rpcResponse.getResult(); TransactionMetadata transactionMetadata = new TransactionMetadata(); - transactionMetadata.setCode(commitBroadcastResult.getCheckTx().getCode()); + transactionMetadata.setCode(commitBroadcastResult.getDeliverTx().getCode()); if (commitBroadcastResult.getHeight() != null && StringUtils.isNoneBlank(commitBroadcastResult.getHash()) && transactionMetadata.getCode() == 0) { transactionMetadata.setHash(commitBroadcastResult.getHash()); transactionMetadata.setHeight(commitBroadcastResult.getHeight()); - transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setLog(commitBroadcastResult.getDeliverTx().getLog()); transactionMetadata.setOk(true); } else { - transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setLog(commitBroadcastResult.getDeliverTx().getLog()); transactionMetadata.setOk(false); }