diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..85a5ce85 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog + +## 1.1.2 +API UPGRADE +* [\#120](https://github.com/binance-chain/java-sdk/pull/120) [RPC] [API] deco old rest transactions api, and add new rest transaction apis + +Breaking Changes +* getTransactions(TransactionsRequest request) will return transactions with new data model TransactionPageV2 +* getTransactions(String address) will return transactions for an address in last 24 hours with new data model TransactionPageV2 + +Please refer to TransactionConverterFactory.java to see the mappings of the fields between TransactionPageV2 and TransactionPage + +Please refer to TransactionExample.java and [API Doc](https://docs.binance.org/api-reference/dex-api/block-service.html) for more details, the underlying API [Migration Guide](https://github.com/binance-chain/docs-site/blob/block-service/docs/api-reference/dex-api/migration-guide.md) could be also useful + +New API +* getTransactionsInBlock(long blockHeight) will return transaction in a specific block. + + +## 1.1.1 +CHAIN UPGRADE +* [\#105](https://github.com/binance-chain/java-sdk/pull/105) [RPC] [API] support for the transfer of token ownership, and decode the new types of oracle claim package + +## 1.1.0 +CHAIN UPGRADE +* [\#88](https://github.com/binance-chain/java-sdk/pull/88) [RPC] [API] enable side chain governance transaction +* [\#89](https://github.com/binance-chain/java-sdk/pull/89) [RPC] [API] enable side chain unbind transaction, and modify the structure of claimMsg + +## 1.0.7 +CHAIN UPGRADE +* [\#86](https://github.com/binance-chain/java-sdk/pull/86) [RPC] [API] Add Pending match flag to Depth API response +* [\#80](https://github.com/binance-chain/java-sdk/pull/80) [RPC] [API] Support Mini Token \ No newline at end of file diff --git a/LICENSE b/LICENSE index f48a48cd..2b3b563f 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2019 Binance + Copyright 2018-2019 All BNB Chain Developers Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 0dbb9c87..b5c282c4 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,32 @@ -# Binance Chain Java SDK +# BNB Beacon Chain Java SDK + +The BNB Beacon Chain Java SDK works as a lightweight Java library for interacting with the [BNB Beacon Chain](https://docs.bnbchain.org/docs/beaconchain/develop/api-reference/dex-api/paths). It provides a complete API coverage, and supports synchronous and asynchronous requests. It includes the following core components: + +* **[crypto](https://github.com/bnb-chain/java-sdk/blob/master/src/main/java/com/binance/dex/api/client/encoding/Crypto.java)** - core cryptographic functions. +* **[amino encoding](https://github.com/bnb-chain/java-sdk/blob/master/src/main/java/com/binance/dex/api/client/encoding)** - [amino](https://docs.bnbchain.org/docs/beaconchain/learn/encoding/encoding/#amino) (protobuf-like) encoding and decoding of transactions. +* **[client](https://github.com/bnb-chain/java-sdk/tree/master/src/main/java/com/binance/dex/api/client/impl)** - implementations of API rest client, supporting synchronous and asynchronous access to BNB Beacon Chain's REST APIs. +* **[wallet](https://github.com/bnb-chain/java-sdk/blob/master/src/main/java/com/binance/dex/api/client/Wallet.java)** - management of accounts, including seed and encrypted mnemonic generation. + +# How to get + +1. Add the JitPack repository to your project's `pom.xml`: + ``` + + + jitpack.io + https://jitpack.io + + + ``` +2. Add the dependency: + ``` + + com.github.bnb-chain + java-sdk + Tag + + ``` -The Binance Chain Java SDK works as a lightweight Java library for interacting with the [Binance Chain](https://binance-chain.github.io/api-reference/dex-api/paths.html). It provides a complete API coverage, and supports synchronous and asynchronous requests. It includes the following core components: - -* **[crypto](https://github.com/binance-chain/java-sdk/blob/master/src/main/java/com/binance/dex/api/client/encoding/Crypto.java)** - core cryptographic functions. -* **[amino encoding](https://github.com/binance-chain/java-sdk/blob/master/src/main/java/com/binance/dex/api/client/encoding)** - [amino](https://github.com/binance-chain/docs-site/blob/master/docs/encoding.md) (protobuf-like) encoding and decoding of transactions. -* **[client](https://github.com/binance-chain/java-sdk/tree/master/src/main/java/com/binance/dex/api/client/impl)** - implementations of API rest client, supporting synchronous and asynchronous access to Binance Chain's REST APIs. -* **[wallet](https://github.com/binance-chain/java-sdk/blob/master/src/main/java/com/binance/dex/api/client/Wallet.java)** - management of accounts, including seed and encrypted mnemonic generation. - - -# Installation - - -1. Install library into your Maven's local repository by running `mvn install` -2. Add the following Maven dependency to your project's `pom.xml`: -``` - - com.binance.dex.api - binance-dex-api-client - 1.0.4 - -``` # Protobuf The protobuf-maven-plugin is used in this SDK. It is a plugin that integrates protocol buffers compiler (protoc) into Maven lifecycle. The Plugin generates Java source files from .proto (protocol buffer definition) files for this project by running `mvn compile`. @@ -28,18 +35,14 @@ These Java source files will be packaged into the final artifact and referenced More details please refer to https://github.com/xolstice/protobuf-maven-plugin - - # API -For examples, please check the [wiki](https://github.com/binance-chain/java-sdk/wiki). +For examples, please check the [wiki](https://github.com/bnb-chain/java-sdk/wiki/API). # Testing -All new code changes should be covered with unit tests. You can see the existing test cases here: https://github.com/binance-chain/java-sdk/tree/master/src/test/java/com/binance/dex/api/client/encoding - +All new code changes should be covered with unit tests. You can see the existing test cases [here](https://github.com/bnb-chain/java-sdk/tree/master/src/test/java/com/binance/dex/api/client/encoding). # Contributing -Contributions to the Binance Chain Java SDK are welcome. Please ensure that you have tested the changes with a local client and have added unit test coverage for your code. - +Contributions to the BNB Beacon Chain Java SDK are welcome. Please ensure that you have tested the changes with a local client and have added unit test coverage for your code. diff --git a/pom.xml b/pom.xml index fdbc1748..11d56d7a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,14 @@ com.binance.dex.api binance-dex-api-client - 1.0.6 + 1.1.8 + + + + jitpack.io + https://jitpack.io + + 2.6.0 @@ -35,7 +42,7 @@ com.google.protobuf protobuf-java - 3.6.1 + 3.16.3 io.grpc @@ -70,7 +77,7 @@ junit junit - 4.12 + 4.13.1 test @@ -102,6 +109,32 @@ javax.annotation-api 1.3.2 + + + + com.github.ethereum + ethereumj + 1.12.0 + + + org.ethereum + rocksdbjni + + + org.ethereum + solcJ-all + + + org.iq80.leveldb + leveldb + + + org.ethereum + leveldbjni-all + + + + @@ -139,5 +172,6 @@ + - \ No newline at end of file + diff --git a/src/main/java/com/binance/dex/api/client/BinanceDexApi.java b/src/main/java/com/binance/dex/api/client/BinanceDexApi.java index c6f53244..3f54eda6 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexApi.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexApi.java @@ -76,13 +76,46 @@ Call getTrades(@Query("address") String address, @Query("sellerOrderId") String sellerOrderId, @Query("side") Integer side, @Query("start") Long start, @Query("symbol") String symbol, @Query("total") Integer total); - @GET("api/v1/transactions") - Call getTransactions(@Query("address") String address, @Query("blockHeight") Long blockHeight, - @Query("endTime") Long endTime, @Query("limit") Integer limit, - @Query("offset") Integer offset, @Query("side") String side, - @Query("startTime") Long startTime, @Query("txAsset") String txAsset, - @Query("txType") String txType); - @POST("api/v1/broadcast") Call> broadcast(@Query("sync") boolean sync, @Body RequestBody transaction); + + @GET("api/v1/mini/tokens") + Call> getMiniTokens(@Query("limit") Integer limit); + + @GET("api/v1/mini/markets") + Call> getMiniMarkets(@Query("limit") Integer limit); + + @GET("api/v1/mini/klines") + Call> getMiniCandlestickBars(@Query("symbol") String symbol, @Query("interval") String interval, + @Query("limit") Integer limit, @Query("startTime") Long startTime, + @Query("endTime") Long endTime); + + @GET("api/v1/mini/orders/open") + Call getMiniOpenOrders(@Query("address") String address, @Query("limit") Integer limit, + @Query("offset") Integer offset, @Query("symbol") String symbol, + @Query("total") Integer total); + + @GET("api/v1/mini/orders/closed") + Call getMiniClosedOrders(@Query("address") String address, @Query("end") Long end, + @Query("limit") Integer limit, @Query("offset") Integer offset, + @Query("side") Integer side, @Query("start") Long start, + @Query("status") List status, @Query("symbol") String symbol, + @Query("total") Integer total); + + @GET("api/v1/mini/orders/{id}") + Call getMiniOrder(@Path("id") String id); + + @GET("api/v1/mini/ticker/24hr") + Call> getMini24HrPriceStatistics(); + + @GET("api/v1/mini/ticker/24hr") + Call> getMini24HrPriceStatistics(@Query("symbol") String symbol); + + @GET("api/v1/mini/trades") + Call getMiniTrades(@Query("address") String address, + @Query("buyerOrderId") String buyerOrderId, @Query("end") Long end, + @Query("height") Long height, @Query("limit") Integer limit, + @Query("offset") Integer offset, @Query("quoteAsset") String quoteAsset, + @Query("sellerOrderId") String sellerOrderId, @Query("side") Integer side, + @Query("start") Long start, @Query("symbol") String symbol, @Query("total") Integer total); } diff --git a/src/main/java/com/binance/dex/api/client/BinanceDexApiAsyncRestClient.java b/src/main/java/com/binance/dex/api/client/BinanceDexApiAsyncRestClient.java index 85061bbe..4b8776db 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexApiAsyncRestClient.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexApiAsyncRestClient.java @@ -51,9 +51,11 @@ void getCandleStickBars(String symbol, CandlestickInterval interval, Integer lim void getTrades(TradesRequest request, BinanceDexApiCallback callback); - void getTransactions(String address, BinanceDexApiCallback callback); + void getTransactions(String address, BinanceDexApiCallback callback); - void getTransactions(TransactionsRequest request, BinanceDexApiCallback callback); + void getTransactions(TransactionsRequest request, BinanceDexApiCallback callback); + + void getTransactionsInBlock(long blockHeight, BinanceDexApiCallback callback); // Do not support async commitBroadcast due to account sequence } 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 523e18af..f503b555 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexApiClientFactory.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexApiClientFactory.java @@ -26,11 +26,11 @@ public BinanceDexApiRestClient newRestClient(String baseUrl,String apiKey){ } public BinanceDexApiNodeClient newNodeRpcClient() { - return newNodeRpcClient(BinanceDexEnvironment.PROD.getNodeUrl(), BinanceDexEnvironment.PROD.getHrp()); + return newNodeRpcClient(BinanceDexEnvironment.PROD.getNodeUrl(), BinanceDexEnvironment.PROD.getHrp(), BinanceDexEnvironment.PROD.getValHrp()); } - public BinanceDexApiNodeClient newNodeRpcClient(String baseUrl, String hrp) { - return new BinanceDexApiNodeClientImpl(baseUrl, hrp); + public BinanceDexApiNodeClient newNodeRpcClient(String baseUrl, String hrp, String valHrp) { + return new BinanceDexApiNodeClientImpl(baseUrl, hrp, valHrp); } public BinanceDexApiAsyncRestClient newAsyncRestClient() { diff --git a/src/main/java/com/binance/dex/api/client/BinanceDexApiNodeClient.java b/src/main/java/com/binance/dex/api/client/BinanceDexApiNodeClient.java index 398b7824..bab0fea9 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexApiNodeClient.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexApiNodeClient.java @@ -3,11 +3,20 @@ import com.binance.dex.api.client.domain.*; import com.binance.dex.api.client.domain.broadcast.*; import com.binance.dex.api.client.domain.broadcast.Transaction; +import com.binance.dex.api.client.domain.oracle.Prophecy; import com.binance.dex.api.client.domain.request.ClosedOrdersRequest; import com.binance.dex.api.client.domain.request.OpenOrdersRequest; import com.binance.dex.api.client.domain.request.TradesRequest; import com.binance.dex.api.client.domain.request.TransactionsRequest; - +import com.binance.dex.api.client.domain.stake.Pool; +import com.binance.dex.api.client.domain.stake.beaconchain.*; +import com.binance.dex.api.client.domain.stake.Delegation; +import com.binance.dex.api.client.domain.stake.Redelegation; +import com.binance.dex.api.client.domain.stake.UnBondingDelegation; +import com.binance.dex.api.client.domain.stake.Validator; +import com.binance.dex.api.client.domain.stake.sidechain.*; + +import javax.annotation.Nullable; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.List; @@ -28,10 +37,14 @@ public interface BinanceDexApiNodeClient extends BinanceDexApiRestClient { Proposal getProposalById(String proposalId); + Proposal getSideProposalById(String proposalId, String sideChainId); + Account getCommittedAccount(String address); AtomicSwap getSwapByID(String swapID); + MiniToken getMiniTokenInfoBySymbol(String symbol); + @Override default Time getTime() { throw new UnsupportedOperationException(); @@ -123,12 +136,82 @@ default TradePage getTrades(TradesRequest request) { } @Override - default TransactionPage getTransactions(String address) { + default TransactionPageV2 getTransactions(String address) { + throw new UnsupportedOperationException(); + } + + @Override + default TransactionPageV2 getTransactions(TransactionsRequest request) { + throw new UnsupportedOperationException(); + } + + @Override + default TransactionPageV2 getTransactionsInBlock(long blockHeight) { + throw new UnsupportedOperationException(); + } + + @Override + default List getMiniTokens(Integer limit) { + throw new UnsupportedOperationException(); + } + + @Override + default List getMiniMarkets(Integer limit) { + throw new UnsupportedOperationException(); + } + + @Override + default List getMiniCandleStickBars(String symbol, CandlestickInterval interval) { + throw new UnsupportedOperationException(); + } + + @Override + default List getMiniCandleStickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime) { throw new UnsupportedOperationException(); } @Override - default TransactionPage getTransactions(TransactionsRequest request) { + default OrderList getMiniOpenOrders(String address) { + throw new UnsupportedOperationException(); + } + + @Override + default OrderList getMiniOpenOrders(OpenOrdersRequest request) { + throw new UnsupportedOperationException(); + } + + @Override + default OrderList getMiniClosedOrders(String address) { + throw new UnsupportedOperationException(); + } + + @Override + default OrderList getMiniClosedOrders(ClosedOrdersRequest request) { + throw new UnsupportedOperationException(); + } + + @Override + default Order getMiniOrder(String id) { + throw new UnsupportedOperationException(); + } + + @Override + default List getMini24HrPriceStatistics() { + throw new UnsupportedOperationException(); + } + + @Override + default List getMini24HrPriceStatistics(String symbol) { + throw new UnsupportedOperationException(); + } + + @Override + default TradePage getMiniTrades() { + throw new UnsupportedOperationException(); + } + + @Override + default TradePage getMiniTrades(TradesRequest request) { throw new UnsupportedOperationException(); } @@ -157,4 +240,85 @@ default List freeze(TokenFreeze freeze, Wallet wallet, Tran default List unfreeze(TokenUnfreeze unfreeze, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { throw new UnsupportedOperationException(); } + List createValidator(CreateBeaconChainValidator createBeaconChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + List editValidator(EditBeaconChainValidator editBeaconChainValidator, Wallet wallet, TransactionOption option, boolean sync) throws IOException, NoSuchAlgorithmException ; + + List delegate(BeaconChainDelegate beaconChainDelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + List redelegate(BeaconChainRedelegate beaconChainRedelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + List undelegate(BeaconChainUndelegate beaconChainUndelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + Validator getValidator(String validatorAddress) throws IOException; + + List getTopValidators(int top) throws IOException ; + + Delegation getDelegation(String delegatorAddress, String validatorAddress) throws IOException; + + List getDelegations(String delegatorAddress) throws IOException; + + Redelegation getRedelegation(String delegatorAddress, String srcValidatorAddress, String dstValidatorAddress) throws IOException; + + List getRedelegations(String delegatorAddress) throws IOException; + + UnBondingDelegation getUnBondingDelegation(String delegatorAddress, String validatorAddress) throws IOException; + + List getUnBondingDelegations(String delegatorAddress) throws IOException; + + List getUnBondingDelegationsByValidator(String validatorAddress) throws IOException ; + + List getRedelegationsByValidator(String validatorAddress) throws IOException; + + Pool getPool() throws IOException; + + long getAllValidatorsCount(boolean jailInvolved) throws IOException; + + List createSideChainValidator(CreateSideChainValidator createSideChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + List editSideChainValidator(EditSideChainValidator editSideChainValidator, Wallet wallet, TransactionOption option, boolean synv) throws IOException, NoSuchAlgorithmException ; + + List sideChainDelegate(SideChainDelegate sideChainDelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + List sideChainRedelagate(SideChainRedelegate sideChainRedelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + List sideChainUnbond(SideChainUnBond sideChainUndelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + Validator getSideChainValidator(String sideChainId, String validatorAddress) throws IOException; + + List getSideChainTopValidators(String sideChainId, int top) throws IOException ; + + Delegation getSideChainDelegation(String sideChainId, String delegatorAddress, String validatorAddress) throws IOException; + + List getSideChainDelegations(String sideChainId, String delegatorAddress) throws IOException; + + Redelegation getSideChainRedelegation(String sideChainId, String delegatorAddress, String srcValidatorAddress, String dstValidatorAddress) throws IOException; + + List getSideChainRedelegations(String sideChainId, String delegatorAddress) throws IOException; + + UnBondingDelegation getSideChainUnBondingDelegation(String sideChainId, String delegatorAddress, String validatorAddress) throws IOException; + + List getSideChainUnBondingDelegations(String sideChainId, String delegatorAddress) throws IOException; + + List getSideChainUnBondingDelegationsByValidator(String sideChainId, String validatorAddress) throws IOException ; + + List getSideChainRedelegationsByValidator(String sideChainId, String validatorAddress) throws IOException; + + Pool getSideChainPool(String sideChainId) throws IOException; + + long getAllSideChainValidatorsCount(String sideChainId, boolean jailInvolved) throws IOException; + + List claim(int chainId, byte[] payload, long sequence, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + @Nullable + Prophecy getProphecy(int claimType, long sequence) throws IOException; + + long getCurrentSequence(int claimType); + + List transferOut(String toAddress, com.binance.dex.api.client.encoding.message.Token amount, long expireTimeInSeconds, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + List bind(String symbol, long amount, String contractAddress, int contractDecimal, long expireTimeInSeconds, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + + List unBind(String symbol, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + } diff --git a/src/main/java/com/binance/dex/api/client/BinanceDexApiRestClient.java b/src/main/java/com/binance/dex/api/client/BinanceDexApiRestClient.java index 17706e44..005309fa 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexApiRestClient.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexApiRestClient.java @@ -56,15 +56,45 @@ public interface BinanceDexApiRestClient { TradePage getTrades(TradesRequest request); - TransactionPage getTransactions(String address); + TransactionPageV2 getTransactions(String address); - TransactionPage getTransactions(TransactionsRequest request); + TransactionPageV2 getTransactions(TransactionsRequest request); + + TransactionPageV2 getTransactionsInBlock(long blockHeight); + + List getMiniTokens(Integer limit); + + List getMiniMarkets(Integer limit); + + List getMiniCandleStickBars(String symbol, CandlestickInterval interval); + + List getMiniCandleStickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime); + + OrderList getMiniOpenOrders(String address); + + OrderList getMiniOpenOrders(OpenOrdersRequest request); + + OrderList getMiniClosedOrders(String address); + + OrderList getMiniClosedOrders(ClosedOrdersRequest request); + + Order getMiniOrder(String id); + + List getMini24HrPriceStatistics(); + + List getMini24HrPriceStatistics(String symbol); + + TradePage getMiniTrades(); + + TradePage getMiniTrades(TradesRequest request); List newOrder(NewOrder newOrder, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; List vote(Vote vote,Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + List sideVote(SideVote vote,Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + List cancelOrder(CancelOrder cancelOrder, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; @@ -92,5 +122,8 @@ List claimHtlt(String swapId,byte[] randomNumber,Wallet wal List refundHtlt(String swapId,Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException; + List transferTokenOwnership(String symbol, String newOwner, Wallet wallet, TransactionOption options, boolean sync) + throws IOException, NoSuchAlgorithmException; + List broadcast(String payload,boolean sync); } diff --git a/src/main/java/com/binance/dex/api/client/BinanceDexEnvironment.java b/src/main/java/com/binance/dex/api/client/BinanceDexEnvironment.java index 5c8c2ac4..4b165ef1 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexEnvironment.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexEnvironment.java @@ -6,21 +6,37 @@ public class BinanceDexEnvironment { public static final BinanceDexEnvironment PROD = new BinanceDexEnvironment( "https://dex.binance.org", + "https://api.binance.org/bc/", "wss://dex.binance.org/api", "https://dataseed1.ninicoin.io", "wss://dataseed1.ninicoin.io/websocket", - "bnb" + "bnb", + "bva" ); public static final BinanceDexEnvironment TEST_NET = new BinanceDexEnvironment( "https://testnet-dex.binance.org", + "https://testnet-api.binance.org/bc/", "wss://testnet-dex.binance.org/api", "http://data-seed-pre-0-s3.binance.org", "wss://data-seed-pre-0-s3.binance.org/websocket", - "tbnb" + "tbnb", + "bva" + ); + + public static final BinanceDexEnvironment LOCAL_NET = new BinanceDexEnvironment( + "https://testnet-dex.binance.org", + "https://testnet-api.binance.org/bc/", + "wss://testnet-dex.binance.org/api", + "http://127.0.0.1:26657", + "wss://data-seed-pre-0-s3.binance.org/websocket", + "bnb", + "bva" ); // Rest API base URL private String baseUrl; + // Chain transaction API base URL + private String transactionUrl; // Websocket data stream url private String streamUrl; // RPC API base URL @@ -29,19 +45,37 @@ public class BinanceDexEnvironment { private String wsBaseUrl; // Address human readable part prefix private String hrp; + // Address human readable part prefix for validator + private String valHrp; + + public BinanceDexEnvironment(String baseUrl, String streamUrl, String nodeUrl, String wsBaseUrl, String hrp, String valHrp) { + this.baseUrl = baseUrl; + this.streamUrl = streamUrl; + this.nodeUrl = nodeUrl; + this.wsBaseUrl = wsBaseUrl; + this.hrp = hrp; + this.valHrp = valHrp; + this.transactionUrl = inferTransactionUrl(baseUrl); + } - public BinanceDexEnvironment(String baseUrl, String streamUrl, String nodeUrl, String wsBaseUrl, String hrp) { + public BinanceDexEnvironment(String baseUrl, String transactionUrl, String streamUrl, String nodeUrl, String wsBaseUrl, String hrp, String valHrp) { this.baseUrl = baseUrl; + this.transactionUrl = transactionUrl; this.streamUrl = streamUrl; this.nodeUrl = nodeUrl; this.wsBaseUrl = wsBaseUrl; this.hrp = hrp; + this.valHrp = valHrp; } public String getBaseUrl() { return baseUrl; } + public String getTransactionUrl() { + return transactionUrl; + } + public String getStreamUrl() { return streamUrl; } @@ -54,6 +88,20 @@ public String getHrp() { return hrp; } + public String getValHrp() { + return valHrp; + } + + public static String inferTransactionUrl(String baseUrl) { + String transactionUrl = null; + if (baseUrl != null && baseUrl.equalsIgnoreCase(BinanceDexEnvironment.PROD.baseUrl)) { + transactionUrl = BinanceDexEnvironment.PROD.transactionUrl; + } else if (baseUrl != null && baseUrl.equalsIgnoreCase(BinanceDexEnvironment.TEST_NET.baseUrl)) { + transactionUrl = BinanceDexEnvironment.TEST_NET.transactionUrl; + } + return transactionUrl; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/binance/dex/api/client/BinanceDexNodeApi.java b/src/main/java/com/binance/dex/api/client/BinanceDexNodeApi.java index 7d5bc719..edab5977 100644 --- a/src/main/java/com/binance/dex/api/client/BinanceDexNodeApi.java +++ b/src/main/java/com/binance/dex/api/client/BinanceDexNodeApi.java @@ -50,4 +50,10 @@ public interface BinanceDexNodeApi { @GET("/block_by_hash") Call> getBlock(@Query("hash") String hash); + @GET("/abci_query?height=0&prove=false") + Call> abciQuery(@Query("path") String path, @Query("data") String data); + + @GET("/abci_query") + Call> abciQueryWithOptions(@Query("path") String path, @Query("data") String data, @Query("height") long height, @Query("prove") boolean prove); + } diff --git a/src/main/java/com/binance/dex/api/client/BinanceTransactionApi.java b/src/main/java/com/binance/dex/api/client/BinanceTransactionApi.java new file mode 100644 index 00000000..314d894d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/BinanceTransactionApi.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client; + +import com.binance.dex.api.client.domain.TransactionPageV2; +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; +import retrofit2.http.Query; + +public interface BinanceTransactionApi { + @GET("api/v1/txs") + Call getTransactions(@Query(value = "startTime") Long startTime, + @Query(value = "endTime") Long endTime, + @Query(value = "type") String type, + @Query(value = "asset") String asset, + @Query(value = "address") String address, + @Query(value = "addressType") String addressType, + @Query(value = "offset") Integer offset, + @Query(value = "limit") Integer limit); + + @GET("api/v1/blocks/{blockHeight}/txs") + Call getTransactionsInBlock(@Path("blockHeight") long blockHeight); +} diff --git a/src/main/java/com/binance/dex/api/client/TransactionConverter.java b/src/main/java/com/binance/dex/api/client/TransactionConverter.java index 960ed768..9fe8f994 100644 --- a/src/main/java/com/binance/dex/api/client/TransactionConverter.java +++ b/src/main/java/com/binance/dex/api/client/TransactionConverter.java @@ -1,26 +1,53 @@ package com.binance.dex.api.client; +import com.binance.dex.api.client.crosschain.Package; import com.binance.dex.api.client.domain.*; +import com.binance.dex.api.client.domain.bridge.Bind; +import com.binance.dex.api.client.domain.bridge.TransferOut; +import com.binance.dex.api.client.domain.bridge.Unbind; import com.binance.dex.api.client.domain.broadcast.*; import com.binance.dex.api.client.domain.broadcast.Burn; import com.binance.dex.api.client.domain.broadcast.CancelOrder; import com.binance.dex.api.client.domain.broadcast.CreateValidator; +import com.binance.dex.api.client.domain.broadcast.MiniTokenIssue; +import com.binance.dex.api.client.domain.broadcast.MiniTokenSetURI; import com.binance.dex.api.client.domain.broadcast.RemoveValidator; import com.binance.dex.api.client.domain.broadcast.Deposit; import com.binance.dex.api.client.domain.broadcast.Issue; import com.binance.dex.api.client.domain.broadcast.Mint; import com.binance.dex.api.client.domain.broadcast.NewOrder; import com.binance.dex.api.client.domain.broadcast.SetAccountFlag; +import com.binance.dex.api.client.domain.broadcast.SideDeposit; +import com.binance.dex.api.client.domain.broadcast.SideSubmitProposal; +import com.binance.dex.api.client.domain.broadcast.SideVote; import com.binance.dex.api.client.domain.broadcast.SubmitProposal; +import com.binance.dex.api.client.domain.broadcast.TinyTokenIssue; import com.binance.dex.api.client.domain.broadcast.TokenFreeze; import com.binance.dex.api.client.domain.broadcast.TokenUnfreeze; import com.binance.dex.api.client.domain.broadcast.Transaction; import com.binance.dex.api.client.domain.broadcast.Vote; import com.binance.dex.api.client.domain.jsonrpc.TxResult; +import com.binance.dex.api.client.domain.oracle.ClaimMsg; +import com.binance.dex.api.client.domain.slash.BscSubmitEvidence; +import com.binance.dex.api.client.domain.slash.SideChainUnJail; +import com.binance.dex.api.client.domain.slash.UnJail; +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.domain.stake.beaconchain.*; +import com.binance.dex.api.client.domain.stake.sidechain.*; +import com.binance.dex.api.client.encoding.ByteUtil; import com.binance.dex.api.client.encoding.Crypto; +import com.binance.dex.api.client.encoding.amino.Amino; import com.binance.dex.api.client.encoding.message.InputOutput; import com.binance.dex.api.client.encoding.message.MessageType; import com.binance.dex.api.client.encoding.message.Token; +import com.binance.dex.api.client.encoding.message.beaconchain.transaction.*; +import com.binance.dex.api.client.encoding.message.bridge.BindMsgMessage; +import com.binance.dex.api.client.encoding.message.bridge.ClaimMsgMessage; +import com.binance.dex.api.client.encoding.message.bridge.TransferOutMsgMessage; +import com.binance.dex.api.client.encoding.message.bridge.UnbindMsgMessage; +import com.binance.dex.api.client.encoding.message.sidechain.transaction.*; +import com.binance.dex.api.client.rlp.Decoder; import com.binance.dex.api.proto.*; import com.binance.dex.api.proto.TimeLock; import com.binance.dex.api.proto.TimeRelock; @@ -28,6 +55,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import org.bouncycastle.util.encoders.Hex; +import java.io.IOException; import java.time.Instant; import java.util.*; import java.util.List; @@ -37,8 +65,13 @@ public class TransactionConverter { private String hrp; - public TransactionConverter(String hrp){ + private String valHrp; + + private final Amino amino = new Amino(); + + public TransactionConverter(String hrp, String valHrp) { this.hrp = hrp; + this.valHrp = valHrp; } public List convert(com.binance.dex.api.client.domain.jsonrpc.BlockInfoResult.Transaction txMessage) { @@ -64,7 +97,7 @@ public List convert(com.binance.dex.api.client.domain.jsonrpc.Block transaction.setResultData(Optional.ofNullable(txMessage.getTx_result()).map(TxResult::getData).orElse(null)); transaction.setSource(stdTx.getSource()); transaction.setSequence(stdSignature.getSequence()); - fillTagsAndEvents(txMessage.getTx_result(),transaction); + fillTagsAndEvents(txMessage.getTx_result(), transaction); return transaction; }).filter(Objects::nonNull).collect(Collectors.toList()); } catch (InvalidProtocolBufferException e) { @@ -72,32 +105,32 @@ public List convert(com.binance.dex.api.client.domain.jsonrpc.Block } } - public void fillTagsAndEvents(TxResult txResult,Transaction transaction){ + public void fillTagsAndEvents(TxResult txResult, Transaction transaction) { boolean hasTags = txResult.getTags() != null && txResult.getTags().size() > 0; boolean hasEvents = txResult.getEvents() != null && txResult.getEvents().size() > 0 && txResult.getEvents().get(0).getAttributes() != null && txResult.getEvents().get(0).getAttributes().size() > 0; - if(hasTags && !hasEvents){ + if (hasTags && !hasEvents) { transaction.setTags(txResult.getTags()); List attributes = txResult.getTags().stream().map(this::convertOf).collect(Collectors.toList()); TxResult.Event event = new TxResult.Event(); event.setAttributes(attributes); transaction.setEvents(Collections.singletonList(event)); - }else if(hasEvents && !hasTags){ + } else if (hasEvents && !hasTags) { transaction.setEvents(txResult.getEvents()); List tags = txResult.getEvents().get(0).getAttributes().stream().map(this::convertOf).collect(Collectors.toList()); transaction.setTags(tags); } } - private TxResult.Attribute convertOf(TxResult.Tag tag){ + private TxResult.Attribute convertOf(TxResult.Tag tag) { TxResult.Attribute attribute = new TxResult.Attribute(); attribute.setKey(tag.getKey()); attribute.setValue(tag.getValue()); return attribute; } - private TxResult.Tag convertOf(TxResult.Attribute attribute){ + private TxResult.Tag convertOf(TxResult.Attribute attribute) { TxResult.Tag tag = new TxResult.Tag(); tag.setKey(attribute.getKey()); tag.setValue(attribute.getValue()); @@ -132,16 +165,24 @@ public Transaction convert(byte[] bytes) { return convertTokenUnfreeze(bytes); case Vote: return convertVote(bytes); + case SideVote: + return convertSideVote(bytes); case Issue: return convertIssue(bytes); case Burn: return convertBurn(bytes); case Mint: return convertMint(bytes); + case TransferTokenOwnership: + return convertTransferTokenOwnership(bytes); case SubmitProposal: return convertSubmitProposal(bytes); + case SideSubmitProposal: + return convertSideSubmitProposal(bytes); case Deposit: return convertDeposit(bytes); + case SideDeposit: + return convertSideDeposit(bytes); case CreateValidator: return convertCreateValidator(bytes); case RemoveValidator: @@ -164,7 +205,55 @@ public Transaction convert(byte[] bytes) { return convertClaimHashTimerLock(bytes); case RefundHashTimerLockMsg: return convertRefundHashTimerLock(bytes); - + case CreateSideChainValidator: + return convertCreateSideChainValidator(bytes); + case EditSideChainValidator: + return convertEditSideChainValidator(bytes); + case SideChainDelegate: + return convertSideChainDelegate(bytes); + case SideChainRedelegate: + return convertSideChainRedelegate(bytes); + case SideChainUndelegate: + return convertSideChainUnBond(bytes); + case Claim: + //transfer in, update transfer out, update bind + return convertClaimMsg(bytes); + case TransferOut: + return convertTransferOutMsg(bytes); + case Bind: + return convertBindMsg(bytes); + case UnBind: + return convertUnBindMsg(bytes); + case BscSubmitEvidence: + return convertBscSubmitEvidence(bytes); + case SideChainUnJail: + return convertSideChainUnJail(bytes); + case TinyTokenIssue: + return convertTinyTokenIssue(bytes); + case MiniTokenIssue: + return convertMiniTokenIssue(bytes); + case MiniTokenSetURI: + return convertMiniTokenSetURI(bytes); + case MiniTokenList: + return convertMiniTokenList(bytes); + case CreateBeaconChainValidator: + return convertCreateBeaconChainValidator(bytes); + case EditBeaconChainValidator: + return convertEditBeaconChainValidator(bytes); + case BeaconChainDelegate: + return convertBeaconChainDelegate(bytes); + case BeaconChainRedelegate: + return convertBeaconChainRedelegate(bytes); + case BeaconChainUndelegate: + return convertBeaconChainUndelegate(bytes); + case UnJail: + return convertUnJail(bytes); + case CreateSideChainValidatorWithVoteAddr: + return convertCreateSideChainValidatorWithVoteAddr(bytes); + case EditSideChainValidatorWithVoteAddr: + return convertEditSideChainValidatorWithVoteAddr(bytes); + case SideChainStakeMigration: + return convertSideChainStakeMigration(bytes); } return null; } catch (Exception e) { @@ -172,13 +261,549 @@ public Transaction convert(byte[] bytes) { } } + private Transaction convertBeaconChainUndelegate(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + BeaconChainUndelegateMessage message = new BeaconChainUndelegateMessage(); + amino.decodeBare(raw, message); + + BeaconChainUndelegate unBond = new BeaconChainUndelegate(); + + if (message.getDelegatorAddress() != null && message.getDelegatorAddress().getRaw() != null) { + unBond.setDelegatorAddress(Crypto.encodeAddress(hrp, message.getDelegatorAddress().getRaw())); + } + + if (message.getValidatorAddress() != null && message.getValidatorAddress().getRaw() != null) { + unBond.setValidatorAddress(Crypto.encodeAddress(valHrp, message.getValidatorAddress().getRaw())); + } + + Token amount = new Token(); + if (message.getAmount() != null) { + amount.setAmount(message.getAmount().getAmount()); + amount.setDenom(message.getAmount().getDenom()); + } + unBond.setAmount(amount); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.BEACONCHAIN_UNDELEGATE); + transaction.setRealTx(unBond); + + return transaction; + } + + private Transaction convertBeaconChainRedelegate(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + BeaconChainRedelegateMessage message = new BeaconChainRedelegateMessage(); + amino.decodeBare(raw, message); + + BeaconChainRedelegate redelegate = new BeaconChainRedelegate(); + if (message.getDelegatorAddress() != null && message.getDelegatorAddress().getRaw() != null) { + redelegate.setDelegatorAddress(Crypto.encodeAddress(hrp, message.getDelegatorAddress().getRaw())); + } + + if (message.getSrcValidatorAddress() != null && message.getSrcValidatorAddress().getRaw() != null) { + redelegate.setSrcValidatorAddress(Crypto.encodeAddress(valHrp, message.getSrcValidatorAddress().getRaw())); + } + + if (message.getDstValidatorAddress() != null && message.getDstValidatorAddress().getRaw() != null) { + redelegate.setDstValidatorAddress(Crypto.encodeAddress(valHrp, message.getDstValidatorAddress().getRaw())); + } + + Token amount = new Token(); + if (message.getAmount() != null) { + amount.setAmount(message.getAmount().getAmount()); + amount.setDenom(message.getAmount().getDenom()); + } + redelegate.setAmount(amount); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.BEACONCHAIN_REDELEGATE); + transaction.setRealTx(redelegate); + + return transaction; + } + + private Transaction convertBeaconChainDelegate(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + BeaconChainDelegateMessage message = new BeaconChainDelegateMessage(); + amino.decodeBare(raw, message); + + BeaconChainDelegate beaconChainDelegate = new BeaconChainDelegate(); + if (message.getDelegatorAddress() != null && message.getDelegatorAddress().getRaw() != null) { + beaconChainDelegate.setDelegatorAddress(Crypto.encodeAddress(hrp, message.getDelegatorAddress().getRaw())); + } + + if (message.getValidatorAddress() != null && message.getValidatorAddress().getRaw() != null) { + beaconChainDelegate.setValidatorAddress(Crypto.encodeAddress(valHrp, message.getValidatorAddress().getRaw())); + } + + Token token = new Token(); + if (message.getDelegation() != null) { + token.setDenom(message.getDelegation().getDenom()); + token.setAmount(message.getDelegation().getAmount()); + } + beaconChainDelegate.setDelegation(token); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.BEACONCHAIN_DELEGATE); + transaction.setRealTx(beaconChainDelegate); + + return transaction; + } + + private Transaction convertEditBeaconChainValidator(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + EditBeaconChainValidatorMessage message = new EditBeaconChainValidatorMessage(); + amino.decodeBare(raw, message); + + EditBeaconChainValidator editBeaconChainValidator = new EditBeaconChainValidator(); + + Description description = new Description(); + if (message.getDescription() != null) { + description.setMoniker(message.getDescription().getMoniker()); + description.setDetails(message.getDescription().getDetails()); + description.setIdentity(message.getDescription().getIdentity()); + description.setWebsite(message.getDescription().getWebsite()); + } + editBeaconChainValidator.setDescription(description); + + if (message.getValidatorOperatorAddress() != null && message.getValidatorOperatorAddress().getRaw() != null) { + editBeaconChainValidator.setValidatorAddress(Crypto.encodeAddress(valHrp, message.getValidatorOperatorAddress().getRaw())); + } + + if (message.getCommissionRate() != null) { + editBeaconChainValidator.setCommissionRate(message.getCommissionRate().getValue()); + } + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.EDIT_BEACONCHAIN_VALIDATOR); + transaction.setRealTx(editBeaconChainValidator); + + return transaction; + } + + private Transaction convertCreateBeaconChainValidator(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + CreateBeaconChainValidatorMessage message = new CreateBeaconChainValidatorMessage(); + amino.decodeBare(raw, message); + + CreateBeaconChainValidator createBeaconChainValidator = new CreateBeaconChainValidator(); + + Description description = new Description(); + if (message.getDescription() != null) { + description.setMoniker(message.getDescription().getMoniker()); + description.setDetails(message.getDescription().getDetails()); + description.setIdentity(message.getDescription().getIdentity()); + description.setWebsite(message.getDescription().getWebsite()); + } + createBeaconChainValidator.setDescription(description); + + Commission commission = new Commission(); + if (message.getCommission() != null) { + try { + commission.setRate(message.getCommission().getRate().getValue()); + commission.setMaxRate(message.getCommission().getMaxRate().getValue()); + commission.setMaxChangeRate(message.getCommission().getMaxChangeRate().getValue()); + } catch (NullPointerException e) { + //ignore + } + } + createBeaconChainValidator.setCommission(commission); + + if (message.getDelegatorAddr() != null && message.getDelegatorAddr().getRaw() != null) { + createBeaconChainValidator.setDelegatorAddr(Crypto.encodeAddress(hrp, message.getDelegatorAddr().getRaw())); + } + + if (message.getValidatorOperatorAddr() != null && message.getValidatorOperatorAddr().getRaw() != null) { + createBeaconChainValidator.setValidatorAddr(Crypto.encodeAddress(valHrp, message.getValidatorOperatorAddr().getRaw())); + } + + Token delegation = new Token(); + if (message.getDelegation() != null) { + delegation.setAmount(message.getDelegation().getAmount()); + delegation.setDenom(message.getDelegation().getDenom()); + } + createBeaconChainValidator.setDelegation(delegation); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.CREATE_BEACONCHAIN_VALIDATOR); + transaction.setRealTx(createBeaconChainValidator); + return transaction; + } + + private Transaction convertUnJail(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + UnJailMsg message = UnJailMsg.parseFrom(raw); + + UnJail unJail = new UnJail(); + unJail.setValidatorAddr(Crypto.encodeAddress(valHrp, message.getAddress().toByteArray())); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.UNJAIL); + transaction.setRealTx(unJail); + return transaction; + } + + private Transaction convertTransferTokenOwnership(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + TransferTokenOwnershipMsg msg = TransferTokenOwnershipMsg.parseFrom(raw); + + TransferTokenOwnership transferTokenOwnership = new TransferTokenOwnership(); + transferTokenOwnership.setFrom(Crypto.encodeAddress(hrp, msg.getFrom().toByteArray())); + transferTokenOwnership.setSymbol(msg.getSymbol()); + transferTokenOwnership.setNewOwner(Crypto.encodeAddress(hrp, msg.getNewOwner().toByteArray())); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.TRANSFER_TOKEN_OWNERSHIP); + transaction.setRealTx(transferTokenOwnership); + return transaction; + } + + private Transaction convertSideChainUnJail(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + SideChainUnJailMsg message = SideChainUnJailMsg.parseFrom(raw); + + SideChainUnJail unJail = new SideChainUnJail(); + unJail.setSideChainId(message.getSideChainId()); + unJail.setValidatorAddr(Crypto.encodeAddress(valHrp, message.getAddress().toByteArray())); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.SIDECHAIN_UNJAIL); + transaction.setRealTx(unJail); + return transaction; + } + + private Transaction convertBscSubmitEvidence(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + SubmitEvidenceMsg message = SubmitEvidenceMsg.parseFrom(raw); + + BscSubmitEvidence bscSubmitEvidence = new BscSubmitEvidence(); + if (message.getSubmitter() != null && raw != null) { + bscSubmitEvidence.setSubmitter(Crypto.encodeAddress(hrp, message.getSubmitter().toByteArray())); + } + + List headers = message.getHeadersList(); + if (headers != null && headers.size() > 0) { + com.binance.dex.api.client.domain.slash.BscHeader[] bscHeaders = new com.binance.dex.api.client.domain.slash.BscHeader[headers.size()]; + com.binance.dex.api.client.domain.slash.BscHeader bscHeader; + for (int i = 0; i < headers.size(); i++) { + bscHeader = new com.binance.dex.api.client.domain.slash.BscHeader(); + bscHeader.setParentHash(headers.get(i).getParentHash().toByteArray()); + bscHeader.setSha3Uncles(headers.get(i).getSha3Uncles().toByteArray()); + bscHeader.setMiner(headers.get(i).getMiner().toByteArray()); + bscHeader.setStateRoot(headers.get(i).getStateRoot().toByteArray()); + bscHeader.setTransactionsRoot(headers.get(i).getTransactionsRoot().toByteArray()); + bscHeader.setReceiptsRoot(headers.get(i).getReceiptsRoot().toByteArray()); + bscHeader.setLogsBloom(headers.get(i).getLogsBloom().toByteArray()); + bscHeader.setDifficulty(headers.get(i).getDifficulty()); + bscHeader.setNumber(headers.get(i).getNumber()); + bscHeader.setGasLimit(headers.get(i).getGasLimit()); + bscHeader.setGasUsed(headers.get(i).getGasUsed()); + bscHeader.setTimestamp(headers.get(i).getTimestamp()); + bscHeader.setExtra(headers.get(i).getExtraData().toByteArray()); + bscHeader.setMixHash(headers.get(i).getMixHash().toByteArray()); + bscHeader.setNonce(headers.get(i).getNonce().toByteArray()); + bscHeaders[i] = bscHeader; + } + bscSubmitEvidence.setHeaders(bscHeaders); + } + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.BSC_SUBMIT_EVIDENCE); + transaction.setRealTx(bscSubmitEvidence); + return transaction; + } + + private Transaction convertBindMsg(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + BindMsgMessage message = new BindMsgMessage(); + amino.decodeBare(raw, message); + + Bind bind = new Bind(); + if (message.getFrom() != null && message.getFrom().getRaw() != null) { + bind.setFrom(Crypto.encodeAddress(hrp, message.getFrom().getRaw())); + } + bind.setSymbol(message.getSymbol()); + bind.setAmount(message.getAmount()); + if (message.getContractAddress() != null) { + bind.setContractAddress(message.getContractAddress().getAddress()); + } + bind.setContractDecimal(message.getContractDecimal()); + bind.setExpireTime(message.getExpireTime()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.BIND); + transaction.setRealTx(bind); + + return transaction; + } + + private Transaction convertUnBindMsg(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + UnbindMsgMessage message = new UnbindMsgMessage(); + amino.decodeBare(raw, message); + + Unbind bind = new Unbind(); + if (message.getFrom() != null && message.getFrom().getRaw() != null) { + bind.setFrom(Crypto.encodeAddress(hrp, message.getFrom().getRaw())); + } + bind.setSymbol(message.getSymbol()); + + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.UNBIND); + transaction.setRealTx(bind); + + return transaction; + } + + private Transaction convertTransferOutMsg(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + TransferOutMsgMessage message = new TransferOutMsgMessage(); + amino.decodeBare(raw, message); + + TransferOut transferOut = new TransferOut(); + if (message.getFrom() != null && message.getFrom().getRaw() != null) { + transferOut.setFrom(Crypto.encodeAddress(hrp, message.getFrom().getRaw())); + } + if (message.getToAddress() != null) { + transferOut.setToAddress(message.getToAddress().getAddress()); + } + + Token token = new Token(); + if (message.getAmount() != null) { + token.setAmount(message.getAmount().getAmount()); + token.setDenom(message.getAmount().getDenom()); + } + transferOut.setAmount(token); + + transferOut.setExpireTime(message.getExpireTime()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.TRANSFER_OUT); + transaction.setRealTx(transferOut); + + return transaction; + } + + private Transaction convertClaimMsg(byte[] value) throws Exception { + byte[] raw = ByteUtil.cut(value, 4); + ClaimMsgMessage message = new ClaimMsgMessage(); + amino.decodeBare(raw, message); + ClaimMsg claimMsg = new ClaimMsg(); + claimMsg.setChainId(message.getChainId()); + claimMsg.setSequence(message.getSequence()); + List packages = Decoder.decodeList(message.getPayload(), Package.class); + packages.forEach(pack -> pack.setHrp(this.hrp)); + claimMsg.setPayload(packages); + if (message.getValidatorAddress().getRaw() != null) { + claimMsg.setValidatorAddress(Crypto.encodeAddress(valHrp, message.getValidatorAddress().getRaw())); + } + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.CLAIM); + transaction.setRealTx(claimMsg); + + return transaction; + } + + private Transaction convertSideChainUnBond(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + SideChainUndelegateMessage message = new SideChainUndelegateMessage(); + amino.decodeBare(raw, message); + + SideChainUnBond unBond = new SideChainUnBond(); + + if (message.getDelegatorAddress() != null && message.getDelegatorAddress().getRaw() != null) { + unBond.setDelegatorAddress(Crypto.encodeAddress(hrp, message.getDelegatorAddress().getRaw())); + } + + if (message.getValidatorAddress() != null && message.getValidatorAddress().getRaw() != null) { + unBond.setValidatorAddress(Crypto.encodeAddress(valHrp, message.getValidatorAddress().getRaw())); + } + + Token amount = new Token(); + if (message.getAmount() != null) { + amount.setAmount(message.getAmount().getAmount()); + amount.setDenom(message.getAmount().getDenom()); + } + unBond.setAmount(amount); + + unBond.setSideChainId(message.getSideChainId()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.SIDECHAIN_UNBOND); + transaction.setRealTx(unBond); + + return transaction; + } + + private Transaction convertSideChainRedelegate(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + SideChainRedelegateMessage message = new SideChainRedelegateMessage(); + amino.decodeBare(raw, message); + + SideChainRedelegate redelegate = new SideChainRedelegate(); + if (message.getDelegatorAddress() != null && message.getDelegatorAddress().getRaw() != null) { + redelegate.setDelegatorAddress(Crypto.encodeAddress(hrp, message.getDelegatorAddress().getRaw())); + } + + if (message.getSrcValidatorAddress() != null && message.getSrcValidatorAddress().getRaw() != null) { + redelegate.setSrcValidatorAddress(Crypto.encodeAddress(valHrp, message.getSrcValidatorAddress().getRaw())); + } + + if (message.getDstValidatorAddress() != null && message.getDstValidatorAddress().getRaw() != null) { + redelegate.setDstValidatorAddress(Crypto.encodeAddress(valHrp, message.getDstValidatorAddress().getRaw())); + } + + Token amount = new Token(); + if (message.getAmount() != null) { + amount.setAmount(message.getAmount().getAmount()); + amount.setDenom(message.getAmount().getDenom()); + } + redelegate.setAmount(amount); + + redelegate.setSideChainId(message.getSideChainId()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.SIDECHAIN_REDELEGATE); + transaction.setRealTx(redelegate); + + return transaction; + } + + private Transaction convertSideChainDelegate(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + SideChainDelegateMessage message = new SideChainDelegateMessage(); + amino.decodeBare(raw, message); + + SideChainDelegate sideChainDelegate = new SideChainDelegate(); + if (message.getDelegatorAddress() != null && message.getDelegatorAddress().getRaw() != null) { + sideChainDelegate.setDelegatorAddress(Crypto.encodeAddress(hrp, message.getDelegatorAddress().getRaw())); + } + + if (message.getValidatorAddress() != null && message.getValidatorAddress().getRaw() != null) { + sideChainDelegate.setValidatorAddress(Crypto.encodeAddress(valHrp, message.getValidatorAddress().getRaw())); + } + + Token token = new Token(); + if (message.getDelegation() != null) { + token.setDenom(message.getDelegation().getDenom()); + token.setAmount(message.getDelegation().getAmount()); + } + sideChainDelegate.setDelegation(token); + + sideChainDelegate.setSideChainId(message.getSideChainId()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.SIDECHAIN_DELEGATE); + transaction.setRealTx(sideChainDelegate); + + return transaction; + } + + private Transaction convertEditSideChainValidator(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + EditSideChainValidatorMessage message = new EditSideChainValidatorMessage(); + amino.decodeBare(raw, message); + + EditSideChainValidator editSideChainValidator = new EditSideChainValidator(); + + Description description = new Description(); + if (message.getDescription() != null) { + description.setMoniker(message.getDescription().getMoniker()); + description.setDetails(message.getDescription().getDetails()); + description.setIdentity(message.getDescription().getIdentity()); + description.setWebsite(message.getDescription().getWebsite()); + } + editSideChainValidator.setDescription(description); + + if (message.getValidatorOperatorAddress() != null && message.getValidatorOperatorAddress().getRaw() != null) { + editSideChainValidator.setValidatorAddress(Crypto.encodeAddress(valHrp, message.getValidatorOperatorAddress().getRaw())); + } + + if (message.getCommissionRate() != null) { + editSideChainValidator.setCommissionRate(message.getCommissionRate().getValue()); + } + + editSideChainValidator.setSideChainId(message.getSideChainId()); + + if (message.getSideFeeAddr() != null) { + editSideChainValidator.setSideFeeAddr("0x" + Hex.toHexString(message.getSideFeeAddr())); + } + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.EDIT_SIDECHAIN_VALIDATOR); + transaction.setRealTx(editSideChainValidator); + + return transaction; + } + + private Transaction convertCreateSideChainValidator(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + CreateSideChainValidatorMessage message = new CreateSideChainValidatorMessage(); + amino.decodeBare(raw, message); + + CreateSideChainValidator createSideChainValidator = new CreateSideChainValidator(); + + Description description = new Description(); + if (message.getDescription() != null) { + description.setMoniker(message.getDescription().getMoniker()); + description.setDetails(message.getDescription().getDetails()); + description.setIdentity(message.getDescription().getIdentity()); + description.setWebsite(message.getDescription().getWebsite()); + } + createSideChainValidator.setDescription(description); + + Commission commission = new Commission(); + if (message.getCommission() != null) { + try { + commission.setRate(message.getCommission().getRate().getValue()); + commission.setMaxRate(message.getCommission().getMaxRate().getValue()); + commission.setMaxChangeRate(message.getCommission().getMaxChangeRate().getValue()); + } catch (NullPointerException e) { + //ignore + } + } + createSideChainValidator.setCommission(commission); + + if (message.getDelegatorAddr() != null && message.getDelegatorAddr().getRaw() != null) { + createSideChainValidator.setDelegatorAddr(Crypto.encodeAddress(hrp, message.getDelegatorAddr().getRaw())); + } + + if (message.getValidatorOperatorAddr() != null && message.getValidatorOperatorAddr().getRaw() != null) { + createSideChainValidator.setValidatorAddr(Crypto.encodeAddress(valHrp, message.getValidatorOperatorAddr().getRaw())); + } + + Token delegation = new Token(); + if (message.getDelegation() != null) { + delegation.setAmount(message.getDelegation().getAmount()); + delegation.setDenom(message.getDelegation().getDenom()); + } + createSideChainValidator.setDelegation(delegation); + + createSideChainValidator.setSideChainId(message.getSideChainId()); + + if (message.getSideConsAddr() != null) { + createSideChainValidator.setSideConsAddr("0x" + Hex.toHexString(message.getSideConsAddr())); + } + + if (message.getSideFeeAddr() != null) { + createSideChainValidator.setSideFeeAddr("0x" + Hex.toHexString(message.getSideFeeAddr())); + } + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.CREATE_SIDECHAIN_VALIDATOR); + transaction.setRealTx(createSideChainValidator); + return transaction; + } + + private Transaction convertRefundHashTimerLock(byte[] value) throws InvalidProtocolBufferException { byte[] array = new byte[value.length - 4]; System.arraycopy(value, 4, array, 0, array.length); RefundHashTimerLockMsg refundHtlMsg = RefundHashTimerLockMsg.parseFrom(array); RefundHashTimerLock refundHashTimerLock = new RefundHashTimerLock(); - refundHashTimerLock.setFrom(Crypto.encodeAddress(hrp,refundHtlMsg.getFrom().toByteArray())); + refundHashTimerLock.setFrom(Crypto.encodeAddress(hrp, refundHtlMsg.getFrom().toByteArray())); refundHashTimerLock.setSwapID(Hex.toHexString(refundHtlMsg.getSwapId().toByteArray())); Transaction transaction = new Transaction(); @@ -193,7 +818,7 @@ private Transaction convertClaimHashTimerLock(byte[] value) throws InvalidProtoc ClaimHashTimerLockMsg claimHtlMsg = ClaimHashTimerLockMsg.parseFrom(array); ClaimHashTimerLock claimHashTimerLock = new ClaimHashTimerLock(); - claimHashTimerLock.setFrom(Crypto.encodeAddress(hrp,claimHtlMsg.getFrom().toByteArray())); + claimHashTimerLock.setFrom(Crypto.encodeAddress(hrp, claimHtlMsg.getFrom().toByteArray())); claimHashTimerLock.setSwapID(Hex.toHexString(claimHtlMsg.getSwapId().toByteArray())); claimHashTimerLock.setRandomNumber(Hex.toHexString(claimHtlMsg.getRandomNumber().toByteArray())); @@ -209,7 +834,7 @@ private Transaction convertDepositHashTimerLock(byte[] value) throws InvalidProt DepositHashTimerLockMsg depositHtlMsg = DepositHashTimerLockMsg.parseFrom(array); DepositHashTimerLock depositHashTimerLock = new DepositHashTimerLock(); - depositHashTimerLock.setFrom(Crypto.encodeAddress(hrp,depositHtlMsg.getFrom().toByteArray())); + depositHashTimerLock.setFrom(Crypto.encodeAddress(hrp, depositHtlMsg.getFrom().toByteArray())); depositHashTimerLock.setAmount(depositHtlMsg.getAmountList().stream().map(Token::of).collect(Collectors.toList())); depositHashTimerLock.setSwapID(Hex.toHexString(depositHtlMsg.getSwapId().toByteArray())); @@ -226,8 +851,8 @@ private Transaction convertHashTimerLockTransfer(byte[] value) throws InvalidPro HashTimerLockTransferMsg htlTransferMsg = HashTimerLockTransferMsg.parseFrom(array); HashTimerLockTransfer hashTimerLockTransfer = new HashTimerLockTransfer(); - hashTimerLockTransfer.setFrom(Crypto.encodeAddress(hrp,htlTransferMsg.getFrom().toByteArray())); - hashTimerLockTransfer.setTo(Crypto.encodeAddress(hrp,htlTransferMsg.getTo().toByteArray())); + hashTimerLockTransfer.setFrom(Crypto.encodeAddress(hrp, htlTransferMsg.getFrom().toByteArray())); + hashTimerLockTransfer.setTo(Crypto.encodeAddress(hrp, htlTransferMsg.getTo().toByteArray())); hashTimerLockTransfer.setRecipientOtherChain(htlTransferMsg.getRecipientOtherChain()); hashTimerLockTransfer.setSenderOtherChain(htlTransferMsg.getSenderOtherChain()); hashTimerLockTransfer.setRandomNumberHash(Hex.toHexString(htlTransferMsg.getRandomNumberHash().toByteArray())); @@ -248,7 +873,7 @@ private Transaction convertSetAccountFlag(byte[] value) throws InvalidProtocolBu System.arraycopy(value, 4, array, 0, array.length); com.binance.dex.api.proto.SetAccountFlag setAccountFlag = com.binance.dex.api.proto.SetAccountFlag.parseFrom(array); SetAccountFlag saf = new SetAccountFlag(); - saf.setFromAddr(Crypto.encodeAddress(hrp,setAccountFlag.getFrom().toByteArray())); + saf.setFromAddr(Crypto.encodeAddress(hrp, setAccountFlag.getFrom().toByteArray())); saf.setFlags(setAccountFlag.getFlags()); Transaction transaction = new Transaction(); transaction.setTxType(TxType.SetAccountFlag); @@ -261,7 +886,7 @@ private Transaction convertTimeRelock(byte[] value) throws InvalidProtocolBuffer System.arraycopy(value, 4, array, 0, array.length); TimeRelock timeRelock = TimeRelock.parseFrom(array); com.binance.dex.api.client.domain.broadcast.TimeRelock trl = new com.binance.dex.api.client.domain.broadcast.TimeRelock(); - trl.setFromAddr(Crypto.encodeAddress(hrp,timeRelock.getFrom().toByteArray())); + trl.setFromAddr(Crypto.encodeAddress(hrp, timeRelock.getFrom().toByteArray())); trl.setLockId(timeRelock.getTimeLockId()); trl.setLockTime(Date.from(Instant.ofEpochSecond(timeRelock.getLockTime()))); trl.setDescription(timeRelock.getDescription()); @@ -283,7 +908,7 @@ private Transaction convertTimeUnlock(byte[] value) throws InvalidProtocolBuffer System.arraycopy(value, 4, array, 0, array.length); TimeUnlock timeUnlock = TimeUnlock.parseFrom(array); com.binance.dex.api.client.domain.broadcast.TimeUnlock tul = new com.binance.dex.api.client.domain.broadcast.TimeUnlock(); - tul.setFromAddr(Crypto.encodeAddress(hrp,timeUnlock.getFrom().toByteArray())); + tul.setFromAddr(Crypto.encodeAddress(hrp, timeUnlock.getFrom().toByteArray())); tul.setLockId(timeUnlock.getTimeLockId()); Transaction transaction = new Transaction(); @@ -297,7 +922,7 @@ private Transaction convertTimeLock(byte[] value) throws InvalidProtocolBufferEx System.arraycopy(value, 4, array, 0, array.length); TimeLock timeLock = TimeLock.parseFrom(array); com.binance.dex.api.client.domain.broadcast.TimeLock tl = new com.binance.dex.api.client.domain.broadcast.TimeLock(); - tl.setFromAddr(Crypto.encodeAddress(hrp,timeLock.getFrom().toByteArray())); + tl.setFromAddr(Crypto.encodeAddress(hrp, timeLock.getFrom().toByteArray())); tl.setDescription(timeLock.getDescription()); tl.setLockTime(Date.from(Instant.ofEpochSecond(timeLock.getLockTime()))); List amount = timeLock.getAmountList().stream().map(token -> { @@ -427,6 +1052,24 @@ protected Transaction convertVote(byte[] value) throws InvalidProtocolBufferExce return transaction; } + protected Transaction convertSideVote(byte[] value) throws InvalidProtocolBufferException { + byte[] array = new byte[value.length - 4]; + System.arraycopy(value, 4, array, 0, array.length); + com.binance.dex.api.proto.SideVote voteMessage = com.binance.dex.api.proto.SideVote.parseFrom(array); + + SideVote vote = new SideVote(); + + vote.setVoter(Crypto.encodeAddress(hrp, voteMessage.getVoter().toByteArray())); + vote.setOption((int) voteMessage.getOption()); + vote.setProposalId(voteMessage.getProposalId()); + vote.setSideChainId(voteMessage.getSideChainId()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.SIDE_VOTE); + transaction.setRealTx(vote); + return transaction; + } + protected Transaction convertIssue(byte[] value) throws InvalidProtocolBufferException { byte[] array = new byte[value.length - 4]; System.arraycopy(value, 4, array, 0, array.length); @@ -500,6 +1143,30 @@ protected Transaction convertSubmitProposal(byte[] value) throws InvalidProtocol return transaction; } + protected Transaction convertSideSubmitProposal(byte[] value) throws InvalidProtocolBufferException { + byte[] array = new byte[value.length - 4]; + System.arraycopy(value, 4, array, 0, array.length); + com.binance.dex.api.proto.SideSubmitProposal proposalMessage = com.binance.dex.api.proto.SideSubmitProposal.parseFrom(array); + + SideSubmitProposal proposal = new SideSubmitProposal(); + proposal.setTitle(proposalMessage.getTitle()); + proposal.setDescription(proposalMessage.getDescription()); + proposal.setProposalType(ProposalType.fromValue(proposalMessage.getProposalType())); + proposal.setProposer(Crypto.encodeAddress(hrp, proposalMessage.getProposer().toByteArray())); + + if (null != proposalMessage.getInitialDepositList()) { + proposal.setInitDeposit(proposalMessage.getInitialDepositList().stream() + .map(com.binance.dex.api.client.encoding.message.Token::of).collect(Collectors.toList())); + } + proposal.setVotingPeriod(proposalMessage.getVotingPeriod()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.SIDE_SUBMIT_PROPOSAL); + transaction.setRealTx(proposal); + proposal.setSideChainId(proposalMessage.getSideChainId()); + return transaction; + } + private Transaction convertDeposit(byte[] value) throws InvalidProtocolBufferException { byte[] array = new byte[value.length - 4]; System.arraycopy(value, 4, array, 0, array.length); @@ -507,10 +1174,10 @@ private Transaction convertDeposit(byte[] value) throws InvalidProtocolBufferExc Deposit deposit = new Deposit(); deposit.setProposalId(depositMessage.getProposalId()); - deposit.setDepositer(Crypto.encodeAddress(hrp,depositMessage.getDepositer().toByteArray())); - if(null != depositMessage.getAmountList()){ + deposit.setDepositer(Crypto.encodeAddress(hrp, depositMessage.getDepositer().toByteArray())); + if (null != depositMessage.getAmountList()) { deposit.setAmount(depositMessage.getAmountList().stream() - .map(com.binance.dex.api.client.encoding.message.Token::of).collect(Collectors.toList())); + .map(com.binance.dex.api.client.encoding.message.Token::of).collect(Collectors.toList())); } Transaction transaction = new Transaction(); transaction.setTxType(TxType.DEPOSIT); @@ -518,6 +1185,25 @@ private Transaction convertDeposit(byte[] value) throws InvalidProtocolBufferExc return transaction; } + private Transaction convertSideDeposit(byte[] value) throws InvalidProtocolBufferException { + byte[] array = new byte[value.length - 4]; + System.arraycopy(value, 4, array, 0, array.length); + com.binance.dex.api.proto.SideDeposit depositMessage = com.binance.dex.api.proto.SideDeposit.parseFrom(array); + + SideDeposit deposit = new SideDeposit(); + deposit.setProposalId(depositMessage.getProposalId()); + deposit.setDepositer(Crypto.encodeAddress(hrp, depositMessage.getDepositer().toByteArray())); + if (null != depositMessage.getAmountList()) { + deposit.setAmount(depositMessage.getAmountList().stream() + .map(com.binance.dex.api.client.encoding.message.Token::of).collect(Collectors.toList())); + } + deposit.setSideChainId(depositMessage.getSideChainId()); + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.SIDE_DEPOSIT); + transaction.setRealTx(deposit); + return transaction; + } + private Transaction convertCreateValidator(byte[] value) throws InvalidProtocolBufferException { byte[] array = new byte[value.length - 4]; System.arraycopy(value, 4, array, 0, array.length); @@ -525,8 +1211,8 @@ private Transaction convertCreateValidator(byte[] value) throws InvalidProtocolB RealCreateValidator realCreateValidator = RealCreateValidator.parseFrom(array); CreateValidator createValidator = new CreateValidator(); - createValidator.setDelegatorAddress(Crypto.encodeAddress(hrp,realCreateValidator.getCreateValidator().getDelegatorAddress().toByteArray())); - createValidator.setValidatorAddress(Crypto.encodeAddress(hrp,realCreateValidator.getCreateValidator().getValidatorAddress().toByteArray())); + createValidator.setDelegatorAddress(Crypto.encodeAddress(hrp, realCreateValidator.getCreateValidator().getDelegatorAddress().toByteArray())); + createValidator.setValidatorAddress(Crypto.encodeAddress(hrp, realCreateValidator.getCreateValidator().getValidatorAddress().toByteArray())); createValidator.setDelegation(com.binance.dex.api.client.encoding.message.Token.of(realCreateValidator.getCreateValidator().getDelegation())); createValidator.setProposalId(realCreateValidator.getProposalId()); @@ -542,9 +1228,9 @@ private Transaction convertRemoveValidator(byte[] value) throws InvalidProtocolB com.binance.dex.api.proto.RemoveValidator removeValidatorMessage = com.binance.dex.api.proto.RemoveValidator.parseFrom(array); RemoveValidator removeValidator = new RemoveValidator(); - removeValidator.setLauncherAddr(Crypto.encodeAddress(hrp,removeValidatorMessage.getLauncherAddr().toByteArray())); - removeValidator.setValAddr(Crypto.encodeAddress(hrp,removeValidatorMessage.getValAddr().toByteArray())); - removeValidator.setValConsAddr(Crypto.encodeAddress(hrp,removeValidatorMessage.getValConsAddr().toByteArray())); + removeValidator.setLauncherAddr(Crypto.encodeAddress(hrp, removeValidatorMessage.getLauncherAddr().toByteArray())); + removeValidator.setValAddr(Crypto.encodeAddress(hrp, removeValidatorMessage.getValAddr().toByteArray())); + removeValidator.setValConsAddr(Crypto.encodeAddress(hrp, removeValidatorMessage.getValConsAddr().toByteArray())); removeValidator.setProposalId(removeValidatorMessage.getProposalId()); Transaction transaction = new Transaction(); @@ -564,7 +1250,7 @@ private Transaction convertListing(byte[] value) throws InvalidProtocolBufferExc listing.setBaseAssetSymbol(listMessage.getBaseAssetSymbol()); listing.setQuoteAssetSymbol(listMessage.getQuoteAssetSymbol()); listing.setInitPrice(listMessage.getInitPrice()); - listing.setFromAddr(Crypto.encodeAddress(hrp,listMessage.getFrom().toByteArray())); + listing.setFromAddr(Crypto.encodeAddress(hrp, listMessage.getFrom().toByteArray())); Transaction transaction = new Transaction(); transaction.setTxType(TxType.LISTING); @@ -573,4 +1259,222 @@ private Transaction convertListing(byte[] value) throws InvalidProtocolBufferExc } + private Transaction convertTinyTokenIssue(byte[] value) throws InvalidProtocolBufferException { + byte[] array = new byte[value.length - 4]; + System.arraycopy(value, 4, array, 0, array.length); + com.binance.dex.api.proto.TinyTokenIssue issueMessage = com.binance.dex.api.proto.TinyTokenIssue.parseFrom(array); + + TinyTokenIssue issue = new TinyTokenIssue(); + issue.setFrom(Crypto.encodeAddress(hrp, issueMessage.getFrom().toByteArray())); + issue.setName(issueMessage.getName()); + issue.setSymbol(issueMessage.getSymbol()); + issue.setTotalSupply(issueMessage.getTotalSupply()); + issue.setMintable(issueMessage.getMintable()); + issue.setTokenURI(issueMessage.getTokenUri()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.TINY_TOKEN_ISSUE); + transaction.setRealTx(issue); + return transaction; + } + + + private Transaction convertMiniTokenIssue(byte[] value) throws InvalidProtocolBufferException { + byte[] array = new byte[value.length - 4]; + System.arraycopy(value, 4, array, 0, array.length); + com.binance.dex.api.proto.MiniTokenIssue issueMessage = com.binance.dex.api.proto.MiniTokenIssue.parseFrom(array); + + MiniTokenIssue issue = new MiniTokenIssue(); + issue.setFrom(Crypto.encodeAddress(hrp, issueMessage.getFrom().toByteArray())); + issue.setName(issueMessage.getName()); + issue.setSymbol(issueMessage.getSymbol()); + issue.setTotalSupply(issueMessage.getTotalSupply()); + issue.setMintable(issueMessage.getMintable()); + issue.setTokenURI(issueMessage.getTokenUri()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.MINI_TOKEN_ISSUE); + transaction.setRealTx(issue); + return transaction; + } + + + private Transaction convertMiniTokenSetURI(byte[] value) throws InvalidProtocolBufferException { + byte[] array = new byte[value.length - 4]; + System.arraycopy(value, 4, array, 0, array.length); + com.binance.dex.api.proto.MiniTokenSetURI uriMessage = com.binance.dex.api.proto.MiniTokenSetURI.parseFrom(array); + + MiniTokenSetURI setURI = new MiniTokenSetURI(); + setURI.setFrom(Crypto.encodeAddress(hrp, uriMessage.getFrom().toByteArray())); + setURI.setSymbol(uriMessage.getSymbol()); + setURI.setTokenURI(uriMessage.getTokenUri()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.MINI_TOKEN_SET_URI); + transaction.setRealTx(setURI); + return transaction; + } + + private Transaction convertMiniTokenList(byte[] value) throws InvalidProtocolBufferException { + byte[] array = new byte[value.length - 4]; + System.arraycopy(value, 4, array, 0, array.length); + com.binance.dex.api.proto.MiniTokenList listMessage = com.binance.dex.api.proto.MiniTokenList.parseFrom(array); + + MiniTokenListing listing = new MiniTokenListing(); + listing.setFromAddr(Crypto.encodeAddress(hrp, listMessage.getFrom().toByteArray())); + listing.setBaseAssetSymbol(listMessage.getBaseAssetSymbol()); + listing.setQuoteAssetSymbol(listMessage.getQuoteAssetSymbol()); + listing.setInitPrice(listMessage.getInitPrice()); + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.MINI_TOKEN_LIST); + transaction.setRealTx(listing); + return transaction; + } + + private Transaction convertCreateSideChainValidatorWithVoteAddr(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + CreateSideChainValidatorWithVoteAddrMessage message = new CreateSideChainValidatorWithVoteAddrMessage(); + amino.decodeBare(raw, message); + + CreateSideChainValidatorWithVoteAddr createSideChainValidator = new CreateSideChainValidatorWithVoteAddr(); + + Description description = new Description(); + if (message.getDescription() != null) { + description.setMoniker(message.getDescription().getMoniker()); + description.setDetails(message.getDescription().getDetails()); + description.setIdentity(message.getDescription().getIdentity()); + description.setWebsite(message.getDescription().getWebsite()); + } + createSideChainValidator.setDescription(description); + + Commission commission = new Commission(); + if (message.getCommission() != null) { + try { + commission.setRate(message.getCommission().getRate().getValue()); + commission.setMaxRate(message.getCommission().getMaxRate().getValue()); + commission.setMaxChangeRate(message.getCommission().getMaxChangeRate().getValue()); + } catch (NullPointerException e) { + //ignore + } + } + createSideChainValidator.setCommission(commission); + + if (message.getDelegatorAddr() != null && message.getDelegatorAddr().getRaw() != null) { + createSideChainValidator.setDelegatorAddr(Crypto.encodeAddress(hrp, message.getDelegatorAddr().getRaw())); + } + + if (message.getValidatorOperatorAddr() != null && message.getValidatorOperatorAddr().getRaw() != null) { + createSideChainValidator.setValidatorAddr(Crypto.encodeAddress(valHrp, message.getValidatorOperatorAddr().getRaw())); + } + + Token delegation = new Token(); + if (message.getDelegation() != null) { + delegation.setAmount(message.getDelegation().getAmount()); + delegation.setDenom(message.getDelegation().getDenom()); + } + createSideChainValidator.setDelegation(delegation); + + createSideChainValidator.setSideChainId(message.getSideChainId()); + + if (message.getSideConsAddr() != null) { + createSideChainValidator.setSideConsAddr("0x" + Hex.toHexString(message.getSideConsAddr())); + } + + if (message.getSideFeeAddr() != null) { + createSideChainValidator.setSideFeeAddr("0x" + Hex.toHexString(message.getSideFeeAddr())); + } + + if (message.getSideVoteAddr() != null) { + createSideChainValidator.setSideVoteAddr("0x" + Hex.toHexString(message.getSideVoteAddr())); + } + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.CREATE_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR); + transaction.setRealTx(createSideChainValidator); + return transaction; + } + + private Transaction convertEditSideChainValidatorWithVoteAddr(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + EditSideChainValidatorWithVoteAddrMessage message = new EditSideChainValidatorWithVoteAddrMessage(); + amino.decodeBare(raw, message); + + EditSideChainValidatorWithVoteAddr editSideChainValidator = new EditSideChainValidatorWithVoteAddr(); + + Description description = new Description(); + if (message.getDescription() != null) { + description.setMoniker(message.getDescription().getMoniker()); + description.setDetails(message.getDescription().getDetails()); + description.setIdentity(message.getDescription().getIdentity()); + description.setWebsite(message.getDescription().getWebsite()); + } + editSideChainValidator.setDescription(description); + + if (message.getValidatorOperatorAddress() != null && message.getValidatorOperatorAddress().getRaw() != null) { + editSideChainValidator.setValidatorAddress(Crypto.encodeAddress(valHrp, message.getValidatorOperatorAddress().getRaw())); + } + + if (message.getCommissionRate() != null) { + editSideChainValidator.setCommissionRate(message.getCommissionRate().getValue()); + } + + editSideChainValidator.setSideChainId(message.getSideChainId()); + + if (message.getSideFeeAddr() != null) { + editSideChainValidator.setSideFeeAddr("0x" + Hex.toHexString(message.getSideFeeAddr())); + } + + if (message.getSideConsAddr() != null) { + editSideChainValidator.setSideConsAddr("0x" + Hex.toHexString(message.getSideConsAddr())); + } + + if (message.getSideVoteAddr() != null) { + editSideChainValidator.setSideVoteAddr("0x" + Hex.toHexString(message.getSideVoteAddr())); + } + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.EDIT_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR); + transaction.setRealTx(editSideChainValidator); + + return transaction; + } + + private Transaction convertSideChainStakeMigration(byte[] value) throws IOException { + byte[] raw = ByteUtil.cut(value, 4); + SideChainStakeMigrationMessage message = new SideChainStakeMigrationMessage(); + amino.decodeBare(raw, message); + + SideChainStakeMigration stakeMigration = new SideChainStakeMigration(); + + if (message.getValidatorSrcAddr() != null && message.getValidatorSrcAddr().getRaw() != null) { + stakeMigration.setValidatorSrcAddr(Crypto.encodeAddress(valHrp, message.getValidatorSrcAddr().getRaw())); + } + + if (message.getValidatorDstAddr() != null) { + stakeMigration.setValidatorDstAddr("0x" + Hex.toHexString(message.getValidatorDstAddr())); + } + + if (message.getDelegatorAddr() != null) { + stakeMigration.setDelegatorAddr("0x" + Hex.toHexString(message.getDelegatorAddr())); + } + + if (message.getRefundAddr() != null && message.getRefundAddr().getRaw() != null) { + stakeMigration.setRefundAddr(Crypto.encodeAddress(hrp, message.getRefundAddr().getRaw())); + } + + Token amount = new Token(); + if (message.getAmount() != null) { + amount.setAmount(message.getAmount().getAmount()); + amount.setDenom(message.getAmount().getDenom()); + } + stakeMigration.setAmount(amount); + + + Transaction transaction = new Transaction(); + transaction.setTxType(TxType.SIDECHAIN_STAKE_MIGRATION); + transaction.setRealTx(stakeMigration); + + return transaction; + } } diff --git a/src/main/java/com/binance/dex/api/client/crosschain/Content.java b/src/main/java/com/binance/dex/api/client/crosschain/Content.java new file mode 100644 index 00000000..ac62b29c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/Content.java @@ -0,0 +1,7 @@ +package com.binance.dex.api.client.crosschain; + +public abstract class Content { + + protected abstract void setHrp(String hrp); + +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/ContentEnum.java b/src/main/java/com/binance/dex/api/client/crosschain/ContentEnum.java new file mode 100644 index 00000000..5aa1951d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/ContentEnum.java @@ -0,0 +1,44 @@ +package com.binance.dex.api.client.crosschain; + +import com.binance.dex.api.client.crosschain.content.*; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +@AllArgsConstructor +public enum ContentEnum { + ApproveBindSynPack(1, 0, ApproveBindSyn.class), + BindSynPack(1, 2, BindSyn.class), + TransferOutRefundPack(2, 1, TransferOutRefund.class), + TransferOutSynPack(2, 2, TransferOutSyn.class), + TransferInSynPack(3, 0, TransferInSyn.class), + StakingCommonAckPack(8, 1, CommonAck.class), + IbcValidatorSetPack(8, 2, IbcValidatorSet.class), + GovCommonAckPack(9, 1, CommonAck.class), + SideDowntimeSlashPack(11, 0, SideDowntimeSlash.class), + MirrorSynPack(4, 0, MirrorSyn.class), + MirrorSynAckPack(4, 1, MirrorAck.class), + MirrorSyncSynPack(5, 0, MirrorSyncSyn.class), + MirrorSyncAckPack(5, 1, MirrorSyncAck.class), + CrossStakeSynPack(16, 0, CrossStakeSyn.class), + CrossStakeRefundPack(16, 1, CrossStakeRefund.class), + CrossStakeFailAckPack(16, 2, CrossStakeFailAck.class), + StakeMigrationSynPack(17, 0, StakeMigrationRefund.class), + StakeMigrationAckPack(17, 1, StakeMigrationRefund.class), + StakeMigrationFailAckPack(17, 2, StakeMigrationRefund.class), + ; + + private Integer channelId; + private Integer packType; + private Class clazz; + + public static Class getClass(Integer channelId, Integer packType) { + Optional optional = Arrays.stream(ContentEnum.values()) + .filter(contentEnum -> channelId.equals(contentEnum.channelId) && packType.equals(contentEnum.packType)) + .findAny(); + return optional.>map(ContentEnum::getClazz).orElse(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/Package.java b/src/main/java/com/binance/dex/api/client/crosschain/Package.java new file mode 100644 index 00000000..99821462 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/Package.java @@ -0,0 +1,16 @@ +package com.binance.dex.api.client.crosschain; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Package { + private UnsignedInt channelId; + private UnsignedLong sequence; + private Payload payload; + + public void setHrp(String hrp) { + payload.getContent().setHrp(hrp); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/Payload.java b/src/main/java/com/binance/dex/api/client/crosschain/Payload.java new file mode 100644 index 00000000..7e81ab85 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/Payload.java @@ -0,0 +1,50 @@ +package com.binance.dex.api.client.crosschain; + +import com.binance.dex.api.client.encoding.ByteUtil; +import com.binance.dex.api.client.rlp.Decoder; +import com.binance.dex.api.client.rlp.RlpDecodable; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigInteger; + +@Getter +@Setter +public class Payload implements RlpDecodable { + + private Integer packageType; + private BigInteger crossChainFee; + private Content content; + + public Payload(){} + + @Override + public void decode(byte[] raw, Object superInstance) throws Exception { + if (raw.length < 33) { + throw new RuntimeException("Failed to code: too less length for payload"); + } + this.setPackageType((int) ByteUtil.pick(raw, 0, 1)[0]); + this.setCrossChainFee(new BigInteger(ByteUtil.pick(raw, 1, 32))); + + Integer channelId; + if (superInstance instanceof Package) { + Package pack = (Package) superInstance; + channelId = pack.getChannelId().getValue(); + } else { + throw new RuntimeException("Failed to code: superInstance's class should be Package"); + } + + Class clazz = ContentEnum.getClass(channelId, this.getPackageType()); + Content instance; + if (clazz == null) { + throw new RuntimeException(String.format("unknown content of channel id = %s, package type = %s", channelId, this.getPackageType())); + } + if (channelId == 16) { + instance = clazz.newInstance(); + instance = (Content) Decoder.decodeBytes(ByteUtil.cut(raw, 33), clazz, instance); + } else { + instance = Decoder.decodeObject(ByteUtil.cut(raw, 33), clazz); + } + this.setContent(instance); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/TokenSymbol.java b/src/main/java/com/binance/dex/api/client/crosschain/TokenSymbol.java new file mode 100644 index 00000000..ffbe2c33 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/TokenSymbol.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.crosschain; + +import com.binance.dex.api.client.encoding.ByteUtil; +import com.binance.dex.api.client.encoding.serializer.TokenSymbolSerializer; +import com.binance.dex.api.client.rlp.RlpDecodable; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonSerialize(using = TokenSymbolSerializer.class) +public class TokenSymbol implements RlpDecodable { + + private byte[] raw; + private String symbol; + + @Override + public void decode(byte[] raw, Object superInstance) { + this.setRaw(raw); + this.setSymbol(new String(ByteUtil.trim(raw,(byte)0))); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/UnsignedInt.java b/src/main/java/com/binance/dex/api/client/crosschain/UnsignedInt.java new file mode 100644 index 00000000..3aec1e9b --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/UnsignedInt.java @@ -0,0 +1,13 @@ +package com.binance.dex.api.client.crosschain; + +public class UnsignedInt extends UnsignedNumber { + + public UnsignedInt(){ + super(); + } + + public int getValue(){ + return super.getNumber().intValue(); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/UnsignedLong.java b/src/main/java/com/binance/dex/api/client/crosschain/UnsignedLong.java new file mode 100644 index 00000000..20906b98 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/UnsignedLong.java @@ -0,0 +1,13 @@ +package com.binance.dex.api.client.crosschain; + +public class UnsignedLong extends UnsignedNumber { + + public UnsignedLong(){ + super(); + } + + public long getValue(){ + return super.getNumber().longValue(); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/UnsignedNumber.java b/src/main/java/com/binance/dex/api/client/crosschain/UnsignedNumber.java new file mode 100644 index 00000000..43d16c6e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/UnsignedNumber.java @@ -0,0 +1,34 @@ +package com.binance.dex.api.client.crosschain; + +import com.binance.dex.api.client.encoding.serializer.UnsignedNumberSerializer; +import com.binance.dex.api.client.rlp.RlpDecodable; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.math.BigInteger; + +@JsonSerialize(using = UnsignedNumberSerializer.class) +public class UnsignedNumber implements RlpDecodable { + + private BigInteger value; + + public UnsignedNumber() { + this.value = BigInteger.ZERO; + } + + public UnsignedNumber(BigInteger value) { + this.value = value; + } + + @Override + public void decode(byte[] raw, Object superInstance) { + this.value = new BigInteger(1, raw); + } + + public BigInteger getNumber() { + return value; + } + + public void setValue(BigInteger value) { + this.value = value; + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/ValidatorSet.java b/src/main/java/com/binance/dex/api/client/crosschain/ValidatorSet.java new file mode 100644 index 00000000..69640008 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/ValidatorSet.java @@ -0,0 +1,30 @@ +package com.binance.dex.api.client.crosschain; + +import com.binance.dex.api.client.encoding.serializer.BytesToPrefixedHexStringSerializer; +import com.binance.dex.api.client.rlp.Decoder; +import com.binance.dex.api.client.rlp.RlpDecodable; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ValidatorSet implements RlpDecodable { + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] sideConsAddr; + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] feeAddr; + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] distAddr; + private Long power; + + @Override + public void decode(byte[] raw, Object superInstance) throws Exception { + ValidatorSet vs = Decoder.decodeObject(raw, ValidatorSet.class); + this.sideConsAddr = vs.sideConsAddr; + this.feeAddr = vs.feeAddr; + this.distAddr = vs.distAddr; + this.power = vs.power; + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/ApproveBindSyn.java b/src/main/java/com/binance/dex/api/client/crosschain/content/ApproveBindSyn.java new file mode 100644 index 00000000..740e7596 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/ApproveBindSyn.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.TokenSymbol; +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedInt; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class ApproveBindSyn extends Content { + + private UnsignedInt status; + + private TokenSymbol symbol; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/BindSyn.java b/src/main/java/com/binance/dex/api/client/crosschain/content/BindSyn.java new file mode 100644 index 00000000..0241b993 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/BindSyn.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.*; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class BindSyn extends Content { + + private UnsignedInt packageType; + private TokenSymbol symbol; + private EthAddressValue contractAddr; + private UnsignedNumber totalSupply; + private UnsignedNumber peggyAmount; + private UnsignedInt decimals; + private UnsignedLong expireTime; + + @Override + protected void setHrp(String hrp) { + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/CSCParamChange.java b/src/main/java/com/binance/dex/api/client/crosschain/content/CSCParamChange.java new file mode 100644 index 00000000..f95cf1aa --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/CSCParamChange.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.encoding.serializer.BytesToPrefixedHexStringSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CSCParamChange extends Content { + + private String key; + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] value; + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] target; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/CommonAck.java b/src/main/java/com/binance/dex/api/client/crosschain/content/CommonAck.java new file mode 100644 index 00000000..584a77a1 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/CommonAck.java @@ -0,0 +1,18 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedInt; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CommonAck extends Content { + + private UnsignedInt code; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeFailAck.java b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeFailAck.java new file mode 100644 index 00000000..78e85381 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeFailAck.java @@ -0,0 +1,45 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.content.crossStakeFailAckParamsBytes.*; +import com.binance.dex.api.client.crosschain.content.crossStakeSynParamsBytes.DelegateSynParamsBytes; +import com.binance.dex.api.client.crosschain.content.crossStakeSynParamsBytes.RedelegateSynParamsBytes; +import com.binance.dex.api.client.rlp.RlpDecodable; +import com.binance.dex.api.client.rlp.Decoder; +import com.binance.dex.api.client.encoding.ByteUtil; + +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class CrossStakeFailAck extends Content implements RlpDecodable { + + private CrossStakeFailAckParamsBytes paramsBytes; + + @Override + protected void setHrp(String hrp) { + this.paramsBytes.setHrp(hrp); + } + + @Override + public void decode(byte[] raw, Object superInstance) throws Exception { + if (raw.length < 16) { + throw new RuntimeException("Failed to code: too less length for cross stake syn package"); + } + + Class clazz; + CrossStakeFailAckParamsBytes instance; + if ((int) ByteUtil.pick(raw, 1, 1)[0] == 4) { + clazz = RewardFailAckParamsBytes.class; + instance = Decoder.decodeObject(raw, clazz); + } else if ((int) ByteUtil.pick(raw, 1, 1)[0] == 5) { + clazz = UndelegatedFailAckParamsBytes.class; + instance = Decoder.decodeObject(raw, clazz); + } else { + throw new RuntimeException("unknown event type of cross stake fail syn package"); + } + this.setParamsBytes(instance); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeFailAckParamsBytes.java b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeFailAckParamsBytes.java new file mode 100644 index 00000000..96ff4f1c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeFailAckParamsBytes.java @@ -0,0 +1,7 @@ +package com.binance.dex.api.client.crosschain.content; + +public abstract class CrossStakeFailAckParamsBytes { + + protected abstract void setHrp(String hrp); + +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeRefund.java b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeRefund.java new file mode 100644 index 00000000..5e683d4a --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeRefund.java @@ -0,0 +1,24 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedInt; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CrossStakeRefund extends Content { + + private UnsignedInt eventType; + private UnsignedNumber amount; + private EthAddressValue recipient; + private UnsignedInt errorCode; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeSyn.java b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeSyn.java new file mode 100644 index 00000000..054c4778 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeSyn.java @@ -0,0 +1,53 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.content.crossStakeSynParamsBytes.*; +import com.binance.dex.api.client.encoding.ByteUtil; +import com.binance.dex.api.client.rlp.Decoder; +import com.binance.dex.api.client.rlp.RlpDecodable; + +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class CrossStakeSyn extends Content implements RlpDecodable { + + private Integer eventType; + private CrossStakeSynParamsBytes paramsBytes; + + public CrossStakeSyn(){} + + @Override + protected void setHrp(String hrp) { + this.paramsBytes.setHrp(hrp); + } + + @Override + public void decode(byte[] raw, Object superInstance) throws Exception { + if (raw.length < 27) { + throw new RuntimeException("Failed to code: too less length for cross stake syn package"); + } + + Class clazz; + CrossStakeSynParamsBytes instance; + if ((int) ByteUtil.pick(raw, 1, 1)[0] == 1) { + this.setEventType((int) ByteUtil.pick(raw, 1, 1)[0]); + clazz = DelegateSynParamsBytes.class; + instance = Decoder.decodeObject(ByteUtil.cut(raw, 3), clazz); + } else if ((int) ByteUtil.pick(raw, 1, 1)[0] == 2) { + this.setEventType((int) ByteUtil.pick(raw, 1, 1)[0]); + clazz = UndelegateSynParamsBytes.class; + instance = Decoder.decodeObject(ByteUtil.cut(raw, 3), clazz); + } else if ((int) ByteUtil.pick(raw, 2, 1)[0] == 3) { + this.setEventType((int) ByteUtil.pick(raw, 2, 1)[0]); + clazz = RedelegateSynParamsBytes.class; + instance = Decoder.decodeObject(ByteUtil.cut(raw, 5), clazz); + } else { + throw new RuntimeException(String.format("unknown event type of cross stake syn package, package type = %s", + this.getEventType())); + } + this.setParamsBytes(instance); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeSynParamsBytes.java b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeSynParamsBytes.java new file mode 100644 index 00000000..1c1594dc --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/CrossStakeSynParamsBytes.java @@ -0,0 +1,6 @@ +package com.binance.dex.api.client.crosschain.content; + +public abstract class CrossStakeSynParamsBytes { + + protected abstract void setHrp(String hrp); +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/IbcValidatorSet.java b/src/main/java/com/binance/dex/api/client/crosschain/content/IbcValidatorSet.java new file mode 100644 index 00000000..e6804308 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/IbcValidatorSet.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedInt; +import com.binance.dex.api.client.crosschain.ValidatorSet; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class IbcValidatorSet extends Content { + + private UnsignedInt type; + private List ibcValidator; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorAck.java b/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorAck.java new file mode 100644 index 00000000..e1383ab2 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorAck.java @@ -0,0 +1,26 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.TokenSymbol; +import com.binance.dex.api.client.crosschain.UnsignedInt; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MirrorAck extends Content { + + private EthAddressValue mirrorSender; + private EthAddressValue contractAddr; + private UnsignedInt decimals; + private TokenSymbol symbol; + private UnsignedNumber mirrorFee; + private UnsignedInt errorCode; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyn.java b/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyn.java new file mode 100644 index 00000000..6652885a --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyn.java @@ -0,0 +1,25 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.*; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MirrorSyn extends Content { + + private EthAddressValue mirrorSender; + private EthAddressValue contractAddr; + private TokenSymbol name; + private TokenSymbol symbol; + private UnsignedNumber totalSupply; + private UnsignedInt decimals; + private UnsignedNumber mirrorFee; + private UnsignedLong expireTime; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyncAck.java b/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyncAck.java new file mode 100644 index 00000000..77f6fbcb --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyncAck.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedInt; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MirrorSyncAck extends Content { + + private EthAddressValue syncSender; + private EthAddressValue contractAddr; + private UnsignedNumber syncFee; + private UnsignedInt errorCode; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyncSyn.java b/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyncSyn.java new file mode 100644 index 00000000..5f52077c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/MirrorSyncSyn.java @@ -0,0 +1,26 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.TokenSymbol; +import com.binance.dex.api.client.crosschain.UnsignedLong; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MirrorSyncSyn extends Content { + + private EthAddressValue syncSender; + private EthAddressValue contractAddr; + private TokenSymbol symbol; + private UnsignedNumber totalSupply; + private UnsignedNumber syncFee; + private UnsignedLong expireTime; + + @Override + protected void setHrp(String hrp) { + + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/SideDowntimeSlash.java b/src/main/java/com/binance/dex/api/client/crosschain/content/SideDowntimeSlash.java new file mode 100644 index 00000000..5bee5a33 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/SideDowntimeSlash.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedInt; +import com.binance.dex.api.client.crosschain.UnsignedLong; +import com.binance.dex.api.client.encoding.serializer.BytesToPrefixedHexStringSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SideDowntimeSlash extends Content { + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] sideConsAddr; + private UnsignedLong sideHeight; + private UnsignedInt sideChainId; + private UnsignedLong sideTimestamp; + + @Override + protected void setHrp(String hrp) {} +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/StakeMigrationRefund.java b/src/main/java/com/binance/dex/api/client/crosschain/content/StakeMigrationRefund.java new file mode 100644 index 00000000..6bb2a912 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/StakeMigrationRefund.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.*; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class StakeMigrationRefund extends Content { + + private EthAddressValue operatorAddress; + private EthAddressValue delegatorAddress; + private Bech32AddressValue refundAddress; + private UnsignedNumber amount; + + @Override + protected void setHrp(String hrp) { + this.refundAddress.setHrp(hrp); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/TransferInSyn.java b/src/main/java/com/binance/dex/api/client/crosschain/content/TransferInSyn.java new file mode 100644 index 00000000..8ca4a0ba --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/TransferInSyn.java @@ -0,0 +1,31 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.TokenSymbol; +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedLong; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class TransferInSyn extends Content { + + private TokenSymbol symbol; + private EthAddressValue contractAddress; + private List amounts; + private List receiverAddresses; + private List refundAddresses; + private UnsignedLong expireTime; + + @Override + protected void setHrp(String hrp) { + if (receiverAddresses != null) { + receiverAddresses.forEach(addr -> addr.setHrp(hrp)); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/TransferOutRefund.java b/src/main/java/com/binance/dex/api/client/crosschain/content/TransferOutRefund.java new file mode 100644 index 00000000..e88ed922 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/TransferOutRefund.java @@ -0,0 +1,26 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.TokenSymbol; +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedInt; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class TransferOutRefund extends Content { + + private TokenSymbol symbol; + private UnsignedNumber refundAmount; + private Bech32AddressValue refundAddr; + private UnsignedInt refundReason; + + + @Override + protected void setHrp(String hrp) { + this.refundAddr.setHrp(hrp); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/TransferOutSyn.java b/src/main/java/com/binance/dex/api/client/crosschain/content/TransferOutSyn.java new file mode 100644 index 00000000..7cc19deb --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/TransferOutSyn.java @@ -0,0 +1,27 @@ +package com.binance.dex.api.client.crosschain.content; + +import com.binance.dex.api.client.crosschain.TokenSymbol; +import com.binance.dex.api.client.crosschain.Content; +import com.binance.dex.api.client.crosschain.UnsignedLong; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class TransferOutSyn extends Content { + + private TokenSymbol symbol; + private Bech32AddressValue contractAddress; + private UnsignedNumber amount; + private Bech32AddressValue recipient; + private Bech32AddressValue refundAddress; + private UnsignedLong expireTime; + + @Override + protected void setHrp(String hrp) { + this.refundAddress.setHrp(hrp); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeFailAckParamsBytes/RewardFailAckParamsBytes.java b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeFailAckParamsBytes/RewardFailAckParamsBytes.java new file mode 100644 index 00000000..ffd821f6 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeFailAckParamsBytes/RewardFailAckParamsBytes.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.crosschain.content.crossStakeFailAckParamsBytes; + +import com.binance.dex.api.client.crosschain.content.CrossStakeFailAckParamsBytes; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class RewardFailAckParamsBytes extends CrossStakeFailAckParamsBytes { + + private Integer eventType; + private UnsignedNumber amount; + private EthAddressValue recipient; + + @Override + protected void setHrp(String hrp) { + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeFailAckParamsBytes/UndelegatedFailAckParamsBytes.java b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeFailAckParamsBytes/UndelegatedFailAckParamsBytes.java new file mode 100644 index 00000000..8657a64e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeFailAckParamsBytes/UndelegatedFailAckParamsBytes.java @@ -0,0 +1,24 @@ +package com.binance.dex.api.client.crosschain.content.crossStakeFailAckParamsBytes; + +import com.binance.dex.api.client.crosschain.content.CrossStakeFailAckParamsBytes; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class UndelegatedFailAckParamsBytes extends CrossStakeFailAckParamsBytes { + + private Integer eventType; + private UnsignedNumber amount; + private EthAddressValue recipient; + private Bech32AddressValue validator; + + @Override + protected void setHrp(String hrp) { + this.validator.setHrp(hrp); + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/DelegateSynParamsBytes.java b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/DelegateSynParamsBytes.java new file mode 100644 index 00000000..6d3955ca --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/DelegateSynParamsBytes.java @@ -0,0 +1,33 @@ +package com.binance.dex.api.client.crosschain.content.crossStakeSynParamsBytes; + +import com.binance.dex.api.client.crosschain.content.CrossStakeSynParamsBytes; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.rlp.Decoder; +import com.binance.dex.api.client.rlp.RlpDecodable; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class DelegateSynParamsBytes extends CrossStakeSynParamsBytes implements RlpDecodable { + + private EthAddressValue delAddr; + private Bech32AddressValue validator; + private UnsignedNumber amount; + + @Override + protected void setHrp(String hrp) { + this.validator.setHrp(hrp); + } + + @Override + public void decode(byte[] raw, Object superInstance) throws Exception { + DelegateSynParamsBytes vs = Decoder.decodeObject(raw, DelegateSynParamsBytes.class); + this.delAddr = vs.delAddr; + this.validator = vs.validator; + this.amount = vs.amount; + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/RedelegateSynParamsBytes.java b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/RedelegateSynParamsBytes.java new file mode 100644 index 00000000..d7ebb9b6 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/RedelegateSynParamsBytes.java @@ -0,0 +1,36 @@ +package com.binance.dex.api.client.crosschain.content.crossStakeSynParamsBytes; + +import com.binance.dex.api.client.crosschain.content.CrossStakeSynParamsBytes; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.rlp.Decoder; +import com.binance.dex.api.client.rlp.RlpDecodable; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class RedelegateSynParamsBytes extends CrossStakeSynParamsBytes implements RlpDecodable { + + private EthAddressValue delAddr; + private Bech32AddressValue valSrc; + private Bech32AddressValue valDst; + private UnsignedNumber amount; + + @Override + protected void setHrp(String hrp) { + this.valSrc.setHrp(hrp); + this.valDst.setHrp(hrp); + } + + @Override + public void decode(byte[] raw, Object superInstance) throws Exception { + RedelegateSynParamsBytes vs = Decoder.decodeObject(raw, RedelegateSynParamsBytes.class); + this.delAddr = vs.delAddr; + this.valSrc = vs.valSrc; + this.valDst = vs.valDst; + this.amount = vs.amount; + } +} diff --git a/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/UndelegateSynParamsBytes.java b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/UndelegateSynParamsBytes.java new file mode 100644 index 00000000..bfb84021 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/crosschain/content/crossStakeSynParamsBytes/UndelegateSynParamsBytes.java @@ -0,0 +1,33 @@ +package com.binance.dex.api.client.crosschain.content.crossStakeSynParamsBytes; + +import com.binance.dex.api.client.crosschain.content.CrossStakeSynParamsBytes; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.rlp.Decoder; +import com.binance.dex.api.client.rlp.RlpDecodable; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class UndelegateSynParamsBytes extends CrossStakeSynParamsBytes implements RlpDecodable { + + private EthAddressValue delAddr; + private Bech32AddressValue validator; + private UnsignedNumber amount; + + @Override + protected void setHrp(String hrp) { + this.validator.setHrp(hrp); + } + + @Override + public void decode(byte[] raw, Object superInstance) throws Exception { + UndelegateSynParamsBytes vs = Decoder.decodeObject(raw, UndelegateSynParamsBytes.class); + this.delAddr = vs.delAddr; + this.validator = vs.validator; + this.amount = vs.amount; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/MiniToken.java b/src/main/java/com/binance/dex/api/client/domain/MiniToken.java new file mode 100644 index 00000000..f9993c14 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/MiniToken.java @@ -0,0 +1,109 @@ +package com.binance.dex.api.client.domain; + +import com.binance.dex.api.client.BinanceDexConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class MiniToken { + private String name; + private String symbol; + @JsonProperty("original_symbol") + private String originalSymbol; + @JsonProperty("total_supply") + private Long totalSupply; + @JsonProperty("token_type") + private Integer tokenType; + @JsonProperty("token_uri") + private String tokenURI; + private String owner; + private boolean mintable; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getOriginalSymbol() { + return originalSymbol; + } + + public void setOriginalSymbol(String originalSymbol) { + this.originalSymbol = originalSymbol; + } + + public Long getTotalSupply() { + return totalSupply; + } + + public void setTotalSupply(Long totalSupply) { + this.totalSupply = totalSupply; + } + + public Integer getTokenType() { + return tokenType; + } + + public void setTokenType(Integer tokenType) { + this.tokenType = tokenType; + } + + public String getTokenURI() { + return tokenURI; + } + + public void setTokenURI(String tokenURI) { + this.tokenURI = tokenURI; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public boolean isMintable() { + return mintable; + } + + public void setMintable(boolean mintable) { + this.mintable = mintable; + } + + public void setTotalSupply(String totalSupply){ + if (totalSupply != null) { + if (totalSupply.indexOf('.') > 0) { + totalSupply = totalSupply.substring(0, totalSupply.indexOf('.')); + this.totalSupply = Long.parseLong(totalSupply) * 100000000L; + } + } + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceDexConstants.BINANCE_DEX_TO_STRING_STYLE) + .append("name", name) + .append("symbol", symbol) + .append("originalSymbol", originalSymbol) + .append("totalSupply", totalSupply) + .append("tokenType", tokenType) + .append("tokenURI", tokenURI) + .append("owner", owner) + .append("mintable", mintable) + .toString(); + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/OrderBook.java b/src/main/java/com/binance/dex/api/client/domain/OrderBook.java index ba9f9afd..8ad403d6 100644 --- a/src/main/java/com/binance/dex/api/client/domain/OrderBook.java +++ b/src/main/java/com/binance/dex/api/client/domain/OrderBook.java @@ -2,15 +2,20 @@ import com.binance.dex.api.client.BinanceDexConstants; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) public class OrderBook { private List asks; private List bids; private long height; + @JsonProperty("pending_match") + private Boolean pendingMatch; public List getAsks() { return asks; @@ -36,12 +41,22 @@ public void setHeight(long height) { this.height = height; } + public boolean isPendingMatch() { + return pendingMatch; + } + + public void setPendingMatch(boolean pendingMatch) { + this.pendingMatch = pendingMatch; + } + @Override public String toString() { return new ToStringBuilder(this, BinanceDexConstants.BINANCE_DEX_TO_STRING_STYLE) .append("asks", asks) .append("bids", bids) .append("height", height) + .append("pendingMatch", pendingMatch) .toString(); } + } diff --git a/src/main/java/com/binance/dex/api/client/domain/ProposalType.java b/src/main/java/com/binance/dex/api/client/domain/ProposalType.java index 889179f1..57b06e94 100644 --- a/src/main/java/com/binance/dex/api/client/domain/ProposalType.java +++ b/src/main/java/com/binance/dex/api/client/domain/ProposalType.java @@ -14,7 +14,9 @@ public enum ProposalType { FeeChange(5L), CreateValidator(6L), RemoveValidator(7L), - DelistTradingPair(8L); + DelistTradingPair(8L), + SideChainParamsChange(129L), + CrossSideChainParamsChange(130L); private long value; diff --git a/src/main/java/com/binance/dex/api/client/domain/Token.java b/src/main/java/com/binance/dex/api/client/domain/Token.java index 30c5060d..970eccda 100644 --- a/src/main/java/com/binance/dex/api/client/domain/Token.java +++ b/src/main/java/com/binance/dex/api/client/domain/Token.java @@ -75,4 +75,13 @@ public void setTotalSupply(Long totalSupply) { public Long getTotalSupply() { return totalSupply; } + + public void setTotalSupply(String totalSupply){ + if (totalSupply != null) { + if (totalSupply.indexOf('.') > 0) { + totalSupply = totalSupply.substring(0, totalSupply.indexOf('.')); + this.totalSupply = Long.parseLong(totalSupply) * 100000000L; + } + } + } } diff --git a/src/main/java/com/binance/dex/api/client/domain/TransactionPageV2.java b/src/main/java/com/binance/dex/api/client/domain/TransactionPageV2.java new file mode 100644 index 00000000..07640d1f --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/TransactionPageV2.java @@ -0,0 +1,37 @@ +package com.binance.dex.api.client.domain; + +import com.binance.dex.api.client.BinanceDexConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class TransactionPageV2 { + private Long total; + private List txs; + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public List getTxs() { + return txs; + } + + public void setTxs(List txs) { + this.txs = txs; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceDexConstants.BINANCE_DEX_TO_STRING_STYLE) + .append("total", total) + .append("txs", txs) + .toString(); + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/TransactionV2.java b/src/main/java/com/binance/dex/api/client/domain/TransactionV2.java new file mode 100644 index 00000000..f47c764b --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/TransactionV2.java @@ -0,0 +1,166 @@ +package com.binance.dex.api.client.domain; + +import com.binance.dex.api.client.BinanceDexConstants; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class TransactionV2 { + private String hash; + private long blockHeight; + private long blockTime; + private String type; + private Long fee; + private int code; + private long source; + private long sequence; + private String memo; + private String log; + private String data; + + private String asset; + private Long amount; + + private String fromAddr; + private String toAddr; + + public String getHash() { + return hash; + } + + public void setHash(String hash) { + this.hash = hash; + } + + public long getBlockHeight() { + return blockHeight; + } + + public void setBlockHeight(long blockHeight) { + this.blockHeight = blockHeight; + } + + public long getBlockTime() { + return blockTime; + } + + public void setBlockTime(long blockTime) { + this.blockTime = blockTime; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public long getSource() { + return source; + } + + public void setSource(long source) { + this.source = source; + } + + public long getSequence() { + return sequence; + } + + public void setSequence(long sequence) { + this.sequence = sequence; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getLog() { + return log; + } + + public void setLog(String log) { + this.log = log; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getAsset() { + return asset; + } + + public void setAsset(String asset) { + this.asset = asset; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getFromAddr() { + return fromAddr; + } + + public void setFromAddr(String fromAddr) { + this.fromAddr = fromAddr; + } + + public String getToAddr() { + return toAddr; + } + + public void setToAddr(String toAddr) { + this.toAddr = toAddr; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceDexConstants.BINANCE_DEX_TO_STRING_STYLE) + .append("blockHeight", blockHeight) + .append("code", code) + .append("data", data) + .append("fromAddr", fromAddr) + .append("blockTime", blockTime) + .append("toAddr", toAddr) + .append("asset", asset) + .append("fee", fee) + .append("hash", hash) + .append("type", type) + .append("amount", amount) + .append("memo", memo) + .append("sequence", sequence) + .append("log", log) + .toString(); + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/TransferTokenOwnership.java b/src/main/java/com/binance/dex/api/client/domain/TransferTokenOwnership.java new file mode 100644 index 00000000..910c9242 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/TransferTokenOwnership.java @@ -0,0 +1,32 @@ +package com.binance.dex.api.client.domain; + + +public class TransferTokenOwnership { + private String from; + private String symbol; + private String newOwner; + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getNewOwner() { + return newOwner; + } + + public void setNewOwner(String newOwner) { + this.newOwner = newOwner; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/bridge/Bind.java b/src/main/java/com/binance/dex/api/client/domain/bridge/Bind.java new file mode 100644 index 00000000..ee84a8ed --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/bridge/Bind.java @@ -0,0 +1,82 @@ +package com.binance.dex.api.client.domain.bridge; + +/** + * @author Fitz.Lu + **/ +public class Bind { + + private String from; + + private String symbol; + + private long amount; + + private String contractAddress; + + private int contractDecimal; + + private long expireTime; + + public Bind() { + } + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public long getAmount() { + return amount; + } + + public void setAmount(long amount) { + this.amount = amount; + } + + public String getContractAddress() { + return contractAddress; + } + + public void setContractAddress(String contractAddress) { + this.contractAddress = contractAddress; + } + + public int getContractDecimal() { + return contractDecimal; + } + + public void setContractDecimal(int contractDecimal) { + this.contractDecimal = contractDecimal; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } + + @Override + public String toString() { + return "Bind{" + + "from='" + from + '\'' + + ", symbol='" + symbol + '\'' + + ", amount=" + amount + + ", contractAddress='" + contractAddress + '\'' + + ", contractDecimal=" + contractDecimal + + ", expireTime=" + expireTime + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/bridge/TransferIn.java b/src/main/java/com/binance/dex/api/client/domain/bridge/TransferIn.java new file mode 100644 index 00000000..40dd2fe5 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/bridge/TransferIn.java @@ -0,0 +1,81 @@ +package com.binance.dex.api.client.domain.bridge; + +import com.binance.dex.api.client.encoding.message.Token; + +import java.util.List; + +/** + * @author Fitz.Lu + **/ +public class TransferIn { + + private String contractAddress; + + private List refundAddresses; + + private List receiverAddresses; + + private List amounts; + + private String symbol; + + private Token relayFee; + + private long expireTime; + + public String getContractAddress() { + return contractAddress; + } + + public void setContractAddress(String contractAddress) { + this.contractAddress = contractAddress; + } + + public List getRefundAddresses() { + return refundAddresses; + } + + public void setRefundAddresses(List refundAddresses) { + this.refundAddresses = refundAddresses; + } + + public List getReceiverAddresses() { + return receiverAddresses; + } + + public void setReceiverAddresses(List receiverAddresses) { + this.receiverAddresses = receiverAddresses; + } + + public List getAmounts() { + return amounts; + } + + public void setAmounts(List amounts) { + this.amounts = amounts; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public Token getRelayFee() { + return relayFee; + } + + public void setRelayFee(Token relayFee) { + this.relayFee = relayFee; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/bridge/TransferOut.java b/src/main/java/com/binance/dex/api/client/domain/bridge/TransferOut.java new file mode 100644 index 00000000..589d42d3 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/bridge/TransferOut.java @@ -0,0 +1,62 @@ +package com.binance.dex.api.client.domain.bridge; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Fitz.Lu + **/ +public class TransferOut { + + private String from; + + private String toAddress; + + private Token amount; + + private long expireTime; + + public TransferOut() { + } + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getToAddress() { + return toAddress; + } + + public void setToAddress(String toAddress) { + this.toAddress = toAddress; + } + + public Token getAmount() { + return amount; + } + + public void setAmount(Token amount) { + this.amount = amount; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } + + @Override + public String toString() { + return "TransferOut{" + + "from='" + from + '\'' + + ", toAddress='" + toAddress + '\'' + + ", amount=" + amount + + ", expireTime=" + expireTime + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/bridge/Unbind.java b/src/main/java/com/binance/dex/api/client/domain/bridge/Unbind.java new file mode 100644 index 00000000..f2cff44f --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/bridge/Unbind.java @@ -0,0 +1,32 @@ +package com.binance.dex.api.client.domain.bridge; + +public class Unbind { + + private String from; + + private String symbol; + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + @Override + public String toString() { + return "UnBind{" + + "from='" + from + '\'' + + ", symbol='" + symbol + '\'' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenIssue.java b/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenIssue.java new file mode 100644 index 00000000..7edfd26b --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenIssue.java @@ -0,0 +1,26 @@ +package com.binance.dex.api.client.domain.broadcast; + +public class MiniTokenIssue extends Issue { + private String tokenURI; + + public String getTokenURI() { + return tokenURI; + } + + public void setTokenURI(String tokenURI) { + this.tokenURI = tokenURI; + } + + @Override + public String toString() { + return "MiniTokenIssue{" + + "from='" + super.getFrom() + '\'' + + ", name='" + super.getName() + '\'' + + ", symbol='" + super.getSymbol() + '\'' + + ", totalSupply=" + super.getTotalSupply() + + ", tokenURI=" + tokenURI + + ", mintable=" + super.getMintable() + + '}'; + } + +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenListing.java b/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenListing.java new file mode 100644 index 00000000..8476112a --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenListing.java @@ -0,0 +1,51 @@ +package com.binance.dex.api.client.domain.broadcast; + +public class MiniTokenListing { + + private String fromAddr; + private String baseAssetSymbol; + private String quoteAssetSymbol; + private Long initPrice; + + public String getFromAddr() { + return fromAddr; + } + + public void setFromAddr(String fromAddr) { + this.fromAddr = fromAddr; + } + + public String getBaseAssetSymbol() { + return baseAssetSymbol; + } + + public void setBaseAssetSymbol(String baseAssetSymbol) { + this.baseAssetSymbol = baseAssetSymbol; + } + + public String getQuoteAssetSymbol() { + return quoteAssetSymbol; + } + + public void setQuoteAssetSymbol(String quoteAssetSymbol) { + this.quoteAssetSymbol = quoteAssetSymbol; + } + + public Long getInitPrice() { + return initPrice; + } + + public void setInitPrice(Long initPrice) { + this.initPrice = initPrice; + } + + @Override + public String toString() { + return "MiniTokenListing{" + + "fromAddr='" + fromAddr + '\'' + + ", baseAssetSymbol='" + baseAssetSymbol + '\'' + + ", quoteAssetSymbol='" + quoteAssetSymbol + '\'' + + ", initPrice=" + initPrice + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenSetURI.java b/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenSetURI.java new file mode 100644 index 00000000..428852c1 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/broadcast/MiniTokenSetURI.java @@ -0,0 +1,41 @@ +package com.binance.dex.api.client.domain.broadcast; + +public class MiniTokenSetURI { + + private String from; + private String symbol; + private String tokenURI; + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getTokenURI() { + return tokenURI; + } + + public void setTokenURI(String tokenURI) { + this.tokenURI = tokenURI; + } + + @Override + public String toString() { + return "MiniTokenSetURI{" + + "from='" + from + '\'' + + ", symbol='" + symbol + '\'' + + ", tokenURI='" + tokenURI + '\'' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/broadcast/SideDeposit.java b/src/main/java/com/binance/dex/api/client/domain/broadcast/SideDeposit.java new file mode 100644 index 00000000..ecea7dc4 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/broadcast/SideDeposit.java @@ -0,0 +1,47 @@ +package com.binance.dex.api.client.domain.broadcast; + +import java.util.List; + +import com.binance.dex.api.client.encoding.message.Token; +/** + * + * Created by fletcher on 2019/5/13. + */ +public class SideDeposit { + + private Long proposalId; + private String depositer; + private List amount; + private String sideChainId; + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + public Long getProposalId() { + return proposalId; + } + + public void setProposalId(Long proposalId) { + this.proposalId = proposalId; + } + + public String getDepositer() { + return depositer; + } + + public void setDepositer(String depositer) { + this.depositer = depositer; + } + + public List getAmount() { + return amount; + } + + public void setAmount(List amount) { + this.amount = amount; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/broadcast/SideSubmitProposal.java b/src/main/java/com/binance/dex/api/client/domain/broadcast/SideSubmitProposal.java new file mode 100644 index 00000000..919850d3 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/broadcast/SideSubmitProposal.java @@ -0,0 +1,85 @@ +package com.binance.dex.api.client.domain.broadcast; + +import java.util.List; + +import com.binance.dex.api.client.domain.ProposalType; +import com.binance.dex.api.client.encoding.message.Token; + +public class SideSubmitProposal { + private String title; + private String description; + private ProposalType proposalType; + private String proposer; + private List initDeposit; + private Long votingPeriod; + private String sideChainId; + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public ProposalType getProposalType() { + return proposalType; + } + + public void setProposalType(ProposalType proposalType) { + this.proposalType = proposalType; + } + + public String getProposer() { + return proposer; + } + + public void setProposer(String proposer) { + this.proposer = proposer; + } + + public List getInitDeposit() { + return initDeposit; + } + + public void setInitDeposit(List initDeposit) { + this.initDeposit = initDeposit; + } + + public Long getVotingPeriod() { + return votingPeriod; + } + + public void setVotingPeriod(Long votingPeriod) { + this.votingPeriod = votingPeriod; + } + + @Override + public String toString() { + return "SubmitProposal{" + + "title='" + title + '\'' + + ", description='" + description + '\'' + + ", proposalType=" + proposalType + + ", proposer='" + proposer + '\'' + + ", initDeposit=" + initDeposit + + ", votingPeriod=" + votingPeriod + + ", sideChainId=" + sideChainId + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/broadcast/SideVote.java b/src/main/java/com/binance/dex/api/client/domain/broadcast/SideVote.java new file mode 100644 index 00000000..c4e36f52 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/broadcast/SideVote.java @@ -0,0 +1,54 @@ +package com.binance.dex.api.client.domain.broadcast; + +public class SideVote { + + private Long proposalId; + + private Integer option; + + private String voter; + + private String sideChainId; + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public Long getProposalId() { + return proposalId; + } + + public void setProposalId(Long proposalId) { + this.proposalId = proposalId; + } + + public Integer getOption() { + return option; + } + + public void setOption(Integer option) { + this.option = option; + } + + public String getVoter() { + return voter; + } + + public void setVoter(String voter) { + this.voter = voter; + } + + @Override + public String toString() { + return "Vote{" + + "proposalId=" + proposalId + + ", option=" + option + + ", sideChainId=" + sideChainId + + ", voter='" + voter + '\'' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/broadcast/TinyTokenIssue.java b/src/main/java/com/binance/dex/api/client/domain/broadcast/TinyTokenIssue.java new file mode 100644 index 00000000..617571be --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/broadcast/TinyTokenIssue.java @@ -0,0 +1,26 @@ +package com.binance.dex.api.client.domain.broadcast; + +public class TinyTokenIssue extends Issue { + private String tokenURI; + + public String getTokenURI() { + return tokenURI; + } + + public void setTokenURI(String tokenURI) { + this.tokenURI = tokenURI; + } + + @Override + public String toString() { + return "TinyTokenIssue{" + + "from='" + super.getFrom() + '\'' + + ", name='" + super.getName() + '\'' + + ", symbol='" + super.getSymbol() + '\'' + + ", totalSupply=" + super.getTotalSupply() + + ", tokenURI=" + tokenURI + + ", mintable=" + super.getMintable() + + '}'; + } + +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/domain/broadcast/TxType.java b/src/main/java/com/binance/dex/api/client/domain/broadcast/TxType.java index ca50fddc..7fcbac9a 100644 --- a/src/main/java/com/binance/dex/api/client/domain/broadcast/TxType.java +++ b/src/main/java/com/binance/dex/api/client/domain/broadcast/TxType.java @@ -7,11 +7,15 @@ public enum TxType { UNFREEZE_TOKEN, TRANSFER, VOTE, + SIDE_VOTE, ISSUE, BURN, MINT, + TRANSFER_TOKEN_OWNERSHIP, SUBMIT_PROPOSAL, + SIDE_SUBMIT_PROPOSAL, DEPOSIT, + SIDE_DEPOSIT, CREATE_VALIDATOR, REMOVE_VALIDATOR, LISTING, @@ -22,5 +26,29 @@ public enum TxType { HTL_TRANSFER, CLAIM_HTL, REFUND_HTL, - DEPOSIT_HTL + DEPOSIT_HTL, + CREATE_SIDECHAIN_VALIDATOR, + EDIT_SIDECHAIN_VALIDATOR, + SIDECHAIN_DELEGATE, + SIDECHAIN_REDELEGATE, + SIDECHAIN_UNBOND, + CLAIM, + TRANSFER_OUT, + BIND, + UNBIND, + BSC_SUBMIT_EVIDENCE, + SIDECHAIN_UNJAIL, + TINY_TOKEN_ISSUE, + MINI_TOKEN_ISSUE, + MINI_TOKEN_SET_URI, + MINI_TOKEN_LIST, + CREATE_BEACONCHAIN_VALIDATOR, + EDIT_BEACONCHAIN_VALIDATOR, + BEACONCHAIN_DELEGATE, + BEACONCHAIN_REDELEGATE, + BEACONCHAIN_UNDELEGATE, + UNJAIL, + CREATE_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR, + EDIT_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR, + SIDECHAIN_STAKE_MIGRATION, } diff --git a/src/main/java/com/binance/dex/api/client/domain/jsonrpc/TxResult.java b/src/main/java/com/binance/dex/api/client/domain/jsonrpc/TxResult.java index 21cc36cb..6ce5c0af 100644 --- a/src/main/java/com/binance/dex/api/client/domain/jsonrpc/TxResult.java +++ b/src/main/java/com/binance/dex/api/client/domain/jsonrpc/TxResult.java @@ -74,6 +74,9 @@ public void setValue(byte[] value) { } public static class Event{ + + private String type; + private List attributes; public List getAttributes() { @@ -83,6 +86,14 @@ public List getAttributes() { public void setAttributes(List attributes) { this.attributes = attributes; } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } } public static class Attribute{ diff --git a/src/main/java/com/binance/dex/api/client/domain/oracle/ClaimMsg.java b/src/main/java/com/binance/dex/api/client/domain/oracle/ClaimMsg.java new file mode 100644 index 00000000..c7bcbf8d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/oracle/ClaimMsg.java @@ -0,0 +1,67 @@ +package com.binance.dex.api.client.domain.oracle; + +import com.binance.dex.api.client.crosschain.Package; +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.fasterxml.jackson.core.JsonProcessingException; + +import java.util.List; + +/** + * @author Fitz.Lu + **/ +public class ClaimMsg { + + private int chainId; + + private long sequence; + + private List payload; + + private String validatorAddress; + + public int getChainId() { + return chainId; + } + + public void setChainId(int chainId) { + this.chainId = chainId; + } + + public long getSequence() { + return sequence; + } + + public void setSequence(long sequence) { + this.sequence = sequence; + } + + public List getPayload() { + return payload; + } + + public void setPayload(List payload) { + this.payload = payload; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + @Override + public String toString() { + try { + return "ClaimMsg{" + + "chainId=" + chainId + + ", sequence=" + sequence + + ", payload='" + EncodeUtils.toJsonStringSortKeys(payload) + '\'' + + ", validatorAddress='" + validatorAddress + '\'' + + '}'; + } catch (JsonProcessingException e) { + throw new RuntimeException("failed to encode payload", e); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/oracle/Prophecy.java b/src/main/java/com/binance/dex/api/client/domain/oracle/Prophecy.java new file mode 100644 index 00000000..c7ca9f18 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/oracle/Prophecy.java @@ -0,0 +1,59 @@ +package com.binance.dex.api.client.domain.oracle; + +import java.util.Map; + +/** + * @author Fitz.Lu + **/ +public class Prophecy { + + private String id; + + private Status status; + + private Map claimValidators; + + private Map validatorClaims; + + public Prophecy() { + } + + public Prophecy(String id, Status status, Map claimValidators, Map validatorClaims) { + this.id = id; + this.status = status; + this.claimValidators = claimValidators; + this.validatorClaims = validatorClaims; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public Map getClaimValidators() { + return claimValidators; + } + + public void setClaimValidators(Map claimValidators) { + this.claimValidators = claimValidators; + } + + public Map getValidatorClaims() { + return validatorClaims; + } + + public void setValidatorClaims(Map validatorClaims) { + this.validatorClaims = validatorClaims; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/oracle/Status.java b/src/main/java/com/binance/dex/api/client/domain/oracle/Status.java new file mode 100644 index 00000000..450e457d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/oracle/Status.java @@ -0,0 +1,35 @@ +package com.binance.dex.api.client.domain.oracle; + +/** + * @author Fitz.Lu + **/ +public class Status { + + private int text; + + private String finalClaim; + + public Status() { + } + + public Status(int text, String finalClaim) { + this.text = text; + this.finalClaim = finalClaim; + } + + public int getText() { + return text; + } + + public void setText(int text) { + this.text = text; + } + + public String getFinalClaim() { + return finalClaim; + } + + public void setFinalClaim(String finalClaim) { + this.finalClaim = finalClaim; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/request/TransactionsRequest.java b/src/main/java/com/binance/dex/api/client/domain/request/TransactionsRequest.java index d203c28e..6f0630ee 100644 --- a/src/main/java/com/binance/dex/api/client/domain/request/TransactionsRequest.java +++ b/src/main/java/com/binance/dex/api/client/domain/request/TransactionsRequest.java @@ -6,30 +6,21 @@ import org.apache.commons.lang3.builder.ToStringBuilder; public class TransactionsRequest { - private String address; - private Long blockHeight; + private Long startTime; private Long endTime; - private Integer limit; + private String type; + private String asset; + private String address; + private String addressType; private Integer offset; - private OrderSide side; - private Long startTime; - private String txAsset; - private TransactionType txType; - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } + private Integer limit; - public Long getBlockHeight() { - return blockHeight; + public Long getStartTime() { + return startTime; } - public void setBlockHeight(Long blockHeight) { - this.blockHeight = blockHeight; + public void setStartTime(Long startTime) { + this.startTime = startTime; } public Long getEndTime() { @@ -40,66 +31,65 @@ public void setEndTime(Long endTime) { this.endTime = endTime; } - public Integer getLimit() { - return limit; + public String getType() { + return type; } - public void setLimit(Integer limit) { - this.limit = limit; + public void setType(String type) { + this.type = type; } - public Integer getOffset() { - return offset; + public String getAsset() { + return asset; } - public void setOffset(Integer offset) { - this.offset = offset; + public void setAsset(String asset) { + this.asset = asset; } - public OrderSide getSide() { - return side; + public String getAddress() { + return address; } - public void setSide(OrderSide side) { - this.side = side; + public void setAddress(String address) { + this.address = address; } - public Long getStartTime() { - return startTime; + public String getAddressType() { + return addressType; } - public void setStartTime(Long startTime) { - this.startTime = startTime; + public void setAddressType(String addressType) { + this.addressType = addressType; } - public String getTxAsset() { - return txAsset; + public Integer getOffset() { + return offset; } - public void setTxAsset(String txAsset) { - this.txAsset = txAsset; + public void setOffset(Integer offset) { + this.offset = offset; } - public TransactionType getTxType() { - return txType; + public Integer getLimit() { + return limit; } - public void setTxType(TransactionType txType) { - this.txType = txType; + public void setLimit(Integer limit) { + this.limit = limit; } @Override public String toString() { return new ToStringBuilder(this, BinanceDexConstants.BINANCE_DEX_TO_STRING_STYLE) - .append("address", address) - .append("blockHeight", blockHeight) + .append("startTime", startTime) .append("endTime", endTime) + .append("type", type) + .append("asset", asset) + .append("address", address) + .append("addressType", addressType) .append("limit", limit) .append("offset", offset) - .append("side", side) - .append("startTime", startTime) - .append("txAsset", txAsset) - .append("txType", txType) .toString(); } } diff --git a/src/main/java/com/binance/dex/api/client/domain/slash/BscHeader.java b/src/main/java/com/binance/dex/api/client/domain/slash/BscHeader.java new file mode 100644 index 00000000..4b8f0876 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/slash/BscHeader.java @@ -0,0 +1,57 @@ +package com.binance.dex.api.client.domain.slash; + +import com.binance.dex.api.client.encoding.serializer.BytesToPrefixedHexStringSerializer; +import com.binance.dex.api.client.encoding.serializer.LongToHexStringSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class BscHeader { + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] parentHash; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] sha3Uncles; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] miner; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] stateRoot; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] transactionsRoot; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] receiptsRoot; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] logsBloom; + + @JsonSerialize(using = LongToHexStringSerializer.class) + private Long difficulty; + + @JsonSerialize(using = LongToHexStringSerializer.class) + private Long number; + + @JsonSerialize(using = LongToHexStringSerializer.class) + private Long gasLimit; + + @JsonSerialize(using = LongToHexStringSerializer.class) + private Long gasUsed; + + @JsonSerialize(using = LongToHexStringSerializer.class) + private Long timestamp; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] extra; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] mixHash; + + @JsonSerialize(using = BytesToPrefixedHexStringSerializer.class) + private byte[] nonce; +} diff --git a/src/main/java/com/binance/dex/api/client/domain/slash/BscSubmitEvidence.java b/src/main/java/com/binance/dex/api/client/domain/slash/BscSubmitEvidence.java new file mode 100644 index 00000000..02f09611 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/slash/BscSubmitEvidence.java @@ -0,0 +1,13 @@ +package com.binance.dex.api.client.domain.slash; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class BscSubmitEvidence { + + private String submitter; + + private BscHeader[] headers; +} diff --git a/src/main/java/com/binance/dex/api/client/domain/slash/SideChainUnJail.java b/src/main/java/com/binance/dex/api/client/domain/slash/SideChainUnJail.java new file mode 100644 index 00000000..89426e2e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/slash/SideChainUnJail.java @@ -0,0 +1,14 @@ +package com.binance.dex.api.client.domain.slash; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SideChainUnJail { + + private String validatorAddr; + + private String sideChainId; + +} diff --git a/src/main/java/com/binance/dex/api/client/domain/slash/UnJail.java b/src/main/java/com/binance/dex/api/client/domain/slash/UnJail.java new file mode 100644 index 00000000..0e75671f --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/slash/UnJail.java @@ -0,0 +1,10 @@ +package com.binance.dex.api.client.domain.slash; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UnJail { + private String validatorAddr; +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/Commission.java b/src/main/java/com/binance/dex/api/client/domain/stake/Commission.java new file mode 100644 index 00000000..9b76af82 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/Commission.java @@ -0,0 +1,67 @@ +package com.binance.dex.api.client.domain.stake; + +/** + * @author Fitz.Lu + **/ +public class Commission { + + private long rate; + + private long maxRate; + + private long maxChangeRate; + + private long updateTimeInMs; + + public long getRate() { + return rate; + } + + public void setRate(long rate) { + this.rate = rate; + } + + public long getMaxRate() { + return maxRate; + } + + public void setMaxRate(long maxRate) { + this.maxRate = maxRate; + } + + public long getMaxChangeRate() { + return maxChangeRate; + } + + public void setMaxChangeRate(long maxChangeRate) { + this.maxChangeRate = maxChangeRate; + } + + public long getUpdateTimeInMs() { + return updateTimeInMs; + } + + public void setUpdateTimeInMs(long updateTimeInMs) { + this.updateTimeInMs = updateTimeInMs; + } + + public Commission() { + } + + public Commission(long rate, long maxRate, long maxChangeRate, long updateTimeInMs) { + this.rate = rate; + this.maxRate = maxRate; + this.maxChangeRate = maxChangeRate; + this.updateTimeInMs = updateTimeInMs; + } + + @Override + public String toString() { + return "Commission{" + + "rate=" + rate + + ", maxRate=" + maxRate + + ", maxChangeRate=" + maxChangeRate + + ", updateTimeInMs=" + updateTimeInMs + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/Delegation.java b/src/main/java/com/binance/dex/api/client/domain/stake/Delegation.java new file mode 100644 index 00000000..1d0626f1 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/Delegation.java @@ -0,0 +1,37 @@ +package com.binance.dex.api.client.domain.stake; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Fitz.Lu + **/ +public class Delegation { + + private DelegationItem delegation; + + private Token balance; + + public Delegation() { + } + + public Delegation(DelegationItem delegation, Token balance) { + this.delegation = delegation; + this.balance = balance; + } + + public DelegationItem getDelegation() { + return delegation; + } + + public void setDelegation(DelegationItem delegation) { + this.delegation = delegation; + } + + public Token getBalance() { + return balance; + } + + public void setBalance(Token balance) { + this.balance = balance; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/DelegationItem.java b/src/main/java/com/binance/dex/api/client/domain/stake/DelegationItem.java new file mode 100644 index 00000000..437105d9 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/DelegationItem.java @@ -0,0 +1,40 @@ +package com.binance.dex.api.client.domain.stake; + +/** + * @author Fitz.Lu + **/ +public class DelegationItem { + + private String delegatorAddress; + + private String validatorAddress; + + private long shares; + + public DelegationItem() { + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public long getShares() { + return shares; + } + + public void setShares(long shares) { + this.shares = shares; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/Description.java b/src/main/java/com/binance/dex/api/client/domain/stake/Description.java new file mode 100644 index 00000000..dd09ce9d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/Description.java @@ -0,0 +1,71 @@ +package com.binance.dex.api.client.domain.stake; + +/** + * @author Fitz.Lu + **/ +public class Description { + + private String moniker; + + private String identity; + + private String website; + + private String details; + + public Description() { + this.moniker = ""; + this.identity = ""; + this.website = ""; + this.details = ""; + } + + public Description(String moniker, String identity, String website, String details) { + this.moniker = moniker; + this.identity = identity; + this.website = website; + this.details = details; + } + + public String getMoniker() { + return moniker; + } + + public void setMoniker(String moniker) { + this.moniker = moniker; + } + + public String getIdentity() { + return identity; + } + + public void setIdentity(String identity) { + this.identity = identity; + } + + public String getWebsite() { + return website; + } + + public void setWebsite(String website) { + this.website = website; + } + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + @Override + public String toString() { + return "Description{" + + "moniker='" + moniker + '\'' + + ", identity='" + identity + '\'' + + ", website='" + website + '\'' + + ", details='" + details + '\'' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/Pool.java b/src/main/java/com/binance/dex/api/client/domain/stake/Pool.java new file mode 100644 index 00000000..91132409 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/Pool.java @@ -0,0 +1,38 @@ +package com.binance.dex.api.client.domain.stake; + +/** + * @author Fitz.Lu + **/ +public class Pool { + + private long looseTokens; + + private long bondedTokens; + + public Pool() { + } + + public long getLooseTokens() { + return looseTokens; + } + + public void setLooseTokens(long looseTokens) { + this.looseTokens = looseTokens; + } + + public long getBondedTokens() { + return bondedTokens; + } + + public void setBondedTokens(long bondedTokens) { + this.bondedTokens = bondedTokens; + } + + @Override + public String toString() { + return "Pool{" + + "looseTokens=" + looseTokens + + ", bondedTokens=" + bondedTokens + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/Redelegation.java b/src/main/java/com/binance/dex/api/client/domain/stake/Redelegation.java new file mode 100644 index 00000000..4c6d84d7 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/Redelegation.java @@ -0,0 +1,151 @@ +package com.binance.dex.api.client.domain.stake; + + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Fitz.Lu + **/ +public class Redelegation { + + //delegator address + private String delegatorAddress; + + //validator redelegation source operator address + private String srcValidatorAddress; + + //validator redelegation destination operator address + private String dstValidatorAddress; + + //height which the redelegation took place + private long createHeight; + + //unix time for redelegation completion + private String minTime; + + private long minTimeInMs; + + //initial balance when redelegation started + private Token initialBalance; + + //current balance + private Token balance; + + //amount of source shares redelegating + private long srcShares; + + //amount of destination shares redelegating + private long dstShare; + + public Redelegation(String delegatorAddress, String srcValidatorAddress, String dstValidatorAddress, long createHeight, String minTime, long minTimeInMs, Token initialBalance, Token balance, long srcShares, long dstShare) { + this.delegatorAddress = delegatorAddress; + this.srcValidatorAddress = srcValidatorAddress; + this.dstValidatorAddress = dstValidatorAddress; + this.createHeight = createHeight; + this.minTime = minTime; + this.minTimeInMs = minTimeInMs; + this.initialBalance = initialBalance; + this.balance = balance; + this.srcShares = srcShares; + this.dstShare = dstShare; + } + + public Redelegation() { + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getSrcValidatorAddress() { + return srcValidatorAddress; + } + + public void setSrcValidatorAddress(String srcValidatorAddress) { + this.srcValidatorAddress = srcValidatorAddress; + } + + public String getDstValidatorAddress() { + return dstValidatorAddress; + } + + public void setDstValidatorAddress(String dstValidatorAddress) { + this.dstValidatorAddress = dstValidatorAddress; + } + + public long getCreateHeight() { + return createHeight; + } + + public void setCreateHeight(long createHeight) { + this.createHeight = createHeight; + } + + public String getMinTime() { + return minTime; + } + + public void setMinTime(String minTime) { + this.minTime = minTime; + } + + public long getMinTimeInMs() { + return minTimeInMs; + } + + public void setMinTimeInMs(long minTimeInMs) { + this.minTimeInMs = minTimeInMs; + } + + public Token getInitialBalance() { + return initialBalance; + } + + public void setInitialBalance(Token initialBalance) { + this.initialBalance = initialBalance; + } + + public Token getBalance() { + return balance; + } + + public void setBalance(Token balance) { + this.balance = balance; + } + + public long getSrcShares() { + return srcShares; + } + + public void setSrcShares(long srcShares) { + this.srcShares = srcShares; + } + + public long getDstShare() { + return dstShare; + } + + public void setDstShare(long dstShare) { + this.dstShare = dstShare; + } + + @Override + public String toString() { + return "SideChainRedelegation{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", srcValidatorAddress='" + srcValidatorAddress + '\'' + + ", dstValidatorAddress='" + dstValidatorAddress + '\'' + + ", createHeight=" + createHeight + + ", minTime='" + minTime + '\'' + + ", minTimeInMs=" + minTimeInMs + + ", initialBalance=" + initialBalance + + ", balance=" + balance + + ", srcShares=" + srcShares + + ", dstShare=" + dstShare + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/UnBondingDelegation.java b/src/main/java/com/binance/dex/api/client/domain/stake/UnBondingDelegation.java new file mode 100644 index 00000000..8c96e989 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/UnBondingDelegation.java @@ -0,0 +1,105 @@ +package com.binance.dex.api.client.domain.stake; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Fitz.Lu + **/ +public class UnBondingDelegation { + + private String delegatorAddress; + + private String validatorAddress; + + private long createHeight; + + private long minTimeInMs; + + private String minTime; + + private Token initialBalance; + + private Token balance; + + public UnBondingDelegation() { + } + + public UnBondingDelegation(String delegatorAddress, String validatorAddress, long createHeight, long minTimeInMs, String minTime, Token initialBalance, Token balance) { + this.delegatorAddress = delegatorAddress; + this.validatorAddress = validatorAddress; + this.createHeight = createHeight; + this.minTimeInMs = minTimeInMs; + this.minTime = minTime; + this.initialBalance = initialBalance; + this.balance = balance; + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public long getCreateHeight() { + return createHeight; + } + + public void setCreateHeight(long createHeight) { + this.createHeight = createHeight; + } + + public long getMinTimeInMs() { + return minTimeInMs; + } + + public void setMinTimeInMs(long minTimeInMs) { + this.minTimeInMs = minTimeInMs; + } + + public String getMinTime() { + return minTime; + } + + public void setMinTime(String minTime) { + this.minTime = minTime; + } + + public Token getInitialBalance() { + return initialBalance; + } + + public void setInitialBalance(Token initialBalance) { + this.initialBalance = initialBalance; + } + + public Token getBalance() { + return balance; + } + + public void setBalance(Token balance) { + this.balance = balance; + } + + @Override + public String toString() { + return "UnBondingDelegation{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", validatorAddress='" + validatorAddress + '\'' + + ", createHeight=" + createHeight + + ", minTimeInMs=" + minTimeInMs + + ", minTime='" + minTime + '\'' + + ", initialBalance=" + initialBalance + + ", balance=" + balance + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/Validator.java b/src/main/java/com/binance/dex/api/client/domain/stake/Validator.java new file mode 100644 index 00000000..8a33e370 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/Validator.java @@ -0,0 +1,229 @@ +package com.binance.dex.api.client.domain.stake; + +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class Validator { + + private String feeAddr; + + private String operatorAddr; + + private byte[] consPubKey; + + private boolean jailed; + + private int status; + + private long tokens; + + private long delegatorShares; + + private Description description; + + private long bondHeight; + + private int bondIntraTxCounter; + + private long unBondingHeight; + + private long unBondingMinTime; + + private Commission commission; + + private String distributionAddr; + + private String sideChainId; + + private String sideConsAddr; + + private String sideFeeAddr; + + public ArrayList getStakeSnapShots() { + return stakeSnapShots; + } + + public void setStakeSnapShots(ArrayList stakeSnapShots) { + this.stakeSnapShots = stakeSnapShots; + } + + public String getAccumulatedStake() { + return accumulatedStake; + } + + public void setAccumulatedStake(String accumulatedStake) { + this.accumulatedStake = accumulatedStake; + } + + private ArrayList stakeSnapShots; + + private String accumulatedStake; + + public Validator() { + } + + public String getFeeAddr() { + return feeAddr; + } + + public void setFeeAddr(String feeAddr) { + this.feeAddr = feeAddr; + } + + public String getOperatorAddr() { + return operatorAddr; + } + + public void setOperatorAddr(String operatorAddr) { + this.operatorAddr = operatorAddr; + } + + public byte[] getConsPubKey() { + return consPubKey; + } + + public void setConsPubKey(byte[] consPubKey) { + this.consPubKey = consPubKey; + } + + public boolean isJailed() { + return jailed; + } + + public void setJailed(boolean jailed) { + this.jailed = jailed; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public long getTokens() { + return tokens; + } + + public void setTokens(long tokens) { + this.tokens = tokens; + } + + public long getDelegatorShares() { + return delegatorShares; + } + + public void setDelegatorShares(long delegatorShares) { + this.delegatorShares = delegatorShares; + } + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public long getBondHeight() { + return bondHeight; + } + + public void setBondHeight(long bondHeight) { + this.bondHeight = bondHeight; + } + + public int getBondIntraTxCounter() { + return bondIntraTxCounter; + } + + public void setBondIntraTxCounter(int bondIntraTxCounter) { + this.bondIntraTxCounter = bondIntraTxCounter; + } + + public long getUnBondingHeight() { + return unBondingHeight; + } + + public void setUnBondingHeight(long unBondingHeight) { + this.unBondingHeight = unBondingHeight; + } + + public long getUnBondingMinTime() { + return unBondingMinTime; + } + + public void setUnBondingMinTime(long unBondingMinTime) { + this.unBondingMinTime = unBondingMinTime; + } + + public Commission getCommission() { + return commission; + } + + public void setCommission(Commission commission) { + this.commission = commission; + } + + public String getDistributionAddr() { + return distributionAddr; + } + + public void setDistributionAddr(String distributionAddr) { + this.distributionAddr = distributionAddr; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(String sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public String getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(String sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + @Override + public String toString() { + return "SideChainValidator{" + + "feeAddr=" + feeAddr + '\n' + + ", operatorAddr=" + operatorAddr + '\n' + + ", consPubKey='" + consPubKey + '\'' + '\n' + + ", jailed=" + jailed + '\n' + + ", status=" + status + '\n' + + ", tokens=" + tokens + '\n' + + ", delegatorShares=" + delegatorShares + '\n' + + ", description=" + description + '\n' + + ", bondHeight=" + bondHeight + '\n' + + ", bondIntraTxCounter=" + bondIntraTxCounter + '\n' + + ", unBondingHeight=" + unBondingHeight + '\n' + + ", unBondingMinTime=" + unBondingMinTime + '\n' + + ", commission=" + commission + '\n' + + ", distributionAddr=" + distributionAddr + '\n' + + ", sideChainId='" + sideChainId + '\'' + '\n' + + ", sideConsAddr=" + sideConsAddr + '\n' + + ", sideFeeAddr=" + sideFeeAddr + '\n' + + '}'; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainDelegate.java b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainDelegate.java new file mode 100644 index 00000000..9795bd93 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainDelegate.java @@ -0,0 +1,59 @@ +package com.binance.dex.api.client.domain.stake.beaconchain; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Francis.Liu + **/ +public class BeaconChainDelegate { + + private String delegatorAddress; + + private String validatorAddress; + + private Token delegation; + + + public BeaconChainDelegate() { + } + + public BeaconChainDelegate(String delegatorAddress, String validatorAddress, Token delegation, String sideChainId) { + this.delegatorAddress = delegatorAddress; + this.validatorAddress = validatorAddress; + this.delegation = delegation; + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public Token getDelegation() { + return delegation; + } + + public void setDelegation(Token delegation) { + this.delegation = delegation; + } + + + @Override + public String toString() { + return "SideChainDelegate{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", validatorAddress='" + validatorAddress + '\'' + + ", delegation=" + delegation + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainRedelegate.java b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainRedelegate.java new file mode 100644 index 00000000..79bf8d3c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainRedelegate.java @@ -0,0 +1,63 @@ +package com.binance.dex.api.client.domain.stake.beaconchain; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Francis.Liu + **/ +public class BeaconChainRedelegate { + + private String delegatorAddress; + + private String srcValidatorAddress; + + private String dstValidatorAddress; + + private Token amount; + + + public BeaconChainRedelegate() { + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getSrcValidatorAddress() { + return srcValidatorAddress; + } + + public void setSrcValidatorAddress(String srcValidatorAddress) { + this.srcValidatorAddress = srcValidatorAddress; + } + + public String getDstValidatorAddress() { + return dstValidatorAddress; + } + + public void setDstValidatorAddress(String dstValidatorAddress) { + this.dstValidatorAddress = dstValidatorAddress; + } + + public Token getAmount() { + return amount; + } + + public void setAmount(Token amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "SideChainRedelegate{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", srcValidatorAddress='" + srcValidatorAddress + '\'' + + ", dstValidatorAddress='" + dstValidatorAddress + '\'' + + ", amount=" + amount + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainUndelegate.java b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainUndelegate.java new file mode 100644 index 00000000..b63f94a6 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/BeaconChainUndelegate.java @@ -0,0 +1,53 @@ +package com.binance.dex.api.client.domain.stake.beaconchain; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Francis.Liu + **/ +public class BeaconChainUndelegate { + + private String delegatorAddress; + + private String validatorAddress; + + private Token amount; + + + public BeaconChainUndelegate() { + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public Token getAmount() { + return amount; + } + + public void setAmount(Token amount) { + this.amount = amount; + } + + + @Override + public String toString() { + return "SideChainUnBond{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", validatorAddress='" + validatorAddress + '\'' + + ", amount=" + amount + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/CreateBeaconChainValidator.java b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/CreateBeaconChainValidator.java new file mode 100644 index 00000000..61bff169 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/CreateBeaconChainValidator.java @@ -0,0 +1,86 @@ +package com.binance.dex.api.client.domain.stake.beaconchain; + +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Francis.Liu + **/ +public class CreateBeaconChainValidator { + + private Description description; + + private Commission commission; + + private String delegatorAddr; + + private String validatorAddr; + + private Token delegation; + + private String pubKey; + + + public CreateBeaconChainValidator() { + } + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public Commission getCommission() { + return commission; + } + + public void setCommission(Commission commission) { + this.commission = commission; + } + + public String getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(String delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public Token getDelegation() { + return delegation; + } + + public void setDelegation(Token delegation) { + this.delegation = delegation; + } + public String getPubKey() { + return pubKey; + } + + public void setPubKey(String pubKey) { + this.pubKey = pubKey; + } + + public String getValidatorAddr() { + return validatorAddr; + } + + public void setValidatorAddr(String validatorAddr) { + this.validatorAddr = validatorAddr; + } + + @Override + public String toString() { + return "CreateSideChainValidator{" + '\n' + + "description=" + description + '\n' + + ", commission=" + commission + '\n' + + ", delegatorAddr='" + delegatorAddr + '\'' + '\n' + + ", validatorAddr='" + validatorAddr + '\'' + '\n' + + ", delegation=" + delegation + '\n' + + ", pubKey='" + pubKey + '\'' + '\n' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/EditBeaconChainValidator.java b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/EditBeaconChainValidator.java new file mode 100644 index 00000000..dbb63b15 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/beaconchain/EditBeaconChainValidator.java @@ -0,0 +1,64 @@ +package com.binance.dex.api.client.domain.stake.beaconchain; + +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.encoding.amino.types.PubKeyEd25519; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Francis.Liu + **/ +public class EditBeaconChainValidator { + + private Description description; + + private String validatorAddress; + + private long commissionRate; + + public String getPubKey() { + return pubKey; + } + + public void setPubKey(String pubKey) { + this.pubKey = pubKey; + } + + private String pubKey; + + public EditBeaconChainValidator() { + } + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public long getCommissionRate() { + return commissionRate; + } + + public void setCommissionRate(long commissionRate) { + this.commissionRate = commissionRate; + } + + + @Override + public String toString() { + return "EditSideChainValidator{" + + "description=" + description + "\n" + + ", validatorAddress='" + validatorAddress + '\'' + "\n" + + ", commissionRate=" + commissionRate + "\n" + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/CreateSideChainValidator.java b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/CreateSideChainValidator.java new file mode 100644 index 00000000..2f35a2e2 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/CreateSideChainValidator.java @@ -0,0 +1,108 @@ +package com.binance.dex.api.client.domain.stake.sidechain; + +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Fitz.Lu + **/ +public class CreateSideChainValidator { + + private Description description; + + private Commission commission; + + private String delegatorAddr; + + private String validatorAddr; + + private Token delegation; + + private String sideChainId; + + private String sideConsAddr; + + private String sideFeeAddr; + + public CreateSideChainValidator() { + } + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public Commission getCommission() { + return commission; + } + + public void setCommission(Commission commission) { + this.commission = commission; + } + + public String getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(String delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public Token getDelegation() { + return delegation; + } + + public void setDelegation(Token delegation) { + this.delegation = delegation; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(String sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public String getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(String sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + public String getValidatorAddr() { + return validatorAddr; + } + + public void setValidatorAddr(String validatorAddr) { + this.validatorAddr = validatorAddr; + } + + @Override + public String toString() { + return "CreateSideChainValidator{" + '\n' + + "description=" + description + '\n' + + ", commission=" + commission + '\n' + + ", delegatorAddr='" + delegatorAddr + '\'' + '\n' + + ", validatorAddr='" + validatorAddr + '\'' + '\n' + + ", delegation=" + delegation + '\n' + + ", sideChainId='" + sideChainId + '\'' + '\n' + + ", sideConsAddr='" + sideConsAddr + '\'' + '\n' + + ", sideFeeAddr='" + sideFeeAddr + '\'' + '\n' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/CreateSideChainValidatorWithVoteAddr.java b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/CreateSideChainValidatorWithVoteAddr.java new file mode 100644 index 00000000..68979f22 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/CreateSideChainValidatorWithVoteAddr.java @@ -0,0 +1,116 @@ +package com.binance.dex.api.client.domain.stake.sidechain; + +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.encoding.message.Token; + +public class CreateSideChainValidatorWithVoteAddr { + + private Description description; + + private Commission commission; + + private String delegatorAddr; + + private String validatorAddr; + + private Token delegation; + + private String sideChainId; + + private String sideConsAddr; + + private String sideFeeAddr; + + private String sideVoteAddr; + + public CreateSideChainValidatorWithVoteAddr() { + } + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public Commission getCommission() { + return commission; + } + + public void setCommission(Commission commission) { + this.commission = commission; + } + + public String getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(String delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public Token getDelegation() { + return delegation; + } + + public void setDelegation(Token delegation) { + this.delegation = delegation; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(String sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public String getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(String sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + public String getValidatorAddr() { + return validatorAddr; + } + + public void setValidatorAddr(String validatorAddr) { + this.validatorAddr = validatorAddr; + } + + public String getSideVoteAddr() { + return sideVoteAddr; + } + + public void setSideVoteAddr(String sideVoteAddr) { + this.sideVoteAddr = sideVoteAddr; + } + + @Override + public String toString() { + return "CreateSideChainValidator{" + '\n' + + "description=" + description + '\n' + + ", commission=" + commission + '\n' + + ", delegatorAddr='" + delegatorAddr + '\'' + '\n' + + ", validatorAddr='" + validatorAddr + '\'' + '\n' + + ", delegation=" + delegation + '\n' + + ", sideChainId='" + sideChainId + '\'' + '\n' + + ", sideConsAddr='" + sideConsAddr + '\'' + '\n' + + ", sideFeeAddr='" + sideFeeAddr + '\'' + '\n' + + ", sideVoteAddr='" + sideVoteAddr + '\'' + '\n' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/EditSideChainValidator.java b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/EditSideChainValidator.java new file mode 100644 index 00000000..f06051c1 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/EditSideChainValidator.java @@ -0,0 +1,73 @@ +package com.binance.dex.api.client.domain.stake.sidechain; + +import com.binance.dex.api.client.domain.stake.Description; + +/** + * @author Fitz.Lu + **/ +public class EditSideChainValidator { + + private Description description; + + private String validatorAddress; + + private long commissionRate; + + private String sideChainId; + + private String sideFeeAddr; + + public EditSideChainValidator() { + } + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public long getCommissionRate() { + return commissionRate; + } + + public void setCommissionRate(long commissionRate) { + this.commissionRate = commissionRate; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(String sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + @Override + public String toString() { + return "EditSideChainValidator{" + + "description=" + description + "\n" + + ", validatorAddress='" + validatorAddress + '\'' + "\n" + + ", commissionRate=" + commissionRate + "\n" + + ", sideChainId='" + sideChainId + '\'' + "\n" + + ", sideFeeAddr='" + sideFeeAddr + '\'' + "\n" + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/EditSideChainValidatorWithVoteAddr.java b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/EditSideChainValidatorWithVoteAddr.java new file mode 100644 index 00000000..252a422b --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/EditSideChainValidatorWithVoteAddr.java @@ -0,0 +1,92 @@ +package com.binance.dex.api.client.domain.stake.sidechain; + +import com.binance.dex.api.client.domain.stake.Description; + +public class EditSideChainValidatorWithVoteAddr { + + private Description description; + + private String validatorAddress; + + private long commissionRate; + + private String sideChainId; + + private String sideFeeAddr; + + private String sideConsAddr; + + private String sideVoteAddr; + + public EditSideChainValidatorWithVoteAddr() { + } + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public long getCommissionRate() { + return commissionRate; + } + + public void setCommissionRate(long commissionRate) { + this.commissionRate = commissionRate; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(String sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + public String getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(String sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public String getSideVoteAddr() { + return sideVoteAddr; + } + + public void setSideVoteAddr(String sideVoteAddr) { + this.sideVoteAddr = sideVoteAddr; + } + + @Override + public String toString() { + return "EditSideChainValidatorWithVoteAddr{" + + "description=" + description + "\n" + + ", validatorAddress='" + validatorAddress + '\'' + "\n" + + ", commissionRate=" + commissionRate + "\n" + + ", sideChainId='" + sideChainId + '\'' + "\n" + + ", sideFeeAddr='" + sideFeeAddr + '\'' + "\n" + + ", sideConsAddr='" + sideConsAddr + '\'' + "\n" + + ", sideVoteAddr='" + sideVoteAddr + '\'' + "\n" + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainDelegate.java b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainDelegate.java new file mode 100644 index 00000000..85c8aaf3 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainDelegate.java @@ -0,0 +1,70 @@ +package com.binance.dex.api.client.domain.stake.sidechain; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Fitz.Lu + **/ +public class SideChainDelegate { + + private String delegatorAddress; + + private String validatorAddress; + + private Token delegation; + + private String sideChainId; + + public SideChainDelegate() { + sideChainId = ""; + } + + public SideChainDelegate(String delegatorAddress, String validatorAddress, Token delegation, String sideChainId) { + this.delegatorAddress = delegatorAddress; + this.validatorAddress = validatorAddress; + this.delegation = delegation; + this.sideChainId = sideChainId; + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public Token getDelegation() { + return delegation; + } + + public void setDelegation(Token delegation) { + this.delegation = delegation; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + @Override + public String toString() { + return "SideChainDelegate{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", validatorAddress='" + validatorAddress + '\'' + + ", delegation=" + delegation + + ", sideChainId='" + sideChainId + '\'' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainRedelegate.java b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainRedelegate.java new file mode 100644 index 00000000..329a7fa3 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainRedelegate.java @@ -0,0 +1,73 @@ +package com.binance.dex.api.client.domain.stake.sidechain; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Fitz.Lu + **/ +public class SideChainRedelegate { + + private String delegatorAddress; + + private String srcValidatorAddress; + + private String dstValidatorAddress; + + private Token amount; + + private String sideChainId; + + public SideChainRedelegate() { + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getSrcValidatorAddress() { + return srcValidatorAddress; + } + + public void setSrcValidatorAddress(String srcValidatorAddress) { + this.srcValidatorAddress = srcValidatorAddress; + } + + public String getDstValidatorAddress() { + return dstValidatorAddress; + } + + public void setDstValidatorAddress(String dstValidatorAddress) { + this.dstValidatorAddress = dstValidatorAddress; + } + + public Token getAmount() { + return amount; + } + + public void setAmount(Token amount) { + this.amount = amount; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + @Override + public String toString() { + return "SideChainRedelegate{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", srcValidatorAddress='" + srcValidatorAddress + '\'' + + ", dstValidatorAddress='" + dstValidatorAddress + '\'' + + ", amount=" + amount + + ", sideChainId='" + sideChainId + '\'' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainStakeMigration.java b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainStakeMigration.java new file mode 100644 index 00000000..76eeb932 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainStakeMigration.java @@ -0,0 +1,70 @@ +package com.binance.dex.api.client.domain.stake.sidechain; + +import com.binance.dex.api.client.encoding.message.Token; + +public class SideChainStakeMigration { + + private String validatorSrcAddr; + + private String validatorDstAddr; + + private String delegatorAddr; + + private String refundAddr; + + private Token amount; + + public SideChainStakeMigration() { + } + + public String getValidatorSrcAddr() { + return validatorSrcAddr; + } + + public void setValidatorSrcAddr(String validatorSrcAddr) { + this.validatorSrcAddr = validatorSrcAddr; + } + + public String getValidatorDstAddr() { + return validatorDstAddr; + } + + public void setValidatorDstAddr(String validatorDstAddr) { + this.validatorDstAddr = validatorDstAddr; + } + + public String getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(String delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public String getRefundAddr() { + return refundAddr; + } + + public void setRefundAddr(String refundAddr) { + this.refundAddr = refundAddr; + } + + public Token getAmount() { + return amount; + } + + public void setAmount(Token amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "SideChainStakeMigration{" + + "validatorSrcAddr='" + validatorSrcAddr + '\'' + + ", validatorDstAddr='" + validatorDstAddr + '\'' + + ", delegatorAddr='" + delegatorAddr + '\'' + + ", refundAddr='" + refundAddr + '\'' + + ", amount=" + amount + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainUnBond.java b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainUnBond.java new file mode 100644 index 00000000..18922f35 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/domain/stake/sidechain/SideChainUnBond.java @@ -0,0 +1,62 @@ +package com.binance.dex.api.client.domain.stake.sidechain; + +import com.binance.dex.api.client.encoding.message.Token; + +/** + * @author Fitz.Lu + **/ +public class SideChainUnBond { + + private String delegatorAddress; + + private String validatorAddress; + + private Token amount; + + private String sideChainId; + + public SideChainUnBond() { + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public Token getAmount() { + return amount; + } + + public void setAmount(Token amount) { + this.amount = amount; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + @Override + public String toString() { + return "SideChainUnBond{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", validatorAddress='" + validatorAddress + '\'' + + ", amount=" + amount + + ", sideChainId='" + sideChainId + '\'' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/ByteUtil.java b/src/main/java/com/binance/dex/api/client/encoding/ByteUtil.java new file mode 100644 index 00000000..a12c44e4 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/ByteUtil.java @@ -0,0 +1,83 @@ +package com.binance.dex.api.client.encoding; + +import java.util.Arrays; + +/** + * @author Fitz.Lu + **/ +public class ByteUtil { + + public static boolean isEmpty(byte[] bytes){ + return bytes == null || bytes.length == 0; + } + + public static byte[] read(byte[] bytes, int length){ + requireByteArrayNotEmpty(bytes); + + byte[] newBytes = new byte[length]; + System.arraycopy(bytes, 0, newBytes, 0, length); + return newBytes; + } + + public static byte[] cut(byte[] bytes, int length){ + requireByteArrayNotEmpty(bytes); + requireByteArrayLengthNotLessThan(bytes, length); + + byte[] newBytes = new byte[bytes.length - length]; + System.arraycopy(bytes, length, newBytes, 0, newBytes.length); + return newBytes; + } + + public static byte[] pick(byte[] bytes, int start, int length){ + requireByteArrayNotEmpty(bytes); + requireByteArrayLengthNotLessThan(bytes, length); + + byte[] newBytes = new byte[length]; + System.arraycopy(bytes, start, newBytes, 0, length); + return newBytes; + } + + public static byte[] trim(byte[] bytes, byte b){ + requireByteArrayNotEmpty(bytes); + byte[] newBytes = new byte[0]; + for(byte bb : bytes){ + if (bb != b){ + newBytes = appendByte(newBytes,bb); + } + } + return newBytes; + } + + public static byte[] appendByte(byte[] bytes, byte b) { + byte[] result = Arrays.copyOf(bytes, bytes.length + 1); + result[result.length - 1] = b; + return result; + } + + public static byte[] appendBytesArray(byte[] first, byte[] second){ + if (first == null){ + throw new NullPointerException("first byte array is null"); + } + if (second == null){ + throw new NullPointerException("second byte array is null"); + } + + byte[] newArray = new byte[first.length + second.length]; + System.arraycopy(first, 0, newArray, 0, first.length); + System.arraycopy(second, 0, newArray, first.length, second.length); + return newArray; + } + + public static void requireByteArrayNotEmpty(byte[] bytes){ + if (isEmpty(bytes)){ + throw new IllegalArgumentException("Input byte array is null or empty"); + } + } + + public static void requireByteArrayLengthNotLessThan(byte[] bytes, int length){ + if (bytes.length < length){ + throw new IllegalArgumentException("Input byte array length is less than " + length); + } + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/Crypto.java b/src/main/java/com/binance/dex/api/client/encoding/Crypto.java index 1e697097..e9b08fc0 100644 --- a/src/main/java/com/binance/dex/api/client/encoding/Crypto.java +++ b/src/main/java/com/binance/dex/api/client/encoding/Crypto.java @@ -5,6 +5,7 @@ import org.bitcoinj.core.Sha256Hash; import org.bitcoinj.core.Utils; import org.bitcoinj.crypto.*; +import org.bouncycastle.util.encoders.Hex; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -183,4 +184,5 @@ public static class SegwitAddressException extends IllegalArgumentException { super(s); } } + } diff --git a/src/main/java/com/binance/dex/api/client/encoding/EncodeUtils.java b/src/main/java/com/binance/dex/api/client/encoding/EncodeUtils.java index 2d0c6c7d..8a24a046 100644 --- a/src/main/java/com/binance/dex/api/client/encoding/EncodeUtils.java +++ b/src/main/java/com/binance/dex/api/client/encoding/EncodeUtils.java @@ -2,12 +2,15 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Charsets; import com.google.protobuf.CodedOutputStream; +import org.bouncycastle.jcajce.provider.digest.Keccak; import org.bouncycastle.util.encoders.Hex; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; public class EncodeUtils { @@ -25,6 +28,17 @@ public static String bytesToHex(byte[] bytes) { return Hex.toHexString(bytes); } + public static String bytesToPrefixHex(byte[] bytes) { + return "0x" + bytesToHex(bytes); + } + + public static String cleanHexPrefix(String s){ + if (s.startsWith("0x")){ + s = s.substring(2); + } + return s; + } + public static String toJsonStringSortKeys(Object object) throws JsonProcessingException { return OBJECT_MAPPER.writeValueAsString(object); } @@ -34,7 +48,7 @@ public static T toObjectFromJsonString(String jsonString,Class tClass) th } public static byte[] toJsonEncodeBytes(Object object) throws JsonProcessingException { - return toJsonStringSortKeys(object).getBytes(Charset.forName("UTF-8")); + return toJsonStringSortKeys(object).getBytes(Charsets.UTF_8); } public static byte[] aminoWrap(byte[] raw, byte[] typePrefix, boolean isPrefixLength) throws IOException { @@ -68,4 +82,20 @@ public static byte[] long2Bytes(long x){ return buffer.array(); } + public static ObjectMapper getObjectMapper() { + return OBJECT_MAPPER; + } + + public static String sha3String(String utf8String) { + return bytesToHex(sha3(utf8String.getBytes(StandardCharsets.UTF_8))); + } + public static byte[] sha3(byte[] input) { + return sha3(input, 0, input.length); + } + public static byte[] sha3(byte[] input, int offset, int length) { + Keccak.DigestKeccak kecc = new Keccak.Digest256(); + kecc.update(input, offset, length); + return kecc.digest(); + } + } diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/Amino.java b/src/main/java/com/binance/dex/api/client/encoding/amino/Amino.java new file mode 100644 index 00000000..5e66f4cd --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/Amino.java @@ -0,0 +1,445 @@ +package com.binance.dex.api.client.encoding.amino; + +import com.binance.dex.api.client.encoding.ByteUtil; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import org.bouncycastle.util.encoders.Hex; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; + +/** + * @author Fitz.Lu + **/ +public class Amino { + + private static final int disambiguationByteSize = 3; + + private static final int prefixByteSize = 4; + + /** + * > Amino Disamb and Prefix + * > hash := sha256("com.tendermint.consensus/MyConcreteName") + * > hex.EncodeBytes(hash) // 0x{00 00 A8 FC 54 00 00 00 BB 9C 83 DD ...} (example) + * > rest = dropLeadingZeroBytes(hash) // 0x{A8 FC 54 00 00 00 BB 9C 83 DD ...} + * > disamb = rest[0:3] + * > rest = dropLeadingZeroBytes(rest[3:]) + * > prefix = rest[0:4] + * > <0xA8 0xFC 0x54> [0xBB 0x9C 9x83 9xDD] // and [Prefix Bytes] + **/ + + /** + * Return disambiguation bytes from given name, the first three non-zero bytes + * + * @param name the name + */ + public byte[] nameToDisamb(String name) throws NoSuchAlgorithmException { + return nameToDisambPrefix(name).getDisamb(); + } + + /** + * Return prefix bytes from given name, the first four non-zero bytes + * + * @param name the name + */ + public byte[] nameToPrefix(String name) throws NoSuchAlgorithmException { + return nameToDisambPrefix(name).getPrefix(); + } + + public String nameToPrefixString(String name) throws NoSuchAlgorithmException { + return Hex.toHexString(nameToDisambPrefix(name).getPrefix()); + } + + /** + * Return disambiguation and prefix bytes pair from given name + * + * @param name the name + * @see DisambPrefix + */ + public DisambPrefix nameToDisambPrefix(String name) throws NoSuchAlgorithmException { + DisambPrefix disambPrefix = new DisambPrefix(); + byte[] nameHash = new byte[0]; + nameHash = dropLeadingZero(AminoHashing.sha256(name)); + disambPrefix.setDisamb(Arrays.copyOfRange(nameHash, 0, disambiguationByteSize)); + + byte[] rest = Arrays.copyOfRange(nameHash, disambiguationByteSize, nameHash.length); + disambPrefix.setPrefix(Arrays.copyOfRange(dropLeadingZero(rest), 0, prefixByteSize)); + + byte[] dp = new byte[disambiguationByteSize + prefixByteSize]; + System.arraycopy(disambPrefix.getDisamb(), 0, dp, 0, disambiguationByteSize); + System.arraycopy(disambPrefix.getPrefix(), 0, dp, disambiguationByteSize, prefixByteSize); + + disambPrefix.setDisambPrefix(dp); + + return disambPrefix; + } + + private byte[] dropLeadingZero(byte[] byteArray) { + int offset = 0; + for (byte oneByte : byteArray) { + if (oneByte != 0) { + break; + } + offset++; + } + return Arrays.copyOfRange(byteArray, offset, byteArray.length); + + } + + /** + * > Amino encode + * */ + public byte[] encode(AminoSerializable message, byte[] typePrefix, boolean lengthPrefix) throws IOException { + boolean writeTypePrefix = false; + boolean writeLengthPrefix = false; + int length = computeSerializedSize(message); + + if (typePrefix != null && typePrefix.length > 0){ + length += typePrefix.length; + writeTypePrefix = true; + } + + int bufSize = length; + + if (lengthPrefix){ + bufSize += computeLengthByteSize(length); + writeLengthPrefix = true; + } + byte[] buf = new byte[bufSize]; + CodedOutputStream outputStream = CodedOutputStream.newInstance(buf); + + if (writeLengthPrefix){ + encodeLengthByte(length, outputStream); + } + + if (writeTypePrefix) { + outputStream.writeRawBytes(typePrefix); + } + + encodeAminoMessageBare(message, outputStream); + + outputStream.flush(); + + return buf; + } + + private void encodeAminoMessageBare(AminoSerializable message, CodedOutputStream outputStream) throws IOException { + int index = 0; + for (AminoField field : message.IterateFields()) { + index ++; + + if (field.isSkipWhenEncode() || field.getT() == null){ + continue; + } + + if (field.getT() instanceof AminoCustomSerialized){ + encodeAminoSerialized(index, (AminoCustomSerialized) field.getT(), outputStream); + continue; + } + + if (field.getT() instanceof AminoSerializable) { + outputStream.writeTag(index, WireType.LENGTH_DELIMITED); + int length = computeSerializedSize(((AminoSerializable) field.getT())); + encodeLengthByte(length, outputStream); + encodeAminoMessageBare(((AminoSerializable) field.getT()), outputStream); + continue; + } + + if (field.getT() instanceof String){ + encodeString(index, (String) field.getT(), outputStream); + continue; + } + + if (field.getT() instanceof byte[]){ + encodeByteArray(index, ((byte[]) field.getT()), outputStream); + continue; + } + + if (field.getT() instanceof Long){ + encodeInt64(index, ((Long) field.getT()), outputStream); + continue; + } + + if (field.getT() instanceof Integer){ + encodeInt32(index, (Integer) field.getT(), outputStream); + continue; + } + } + } + + public void decodeBare(byte[] data, AminoSerializable message) throws IOException, AminoDecodeException { + CodedInputStream input = CodedInputStream.newInstance(data); + try { + decode(input, message); + } catch (IllegalAccessException | InstantiationException e) { + throw new AminoDecodeException(e); + } + } + + public void decodeWithLengthPrefix(byte[] data, AminoSerializable message) throws IOException, AminoDecodeException { + CodedInputStream input = CodedInputStream.newInstance(data); + if (input.isAtEnd()){ + return; + } + + int length = input.readRawVarint32(); + if (length == 0){ + return; + } + + try { + decode(input, message); + } catch (IllegalAccessException | InstantiationException e) { + throw new AminoDecodeException(e); + } + } + + public static byte[] getByteArrayAfterTypePrefix(byte[] data) throws IllegalStateException { + byte[] typePrefix = ByteUtil.read(data, prefixByteSize); + //todo match type prefix from registered map + int length = Byte.toUnsignedInt(data[4]); + if (data.length - prefixByteSize - 1 != length){ + throw new IllegalStateException("Invalid Amino buffer"); + } + return ByteUtil.pick(data, prefixByteSize + 1, length); + } + + private void decode(CodedInputStream input, AminoSerializable message) throws IOException, IllegalAccessException, InstantiationException { + int index = 0; + int tag = 0; + boolean pendTag = false; + for (AminoField iterateField : message.IterateFields()) { + index ++; + + if (!pendTag) { + tag = input.readTag(); + } + + int currentFieldTag = computeTag(index, iterateField.getClazz()); + + if (currentFieldTag != tag){ + pendTag = true; + continue; + }else{ + pendTag = false; + } + + if (AminoCustomSerialized.class.isAssignableFrom(iterateField.getClazz())){ + Object obj; + if (iterateField.getT() != null){ + ((AminoCustomSerialized) iterateField.getT()).decode(input); + obj = iterateField.getT(); + }else{ + Object serializedObj = iterateField.getClazz().newInstance(); + ((AminoCustomSerialized) serializedObj).decode(input); + obj = serializedObj; + } + message.setValueByFieldIndex(index, obj); + continue; + } + + if (AminoSerializable.class.isAssignableFrom(iterateField.getClazz())){ + int length = input.readRawVarint32(); + if (length == 0){ + continue; + } + Object msg; + if (iterateField.getT() != null){ + msg = iterateField.getT(); + }else{ + msg = iterateField.getClazz().newInstance(); + } + + final int oldLimit = input.pushLimit(length); + decode(input, ((AminoSerializable) msg)); + //update lastTag in input stream + int emptyTag = input.readTag(); + //check is at the end + if (emptyTag != 0){ + throw new AminoDecodeException("Embedded message tag did not match expected tag"); + } + //double check + input.checkLastTagWas(0); + input.popLimit(oldLimit); + + message.setValueByFieldIndex(index, msg); + continue; + } + + if (iterateField.getClazz().isAssignableFrom(Boolean.class)){ + message.setValueByFieldIndex(index, input.readBool()); + continue; + } + + if (iterateField.getClazz().isAssignableFrom(Integer.class)){ + message.setValueByFieldIndex(index, input.readInt32()); + continue; + } + + if (iterateField.getClazz().isAssignableFrom(Long.class)){ + message.setValueByFieldIndex(index, input.readInt64()); + continue; + } + + if (iterateField.getClazz().isAssignableFrom(String.class)){ + message.setValueByFieldIndex(index, input.readStringRequireUtf8()); + continue; + } + + if (iterateField.getClazz().isAssignableFrom(byte[].class)){ + byte[] value = input.readByteArray(); + message.setValueByFieldIndex(index, value); + continue; + } + } + } + + private void encodeAminoSerialized(int fieldIndex, AminoCustomSerialized aminoCustomSerialized, CodedOutputStream outputStream) throws IOException { + if (!aminoCustomSerialized.isDefaultOrEmpty()) { + outputStream.writeTag(fieldIndex, aminoCustomSerialized.getWireType()); + aminoCustomSerialized.encode(outputStream); + } + } + + private void encodeString(int fieldIndex, String value, CodedOutputStream outputStream) throws IOException { + outputStream.writeTag(fieldIndex, WireType.LENGTH_DELIMITED); + outputStream.writeStringNoTag(value); + } + + private void encodeByteArray(int fieldIndex, byte[] array, CodedOutputStream outputStream) throws IOException { + outputStream.writeTag(fieldIndex, WireType.LENGTH_DELIMITED); + outputStream.writeByteArrayNoTag(array); + } + + private void encodeInt64(int fieldIndex, long value, CodedOutputStream outputStream) throws IOException { + outputStream.writeTag(fieldIndex, WireType.VARINT); + outputStream.writeInt64NoTag(value); + } + + private void encodeInt32(int fieldIndex, int value, CodedOutputStream outputStream) throws IOException { + outputStream.writeTag(fieldIndex, WireType.VARINT); + outputStream.writeInt32NoTag(value); + } + + private void encodeUInt32Bare(int value, CodedOutputStream codedOutputStream) throws IOException { + codedOutputStream.writeUInt32NoTag(value); + } + + private void encodeLengthByte(int length, CodedOutputStream codedOutputStream) throws IOException { + codedOutputStream.writeUInt32NoTag(length); + } + + public int computeSerializedSize(AminoSerializable message){ + int size = 0; + int index = 0; + for (AminoField iterateField : message.IterateFields()) { + index ++; + + if (iterateField.isSkipWhenEncode() || iterateField.getT() == null){ + continue; + } + + if (iterateField.getT() instanceof AminoCustomSerialized){ + size += computeTagSize(index, ((AminoCustomSerialized) iterateField.getT()).getWireType()); + size += ((AminoCustomSerialized) iterateField.getT()).getSerializedSize(); + continue; + } + + if (iterateField.getT() instanceof AminoSerializable){ + size += computeTagSize(index, WireType.LENGTH_DELIMITED); + int embeddedSize = computeSerializedSize(((AminoSerializable) iterateField.getT())); + size += computeLengthByteSize(embeddedSize); + size += embeddedSize; + continue; + } + + if (iterateField.getT() instanceof String){ + size += computeTagSize(index, WireType.LENGTH_DELIMITED); + size += computeStringSize(((String)iterateField.getT())); + continue; + } + + if (iterateField.getT() instanceof byte[]) { + size += computeTagSize(index, WireType.LENGTH_DELIMITED); + size += computeByteArraySize(((byte[]) iterateField.getT())); + continue; + } + + if (iterateField.getT() instanceof Long){ + size += computeTagSize(index, WireType.VARINT); + size += computeInt64Size(((Long) iterateField.getT())); + continue; + } + + if (iterateField.getT() instanceof Integer){ + size += computeTagSize(index, WireType.VARINT); + size += computeInt32Size((Integer) iterateField.getT()); + continue; + } + } + + return size; + } + + private int computeTagSize(final int fieldNumber, final int wireType){ + return CodedOutputStream.computeUInt32SizeNoTag(makeTag(fieldNumber, wireType)); + } + + private int computeByteArraySize(final byte[] bytes){ + return CodedOutputStream.computeByteArraySizeNoTag(bytes); + } + + private int computeStringSize(final String str){ + return CodedOutputStream.computeStringSizeNoTag(str); + } + + private int computeInt32Size(final int value){ + return CodedOutputStream.computeInt32SizeNoTag(value); + } + + private int computeUInt32Size(final int value){ + return CodedOutputStream.computeUInt32SizeNoTag(value); + } + + private int computeLengthByteSize(final int length){ + return CodedOutputStream.computeUInt32SizeNoTag(length); + } + + private int computeInt64Size(final long value){ + return CodedOutputStream.computeInt64SizeNoTag(value); + } + + private int computeUInt64Size(final long value){ + return CodedOutputStream.computeUInt64SizeNoTag(value); + } + + private int computeTag(int fieldIndex, Class clazz){ + if (AminoCustomSerialized.class.isAssignableFrom(clazz) || + AminoSerializable.class.isAssignableFrom(clazz) || + clazz.isAssignableFrom(byte[].class) || + clazz.isAssignableFrom(String.class)){ + return makeTag(fieldIndex, WireType.LENGTH_DELIMITED); + } + + if (clazz.isAssignableFrom(Long.class) || + clazz.isAssignableFrom(Integer.class) || + clazz.isAssignableFrom(Boolean.class)) { + return makeTag(fieldIndex, WireType.VARINT); + } + + throw new IllegalArgumentException("Unsupported class " + clazz.getCanonicalName()); + } + + private int makeTag(final int fieldNumber, final int wireType){ + return (fieldNumber << 3) | wireType; + } + + private byte[] appendBytesArray(byte[] first, byte[] second){ + byte[] newArray = new byte[first.length + second.length]; + System.arraycopy(first, 0, newArray, 0, first.length); + System.arraycopy(second, 0, newArray, first.length, second.length); + return newArray; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/AminoCustomSerialized.java b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoCustomSerialized.java new file mode 100644 index 00000000..ac949fd3 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoCustomSerialized.java @@ -0,0 +1,25 @@ +package com.binance.dex.api.client.encoding.amino; + +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +public interface AminoCustomSerialized { + + AminoCustomSerialized newAminoSerInstance(); + + boolean isDefaultOrEmpty(); + + void encode(CodedOutputStream outputStream) throws IOException; + + int getWireType(); + + void decode(CodedInputStream inputStream) throws IOException; + + int getSerializedSize(); + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/AminoDecodeException.java b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoDecodeException.java new file mode 100644 index 00000000..eec80060 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoDecodeException.java @@ -0,0 +1,26 @@ +package com.binance.dex.api.client.encoding.amino; + +/** + * @author Fitz.Lu + **/ +public class AminoDecodeException extends RuntimeException { + + public AminoDecodeException() { + } + + public AminoDecodeException(String message) { + super(message); + } + + public AminoDecodeException(String message, Throwable cause) { + super(message, cause); + } + + public AminoDecodeException(Throwable cause) { + super(cause); + } + + public AminoDecodeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/AminoField.java b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoField.java new file mode 100644 index 00000000..d3c2a443 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoField.java @@ -0,0 +1,70 @@ +package com.binance.dex.api.client.encoding.amino; + +import javax.annotation.Nullable; +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class AminoField { + + public static AminoFieldsBuilder newFieldsBuilder(){ + return new AminoFieldsBuilder(); + } + + private Class clazz; + + private T t; + + private boolean skipWhenEncode = false; + + public AminoField(Class clazz, @Nullable T t, boolean skipWhenEncode) { + this.clazz = clazz; + this.t = t; + this.skipWhenEncode = skipWhenEncode; + } + + public Class getClazz() { + return clazz; + } + + public void setClazz(Class clazz) { + this.clazz = clazz; + } + + public T getT() { + return t; + } + + public void setT(T t) { + this.t = t; + } + + public boolean isSkipWhenEncode() { + return skipWhenEncode; + } + + public void setSkipWhenEncode(boolean skipWhenEncode) { + this.skipWhenEncode = skipWhenEncode; + } + + public static class AminoFieldsBuilder { + + private final ArrayList> fields; + + public AminoFieldsBuilder(){ + fields = new ArrayList<>(); + } + + public AminoFieldsBuilder addField(Class clazz, T2 value, boolean skipWhenEncode){ + fields.add(new AminoField<>(clazz, value, skipWhenEncode)); + return this; + } + + public ArrayList> build(){ + return fields; + } + + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/AminoHashing.java b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoHashing.java new file mode 100644 index 00000000..9f769cb9 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoHashing.java @@ -0,0 +1,44 @@ +package com.binance.dex.api.client.encoding.amino; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * author: Fitz + **/ +class AminoHashing { + + private final static char[] hexArray = "0123456789ABCDEF".toCharArray(); + private final static String SHA256 = "SHA-256"; + + public static byte[] sha256(byte[] arg) throws NoSuchAlgorithmException { + MessageDigest digest = MessageDigest.getInstance(SHA256); + return digest.digest(arg); + } + + public static byte[] sha256(String arg) throws NoSuchAlgorithmException { + MessageDigest digest = MessageDigest.getInstance(SHA256); + return digest.digest(arg.getBytes(StandardCharsets.UTF_8)); + } + + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + for ( int i = 0; i < bytes.length; i++ ) { + int v = bytes[i] & 0xFF; + hexChars[i * 2] = hexArray[v >>> 4]; + hexChars[i * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + } + + public static byte[] hexToBytes(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); + } + return data; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/AminoSerializable.java b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoSerializable.java new file mode 100644 index 00000000..122552d5 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/AminoSerializable.java @@ -0,0 +1,16 @@ +package com.binance.dex.api.client.encoding.amino; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public interface AminoSerializable { + + AminoSerializable newAminoMessage(); + + ArrayList> IterateFields(); + + void setValueByFieldIndex(int fieldIndex, Object value); + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/DisambPrefix.java b/src/main/java/com/binance/dex/api/client/encoding/amino/DisambPrefix.java new file mode 100644 index 00000000..f9878236 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/DisambPrefix.java @@ -0,0 +1,65 @@ +package com.binance.dex.api.client.encoding.amino; + +import java.util.Arrays; + +/** + * Disambiguation and prefix pair + * */ +public class DisambPrefix { + + /** + * The first three non-zero bytes + * */ + private byte[] disamb; + + /** + * The first four non-zero bytes + * */ + private byte[] prefix; + + /** + * disamb bytes append prefix bytes + * */ + private byte[] disambPrefix; + + public DisambPrefix() { } + + public DisambPrefix(byte[] disamb, byte[] prefix, byte[] disambPrefix) { + this.disamb = disamb; + this.prefix = prefix; + this.disambPrefix = disambPrefix; + } + + public byte[] getDisamb() { + return disamb; + } + + public void setDisamb(byte[] disamb) { + this.disamb = disamb; + } + + public byte[] getPrefix() { + return prefix; + } + + public void setPrefix(byte[] prefix) { + this.prefix = prefix; + } + + public byte[] getDisambPrefix() { + return disambPrefix; + } + + public void setDisambPrefix(byte[] disambPrefix) { + this.disambPrefix = disambPrefix; + } + + @Override + public String toString() { + return "DisambPrefixPair{" + + "disamb=" + Arrays.toString(disamb) + + ", prefix=" + Arrays.toString(prefix) + + ", disambPrefix=" + Arrays.toString(disambPrefix) + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/InternalAmino.java b/src/main/java/com/binance/dex/api/client/encoding/amino/InternalAmino.java new file mode 100644 index 00000000..d85f5060 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/InternalAmino.java @@ -0,0 +1,14 @@ +package com.binance.dex.api.client.encoding.amino; + +/** + * @author Fitz.Lu + **/ +public class InternalAmino { + + private static final Amino ins = new Amino(); + + public static Amino get(){ + return ins; + } + +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/WireType.java b/src/main/java/com/binance/dex/api/client/encoding/amino/WireType.java new file mode 100644 index 00000000..c8e4fed5 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/WireType.java @@ -0,0 +1,79 @@ +package com.binance.dex.api.client.encoding.amino; + +import com.binance.dex.api.client.encoding.amino.types.PubKeyEd25519; +import com.binance.dex.api.client.encoding.message.beaconchain.transaction.*; +import com.binance.dex.api.client.encoding.message.bridge.BindMsgMessage; +import com.binance.dex.api.client.encoding.message.bridge.ClaimMsgMessage; +import com.binance.dex.api.client.encoding.message.bridge.TransferOutMsgMessage; +import com.binance.dex.api.client.encoding.message.bridge.UnbindMsgMessage; +import com.binance.dex.api.client.encoding.message.sidechain.transaction.*; +import org.bouncycastle.util.encoders.Hex; + +import java.security.NoSuchAlgorithmException; +import java.util.HashMap; + +/** + * @author Fitz.Lu + * @see {https://developers.google.com/protocol-buffers/docs/encoding#structure} + **/ +public class WireType { + + private static final HashMap, String> classToTypeName = new HashMap<>(); + + static { + classToTypeName.put(PubKeyEd25519.class, "tendermint/PubKeyEd25519"); + + classToTypeName.put(CreateBeaconChainValidatorMessage.class, "cosmos-sdk/MsgCreateValidatorOpen"); + classToTypeName.put(EditBeaconChainValidatorMessage.class, "cosmos-sdk/MsgEditValidator"); + classToTypeName.put(BeaconChainDelegateMessage.class, "cosmos-sdk/MsgDelegate"); + classToTypeName.put(BeaconChainRedelegateMessage.class, "cosmos-sdk/MsgRedelegate"); + classToTypeName.put(BeaconChainUndelegateMessage.class, "cosmos-sdk/MsgUndelegate"); + + classToTypeName.put(CreateSideChainValidatorMessage.class, "cosmos-sdk/MsgCreateSideChainValidator"); + classToTypeName.put(EditSideChainValidatorMessage.class, "cosmos-sdk/MsgEditSideChainValidator"); + classToTypeName.put(SideChainDelegateMessage.class, "cosmos-sdk/MsgSideChainDelegate"); + classToTypeName.put(SideChainRedelegateMessage.class, "cosmos-sdk/MsgSideChainRedelegate"); + classToTypeName.put(SideChainUndelegateMessage.class, "cosmos-sdk/MsgSideChainUndelegate"); + + classToTypeName.put(TransferOutMsgMessage.class, "bridge/TransferOutMsg"); + classToTypeName.put(BindMsgMessage.class, "bridge/BindMsg"); + classToTypeName.put(UnbindMsgMessage.class, "bridge/UnbindMsg"); + classToTypeName.put(ClaimMsgMessage.class, "oracle/ClaimMsg"); + } + + public static int VARINT = 0; //int32, int64, uint32, uint64, sint32, sint64, bool, enum + + public static int BIT64 = 1; //fixed64, sfixed64, double + + public static int LENGTH_DELIMITED = 2; //string, bytes, embedded messages, packed repeated fields + + public static int BIT_32 = 5; // fixed32, sfixed32, float + + + public static boolean isRegistered(Class clazz){ + return classToTypeName.containsKey(clazz); + } + + public static boolean isRegistered(byte[] typePrefix){ + String typeHex = Hex.toHexString(typePrefix); + for (String value : classToTypeName.values()) { + if (typeHex.equals(value)){ + return true; + } + } + + return false; + } + + public static String getRegisteredTypeName(Class clazz) { + return classToTypeName.get(clazz); + } + + public static byte[] getTypePrefix(Class clazz) throws IllegalStateException, NoSuchAlgorithmException { + if (!isRegistered(clazz)){ + throw new IllegalStateException("class " + clazz.getCanonicalName() + " has not been registered into amino"); + } + return InternalAmino.get().nameToPrefix(getRegisteredTypeName(clazz)); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/types/PubKey.java b/src/main/java/com/binance/dex/api/client/encoding/amino/types/PubKey.java new file mode 100644 index 00000000..9d202206 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/types/PubKey.java @@ -0,0 +1,10 @@ +package com.binance.dex.api.client.encoding.amino.types; + +/** + * @author Fitz.Lu + **/ +public interface PubKey { + + byte[] getBytes(); + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/amino/types/PubKeyEd25519.java b/src/main/java/com/binance/dex/api/client/encoding/amino/types/PubKeyEd25519.java new file mode 100644 index 00000000..2aaaefc8 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/amino/types/PubKeyEd25519.java @@ -0,0 +1,28 @@ +package com.binance.dex.api.client.encoding.amino.types; + +/** + * @author Fitz.Lu + **/ +public class PubKeyEd25519 implements PubKey { + + private final int keySize = 32; + + private byte[] raw; + + public PubKeyEd25519(byte[] raw) { + this.raw = raw; + } + + public byte[] getRaw() { + return raw; + } + + public void setRaw(byte[] raw) { + this.raw = raw; + } + + @Override + public byte[] getBytes() { + return raw; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/BinanceDexTransactionMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/BinanceDexTransactionMessage.java index d293be0a..ea31b311 100644 --- a/src/main/java/com/binance/dex/api/client/encoding/message/BinanceDexTransactionMessage.java +++ b/src/main/java/com/binance/dex/api/client/encoding/message/BinanceDexTransactionMessage.java @@ -1,4 +1,11 @@ package com.binance.dex.api.client.encoding.message; public interface BinanceDexTransactionMessage { + + default boolean useAminoJson(){ + return false; + } + + default void validateBasic(){} + } diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/MessageType.java b/src/main/java/com/binance/dex/api/client/encoding/message/MessageType.java index b3bd921a..bf0c3c54 100644 --- a/src/main/java/com/binance/dex/api/client/encoding/message/MessageType.java +++ b/src/main/java/com/binance/dex/api/client/encoding/message/MessageType.java @@ -5,7 +5,7 @@ import java.util.Arrays; /** - * Binance dex standard transactiont types. + * Binance dex standard transaction types. */ public enum MessageType { Send("2A2C87FA"), @@ -17,11 +17,15 @@ public enum MessageType { PubKey("EB5AE987"), StdTx("F0625DEE"), Vote("A1CADD36"), + SideVote("E26BA13D"), Issue("17EFAB80"), Burn("7ED2D2A0"), Mint("467E0829"), + TransferTokenOwnership("6D99D273"), SubmitProposal("B42D614E"), + SideSubmitProposal("4ACBF03C"), Deposit("A18A56E5"), + SideDeposit("140F2DB4"), CreateValidator("DB6A19FD"), RemoveValidator("C1AFE85F"), Listing("B41DE13F"), @@ -32,7 +36,39 @@ public enum MessageType { HashTimerLockTransferMsg("B33F9A24"), DepositHashTimerLockMsg("63986496"), ClaimHashTimerLockMsg("C1665300"), - RefundHashTimerLockMsg("3454A27C"); + RefundHashTimerLockMsg("3454A27C"), + CreateSideChainValidator("D17201E5"), + EditSideChainValidator("264CC57B"), + SideChainDelegate("E3A07FD2"), + SideChainRedelegate("E3CED364"), + SideChainUndelegate("514F7E0E"), + Claim("175A0521"), + TransferOut("800819C0"), + Bind("B9AE640C"), + UnBind("E9EEC508"), + BscSubmitEvidence("A38F1399"), + SideChainUnJail("5681EC54"), + + //mini token + TinyTokenIssue("ED2832D4"), + MiniTokenIssue("A3F16C41"), + MiniTokenSetURI("7B1D34E7"), + MiniTokenList("4C264019"), + + // open staking + CreateBeaconChainValidator("E9FB7335"), + EditBeaconChainValidator("C2E8BCCD"), + BeaconChainDelegate("921D2E4E"), + BeaconChainRedelegate("47A5ED9C"), + BeaconChainUndelegate("5C80810D"), + UnJail("543AEC70"), + + // fast finality + CreateSideChainValidatorWithVoteAddr("A0032998"), + EditSideChainValidatorWithVoteAddr("852FDADD"), + + SideChainStakeMigration("38589196"); + private byte[] typePrefixBytes; MessageType(String typePrefix) { diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/SideVoteMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/SideVoteMessage.java new file mode 100644 index 00000000..11b0f6a9 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/SideVoteMessage.java @@ -0,0 +1,67 @@ +package com.binance.dex.api.client.encoding.message; + +import com.binance.dex.api.client.BinanceDexConstants; +import com.binance.dex.api.client.encoding.VoteOptionSerializer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class SideVoteMessage implements BinanceDexTransactionMessage { + + @JsonProperty("proposal_id") + @JsonSerialize(using = ToStringSerializer.class) + private Long proposalId; + private String voter; + @JsonSerialize(using = VoteOptionSerializer.class) + private Integer option; + @JsonProperty("side_chain_id") + private String sideChainId; + + public Long getProposalId() { + return proposalId; + } + + public void setProposalId(Long proposalId) { + this.proposalId = proposalId; + } + + public Integer getOption() { + return option; + } + + public void setOption(Integer option) { + this.option = option; + } + + public String getVoter() { + return voter; + } + + public void setVoter(String voter) { + this.voter = voter; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceDexConstants.BINANCE_DEX_TO_STRING_STYLE) + .append("proposalId", proposalId) + .append("option", option) + .append("sideChainId",sideChainId) + .toString(); + } + + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/Token.java b/src/main/java/com/binance/dex/api/client/encoding/message/Token.java index ddf47e96..39df5c20 100644 --- a/src/main/java/com/binance/dex/api/client/encoding/message/Token.java +++ b/src/main/java/com/binance/dex/api/client/encoding/message/Token.java @@ -3,13 +3,16 @@ import com.binance.dex.api.client.BinanceDexConstants; import com.binance.dex.api.proto.Send; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import org.apache.commons.lang3.builder.ToStringBuilder; @JsonIgnoreProperties(ignoreUnknown = true) @JsonPropertyOrder(alphabetic = true) public class Token { + @JsonProperty(value = "denom") private String denom; + @JsonProperty(value = "amount") private Long amount; public static Token of(com.binance.dex.api.proto.Token source) { @@ -26,6 +29,14 @@ public static Token of(Send.Token sendToken){ return token; } + public Token() { + } + + public Token(String denom, Long amount) { + this.denom = denom; + this.amount = amount; + } + public String getDenom() { return denom; } diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/TransactionMessageWithType.java b/src/main/java/com/binance/dex/api/client/encoding/message/TransactionMessageWithType.java new file mode 100644 index 00000000..aad19311 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/TransactionMessageWithType.java @@ -0,0 +1,43 @@ +package com.binance.dex.api.client.encoding.message; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class TransactionMessageWithType implements BinanceDexTransactionMessage { + + @JsonProperty(value = "type") + private String type; + + @JsonProperty(value = "value") + private T value; + + public TransactionMessageWithType() { + } + + public TransactionMessageWithType(String type, T value) { + this.type = type; + this.value = value; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/TransactionRequestAssembler.java b/src/main/java/com/binance/dex/api/client/encoding/message/TransactionRequestAssembler.java index 626a71aa..ab1e0e4b 100644 --- a/src/main/java/com/binance/dex/api/client/encoding/message/TransactionRequestAssembler.java +++ b/src/main/java/com/binance/dex/api/client/encoding/message/TransactionRequestAssembler.java @@ -4,8 +4,13 @@ import com.binance.dex.api.client.domain.broadcast.*; import com.binance.dex.api.client.encoding.Crypto; import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.encoding.amino.Amino; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.amino.InternalAmino; +import com.binance.dex.api.client.encoding.amino.WireType; import com.binance.dex.api.proto.StdSignature; import com.binance.dex.api.proto.StdTx; +import com.binance.dex.api.proto.TransferTokenOwnershipMsg; import com.google.common.annotations.VisibleForTesting; import com.google.protobuf.ByteString; import okhttp3.RequestBody; @@ -28,9 +33,12 @@ public class TransactionRequestAssembler { private Wallet wallet; private TransactionOption options; + private final Amino amino; + public TransactionRequestAssembler(Wallet wallet, TransactionOption options) { this.wallet = wallet; this.options = options; + this.amino = InternalAmino.get(); } public static long doubleToLong(String d) { @@ -49,6 +57,23 @@ public static String longToDouble(long l) { return BigDecimal.valueOf(l).divide(MULTIPLY_FACTOR).toString(); } + @VisibleForTesting + byte[] signTx(BinanceDexTransactionMessage msg) throws IOException, NoSuchAlgorithmException { + return sign(assembleMessage4Sign(msg)); + } + + private BinanceDexTransactionMessage assembleMessage4Sign(T t) { + if (t.useAminoJson()) { + if (WireType.isRegistered(t.getClass())) { + return new TransactionMessageWithType(WireType.getRegisteredTypeName(t.getClass()), t); + } else { + throw new IllegalStateException("Class " + t.getClass().getCanonicalName() + " has not been registered into amino"); + } + } else { + return t; + } + } + @VisibleForTesting byte[] sign(BinanceDexTransactionMessage msg) throws NoSuchAlgorithmException, IOException { @@ -64,6 +89,7 @@ byte[] sign(BinanceDexTransactionMessage msg) if (wallet.getEcKey() == null && wallet.getLedgerKey() != null) { return Crypto.sign(EncodeUtils.toJsonEncodeBytes(sd), wallet.getLedgerKey()); } + return Crypto.sign(EncodeUtils.toJsonEncodeBytes(sd), wallet.getEcKey()); } @@ -117,7 +143,7 @@ NewOrderMessage createNewOrderMessage( } @VisibleForTesting - VoteMessage createVoteMessage(Vote vote){ + VoteMessage createVoteMessage(Vote vote) { VoteMessage voteMessage = new VoteMessage(); voteMessage.setProposalId(vote.getProposalId()); voteMessage.setOption(vote.getOption()); @@ -125,6 +151,16 @@ VoteMessage createVoteMessage(Vote vote){ return voteMessage; } + @VisibleForTesting + SideVoteMessage createSideVoteMessage(SideVote vote) { + SideVoteMessage voteMessage = new SideVoteMessage(); + voteMessage.setProposalId(vote.getProposalId()); + voteMessage.setOption(vote.getOption()); + voteMessage.setVoter(wallet.getAddress()); + voteMessage.setSideChainId(vote.getSideChainId()); + return voteMessage; + } + @VisibleForTesting byte[] encodeNewOrderMessage(NewOrderMessage newOrder) throws IOException { @@ -152,13 +188,25 @@ byte[] encodeVoteMessage(VoteMessage voteMessage) return EncodeUtils.aminoWrap(proto.toByteArray(), MessageType.Vote.getTypePrefixBytes(), false); } + @VisibleForTesting + byte[] encodeSideVoteMessage(SideVoteMessage voteMessage) + throws IOException { + com.binance.dex.api.proto.SideVote proto = com.binance.dex.api.proto.SideVote.newBuilder() + .setVoter(ByteString.copyFrom(wallet.getAddressBytes())) + .setProposalId(voteMessage.getProposalId()) + .setOption(voteMessage.getOption()) + .setSideChainId(voteMessage.getSideChainId()) + .build(); + return EncodeUtils.aminoWrap(proto.toByteArray(), MessageType.SideVote.getTypePrefixBytes(), false); + } + public RequestBody buildNewOrder(com.binance.dex.api.client.domain.broadcast.NewOrder newOrder) throws IOException, NoSuchAlgorithmException { return createRequestBody(buildNewOrderPayload(newOrder)); } public String buildNewOrderPayload(com.binance.dex.api.client.domain.broadcast.NewOrder newOrder) - throws IOException, NoSuchAlgorithmException { + throws IOException, NoSuchAlgorithmException { NewOrderMessage msgBean = createNewOrderMessage(newOrder); byte[] msg = encodeNewOrderMessage(msgBean); byte[] signature = encodeSignature(sign(msgBean)); @@ -178,6 +226,18 @@ public String buildVotePayload(Vote vote) throws IOException, NoSuchAlgorithmExc return EncodeUtils.bytesToHex(stdTx); } + public RequestBody buildSideVote(SideVote vote) throws IOException, NoSuchAlgorithmException { + return createRequestBody(buildSideVotePayload(vote)); + } + + public String buildSideVotePayload(SideVote vote) throws IOException, NoSuchAlgorithmException { + SideVoteMessage msgBean = createSideVoteMessage(vote); + byte[] msg = encodeSideVoteMessage(msgBean); + byte[] signature = encodeSignature(sign(msgBean)); + byte[] stdTx = encodeStdTx(msg, signature); + return EncodeUtils.bytesToHex(stdTx); + } + @VisibleForTesting CancelOrderMessage createCancelOrderMessage( com.binance.dex.api.client.domain.broadcast.CancelOrder cancelOrder) { @@ -206,7 +266,7 @@ public RequestBody buildCancelOrder(com.binance.dex.api.client.domain.broadcast. } public String buildCancelOrderPayload(com.binance.dex.api.client.domain.broadcast.CancelOrder cancelOrder) - throws IOException, NoSuchAlgorithmException { + throws IOException, NoSuchAlgorithmException { CancelOrderMessage msgBean = createCancelOrderMessage(cancelOrder); byte[] msg = encodeCancelOrderMessage(msgBean); byte[] signature = encodeSignature(sign(msgBean)); @@ -282,7 +342,7 @@ public RequestBody buildTransfer(Transfer transfer) } public String buildTransferPayload(Transfer transfer) - throws IOException, NoSuchAlgorithmException { + throws IOException, NoSuchAlgorithmException { TransferMessage msgBean = createTransferMessage(transfer); byte[] msg = encodeTransferMessage(msgBean); byte[] signature = encodeSignature(sign(msgBean)); @@ -316,7 +376,7 @@ public RequestBody buildTokenFreeze(TokenFreeze freeze) } public String buildTokenFreezePayload(TokenFreeze freeze) - throws IOException, NoSuchAlgorithmException { + throws IOException, NoSuchAlgorithmException { TokenFreezeMessage msgBean = createTokenFreezeMessage(freeze); byte[] msg = encodeTokenFreezeMessage(msgBean); byte[] signature = encodeSignature(sign(msgBean)); @@ -350,7 +410,7 @@ public RequestBody buildTokenUnfreeze(TokenUnfreeze unfreeze) } public String buildTokenUnfreezePayload(TokenUnfreeze unfreeze) - throws IOException, NoSuchAlgorithmException { + throws IOException, NoSuchAlgorithmException { TokenUnfreezeMessage msgBean = createTokenUnfreezeMessage(unfreeze); byte[] msg = encodeTokenUnfreezeMessage(msgBean); byte[] signature = encodeSignature(sign(msgBean)); @@ -362,11 +422,11 @@ public String buildTokenUnfreezePayload(TokenUnfreeze unfreeze) TransferMessage createMultiTransferMessage(MultiTransfer multiTransfer) { Map inputsCoins = new TreeMap(); ArrayList outputs = new ArrayList<>(); - for (Output o: multiTransfer.getOutputs()) { + for (Output o : multiTransfer.getOutputs()) { InputOutput out = new InputOutput(); out.setAddress(o.getAddress()); List tokens = new ArrayList<>(o.getTokens().size()); - for (OutputToken t: o.getTokens()) { + for (OutputToken t : o.getTokens()) { Token token = new Token(); token.setDenom(t.getCoin()); long amount = doubleToLong(t.getAmount()); @@ -388,7 +448,7 @@ TransferMessage createMultiTransferMessage(MultiTransfer multiTransfer) { InputOutput input = new InputOutput(); input.setAddress(multiTransfer.getFromAddress()); List inputTokens = new ArrayList<>(inputsCoins.size()); - for (String coin: inputsCoins.keySet()) { + for (String coin : inputsCoins.keySet()) { Token token = new Token(); token.setDenom(coin); token.setAmount(inputsCoins.get(coin)); @@ -402,7 +462,7 @@ TransferMessage createMultiTransferMessage(MultiTransfer multiTransfer) { return msgBean; } - public RequestBody buildMultiTransfer(MultiTransfer multiTransfer) throws IOException, NoSuchAlgorithmException{ + public RequestBody buildMultiTransfer(MultiTransfer multiTransfer) throws IOException, NoSuchAlgorithmException { return createRequestBody(buildMultiTransferPayload(multiTransfer)); } @@ -429,7 +489,7 @@ public String buildHtltPayload(HtltReq htltReq) throws IOException, NoSuchAlgori } @VisibleForTesting - public HtltMessage createHtltMessage(HtltReq htltReq){ + public HtltMessage createHtltMessage(HtltReq htltReq) { HtltMessage message = new HtltMessage(); message.setFrom(wallet.getAddress()); message.setTo(htltReq.getRecipient()); @@ -456,7 +516,7 @@ byte[] encodeHtltMessage(HtltMessage msg) builder.setSenderOtherChain(msg.getSenderOtherChain()); builder.setRandomNumberHash(ByteString.copyFrom(msg.getRandomNumberHash())); builder.setTimestamp(msg.getTimestamp()); - for(Token token : msg.getAmount()){ + for (Token token : msg.getAmount()) { builder.addAmount(com.binance.dex.api.proto.Token.newBuilder().setAmount(token.getAmount()).setDenom(token.getDenom())); } builder.setExpectedIncome(msg.getExpectedIncome()); @@ -467,11 +527,11 @@ byte[] encodeHtltMessage(HtltMessage msg) } public RequestBody buildDepositHtlt(String swapId, List amount) throws IOException, NoSuchAlgorithmException { - return createRequestBody(buildDepositHtltPayload(swapId,amount)); + return createRequestBody(buildDepositHtltPayload(swapId, amount)); } public String buildDepositHtltPayload(String swapId, List amount) throws IOException, NoSuchAlgorithmException { - DepositHtltMessage depositHtltMessage = createDepositHtltMessage(swapId,amount); + DepositHtltMessage depositHtltMessage = createDepositHtltMessage(swapId, amount); byte[] msg = encodeDepositHtltMessage(depositHtltMessage); byte[] signature = encodeSignature(sign(depositHtltMessage)); byte[] stdTx = encodeStdTx(msg, signature); @@ -479,7 +539,7 @@ public String buildDepositHtltPayload(String swapId, List amount) throws } @VisibleForTesting - public DepositHtltMessage createDepositHtltMessage(String swapId, List amount){ + public DepositHtltMessage createDepositHtltMessage(String swapId, List amount) { DepositHtltMessage message = new DepositHtltMessage(); message.setFrom(wallet.getAddress()); message.setSwapId(swapId); @@ -494,7 +554,7 @@ public byte[] encodeDepositHtltMessage(DepositHtltMessage msg) com.binance.dex.api.proto.DepositHashTimerLockMsg.Builder builder = com.binance.dex.api.proto.DepositHashTimerLockMsg.newBuilder(); builder.setFrom(ByteString.copyFrom(address)); builder.setSwapId(ByteString.copyFrom(Hex.decode(msg.getSwapId()))); - for(Token token : msg.getAmount()){ + for (Token token : msg.getAmount()) { builder.addAmount(com.binance.dex.api.proto.Token.newBuilder().setAmount(token.getAmount()).setDenom(token.getDenom())); } com.binance.dex.api.proto.DepositHashTimerLockMsg proto = builder.build(); @@ -502,7 +562,7 @@ public byte[] encodeDepositHtltMessage(DepositHtltMessage msg) } public RequestBody buildClaimHtlt(String swapId, byte[] randomNumber) throws IOException, NoSuchAlgorithmException { - return createRequestBody(buildClaimHtltPayload(swapId,randomNumber)); + return createRequestBody(buildClaimHtltPayload(swapId, randomNumber)); } public String buildClaimHtltPayload(String swapId, byte[] randomNumber) throws IOException, NoSuchAlgorithmException { @@ -551,4 +611,47 @@ public byte[] encodeRefundHtltMessage(RefundHtltMessage msg) throws IOException return EncodeUtils.aminoWrap(proto.toByteArray(), MessageType.RefundHashTimerLockMsg.getTypePrefixBytes(), false); } + public RequestBody buildTransferTokenOwnership(String symbol, String newOwner) throws IOException, NoSuchAlgorithmException { + return createRequestBody(buildTransferTokenOwnershipPayload(symbol, newOwner)); + } + + public String buildTransferTokenOwnershipPayload(String symbol, String newOwner) throws IOException, NoSuchAlgorithmException { + TransferTokenOwnershipMessage message = new TransferTokenOwnershipMessage(); + message.setFrom(wallet.getAddress()); + message.setSymbol(symbol); + message.setNewOwner(newOwner); + byte[] msg = encodeTransferTokenOwnershipMessage(message); + byte[] signature = encodeSignature(sign(message)); + byte[] stdTx = encodeStdTx(msg, signature); + return EncodeUtils.bytesToHex(stdTx); + } + + @VisibleForTesting + public byte[] encodeTransferTokenOwnershipMessage(TransferTokenOwnershipMessage msg) throws IOException { + byte[] address = Crypto.decodeAddress(msg.getFrom()); + byte[] newOwnerB = Crypto.decodeAddress(msg.getNewOwner()); + TransferTokenOwnershipMsg.Builder builder = TransferTokenOwnershipMsg.newBuilder(); + builder.setFrom(ByteString.copyFrom(address)); + builder.setSymbol(msg.getSymbol()); + builder.setNewOwner(ByteString.copyFrom(newOwnerB)); + TransferTokenOwnershipMsg proto = builder.build(); + return EncodeUtils.aminoWrap(proto.toByteArray(), MessageType.TransferTokenOwnership.getTypePrefixBytes(), false); + } + + + /** + * Used for amino serializable message + */ + public String buildTxPayload(BinanceDexTransactionMessage message) throws IOException, NoSuchAlgorithmException { + if (!AminoSerializable.class.isAssignableFrom(message.getClass())) { + throw new IllegalArgumentException("Class " + message.getClass() + " should also implement AminoSerializable to support amino encoding"); + } + + byte[] typePrefix = WireType.getTypePrefix(message.getClass()); + byte[] msg = amino.encode(((AminoSerializable) message), typePrefix, false); + byte[] signature = encodeSignature(signTx(message)); + byte[] stdTx = encodeStdTx(msg, signature); + return EncodeUtils.bytesToHex(stdTx); + } + } diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/TransferTokenOwnershipMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/TransferTokenOwnershipMessage.java new file mode 100644 index 00000000..ee25c9de --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/TransferTokenOwnershipMessage.java @@ -0,0 +1,39 @@ +package com.binance.dex.api.client.encoding.message; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class TransferTokenOwnershipMessage implements BinanceDexTransactionMessage { + + private String from; + private String symbol; + @JsonProperty("new_owner") + private String newOwner; + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getNewOwner() { + return newOwner; + } + + public void setNewOwner(String newOwner) { + this.newOwner = newOwner; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/BeaconChainRedelegationMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/BeaconChainRedelegationMessage.java new file mode 100644 index 00000000..af8a5770 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/BeaconChainRedelegationMessage.java @@ -0,0 +1,170 @@ +package com.binance.dex.api.client.encoding.message.beaconchain.query; + + +import com.binance.dex.api.client.domain.stake.Redelegation; +import com.binance.dex.api.client.encoding.message.Token; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author Francis.Liu + **/ +public class BeaconChainRedelegationMessage { + + //delegator address + @JsonProperty(value = "delegator_addr") + private String delegatorAddress; + + //validator redelegation source operator address + @JsonProperty(value = "validator_src_addr") + private String srcValidatorAddress; + + //validator redelegation destination operator address + @JsonProperty(value = "validator_dst_addr") + private String dstValidatorAddress; + + //height which the redelegation took place + @JsonProperty(value = "creation_height") + private long createHeight; + + //unix time for redelegation completion + @JsonProperty(value = "min_time") + private String minTime; + + //initial balance when redelegation started + @JsonProperty(value = "initial_balance") + private Token initialBalance; + + //current balance + @JsonProperty(value = "balance") + private Token balance; + + //amount of source shares redelegating + @JsonProperty(value = "shares_src") + private long srcShares; + + //amount of destination shares redelegating + @JsonProperty(value = "shares_dst") + private long dstShare; + + public BeaconChainRedelegationMessage() { + } + + public Redelegation toRedelegation(){ + Redelegation redelegation = new Redelegation(this.getDelegatorAddress(), + this.getSrcValidatorAddress(), + this.getDstValidatorAddress(), + this.getCreateHeight(), + this.getMinTime(), + this.getMinTimeInMs(), + this.getInitialBalance(), + this.getBalance(), + this.getSrcShares(), + this.getDstShare() + ); + return redelegation; + } + + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getSrcValidatorAddress() { + return srcValidatorAddress; + } + + public void setSrcValidatorAddress(String srcValidatorAddress) { + this.srcValidatorAddress = srcValidatorAddress; + } + + public String getDstValidatorAddress() { + return dstValidatorAddress; + } + + public void setDstValidatorAddress(String dstValidatorAddress) { + this.dstValidatorAddress = dstValidatorAddress; + } + + public long getCreateHeight() { + return createHeight; + } + + public void setCreateHeight(long createHeight) { + this.createHeight = createHeight; + } + + public String getMinTime() { + return minTime; + } + + public void setMinTime(String minTime) { + this.minTime = minTime; + } + + public long getMinTimeInMs() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + Date d = null; + try { + d = sdf.parse(this.minTime); + } catch (ParseException e) { + return 0; + } + return d.getTime(); + } + + + public Token getInitialBalance() { + return initialBalance; + } + + public void setInitialBalance(Token initialBalance) { + this.initialBalance = initialBalance; + } + + public Token getBalance() { + return balance; + } + + public void setBalance(Token balance) { + this.balance = balance; + } + + public long getSrcShares() { + return srcShares; + } + + public void setSrcShares(long srcShares) { + this.srcShares = srcShares; + } + + public long getDstShare() { + return dstShare; + } + + public void setDstShare(long dstShare) { + this.dstShare = dstShare; + } + + @Override + public String toString() { + return "SideChainRedelegation{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", srcValidatorAddress='" + srcValidatorAddress + '\'' + + ", dstValidatorAddress='" + dstValidatorAddress + '\'' + + ", createHeight=" + createHeight + + ", minTime='" + minTime + '\'' + + ", initialBalance=" + initialBalance + + ", balance=" + balance + + ", srcShares=" + srcShares + + ", dstShare=" + dstShare + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/BeaconChainUnBondingDelegationMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/BeaconChainUnBondingDelegationMessage.java new file mode 100644 index 00000000..9552359a --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/BeaconChainUnBondingDelegationMessage.java @@ -0,0 +1,124 @@ +package com.binance.dex.api.client.encoding.message.beaconchain.query; + +import com.binance.dex.api.client.domain.stake.UnBondingDelegation; +import com.binance.dex.api.client.encoding.message.Token; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author Francis.Liu + **/ +public class BeaconChainUnBondingDelegationMessage { + @JsonProperty(value = "delegator_addr") + private String delegatorAddress; + @JsonProperty(value = "validator_addr") + private String validatorAddress; + @JsonProperty(value = "creation_height") + private long createHeight; + @JsonProperty(value = "min_time") + private String minTime; + @JsonProperty(value = "initial_balance") + private Token initialBalance; + @JsonProperty(value = "balance") + private Token balance; + + @JsonProperty(value = "cross_stake") + private boolean crossStake; + + public UnBondingDelegation toBeaconChainUnBondingDelegation() { + UnBondingDelegation redelegation = new UnBondingDelegation( + this.getDelegatorAddress(), + this.getValidatorAddress(), + this.getCreateHeight(), + this.getMinTimeInMs(), + this.getMinTime(), + this.getInitialBalance(), + this.getBalance() + + ); + return redelegation; + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public long getCreateHeight() { + return createHeight; + } + + public void setCreateHeight(long createHeight) { + this.createHeight = createHeight; + } + + public long getMinTimeInMs() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + Date d = null; + try { + d = sdf.parse(this.minTime); + } catch (ParseException e) { + return 0; + } + return d.getTime(); + } + + + public String getMinTime() { + return minTime; + } + + public void setMinTime(String minTime) { + this.minTime = minTime; + } + + public Token getInitialBalance() { + return initialBalance; + } + + public void setInitialBalance(Token initialBalance) { + this.initialBalance = initialBalance; + } + + public Token getBalance() { + return balance; + } + + public void setBalance(Token balance) { + this.balance = balance; + } + + public boolean isCrossStake() { + return crossStake; + } + + public void setCrossStake(boolean crossStake) { + this.crossStake = crossStake; + } + + @Override + public String toString() { + return "UnBondingDelegation{" + + "delegatorAddress='" + delegatorAddress + '\'' + + ", validatorAddress='" + validatorAddress + '\'' + + ", createHeight=" + createHeight + + ", minTime='" + minTime + '\'' + + ", initialBalance=" + initialBalance + + ", balance=" + balance + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/PoolMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/PoolMessage.java new file mode 100644 index 00000000..3b091620 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/query/PoolMessage.java @@ -0,0 +1,43 @@ +package com.binance.dex.api.client.encoding.message.beaconchain.query; + +import com.binance.dex.api.client.domain.stake.Pool; +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; + +/** + * @author Francis.Liu + **/ +public class PoolMessage { + @JsonProperty(value = "loose_tokens") + private long looseTokens; + @JsonProperty(value = "bonded_tokens") + private long bondedTokens; + + public long getLooseTokens() { + return looseTokens; + } + + public void setLooseTokens(long looseTokens) { + this.looseTokens = looseTokens; + } + + public long getBondedTokens() { + return bondedTokens; + } + + public void setBondedTokens(long bondedTokens) { + this.bondedTokens = bondedTokens; + } + + public Pool toPool(){ + Pool pool = new Pool(); + pool.setBondedTokens(bondedTokens); + pool.setLooseTokens(looseTokens); + return pool; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainDelegateMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainDelegateMessage.java new file mode 100644 index 00000000..3e5c361f --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainDelegateMessage.java @@ -0,0 +1,95 @@ +package com.binance.dex.api.client.encoding.message.beaconchain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Francis.Liu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class BeaconChainDelegateMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "delegator_addr") + private Bech32AddressValue delegatorAddress; + + @JsonProperty(value = "validator_addr") + private Bech32AddressValue validatorAddress; + + @JsonProperty(value = "delegation") + private CoinValueStr delegation; + + + public BeaconChainDelegateMessage() { } + + public Bech32AddressValue getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(Bech32AddressValue delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public Bech32AddressValue getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(Bech32AddressValue validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public CoinValueStr getDelegation() { + return delegation; + } + + public void setDelegation(CoinValueStr delegation) { + this.delegation = delegation; + } + + + @Override + public AminoSerializable newAminoMessage() { + return new BeaconChainDelegateMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, delegatorAddress, delegatorAddress == null || delegatorAddress.isDefaultOrEmpty()) + .addField(Bech32AddressValue.class, validatorAddress, validatorAddress == null || validatorAddress.isDefaultOrEmpty()) + .addField(CoinValueStr.class, delegation, delegation == null) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + delegatorAddress = ((Bech32AddressValue) value); + break; + case 2: + validatorAddress = ((Bech32AddressValue) value); + break; + case 3: + delegation = ((CoinValueStr) value); + break; + default: + break; + } + } + + @Override + public boolean useAminoJson() { + return true; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainRedelegateMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainRedelegateMessage.java new file mode 100644 index 00000000..08ecdb6a --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainRedelegateMessage.java @@ -0,0 +1,109 @@ +package com.binance.dex.api.client.encoding.message.beaconchain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Francis.Liu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class BeaconChainRedelegateMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "delegator_addr") + private Bech32AddressValue delegatorAddress; + + @JsonProperty(value = "validator_src_addr") + private Bech32AddressValue srcValidatorAddress; + + @JsonProperty(value = "validator_dst_addr") + private Bech32AddressValue dstValidatorAddress; + + @JsonProperty(value = "amount") + private CoinValueStr amount; + + public BeaconChainRedelegateMessage() { + } + + @Override + public AminoSerializable newAminoMessage() { + return new BeaconChainRedelegateMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, delegatorAddress, delegatorAddress == null || delegatorAddress.isDefaultOrEmpty()) + .addField(Bech32AddressValue.class, srcValidatorAddress, srcValidatorAddress == null || srcValidatorAddress.isDefaultOrEmpty()) + .addField(Bech32AddressValue.class, dstValidatorAddress, dstValidatorAddress == null || dstValidatorAddress.isDefaultOrEmpty()) + .addField(CoinValueStr.class, amount, amount == null) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + delegatorAddress = ((Bech32AddressValue) value); + break; + case 2: + srcValidatorAddress = ((Bech32AddressValue) value); + break; + case 3: + dstValidatorAddress = ((Bech32AddressValue) value); + break; + case 4: + amount = ((CoinValueStr) value); + break; + default: + break; + } + } + + @Override + public boolean useAminoJson() { + return true; + } + + public Bech32AddressValue getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(Bech32AddressValue delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public Bech32AddressValue getSrcValidatorAddress() { + return srcValidatorAddress; + } + + public void setSrcValidatorAddress(Bech32AddressValue srcValidatorAddress) { + this.srcValidatorAddress = srcValidatorAddress; + } + + public Bech32AddressValue getDstValidatorAddress() { + return dstValidatorAddress; + } + + public void setDstValidatorAddress(Bech32AddressValue dstValidatorAddress) { + this.dstValidatorAddress = dstValidatorAddress; + } + + public CoinValueStr getAmount() { + return amount; + } + + public void setAmount(CoinValueStr amount) { + this.amount = amount; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainUndelegateMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainUndelegateMessage.java new file mode 100644 index 00000000..f2ba7ec5 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/BeaconChainUndelegateMessage.java @@ -0,0 +1,94 @@ +package com.binance.dex.api.client.encoding.message.beaconchain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Francis.Liu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class BeaconChainUndelegateMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "delegator_addr") + private Bech32AddressValue delegatorAddress; + + @JsonProperty(value = "validator_addr") + private Bech32AddressValue validatorAddress; + + @JsonProperty(value = "amount") + private CoinValueStr amount; + + public BeaconChainUndelegateMessage() { + } + + @Override + public boolean useAminoJson() { + return true; + } + + @Override + public AminoSerializable newAminoMessage() { + return new BeaconChainUndelegateMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, delegatorAddress, delegatorAddress == null || delegatorAddress.isDefaultOrEmpty()) + .addField(Bech32AddressValue.class, validatorAddress, validatorAddress == null || validatorAddress.isDefaultOrEmpty()) + .addField(CoinValueStr.class, amount, amount == null) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + delegatorAddress = ((Bech32AddressValue) value); + break; + case 2: + validatorAddress = ((Bech32AddressValue) value); + break; + case 3: + amount = ((CoinValueStr) value); + break; + default: + break; + } + } + + public Bech32AddressValue getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(Bech32AddressValue delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public Bech32AddressValue getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(Bech32AddressValue validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public CoinValueStr getAmount() { + return amount; + } + + public void setAmount(CoinValueStr amount) { + this.amount = amount; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/CreateBeaconChainValidatorMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/CreateBeaconChainValidatorMessage.java new file mode 100644 index 00000000..2a8cecda --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/CreateBeaconChainValidatorMessage.java @@ -0,0 +1,138 @@ +package com.binance.dex.api.client.encoding.message.beaconchain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.binance.dex.api.client.encoding.message.sidechain.value.CommissionMsgValue; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Francis.Liu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class CreateBeaconChainValidatorMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "description") + private DescriptionValue description = new DescriptionValue(); + + @JsonProperty(value = "commission") + private CommissionMsgValue commission = new CommissionMsgValue(); + + @JsonProperty(value = "delegator_address") + private Bech32AddressValue delegatorAddr; + + @JsonProperty(value = "validator_address") + private Bech32AddressValue validatorOperatorAddr; + + @JsonProperty(value = "pubkey") + private String pubKey; + + @JsonProperty(value = "delegation") + private CoinValueStr delegation; + + + @Override + public boolean useAminoJson() { + return true; + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + description = ((DescriptionValue) value); + break; + case 2: + commission = ((CommissionMsgValue) value); + break; + case 3: + delegatorAddr = ((Bech32AddressValue) value); + break; + case 4: + validatorOperatorAddr = ((Bech32AddressValue) value); + break; + case 5: + pubKey = ((String) value); + break; + case 6: + delegation = ((CoinValueStr) value); + break; + default: + break; + } + } + + @Override + public AminoSerializable newAminoMessage() { + return new CreateBeaconChainValidatorMessage(); + } + + @Override + public ArrayList> IterateFields() { + ArrayList> fields = new ArrayList<>(); + fields.add(new AminoField<>(DescriptionValue.class, description, description == null)); + fields.add(new AminoField<>(CommissionMsgValue.class, commission, commission == null)); + fields.add(new AminoField<>(Bech32AddressValue.class, delegatorAddr, delegatorAddr == null || delegatorAddr.isDefaultOrEmpty())); + fields.add(new AminoField<>(Bech32AddressValue.class, validatorOperatorAddr, validatorOperatorAddr == null || validatorOperatorAddr.isDefaultOrEmpty())); + fields.add(new AminoField<>(String.class, pubKey, StringUtils.isEmpty(pubKey))); + fields.add(new AminoField<>(CoinValueStr.class, delegation, delegation == null)); + return fields; + } + + public DescriptionValue getDescription() { + return description; + } + + public void setDescription(DescriptionValue description) { + this.description = description; + } + + public CommissionMsgValue getCommission() { + return commission; + } + + public void setCommission(CommissionMsgValue commission) { + this.commission = commission; + } + + public Bech32AddressValue getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(Bech32AddressValue delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public Bech32AddressValue getValidatorOperatorAddr() { + return validatorOperatorAddr; + } + + public void setValidatorOperatorAddr(Bech32AddressValue validatorOperatorAddr) { + this.validatorOperatorAddr = validatorOperatorAddr; + } + + public CoinValueStr getDelegation() { + return delegation; + } + + public void setDelegation(CoinValueStr delegation) { + this.delegation = delegation; + } + + public String getPubKey() { + return pubKey; + } + + public void setPubKey(String pubKey) { + this.pubKey = pubKey; + } +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/EditBeaconChainValidatorMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/EditBeaconChainValidatorMessage.java new file mode 100644 index 00000000..5f5fb9d1 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/beaconchain/transaction/EditBeaconChainValidatorMessage.java @@ -0,0 +1,115 @@ +package com.binance.dex.api.client.encoding.message.beaconchain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import com.binance.dex.api.client.encoding.serializer.DecToStringSerializer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Francis.Liu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class EditBeaconChainValidatorMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "description") + private DescriptionValue description; + + @JsonProperty(value = "address") + private Bech32AddressValue validatorOperatorAddress; + + @JsonProperty(value = "commission_rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec commissionRate; + + @JsonProperty(value = "pubkey") + private String pubKey; + + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + description = ((DescriptionValue) value); + break; + case 2: + validatorOperatorAddress = ((Bech32AddressValue) value); + break; + case 3: + commissionRate = ((Dec) value); + break; + case 4: + pubKey = ((String) value); + break; + default: + break; + } + } + + public EditBeaconChainValidatorMessage() { + } + + public DescriptionValue getDescription() { + return description; + } + + public void setDescription(DescriptionValue description) { + this.description = description; + } + + public Bech32AddressValue getValidatorOperatorAddress() { + return validatorOperatorAddress; + } + + public void setValidatorOperatorAddress(Bech32AddressValue validatorOperatorAddress) { + this.validatorOperatorAddress = validatorOperatorAddress; + } + + public Dec getCommissionRate() { + return commissionRate; + } + + public void setCommissionRate(Dec commissionRate) { + this.commissionRate = commissionRate; + } + + public String getPubKey() { + return pubKey; + } + + public void setPubKey(String pubKey) { + this.pubKey = pubKey; + } + + @Override + public boolean useAminoJson() { + return true; + } + + @Override + public AminoSerializable newAminoMessage() { + return new EditBeaconChainValidatorMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(DescriptionValue.class, description, description == null) + .addField(Bech32AddressValue.class, validatorOperatorAddress, validatorOperatorAddress == null || validatorOperatorAddress.isDefaultOrEmpty()) + .addField(Dec.class, commissionRate, commissionRate == null || commissionRate.isDefaultOrEmpty()) +// .addField(Dec.class, commissionRate, false) + .addField(String.class, pubKey, StringUtils.isEmpty(pubKey)) + .build(); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/BindMsgMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/BindMsgMessage.java new file mode 100644 index 00000000..c9eb8809 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/BindMsgMessage.java @@ -0,0 +1,159 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class BindMsgMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "from") + private Bech32AddressValue from; + + @JsonProperty(value = "symbol") + private String symbol; + + @JsonProperty(value = "amount") + private long amount; + + @JsonProperty(value = "contract_address") + private EthAddressValue contractAddress; + + @JsonProperty(value = "contract_decimals") + private int contractDecimal; + + @JsonProperty(value = "expire_time") + private long expireTime; + + public BindMsgMessage() { + } + + public BindMsgMessage(Bech32AddressValue from, String symbol, long amount, EthAddressValue contractAddress, int contractDecimal, long expireTime) { + this.from = from; + this.symbol = symbol; + this.amount = amount; + this.contractAddress = contractAddress; + this.contractDecimal = contractDecimal; + this.expireTime = expireTime; + } + + public Bech32AddressValue getFrom() { + return from; + } + + public void setFrom(Bech32AddressValue from) { + this.from = from; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public long getAmount() { + return amount; + } + + public void setAmount(long amount) { + this.amount = amount; + } + + public EthAddressValue getContractAddress() { + return contractAddress; + } + + public void setContractAddress(EthAddressValue contractAddress) { + this.contractAddress = contractAddress; + } + + public int getContractDecimal() { + return contractDecimal; + } + + public void setContractDecimal(int contractDecimal) { + this.contractDecimal = contractDecimal; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } + + @Override + public void validateBasic() { + if (StringUtils.isEmpty(symbol)){ + throw new IllegalArgumentException("symbol should not be empty"); + } + if (amount <= 0){ + throw new IllegalArgumentException("amount should be larger than 0"); + } + if (contractAddress == null || contractAddress.isDefaultOrEmpty()){ + throw new IllegalArgumentException("contract address should not be empty"); + } + if (contractDecimal < 0){ + throw new IllegalArgumentException("decimal should be no less than 0"); + } + if (expireTime <= 0){ + throw new IllegalArgumentException("expire time should be larger than 0"); + } + } + + @Override + public AminoSerializable newAminoMessage() { + return new BindMsgMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, from, from == null || from.isDefaultOrEmpty()) + .addField(String.class, symbol, StringUtils.isEmpty(symbol)) + .addField(Long.class, amount, amount == 0) + .addField(EthAddressValue.class, contractAddress, contractAddress == null || contractAddress.isDefaultOrEmpty()) + .addField(Integer.class, contractDecimal, contractDecimal == 0) + .addField(Long.class, expireTime, expireTime == 0) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + from = ((Bech32AddressValue) value); + break; + case 2: + symbol = ((String) value); + break; + case 3: + amount = ((long) value); + break; + case 4: + contractAddress = ((EthAddressValue) value); + break; + case 5: + contractDecimal = ((int) value); + break; + case 6: + expireTime = ((long) value); + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/BindStatus.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/BindStatus.java new file mode 100644 index 00000000..e1caf54c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/BindStatus.java @@ -0,0 +1,13 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +/** + * @author Fitz.Lu + **/ +public class BindStatus { + + public static final int bindStatusSuccess = 0; + public static final int bindStatusRejected = 1; + public static final int bindStatusTimeout = 2; + public static final int bindStatusInvalidParameter = 3; + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimMsgMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimMsgMessage.java new file mode 100644 index 00000000..ddecd3ca --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimMsgMessage.java @@ -0,0 +1,121 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class ClaimMsgMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "chain_id") + private int chainId; + + @JsonProperty(value = "sequence") + private long sequence; + + @JsonProperty(value = "payload") + private byte[] payload; + + @JsonProperty(value = "validator_address") + private Bech32AddressValue validatorAddress; + + public ClaimMsgMessage() { + } + + public ClaimMsgMessage(int chainId, long sequence, byte[] payload, Bech32AddressValue validatorAddress) { + this.chainId = chainId; + this.sequence = sequence; + this.payload = payload; + this.validatorAddress = validatorAddress; + } + + public int getChainId() { + return chainId; + } + + public void setChainId(int chainId) { + this.chainId = chainId; + } + + public long getSequence() { + return sequence; + } + + public void setSequence(long sequence) { + this.sequence = sequence; + } + + public byte[] getPayload() { + return payload; + } + + public void setPayload(byte[] payload) { + this.payload = payload; + } + + public Bech32AddressValue getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(Bech32AddressValue validatorAddress) { + this.validatorAddress = validatorAddress; + } + + @Override + public void validateBasic() { + if (!ClaimTypes.IsValidClaimType(chainId)) { + throw new IllegalArgumentException(String.format("claim type %s does not exist, see class ClaimTypes", chainId)); + } + if (sequence < 0) { + throw new IllegalArgumentException("sequence should not be less than 0"); + } + if (payload == null || payload.length == 0) { + throw new IllegalArgumentException("payload should not be empty"); + } + } + + @Override + public AminoSerializable newAminoMessage() { + return new ClaimMsgMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Integer.class, chainId, false) + .addField(Long.class, sequence, false) + .addField(byte[].class, payload, (payload == null || payload.length == 0)) + .addField(Bech32AddressValue.class, validatorAddress, validatorAddress == null || validatorAddress.isDefaultOrEmpty()) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + chainId = ((int) value); + break; + case 2: + sequence = ((long) value); + break; + case 3: + payload = (byte[]) value; + break; + case 4: + validatorAddress = (Bech32AddressValue) value; + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimType.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimType.java new file mode 100644 index 00000000..ed9ec218 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimType.java @@ -0,0 +1,14 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Fitz.Lu + **/ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.SOURCE) +public @interface ClaimType { +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimTypes.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimTypes.java new file mode 100644 index 00000000..3021a28e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/ClaimTypes.java @@ -0,0 +1,42 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Fitz.Lu + **/ +public class ClaimTypes { + + public static final int ClaimTypeSkipSequence = 0x1; + public static final int ClaimTypeUpdateBind = 0x2; + public static final int ClaimTypeUpdateTransferOut = 0x3; + public static final int ClaimTypeTransferIn = 0x4; + + private static final String ClaimTypeSkipSequenceName = "SkipSequence"; + private static final String ClaimTypeUpdateBindName = "UpdateBind"; + private static final String ClaimTypeUpdateTransferOutName = "UpdateTransferOut"; + private static final String ClaimTypeTransferInName = "TransferIn"; + + private static final Map claimTypeToName; + private static final Map claimNameToType; + + static { + claimTypeToName = new HashMap<>(); + claimTypeToName.put(ClaimTypeSkipSequence, ClaimTypeSkipSequenceName); + claimTypeToName.put(ClaimTypeUpdateBind, ClaimTypeUpdateBindName); + claimTypeToName.put(ClaimTypeUpdateTransferOut, ClaimTypeUpdateTransferOutName); + claimTypeToName.put(ClaimTypeTransferIn, ClaimTypeTransferInName); + + claimNameToType = new HashMap<>(); + claimNameToType.put(ClaimTypeSkipSequenceName, ClaimTypeSkipSequence); + claimNameToType.put(ClaimTypeUpdateBindName, ClaimTypeUpdateBind); + claimNameToType.put(ClaimTypeUpdateTransferOutName, ClaimTypeUpdateTransferOut); + claimNameToType.put(ClaimTypeTransferInName, ClaimTypeTransferIn); + } + + public static boolean IsValidClaimType(int type){ + return claimTypeToName.containsKey(type); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/DBProphecy.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/DBProphecy.java new file mode 100644 index 00000000..f4919eb8 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/DBProphecy.java @@ -0,0 +1,84 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.ByteUtil; +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class DBProphecy implements AminoSerializable { + + private String id; + + private StatusValue status; + + private byte[] validatorClaims; + + public DBProphecy() { + } + + public DBProphecy(String id, StatusValue status, byte[] validatorClaims) { + this.id = id; + this.status = status; + this.validatorClaims = validatorClaims; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public StatusValue getStatus() { + return status; + } + + public void setStatus(StatusValue status) { + this.status = status; + } + + public byte[] getValidatorClaims() { + return validatorClaims; + } + + public void setValidatorClaims(byte[] validatorClaims) { + this.validatorClaims = validatorClaims; + } + + @Override + public AminoSerializable newAminoMessage() { + return new DBProphecy(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(String.class, id, StringUtils.isEmpty(id)) + .addField(StatusValue.class, status, status == null) + .addField(byte[].class, validatorClaims, ByteUtil.isEmpty(validatorClaims)) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + id = ((String) value); + break; + case 2: + status = ((StatusValue) value); + break; + case 3: + validatorClaims = ((byte[]) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/RefundReason.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/RefundReason.java new file mode 100644 index 00000000..09f41f74 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/RefundReason.java @@ -0,0 +1,13 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +/** + * @author Fitz.Lu + **/ +public class RefundReason { + + public static final int unboundToken = 1; + public static final int timeout = 2; + public static final int insufficientBalance = 3; + public static final int unknown = 4; + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/StatusValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/StatusValue.java new file mode 100644 index 00000000..2cd8ef90 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/StatusValue.java @@ -0,0 +1,58 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class StatusValue implements AminoSerializable { + + private int text; + + private String finalClaim; + + public int getText() { + return text; + } + + public void setText(int text) { + this.text = text; + } + + public String getFinalClaim() { + return finalClaim; + } + + public void setFinalClaim(String finalClaim) { + this.finalClaim = finalClaim; + } + + @Override + public AminoSerializable newAminoMessage() { + return new StatusValue(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Integer.class, text, false) + .addField(String.class, finalClaim, StringUtils.isEmpty(finalClaim)) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + text = ((Integer) value); + break; + case 2: + finalClaim = ((String) value); + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/TransferInClaimMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/TransferInClaimMessage.java new file mode 100644 index 00000000..c6932497 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/TransferInClaimMessage.java @@ -0,0 +1,93 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.message.common.CoinValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.List; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class TransferInClaimMessage { + + @JsonProperty(value = "contract_address") + private String contractAddress; + + @JsonProperty(value = "refund_addresses") + private List refundAddresses; + + @JsonProperty(value = "receiver_addresses") + private List receiverAddresses; + + @JsonProperty(value = "amounts") + private List amounts; + + @JsonProperty(value = "symbol") + private String symbol; + + @JsonProperty(value = "relay_fee") + private CoinValue relayFee; + + @JsonProperty(value = "expire_time") + private long expireTime; + + public String getContractAddress() { + return contractAddress; + } + + public void setContractAddress(String contractAddress) { + this.contractAddress = contractAddress; + } + + public List getRefundAddresses() { + return refundAddresses; + } + + public void setRefundAddresses(List refundAddresses) { + this.refundAddresses = refundAddresses; + } + + public List getReceiverAddresses() { + return receiverAddresses; + } + + public void setReceiverAddresses(List receiverAddresses) { + this.receiverAddresses = receiverAddresses; + } + + public List getAmounts() { + return amounts; + } + + public void setAmounts(List amounts) { + this.amounts = amounts; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public CoinValue getRelayFee() { + return relayFee; + } + + public void setRelayFee(CoinValue relayFee) { + this.relayFee = relayFee; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/TransferOutMsgMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/TransferOutMsgMessage.java new file mode 100644 index 00000000..c5127935 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/TransferOutMsgMessage.java @@ -0,0 +1,112 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValue; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class TransferOutMsgMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "from") + private Bech32AddressValue from; + + @JsonProperty(value = "to") + private EthAddressValue toAddress; + + @JsonProperty(value = "amount") + private CoinValue amount; + + @JsonProperty(value = "expire_time") + private long expireTime; + + public Bech32AddressValue getFrom() { + return from; + } + + public void setFrom(Bech32AddressValue from) { + this.from = from; + } + + public EthAddressValue getToAddress() { + return toAddress; + } + + public void setToAddress(EthAddressValue toAddress) { + this.toAddress = toAddress; + } + + public CoinValue getAmount() { + return amount; + } + + public void setAmount(CoinValue amount) { + this.amount = amount; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } + + @Override + public void validateBasic() { + if (toAddress == null || toAddress.isDefaultOrEmpty()){ + throw new IllegalArgumentException("to address should not be empty"); + } + if (amount == null || amount.getAmount() <= 0){ + throw new IllegalArgumentException("amount should be positive"); + } + if (expireTime <= 0){ + throw new IllegalArgumentException("expire time should be larger than 0"); + } + } + + @Override + public AminoSerializable newAminoMessage() { + return new TransferOutMsgMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, from, from == null) + .addField(EthAddressValue.class, toAddress, toAddress == null) + .addField(CoinValue.class, amount, amount == null) + .addField(Long.class, expireTime, expireTime == 0) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + from = ((Bech32AddressValue) value); + break; + case 2: + toAddress = ((EthAddressValue) value); + break; + case 3: + amount = ((CoinValue) value); + break; + case 4: + expireTime = ((long) value); + break; + } + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UnbindMsgMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UnbindMsgMessage.java new file mode 100644 index 00000000..891947f4 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UnbindMsgMessage.java @@ -0,0 +1,79 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class UnbindMsgMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "from") + private Bech32AddressValue from; + + @JsonProperty(value = "symbol") + private String symbol; + + public UnbindMsgMessage() { + } + + public UnbindMsgMessage(Bech32AddressValue from, String symbol) { + this.from = from; + this.symbol = symbol; + } + + @Override + public AminoSerializable newAminoMessage() { + return new UnbindMsgMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, from, from == null || from.isDefaultOrEmpty()) + .addField(String.class, symbol, StringUtils.isEmpty(symbol)) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + from = ((Bech32AddressValue) value); + break; + case 2: + symbol = ((String) value); + break; + } + } + + @Override + public void validateBasic() { + if (StringUtils.isEmpty(symbol)){ + throw new IllegalArgumentException("symbol should not be empty"); + } + } + + public Bech32AddressValue getFrom() { + return from; + } + + public void setFrom(Bech32AddressValue from) { + this.from = from; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UpdateBindClaimMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UpdateBindClaimMessage.java new file mode 100644 index 00000000..6a2952e5 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UpdateBindClaimMessage.java @@ -0,0 +1,84 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class UpdateBindClaimMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "status") + private int status; + + @JsonProperty(value = "symbol") + private String symbol; + + @JsonProperty(value = "contract_address") + private EthAddressValue contractAddress; + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public EthAddressValue getContractAddress() { + return contractAddress; + } + + public void setContractAddress(EthAddressValue contractAddress) { + this.contractAddress = contractAddress; + } + + @Override + public AminoSerializable newAminoMessage() { + return new UpdateBindClaimMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Integer.class, status, false) + .addField(String.class, symbol, StringUtils.isEmpty(symbol)) + .addField(EthAddressValue.class, contractAddress, contractAddress == null || contractAddress.isDefaultOrEmpty()) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + status = ((int) value); + break; + case 2: + symbol = ((String) value); + break; + case 3: + contractAddress = ((EthAddressValue) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UpdateTransferOutClaimMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UpdateTransferOutClaimMessage.java new file mode 100644 index 00000000..17c549bc --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/bridge/UpdateTransferOutClaimMessage.java @@ -0,0 +1,84 @@ +package com.binance.dex.api.client.encoding.message.bridge; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class UpdateTransferOutClaimMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "refund_address") + private Bech32AddressValue refundAddress; + + @JsonProperty(value = "amount") + private CoinValue amount; + + @JsonProperty(value = "refund_reason") + private int refundReason; + + public Bech32AddressValue getRefundAddress() { + return refundAddress; + } + + public void setRefundAddress(Bech32AddressValue refundAddress) { + this.refundAddress = refundAddress; + } + + public CoinValue getAmount() { + return amount; + } + + public void setAmount(CoinValue amount) { + this.amount = amount; + } + + public int getRefundReason() { + return refundReason; + } + + public void setRefundReason(int refundReason) { + this.refundReason = refundReason; + } + + @Override + public AminoSerializable newAminoMessage() { + return new UpdateTransferOutClaimMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, refundAddress, refundAddress == null || refundAddress.isDefaultOrEmpty()) + .addField(CoinValue.class, amount, amount == null) + .addField(Integer.class, refundReason, false) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + refundAddress = ((Bech32AddressValue) value); + break; + case 2: + amount = ((CoinValue) value); + break; + case 3: + refundReason = ((int) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/common/Bech32AddressValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/common/Bech32AddressValue.java new file mode 100644 index 00000000..fafb951e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/common/Bech32AddressValue.java @@ -0,0 +1,102 @@ +package com.binance.dex.api.client.encoding.message.common; + +import com.binance.dex.api.client.encoding.Bech32; +import com.binance.dex.api.client.encoding.ByteUtil; +import com.binance.dex.api.client.encoding.Crypto; +import com.binance.dex.api.client.encoding.amino.AminoCustomSerialized; +import com.binance.dex.api.client.encoding.amino.WireType; +import com.binance.dex.api.client.encoding.serializer.Bech32AddressValueToStringSerializer; +import com.binance.dex.api.client.rlp.RlpDecodable; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +@JsonSerialize(using = Bech32AddressValueToStringSerializer.class) +public class Bech32AddressValue implements AminoCustomSerialized, RlpDecodable { + + private String hrp; + + private byte[] raw; + + public static Bech32AddressValue fromBech32String(String address){ + return new Bech32AddressValue(address); + } + + public static Bech32AddressValue fromBech32StringWithNewHrp(String originalAddress, String hrp){ + return new Bech32AddressValue(originalAddress, hrp); + } + + public Bech32AddressValue() { } + + public Bech32AddressValue(String address) { + this.hrp = Bech32.decode(address).getHrp(); + this.raw = Crypto.decodeAddress(address); + } + + public Bech32AddressValue(String originalAddress, String hrp){ + this.hrp = hrp; + this.raw = Crypto.decodeAddress(originalAddress); + } + + public String getHrp() { + return hrp; + } + + public void setHrp(String hrp) { + this.hrp = hrp; + } + + public void setRaw(byte[] raw) { + this.raw = raw; + } + + public byte[] getRaw(){ + return raw; + } + + @Override + public AminoCustomSerialized newAminoSerInstance() { + return new Bech32AddressValue(); + } + + @Override + public boolean isDefaultOrEmpty() { + return ByteUtil.isEmpty(raw); + } + + @Override + public int getWireType() { + return WireType.LENGTH_DELIMITED; + } + + @Override + public void encode(CodedOutputStream outputStream) throws IOException { + if (raw != null) { + outputStream.writeByteArrayNoTag(raw); + } + } + + @Override + public void decode(CodedInputStream inputStream) throws IOException { + raw = inputStream.readByteArray(); + } + + @Override + public int getSerializedSize() { + if (ByteUtil.isEmpty(raw)) { + return 0; + }else{ + return CodedOutputStream.computeByteArraySizeNoTag(raw); + } + } + + @Override + public void decode(byte[] raw, Object superInstance) { + this.raw = raw; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/common/CoinValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/common/CoinValue.java new file mode 100644 index 00000000..9002d645 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/common/CoinValue.java @@ -0,0 +1,84 @@ +package com.binance.dex.api.client.encoding.message.common; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.Token; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class CoinValue implements AminoSerializable { + + @JsonProperty(value = "denom") + private String denom; + + @JsonProperty(value = "amount") + private long amount; + + public CoinValue() { + } + + public CoinValue(String denom, Long amount) { + this.denom = denom; + this.amount = amount; + } + + public Token toToken(){ + Token token = new Token(); + token.setDenom(denom); + token.setAmount(amount); + return token; + } + + public String getDenom() { + return denom; + } + + public void setDenom(String denom) { + this.denom = denom; + } + + public long getAmount() { + return amount; + } + + public void setAmount(long amount) { + this.amount = amount; + } + + @Override + public AminoSerializable newAminoMessage() { + return new CoinValueStr(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(String.class, denom, StringUtils.isEmpty(denom)) + .addField(Long.class, amount, amount == 0) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + denom = ((String) value); + break; + case 2: + amount = ((long) value); + break; + default: + break; + } + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/common/CoinValueStr.java b/src/main/java/com/binance/dex/api/client/encoding/message/common/CoinValueStr.java new file mode 100644 index 00000000..84613ecd --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/common/CoinValueStr.java @@ -0,0 +1,86 @@ +package com.binance.dex.api.client.encoding.message.common; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.Token; +import com.binance.dex.api.client.encoding.serializer.LongToStringSerializer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class CoinValueStr implements AminoSerializable { + + @JsonProperty(value = "denom") + private String denom; + + @JsonProperty(value = "amount") + @JsonSerialize(using = LongToStringSerializer.class) + private long amount; + + public CoinValueStr() { + } + + public CoinValueStr(String denom, Long amount) { + this.denom = denom; + this.amount = amount; + } + + public Token toToken(){ + Token token = new Token(); + token.setDenom(denom); + token.setAmount(amount); + return token; + } + + public String getDenom() { + return denom; + } + + public void setDenom(String denom) { + this.denom = denom; + } + + public long getAmount() { + return amount; + } + + public void setAmount(long amount) { + this.amount = amount; + } + + @Override + public AminoSerializable newAminoMessage() { + return new CoinValueStr(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(String.class, denom, StringUtils.isEmpty(denom)) + .addField(Long.class, amount, amount == 0) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + denom = ((String) value); + break; + case 2: + amount = ((long) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/common/Dec.java b/src/main/java/com/binance/dex/api/client/encoding/message/common/Dec.java new file mode 100644 index 00000000..32e9f506 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/common/Dec.java @@ -0,0 +1,61 @@ +package com.binance.dex.api.client.encoding.message.common; + +import com.binance.dex.api.client.encoding.amino.AminoCustomSerialized; +import com.binance.dex.api.client.encoding.amino.WireType; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +@Deprecated +public class Dec implements AminoCustomSerialized { + + private long value; + + public long getValue() { + return value; + } + + public void setValue(long value) { + this.value = value; + } + + public static Dec newInstance(long v){ + Dec dec = new Dec(); + dec.setValue(v); + return dec; + } + + @Override + public AminoCustomSerialized newAminoSerInstance() { + return new Dec(); + } + + @Override + public boolean isDefaultOrEmpty() { + return value == 0L; + } + + @Override + public int getWireType() { + return WireType.LENGTH_DELIMITED; + } + + @Override + public void encode(CodedOutputStream outputStream) throws IOException { + outputStream.writeInt64NoTag(value); + } + + @Override + public void decode(CodedInputStream inputStream) throws IOException { + value = inputStream.readInt64(); + } + + @Override + public int getSerializedSize() { + return CodedOutputStream.computeInt64SizeNoTag(value); + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/common/EthAddressValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/common/EthAddressValue.java new file mode 100644 index 00000000..e7ceefe7 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/common/EthAddressValue.java @@ -0,0 +1,109 @@ +package com.binance.dex.api.client.encoding.message.common; + +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.encoding.amino.AminoCustomSerialized; +import com.binance.dex.api.client.encoding.amino.WireType; +import com.binance.dex.api.client.encoding.serializer.EthAddressValueToStringSerializer; +import com.binance.dex.api.client.rlp.RlpDecodable; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +@JsonSerialize(using = EthAddressValueToStringSerializer.class) +public class EthAddressValue implements AminoCustomSerialized, RlpDecodable { + + private String address; + + public static EthAddressValue from(String addr){ + return new EthAddressValue(toChecksumAddress(addr)); + } + + public EthAddressValue() { + } + + public EthAddressValue(String address) { + this.address = address; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + @Override + public AminoCustomSerialized newAminoSerInstance() { + return new EthAddressValue(); + } + + @Override + public boolean isDefaultOrEmpty() { + return StringUtils.isEmpty(address); + } + + @Override + public void encode(CodedOutputStream outputStream) throws IOException { + outputStream.writeByteArrayNoTag(getValueBytes()); + } + + @Override + public int getWireType() { + return WireType.LENGTH_DELIMITED; + } + + @Override + public void decode(CodedInputStream inputStream) throws IOException { + byte[] bytes = inputStream.readByteArray(); + address = Hex.toHexString(bytes); + address = "0x" + address; + } + + @Override + public int getSerializedSize() { + if (StringUtils.isEmpty(address)){ + return 0; + }else{ + return CodedOutputStream.computeByteArraySizeNoTag(getValueBytes()); + } + } + + private byte[] getValueBytes(){ + String addr = address; + if (addr.startsWith("0x")){ + addr = address.substring(2); + } + return Hex.decode(addr); + } + + @Override + public void decode(byte[] raw, Object superInstance) { + address = Hex.toHexString(raw); + address = "0x" + address; + } + + public static String toChecksumAddress(String address) { + String lowercaseAddress = EncodeUtils.cleanHexPrefix(address).toLowerCase(); + String addressHash = EncodeUtils.cleanHexPrefix(EncodeUtils.sha3String(lowercaseAddress)); + StringBuilder result = new StringBuilder(lowercaseAddress.length() + 2); + result.append("0x"); + + for(int i = 0; i < lowercaseAddress.length(); ++i) { + if (Integer.parseInt(String.valueOf(addressHash.charAt(i)), 16) >= 8) { + result.append(String.valueOf(lowercaseAddress.charAt(i)).toUpperCase()); + } else { + result.append(lowercaseAddress.charAt(i)); + } + } + + return result.toString(); + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/SideChainIds.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/SideChainIds.java new file mode 100644 index 00000000..eef2139f --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/SideChainIds.java @@ -0,0 +1,10 @@ +package com.binance.dex.api.client.encoding.message.sidechain; + +/** + * @author Fitz.Lu + **/ +public class SideChainIds { + + public static final String RIALTO = "rialto"; + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/BaseQueryParams.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/BaseQueryParams.java new file mode 100644 index 00000000..fe72e8f8 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/BaseQueryParams.java @@ -0,0 +1,27 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Fitz.Lu + **/ +public class BaseQueryParams { + + @JsonProperty(value = "SideChainId") + protected String sideChainId; + + public BaseQueryParams() { + } + + public BaseQueryParams(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/BechValidator.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/BechValidator.java new file mode 100644 index 00000000..ed7d48d9 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/BechValidator.java @@ -0,0 +1,349 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.domain.stake.Validator; +import com.binance.dex.api.client.encoding.amino.Amino; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class BechValidator { + + static class CommissionForDecode { + + @JsonProperty(value = "rate") + private long rate; + + @JsonProperty(value = "max_rate") + private long maxRate; + + @JsonProperty(value = "max_change_rate") + private long maxChangeRate; + + @JsonProperty(value = "update_time") + private String updateTime; + + public CommissionForDecode() { + } + + public long getRate() { + return rate; + } + + public void setRate(long rate) { + this.rate = rate; + } + + public long getMaxRate() { + return maxRate; + } + + public void setMaxRate(long maxRate) { + this.maxRate = maxRate; + } + + public long getMaxChangeRate() { + return maxChangeRate; + } + + public void setMaxChangeRate(long maxChangeRate) { + this.maxChangeRate = maxChangeRate; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + + @JsonProperty(value = "fee_addr") + private String feeAddr; + + @JsonProperty(value = "operator_address") + private String operatorAddr; + + @JsonProperty(value = "consensus_pubkey") + private String consPubKey; + + @JsonProperty(value = "jailed") + private boolean jailed; + + @JsonProperty(value = "status") + private int status; + + @JsonProperty(value = "tokens") + private long tokens; + + @JsonProperty(value = "delegator_shares") + private long delegatorShares; + + @JsonProperty(value = "description") + private DescriptionValue description; + + @JsonProperty(value = "bond_height") + private long bondHeight; + + @JsonProperty(value = "bond_intra_tx_counter") + private int bondIntraTxCounter; + + @JsonProperty(value = "unbonding_height") + private long unBondingHeight; + + @JsonProperty(value = "unbonding_time") + private String unBondingMinTime; + + @JsonProperty(value = "commission") + private CommissionForDecode commission; + + @JsonProperty(value = "distribution_addr") + private String distributionAddr; + + @JsonProperty(value = "side_chain_id") + private String sideChainId; + + @JsonProperty(value = "side_cons_addr") + private String sideConsAddr; + + @JsonProperty(value = "side_fee_addr") + private String sideFeeAddr; + + @JsonProperty(value = "stake_snapshots") + private ArrayList stakeSnapShots; + + public ArrayList getStakeSnapShots() { + return stakeSnapShots; + } + + public void setStakeSnapShots(ArrayList stakeSnapShots) { + this.stakeSnapShots = stakeSnapShots; + } + + public String getAccumulatedStake() { + return accumulatedStake; + } + + public void setAccumulatedStake(String accumulatedStake) { + this.accumulatedStake = accumulatedStake; + } + + @JsonProperty(value = "accumulated_stake") + private String accumulatedStake; + + public BechValidator() { + } + + + public Validator toValidator() { + Validator validator = new Validator(); + if (feeAddr != null) { + validator.setFeeAddr(feeAddr); + } + if (operatorAddr != null) { + validator.setOperatorAddr(operatorAddr); + } + if (consPubKey != null) { + try { + validator.setConsPubKey(Amino.getByteArrayAfterTypePrefix(consPubKey.getBytes())); + }catch (IllegalStateException e){ + validator.setConsPubKey(consPubKey.getBytes()); + } + } + validator.setJailed(jailed); + validator.setStatus(status); + validator.setTokens(tokens); + validator.setDelegatorShares(delegatorShares); + + Description descript = new Description(); + if (description != null) { + descript.setMoniker(description.getMoniker()); + descript.setWebsite(description.getWebsite()); + descript.setDetails(description.getDetails()); + descript.setIdentity(description.getIdentity()); + } + validator.setDescription(descript); + + validator.setBondHeight(bondHeight); + validator.setBondIntraTxCounter(bondIntraTxCounter); + validator.setUnBondingHeight(unBondingHeight); +// validator.setUnBondingMinTime(unBondingMinTime); + + Commission comm = new Commission(); + if (commission != null) { + comm.setRate(commission.getRate()); + comm.setMaxRate(commission.getMaxRate()); + comm.setMaxChangeRate(commission.getMaxChangeRate()); +// comm.setUpdateTimeInMs(commission.getUpdateTime()); + } + validator.setCommission(comm); + + if (!StringUtils.isEmpty(sideChainId)) { + if (distributionAddr != null) { + validator.setDistributionAddr(distributionAddr); + } + validator.setSideChainId(sideChainId); + if (sideConsAddr != null) { + validator.setSideConsAddr(sideConsAddr); + } + if (sideFeeAddr != null) { + validator.setSideFeeAddr(sideFeeAddr); + } + } + + if(stakeSnapShots != null && stakeSnapShots.size() > 0){ + ArrayList stakeSnapShots = new ArrayList<>(); + for(String stakeSnapShot : stakeSnapShots){ + stakeSnapShots.add(stakeSnapShot); + } + validator.setStakeSnapShots(stakeSnapShots); + } + + validator.setAccumulatedStake(accumulatedStake); + + return validator; + } + + public String getConsPubKey() { + return consPubKey; + } + + public void setConsPubKey(String consPubKey) { + this.consPubKey = consPubKey; + } + + public boolean isJailed() { + return jailed; + } + + public void setJailed(boolean jailed) { + this.jailed = jailed; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public long getTokens() { + return tokens; + } + + public void setTokens(long tokens) { + this.tokens = tokens; + } + + public long getDelegatorShares() { + return delegatorShares; + } + + public void setDelegatorShares(long delegatorShares) { + this.delegatorShares = delegatorShares; + } + + public long getBondHeight() { + return bondHeight; + } + + public void setBondHeight(long bondHeight) { + this.bondHeight = bondHeight; + } + + public int getBondIntraTxCounter() { + return bondIntraTxCounter; + } + + public void setBondIntraTxCounter(int bondIntraTxCounter) { + this.bondIntraTxCounter = bondIntraTxCounter; + } + + public long getUnBondingHeight() { + return unBondingHeight; + } + + public void setUnBondingHeight(long unBondingHeight) { + this.unBondingHeight = unBondingHeight; + } + + public String getUnBondingMinTime() { + return unBondingMinTime; + } + + public void setUnBondingMinTime(String unBondingMinTime) { + this.unBondingMinTime = unBondingMinTime; + } + + public DescriptionValue getDescription() { + return description; + } + + public void setDescription(DescriptionValue description) { + this.description = description; + } + + public CommissionForDecode getCommission() { + return commission; + } + + public void setCommission(CommissionForDecode commission) { + this.commission = commission; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(String sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public String getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(String sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + public String getFeeAddr() { + return feeAddr; + } + + public void setFeeAddr(String feeAddr) { + this.feeAddr = feeAddr; + } + + public String getOperatorAddr() { + return operatorAddr; + } + + public void setOperatorAddr(String operatorAddr) { + this.operatorAddr = operatorAddr; + } + + public String getDistributionAddr() { + return distributionAddr; + } + + public void setDistributionAddr(String distributionAddr) { + this.distributionAddr = distributionAddr; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/Delegation.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/Delegation.java new file mode 100644 index 00000000..f6a3d8ec --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/Delegation.java @@ -0,0 +1,55 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class Delegation { + + @JsonProperty(value = "delegator_addr") + private String delegatorAddress; + + @JsonProperty(value = "validator_addr") + private String validatorAddress; + + @JsonProperty(value = "shares") + private long shares; + + public Delegation() { + } + + public Delegation(String delegatorAddress, String validatorAddress, long shares) { + this.delegatorAddress = delegatorAddress; + this.validatorAddress = validatorAddress; + this.shares = shares; + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public long getShares() { + return shares; + } + + public void setShares(long shares) { + this.shares = shares; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/DelegationResponse.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/DelegationResponse.java new file mode 100644 index 00000000..fe2c785b --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/DelegationResponse.java @@ -0,0 +1,44 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.binance.dex.api.client.encoding.message.common.CoinValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class DelegationResponse { + + @JsonProperty(value = "Delegation") + private Delegation delegation; + + @JsonProperty(value = "balance") + private CoinValue balance; + + public DelegationResponse() { + } + + public DelegationResponse(Delegation delegation, CoinValue balance) { + this.delegation = delegation; + this.balance = balance; + } + + public Delegation getDelegation() { + return delegation; + } + + public void setDelegation(Delegation delegation) { + this.delegation = delegation; + } + + public CoinValue getBalance() { + return balance; + } + + public void setBalance(CoinValue balance) { + this.balance = balance; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/PoolMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/PoolMessage.java new file mode 100644 index 00000000..254f36b5 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/PoolMessage.java @@ -0,0 +1,60 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.common.Dec; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class PoolMessage implements AminoSerializable { + + private Dec looseTokens; + + private Dec bondedTokens; + + public Dec getLooseTokens() { + return looseTokens; + } + + public void setLooseTokens(Dec looseTokens) { + this.looseTokens = looseTokens; + } + + public Dec getBondedTokens() { + return bondedTokens; + } + + public void setBondedTokens(Dec bondedTokens) { + this.bondedTokens = bondedTokens; + } + + @Override + public AminoSerializable newAminoMessage() { + return new PoolMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Dec.class, looseTokens, looseTokens == null) + .addField(Dec.class, bondedTokens, bondedTokens == null) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + looseTokens = ((Dec) value); + break; + case 2: + bondedTokens = ((Dec) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryBondsParams.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryBondsParams.java new file mode 100644 index 00000000..ff5a905c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryBondsParams.java @@ -0,0 +1,46 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class QueryBondsParams extends BaseQueryParams { + + @JsonProperty(value = "DelegatorAddr") + private String delegatorAddr; + + @JsonProperty(value = "ValidatorAddr") + private String validatorAddr; + + public QueryBondsParams() { + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(String delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public String getValidatorAddr() { + return validatorAddr; + } + + public void setValidatorAddr(String validatorAddr) { + this.validatorAddr = validatorAddr; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryDelegatorParams.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryDelegatorParams.java new file mode 100644 index 00000000..ce4bf3f4 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryDelegatorParams.java @@ -0,0 +1,20 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Fitz.Lu + **/ +public class QueryDelegatorParams extends BaseQueryParams { + + @JsonProperty(value = "DelegatorAddr") + private String delegatorAddr; + + public String getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(String delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryRedelegationParams.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryRedelegationParams.java new file mode 100644 index 00000000..9f90109a --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryRedelegationParams.java @@ -0,0 +1,67 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +/** + * @author Francis.Liu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class QueryRedelegationParams extends BaseQueryParams { + + @JsonProperty(value = "DelegatorAddr") + private String delegatorAddr; + + @JsonProperty(value = "ValSrcAddr") + private String validatorSrcAddr; + + @JsonProperty(value = "ValDstAddr") + private String validatorDstAddr; + + public QueryRedelegationParams() { + } + + public QueryRedelegationParams(String sideChainId, String delegatorAddr, String validatorSrcAddr, String validatorDstAddr) { + super(sideChainId); + this.delegatorAddr = delegatorAddr; + this.validatorSrcAddr = validatorSrcAddr; + this.validatorDstAddr = validatorDstAddr; + } + + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public String getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(String delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public String getValidatorSrcAddr() { + return validatorSrcAddr; + } + + public void setValidatorSrcAddr(String validatorSrcAddr) { + this.validatorSrcAddr = validatorSrcAddr; + } + + public String getValidatorDstAddr() { + return validatorDstAddr; + } + + public void setValidatorDstAddr(String validatorDstAddr) { + this.validatorDstAddr = validatorDstAddr; + } + +} + diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QuerySideProposal.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QuerySideProposal.java new file mode 100644 index 00000000..b6c411b1 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QuerySideProposal.java @@ -0,0 +1,33 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class QuerySideProposal extends BaseQueryParams { + + @JsonProperty(value = "ProposalID") + private String proposalID; + + public QuerySideProposal() { + } + + public String getProposalID() { + return proposalID; + } + + public void setProposalID(String proposalID) { + this.proposalID = proposalID; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryTopValidatorParams.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryTopValidatorParams.java new file mode 100644 index 00000000..44dfacfd --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryTopValidatorParams.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Fitz.Lu + **/ +public class QueryTopValidatorParams extends BaseQueryParams { + + @JsonProperty(value = "Top") + private int top; + + public QueryTopValidatorParams() { + } + + public int getTop() { + return top; + } + + public void setTop(int top) { + this.top = top; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryValidatorParams.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryValidatorParams.java new file mode 100644 index 00000000..476c168d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/QueryValidatorParams.java @@ -0,0 +1,29 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Fitz.Lu + **/ +public class QueryValidatorParams extends BaseQueryParams { + + @JsonProperty(value = "ValidatorAddr") + private Bech32AddressValue ValidatorAddress; + + public QueryValidatorParams() { + } + + public QueryValidatorParams(String sideChainId, Bech32AddressValue validatorAddress) { + this.sideChainId = sideChainId; + ValidatorAddress = validatorAddress; + } + + public Bech32AddressValue getValidatorAddress() { + return ValidatorAddress; + } + + public void setValidatorAddress(Bech32AddressValue validatorAddress) { + ValidatorAddress = validatorAddress; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/SideChainRedelegationMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/SideChainRedelegationMessage.java new file mode 100644 index 00000000..1ac05596 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/SideChainRedelegationMessage.java @@ -0,0 +1,116 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.binance.dex.api.client.encoding.message.common.CoinValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class SideChainRedelegationMessage { + + @JsonProperty(value = "delegator_addr") + private String delegatorAddress; + + @JsonProperty(value = "validator_src_addr") + private String srcValidatorAddress; + + @JsonProperty(value = "validator_dst_addr") + private String dstValidatorAddress; + + @JsonProperty(value = "creation_height") + private long createHeight; + + @JsonProperty(value = "min_time") + private String minTime; + + @JsonProperty(value = "initial_balance") + private CoinValue initialBalance; + + @JsonProperty(value = "balance") + private CoinValue balance; + + @JsonProperty(value = "shares_src") + private long srcShares; + + @JsonProperty(value = "shares_dst") + private long dstShare; + + public SideChainRedelegationMessage() { + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getSrcValidatorAddress() { + return srcValidatorAddress; + } + + public void setSrcValidatorAddress(String srcValidatorAddress) { + this.srcValidatorAddress = srcValidatorAddress; + } + + public String getDstValidatorAddress() { + return dstValidatorAddress; + } + + public void setDstValidatorAddress(String dstValidatorAddress) { + this.dstValidatorAddress = dstValidatorAddress; + } + + public long getCreateHeight() { + return createHeight; + } + + public void setCreateHeight(long createHeight) { + this.createHeight = createHeight; + } + + public String getMinTime() { + return minTime; + } + + public void setMinTime(String minTime) { + this.minTime = minTime; + } + + public CoinValue getInitialBalance() { + return initialBalance; + } + + public void setInitialBalance(CoinValue initialBalance) { + this.initialBalance = initialBalance; + } + + public CoinValue getBalance() { + return balance; + } + + public void setBalance(CoinValue balance) { + this.balance = balance; + } + + public long getSrcShares() { + return srcShares; + } + + public void setSrcShares(long srcShares) { + this.srcShares = srcShares; + } + + public long getDstShare() { + return dstShare; + } + + public void setDstShare(long dstShare) { + this.dstShare = dstShare; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/SideChainValidatorMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/SideChainValidatorMessage.java new file mode 100644 index 00000000..decea6a6 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/SideChainValidatorMessage.java @@ -0,0 +1,298 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.sidechain.value.CommissionValue; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * @author Fitz.Lu + **/ +public class SideChainValidatorMessage implements AminoSerializable { + + private byte[] feeAddr; + + private byte[] operatorAddr; + + private byte[] consPubKey; + + private boolean jailed; + + private int status; + + private Dec tokens = Dec.newInstance(0L); + + private Dec delegatorShares = Dec.newInstance(0L); + + private DescriptionValue description = new DescriptionValue(); + + private long bondHeight; + + private int bondIntraTxCounter; + + private long unBondingHeight; + + private long unBondingMinTime; + + private CommissionValue commission = new CommissionValue(); + + private byte[] distributionAddr; + + private String sideChainId; + + private byte[] sideConsAddr; + + private byte[] sideFeeAddr; + + public byte[] getFeeAddr() { + return feeAddr; + } + + public void setFeeAddr(byte[] feeAddr) { + this.feeAddr = feeAddr; + } + + public byte[] getOperatorAddr() { + return operatorAddr; + } + + public void setOperatorAddr(byte[] operatorAddr) { + this.operatorAddr = operatorAddr; + } + + public byte[] getConsPubKey() { + return consPubKey; + } + + public void setConsPubKey(byte[] consPubKey) { + this.consPubKey = consPubKey; + } + + public boolean isJailed() { + return jailed; + } + + public void setJailed(boolean jailed) { + this.jailed = jailed; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public Dec getTokens() { + return tokens; + } + + public void setTokens(Dec tokens) { + this.tokens = tokens; + } + + public Dec getDelegatorShares() { + return delegatorShares; + } + + public void setDelegatorShares(Dec delegatorShares) { + this.delegatorShares = delegatorShares; + } + + public DescriptionValue getDescription() { + return description; + } + + public void setDescription(DescriptionValue description) { + this.description = description; + } + + public long getBondHeight() { + return bondHeight; + } + + public void setBondHeight(long bondHeight) { + this.bondHeight = bondHeight; + } + + public int getBondIntraTxCounter() { + return bondIntraTxCounter; + } + + public void setBondIntraTxCounter(int bondIntraTxCounter) { + this.bondIntraTxCounter = bondIntraTxCounter; + } + + public long getUnBondingHeight() { + return unBondingHeight; + } + + public void setUnBondingHeight(long unBondingHeight) { + this.unBondingHeight = unBondingHeight; + } + + public long getUnBondingMinTime() { + return unBondingMinTime; + } + + public void setUnBondingMinTime(long unBondingMinTime) { + this.unBondingMinTime = unBondingMinTime; + } + + public CommissionValue getCommission() { + return commission; + } + + public void setCommission(CommissionValue commission) { + this.commission = commission; + } + + public byte[] getDistributionAddr() { + return distributionAddr; + } + + public void setDistributionAddr(byte[] distributionAddr) { + this.distributionAddr = distributionAddr; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public byte[] getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(byte[] sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public byte[] getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(byte[] sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + @Override + public AminoSerializable newAminoMessage() { + return new SideChainValidatorMessage(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + feeAddr = (byte[]) value; + break; + case 2: + operatorAddr = (byte[]) value; + break; + case 3: + consPubKey = (byte[]) value; + break; + case 4: + jailed = ((boolean) value); + break; + case 5: + status = ((Integer) value); + break; + case 6: + tokens = ((Dec) value); + break; + case 7: + delegatorShares = ((Dec) value); + break; + case 8: + description = ((DescriptionValue) value); + break; + case 9: + bondHeight = ((long) value); + break; + case 10: + bondIntraTxCounter = ((int) value); + break; + case 11: + unBondingHeight = ((long) value); + break; + case 12: + unBondingMinTime = ((long) value); + break; + case 13: + commission = ((CommissionValue) value); + break; + case 14: + distributionAddr = ((byte[]) value); + break; + case 15: + sideChainId = ((String) value); + break; + case 16: + sideConsAddr = ((byte[]) value); + break; + case 17: + sideFeeAddr = ((byte[]) value); + break; + default: + break; + } + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(byte[].class, feeAddr, feeAddr == null || feeAddr.length == 0) + .addField(byte[].class, operatorAddr, operatorAddr == null || operatorAddr.length == 0) + .addField(byte[].class, consPubKey, consPubKey == null || consPubKey.length == 0) + .addField(Boolean.class, jailed, !jailed) + .addField(Integer.class, status, status == 0) + .addField(Dec.class, tokens, tokens == null) + .addField(Dec.class, delegatorShares, delegatorShares == null) + .addField(DescriptionValue.class, description, description == null) + .addField(Long.class, bondHeight, bondHeight == 0) + .addField(Integer.class, bondIntraTxCounter, bondIntraTxCounter == 0) + .addField(Long.class, unBondingHeight, unBondingHeight == 0) + .addField(Long.class, unBondingMinTime, unBondingMinTime == 0) + .addField(CommissionValue.class, commission, commission == null) + .addField(byte[].class, distributionAddr, distributionAddr == null || distributionAddr.length == 0) + .addField(String.class, sideChainId, StringUtils.isEmpty(sideChainId)) + .addField(byte[].class, sideConsAddr, sideConsAddr == null || sideConsAddr.length == 0) + .addField(byte[].class, sideFeeAddr, sideFeeAddr == null || sideFeeAddr.length == 0) + .build(); + } + + @Override + public String toString() { + return "SideChainValidatorMessage{" + '\n' + + "feeAddr=" + Hex.toHexString(feeAddr)+ '\n' + + ", operatorAddr=" + Hex.toHexString(operatorAddr) + '\n' + + ", consPubKey=" + Hex.toHexString(consPubKey) + '\n' + + ", jailed=" + jailed + '\n' + + ", status=" + status + '\n' + + ", tokens=" + tokens + '\n' + + ", delegatorShares=" + delegatorShares + '\n' + + ", description=" + description + '\n' + + ", bondHeight=" + bondHeight + '\n' + + ", bondIntraTxCounter=" + bondIntraTxCounter + '\n' + + ", unBondingHeight=" + unBondingHeight + '\n' + + ", unBondingMinTime=" + unBondingMinTime + '\n' + + ", commission=" + commission + '\n' + + ", distributionAddr=" + Arrays.toString(distributionAddr) + '\n' + + ", sideChainId='" + sideChainId + '\'' + '\n' + + ", sideConsAddr=" + Arrays.toString(sideConsAddr) + '\n' + + ", sideFeeAddr=" + Arrays.toString(sideFeeAddr) + '\n' + + '}'; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/UnBondingDelegationMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/UnBondingDelegationMessage.java new file mode 100644 index 00000000..f1baa0f2 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/query/UnBondingDelegationMessage.java @@ -0,0 +1,83 @@ +package com.binance.dex.api.client.encoding.message.sidechain.query; + +import com.binance.dex.api.client.encoding.message.Token; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class UnBondingDelegationMessage { + + @JsonProperty(value = "delegator_addr") + private String delegatorAddress; + + @JsonProperty(value = "validator_addr") + private String validatorAddress; + + @JsonProperty(value = "creation_height") + private long createHeight; + + @JsonProperty(value = "min_time") + private String minTime; + + @JsonProperty(value = "initial_balance") + private Token initialBalance; + + @JsonProperty(value = "balance") + private Token balance; + + public UnBondingDelegationMessage() { + } + + public String getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(String delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public String getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(String validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public long getCreateHeight() { + return createHeight; + } + + public void setCreateHeight(long createHeight) { + this.createHeight = createHeight; + } + + public String getMinTime() { + return minTime; + } + + public void setMinTime(String minTime) { + this.minTime = minTime; + } + + public Token getInitialBalance() { + return initialBalance; + } + + public void setInitialBalance(Token initialBalance) { + this.initialBalance = initialBalance; + } + + public Token getBalance() { + return balance; + } + + public void setBalance(Token balance) { + this.balance = balance; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/CreateSideChainValidatorMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/CreateSideChainValidatorMessage.java new file mode 100644 index 00000000..4220ecab --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/CreateSideChainValidatorMessage.java @@ -0,0 +1,164 @@ +package com.binance.dex.api.client.encoding.message.sidechain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.binance.dex.api.client.encoding.message.sidechain.value.*; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class CreateSideChainValidatorMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "description") + private DescriptionValue description = new DescriptionValue(); + + @JsonProperty(value = "commission") + private CommissionMsgValue commission = new CommissionMsgValue(); + + @JsonProperty(value = "delegator_address") + private Bech32AddressValue delegatorAddr; + + @JsonProperty(value = "validator_address") + private Bech32AddressValue validatorOperatorAddr; + + @JsonProperty(value = "delegation") + private CoinValueStr delegation; + + @JsonProperty(value = "side_chain_id") + private String sideChainId; + + @JsonProperty(value = "side_cons_addr") + private byte[] sideConsAddr; + + @JsonProperty(value = "side_fee_addr") + private byte[] sideFeeAddr; + + @Override + public boolean useAminoJson() { + return true; + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + description = ((DescriptionValue) value); + break; + case 2: + commission = ((CommissionMsgValue) value); + break; + case 3: + delegatorAddr = ((Bech32AddressValue) value); + break; + case 4: + validatorOperatorAddr = ((Bech32AddressValue) value); + break; + case 5: + delegation = ((CoinValueStr) value); + break; + case 6: + sideChainId = ((String) value); + break; + case 7: + sideConsAddr = ((byte[]) value); + break; + case 8: + sideFeeAddr = ((byte[]) value); + break; + default: + break; + } + } + + @Override + public AminoSerializable newAminoMessage() { + return new CreateSideChainValidatorMessage(); + } + + @Override + public ArrayList> IterateFields() { + ArrayList> fields = new ArrayList<>(); + fields.add(new AminoField<>(DescriptionValue.class, description, description == null)); + fields.add(new AminoField<>(CommissionMsgValue.class, commission, commission == null)); + fields.add(new AminoField<>(Bech32AddressValue.class, delegatorAddr, delegatorAddr == null || delegatorAddr.isDefaultOrEmpty())); + fields.add(new AminoField<>(Bech32AddressValue.class, validatorOperatorAddr, validatorOperatorAddr == null || validatorOperatorAddr.isDefaultOrEmpty())); + fields.add(new AminoField<>(CoinValueStr.class, delegation, delegation == null)); + fields.add(new AminoField<>(String.class, sideChainId, StringUtils.isEmpty(sideChainId))); + fields.add(new AminoField<>(byte[].class, sideConsAddr, sideConsAddr == null || sideConsAddr.length == 0)); + fields.add(new AminoField<>(byte[].class, sideFeeAddr, sideFeeAddr == null || sideFeeAddr.length == 0)); + return fields; + } + + public DescriptionValue getDescription() { + return description; + } + + public void setDescription(DescriptionValue description) { + this.description = description; + } + + public CommissionMsgValue getCommission() { + return commission; + } + + public void setCommission(CommissionMsgValue commission) { + this.commission = commission; + } + + public Bech32AddressValue getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(Bech32AddressValue delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public Bech32AddressValue getValidatorOperatorAddr() { + return validatorOperatorAddr; + } + + public void setValidatorOperatorAddr(Bech32AddressValue validatorOperatorAddr) { + this.validatorOperatorAddr = validatorOperatorAddr; + } + + public CoinValueStr getDelegation() { + return delegation; + } + + public void setDelegation(CoinValueStr delegation) { + this.delegation = delegation; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public byte[] getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(byte[] sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public byte[] getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(byte[] sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/CreateSideChainValidatorWithVoteAddrMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/CreateSideChainValidatorWithVoteAddrMessage.java new file mode 100644 index 00000000..d2ca1300 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/CreateSideChainValidatorWithVoteAddrMessage.java @@ -0,0 +1,179 @@ +package com.binance.dex.api.client.encoding.message.sidechain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.binance.dex.api.client.encoding.message.sidechain.value.CommissionMsgValue; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class CreateSideChainValidatorWithVoteAddrMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "description") + private DescriptionValue description = new DescriptionValue(); + + @JsonProperty(value = "commission") + private CommissionMsgValue commission = new CommissionMsgValue(); + + @JsonProperty(value = "delegator_address") + private Bech32AddressValue delegatorAddr; + + @JsonProperty(value = "validator_address") + private Bech32AddressValue validatorOperatorAddr; + + @JsonProperty(value = "delegation") + private CoinValueStr delegation; + + @JsonProperty(value = "side_chain_id") + private String sideChainId; + + @JsonProperty(value = "side_cons_addr") + private byte[] sideConsAddr; + + @JsonProperty(value = "side_fee_addr") + private byte[] sideFeeAddr; + + @JsonProperty(value = "side_vote_addr") + private byte[] sideVoteAddr; + + @Override + public boolean useAminoJson() { + return true; + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + description = ((DescriptionValue) value); + break; + case 2: + commission = ((CommissionMsgValue) value); + break; + case 3: + delegatorAddr = ((Bech32AddressValue) value); + break; + case 4: + validatorOperatorAddr = ((Bech32AddressValue) value); + break; + case 5: + delegation = ((CoinValueStr) value); + break; + case 6: + sideChainId = ((String) value); + break; + case 7: + sideConsAddr = ((byte[]) value); + break; + case 8: + sideFeeAddr = ((byte[]) value); + break; + case 9: + sideVoteAddr = ((byte[]) value); + break; + default: + break; + } + } + + @Override + public AminoSerializable newAminoMessage() { + return new CreateSideChainValidatorWithVoteAddrMessage(); + } + + @Override + public ArrayList> IterateFields() { + ArrayList> fields = new ArrayList<>(); + fields.add(new AminoField<>(DescriptionValue.class, description, description == null)); + fields.add(new AminoField<>(CommissionMsgValue.class, commission, commission == null)); + fields.add(new AminoField<>(Bech32AddressValue.class, delegatorAddr, delegatorAddr == null || delegatorAddr.isDefaultOrEmpty())); + fields.add(new AminoField<>(Bech32AddressValue.class, validatorOperatorAddr, validatorOperatorAddr == null || validatorOperatorAddr.isDefaultOrEmpty())); + fields.add(new AminoField<>(CoinValueStr.class, delegation, delegation == null)); + fields.add(new AminoField<>(String.class, sideChainId, StringUtils.isEmpty(sideChainId))); + fields.add(new AminoField<>(byte[].class, sideConsAddr, sideConsAddr == null || sideConsAddr.length == 0)); + fields.add(new AminoField<>(byte[].class, sideFeeAddr, sideFeeAddr == null || sideFeeAddr.length == 0)); + fields.add(new AminoField<>(byte[].class, sideVoteAddr, sideVoteAddr == null || sideVoteAddr.length == 0)); + return fields; + } + + public DescriptionValue getDescription() { + return description; + } + + public void setDescription(DescriptionValue description) { + this.description = description; + } + + public CommissionMsgValue getCommission() { + return commission; + } + + public void setCommission(CommissionMsgValue commission) { + this.commission = commission; + } + + public Bech32AddressValue getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(Bech32AddressValue delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public Bech32AddressValue getValidatorOperatorAddr() { + return validatorOperatorAddr; + } + + public void setValidatorOperatorAddr(Bech32AddressValue validatorOperatorAddr) { + this.validatorOperatorAddr = validatorOperatorAddr; + } + + public CoinValueStr getDelegation() { + return delegation; + } + + public void setDelegation(CoinValueStr delegation) { + this.delegation = delegation; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public byte[] getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(byte[] sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public byte[] getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(byte[] sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + public byte[] getSideVoteAddr() { + return sideVoteAddr; + } + + public void setSideVoteAddr(byte[] sideVoteAddr) { + this.sideVoteAddr = sideVoteAddr; + } +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/EditSideChainValidatorMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/EditSideChainValidatorMessage.java new file mode 100644 index 00000000..b8d33746 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/EditSideChainValidatorMessage.java @@ -0,0 +1,128 @@ +package com.binance.dex.api.client.encoding.message.sidechain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import com.binance.dex.api.client.encoding.serializer.DecToStringSerializer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class EditSideChainValidatorMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "description") + private DescriptionValue description; + + @JsonProperty(value = "address") + private Bech32AddressValue validatorOperatorAddress; + + @JsonProperty(value = "commission_rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec commissionRate; + + @JsonProperty(value = "side_chain_id") + private String sideChainId; + + @JsonProperty(value = "side_fee_addr") + private byte[] sideFeeAddr; + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + description = ((DescriptionValue) value); + break; + case 2: + validatorOperatorAddress = ((Bech32AddressValue) value); + break; + case 3: + commissionRate = ((Dec) value); + break; + case 4: + sideChainId = ((String) value); + break; + case 5: + sideFeeAddr = ((byte[]) value); + break; + default: + break; + } + } + + public EditSideChainValidatorMessage() { + } + + public DescriptionValue getDescription() { + return description; + } + + public void setDescription(DescriptionValue description) { + this.description = description; + } + + public Bech32AddressValue getValidatorOperatorAddress() { + return validatorOperatorAddress; + } + + public void setValidatorOperatorAddress(Bech32AddressValue validatorOperatorAddress) { + this.validatorOperatorAddress = validatorOperatorAddress; + } + + public Dec getCommissionRate() { + return commissionRate; + } + + public void setCommissionRate(Dec commissionRate) { + this.commissionRate = commissionRate; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public byte[] getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(byte[] sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + @Override + public boolean useAminoJson() { + return true; + } + + @Override + public AminoSerializable newAminoMessage() { + return new EditSideChainValidatorMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(DescriptionValue.class, description, description == null) + .addField(Bech32AddressValue.class, validatorOperatorAddress, validatorOperatorAddress == null || validatorOperatorAddress.isDefaultOrEmpty()) + .addField(Dec.class, commissionRate, commissionRate == null || commissionRate.isDefaultOrEmpty()) + .addField(String.class, sideChainId, StringUtils.isEmpty(sideChainId)) + .addField(byte[].class, sideFeeAddr, sideFeeAddr == null || sideFeeAddr.length == 0) + .build(); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/EditSideChainValidatorWithVoteAddrMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/EditSideChainValidatorWithVoteAddrMessage.java new file mode 100644 index 00000000..9a8e9448 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/EditSideChainValidatorWithVoteAddrMessage.java @@ -0,0 +1,162 @@ +package com.binance.dex.api.client.encoding.message.sidechain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import com.binance.dex.api.client.encoding.serializer.DecToStringSerializer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class EditSideChainValidatorWithVoteAddrMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "description") + private DescriptionValue description; + + @JsonProperty(value = "address") + private Bech32AddressValue validatorOperatorAddress; + + @JsonProperty(value = "commission_rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec commissionRate; + + @JsonProperty(value = "side_chain_id") + private String sideChainId; + + @JsonProperty(value = "side_fee_addr") + private byte[] sideFeeAddr; + + @JsonProperty(value = "side_cons_addr") + private byte[] sideConsAddr; + + @JsonProperty(value = "side_vote_addr") + private byte[] sideVoteAddr; + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + description = ((DescriptionValue) value); + break; + case 2: + validatorOperatorAddress = ((Bech32AddressValue) value); + break; + case 3: + commissionRate = ((Dec) value); + break; + case 4: + sideChainId = ((String) value); + break; + case 5: + sideFeeAddr = ((byte[]) value); + break; + case 6: + sideConsAddr = ((byte[]) value); + break; + case 7: + setSideVoteAddr((byte[]) value); + break; + default: + break; + } + } + + public EditSideChainValidatorWithVoteAddrMessage() { + } + + public DescriptionValue getDescription() { + return description; + } + + public void setDescription(DescriptionValue description) { + this.description = description; + } + + public Bech32AddressValue getValidatorOperatorAddress() { + return validatorOperatorAddress; + } + + public void setValidatorOperatorAddress(Bech32AddressValue validatorOperatorAddress) { + this.validatorOperatorAddress = validatorOperatorAddress; + } + + public Dec getCommissionRate() { + return commissionRate; + } + + public void setCommissionRate(Dec commissionRate) { + this.commissionRate = commissionRate; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + public byte[] getSideFeeAddr() { + return sideFeeAddr; + } + + public void setSideFeeAddr(byte[] sideFeeAddr) { + this.sideFeeAddr = sideFeeAddr; + } + + public byte[] getSideConsAddr() { + return sideConsAddr; + } + + public void setSideConsAddr(byte[] sideConsAddr) { + this.sideConsAddr = sideConsAddr; + } + + public byte[] getSideVoteAddr() { + return sideVoteAddr; + } + + public void setSideVoteAddr(byte[] sideVoteAddr) { + if (sideVoteAddr != null && sideVoteAddr.length > 48) { + sideVoteAddr = Arrays.copyOfRange(sideVoteAddr, 0, 48); + } + this.sideVoteAddr = sideVoteAddr; + } + + @Override + public boolean useAminoJson() { + return true; + } + + @Override + public AminoSerializable newAminoMessage() { + return new EditSideChainValidatorWithVoteAddrMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(DescriptionValue.class, description, description == null) + .addField(Bech32AddressValue.class, validatorOperatorAddress, validatorOperatorAddress == null || validatorOperatorAddress.isDefaultOrEmpty()) + .addField(Dec.class, commissionRate, commissionRate == null || commissionRate.isDefaultOrEmpty()) + .addField(String.class, sideChainId, StringUtils.isEmpty(sideChainId)) + .addField(byte[].class, sideFeeAddr, sideFeeAddr == null || sideFeeAddr.length == 0) + .addField(byte[].class, sideConsAddr, sideConsAddr == null || sideConsAddr.length == 0) + .addField(byte[].class, sideVoteAddr, sideVoteAddr == null || sideVoteAddr.length == 0) + .build(); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainDelegateMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainDelegateMessage.java new file mode 100644 index 00000000..7f2825ca --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainDelegateMessage.java @@ -0,0 +1,108 @@ +package com.binance.dex.api.client.encoding.message.sidechain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class SideChainDelegateMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "delegator_addr") + private Bech32AddressValue delegatorAddress; + + @JsonProperty(value = "validator_addr") + private Bech32AddressValue validatorAddress; + + @JsonProperty(value = "delegation") + private CoinValueStr delegation; + + @JsonProperty(value = "side_chain_id") + private String sideChainId; + + public SideChainDelegateMessage() { } + + public Bech32AddressValue getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(Bech32AddressValue delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public Bech32AddressValue getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(Bech32AddressValue validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public CoinValueStr getDelegation() { + return delegation; + } + + public void setDelegation(CoinValueStr delegation) { + this.delegation = delegation; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } + + @Override + public AminoSerializable newAminoMessage() { + return new SideChainDelegateMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, delegatorAddress, delegatorAddress == null || delegatorAddress.isDefaultOrEmpty()) + .addField(Bech32AddressValue.class, validatorAddress, validatorAddress == null || validatorAddress.isDefaultOrEmpty()) + .addField(CoinValueStr.class, delegation, delegation == null) + .addField(String.class, sideChainId, StringUtils.isEmpty(sideChainId)) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + delegatorAddress = ((Bech32AddressValue) value); + break; + case 2: + validatorAddress = ((Bech32AddressValue) value); + break; + case 3: + delegation = ((CoinValueStr) value); + break; + case 4: + sideChainId = ((String) value); + break; + default: + break; + } + } + + @Override + public boolean useAminoJson() { + return true; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainRedelegateMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainRedelegateMessage.java new file mode 100644 index 00000000..6705ed85 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainRedelegateMessage.java @@ -0,0 +1,123 @@ +package com.binance.dex.api.client.encoding.message.sidechain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class SideChainRedelegateMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "delegator_addr") + private Bech32AddressValue delegatorAddress; + + @JsonProperty(value = "validator_src_addr") + private Bech32AddressValue srcValidatorAddress; + + @JsonProperty(value = "validator_dst_addr") + private Bech32AddressValue dstValidatorAddress; + + @JsonProperty(value = "amount") + private CoinValueStr amount; + + @JsonProperty(value = "side_chain_id") + private String sideChainId; + + public SideChainRedelegateMessage() { + } + + @Override + public AminoSerializable newAminoMessage() { + return new SideChainRedelegateMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, delegatorAddress, delegatorAddress == null || delegatorAddress.isDefaultOrEmpty()) + .addField(Bech32AddressValue.class, srcValidatorAddress, srcValidatorAddress == null || srcValidatorAddress.isDefaultOrEmpty()) + .addField(Bech32AddressValue.class, dstValidatorAddress, dstValidatorAddress == null || dstValidatorAddress.isDefaultOrEmpty()) + .addField(CoinValueStr.class, amount, amount == null) + .addField(String.class, sideChainId, StringUtils.isEmpty(sideChainId)) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + delegatorAddress = ((Bech32AddressValue) value); + break; + case 2: + srcValidatorAddress = ((Bech32AddressValue) value); + break; + case 3: + dstValidatorAddress = ((Bech32AddressValue) value); + break; + case 4: + amount = ((CoinValueStr) value); + break; + case 5: + sideChainId = ((String) value); + break; + default: + break; + } + } + + @Override + public boolean useAminoJson() { + return true; + } + + public Bech32AddressValue getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(Bech32AddressValue delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public Bech32AddressValue getSrcValidatorAddress() { + return srcValidatorAddress; + } + + public void setSrcValidatorAddress(Bech32AddressValue srcValidatorAddress) { + this.srcValidatorAddress = srcValidatorAddress; + } + + public Bech32AddressValue getDstValidatorAddress() { + return dstValidatorAddress; + } + + public void setDstValidatorAddress(Bech32AddressValue dstValidatorAddress) { + this.dstValidatorAddress = dstValidatorAddress; + } + + public CoinValueStr getAmount() { + return amount; + } + + public void setAmount(CoinValueStr amount) { + this.amount = amount; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainStakeMigrationMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainStakeMigrationMessage.java new file mode 100644 index 00000000..be255abd --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainStakeMigrationMessage.java @@ -0,0 +1,120 @@ +package com.binance.dex.api.client.encoding.message.sidechain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class SideChainStakeMigrationMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "validator_src_addr") + private Bech32AddressValue validatorSrcAddr; + + @JsonProperty(value = "validator_dst_addr") + private byte[] validatorDstAddr; + + @JsonProperty(value = "delegator_addr") + private byte[] delegatorAddr; + + @JsonProperty(value = "refund_addr") + private Bech32AddressValue refundAddr; + + @JsonProperty(value = "amount") + private CoinValueStr amount; + + public SideChainStakeMigrationMessage() { + } + + @Override + public AminoSerializable newAminoMessage() { + return new SideChainStakeMigrationMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, validatorSrcAddr, validatorSrcAddr == null || validatorSrcAddr.isDefaultOrEmpty()) + .addField(byte[].class, validatorDstAddr, validatorDstAddr == null || validatorDstAddr.length == 0) + .addField(byte[].class, delegatorAddr, delegatorAddr == null || delegatorAddr.length == 0) + .addField(Bech32AddressValue.class, refundAddr, refundAddr == null || refundAddr.isDefaultOrEmpty()) + .addField(CoinValueStr.class, amount, amount == null) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + validatorSrcAddr = ((Bech32AddressValue) value); + break; + case 2: + validatorDstAddr = ((byte[]) value); + break; + case 3: + delegatorAddr = ((byte[]) value); + break; + case 4: + refundAddr = ((Bech32AddressValue) value); + break; + case 5: + amount = ((CoinValueStr) value); + break; + default: + break; + } + } + + @Override + public boolean useAminoJson() { + return true; + } + + public Bech32AddressValue getValidatorSrcAddr() { + return validatorSrcAddr; + } + + public void setValidatorSrcAddr(Bech32AddressValue validatorSrcAddr) { + this.validatorSrcAddr = validatorSrcAddr; + } + + public byte[] getValidatorDstAddr() { + return validatorDstAddr; + } + + public void setValidatorDstAddr(byte[] validatorDstAddr) { + this.validatorDstAddr = validatorDstAddr; + } + + public byte[] getDelegatorAddr() { + return delegatorAddr; + } + + public void setDelegatorAddr(byte[] delegatorAddr) { + this.delegatorAddr = delegatorAddr; + } + + public Bech32AddressValue getRefundAddr() { + return refundAddr; + } + + public void setRefundAddr(Bech32AddressValue refundAddr) { + this.refundAddr = refundAddr; + } + + public CoinValueStr getAmount() { + return amount; + } + + public void setAmount(CoinValueStr amount) { + this.amount = amount; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainUndelegateMessage.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainUndelegateMessage.java new file mode 100644 index 00000000..f36823de --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/transaction/SideChainUndelegateMessage.java @@ -0,0 +1,108 @@ +package com.binance.dex.api.client.encoding.message.sidechain.transaction; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class SideChainUndelegateMessage implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "delegator_addr") + private Bech32AddressValue delegatorAddress; + + @JsonProperty(value = "validator_addr") + private Bech32AddressValue validatorAddress; + + @JsonProperty(value = "amount") + private CoinValueStr amount; + + @JsonProperty(value = "side_chain_id") + private String sideChainId; + + public SideChainUndelegateMessage() { + } + + @Override + public boolean useAminoJson() { + return true; + } + + @Override + public AminoSerializable newAminoMessage() { + return new SideChainUndelegateMessage(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Bech32AddressValue.class, delegatorAddress, delegatorAddress == null || delegatorAddress.isDefaultOrEmpty()) + .addField(Bech32AddressValue.class, validatorAddress, validatorAddress == null || validatorAddress.isDefaultOrEmpty()) + .addField(CoinValueStr.class, amount, amount == null) + .addField(String.class, sideChainId, StringUtils.isEmpty(sideChainId)) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + delegatorAddress = ((Bech32AddressValue) value); + break; + case 2: + validatorAddress = ((Bech32AddressValue) value); + break; + case 3: + amount = ((CoinValueStr) value); + break; + case 4: + sideChainId = ((String) value); + break; + default: + break; + } + } + + public Bech32AddressValue getDelegatorAddress() { + return delegatorAddress; + } + + public void setDelegatorAddress(Bech32AddressValue delegatorAddress) { + this.delegatorAddress = delegatorAddress; + } + + public Bech32AddressValue getValidatorAddress() { + return validatorAddress; + } + + public void setValidatorAddress(Bech32AddressValue validatorAddress) { + this.validatorAddress = validatorAddress; + } + + public CoinValueStr getAmount() { + return amount; + } + + public void setAmount(CoinValueStr amount) { + this.amount = amount; + } + + public String getSideChainId() { + return sideChainId; + } + + public void setSideChainId(String sideChainId) { + this.sideChainId = sideChainId; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/CommissionMsgValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/CommissionMsgValue.java new file mode 100644 index 00000000..9cf9aa51 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/CommissionMsgValue.java @@ -0,0 +1,90 @@ +package com.binance.dex.api.client.encoding.message.sidechain.value; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.binance.dex.api.client.encoding.serializer.DecToStringSerializer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class CommissionMsgValue implements AminoSerializable { + + @JsonProperty(value = "rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec rate = new Dec(); + + @JsonProperty(value = "max_rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec maxRate = new Dec(); + + @JsonProperty(value = "max_change_rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec maxChangeRate = new Dec(); + + public CommissionMsgValue() { + } + + public Dec getRate() { + return rate; + } + + public void setRate(Dec rate) { + this.rate = rate; + } + + public Dec getMaxRate() { + return maxRate; + } + + public void setMaxRate(Dec maxRate) { + this.maxRate = maxRate; + } + + public Dec getMaxChangeRate() { + return maxChangeRate; + } + + public void setMaxChangeRate(Dec maxChangeRate) { + this.maxChangeRate = maxChangeRate; + } + + @Override + public AminoSerializable newAminoMessage() { + return new CommissionMsgValue(); + } + + @Override + public ArrayList> IterateFields() { + ArrayList> fields = new ArrayList<>(); + fields.add(new AminoField(Dec.class, rate, rate == null || rate.isDefaultOrEmpty())); + fields.add(new AminoField(Dec.class, maxRate, rate == null || rate.isDefaultOrEmpty())); + fields.add(new AminoField(Dec.class, maxChangeRate, rate == null || rate.isDefaultOrEmpty())); + return fields; + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + rate = ((Dec) value); + break; + case 2: + maxRate = ((Dec) value); + break; + case 3: + maxChangeRate = ((Dec) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/CommissionValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/CommissionValue.java new file mode 100644 index 00000000..f760a517 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/CommissionValue.java @@ -0,0 +1,114 @@ +package com.binance.dex.api.client.encoding.message.sidechain.value; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.binance.dex.api.client.encoding.serializer.DecToStringSerializer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class CommissionValue implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec rate = Dec.newInstance(0L); + + @JsonProperty(value = "max_rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec maxRate = Dec.newInstance(0L); + + @JsonProperty(value = "max_change_rate") + @JsonSerialize(using = DecToStringSerializer.class) + private Dec maxChangeRate = Dec.newInstance(0L); + + @JsonProperty(value = "update_time") + private TimestampValue updateTime; + + public Dec getRate() { + return rate; + } + + public void setRate(Dec rate) { + this.rate = rate; + } + + public Dec getMaxRate() { + return maxRate; + } + + public void setMaxRate(Dec maxRate) { + this.maxRate = maxRate; + } + + public Dec getMaxChangeRate() { + return maxChangeRate; + } + + public void setMaxChangeRate(Dec maxChangeRate) { + this.maxChangeRate = maxChangeRate; + } + + public TimestampValue getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(TimestampValue updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "Commission{" + + "rate=" + rate + + ", maxRate=" + maxRate + + ", maxChangeRate=" + maxChangeRate + + ", updateTime=" + updateTime + + '}'; + } + + + @Override + public AminoSerializable newAminoMessage() { + return new CommissionValue(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Dec.class, rate, rate == null || rate.isDefaultOrEmpty()) + .addField(Dec.class, maxRate, maxRate == null || maxRate.isDefaultOrEmpty()) + .addField(Dec.class, maxChangeRate, maxChangeRate == null || maxChangeRate.isDefaultOrEmpty()) + .addField(TimestampValue.class, updateTime, false) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + rate = ((Dec) value); + break; + case 2: + maxRate = ((Dec) value); + break; + case 3: + maxChangeRate = ((Dec) value); + break; + case 4: + updateTime = ((TimestampValue) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/DelegationValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/DelegationValue.java new file mode 100644 index 00000000..17ceab40 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/DelegationValue.java @@ -0,0 +1,63 @@ +package com.binance.dex.api.client.encoding.message.sidechain.value; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.common.Dec; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class DelegationValue implements AminoSerializable { + + private Dec shares = new Dec(); + + private long height; + + public DelegationValue() { + } + + public Dec getShares() { + return shares; + } + + public void setShares(Dec shares) { + this.shares = shares; + } + + public long getHeight() { + return height; + } + + public void setHeight(long height) { + this.height = height; + } + + @Override + public AminoSerializable newAminoMessage() { + return new DelegationValue(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Dec.class, shares, shares == null || shares.isDefaultOrEmpty()) + .addField(Long.class, height, height == 0) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + shares = ((Dec) value); + break; + case 2: + height = ((Long) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/DescriptionValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/DescriptionValue.java new file mode 100644 index 00000000..425674a9 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/DescriptionValue.java @@ -0,0 +1,118 @@ +package com.binance.dex.api.client.encoding.message.sidechain.value; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class DescriptionValue implements BinanceDexTransactionMessage, AminoSerializable { + + @JsonProperty(value = "moniker") + private String moniker = ""; + + @JsonProperty(value = "identity") + private String identity = ""; + + @JsonProperty(value = "website") + private String website = ""; + + @JsonProperty(value = "details") + private String details = ""; + + public DescriptionValue() { + } + + public DescriptionValue(String moniker, String identity, String website, String details) { + this.moniker = moniker; + this.identity = identity; + this.website = website; + this.details = details; + } + + public String getMoniker() { + return moniker; + } + + public void setMoniker(String moniker) { + this.moniker = moniker; + } + + public String getIdentity() { + return identity; + } + + public void setIdentity(String identity) { + this.identity = identity; + } + + public String getWebsite() { + return website; + } + + public void setWebsite(String website) { + this.website = website; + } + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + @Override + public String toString() { + return "Description{" + + "moniker='" + moniker + '\'' + + ", identity='" + identity + '\'' + + ", website='" + website + '\'' + + ", details='" + details + '\'' + + '}'; + } + + @Override + public AminoSerializable newAminoMessage() { + return new DescriptionValue(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + moniker = ((String) value); + break; + case 2: + identity = ((String) value); + break; + case 3: + website = ((String) value); + break; + case 4: + details = ((String) value); + break; + default: + break; + } + } + + @Override + public ArrayList> IterateFields() { + ArrayList> fields = new ArrayList<>(); + fields.add(new AminoField<>(String.class, moniker, StringUtils.isEmpty(moniker))); + fields.add(new AminoField<>(String.class, identity, StringUtils.isEmpty(identity))); + fields.add(new AminoField<>(String.class, website, StringUtils.isEmpty(website))); + fields.add(new AminoField<>(String.class, details, StringUtils.isEmpty(details))); + return fields; + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/RedelegationValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/RedelegationValue.java new file mode 100644 index 00000000..1ae38226 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/RedelegationValue.java @@ -0,0 +1,120 @@ +package com.binance.dex.api.client.encoding.message.sidechain.value; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.binance.dex.api.client.encoding.message.common.Dec; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class RedelegationValue implements AminoSerializable { + + private long creationHeight; + + private TimestampValue minTime = new TimestampValue(); + + private CoinValueStr initialBalance = new CoinValueStr(); + + private CoinValueStr balance = new CoinValueStr(); + + private Dec sharesSrc = new Dec(); + + private Dec sharesDst = new Dec(); + + public RedelegationValue() { + } + + public long getCreationHeight() { + return creationHeight; + } + + public void setCreationHeight(long creationHeight) { + this.creationHeight = creationHeight; + } + + public TimestampValue getMinTime() { + return minTime; + } + + public void setMinTime(TimestampValue minTime) { + this.minTime = minTime; + } + + public CoinValueStr getInitialBalance() { + return initialBalance; + } + + public void setInitialBalance(CoinValueStr initialBalance) { + this.initialBalance = initialBalance; + } + + public CoinValueStr getBalance() { + return balance; + } + + public void setBalance(CoinValueStr balance) { + this.balance = balance; + } + + public Dec getSharesSrc() { + return sharesSrc; + } + + public void setSharesSrc(Dec sharesSrc) { + this.sharesSrc = sharesSrc; + } + + public Dec getSharesDst() { + return sharesDst; + } + + public void setSharesDst(Dec sharesDst) { + this.sharesDst = sharesDst; + } + + @Override + public AminoSerializable newAminoMessage() { + return new RedelegationValue(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Long.class, creationHeight, creationHeight == 0) + .addField(TimestampValue.class, minTime, minTime == null) + .addField(CoinValueStr.class, initialBalance, initialBalance == null) + .addField(CoinValueStr.class, balance, balance == null) + .addField(Dec.class, sharesSrc, sharesSrc == null) + .addField(Dec.class, sharesDst, sharesDst == null) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + creationHeight = ((long) value); + break; + case 2: + minTime = ((TimestampValue) value); + break; + case 3: + initialBalance = ((CoinValueStr) value); + break; + case 4: + balance = ((CoinValueStr) value); + break; + case 5: + sharesSrc = ((Dec) value); + break; + case 6: + sharesDst = ((Dec) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/TimestampValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/TimestampValue.java new file mode 100644 index 00000000..7f3581f0 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/TimestampValue.java @@ -0,0 +1,66 @@ +package com.binance.dex.api.client.encoding.message.sidechain.value; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class TimestampValue implements AminoSerializable { + + private long seconds; + + private int nano; + + public TimestampValue() { + } + + public long getSeconds() { + return seconds; + } + + public void setSeconds(long seconds) { + this.seconds = seconds; + } + + public int getNano() { + return nano; + } + + public void setNano(int nano) { + this.nano = nano; + } + + public long getTimeInMilliseconds(){ + return seconds * 1000; + } + + @Override + public AminoSerializable newAminoMessage() { + return new TimestampValue(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Long.class, seconds, false) + .addField(Integer.class, nano, false) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + seconds = ((Long) value); + break; + case 2: + nano = ((Integer) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/UnBondingValue.java b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/UnBondingValue.java new file mode 100644 index 00000000..db2eba85 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/message/sidechain/value/UnBondingValue.java @@ -0,0 +1,91 @@ +package com.binance.dex.api.client.encoding.message.sidechain.value; + +import com.binance.dex.api.client.encoding.amino.AminoField; +import com.binance.dex.api.client.encoding.amino.AminoSerializable; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; + +import java.util.ArrayList; + +/** + * @author Fitz.Lu + **/ +public class UnBondingValue implements AminoSerializable { + + private long creationHeight; + + private TimestampValue minTime = new TimestampValue(); + + private CoinValueStr initialBalance = new CoinValueStr(); + + private CoinValueStr balance = new CoinValueStr(); + + public UnBondingValue() { + } + + public long getCreationHeight() { + return creationHeight; + } + + public void setCreationHeight(long creationHeight) { + this.creationHeight = creationHeight; + } + + public TimestampValue getMinTime() { + return minTime; + } + + public void setMinTime(TimestampValue minTime) { + this.minTime = minTime; + } + + public CoinValueStr getInitialBalance() { + return initialBalance; + } + + public void setInitialBalance(CoinValueStr initialBalance) { + this.initialBalance = initialBalance; + } + + public CoinValueStr getBalance() { + return balance; + } + + public void setBalance(CoinValueStr balance) { + this.balance = balance; + } + + @Override + public AminoSerializable newAminoMessage() { + return new UnBondingValue(); + } + + @Override + public ArrayList> IterateFields() { + return AminoField.newFieldsBuilder() + .addField(Long.class, creationHeight, creationHeight == 0) + .addField(TimestampValue.class, minTime, minTime == null) + .addField(CoinValueStr.class, initialBalance, initialBalance == null) + .addField(CoinValueStr.class, balance, balance == null) + .build(); + } + + @Override + public void setValueByFieldIndex(int fieldIndex, Object value) { + switch (fieldIndex) { + case 1: + creationHeight = ((Long) value); + break; + case 2: + minTime = ((TimestampValue) value); + break; + case 3: + initialBalance = ((CoinValueStr) value); + break; + case 4: + balance = ((CoinValueStr) value); + break; + default: + break; + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/Bech32AddressValueToStringSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/Bech32AddressValueToStringSerializer.java new file mode 100644 index 00000000..2f446073 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/Bech32AddressValueToStringSerializer.java @@ -0,0 +1,37 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.binance.dex.api.client.encoding.Crypto; +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +public class Bech32AddressValueToStringSerializer extends StdSerializer { + + protected Bech32AddressValueToStringSerializer(){ + this(null); + } + + protected Bech32AddressValueToStringSerializer(Class t) { + super(t); + } + + @Override + public void serialize(Bech32AddressValue addressValue, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (addressValue != null && addressValue.getRaw() != null) { + if (StringUtils.isNotBlank(addressValue.getHrp())){ + jsonGenerator.writeString(Crypto.encodeAddress(addressValue.getHrp(), addressValue.getRaw())); + } else { + jsonGenerator.writeString(EncodeUtils.bytesToHex(addressValue.getRaw())); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/Bech32AddressValuesToStringSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/Bech32AddressValuesToStringSerializer.java new file mode 100644 index 00000000..5276dc21 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/Bech32AddressValuesToStringSerializer.java @@ -0,0 +1,29 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.binance.dex.api.client.encoding.Crypto; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; + +public class Bech32AddressValuesToStringSerializer extends JsonSerializer> { + + @Override + public void serialize(List bech32AddressValues, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (bech32AddressValues != null) { + List msg = bech32AddressValues.stream().map(value -> { + if (value.getRaw() != null && StringUtils.isNotBlank(value.getHrp())) { + return Crypto.encodeAddress(value.getHrp(), value.getRaw()); + } else { + throw new RuntimeException("raw and hrp must not be empty"); + } + }).collect(Collectors.toList()); + jsonGenerator.writeObject(msg); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/ByteArrayToStringSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/ByteArrayToStringSerializer.java new file mode 100644 index 00000000..f6932987 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/ByteArrayToStringSerializer.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +public class ByteArrayToStringSerializer extends JsonSerializer { + + @Override + public void serialize(byte[] bytes, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if(bytes != null){ + jsonGenerator.writeString(new String(bytes)); + } + } + +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/BytesToPrefixedHexStringSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/BytesToPrefixedHexStringSerializer.java new file mode 100644 index 00000000..67d2edad --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/BytesToPrefixedHexStringSerializer.java @@ -0,0 +1,18 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +public class BytesToPrefixedHexStringSerializer extends JsonSerializer { + + @Override + public void serialize(byte[] bytes, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if(bytes != null){ + jsonGenerator.writeString(EncodeUtils.bytesToPrefixHex(bytes)); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/DecToStringSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/DecToStringSerializer.java new file mode 100644 index 00000000..92a478e7 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/DecToStringSerializer.java @@ -0,0 +1,20 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +public class DecToStringSerializer extends JsonSerializer { + @Override + public void serialize(Dec dec, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (dec != null) { + jsonGenerator.writeString(String.valueOf(dec.getValue())); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/EthAddressValueToStringSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/EthAddressValueToStringSerializer.java new file mode 100644 index 00000000..5268b6cf --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/EthAddressValueToStringSerializer.java @@ -0,0 +1,30 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +public class EthAddressValueToStringSerializer extends StdSerializer { + + protected EthAddressValueToStringSerializer(){ + this(null); + } + + protected EthAddressValueToStringSerializer(Class t) { + super(t); + } + + @Override + public void serialize(EthAddressValue ethAddressValue, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (ethAddressValue != null && ethAddressValue.getAddress() != null){ + jsonGenerator.writeString(ethAddressValue.getAddress()); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/LongToHexStringSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/LongToHexStringSerializer.java new file mode 100644 index 00000000..5f2a4332 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/LongToHexStringSerializer.java @@ -0,0 +1,17 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +public class LongToHexStringSerializer extends JsonSerializer { + + @Override + public void serialize(Long aLong, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (aLong != null) { + jsonGenerator.writeString("0x" + Long.toHexString(aLong)); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/LongToStringSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/LongToStringSerializer.java new file mode 100644 index 00000000..a7b4d3aa --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/LongToStringSerializer.java @@ -0,0 +1,17 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +public class LongToStringSerializer extends JsonSerializer { + @Override + public void serialize(Long aLong, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString(String.valueOf(aLong)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/TokenSymbolSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/TokenSymbolSerializer.java new file mode 100644 index 00000000..f0938293 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/TokenSymbolSerializer.java @@ -0,0 +1,27 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.binance.dex.api.client.crosschain.TokenSymbol; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; + +public class TokenSymbolSerializer extends StdSerializer { + + protected TokenSymbolSerializer(){ + this(null); + } + + protected TokenSymbolSerializer(Class t) { + super(t); + } + + @Override + public void serialize(TokenSymbol tokenSymbol, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (tokenSymbol != null && StringUtils.isNotBlank(tokenSymbol.getSymbol())){ + jsonGenerator.writeString(tokenSymbol.getSymbol()); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/encoding/serializer/UnsignedNumberSerializer.java b/src/main/java/com/binance/dex/api/client/encoding/serializer/UnsignedNumberSerializer.java new file mode 100644 index 00000000..66dfe04a --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/encoding/serializer/UnsignedNumberSerializer.java @@ -0,0 +1,25 @@ +package com.binance.dex.api.client.encoding.serializer; + +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; + +public class UnsignedNumberSerializer extends StdSerializer { + + protected UnsignedNumberSerializer() { + this(null); + } + + + protected UnsignedNumberSerializer(Class t) { + super(t); + } + + @Override + public void serialize(UnsignedNumber unsignedNumber, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeNumber(unsignedNumber.getNumber()); + } +} diff --git a/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiAsyncRestClientImpl.java b/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiAsyncRestClientImpl.java index 967f5e77..756e6943 100644 --- a/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiAsyncRestClientImpl.java +++ b/src/main/java/com/binance/dex/api/client/impl/BinanceDexApiAsyncRestClientImpl.java @@ -8,21 +8,35 @@ import com.binance.dex.api.client.domain.request.TransactionsRequest; import org.apache.commons.lang3.StringUtils; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; public class BinanceDexApiAsyncRestClientImpl implements BinanceDexApiAsyncRestClient { private BinanceDexApi binanceDexApi; + private BinanceTransactionApi binanceTransactionApi; public BinanceDexApiAsyncRestClientImpl(String baseUrl) { this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class, baseUrl); + + String transactionUrl = BinanceDexEnvironment.inferTransactionUrl(baseUrl); + if (transactionUrl != null) { + this.binanceTransactionApi = BinanceDexApiClientGenerator.createService(BinanceTransactionApi.class, transactionUrl); + } } - public BinanceDexApiAsyncRestClientImpl(String baseUrl,String apiKey){ + public BinanceDexApiAsyncRestClientImpl(String baseUrl, String apiKey){ + String transactionUrl = BinanceDexEnvironment.inferTransactionUrl(baseUrl); if(StringUtils.isBlank(apiKey)){ this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class, baseUrl); + if (transactionUrl != null) { + this.binanceTransactionApi = BinanceDexApiClientGenerator.createService(BinanceTransactionApi.class, transactionUrl); + } }else{ this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class,apiKey,baseUrl + "/internal/"); + if (transactionUrl != null) { + this.binanceTransactionApi = BinanceDexApiClientGenerator.createService(BinanceTransactionApi.class, transactionUrl + "/internal/"); + } } } @@ -149,20 +163,30 @@ public void getTrades(TradesRequest request, BinanceDexApiCallback ca } @Override - public void getTransactions(String address, BinanceDexApiCallback callback) { + public void getTransactions(String address, BinanceDexApiCallback callback) { TransactionsRequest request = new TransactionsRequest(); request.setAddress(address); + Long endTime = new Date().getTime(); + Long startTime = endTime - 86400000; + request.setStartTime(startTime); + request.setEndTime(endTime); getTransactions(request, callback); } @Override - public void getTransactions(TransactionsRequest request, BinanceDexApiCallback callback) { - String sideStr = request.getSide() == null ? null : request.getSide().name(); - String txTypeStr = request.getTxType() != null ? request.getTxType().name() : null; - binanceDexApi.getTransactions( - request.getAddress(), request.getBlockHeight(), request.getEndTime(), - request.getLimit(), request.getOffset(), sideStr, - request.getStartTime(), request.getTxAsset(), txTypeStr).enqueue( + public void getTransactions(TransactionsRequest request, BinanceDexApiCallback callback) { + binanceTransactionApi.getTransactions( + request.getStartTime(), request.getEndTime(), + request.getType(), request.getAsset(), + request.getAddress(), request.getAddressType(), + request.getOffset(), request.getLimit()).enqueue( + new BinanceDexApiCallbackAdapter<>(callback)); + } + + @Override + public void getTransactionsInBlock(long blockHeight, BinanceDexApiCallback callback) { + binanceTransactionApi.getTransactionsInBlock( + blockHeight).enqueue( new BinanceDexApiCallbackAdapter<>(callback)); } } 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 e964d5b6..ee1835fa 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 @@ -2,13 +2,24 @@ import com.binance.dex.api.client.*; import com.binance.dex.api.client.domain.*; +import com.binance.dex.api.client.domain.broadcast.SideVote; +import com.binance.dex.api.client.domain.oracle.Prophecy; import com.binance.dex.api.client.domain.StakeValidator; +import com.binance.dex.api.client.domain.stake.Pool; +import com.binance.dex.api.client.domain.stake.beaconchain.*; +import com.binance.dex.api.client.domain.stake.Delegation; +import com.binance.dex.api.client.domain.stake.Redelegation; +import com.binance.dex.api.client.domain.stake.UnBondingDelegation; +import com.binance.dex.api.client.domain.stake.Validator; +import com.binance.dex.api.client.domain.stake.sidechain.*; import com.binance.dex.api.client.domain.broadcast.Transaction; import com.binance.dex.api.client.domain.broadcast.*; import com.binance.dex.api.client.domain.jsonrpc.*; import com.binance.dex.api.client.encoding.Crypto; import com.binance.dex.api.client.encoding.EncodeUtils; import com.binance.dex.api.client.encoding.message.TransactionRequestAssembler; +import com.binance.dex.api.client.encoding.message.sidechain.query.QuerySideProposal; +import com.binance.dex.api.client.impl.node.*; import com.binance.dex.api.proto.*; import com.binance.dex.api.proto.Token; import com.google.common.collect.Lists; @@ -28,10 +39,12 @@ public class BinanceDexApiNodeClientImpl implements BinanceDexApiNodeClient { - private BinanceDexNodeApi binanceDexNodeApi; + protected BinanceDexNodeApi binanceDexNodeApi; private String hrp; + private String valHrp; + private TransactionConverter transactionConverter; private FeeConverter feeConverter; @@ -42,11 +55,31 @@ public class BinanceDexApiNodeClientImpl implements BinanceDexApiNodeClient { private final static int TX_SEARCH_PERPAGE = 10000; - public BinanceDexApiNodeClientImpl(String nodeUrl, String hrp) { + private final NodeTxDelegateSideChainStaking sideChainStakingTxDelegate; + + private final NodeTxDelegateBeaconChainStaking beaconChainStakingTxDelegate; + + private final NodeTxDelegateBridge bridgeTxDelegate; + + private final NodeQueryDelegateSideChainStaking sideChainQueryDelegate; + + private final NodeQueryDelegateBeaconChainStaking beaconChainQueryDelegate; + + private final NodeQueryDelegateOracle oracleQueryDelegate; + + public BinanceDexApiNodeClientImpl(String nodeUrl, String hrp, String valHrp) { this.binanceDexNodeApi = BinanceDexApiClientGenerator.createService(BinanceDexNodeApi.class, nodeUrl); this.hrp = hrp; - transactionConverter = new TransactionConverter(hrp); + this.valHrp = valHrp; + transactionConverter = new TransactionConverter(hrp, valHrp); feeConverter = new FeeConverter(); + + sideChainStakingTxDelegate = new NodeTxDelegateSideChainStaking(binanceDexNodeApi, hrp, valHrp); + beaconChainStakingTxDelegate = new NodeTxDelegateBeaconChainStaking(binanceDexNodeApi, hrp, valHrp); + bridgeTxDelegate = new NodeTxDelegateBridge(binanceDexNodeApi, hrp, valHrp); + sideChainQueryDelegate = new NodeQueryDelegateSideChainStaking(binanceDexNodeApi, hrp, valHrp); + beaconChainQueryDelegate = new NodeQueryDelegateBeaconChainStaking(binanceDexNodeApi, hrp, valHrp, sideChainQueryDelegate); + oracleQueryDelegate = new NodeQueryDelegateOracle(binanceDexNodeApi, hrp, valHrp); } @Override @@ -86,11 +119,11 @@ public List getFees() { @Override public Account getAccount(String address) { try { - String queryPath = String.format("\"/account/%s\"",address); + String queryPath = String.format("\"/account/%s\"", address); JsonRpcResponse response = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.getAccount(queryPath)); checkRpcResult(response); byte[] value = response.getResult().getResponse().getValue(); - if(value != null && value.length > 0){ + if (value != null && value.length > 0) { byte[] array = new byte[value.length - 4]; System.arraycopy(value, 4, array, 0, array.length); AppAccount account = AppAccount.parseFrom(array); @@ -109,7 +142,7 @@ public Account getCommittedAccount(String address) { JsonRpcResponse response = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.getCommittedAccount(encodedAddress)); checkRpcResult(response); byte[] value = response.getResult().getResponse().getValue(); - if(value != null && value.length > 0){ + if (value != null && value.length > 0) { byte[] array = new byte[value.length - 4]; System.arraycopy(value, 4, array, 0, array.length); AppAccount account = AppAccount.parseFrom(array); @@ -122,7 +155,7 @@ public Account getCommittedAccount(String address) { } @Override - public AtomicSwap getSwapByID(String swapID){ + public AtomicSwap getSwapByID(String swapID) { try { Map.Entry swapIdEntry = Maps.immutableEntry("SwapID", swapID); String requestData = "0x" + Hex.toHexString(EncodeUtils.toJsonStringSortKeys(swapIdEntry).getBytes()); @@ -145,7 +178,7 @@ public AtomicSwap getSwapByID(String swapID){ @Override public List getBlockTransactions(Long height) { JsonRpcResponse response = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi - .getBlockTransactions("\"tx.height=" + height.toString() + "\"",TX_SEARCH_PAGE,TX_SEARCH_PERPAGE)); + .getBlockTransactions("\"tx.height=" + height.toString() + "\"", TX_SEARCH_PAGE, TX_SEARCH_PERPAGE)); checkRpcResult(response); return response.getResult().getTxs().stream() .map(transactionConverter::convert) @@ -178,7 +211,7 @@ public Transaction getTransaction(String hash) { transactions.get(0).setHash(transactionResult.getHash()); transactions.get(0).setCode(transactionResult.getTxResult().getCode()); transactions.get(0).setLog(transactionResult.getTxResult().getLog()); - transactionConverter.fillTagsAndEvents(transactionResult.getTxResult(),transactions.get(0)); + transactionConverter.fillTagsAndEvents(transactionResult.getTxResult(), transactions.get(0)); return transactions.get(0); } @@ -254,6 +287,31 @@ public Proposal getProposalById(String proposalId) { } } + @Override + public Proposal getSideProposalById(String proposalId, String sideChainId) { + try { + QuerySideProposal params = new QuerySideProposal(); + params.setSideChainId(sideChainId); + params.setProposalID(proposalId); + + byte[] paramsBytes = EncodeUtils.toJsonEncodeBytes(params); + String requestData = "0x" + Hex.toHexString(paramsBytes); + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.getProposalById(requestData)); + checkRpcResult(rpcResponse); + ABCIQueryResult.Response response = rpcResponse.getResult().getResponse(); + if (response.getCode() != null) { + BinanceDexApiError binanceDexApiError = new BinanceDexApiError(); + binanceDexApiError.setCode(response.getCode()); + binanceDexApiError.setMessage(response.getLog()); + throw new BinanceDexApiException(binanceDexApiError); + } + String proposalJson = new String(response.getValue()); + return EncodeUtils.toObjectFromJsonString(proposalJson, Proposal.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Override public List transfer(Transfer transfer, Wallet wallet, TransactionOption options, boolean sync) @@ -304,7 +362,7 @@ public List depositHtlt(String swapId, List claimHtlt(String swapId, byte[] randomNumber, W synchronized (wallet) { wallet.ensureWalletIsReady(this); TransactionRequestAssembler assembler = new TransactionRequestAssembler(wallet, options); - String requestPayload = "0x" + assembler.buildClaimHtltPayload(swapId,randomNumber); + String requestPayload = "0x" + assembler.buildClaimHtltPayload(swapId, randomNumber); if (sync) { return syncBroadcast(requestPayload, wallet); } else { @@ -341,6 +399,176 @@ public List refundHtlt(String swapId, Wallet wallet, Transa } } + @Override + public List transferTokenOwnership(String symbol, String newOwner, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + TransactionRequestAssembler assembler = new TransactionRequestAssembler(wallet, options); + String requestPayload = "0x" + assembler.buildTransferTokenOwnershipPayload(symbol, newOwner); + if (sync) { + return syncBroadcast(requestPayload, wallet); + } else { + return asyncBroadcast(requestPayload, wallet); + } + } + } + + @Override + public List createSideChainValidator(CreateSideChainValidator createSideChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return sideChainStakingTxDelegate.createSideChainValidator(createSideChainValidator, wallet, options, sync); + } + } + + @Override + public List editSideChainValidator(EditSideChainValidator editSideChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return sideChainStakingTxDelegate.editSideChainValidator(editSideChainValidator, wallet, options, sync); + } + } + + @Override + public List sideChainDelegate(SideChainDelegate sideChainDelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return sideChainStakingTxDelegate.sideChainDelegate(sideChainDelegate, wallet, options, sync); + } + } + + @Override + public List sideChainRedelagate(SideChainRedelegate sideChainRedelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return sideChainStakingTxDelegate.sideChainRedelagate(sideChainRedelegate, wallet, options, sync); + } + } + + @Override + public List sideChainUnbond(SideChainUnBond sideChainUndelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return sideChainStakingTxDelegate.sideChainUnbond(sideChainUndelegate, wallet, options, sync); + } + } + + @Override + public Validator getSideChainValidator(String sideChainId, String validatorAddress) throws IOException { + return sideChainQueryDelegate.querySideChainValidator(sideChainId, validatorAddress); + } + + @Override + public List getSideChainTopValidators(String sideChainId, int top) throws IOException { + return sideChainQueryDelegate.querySideChainTopValidators(sideChainId, top); + } + + @Override + public Delegation getSideChainDelegation(String sideChainId, String delegatorAddress, String validatorAddress) throws IOException { + return sideChainQueryDelegate.querySideChainDelegation(sideChainId, delegatorAddress, validatorAddress); + } + + @Override + public List getSideChainDelegations(String sideChainId, String delegatorAddress) throws IOException { + return sideChainQueryDelegate.querySideChainDelegations(sideChainId, delegatorAddress); + } + + @Override + public Redelegation getSideChainRedelegation(String sideChainId, String delegatorAddress, String srcValidatorAddress, String dstValidatorAddress) throws IOException { + return sideChainQueryDelegate.querySideChainRedelegation(sideChainId, delegatorAddress, srcValidatorAddress, dstValidatorAddress); + } + + @Override + public List getSideChainRedelegations(String sideChainId, String delegatorAddress) throws IOException { + return sideChainQueryDelegate.querySideChainRedelegations(sideChainId, delegatorAddress); + } + + @Override + public UnBondingDelegation getSideChainUnBondingDelegation(String sideChainId, String delegatorAddress, String validatorAddress) throws IOException { + return sideChainQueryDelegate.querySideChainUnBondingDelegation(sideChainId, delegatorAddress, validatorAddress); + } + + @Override + public List getSideChainUnBondingDelegations(String sideChainId, String delegatorAddress) throws IOException { + return sideChainQueryDelegate.querySideChainUnBondingDelegations(sideChainId, delegatorAddress); + } + + @Override + public List getSideChainUnBondingDelegationsByValidator(String sideChainId, String validatorAddress) throws IOException{ + return sideChainQueryDelegate.querySideChainUnBondingDelegationsByValidator(sideChainId, validatorAddress); + } + + @Override + public List getSideChainRedelegationsByValidator(String sideChainId, String validatorAddress) throws IOException { + return sideChainQueryDelegate.querySideChainRedelegationsByValidator(sideChainId, validatorAddress); + } + + @Override + public Pool getSideChainPool(String sideChainId) throws IOException { + return sideChainQueryDelegate.querySideChainPool(sideChainId); + } + + @Override + public long getAllSideChainValidatorsCount(String sideChainId, boolean jailInvolved) throws IOException { + return sideChainQueryDelegate.queryAllSideChainValidatorsCount(sideChainId, jailInvolved); + } + + @Override + public List sideVote(SideVote vote, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException{ + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + TransactionRequestAssembler assembler = new TransactionRequestAssembler(wallet, options); + String requestPayload = "0x" + assembler.buildSideVotePayload(vote); + if (sync) { + return syncBroadcast(requestPayload, wallet); + } else { + return asyncBroadcast(requestPayload, wallet); + } + } + } + + @Override + public List transferOut(String toAddress, com.binance.dex.api.client.encoding.message.Token amount, long expireTimeInSeconds, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return bridgeTxDelegate.transferOut(toAddress, amount, expireTimeInSeconds, wallet, options, sync); + } + } + + @Override + public List bind(String symbol, long amount, String contractAddress, int contractDecimal, long expireTimeInSeconds, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return bridgeTxDelegate.bind(symbol, amount, contractAddress, contractDecimal, expireTimeInSeconds, wallet, options, sync); + } + } + + @Override + public List unBind(String symbol, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return bridgeTxDelegate.unBind(symbol, wallet, options, sync); + } + } + + @Override + public List claim(int chainId, byte[] payload, long sequence, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return bridgeTxDelegate.claim(chainId, payload, sequence, wallet, options, sync); + } + } + + @Override + public Prophecy getProphecy(int claimType, long sequence) throws IOException { + return oracleQueryDelegate.getProphecy(claimType, sequence); + } + + @Override + public long getCurrentSequence(int claimType) { + return oracleQueryDelegate.getCurrentSequence(claimType); + } + @Override public List broadcast(String payload, boolean sync) { payload = "0x" + payload; @@ -351,6 +579,123 @@ public List broadcast(String payload, boolean sync) { } } + @Override + public com.binance.dex.api.client.domain.MiniToken getMiniTokenInfoBySymbol(String symbol) { + try { + String pathWithSymbol = "\"mini-tokens/info/" + symbol + "\""; + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.getTokenInfo(pathWithSymbol)); + checkRpcResult(rpcResponse); + byte[] value = rpcResponse.getResult().getResponse().getValue(); + int startIndex = getStartIndex(value); + byte[] array = new byte[value.length - startIndex]; + System.arraycopy(value, startIndex, array, 0, array.length); + MiniTokenInfo tokenInfo = MiniTokenInfo.parseFrom(array); + return convert(tokenInfo); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public List createValidator(CreateBeaconChainValidator createBeaconChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return beaconChainStakingTxDelegate.createBeaconChainValidator(createBeaconChainValidator, wallet, options, sync); + } + } + + @Override + public List editValidator(EditBeaconChainValidator editBeaconChainValidator, Wallet wallet, TransactionOption option, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return beaconChainStakingTxDelegate.editBeaconChainValidator(editBeaconChainValidator, wallet, option, sync); + } + } + + @Override + public List delegate(BeaconChainDelegate beaconChainDelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return beaconChainStakingTxDelegate.beaconChainDelegate(beaconChainDelegate, wallet, options, sync); + } + } + + @Override + public List redelegate(BeaconChainRedelegate beaconChainRedelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return beaconChainStakingTxDelegate.beaconChainRedelegate(beaconChainRedelegate, wallet, options, sync); + } + } + + @Override + public List undelegate(BeaconChainUndelegate beaconChainUndelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + synchronized (wallet) { + wallet.ensureWalletIsReady(this); + return beaconChainStakingTxDelegate.beaconChainUndelegate(beaconChainUndelegate, wallet, options, sync); + } + } + + @Override + public Validator getValidator(String validatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainValidator(validatorAddress); + } + + @Override + public List getTopValidators(int top) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainTopValidators(top); + } + + @Override + public Delegation getDelegation(String delegatorAddress, String validatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainDelegation(delegatorAddress, validatorAddress); + } + + @Override + public List getDelegations(String delegatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainDelegations(delegatorAddress); + } + + @Override + public Redelegation getRedelegation(String delegatorAddress, String srcValidatorAddress, String dstValidatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainRedelegation(delegatorAddress, srcValidatorAddress, dstValidatorAddress); + } + + @Override + public List getRedelegations(String delegatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainRedelegations(delegatorAddress); + } + + @Override + public UnBondingDelegation getUnBondingDelegation(String delegatorAddress, String validatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainUnBondingDelegation(delegatorAddress, validatorAddress); + } + + @Override + public List getUnBondingDelegations(String delegatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainUnBondingDelegations(delegatorAddress); + } + + @Override + public List getUnBondingDelegationsByValidator(String validatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainUnBondingDelegationsByValidator(validatorAddress); + } + + @Override + public List getRedelegationsByValidator(String validatorAddress) throws IOException { + return beaconChainQueryDelegate.queryBeaconChainRedelegationsByValidator(validatorAddress); + } + + @Override + public Pool getPool() throws IOException { + return beaconChainQueryDelegate.queryBeaconChainPool(); + } + + @Override + public long getAllValidatorsCount(boolean jailInvolved) throws IOException { + return beaconChainQueryDelegate.queryAllBeaconChainValidatorsCount(jailInvolved); + } + protected Infos convert(NodeInfos nodeInfos) { Infos infos = new Infos(); @@ -404,6 +749,19 @@ protected com.binance.dex.api.client.domain.Token convert(TokenInfo tokenInfo) { return token; } + protected com.binance.dex.api.client.domain.MiniToken convert(MiniTokenInfo tokenInfo) { + com.binance.dex.api.client.domain.MiniToken token = new com.binance.dex.api.client.domain.MiniToken(); + token.setName(tokenInfo.getName()); + token.setOriginalSymbol(tokenInfo.getOriginalSymbol()); + token.setSymbol(tokenInfo.getSymbol()); + token.setOwner(Crypto.encodeAddress(hrp, tokenInfo.getOwner().toByteArray())); + token.setTotalSupply(tokenInfo.getTotalSupply()); + token.setMintable(tokenInfo.getMintable()); + token.setTokenType(tokenInfo.getTokenType()); + token.setTokenURI(tokenInfo.getTokenUri()); + return token; + } + protected List syncBroadcast(String requestBody, Wallet wallet) { try { JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.commitBroadcast(requestBody)); 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 081d0e28..21a69b43 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 @@ -13,6 +13,7 @@ import java.io.IOException; import java.security.NoSuchAlgorithmException; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -22,17 +23,29 @@ */ public class BinanceDexApiRestClientImpl implements BinanceDexApiRestClient { private BinanceDexApi binanceDexApi; + private BinanceTransactionApi binanceTransactionApi; private static final okhttp3.MediaType MEDIA_TYPE = okhttp3.MediaType.parse("text/plain; charset=utf-8"); public BinanceDexApiRestClientImpl(String baseUrl) { this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class, baseUrl); + String transactionUrl = BinanceDexEnvironment.inferTransactionUrl(baseUrl); + if (transactionUrl != null) { + this.binanceTransactionApi = BinanceDexApiClientGenerator.createService(BinanceTransactionApi.class, transactionUrl); + } } public BinanceDexApiRestClientImpl(String baseUrl,String apiKey){ + String transactionUrl = BinanceDexEnvironment.inferTransactionUrl(baseUrl); if(StringUtils.isBlank(apiKey)){ this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class, baseUrl); + if (transactionUrl != null) { + this.binanceTransactionApi = BinanceDexApiClientGenerator.createService(BinanceTransactionApi.class, transactionUrl); + } }else{ this.binanceDexApi = BinanceDexApiClientGenerator.createService(BinanceDexApi.class,apiKey,baseUrl + "/internal/"); + if (transactionUrl != null) { + this.binanceTransactionApi = BinanceDexApiClientGenerator.createService(BinanceTransactionApi.class, transactionUrl + "/internal/"); + } } } @@ -147,21 +160,31 @@ public TradePage getTrades(TradesRequest request) { } @Override - public TransactionPage getTransactions(String address) { + public TransactionPageV2 getTransactions(String address) { TransactionsRequest request = new TransactionsRequest(); request.setAddress(address); + Long endTime = new Date().getTime(); + Long startTime = endTime - 86400000; + request.setStartTime(startTime); + request.setEndTime(endTime); return getTransactions(request); } @Override - public TransactionPage getTransactions(TransactionsRequest request) { - String sideStr = request.getSide() != null ? request.getSide().name() : null; - String txTypeStr = request.getTxType() != null ? request.getTxType().name() : null; + public TransactionPageV2 getTransactions(TransactionsRequest request) { + return BinanceDexApiClientGenerator.executeSync( + binanceTransactionApi.getTransactions( + request.getStartTime(), request.getEndTime(), + request.getType(), request.getAsset(), + request.getAddress(), request.getAddressType(), + request.getOffset(), request.getLimit())); + } + + + @Override + public TransactionPageV2 getTransactionsInBlock(long blockHeight) { return BinanceDexApiClientGenerator.executeSync( - binanceDexApi.getTransactions( - request.getAddress(), request.getBlockHeight(), request.getEndTime(), - request.getLimit(), request.getOffset(), sideStr, - request.getStartTime(), request.getTxAsset(), txTypeStr)); + binanceTransactionApi.getTransactionsInBlock(blockHeight)); } // Broadcast and handle account sequence @@ -179,6 +202,91 @@ private List broadcast(RequestBody requestBody, boolean syn } } + @Override + public List getMiniTokens(Integer limit) { + return BinanceDexApiClientGenerator.executeSync(binanceDexApi.getMiniTokens(limit)); + } + + @Override + public List getMiniMarkets(Integer limit) { + return BinanceDexApiClientGenerator.executeSync(binanceDexApi.getMiniMarkets(limit)); + } + + @Override + public List getMiniCandleStickBars(String symbol, CandlestickInterval interval) { + return getMiniCandleStickBars(symbol, interval, null, null, null); + } + + @Override + public List getMiniCandleStickBars(String symbol, CandlestickInterval interval, Integer limit, Long startTime, Long endTime) { + return BinanceDexApiClientGenerator.executeSync(binanceDexApi.getMiniCandlestickBars(symbol, interval.getIntervalId(), limit, startTime, endTime)); + } + + @Override + public OrderList getMiniOpenOrders(String address) { + OpenOrdersRequest request = new OpenOrdersRequest(); + request.setAddress(address); + return getMiniOpenOrders(request); + } + + @Override + public OrderList getMiniOpenOrders(OpenOrdersRequest request) { + return BinanceDexApiClientGenerator.executeSync( + binanceDexApi.getMiniOpenOrders(request.getAddress(), request.getLimit(), + request.getOffset(), request.getSymbol(), request.getTotal())); + } + + @Override + public OrderList getMiniClosedOrders(String address) { + ClosedOrdersRequest request = new ClosedOrdersRequest(); + request.setAddress(address); + return getMiniClosedOrders(request); + } + + @Override + public OrderList getMiniClosedOrders(ClosedOrdersRequest request) { + Integer side = request.getSide() == null ? null : (int)(request.getSide().toValue()); + List statusStrList = null; + if (request.getStatus() != null) + statusStrList = request.getStatus().stream().map(s -> s.name()).collect(Collectors.toList()); + return BinanceDexApiClientGenerator.executeSync( + binanceDexApi.getMiniClosedOrders(request.getAddress(), request.getEnd(), request.getLimit(), + request.getLimit(), side, request.getStart(), statusStrList, request.getSymbol(), + request.getTotal())); + } + + @Override + public Order getMiniOrder(String id) { + return BinanceDexApiClientGenerator.executeSync(binanceDexApi.getMiniOrder(id)); + } + + @Override + public List getMini24HrPriceStatistics() { + return BinanceDexApiClientGenerator.executeSync(binanceDexApi.getMini24HrPriceStatistics()); + } + + @Override + public List getMini24HrPriceStatistics(String symbol) { + return BinanceDexApiClientGenerator.executeSync(binanceDexApi.getMini24HrPriceStatistics(symbol)); + } + + @Override + public TradePage getMiniTrades() { + TradesRequest request = new TradesRequest(); + return getMiniTrades(request); + } + + @Override + public TradePage getMiniTrades(TradesRequest request) { + Integer side = request.getSide() == null ? null : (int)(request.getSide().toValue()); + return BinanceDexApiClientGenerator.executeSync( + binanceDexApi.getMiniTrades( + request.getAddress(), request.getBuyerOrderId(), + request.getEnd(), request.getHeight(), request.getLimit(), request.getOffset(), + request.getQuoteAsset(), request.getSellerOrderId(), side, + request.getStart(), request.getSymbol(), request.getTotal())); + } + public List newOrder(NewOrder newOrder, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { wallet.ensureWalletIsReady(this); @@ -195,6 +303,14 @@ public List vote(Vote vote, Wallet wallet, TransactionOptio return broadcast(requestBody,sync,wallet); } + @Override + public List sideVote(SideVote vote, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + wallet.ensureWalletIsReady(this); + TransactionRequestAssembler assembler = new TransactionRequestAssembler(wallet, options); + RequestBody requestBody = assembler.buildSideVote(vote); + return broadcast(requestBody,sync,wallet); + } + public List cancelOrder(CancelOrder cancelOrder, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { wallet.ensureWalletIsReady(this); @@ -269,6 +385,15 @@ public List refundHtlt(String swapId, Wallet wallet, Transa return broadcast(requestBody, sync, wallet); } + @Override + public List transferTokenOwnership(String symbol, String newOwner, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + wallet.ensureWalletIsReady(this); + TransactionRequestAssembler assembler = new TransactionRequestAssembler(wallet, options); + RequestBody requestBody = assembler.buildTransferTokenOwnership(symbol, newOwner); + return broadcast(requestBody, sync, wallet); + } + + @Override public List broadcast(String payload, boolean sync) { try { diff --git a/src/main/java/com/binance/dex/api/client/impl/node/NodeQuery.java b/src/main/java/com/binance/dex/api/client/impl/node/NodeQuery.java new file mode 100644 index 00000000..9343ee3e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeQuery.java @@ -0,0 +1,107 @@ +package com.binance.dex.api.client.impl.node; + +import com.binance.dex.api.client.BinanceDexApiClientGenerator; +import com.binance.dex.api.client.BinanceDexApiError; +import com.binance.dex.api.client.BinanceDexApiException; +import com.binance.dex.api.client.BinanceDexNodeApi; +import com.binance.dex.api.client.domain.jsonrpc.ABCIQueryResult; +import com.binance.dex.api.client.domain.jsonrpc.JsonRpcResponse; +import com.binance.dex.api.client.encoding.ByteUtil; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.InvalidProtocolBufferException; +import common.Types; +import org.bouncycastle.util.encoders.Hex; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Fitz.Lu + **/ +class NodeQuery { + + private final BinanceDexNodeApi binanceDexNodeApi; + + protected final String hrp; + + protected final String valHrp; + + public NodeQuery(BinanceDexNodeApi binanceDexNodeApi, String hrp, String valHrp) { + this.binanceDexNodeApi = binanceDexNodeApi; + this.hrp = hrp; + this.valHrp = valHrp; + } + + protected byte[] queryWithData(String path, byte[] data){ + String d = "0x" + Hex.toHexString(data); + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.abciQuery(path, d)); + checkABCIResponse(rpcResponse); + + return rpcResponse.getResult().getResponse().getValue(); + } + + protected byte[] queryStore(String storeName, byte[] key){ + String keyHex = "0x" + Hex.toHexString(key); + String path = String.format("\"/store/%s/%s\"", storeName, "key"); + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.abciQuery(path, keyHex)); + checkABCIResponse(rpcResponse); + + return rpcResponse.getResult().getResponse().getValue(); + } + + protected byte[] queryStoreSubspace(String storeName, byte[] key){ + String keyHex = "0x" + Hex.toHexString(key); + String path = String.format("\"/store/%s/subspace\"", storeName); + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.abciQuery(path, keyHex)); + checkABCIResponse(rpcResponse); + + return rpcResponse.getResult().getResponse().getValue(); + } + + protected List queryStoreSubspaceKVPairs(String storeName, byte[] key) throws IOException { + String keyHex = "0x" + Hex.toHexString(key); + String path = String.format("\"/store/%s/subspace\"", storeName); + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.abciQuery(path, keyHex)); + checkABCIResponse(rpcResponse); + + byte[] result = rpcResponse.getResult().getResponse().getValue(); + + if (!ByteUtil.isEmpty(result)) { + try { + CodedInputStream codedInputStream = CodedInputStream.newInstance(result); + + if (codedInputStream.isAtEnd()){ + return new ArrayList<>(); + } + //read length prefix + int length = codedInputStream.readRawVarint32(); + if (length == 0){ + return new ArrayList<>(); + } + + types.Types.KVPairs kvPairs = types.Types.KVPairs.parseFrom(codedInputStream); + + return kvPairs.getPairsList(); + }catch (InvalidProtocolBufferException e){ + throw new IOException("Decode response failed due to: " + e.getMessage()); + } + }else{ + return new ArrayList<>(); + } + } + + protected void checkABCIResponse(JsonRpcResponse rpcResponse) { + if (null != rpcResponse.getError() && null != rpcResponse.getError().getCode()) { + throw new RuntimeException(rpcResponse.getError().toString()); + } + ABCIQueryResult.Response response = rpcResponse.getResult().getResponse(); + if (response.getCode() != null) { + BinanceDexApiError binanceDexApiError = new BinanceDexApiError(); + binanceDexApiError.setCode(response.getCode()); + binanceDexApiError.setMessage(response.getLog()); + throw new BinanceDexApiException(binanceDexApiError); + } + } + +} diff --git a/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateBeaconChainStaking.java b/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateBeaconChainStaking.java new file mode 100644 index 00000000..20d27d66 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateBeaconChainStaking.java @@ -0,0 +1,150 @@ +package com.binance.dex.api.client.impl.node; + +import com.binance.dex.api.client.BinanceDexNodeApi; +import com.binance.dex.api.client.domain.stake.Pool; +import com.binance.dex.api.client.domain.stake.Delegation; +import com.binance.dex.api.client.domain.stake.Redelegation; +import com.binance.dex.api.client.domain.stake.UnBondingDelegation; +import com.binance.dex.api.client.domain.stake.Validator; +import com.binance.dex.api.client.encoding.ByteUtil; +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.encoding.message.beaconchain.query.BeaconChainRedelegationMessage; +import com.binance.dex.api.client.encoding.message.beaconchain.query.BeaconChainUnBondingDelegationMessage; +import com.binance.dex.api.client.encoding.message.beaconchain.query.PoolMessage; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.sidechain.query.*; +import com.fasterxml.jackson.core.type.TypeReference; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Francis.Liu + **/ +public class NodeQueryDelegateBeaconChainStaking extends NodeQuery { + + private String sideChainId = ""; + + private NodeQueryDelegateSideChainStaking sideChainStakingQuery; + + public NodeQueryDelegateBeaconChainStaking(BinanceDexNodeApi binanceDexNodeApi, String hrp, String valHrp, NodeQueryDelegateSideChainStaking sideChainStakingQuery) { + super(binanceDexNodeApi, hrp, valHrp); + this.sideChainStakingQuery = sideChainStakingQuery; + } + + public Validator queryBeaconChainValidator(String validatorAddress) throws IOException { + QueryValidatorParams params = new QueryValidatorParams(sideChainId, Bech32AddressValue.fromBech32StringWithNewHrp(validatorAddress, valHrp)); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/validator\"", data); + if (!ByteUtil.isEmpty(result)){ + String jsonStr = new String(result); + BechValidator validator = EncodeUtils.getObjectMapper().readValue(jsonStr, new TypeReference(){}); + return validator.toValidator(); + } + return null; + } + + public List queryBeaconChainTopValidators(int top) throws IOException { + List validators = this.sideChainStakingQuery.querySideChainTopValidators(sideChainId, top); + return validators; + } + + public Delegation queryBeaconChainDelegation(String delegatorAddress, String validatorAddress) throws IOException { + return this.sideChainStakingQuery.querySideChainDelegation(sideChainId, delegatorAddress, validatorAddress); + } + + public List queryBeaconChainDelegations(String delegatorAddress) throws IOException { + List delegations = this.sideChainStakingQuery.querySideChainDelegations(sideChainId, delegatorAddress); + return delegations; + } + + public Redelegation queryBeaconChainRedelegation(String delegatorAddress, String srcValidatorAddress, String dstValidatorAddress) throws IOException { + QueryRedelegationParams params = new QueryRedelegationParams(sideChainId, delegatorAddress, srcValidatorAddress, dstValidatorAddress); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/redelegation\"", data); + + if (!ByteUtil.isEmpty(result)){ + String jsonStr = new String(result); + BeaconChainRedelegationMessage message = EncodeUtils.getObjectMapper().readValue(jsonStr, new TypeReference(){}); + return message.toRedelegation(); + } + return null; + } + + public List queryBeaconChainRedelegations(String delegatorAddress) throws IOException { + QueryDelegatorParams params = new QueryDelegatorParams(); + params.setDelegatorAddr(delegatorAddress); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/delegatorRedelegations\"", data); + List results = new ArrayList<>(); + if (!ByteUtil.isEmpty(result)){ + String jsonStr = new String(result); + List messages = EncodeUtils.getObjectMapper().readValue(jsonStr, new TypeReference>(){}); + for (BeaconChainRedelegationMessage message : messages) { + results.add(message.toRedelegation()); + } + } + return results; + } + + + public UnBondingDelegation queryBeaconChainUnBondingDelegation(String delegatorAddress, String validatorAddress) throws IOException { + QueryBondsParams params = new QueryBondsParams(); + params.setDelegatorAddr(delegatorAddress); + params.setValidatorAddr(validatorAddress); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/unbondingDelegation\"", data); + + if (!ByteUtil.isEmpty(result)){ + String jsonStr = new String(result); + BeaconChainUnBondingDelegationMessage message = EncodeUtils.getObjectMapper().readValue(jsonStr, new TypeReference(){}); + return message.toBeaconChainUnBondingDelegation(); + } + return null; + } + + public List queryBeaconChainUnBondingDelegations(String delegatorAddress) throws IOException { + QueryDelegatorParams params = new QueryDelegatorParams(); + params.setDelegatorAddr(delegatorAddress); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/delegatorUnbondingDelegations\"", data); + List results = new ArrayList<>(); + if (!ByteUtil.isEmpty(result)){ + String jsonStr = new String(result); + List messages = EncodeUtils.getObjectMapper().readValue(jsonStr, new TypeReference>(){}); + for (BeaconChainUnBondingDelegationMessage message : messages) { + results.add(message.toBeaconChainUnBondingDelegation()); + } + } + return results; + } + + public List queryBeaconChainUnBondingDelegationsByValidator(String validatorAddress) throws IOException { + List unBondingDelegations = this.sideChainStakingQuery.querySideChainUnBondingDelegationsByValidator(sideChainId, validatorAddress); + return unBondingDelegations; + } + + public List queryBeaconChainRedelegationsByValidator(String validatorAddress) throws IOException { + List redelegations = this.sideChainStakingQuery.querySideChainRedelegationsByValidator(sideChainId, validatorAddress); + return redelegations; + } + + public Pool queryBeaconChainPool() throws IOException { + BaseQueryParams params = new BaseQueryParams(); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/pool\"", data); + + if (!ByteUtil.isEmpty(result)){ + String jsonStr = new String(result); + PoolMessage message = EncodeUtils.getObjectMapper().readValue(jsonStr, new TypeReference(){}); + return message.toPool(); + } + return null; + } + + public long queryAllBeaconChainValidatorsCount(boolean jailInvolved) throws IOException { + return this.sideChainStakingQuery.queryAllSideChainValidatorsCount(sideChainId, jailInvolved); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateOracle.java b/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateOracle.java new file mode 100644 index 00000000..4bbd1f44 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateOracle.java @@ -0,0 +1,91 @@ +package com.binance.dex.api.client.impl.node; + +import com.binance.dex.api.client.BinanceDexNodeApi; +import com.binance.dex.api.client.domain.oracle.Prophecy; +import com.binance.dex.api.client.domain.oracle.Status; +import com.binance.dex.api.client.encoding.Bech32; +import com.binance.dex.api.client.encoding.ByteUtil; +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.encoding.amino.Amino; +import com.binance.dex.api.client.encoding.message.bridge.DBProphecy; +import com.fasterxml.jackson.core.type.TypeReference; +import com.google.common.base.Charsets; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.nio.ByteOrder; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Fitz.Lu + **/ +public class NodeQueryDelegateOracle extends NodeQuery { + + private static final String oracleStoreName = "oracle"; + + private static final String claimTypeSequencePrefix = "claimTypeSeq:"; + + private static final Amino amino = new Amino(); + + public NodeQueryDelegateOracle(BinanceDexNodeApi binanceDexNodeApi, String hrp, String valHrp) { + super(binanceDexNodeApi, hrp, valHrp); + } + + @Nullable + public Prophecy getProphecy(int claimType, long sequence) throws IOException { + byte[] key = getClaimId(claimType, sequence).getBytes(Charsets.UTF_8); + byte[] result = queryStore(oracleStoreName, key); + + if (!ByteUtil.isEmpty(result)){ + DBProphecy prophecy = new DBProphecy(); + amino.decodeBare(result, prophecy); + return convert(prophecy); + } + + return null; + } + + public long getCurrentSequence(int claimType){ + byte[] key = getClaimTypeSequence(claimType); + byte[] result = queryStore(oracleStoreName, key); + if (!ByteUtil.isEmpty(result)){ + return java.nio.ByteBuffer.wrap(result).order(ByteOrder.BIG_ENDIAN).getLong(); + } + + return 0; + } + + private Prophecy convert(DBProphecy dbProphecy) throws IOException { + Prophecy prophecy = new Prophecy(); + HashMap validatorClaims; + validatorClaims = EncodeUtils.getObjectMapper().readValue(new String(dbProphecy.getValidatorClaims()), new TypeReference>(){}); + + HashMap claimValidators = new HashMap<>(); + for (Map.Entry entry : validatorClaims.entrySet()) { + claimValidators.put(entry.getValue(), Bech32.decode(entry.getKey()).getData()); + } + + prophecy.setId(dbProphecy.getId()); + + Status status = new Status(); + if (dbProphecy.getStatus() != null){ + status.setText(dbProphecy.getStatus().getText()); + status.setFinalClaim(dbProphecy.getStatus().getFinalClaim()); + } + prophecy.setStatus(status); + prophecy.setValidatorClaims(validatorClaims); + prophecy.setClaimValidators(claimValidators); + + return prophecy; + } + + private String getClaimId(int claimType, long sequence) { + return String.format("%d:%d", claimType, sequence); + } + + private byte[] getClaimTypeSequence(int claimType){ + return ByteUtil.appendBytesArray(claimTypeSequencePrefix.getBytes(Charsets.UTF_8), new byte[]{((byte) claimType)}); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateSideChainStaking.java b/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateSideChainStaking.java new file mode 100644 index 00000000..ea99d5b2 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeQueryDelegateSideChainStaking.java @@ -0,0 +1,512 @@ +package com.binance.dex.api.client.impl.node; + +import com.binance.dex.api.client.*; +import com.binance.dex.api.client.domain.stake.*; +import com.binance.dex.api.client.domain.stake.Delegation; +import com.binance.dex.api.client.encoding.ByteUtil; +import com.binance.dex.api.client.encoding.Crypto; +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.encoding.amino.Amino; +import com.binance.dex.api.client.encoding.amino.InternalAmino; +import com.binance.dex.api.client.encoding.amino.WireType; +import com.binance.dex.api.client.encoding.message.Token; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValue; +import com.binance.dex.api.client.encoding.message.sidechain.query.*; +import com.binance.dex.api.client.encoding.message.sidechain.value.RedelegationValue; +import com.binance.dex.api.client.encoding.message.sidechain.value.UnBondingValue; +import com.fasterxml.jackson.core.type.TypeReference; +import com.google.common.base.Charsets; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Fitz.Lu + **/ +public class NodeQueryDelegateSideChainStaking extends NodeQuery { + + private final String stakeStoreName = "stake"; + private final String scStoreKey = "sc"; + + private static final int addressLength = 20; + + private final byte[] sideChainStorePrefixByIdKey = new byte[]{0x01}; + private final byte[] validatorsKey = new byte[]{0x21}; + private final byte[] delegationKey = new byte[]{0x31}; + private final byte[] redelegationKey = new byte[]{0x34}; + private final byte[] unBondingDelegationKey = new byte[]{0x32}; + private final byte[] poolKey = new byte[]{0x01}; + + private final Charset defaultCharset = Charsets.UTF_8; + + private final Amino amino; + + public NodeQueryDelegateSideChainStaking(BinanceDexNodeApi binanceDexNodeApi, String hrp, String valHrp) { + super(binanceDexNodeApi, hrp, valHrp); + amino = InternalAmino.get(); + } + + public Validator querySideChainValidator(String sideChainId, String validatorAddress) throws IOException { + byte[] storePrefix = getSideChainStorePrefixKey(sideChainId); + byte[] key = ByteUtil.appendBytesArray(storePrefix, getValidatorKey(Crypto.decodeAddress(validatorAddress))); + byte[] result = queryStore(stakeStoreName, key); + + if (result != null) { + SideChainValidatorMessage message = new SideChainValidatorMessage(); + amino.decodeWithLengthPrefix(result, message); + return convert(message); + }else{ + return null; + } + } + + public List querySideChainTopValidators(String sideChainId, int top) throws IOException { + if (top > 50 || top < 1){ + throw new IllegalArgumentException("top must be between 1 and 50"); + } + + QueryTopValidatorParams params = new QueryTopValidatorParams(); + params.setSideChainId(sideChainId); + params.setTop(top); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/topValidators\"", data); + + String jsonStr = new String(result); + + List bechValidator = EncodeUtils.getObjectMapper().readValue(jsonStr, new TypeReference>(){}); + + List sideChainValidators = new ArrayList<>(); + + if (bechValidator != null && !bechValidator.isEmpty()){ + for (BechValidator validator : bechValidator) { + sideChainValidators.add(validator.toValidator()); + } + } + + return sideChainValidators; + } + + private Validator convert(SideChainValidatorMessage message){ + Validator sideChainValidator = new Validator(); + + if (message.getFeeAddr() != null) { + sideChainValidator.setFeeAddr(EncodeUtils.bytesToPrefixHex(message.getFeeAddr())); + } + if (message.getOperatorAddr() != null) { + sideChainValidator.setOperatorAddr(Crypto.encodeAddress(valHrp, message.getOperatorAddr())); + } + + //TODO consPubKey use amino decode with type prefix + if (message.getConsPubKey() != null) { + boolean fallBack = true; + byte[] typePrefix = ByteUtil.pick(message.getConsPubKey(), 0, 4); + if (WireType.isRegistered(typePrefix)) { + byte length = ByteUtil.pick(message.getConsPubKey(), 4, 1)[0]; + int len = Byte.toUnsignedInt(length); + if (message.getConsPubKey().length - 5 == len) { + sideChainValidator.setConsPubKey(ByteUtil.cut(message.getConsPubKey(), 5)); + fallBack = false; + } + } + if (fallBack) { + sideChainValidator.setConsPubKey(message.getConsPubKey()); + } + } + + if (message.getDistributionAddr() != null){ + sideChainValidator.setDistributionAddr(Crypto.encodeAddress(hrp, message.getDistributionAddr())); + } + + sideChainValidator.setJailed(message.isJailed()); + sideChainValidator.setStatus(message.getStatus()); + sideChainValidator.setTokens(message.getTokens().getValue()); + sideChainValidator.setDelegatorShares(message.getDelegatorShares().getValue()); + + Description description = new Description(); + if (message.getDescription() != null){ + description.setMoniker(message.getDescription().getMoniker()); + description.setWebsite(message.getDescription().getWebsite()); + description.setDetails(message.getDescription().getDetails()); + description.setIdentity(message.getDescription().getIdentity()); + } + sideChainValidator.setDescription(description); + + sideChainValidator.setBondHeight(message.getBondHeight()); + sideChainValidator.setBondIntraTxCounter(message.getBondIntraTxCounter()); + sideChainValidator.setUnBondingHeight(message.getUnBondingHeight()); + sideChainValidator.setUnBondingMinTime(message.getUnBondingMinTime()); + + Commission commission = new Commission(); + if (message.getCommission() != null) { + if (message.getCommission().getRate() != null) { + commission.setRate(message.getCommission().getRate().getValue()); + } + if (message.getCommission().getMaxRate() != null) { + commission.setMaxRate(message.getCommission().getMaxRate().getValue()); + } + if (message.getCommission().getMaxChangeRate() != null) { + commission.setMaxChangeRate(message.getCommission().getMaxChangeRate().getValue()); + } + } + sideChainValidator.setCommission(commission); + + sideChainValidator.setSideChainId(message.getSideChainId()); + + if (message.getSideConsAddr() != null) { + sideChainValidator.setSideConsAddr(EncodeUtils.bytesToPrefixHex(message.getSideConsAddr())); + } + if (message.getSideFeeAddr() != null) { + sideChainValidator.setSideFeeAddr(EncodeUtils.bytesToPrefixHex(message.getSideFeeAddr())); + } + + return sideChainValidator; + } + + public Delegation querySideChainDelegation(String sideChainId, String delegatorAddress, String validatorAddress) throws IOException { + QueryBondsParams params = new QueryBondsParams(); + params.setSideChainId(sideChainId); + params.setDelegatorAddr(delegatorAddress); + params.setValidatorAddr(validatorAddress); + + byte[] paramsBytes = EncodeUtils.toJsonEncodeBytes(params); + + byte[] response = queryWithData("\"custom/stake/delegation\"", paramsBytes); + if (!ByteUtil.isEmpty(response)){ + DelegationResponse delegationResponse = EncodeUtils.getObjectMapper().readValue(response, DelegationResponse.class); + return convert(delegationResponse); + } + + return null; + } + + public List querySideChainDelegations(String sideChainId, String delegatorAddress) throws IOException { + QueryDelegatorParams params = new QueryDelegatorParams(); + params.setSideChainId(sideChainId); + params.setDelegatorAddr(delegatorAddress); + + byte[] paramsBytes = EncodeUtils.toJsonEncodeBytes(params); + byte[] response = queryWithData("\"custom/stake/delegatorDelegations\"", paramsBytes); + + List results = new ArrayList<>(); + + if (!ByteUtil.isEmpty(response)){ + String a = new String(response); + List delegations = EncodeUtils.getObjectMapper().readValue(response, new TypeReference>(){}); + for (DelegationResponse delegation : delegations) { + results.add(convert(delegation)); + } + } + + return results; + } + + private Delegation convert(DelegationResponse delegationResponse){ + Delegation sideChainDelegation = new Delegation(); + if (delegationResponse.getDelegation() != null) { + DelegationItem delegation = new DelegationItem(); + delegation.setDelegatorAddress(delegationResponse.getDelegation().getDelegatorAddress()); + delegation.setValidatorAddress(delegationResponse.getDelegation().getValidatorAddress()); + delegation.setShares(delegationResponse.getDelegation().getShares()); + sideChainDelegation.setDelegation(delegation); + } + if (delegationResponse.getBalance() != null){ + sideChainDelegation.setBalance(convert(delegationResponse.getBalance())); + } + + return sideChainDelegation; + } + + public Redelegation querySideChainRedelegation(String sideChainId, String delegatorAddress, String srcValidatorAddress, String dstValidatorAddress) throws IOException { + byte[] storePrefix = getSideChainStorePrefixKey(sideChainId); + byte[] redKey = getRedelegationKey(Crypto.decodeAddress(delegatorAddress), Crypto.decodeAddress(srcValidatorAddress), + Crypto.decodeAddress(dstValidatorAddress)); + byte[] key = ByteUtil.appendBytesArray(storePrefix, redKey); + byte[] result = queryStore(stakeStoreName, key); + + if (!ByteUtil.isEmpty(result)){ + RedelegationValue message = new RedelegationValue(); + amino.decodeWithLengthPrefix(result, message); + return convert(message, redKey); + } + + return null; + } + + public List querySideChainRedelegations(String sideChainId, String delegatorAddress) throws IOException { + byte[] storePrefix = getSideChainStorePrefixKey(sideChainId); + byte[] redsKey = getRedelegationsKey(Crypto.decodeAddress(delegatorAddress)); + byte[] key = ByteUtil.appendBytesArray(storePrefix, redsKey); + List result = queryStoreSubspaceKVPairs(stakeStoreName, key); + List redelegations = new ArrayList<>(); + if (result != null && !result.isEmpty()){ + for (common.Types.KVPair kvPair : result) { + byte[] k = ByteUtil.cut(kvPair.getKey().toByteArray(), storePrefix.length); + RedelegationValue message = new RedelegationValue(); + amino.decodeWithLengthPrefix(kvPair.getValue().toByteArray(), message); + redelegations.add(convert(message, k)); + } + } + + return redelegations; + } + + private Redelegation convert(RedelegationValue value, byte[] key){ + byte[] addresses = ByteUtil.cut(key, 1); + if (addresses.length != addressLength * 3){ + throw new IllegalStateException("unexpected address length for (address, srcValidator, dstValidator)"); + } + + String delAddr = Crypto.encodeAddress(hrp, ByteUtil.pick(addresses, 0, addressLength)); + String srcValAddr = Crypto.encodeAddress(valHrp, ByteUtil.pick(addresses, addressLength, addressLength)); + String dstValAddr = Crypto.encodeAddress(valHrp, ByteUtil.pick(addresses, addressLength * 2, addressLength)); + + Redelegation redelegation = new Redelegation(); + redelegation.setDelegatorAddress(delAddr); + redelegation.setSrcValidatorAddress(srcValAddr); + redelegation.setDstValidatorAddress(dstValAddr); + + redelegation.setCreateHeight(value.getCreationHeight()); + if (value.getMinTime() != null) { + redelegation.setMinTimeInMs(value.getMinTime().getTimeInMilliseconds()); + } + if (value.getInitialBalance() != null){ + redelegation.setInitialBalance(value.getInitialBalance().toToken()); + } + if (value.getBalance() != null){ + redelegation.setBalance(value.getBalance().toToken()); + } + + if (value.getSharesSrc() != null){ + redelegation.setSrcShares(value.getSharesSrc().getValue()); + } + + if (value.getSharesDst() != null){ + redelegation.setDstShare(value.getSharesDst().getValue()); + } + + return redelegation; + } + + public UnBondingDelegation querySideChainUnBondingDelegation(String sideChainId, String delegatorAddress, String validatorAddress) throws IOException { + byte[] storePrefix = getSideChainStorePrefixKey(sideChainId); + byte[] ubdKey = getUnBondingDelegationKey(Crypto.decodeAddress(delegatorAddress), Crypto.decodeAddress(validatorAddress)); + byte[] key = ByteUtil.appendBytesArray(storePrefix, ubdKey); + byte[] result = queryStore(stakeStoreName, key); + if (!ByteUtil.isEmpty(result)) { + UnBondingValue unBondingValue = new UnBondingValue(); + amino.decodeWithLengthPrefix(result, unBondingValue); + return convert(unBondingValue, ByteUtil.cut(ubdKey, unBondingDelegationKey.length)); + }else{ + return null; + } + } + + public List querySideChainUnBondingDelegations(String sideChainId, String delegatorAddress) throws IOException { + byte[] storePrefix = getSideChainStorePrefixKey(sideChainId); + byte[] ubdsKey = getUnBondingDelegationsKey(Crypto.decodeAddress(delegatorAddress)); + byte[] key = ByteUtil.appendBytesArray(storePrefix, ubdsKey); + List kvPairs = queryStoreSubspaceKVPairs(stakeStoreName, key); + List unBondingDelegations = new ArrayList<>(); + if (kvPairs != null && !kvPairs.isEmpty()){ + for (common.Types.KVPair kvPair : kvPairs) { + UnBondingValue unBondingValue = new UnBondingValue(); + amino.decodeWithLengthPrefix(kvPair.getValue().toByteArray(), unBondingValue); + unBondingDelegations.add(convert(unBondingValue, ByteUtil.cut(kvPair.getKey().toByteArray(), storePrefix.length + unBondingDelegationKey.length))); + } + } + + return unBondingDelegations; + } + + public List querySideChainUnBondingDelegationsByValidator(String sideChainId, String validatorAddress) throws IOException { + QueryValidatorParams params = new QueryValidatorParams(sideChainId, Bech32AddressValue.fromBech32StringWithNewHrp(validatorAddress, valHrp)); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/validatorUnbondingDelegations\"", data); + + List unBondingDelegations = new ArrayList<>(); + + if (!ByteUtil.isEmpty(result)){ + List messages = EncodeUtils.getObjectMapper().readValue(result, new TypeReference>(){}); + if (messages != null && !messages.isEmpty()){ + for (UnBondingDelegationMessage message : messages) { + unBondingDelegations.add(convert(message)); + } + } + } + + return unBondingDelegations; + } + + public List querySideChainRedelegationsByValidator(String sideChainId, String validatorAddress) throws IOException { + QueryValidatorParams params = new QueryValidatorParams(sideChainId, Bech32AddressValue.fromBech32StringWithNewHrp(validatorAddress, valHrp)); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + byte[] result = queryWithData("\"custom/stake/validatorRedelegations\"", data); + + List redelegations = new ArrayList<>(); + + if (!ByteUtil.isEmpty(result)){ + List messages = EncodeUtils.getObjectMapper().readValue(result, new TypeReference>(){}); + if (messages != null && !messages.isEmpty()){ + for (SideChainRedelegationMessage message : messages) { + redelegations.add(convert(message)); + } + } + } + + return redelegations; + } + + public Pool querySideChainPool(String sideChainId) throws IOException { + byte[] storePrefix = getSideChainStorePrefixKey(sideChainId); + byte[] key = ByteUtil.appendBytesArray(storePrefix, poolKey); + byte[] result = queryStore(stakeStoreName, key); + + if (!ByteUtil.isEmpty(result)){ + PoolMessage message = new PoolMessage(); + amino.decodeWithLengthPrefix(result, message); + + Pool pool = new Pool(); + if (message.getLooseTokens() != null){ + pool.setLooseTokens(message.getLooseTokens().getValue()); + } + if (message.getBondedTokens() != null){ + pool.setBondedTokens(message.getBondedTokens().getValue()); + } + + return pool; + } + + return null; + } + + public long queryAllSideChainValidatorsCount(String sideChainId, boolean jailInvolved) throws IOException { + BaseQueryParams params = new BaseQueryParams(); + params.setSideChainId(sideChainId); + byte[] data = EncodeUtils.toJsonEncodeBytes(params); + String path = "\"custom/stake/allUnJailValidatorsCount\""; + if (jailInvolved){ + path = "\"custom/stake/allValidatorsCount\""; + } + byte[] result = queryWithData(path, data); + if (!ByteUtil.isEmpty(result)){ + String count = new String(result); + if (count.contains("\"")){ + count = count.replaceAll("\"", ""); + } + return Long.parseLong(count); + } + + return 0L; + } + + private Redelegation convert(SideChainRedelegationMessage message){ + Redelegation redelegation = new Redelegation(); + redelegation.setDelegatorAddress(message.getDelegatorAddress()); + redelegation.setSrcValidatorAddress(message.getSrcValidatorAddress()); + redelegation.setDstValidatorAddress(message.getDstValidatorAddress()); + redelegation.setCreateHeight(message.getCreateHeight()); + redelegation.setMinTime(message.getMinTime()); + if (message.getInitialBalance() != null) { + redelegation.setInitialBalance(convert(message.getInitialBalance())); + } + if (message.getBalance() != null){ + redelegation.setBalance(convert(message.getBalance())); + } + redelegation.setSrcShares(message.getSrcShares()); + redelegation.setDstShare(message.getDstShare()); + + return redelegation; + } + + private Token convert(CoinValue coinValue){ + Token token = new Token(); + token.setDenom(coinValue.getDenom()); + token.setAmount(coinValue.getAmount()); + return token; + } + + private UnBondingDelegation convert(UnBondingDelegationMessage message){ + UnBondingDelegation unBondingDelegation = new UnBondingDelegation(); + unBondingDelegation.setBalance(message.getBalance()); + unBondingDelegation.setCreateHeight(message.getCreateHeight()); + unBondingDelegation.setDelegatorAddress(message.getDelegatorAddress()); + unBondingDelegation.setValidatorAddress(message.getValidatorAddress()); + unBondingDelegation.setInitialBalance(message.getInitialBalance()); + unBondingDelegation.setMinTime(message.getMinTime()); + + return unBondingDelegation; + } + + private UnBondingDelegation convert(UnBondingValue value, byte[] addresses){ + if (addresses.length != addressLength * 2){ + throw new IllegalStateException("unexpected address length for this (address, validator) pair"); + } + + UnBondingDelegation unBondingDelegation = new UnBondingDelegation(); + unBondingDelegation.setDelegatorAddress(Crypto.encodeAddress(hrp, ByteUtil.pick(addresses, 0, addressLength))); + unBondingDelegation.setValidatorAddress(Crypto.encodeAddress(hrp, ByteUtil.pick(addresses, addressLength, addressLength))); + unBondingDelegation.setCreateHeight(value.getCreationHeight()); + if (value.getMinTime() != null){ + unBondingDelegation.setMinTimeInMs(value.getMinTime().getTimeInMilliseconds()); + } + if (value.getInitialBalance() != null){ + unBondingDelegation.setInitialBalance(value.getInitialBalance().toToken()); + } + if (value.getBalance() != null){ + unBondingDelegation.setBalance(value.getBalance().toToken()); + } + + return unBondingDelegation; + } + + private byte[] getSideChainStorePrefixKey(String sideChainId){ + byte[] sideChainIdBytes = sideChainId.getBytes(defaultCharset); + byte[] key = ByteUtil.appendBytesArray(sideChainStorePrefixByIdKey, sideChainIdBytes); + byte[] result = queryStore(scStoreKey, key); + + if (result == null || result.length == 0){ + throw new IllegalArgumentException("Invalid sideChainId: " + sideChainId); + } + + return result; + } + + private byte[] getValidatorKey(byte[] operatorAddress){ + return ByteUtil.appendBytesArray(validatorsKey, operatorAddress); + } + + private byte[] getRedelegationKey(byte[] delAddr, byte[] srcValAddr, byte[] dstValAddr){ + int length = 1 + addressLength * 3; + byte[] key = new byte[length]; + + byte[] redsKey = getRedelegationsKey(delAddr); + System.arraycopy(redsKey, 0, key, 0, redsKey.length); + System.arraycopy(srcValAddr, 0, key, redsKey.length, srcValAddr.length); + System.arraycopy(dstValAddr, 0, key, redsKey.length + srcValAddr.length, dstValAddr.length); + return key; + } + + private byte[] getDelegationKey(byte[] delegateAddress, byte[] validatorAddress){ + return ByteUtil.appendBytesArray(getDelegationsKey(delegateAddress), validatorAddress); + } + + private byte[] getDelegationsKey(byte[] delegateAddress){ + return ByteUtil.appendBytesArray(delegationKey, delegateAddress); + } + + private byte[] getRedelegationsKey(byte[] delAddr){ + return ByteUtil.appendBytesArray(redelegationKey, delAddr); + } + + byte[] getUnBondingDelegationKey(byte[] delegatorAddress, byte[] validatorAddress){ + return ByteUtil.appendBytesArray(getUnBondingDelegationsKey(delegatorAddress), validatorAddress); + } + + byte[] getUnBondingDelegationsKey(byte[] delegatorAddress){ + return ByteUtil.appendBytesArray(unBondingDelegationKey, delegatorAddress); + } + +} 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 new file mode 100644 index 00000000..3daa362b --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeTx.java @@ -0,0 +1,146 @@ +package com.binance.dex.api.client.impl.node; + +import com.binance.dex.api.client.BinanceDexApiClientGenerator; +import com.binance.dex.api.client.BinanceDexApiException; +import com.binance.dex.api.client.BinanceDexNodeApi; +import com.binance.dex.api.client.Wallet; +import com.binance.dex.api.client.domain.TransactionMetadata; +import com.binance.dex.api.client.domain.broadcast.TransactionOption; +import com.binance.dex.api.client.domain.jsonrpc.AsyncBroadcastResult; +import com.binance.dex.api.client.domain.jsonrpc.CommitBroadcastResult; +import com.binance.dex.api.client.domain.jsonrpc.JsonRpcResponse; +import com.binance.dex.api.client.encoding.message.BinanceDexTransactionMessage; +import com.binance.dex.api.client.encoding.message.TransactionRequestAssembler; +import com.google.common.collect.Lists; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +/** + * @author Fitz.Lu + **/ +class NodeTx { + + protected final BinanceDexNodeApi binanceDexNodeApi; + + protected final String hrp; + + protected final String valHrp; + + NodeTx(BinanceDexNodeApi binanceDexNodeApi, String hrp, String valHrp){ + this.binanceDexNodeApi = binanceDexNodeApi; + this.hrp = hrp; + this.valHrp = valHrp; + } + + protected List broadcast(BinanceDexTransactionMessage message, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + message.validateBasic(); + TransactionRequestAssembler assembler = new TransactionRequestAssembler(wallet, options); + String requestPayload = "0x" + assembler.buildTxPayload(message); + if (sync) { + return syncBroadcast(requestPayload, wallet); + } else { + return asyncBroadcast(requestPayload, wallet); + } + } + + protected List syncBroadcast(String requestBody, Wallet wallet) { + try { + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.commitBroadcast(requestBody)); + CommitBroadcastResult commitBroadcastResult = rpcResponse.getResult(); + TransactionMetadata transactionMetadata = new TransactionMetadata(); + transactionMetadata.setCode(commitBroadcastResult.getCheckTx().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.setOk(true); + } else { + wallet.invalidAccountSequence(); + transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setOk(false); + } + + return Lists.newArrayList(transactionMetadata); + } catch (BinanceDexApiException e) { + wallet.invalidAccountSequence(); + throw new RuntimeException(e); + } + } + + protected List syncBroadcast(String requestBody) { + try { + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.commitBroadcast(requestBody)); + CommitBroadcastResult commitBroadcastResult = rpcResponse.getResult(); + TransactionMetadata transactionMetadata = new TransactionMetadata(); + transactionMetadata.setCode(commitBroadcastResult.getCheckTx().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.setOk(true); + } else { + transactionMetadata.setLog(commitBroadcastResult.getCheckTx().getLog()); + transactionMetadata.setOk(false); + } + + return Lists.newArrayList(transactionMetadata); + } catch (BinanceDexApiException e) { + throw new RuntimeException(e); + } + } + + protected List asyncBroadcast(String requestBody) { + try { + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.asyncBroadcast(requestBody)); + AsyncBroadcastResult asyncBroadcastResult = rpcResponse.getResult(); + TransactionMetadata transactionMetadata = new TransactionMetadata(); + + transactionMetadata.setCode(asyncBroadcastResult.getCode()); + transactionMetadata.setLog(asyncBroadcastResult.getLog()); + + if (asyncBroadcastResult.getCode() == 0) { + transactionMetadata.setHash(asyncBroadcastResult.getHash()); + transactionMetadata.setData(asyncBroadcastResult.getData()); + transactionMetadata.setOk(true); + } else { + transactionMetadata.setOk(false); + } + + return Lists.newArrayList(transactionMetadata); + } catch (BinanceDexApiException e) { + throw new RuntimeException(e); + } + } + + + protected List asyncBroadcast(String requestBody, Wallet wallet) { + try { + JsonRpcResponse rpcResponse = BinanceDexApiClientGenerator.executeSync(binanceDexNodeApi.asyncBroadcast(requestBody)); + AsyncBroadcastResult asyncBroadcastResult = rpcResponse.getResult(); + TransactionMetadata transactionMetadata = new TransactionMetadata(); + + transactionMetadata.setCode(asyncBroadcastResult.getCode()); + transactionMetadata.setLog(asyncBroadcastResult.getLog()); + + if (asyncBroadcastResult.getCode() == 0) { + wallet.increaseAccountSequence(); + transactionMetadata.setHash(asyncBroadcastResult.getHash()); + transactionMetadata.setData(asyncBroadcastResult.getData()); + transactionMetadata.setOk(true); + } else { + wallet.invalidAccountSequence(); + transactionMetadata.setOk(false); + } + + return Lists.newArrayList(transactionMetadata); + } catch (BinanceDexApiException e) { + wallet.invalidAccountSequence(); + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateBeaconChainStaking.java b/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateBeaconChainStaking.java new file mode 100644 index 00000000..a4089fb9 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateBeaconChainStaking.java @@ -0,0 +1,172 @@ +package com.binance.dex.api.client.impl.node; + +import com.binance.dex.api.client.BinanceDexNodeApi; +import com.binance.dex.api.client.Wallet; +import com.binance.dex.api.client.domain.TransactionMetadata; +import com.binance.dex.api.client.domain.broadcast.TransactionOption; +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.domain.stake.beaconchain.*; +import com.binance.dex.api.client.encoding.message.Token; +import com.binance.dex.api.client.encoding.message.beaconchain.transaction.*; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.binance.dex.api.client.encoding.message.sidechain.value.CommissionMsgValue; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import com.google.common.annotations.VisibleForTesting; +import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +/** + * @author Francis.Liu + **/ +public class NodeTxDelegateBeaconChainStaking extends NodeTx { + + public NodeTxDelegateBeaconChainStaking(BinanceDexNodeApi binanceDexNodeApi, String hrp, String valHrp) { + super(binanceDexNodeApi, hrp, valHrp); + } + + public List createBeaconChainValidator(CreateBeaconChainValidator createBeaconChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + CreateBeaconChainValidatorMessage message = convert(createBeaconChainValidator); + if (StringUtils.isEmpty(createBeaconChainValidator.getValidatorAddr())) { + message.setValidatorOperatorAddr(Bech32AddressValue.fromBech32StringWithNewHrp(wallet.getAddress(), valHrp)); + }else{ + message.setValidatorOperatorAddr(Bech32AddressValue.fromBech32StringWithNewHrp(createBeaconChainValidator.getValidatorAddr(), valHrp)); + } + return broadcast(message, wallet, options, sync); + } + + public List editBeaconChainValidator(EditBeaconChainValidator editBeaconChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + EditBeaconChainValidatorMessage message = convert(editBeaconChainValidator); + if (StringUtils.isEmpty(editBeaconChainValidator.getValidatorAddress())) { + message.setValidatorOperatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(wallet.getAddress(), valHrp)); + }else{ + message.setValidatorOperatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(editBeaconChainValidator.getValidatorAddress(), valHrp)); + } + return broadcast(message, wallet, options, sync); + } + + public List beaconChainDelegate(BeaconChainDelegate beaconChainDelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + BeaconChainDelegateMessage message = convert(beaconChainDelegate); + return broadcast(message, wallet, options, sync); + } + + public List beaconChainRedelegate(BeaconChainRedelegate beaconChainRedelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + BeaconChainRedelegateMessage message = convert(beaconChainRedelegate); + return broadcast(message, wallet, options, sync); + } + + public List beaconChainUndelegate(BeaconChainUndelegate beaconChainUndelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + BeaconChainUndelegateMessage message = convert(beaconChainUndelegate); + return broadcast(message, wallet, options, sync); + } + + @VisibleForTesting + CreateBeaconChainValidatorMessage convert(CreateBeaconChainValidator createBeaconChainValidator){ + CreateBeaconChainValidatorMessage message = new CreateBeaconChainValidatorMessage(); + + if (createBeaconChainValidator.getDescription() != null){ + message.setDescription(convert(createBeaconChainValidator.getDescription())); + } + if (createBeaconChainValidator.getCommission() != null){ + message.setCommission(convert(createBeaconChainValidator.getCommission())); + } + + message.setDelegatorAddr(Bech32AddressValue.fromBech32String(createBeaconChainValidator.getDelegatorAddr())); + + if (createBeaconChainValidator.getDelegation() != null){ + message.setDelegation(convert(createBeaconChainValidator.getDelegation())); + } + + message.setPubKey(createBeaconChainValidator.getPubKey()); + return message; + } + + @VisibleForTesting + EditBeaconChainValidatorMessage convert(EditBeaconChainValidator editBeaconChainValidator){ + EditBeaconChainValidatorMessage message = new EditBeaconChainValidatorMessage(); + + if (editBeaconChainValidator.getDescription() != null){ + message.setDescription(convert(editBeaconChainValidator.getDescription())); + } + + message.setCommissionRate(Dec.newInstance(editBeaconChainValidator.getCommissionRate())); + if (editBeaconChainValidator.getPubKey() != null){ + message.setPubKey(editBeaconChainValidator.getPubKey()); + } + + return message; + } + + private byte[] decodeHexAddress(String address){ + String addr = address; + if (addr.startsWith("0x")){ + addr = address.substring(2); + } + return Hex.decode(addr); + } + + private DescriptionValue convert(Description description){ + DescriptionValue value = new DescriptionValue(); + value.setMoniker(description.getMoniker()); + value.setDetails(description.getDetails()); + value.setIdentity(description.getIdentity()); + value.setWebsite(description.getWebsite()); + return value; + } + + private CommissionMsgValue convert(Commission commission){ + CommissionMsgValue value = new CommissionMsgValue(); + value.setRate(Dec.newInstance(commission.getRate())); + value.setMaxRate(Dec.newInstance(commission.getMaxRate())); + value.setMaxChangeRate(Dec.newInstance(commission.getMaxChangeRate())); + return value; + } + + private CoinValueStr convert(Token token){ + CoinValueStr value = new CoinValueStr(); + value.setDenom(token.getDenom()); + value.setAmount(token.getAmount()); + return value; + } + + private BeaconChainDelegateMessage convert(BeaconChainDelegate beaconChainDelegate){ + BeaconChainDelegateMessage message = new BeaconChainDelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(beaconChainDelegate.getDelegatorAddress())); + message.setValidatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(beaconChainDelegate.getValidatorAddress(), valHrp)); + + if (beaconChainDelegate.getDelegation() != null) { + message.setDelegation(convert(beaconChainDelegate.getDelegation())); + } + + return message; + } + + private BeaconChainRedelegateMessage convert(BeaconChainRedelegate redelegate){ + BeaconChainRedelegateMessage message = new BeaconChainRedelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(redelegate.getDelegatorAddress())); + message.setSrcValidatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(redelegate.getSrcValidatorAddress(), valHrp)); + message.setDstValidatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(redelegate.getDstValidatorAddress(), valHrp)); + if (redelegate.getAmount() != null) { + message.setAmount(convert(redelegate.getAmount())); + } + return message; + } + + private BeaconChainUndelegateMessage convert(BeaconChainUndelegate unBond){ + BeaconChainUndelegateMessage message = new BeaconChainUndelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(unBond.getDelegatorAddress())); + message.setValidatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(unBond.getValidatorAddress(), valHrp)); + if (unBond.getAmount() != null) { + message.setAmount(convert(unBond.getAmount())); + } + return message; + } + + +} diff --git a/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateBridge.java b/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateBridge.java new file mode 100644 index 00000000..51d5bcb7 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateBridge.java @@ -0,0 +1,126 @@ +package com.binance.dex.api.client.impl.node; + +import com.binance.dex.api.client.BinanceDexNodeApi; +import com.binance.dex.api.client.Wallet; +import com.binance.dex.api.client.domain.TransactionMetadata; +import com.binance.dex.api.client.domain.bridge.TransferIn; +import com.binance.dex.api.client.domain.broadcast.TransactionOption; +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.encoding.message.Token; +import com.binance.dex.api.client.encoding.message.common.CoinValue; +import com.binance.dex.api.client.encoding.message.common.EthAddressValue; +import com.binance.dex.api.client.encoding.message.bridge.*; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +/** + * @author Fitz.Lu + **/ +public class NodeTxDelegateBridge extends NodeTx { + + public NodeTxDelegateBridge(BinanceDexNodeApi binanceDexNodeApi, String hrp, String valHrp) { + super(binanceDexNodeApi, hrp, valHrp); + } + + public List claim(int chainId, byte[] payload, long sequence, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + ClaimMsgMessage message = new ClaimMsgMessage(); + message.setChainId(chainId); + message.setSequence(sequence); + message.setPayload(payload); + message.setValidatorAddress(Bech32AddressValue.fromBech32String(wallet.getAddress())); + return broadcast(message, wallet, options, sync); + } + + public List transferIn(long sequence, TransferIn transferIn, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + TransferInClaimMessage message = convert(transferIn); + String claim = EncodeUtils.getObjectMapper().writeValueAsString(message); + ClaimMsgMessage claimMsg = new ClaimMsgMessage(ClaimTypes.ClaimTypeTransferIn, sequence, claim.getBytes(), Bech32AddressValue.fromBech32String(wallet.getAddress())); + + return broadcast(claimMsg, wallet, options, sync); + } + + public List transferOut(String toAddress, Token amount, long expireTimeInSeconds, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + TransferOutMsgMessage message = new TransferOutMsgMessage(); + message.setFrom(Bech32AddressValue.fromBech32String(wallet.getAddress())); + message.setToAddress(EthAddressValue.from(toAddress)); + message.setAmount(convert(amount)); + message.setExpireTime(expireTimeInSeconds); + + return broadcast(message, wallet, options, sync); + } + + public List bind(String symbol, long amount, String contractAddress, int contractDecimal, long expireTimeInSeconds, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + BindMsgMessage message = new BindMsgMessage(); + message.setFrom(Bech32AddressValue.fromBech32String(wallet.getAddress())); + message.setSymbol(symbol); + message.setAmount(amount); + message.setContractAddress(EthAddressValue.from(contractAddress)); + message.setContractDecimal(contractDecimal); + message.setExpireTime(expireTimeInSeconds); + + return broadcast(message, wallet, options, sync); + } + + public List unBind(String symbol, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + UnbindMsgMessage message = new UnbindMsgMessage(); + message.setFrom(Bech32AddressValue.fromBech32String(wallet.getAddress())); + message.setSymbol(symbol); + + return broadcast(message, wallet, options, sync); + } + + public List updateTransferOut(long sequence, String refundAddress, Token amount, int refundReason, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + UpdateTransferOutClaimMessage message = new UpdateTransferOutClaimMessage(); + message.setAmount(convert(amount)); + message.setRefundAddress(Bech32AddressValue.fromBech32String(refundAddress)); + message.setRefundReason(refundReason); + + ClaimMsgMessage claimMsg = new ClaimMsgMessage(ClaimTypes.ClaimTypeUpdateTransferOut, sequence, + EncodeUtils.getObjectMapper().writeValueAsString(message).getBytes(), Bech32AddressValue.fromBech32String(wallet.getAddress())); + + return broadcast(claimMsg, wallet, options, sync); + } + + public List updateBind(long sequence, String symbol, String contractAddress, int status, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + UpdateBindClaimMessage message = new UpdateBindClaimMessage(); + message.setStatus(status); + message.setSymbol(symbol); + message.setContractAddress(EthAddressValue.from(contractAddress)); + + ClaimMsgMessage claimMsg = new ClaimMsgMessage(ClaimTypes.ClaimTypeUpdateBind, sequence, + EncodeUtils.getObjectMapper().writeValueAsString(message).getBytes(), Bech32AddressValue.fromBech32String(wallet.getAddress())); + + return broadcast(claimMsg, wallet, options, sync); + } + + private CoinValue convert(Token token){ + CoinValue value = new CoinValue(); + value.setDenom(token.getDenom()); + value.setAmount(token.getAmount()); + return value; + } + + private TransferInClaimMessage convert(TransferIn transferIn){ + TransferInClaimMessage message = new TransferInClaimMessage(); + message.setContractAddress(transferIn.getContractAddress()); + message.setRefundAddresses(transferIn.getRefundAddresses()); + message.setReceiverAddresses(transferIn.getReceiverAddresses()); + message.setAmounts(transferIn.getAmounts()); + message.setSymbol(transferIn.getSymbol()); + + CoinValue coinValue = new CoinValue(); + if (transferIn.getRelayFee() != null){ + coinValue.setDenom(transferIn.getRelayFee().getDenom()); + coinValue.setAmount(transferIn.getRelayFee().getAmount()); + } + message.setRelayFee(coinValue); + + message.setExpireTime(transferIn.getExpireTime()); + + return message; + } + +} diff --git a/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateSideChainStaking.java b/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateSideChainStaking.java new file mode 100644 index 00000000..651080a8 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/impl/node/NodeTxDelegateSideChainStaking.java @@ -0,0 +1,175 @@ +package com.binance.dex.api.client.impl.node; + +import com.binance.dex.api.client.BinanceDexNodeApi; +import com.binance.dex.api.client.Wallet; +import com.binance.dex.api.client.domain.TransactionMetadata; +import com.binance.dex.api.client.domain.broadcast.TransactionOption; +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.domain.stake.sidechain.*; +import com.binance.dex.api.client.encoding.message.Token; +import com.binance.dex.api.client.encoding.message.common.Bech32AddressValue; +import com.binance.dex.api.client.encoding.message.common.CoinValueStr; +import com.binance.dex.api.client.encoding.message.common.Dec; +import com.binance.dex.api.client.encoding.message.sidechain.transaction.*; +import com.binance.dex.api.client.encoding.message.sidechain.value.*; +import com.google.common.annotations.VisibleForTesting; +import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.util.encoders.Hex; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +/** + * @author Fitz.Lu + **/ +public class NodeTxDelegateSideChainStaking extends NodeTx { + + public NodeTxDelegateSideChainStaking(BinanceDexNodeApi binanceDexNodeApi, String hrp, String valHrp) { + super(binanceDexNodeApi, hrp, valHrp); + } + + public List createSideChainValidator(CreateSideChainValidator createSideChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + CreateSideChainValidatorMessage message = convert(createSideChainValidator); + if (StringUtils.isEmpty(createSideChainValidator.getValidatorAddr())) { + message.setValidatorOperatorAddr(Bech32AddressValue.fromBech32StringWithNewHrp(wallet.getAddress(), valHrp)); + }else{ + message.setValidatorOperatorAddr(Bech32AddressValue.fromBech32StringWithNewHrp(createSideChainValidator.getValidatorAddr(), valHrp)); + } + return broadcast(message, wallet, options, sync); + } + + public List editSideChainValidator(EditSideChainValidator editSideChainValidator, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + EditSideChainValidatorMessage message = convert(editSideChainValidator); + if (StringUtils.isEmpty(editSideChainValidator.getValidatorAddress())) { + message.setValidatorOperatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(wallet.getAddress(), valHrp)); + }else{ + message.setValidatorOperatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(editSideChainValidator.getValidatorAddress(), valHrp)); + } + return broadcast(message, wallet, options, sync); + } + + public List sideChainDelegate(SideChainDelegate sideChainDelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + SideChainDelegateMessage message = convert(sideChainDelegate); + return broadcast(message, wallet, options, sync); + } + + public List sideChainRedelagate(SideChainRedelegate sideChainRedelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + SideChainRedelegateMessage message = convert(sideChainRedelegate); + return broadcast(message, wallet, options, sync); + } + + public List sideChainUnbond(SideChainUnBond sideChainUndelegate, Wallet wallet, TransactionOption options, boolean sync) throws IOException, NoSuchAlgorithmException { + SideChainUndelegateMessage message = convert(sideChainUndelegate); + return broadcast(message, wallet, options, sync); + } + + @VisibleForTesting + CreateSideChainValidatorMessage convert(CreateSideChainValidator createSideChainValidator){ + CreateSideChainValidatorMessage message = new CreateSideChainValidatorMessage(); + + if (createSideChainValidator.getDescription() != null){ + message.setDescription(convert(createSideChainValidator.getDescription())); + } + if (createSideChainValidator.getCommission() != null){ + message.setCommission(convert(createSideChainValidator.getCommission())); + } + + message.setDelegatorAddr(Bech32AddressValue.fromBech32String(createSideChainValidator.getDelegatorAddr())); + + if (createSideChainValidator.getDelegation() != null){ + message.setDelegation(convert(createSideChainValidator.getDelegation())); + } + + message.setSideChainId(createSideChainValidator.getSideChainId()); + message.setSideConsAddr(decodeHexAddress(createSideChainValidator.getSideConsAddr())); + message.setSideFeeAddr(decodeHexAddress(createSideChainValidator.getSideFeeAddr())); + return message; + } + + @VisibleForTesting + EditSideChainValidatorMessage convert(EditSideChainValidator editSideChainValidator){ + EditSideChainValidatorMessage message = new EditSideChainValidatorMessage(); + + if (editSideChainValidator.getDescription() != null){ + message.setDescription(convert(editSideChainValidator.getDescription())); + } + + message.setCommissionRate(Dec.newInstance(editSideChainValidator.getCommissionRate())); + message.setSideChainId(editSideChainValidator.getSideChainId()); + message.setSideFeeAddr(decodeHexAddress(editSideChainValidator.getSideFeeAddr())); + + return message; + } + + private byte[] decodeHexAddress(String address){ + String addr = address; + if (addr.startsWith("0x")){ + addr = address.substring(2); + } + return Hex.decode(addr); + } + + private DescriptionValue convert(Description description){ + DescriptionValue value = new DescriptionValue(); + value.setMoniker(description.getMoniker()); + value.setDetails(description.getDetails()); + value.setIdentity(description.getIdentity()); + value.setWebsite(description.getWebsite()); + return value; + } + + private CommissionMsgValue convert(Commission commission){ + CommissionMsgValue value = new CommissionMsgValue(); + value.setRate(Dec.newInstance(commission.getRate())); + value.setMaxRate(Dec.newInstance(commission.getMaxRate())); + value.setMaxChangeRate(Dec.newInstance(commission.getMaxChangeRate())); + return value; + } + + private CoinValueStr convert(Token token){ + CoinValueStr value = new CoinValueStr(); + value.setDenom(token.getDenom()); + value.setAmount(token.getAmount()); + return value; + } + + private SideChainDelegateMessage convert(SideChainDelegate sideChainDelegate){ + SideChainDelegateMessage message = new SideChainDelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(sideChainDelegate.getDelegatorAddress())); + message.setValidatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(sideChainDelegate.getValidatorAddress(), valHrp)); + + if (sideChainDelegate.getDelegation() != null) { + message.setDelegation(convert(sideChainDelegate.getDelegation())); + } + + message.setSideChainId(sideChainDelegate.getSideChainId()); + return message; + } + + private SideChainRedelegateMessage convert(SideChainRedelegate redelegate){ + SideChainRedelegateMessage message = new SideChainRedelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(redelegate.getDelegatorAddress())); + message.setSrcValidatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(redelegate.getSrcValidatorAddress(), valHrp)); + message.setDstValidatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(redelegate.getDstValidatorAddress(), valHrp)); + if (redelegate.getAmount() != null) { + message.setAmount(convert(redelegate.getAmount())); + } + message.setSideChainId(redelegate.getSideChainId()); + return message; + } + + private SideChainUndelegateMessage convert(SideChainUnBond unBond){ + SideChainUndelegateMessage message = new SideChainUndelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(unBond.getDelegatorAddress())); + message.setValidatorAddress(Bech32AddressValue.fromBech32StringWithNewHrp(unBond.getValidatorAddress(), valHrp)); + if (unBond.getAmount() != null) { + message.setAmount(convert(unBond.getAmount())); + } + message.setSideChainId(unBond.getSideChainId()); + return message; + } + + +} diff --git a/src/main/java/com/binance/dex/api/client/rlp/Decoder.java b/src/main/java/com/binance/dex/api/client/rlp/Decoder.java new file mode 100644 index 00000000..c21e9b4f --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/rlp/Decoder.java @@ -0,0 +1,151 @@ +package com.binance.dex.api.client.rlp; + +import com.binance.dex.api.client.crosschain.UnsignedNumber; +import com.binance.dex.api.client.encoding.EncodeUtils; +import org.ethereum.util.DecodeResult; +import org.ethereum.util.RLP; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +public class Decoder extends RLP { + + public static List decodeList(byte[] raw, Class clazz) throws Exception { + DecodeResult decodeResult = decode(raw, 0); + if (!(decodeResult.getDecoded() instanceof Object[])) { + throw new RuntimeException("not a list"); + } + Object[] objects = (Object[]) decodeResult.getDecoded(); + return decodeList(objects, clazz); + } + + private static List decodeList(Object[] objects, Class clazz) throws Exception { + List list = new ArrayList<>(); + for (Object ob : objects) { + if (ob instanceof byte[]) { + list.add((T) decodeBytes((byte[]) ob, clazz, null)); + } else if (ob instanceof Object[]) { + Object[] fieldValues = (Object[]) ob; + list.add(decodeObject(fieldValues, clazz)); + } + } + return list; + } + + public static T decodeObject(byte[] raw, Class clazz) throws Exception { + DecodeResult decodeResult = decode(raw, 0); + return decodeObject((Object[]) decodeResult.getDecoded(), clazz); + } + + + public static Object decodeBytes(byte[] value, Class type, Object superInstance) throws Exception { + if (type == Integer.class) { + + return decodeInt(value, 0); + + } else if (type == Long.class) { + + return decodeLong(value, 0); + + } else if (type == BigInteger.class) { + + return decodeBigInteger(value, 0); + + } else if (type == String.class) { + + return new String(value); + + } else if (type == byte[].class) { + + return value; + + } else if (isImplement(type, RlpDecodable.class)) { + + Method method = type.getMethod("decode", byte[].class, Object.class); + Object instance = type.newInstance(); + method.invoke(instance, value, superInstance); + return instance; + + } else { + throw new RuntimeException(String.format("unsupported type: %s ", type.getCanonicalName())); + } + } + + private static T decodeObject(Object[] fieldValues, Class clazz) throws Exception { + Field[] fields = clazz.getDeclaredFields(); + T instance = clazz.newInstance(); + if (fieldValues.length != fields.length) { + throw new RuntimeException("failed to decode, inconsistent fields numbers"); + } + for (int i = 0; i < fieldValues.length; i++) { + Object fieldValue = fieldValues[i]; + Field field = fields[i]; + + field.setAccessible(true); + if (fieldValue.equals("")) { + Class fieldType = field.getType(); + if (fieldType == Integer.class) { + field.set(instance, 0); + } else if (fieldType == Long.class) { + field.set(instance, 0L); + } else if (fieldType == UnsignedNumber.class || fieldType.getSuperclass() == UnsignedNumber.class){ + field.set(instance, fieldType.newInstance()); + } else { + throw new RuntimeException(String.format("Failed to decode %s, its type should be Integer or Long or UnsignedNumber", field.getName())); + } + } else if (fieldValue instanceof byte[]) { + Class fieldType = field.getType(); + field.set(instance, decodeBytes((byte[]) fieldValue, fieldType, instance)); + } else if (fieldValue instanceof Object[]) { + + Class fieldType = field.getType(); + if (fieldType == List.class) { + Type genericType = field.getGenericType(); + if (!(genericType instanceof ParameterizedType)) { + throw new RuntimeException(String.format("Failed to decode %s, can not decode List without generic type", field.getName())); + } + ParameterizedType pt = (ParameterizedType) genericType; + Class genericClazz = (Class) pt.getActualTypeArguments()[0]; + field.set(instance, decodeList((Object[]) fieldValue, genericClazz)); + } else { + throw new RuntimeException(String.format("Failed to decode %s, only List is supported as an array type", field.getName())); + } + } else { + throw new RuntimeException("ERROR: unrecognised type for RLP encoded bytes"); + } + } + + return instance; + } + + private static boolean isImplement(Class clazz, Class interfaceClass) { + for (Class item : clazz.getInterfaces()) { + if (item == interfaceClass) { + return true; + } + } + for (Class item : clazz.getSuperclass().getInterfaces()) { + if (item == interfaceClass) { + return true; + } + } + return false; + } + + + public static void main(String[] args) throws Exception { + byte[] bz = encodeInt(-100); + System.out.printf("result: %s\n", EncodeUtils.bytesToHex(bz)); + + byte[] bz1 = EncodeUtils.hexStringToByteArray("100000"); + + int r = decodeInt(bz1, 0); + System.out.println(r); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/rlp/RlpDecodable.java b/src/main/java/com/binance/dex/api/client/rlp/RlpDecodable.java new file mode 100644 index 00000000..dbca8776 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/rlp/RlpDecodable.java @@ -0,0 +1,7 @@ +package com.binance.dex.api.client.rlp; + +public interface RlpDecodable { + + void decode(byte[] raw, Object superInstance) throws Exception; + +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/DateUtil.java b/src/main/java/com/binance/dex/api/client/utils/converter/DateUtil.java new file mode 100644 index 00000000..781cfe75 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/DateUtil.java @@ -0,0 +1,102 @@ +package com.binance.dex.api.client.utils.converter; + +import java.text.SimpleDateFormat; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +public class DateUtil { + + private static final DateTimeFormatter utcFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneId.of("UTC")); + + public static long betweenSecs(Date date1, Date date2) { + return Duration.between(date1.toInstant(), date2.toInstant()).getSeconds(); + } + + public static long betweenDays(Date date1, Date date2) { + return date1.toInstant().until(date2.toInstant(), ChronoUnit.DAYS); + } + + public static boolean isSameDay(Date date1, Date date2) { + Calendar cal1 = Calendar.getInstance(); + Calendar cal2 = Calendar.getInstance(); + cal1.setTime(date1); + cal2.setTime(date2); + return cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR) && + cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR); + } + + public static Date toDateFromMilliseconds(Long time) { + if (null == time) { + return null; + } + return Date.from(Instant.ofEpochMilli(time)); + } + + public static Date now() { + return Date.from(Instant.now()); + } + + public static Date parseUTCMilliTime(String dateStr) { + ZonedDateTime zdt = ZonedDateTime.parse(dateStr, utcFormatter); + return Date.from(zdt.toInstant()); + } + + public static Date parseUTCTime(String dateStr) { + return Date.from(Instant.parse(dateStr)); + } + + /** + * Formats a date at any given format String, at any given Timezone String. + * + * @param date Valid Date object + * @param format String representation of the format, e.g. "yyyy-MM-dd HH:mm" + * @param timezone String representation of the time zone, e.g. "CST" + * @return The formatted date in the given time zone. + */ + public static String toString(final Date date, final String format, final String timezone) { + final TimeZone tz = TimeZone.getTimeZone(timezone); + final SimpleDateFormat formatter = new SimpleDateFormat(format); + formatter.setTimeZone(tz); + return formatter.format(date); + } + + private static LocalDateTime dateToUtcDateTime(Date date) { + return LocalDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")); + } + + private static Date utcDateTimeToDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.of("UTC")).toInstant()); + } + + public static Date getPreviousDate(Date date) { + LocalDateTime localDateTime = dateToUtcDateTime(date); + LocalDateTime previousDate = localDateTime.minusDays(1l); + return utcDateTimeToDate(previousDate); + } + + public static String toUTCDateString(final Date date) { + return toString(date, "yyyyMMdd", "UTC"); + } + + public static String toUTCDateString(long timeStamp) { + return toString(new Date(timeStamp), "yyyyMMdd", "UTC"); + } + + public static Date atStartOfDay(Date date) { + LocalDateTime localDateTime = dateToUtcDateTime(date); + LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN); + return utcDateTimeToDate(startOfDay); + } + + public static Date atEndOfDay(Date date) { + LocalDateTime localDateTime = dateToUtcDateTime(date); + LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX); + return utcDateTimeToDate(endOfDay); + } + + +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/JsonUtil.java b/src/main/java/com/binance/dex/api/client/utils/converter/JsonUtil.java new file mode 100644 index 00000000..9b9e3998 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/JsonUtil.java @@ -0,0 +1,57 @@ +package com.binance.dex.api.client.utils.converter; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.type.TypeFactory; + +import java.io.IOException; +import java.util.List; + +public class JsonUtil { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final TypeFactory typeFactory = objectMapper.getTypeFactory(); + + static { + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + + public static ObjectNode createObjectNode() { + return objectMapper.createObjectNode(); + } + + public static String toJson(Object value) { + try { + return objectMapper.writeValueAsString(value); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public static T fromJson(String jsonStr, Class tClass) { + try { + return objectMapper.readValue(jsonStr, tClass); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public static List fromJsonToList(String jsonStr, Class tClass) { + try { + return objectMapper.readValue(jsonStr, typeFactory.constructCollectionType(List.class, tClass)); + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + + public static JsonNode toJsonNode(String json) throws Exception { + return objectMapper.readTree(json); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/NumberUtil.java b/src/main/java/com/binance/dex/api/client/utils/converter/NumberUtil.java new file mode 100644 index 00000000..7d7133a1 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/NumberUtil.java @@ -0,0 +1,42 @@ +package com.binance.dex.api.client.utils.converter; + +import java.math.BigDecimal; +import java.text.DecimalFormat; + +public class NumberUtil { + + public static final Integer SHIFT_DIGITS = 8; + + public static BigDecimal longToBigDecimal(Long value) { + return longToBigDecimal(value, SHIFT_DIGITS); + } + + public static String longToBigDecimalString(Long value) { + return decimalFormat(longToBigDecimal(value, SHIFT_DIGITS)); + } + + public static BigDecimal longToBigDecimal(Long value, Integer shiftDigits) { + if (null == value) { + return null; + } + return BigDecimal.valueOf(value).movePointLeft(shiftDigits); + } + + public static Long bigDecimalToLong(BigDecimal value) { + return bigDecimalToLong(value, SHIFT_DIGITS); + } + + private static Long bigDecimalToLong(BigDecimal value, Integer precision) { + if (null == value) { + return null; + } + return value.multiply(BigDecimal.TEN.pow(precision)).longValue(); + } + + public static String decimalFormat(BigDecimal value) { + if (value == null) { + return null; + } + return new DecimalFormat("0.00000000").format(value); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/Token.java b/src/main/java/com/binance/dex/api/client/utils/converter/Token.java new file mode 100644 index 00000000..144f0f3c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/Token.java @@ -0,0 +1,67 @@ +package com.binance.dex.api.client.utils.converter; + +import com.binance.dex.api.client.BinanceDexConstants; +import com.binance.dex.api.proto.Send; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.Builder; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@Data +@Builder +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder(alphabetic = true) +public class Token { + @JsonProperty(value = "denom") + private String denom; + @JsonProperty(value = "amount") + private Long amount; + + public static com.binance.dex.api.client.encoding.message.Token of(com.binance.dex.api.proto.Token source) { + com.binance.dex.api.client.encoding.message.Token token = new com.binance.dex.api.client.encoding.message.Token(); + token.setDenom(source.getDenom()); + token.setAmount(source.getAmount()); + return token; + } + + public static com.binance.dex.api.client.encoding.message.Token of(Send.Token sendToken) { + com.binance.dex.api.client.encoding.message.Token token = new com.binance.dex.api.client.encoding.message.Token(); + token.setDenom(sendToken.getDenom()); + token.setAmount(sendToken.getAmount()); + return token; + } + + public Token() { + } + + public Token(String denom, Long amount) { + this.denom = denom; + this.amount = amount; + } + + public String getDenom() { + return denom; + } + + public void setDenom(String denom) { + this.denom = denom; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + @Override + public String toString() { + return new ToStringBuilder(this, BinanceDexConstants.BINANCE_DEX_TO_STRING_STYLE) + .append("denom", denom) + .append("amount", amount) + .toString(); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/TransactionConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/TransactionConverter.java new file mode 100644 index 00000000..37aa3a32 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/TransactionConverter.java @@ -0,0 +1,27 @@ +package com.binance.dex.api.client.utils.converter; + + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; + +import java.util.Map; + + +public abstract class TransactionConverter { + + // construct tx data information based on different tx types + public abstract void doConvert(TransactionV2 transactionV2, Transaction transaction); + + public abstract com.binance.dex.api.client.domain.broadcast.TxType getType(); + + protected Token getToken(Map map, String key) { + Map m = (Map) map.get(key); + String denom = m.get("denom").toString(); + Long amount = ((Number) m.get("amount")).longValue(); + Token token = new Token(); + token.setDenom(denom); + token.setAmount(amount); + return token; + } + +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/TransactionConverterFactory.java b/src/main/java/com/binance/dex/api/client/utils/converter/TransactionConverterFactory.java new file mode 100644 index 00000000..a188b7a0 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/TransactionConverterFactory.java @@ -0,0 +1,208 @@ +package com.binance.dex.api.client.utils.converter; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionPage; +import com.binance.dex.api.client.domain.TransactionPageV2; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.utils.converter.impl.*; +import com.google.common.collect.Maps; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Map; + + +public class TransactionConverterFactory { + + private static Map converterMap = Maps.newHashMap(); + + static { + FBscSubmitEvidenceConverter bscSubmitEvidenceConverter = new FBscSubmitEvidenceConverter(); + converterMap.put(bscSubmitEvidenceConverter.getType(), bscSubmitEvidenceConverter); + + FBurnConverter burnConverter = new FBurnConverter(); + converterMap.put(burnConverter.getType(), burnConverter); + + FCancelOrderConverter cancelOrderConverter = new FCancelOrderConverter(); + converterMap.put(cancelOrderConverter.getType(), cancelOrderConverter); + + FClaimHtlConverter claimHtlConverter = new FClaimHtlConverter(); + converterMap.put(claimHtlConverter.getType(), claimHtlConverter); + + FCreateSideChainValidatorConverter createSideChainValidatorConverter = new FCreateSideChainValidatorConverter(); + converterMap.put(createSideChainValidatorConverter.getType(), createSideChainValidatorConverter); + + FCreateValidatorConverter createValidatorConverter = new FCreateValidatorConverter(); + converterMap.put(createValidatorConverter.getType(), createValidatorConverter); + + FCrossBindConverter crossBindConverter = new FCrossBindConverter(); + converterMap.put(crossBindConverter.getType(), crossBindConverter); + + FCrossTransferOutConverter crossTransferOutConverter = new FCrossTransferOutConverter(); + converterMap.put(crossTransferOutConverter.getType(), crossTransferOutConverter); + + FCrossUnBindConverter crossUnBindConverter = new FCrossUnBindConverter(); + converterMap.put(crossUnBindConverter.getType(), crossUnBindConverter); + + FDepositConverter depositConverter = new FDepositConverter(); + converterMap.put(depositConverter.getType(), depositConverter); + + FDepositHtlConverter depositHtlConverter = new FDepositHtlConverter(); + converterMap.put(depositHtlConverter.getType(), depositHtlConverter); + + FEditSideChainValidatorConverter editSideChainValidatorConverter = new FEditSideChainValidatorConverter(); + converterMap.put(editSideChainValidatorConverter.getType(), editSideChainValidatorConverter); + + FFreezeConverter freezeConverter = new FFreezeConverter(); + converterMap.put(freezeConverter.getType(), freezeConverter); + + FHtlTransferConverter htlTransferConverter = new FHtlTransferConverter(); + converterMap.put(htlTransferConverter.getType(), htlTransferConverter); + + FIssueTokenConverter issueTokenConverter = new FIssueTokenConverter(); + converterMap.put(issueTokenConverter.getType(), issueTokenConverter); + + FListingConverter listingConverter = new FListingConverter(); + converterMap.put(listingConverter.getType(), listingConverter); + + FMiniTokenIssueConverter miniTokenIssueConverter = new FMiniTokenIssueConverter(); + converterMap.put(miniTokenIssueConverter.getType(), miniTokenIssueConverter); + + FMiniTokenListingConverter miniTokenListingConverter = new FMiniTokenListingConverter(); + converterMap.put(miniTokenListingConverter.getType(), miniTokenListingConverter); + + FMiniTokenSetURIConverter miniTokenSetURIConverter = new FMiniTokenSetURIConverter(); + converterMap.put(miniTokenSetURIConverter.getType(), miniTokenSetURIConverter); + + FMintConverter mintConverter = new FMintConverter(); + converterMap.put(mintConverter.getType(), mintConverter); + + FNewOrderConverter newOrderConverter = new FNewOrderConverter(); + converterMap.put(newOrderConverter.getType(), newOrderConverter); + + FOracleClaimConverter oracleClaimConverter = new FOracleClaimConverter(); + converterMap.put(oracleClaimConverter.getType(), oracleClaimConverter); + + FProposalConverter proposalConverter = new FProposalConverter(); + converterMap.put(proposalConverter.getType(), proposalConverter); + + FRefundHtlConverter refundHtlConverter = new FRefundHtlConverter(); + converterMap.put(refundHtlConverter.getType(), refundHtlConverter); + + FRemoveValidatorConverter removeValidatorConverter = new FRemoveValidatorConverter(); + converterMap.put(removeValidatorConverter.getType(), removeValidatorConverter); + + FSetAccountFlagsConverter setAccountFlagsConverter = new FSetAccountFlagsConverter(); + converterMap.put(setAccountFlagsConverter.getType(), setAccountFlagsConverter); + + FSideChainDelegateConverter sideChainDelegateConverter = new FSideChainDelegateConverter(); + converterMap.put(sideChainDelegateConverter.getType(), sideChainDelegateConverter); + + FSideChainRedelegateConverter sideChainRedelegateConverter = new FSideChainRedelegateConverter(); + converterMap.put(sideChainRedelegateConverter.getType(), sideChainRedelegateConverter); + + FSideChainUnJailConverter sideChainUnJailConverter = new FSideChainUnJailConverter(); + converterMap.put(sideChainUnJailConverter.getType(), sideChainUnJailConverter); + + FSideChainUndelegateConverter sideChainUndelegateConverter = new FSideChainUndelegateConverter(); + converterMap.put(sideChainUndelegateConverter.getType(), sideChainUndelegateConverter); + + FSideDepositConverter sideDepositConverter = new FSideDepositConverter(); + converterMap.put(sideDepositConverter.getType(), sideDepositConverter); + + FSideProposalConverter sideProposalConverter = new FSideProposalConverter(); + converterMap.put(sideProposalConverter.getType(), sideProposalConverter); + + FSideVoteConverter sideVoteConverter = new FSideVoteConverter(); + converterMap.put(sideVoteConverter.getType(), sideVoteConverter); + + FTimeLockConverter timeLockConverter = new FTimeLockConverter(); + converterMap.put(timeLockConverter.getType(), timeLockConverter); + + FTimeReLockConverter timeReLockConverter = new FTimeReLockConverter(); + converterMap.put(timeReLockConverter.getType(), timeReLockConverter); + + FTimeUnlockConverter timeUnlockConverter = new FTimeUnlockConverter(); + converterMap.put(timeUnlockConverter.getType(), timeUnlockConverter); + + FTinyTokenIssueConverter tinyTokenIssueConverter = new FTinyTokenIssueConverter(); + converterMap.put(tinyTokenIssueConverter.getType(), tinyTokenIssueConverter); + + FTransferConverter transferConverter = new FTransferConverter(); + converterMap.put(transferConverter.getType(), transferConverter); + + FTransferOwnershipConverter transferOwnershipConverter = new FTransferOwnershipConverter(); + converterMap.put(transferOwnershipConverter.getType(), transferOwnershipConverter); + + FUnfreezeConverter unfreezeConverter = new FUnfreezeConverter(); + converterMap.put(unfreezeConverter.getType(), unfreezeConverter); + + FCreateBeaconChainValidatorConverter createValConverter = new FCreateBeaconChainValidatorConverter(); + converterMap.put(createValConverter.getType(), createValConverter); + + FEditBeaconChainValidatorConverter editValConverter = new FEditBeaconChainValidatorConverter(); + converterMap.put(editValConverter.getType(), editValConverter); + + FBeaconChainDelegateConverter delegateConverter = new FBeaconChainDelegateConverter(); + converterMap.put(delegateConverter.getType(), delegateConverter); + + FBeaconChainRedelegateConverter redelegateConverter = new FBeaconChainRedelegateConverter(); + converterMap.put(redelegateConverter.getType(), redelegateConverter); + + FBeaconChainUndelegateConverter undelegateConverter = new FBeaconChainUndelegateConverter(); + converterMap.put(undelegateConverter.getType(), undelegateConverter); + + FVoteConverter voteConverter = new FVoteConverter(); + converterMap.put(voteConverter.getType(), voteConverter); + } + + public static T getConverter(com.binance.dex.api.client.domain.broadcast.TxType txType) { + if (converterMap.containsKey(txType)) { + return (T) converterMap.get(txType); + } + return null; + } + + + public Transaction convert(TransactionV2 transactionV2) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + if (transactionV2 == null) { + return null; + } + Transaction transaction = new Transaction(); + transaction.setBlockHeight(transactionV2.getBlockHeight()); + transaction.setTxHash(transactionV2.getHash()); + transaction.setTxType(transactionV2.getType()); + transaction.setTimeStamp(formatter.format(new Date(transactionV2.getBlockTime()))); + transaction.setConfirmBlocks(0L); + + transaction.setCode(transactionV2.getCode()); + transaction.setMemo(transactionV2.getMemo()); + + transaction.setTxAsset(transactionV2.getAsset()); + transaction.setFromAddr(transactionV2.getFromAddr()); + transaction.setData(transactionV2.getData()); + + transaction.setTxAge(DateUtil.betweenSecs(new Date(transactionV2.getBlockTime()), DateUtil.now())); + + transaction.setTxFee(NumberUtil.longToBigDecimalString(transactionV2.getFee())); + + TransactionConverter converter = getConverter(TxType.getTypeByName(transactionV2.getType())); + converter.doConvert(transactionV2, transaction); + + return transaction; + } + + public TransactionPage convert(TransactionPageV2 transactionPageV2) { + TransactionPage transactionPage = new TransactionPage(); + if (transactionPageV2 != null) { + transactionPage.setTotal(transactionPageV2.getTotal()); + transactionPage.setTx(new ArrayList<>()); + transactionPageV2.getTxs().stream().forEach(tx -> { + transactionPage.getTx().add(convert(tx)); + }); + } + return transactionPage; + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/TxType.java b/src/main/java/com/binance/dex/api/client/utils/converter/TxType.java new file mode 100644 index 00000000..ab88a909 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/TxType.java @@ -0,0 +1,78 @@ +package com.binance.dex.api.client.utils.converter; + +import java.util.HashMap; +import java.util.Map; + +public enum TxType { + NEW_ORDER(com.binance.dex.api.client.domain.broadcast.TxType.NEW_ORDER), + ISSUE_TOKEN(com.binance.dex.api.client.domain.broadcast.TxType.ISSUE), + BURN_TOKEN(com.binance.dex.api.client.domain.broadcast.TxType.BURN), + LIST_TOKEN(com.binance.dex.api.client.domain.broadcast.TxType.LISTING), + CANCEL_ORDER(com.binance.dex.api.client.domain.broadcast.TxType.CANCEL_ORDER), + FREEZE_TOKEN(com.binance.dex.api.client.domain.broadcast.TxType.FREEZE_TOKEN), + UN_FREEZE_TOKEN(com.binance.dex.api.client.domain.broadcast.TxType.UNFREEZE_TOKEN), + TRANSFER(com.binance.dex.api.client.domain.broadcast.TxType.TRANSFER), + PROPOSAL(com.binance.dex.api.client.domain.broadcast.TxType.SUBMIT_PROPOSAL), + SIDE_PROPOSAL(com.binance.dex.api.client.domain.broadcast.TxType.SIDE_SUBMIT_PROPOSAL), + VOTE(com.binance.dex.api.client.domain.broadcast.TxType.VOTE), + SIDE_VOTE(com.binance.dex.api.client.domain.broadcast.TxType.SIDE_VOTE), + DEPOSIT(com.binance.dex.api.client.domain.broadcast.TxType.DEPOSIT), + SIDE_DEPOSIT(com.binance.dex.api.client.domain.broadcast.TxType.SIDE_DEPOSIT), + MINT(com.binance.dex.api.client.domain.broadcast.TxType.MINT), + CREATE_VALIDATOR(com.binance.dex.api.client.domain.broadcast.TxType.CREATE_VALIDATOR), + REMOVE_VALIDATOR(com.binance.dex.api.client.domain.broadcast.TxType.REMOVE_VALIDATOR), + TIME_LOCK(com.binance.dex.api.client.domain.broadcast.TxType.TimeLock), + TIME_UNLOCK(com.binance.dex.api.client.domain.broadcast.TxType.TimeUnlock), + TIME_RELOCK(com.binance.dex.api.client.domain.broadcast.TxType.TimeRelock), + SET_ACCOUNT_FLAG(com.binance.dex.api.client.domain.broadcast.TxType.SetAccountFlag), + HTL_TRANSFER(com.binance.dex.api.client.domain.broadcast.TxType.HTL_TRANSFER), + DEPOSIT_HTL(com.binance.dex.api.client.domain.broadcast.TxType.DEPOSIT_HTL), + CLAIM_HTL(com.binance.dex.api.client.domain.broadcast.TxType.CLAIM_HTL), + REFUND_HTL(com.binance.dex.api.client.domain.broadcast.TxType.REFUND_HTL), + CREATE_SIDECHAIN_VALIDATOR(com.binance.dex.api.client.domain.broadcast.TxType.CREATE_SIDECHAIN_VALIDATOR), + EDIT_SIDECHAIN_VALIDATOR(com.binance.dex.api.client.domain.broadcast.TxType.EDIT_SIDECHAIN_VALIDATOR), + SIDECHAIN_DELEGATE(com.binance.dex.api.client.domain.broadcast.TxType.SIDECHAIN_DELEGATE), + SIDECHAIN_REDELEGATE(com.binance.dex.api.client.domain.broadcast.TxType.SIDECHAIN_REDELEGATE), + SIDECHAIN_UNDELEGATE(com.binance.dex.api.client.domain.broadcast.TxType.SIDECHAIN_UNBOND), + ORACLE_CLAIM(com.binance.dex.api.client.domain.broadcast.TxType.CLAIM), + CROSS_TRANSFER_OUT(com.binance.dex.api.client.domain.broadcast.TxType.TRANSFER_OUT), + CROSS_BIND(com.binance.dex.api.client.domain.broadcast.TxType.BIND), + CROSS_UNBIND(com.binance.dex.api.client.domain.broadcast.TxType.UNBIND), + BSC_SUBMIT_EVIDENCE(com.binance.dex.api.client.domain.broadcast.TxType.BSC_SUBMIT_EVIDENCE), + SIDECHAIN_UNJAIL(com.binance.dex.api.client.domain.broadcast.TxType.SIDECHAIN_UNJAIL), + TRANSFER_TOKEN_OWNERSHIP(com.binance.dex.api.client.domain.broadcast.TxType.TRANSFER_TOKEN_OWNERSHIP), + TINY_TOKEN_ISSUE(com.binance.dex.api.client.domain.broadcast.TxType.TINY_TOKEN_ISSUE), + MINI_TOKEN_ISSUE(com.binance.dex.api.client.domain.broadcast.TxType.MINI_TOKEN_ISSUE), + MINI_TOKEN_LIST(com.binance.dex.api.client.domain.broadcast.TxType.MINI_TOKEN_LIST), + MINI_TOKEN_SET_URI(com.binance.dex.api.client.domain.broadcast.TxType.MINI_TOKEN_SET_URI), + CREATE_BEACONCHAIN_VALIDATOR(com.binance.dex.api.client.domain.broadcast.TxType.CREATE_BEACONCHAIN_VALIDATOR), + EDIT_BEACONCHAIN_VALIDATOR(com.binance.dex.api.client.domain.broadcast.TxType.EDIT_BEACONCHAIN_VALIDATOR), + BEACONCHAIN_DELEGATE(com.binance.dex.api.client.domain.broadcast.TxType.BEACONCHAIN_DELEGATE), + BEACONCHAIN_REDELEGATE(com.binance.dex.api.client.domain.broadcast.TxType.BEACONCHAIN_REDELEGATE), + BEACONCHAIN_UNDELEGATE(com.binance.dex.api.client.domain.broadcast.TxType.BEACONCHAIN_UNDELEGATE), + UNJAIL(com.binance.dex.api.client.domain.broadcast.TxType.UNJAIL), + CREATE_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR(com.binance.dex.api.client.domain.broadcast.TxType.CREATE_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR), + EDIT_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR(com.binance.dex.api.client.domain.broadcast.TxType.EDIT_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR), + SIDECHAIN_STAKE_MIGRATION(com.binance.dex.api.client.domain.broadcast.TxType.SIDECHAIN_STAKE_MIGRATION); + + private com.binance.dex.api.client.domain.broadcast.TxType code; + + TxType(com.binance.dex.api.client.domain.broadcast.TxType code) { + this.code = code; + } + + private static final Map nameTypeMap = new HashMap<>(); + + static { + for (TxType txType : TxType.values()) { + nameTypeMap.put(txType.name().toUpperCase(), txType.code); + } + } + + public static com.binance.dex.api.client.domain.broadcast.TxType getTypeByName(String name) { + if (name == null) { + return null; + } + return nameTypeMap.get(name.toUpperCase()); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainDelegateConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainDelegateConverter.java new file mode 100644 index 00000000..6fa25f8f --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainDelegateConverter.java @@ -0,0 +1,39 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.beaconchain.BeaconChainDelegate; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.Token; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FBeaconChainDelegateConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.BEACONCHAIN_DELEGATE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + if (transaction.getValue() == null || transaction.getTxAsset() == null) { + Token token = getToken(map, "amount"); + transaction.setTxAsset(token.getDenom()); + transaction.setValue(NumberUtil.longToBigDecimalString(token.getAmount())); + } + + map.put("delegatorAddress", map.get("delegatorAddr")); + map.put("validatorAddress", map.get("validatorAddr")); + map.remove("delegatorAddr"); + map.remove("validatorAddr"); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainRedelegateConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainRedelegateConverter.java new file mode 100644 index 00000000..19441d05 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainRedelegateConverter.java @@ -0,0 +1,32 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.beaconchain.BeaconChainRedelegate; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.Token; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + +public class FBeaconChainRedelegateConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.BEACONCHAIN_REDELEGATE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + if (transaction.getValue() == null || transaction.getTxAsset() == null) { + Token token = getToken(map, "amount"); + transaction.setTxAsset(token.getDenom()); + transaction.setValue(NumberUtil.longToBigDecimalString(token.getAmount())); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainUndelegateConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainUndelegateConverter.java new file mode 100644 index 00000000..79b49b47 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBeaconChainUndelegateConverter.java @@ -0,0 +1,39 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.beaconchain.BeaconChainUndelegate; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.Token; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FBeaconChainUndelegateConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.BEACONCHAIN_UNDELEGATE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + if (transaction.getValue() == null || transaction.getTxAsset() == null) { + Token token = getToken(map, "amount"); + transaction.setTxAsset(token.getDenom()); + transaction.setValue(NumberUtil.longToBigDecimalString(token.getAmount())); + } + + map.put("delegatorAddress", map.get("delegatorAddr")); + map.put("validatorAddress", map.get("validatorAddr")); + map.remove("delegatorAddr"); + map.remove("validatorAddr"); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBscSubmitEvidenceConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBscSubmitEvidenceConverter.java new file mode 100644 index 00000000..386f4e68 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBscSubmitEvidenceConverter.java @@ -0,0 +1,27 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.slash.BscSubmitEvidence; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FBscSubmitEvidenceConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.BSC_SUBMIT_EVIDENCE; + } + + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + map.put("submitter", transactionV2.getFromAddr()); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBurnConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBurnConverter.java new file mode 100644 index 00000000..8a459009 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FBurnConverter.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.Burn; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FBurnConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.BURN; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCancelOrderConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCancelOrderConverter.java new file mode 100644 index 00000000..24181720 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCancelOrderConverter.java @@ -0,0 +1,39 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.CancelOrder; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; +import lombok.Builder; +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + + +public class FCancelOrderConverter extends TransactionConverter { + + public TxType getType() { + return TxType.CANCEL_ORDER; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + String symbol = (String) map.get("symbol"); + String orderId = (String) map.get("orderId"); + + Map newMap = new HashMap<>(); + newMap.put("orderData", CO.builder().symbol(symbol).orderId(orderId).build()); + transaction.setData(JsonUtil.toJson(newMap)); + } +} + +@Data +@Builder +class CO { + String symbol; + String orderId; +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FClaimHtlConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FClaimHtlConverter.java new file mode 100644 index 00000000..d0efbd76 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FClaimHtlConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.ClaimHashTimerLock; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FClaimHtlConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.CLAIM_HTL; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateBeaconChainValidatorConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateBeaconChainValidatorConverter.java new file mode 100644 index 00000000..2d67d231 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateBeaconChainValidatorConverter.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.beaconchain.CreateBeaconChainValidator; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FCreateBeaconChainValidatorConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.CREATE_BEACONCHAIN_VALIDATOR; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateSideChainValidatorConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateSideChainValidatorConverter.java new file mode 100644 index 00000000..b77a5fea --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateSideChainValidatorConverter.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.sidechain.CreateSideChainValidator; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FCreateSideChainValidatorConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.CREATE_SIDECHAIN_VALIDATOR; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateSideChainValidatorWithVoteAddrConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateSideChainValidatorWithVoteAddrConverter.java new file mode 100644 index 00000000..666e0e13 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateSideChainValidatorWithVoteAddrConverter.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.sidechain.CreateSideChainValidator; +import com.binance.dex.api.client.domain.stake.sidechain.CreateSideChainValidatorWithVoteAddr; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FCreateSideChainValidatorWithVoteAddrConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.CREATE_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateValidatorConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateValidatorConverter.java new file mode 100644 index 00000000..298ec37b --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCreateValidatorConverter.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.CreateValidator; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FCreateValidatorConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.CREATE_VALIDATOR; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + transaction.setData(transactionV2.getData()); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossBindConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossBindConverter.java new file mode 100644 index 00000000..f8ebaf6e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossBindConverter.java @@ -0,0 +1,33 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.bridge.Bind; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FCrossBindConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.BIND; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + map.put("symbol", transactionV2.getAsset()); + map.put("from", transactionV2.getFromAddr()); + map.put("amount", transactionV2.getAmount()); + + transaction.setData(JsonUtil.toJson(map)); + + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossTransferOutConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossTransferOutConverter.java new file mode 100644 index 00000000..6f407196 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossTransferOutConverter.java @@ -0,0 +1,36 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.bridge.TransferOut; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.Token; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FCrossTransferOutConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.TRANSFER_OUT; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + map.put("from", transactionV2.getFromAddr()); + map.put("toAddress", transactionV2.getToAddr()); + + Token amount = Token.builder().denom(transactionV2.getAsset()).amount(transactionV2.getAmount()).build(); + map.put("amount", amount); + + transaction.setData(JsonUtil.toJson(map)); + } + +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossUnBindConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossUnBindConverter.java new file mode 100644 index 00000000..05801848 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FCrossUnBindConverter.java @@ -0,0 +1,28 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.bridge.Unbind; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.HashMap; +import java.util.Map; + + +public class FCrossUnBindConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.UNBIND; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map newMap = new HashMap<>(); + newMap.put("symbol", transactionV2.getAsset()); + newMap.put("from", transactionV2.getFromAddr()); + transaction.setData(JsonUtil.toJson(newMap)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FDepositConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FDepositConverter.java new file mode 100644 index 00000000..95ea7edc --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FDepositConverter.java @@ -0,0 +1,24 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.Deposit; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FDepositConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.DEPOSIT; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FDepositHtlConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FDepositHtlConverter.java new file mode 100644 index 00000000..46d1c480 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FDepositHtlConverter.java @@ -0,0 +1,24 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.DepositHashTimerLock; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FDepositHtlConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.DEPOSIT_HTL; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditBeaconChainValidatorConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditBeaconChainValidatorConverter.java new file mode 100644 index 00000000..8be17a08 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditBeaconChainValidatorConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.beaconchain.EditBeaconChainValidator; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FEditBeaconChainValidatorConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.EDIT_BEACONCHAIN_VALIDATOR; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + return; + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditSideChainValidatorConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditSideChainValidatorConverter.java new file mode 100644 index 00000000..8ea937ee --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditSideChainValidatorConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.sidechain.EditSideChainValidator; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FEditSideChainValidatorConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.EDIT_SIDECHAIN_VALIDATOR; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + return; + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditSideChainValidatorWithVoteAddrConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditSideChainValidatorWithVoteAddrConverter.java new file mode 100644 index 00000000..33e00996 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FEditSideChainValidatorWithVoteAddrConverter.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.sidechain.EditSideChainValidator; +import com.binance.dex.api.client.domain.stake.sidechain.EditSideChainValidatorWithVoteAddr; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FEditSideChainValidatorWithVoteAddrConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.EDIT_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + return; + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FFreezeConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FFreezeConverter.java new file mode 100644 index 00000000..0bd777be --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FFreezeConverter.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TokenFreeze; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FFreezeConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.FREEZE_TOKEN; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FHtlTransferConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FHtlTransferConverter.java new file mode 100644 index 00000000..cc8554a2 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FHtlTransferConverter.java @@ -0,0 +1,31 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.HashTimerLockTransfer; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FHtlTransferConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.HTL_TRANSFER; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + transaction.setToAddr(transactionV2.getToAddr()); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + map.put("from", transactionV2.getFromAddr()); + map.put("to", transactionV2.getToAddr()); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FIssueTokenConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FIssueTokenConverter.java new file mode 100644 index 00000000..34636cf4 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FIssueTokenConverter.java @@ -0,0 +1,28 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.Issue; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FIssueTokenConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.ISSUE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + Long totalSupply = Long.valueOf(map.get("totalSupply").toString()); + transaction.setValue(NumberUtil.longToBigDecimalString(totalSupply)); + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FListingConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FListingConverter.java new file mode 100644 index 00000000..e0472eb3 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FListingConverter.java @@ -0,0 +1,31 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.Listing; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + +public class FListingConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.LISTING; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + Long initPrice = ((Number) map.get("initPrice")).longValue(); + transaction.setValue(NumberUtil.longToBigDecimalString(initPrice)); + + String asset = (String) map.get("baseAsset"); + transaction.setTxAsset(asset); + + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenIssueConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenIssueConverter.java new file mode 100644 index 00000000..0616b768 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenIssueConverter.java @@ -0,0 +1,29 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.MiniTokenIssue; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FMiniTokenIssueConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.MINI_TOKEN_ISSUE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + Long totalSupply = Long.valueOf(map.get("totalSupply").toString()); + transaction.setValue(NumberUtil.longToBigDecimalString(totalSupply)); + + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenListingConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenListingConverter.java new file mode 100644 index 00000000..478764b1 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenListingConverter.java @@ -0,0 +1,32 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.MiniTokenListing; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FMiniTokenListingConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.MINI_TOKEN_LIST; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + Long initPrice = ((Number) map.get("initPrice")).longValue(); + transaction.setValue(NumberUtil.longToBigDecimalString(initPrice)); + + String asset = (String) map.get("baseAsset"); + transaction.setTxAsset(asset); + + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenSetURIConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenSetURIConverter.java new file mode 100644 index 00000000..0c0d8f45 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMiniTokenSetURIConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.MiniTokenSetURI; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FMiniTokenSetURIConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.MINI_TOKEN_SET_URI; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMintConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMintConverter.java new file mode 100644 index 00000000..5ac611e7 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FMintConverter.java @@ -0,0 +1,24 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.Mint; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FMintConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.MINT; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + transaction.setData(null); + } +} + diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FNewOrderConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FNewOrderConverter.java new file mode 100644 index 00000000..276a438d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FNewOrderConverter.java @@ -0,0 +1,61 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.NewOrder; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + + +public class FNewOrderConverter extends TransactionConverter { + + public TxType getType() { + return TxType.NEW_ORDER; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + String symbol = (String) map.get("symbol"); + String orderId = (String) map.get("orderId"); + String orderType = (String) map.get("orderType"); + String side = (String) map.get("side"); + String timeInForce = (String) map.get("timeInForce"); + String price = (String) map.get("price"); + String quantity = (String) map.get("quantity"); + + transaction.setOrderId(orderId); + transaction.setTxAsset(symbol.split("_")[0]); + + Map newMap = new HashMap<>(); + newMap.put("orderData", NO.builder().symbol(symbol).orderId(orderId) + .orderType(orderType).side(side).timeInForce(timeInForce) + .price(NumberUtil.longToBigDecimal(Long.parseLong(price)).stripTrailingZeros().toPlainString()) + .quantity(NumberUtil.longToBigDecimal(Long.parseLong(quantity)).stripTrailingZeros().toPlainString()) + .build()); + transaction.setData(JsonUtil.toJson(newMap)); + + BigDecimal value = NumberUtil.longToBigDecimal(Long.parseLong(price)).multiply(NumberUtil.longToBigDecimal(Long.parseLong(quantity)).setScale(8, BigDecimal.ROUND_HALF_UP)); + transaction.setValue(NumberUtil.decimalFormat(value)); + } +} + +@Data +@Builder +class NO { + String symbol; + String orderId; + String orderType; + String side; + String price; + String quantity; + String timeInForce; +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FOracleClaimConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FOracleClaimConverter.java new file mode 100644 index 00000000..210000f5 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FOracleClaimConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.oracle.ClaimMsg; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FOracleClaimConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.CLAIM; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setData(transactionV2.getData()); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FProposalConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FProposalConverter.java new file mode 100644 index 00000000..9e77a65e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FProposalConverter.java @@ -0,0 +1,33 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.SubmitProposal; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FProposalConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SUBMIT_PROPOSAL; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + + map.remove("proposalId"); + map.remove("baseAssetSymbol"); + map.remove("quoteAssetSymbol"); + transaction.setData(JsonUtil.toJson(map)); + + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FRefundHtlConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FRefundHtlConverter.java new file mode 100644 index 00000000..9470fb0c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FRefundHtlConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.RefundHashTimerLock; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FRefundHtlConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.REFUND_HTL; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FRemoveValidatorConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FRemoveValidatorConverter.java new file mode 100644 index 00000000..04548ca3 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FRemoveValidatorConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.RemoveValidator; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FRemoveValidatorConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.REMOVE_VALIDATOR; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSetAccountFlagsConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSetAccountFlagsConverter.java new file mode 100644 index 00000000..83f22e9e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSetAccountFlagsConverter.java @@ -0,0 +1,31 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.SetAccountFlag; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.HashMap; +import java.util.Map; + + +public class FSetAccountFlagsConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SetAccountFlag; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + Long flags = ((Number) map.get("flags")).longValue(); + + Map newMap = new HashMap<>(); + newMap.put("fromAddr", transactionV2.getFromAddr()); + newMap.put("flags", flags); + transaction.setData(JsonUtil.toJson(newMap)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainDelegateConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainDelegateConverter.java new file mode 100644 index 00000000..2ecbb4b8 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainDelegateConverter.java @@ -0,0 +1,39 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.sidechain.SideChainDelegate; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.Token; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FSideChainDelegateConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SIDECHAIN_DELEGATE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + if (transaction.getValue() == null || transaction.getTxAsset() == null) { + Token token = getToken(map, "amount"); + transaction.setTxAsset(token.getDenom()); + transaction.setValue(NumberUtil.longToBigDecimalString(token.getAmount())); + } + + map.put("delegatorAddress", map.get("delegatorAddr")); + map.put("validatorAddress", map.get("validatorAddr")); + map.remove("delegatorAddr"); + map.remove("validatorAddr"); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainRedelegateConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainRedelegateConverter.java new file mode 100644 index 00000000..1f193ae7 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainRedelegateConverter.java @@ -0,0 +1,32 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.sidechain.SideChainRedelegate; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.Token; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + +public class FSideChainRedelegateConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SIDECHAIN_REDELEGATE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + if (transaction.getValue() == null || transaction.getTxAsset() == null) { + Token token = getToken(map, "amount"); + transaction.setTxAsset(token.getDenom()); + transaction.setValue(NumberUtil.longToBigDecimalString(token.getAmount())); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainStakeMigrationConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainStakeMigrationConverter.java new file mode 100644 index 00000000..733bfb02 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainStakeMigrationConverter.java @@ -0,0 +1,33 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.sidechain.SideChainRedelegate; +import com.binance.dex.api.client.domain.stake.sidechain.SideChainStakeMigration; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.Token; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + +public class FSideChainStakeMigrationConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SIDECHAIN_STAKE_MIGRATION; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + if (transaction.getValue() == null || transaction.getTxAsset() == null) { + Token token = getToken(map, "amount"); + transaction.setTxAsset(token.getDenom()); + transaction.setValue(NumberUtil.longToBigDecimalString(token.getAmount())); + } + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainUnJailConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainUnJailConverter.java new file mode 100644 index 00000000..5f90e12d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainUnJailConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.slash.SideChainUnJail; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FSideChainUnJailConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SIDECHAIN_UNJAIL; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + return; + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainUndelegateConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainUndelegateConverter.java new file mode 100644 index 00000000..9c8b0092 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideChainUndelegateConverter.java @@ -0,0 +1,39 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.stake.sidechain.SideChainUnBond; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.Token; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FSideChainUndelegateConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SIDECHAIN_UNBOND; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + if (transaction.getValue() == null || transaction.getTxAsset() == null) { + Token token = getToken(map, "amount"); + transaction.setTxAsset(token.getDenom()); + transaction.setValue(NumberUtil.longToBigDecimalString(token.getAmount())); + } + + map.put("delegatorAddress", map.get("delegatorAddr")); + map.put("validatorAddress", map.get("validatorAddr")); + map.remove("delegatorAddr"); + map.remove("validatorAddr"); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideDepositConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideDepositConverter.java new file mode 100644 index 00000000..908d2c6a --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideDepositConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.SideDeposit; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +public class FSideDepositConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SIDE_DEPOSIT; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + } +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideProposalConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideProposalConverter.java new file mode 100644 index 00000000..a7154717 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideProposalConverter.java @@ -0,0 +1,32 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.SideSubmitProposal; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FSideProposalConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SIDE_SUBMIT_PROPOSAL; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + + map.remove("proposalId"); + map.remove("baseAssetSymbol"); + map.remove("quoteAssetSymbol"); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideVoteConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideVoteConverter.java new file mode 100644 index 00000000..7161fa44 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FSideVoteConverter.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.SideVote; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.TransactionConverter; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +public class FSideVoteConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.SIDE_VOTE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + return; + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeLockConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeLockConverter.java new file mode 100644 index 00000000..0335615f --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeLockConverter.java @@ -0,0 +1,30 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TimeLock; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FTimeLockConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.TimeLock; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + + map.remove("amount"); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeReLockConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeReLockConverter.java new file mode 100644 index 00000000..8476fc02 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeReLockConverter.java @@ -0,0 +1,30 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TimeRelock; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FTimeReLockConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.TimeRelock; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + + map.remove("amount"); + transaction.setData(JsonUtil.toJson(map)); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeUnlockConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeUnlockConverter.java new file mode 100644 index 00000000..3734fffd --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTimeUnlockConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TimeUnlock; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FTimeUnlockConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.TimeUnlock; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + return; + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTinyTokenIssueConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTinyTokenIssueConverter.java new file mode 100644 index 00000000..adc26909 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTinyTokenIssueConverter.java @@ -0,0 +1,29 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TinyTokenIssue; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.Map; + + +public class FTinyTokenIssueConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.TINY_TOKEN_ISSUE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = JsonUtil.fromJson(transactionV2.getData(), Map.class); + Long totalSupply = Long.valueOf(map.get("totalSupply").toString()); + transaction.setValue(NumberUtil.longToBigDecimalString(totalSupply)); + + transaction.setData(null); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTransferConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTransferConverter.java new file mode 100644 index 00000000..cbafc41d --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTransferConverter.java @@ -0,0 +1,24 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.Transfer; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FTransferConverter extends TransactionConverter { + + public TxType getType() { + return TxType.TRANSFER; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + if (transactionV2.getAmount() != null) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + } + transaction.setToAddr(transactionV2.getToAddr()); + } +} \ No newline at end of file diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTransferOwnershipConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTransferOwnershipConverter.java new file mode 100644 index 00000000..3655a196 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FTransferOwnershipConverter.java @@ -0,0 +1,31 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.TransferTokenOwnership; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.JsonUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + +import java.util.HashMap; +import java.util.Map; + + +public class FTransferOwnershipConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.TRANSFER_TOKEN_OWNERSHIP; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + Map map = new HashMap<>(); + map.put("from", transactionV2.getFromAddr()); + map.put("newOwner", transactionV2.getToAddr()); + map.put("symbol", transactionV2.getAsset()); + + transaction.setData(JsonUtil.toJson(map)); + } +} + diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FUnJailConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FUnJailConverter.java new file mode 100644 index 00000000..334a5b5e --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FUnJailConverter.java @@ -0,0 +1,21 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.slash.UnJail; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FUnJailConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.UNJAIL; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + return; + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FUnfreezeConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FUnfreezeConverter.java new file mode 100644 index 00000000..8afa79d3 --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FUnfreezeConverter.java @@ -0,0 +1,22 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TokenUnfreeze; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.utils.converter.NumberUtil; +import com.binance.dex.api.client.utils.converter.TransactionConverter; + + +public class FUnfreezeConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.UNFREEZE_TOKEN; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + transaction.setValue(NumberUtil.longToBigDecimalString(transactionV2.getAmount())); + } +} diff --git a/src/main/java/com/binance/dex/api/client/utils/converter/impl/FVoteConverter.java b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FVoteConverter.java new file mode 100644 index 00000000..4d48f99c --- /dev/null +++ b/src/main/java/com/binance/dex/api/client/utils/converter/impl/FVoteConverter.java @@ -0,0 +1,23 @@ +package com.binance.dex.api.client.utils.converter.impl; + +import com.binance.dex.api.client.domain.Transaction; +import com.binance.dex.api.client.domain.TransactionV2; +import com.binance.dex.api.client.domain.broadcast.TxType; +import com.binance.dex.api.client.domain.broadcast.Vote; +import com.binance.dex.api.client.utils.converter.TransactionConverter; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +public class FVoteConverter extends TransactionConverter { + + @Override + public TxType getType() { + return TxType.VOTE; + } + + @Override + public void doConvert(TransactionV2 transactionV2, Transaction transaction) { + return; + } +} diff --git a/src/main/java/com/binance/dex/api/client/websocket/BinanceDexClientWSFactory.java b/src/main/java/com/binance/dex/api/client/websocket/BinanceDexClientWSFactory.java index 8d4d2675..ddb3c80e 100644 --- a/src/main/java/com/binance/dex/api/client/websocket/BinanceDexClientWSFactory.java +++ b/src/main/java/com/binance/dex/api/client/websocket/BinanceDexClientWSFactory.java @@ -32,12 +32,12 @@ public static BinanceDexWSApiImpl getWSApiImpl(BinanceDexEnvironment env){ } return binanceDexWSApiImplMap.get(env.getWsBaseUrl()); } - public static BinanceDexWSApiImpl getWSApiImpl(String url,String hrp){ + public static BinanceDexWSApiImpl getWSApiImpl(String url,String hrp, String valHrp){ synchronized (lock){ binanceDexWSApiImplMap.computeIfAbsent(url,(k)->{ BinanceDexClientEndpoint endpoint = newDefaultClientEndpoint(url); WebsocketLauncher.startUp(endpoint); - return new BinanceDexWSApiImpl(hrp,endpoint); + return new BinanceDexWSApiImpl(hrp, valHrp, endpoint); }); } return binanceDexWSApiImplMap.get(url); diff --git a/src/main/java/com/binance/dex/api/client/websocket/BinanceDexWSApiImpl.java b/src/main/java/com/binance/dex/api/client/websocket/BinanceDexWSApiImpl.java index 3551f54f..37dbe748 100644 --- a/src/main/java/com/binance/dex/api/client/websocket/BinanceDexWSApiImpl.java +++ b/src/main/java/com/binance/dex/api/client/websocket/BinanceDexWSApiImpl.java @@ -37,12 +37,12 @@ public class BinanceDexWSApiImpl extends IdGenerator implements BinanceDexWSApi BinanceDexWSApiImpl(BinanceDexEnvironment env,BinanceDexClientEndpoint endpoint){ this.endpoint = endpoint; - this.transactionConverter = new TransactionConverter(env.getHrp()); + this.transactionConverter = new TransactionConverter(env.getHrp(), env.getValHrp()); } - BinanceDexWSApiImpl(String hrp,BinanceDexClientEndpoint endpoint){ + BinanceDexWSApiImpl(String hrp, String valHrp, BinanceDexClientEndpoint endpoint){ this.endpoint = endpoint; - this.transactionConverter = new TransactionConverter(hrp); + this.transactionConverter = new TransactionConverter(hrp, valHrp); } diff --git a/src/main/java/com/binance/dex/api/client/websocket/WebsocketLauncher.java b/src/main/java/com/binance/dex/api/client/websocket/WebsocketLauncher.java index 05134d40..0a638d21 100644 --- a/src/main/java/com/binance/dex/api/client/websocket/WebsocketLauncher.java +++ b/src/main/java/com/binance/dex/api/client/websocket/WebsocketLauncher.java @@ -9,6 +9,8 @@ public class WebsocketLauncher { public static boolean startUp(BinanceDexClientEndpoint endpoint){ try { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); + container.setDefaultMaxBinaryMessageBufferSize(128000000); + container.setDefaultMaxTextMessageBufferSize(128000000); container.connectToServer(endpoint,new URI(endpoint.getUrl())); return true; } catch (Exception e) { diff --git a/src/main/proto/dex.proto b/src/main/proto/dex.proto index a46f5214..99de24fc 100644 --- a/src/main/proto/dex.proto +++ b/src/main/proto/dex.proto @@ -7,6 +7,7 @@ option java_outer_classname = "Transaction"; package transaction; import "types.proto"; +import "google/protobuf/timestamp.proto"; // please note the field name is the JSON name. message StdTx { @@ -101,6 +102,14 @@ message Vote { int64 option = 3; // option from OptionSet chosen by the voter, } +message SideVote { + // 0xE26BA13D // hardcoded, object type prefix in 4 bytes + int64 proposal_id = 1; // ID of the proposal + bytes voter = 2; // address of the voter + int64 option = 3; // option from OptionSet chosen by the voter, + string side_chain_id = 4; +} + message Token { string denom = 1; int64 amount = 2; @@ -148,6 +157,16 @@ message TokenInfo{ bool mintable = 6; } +message MiniTokenInfo{ + string name = 1; + string symbol = 2; + string original_symbol = 3; + int64 total_supply = 4; + bytes owner = 5; + bool mintable = 6; + int32 token_type = 7; + string token_uri = 8; +} message DexFeeParam { // 0x495A5044 @@ -223,6 +242,17 @@ message SubmitProposal { int64 voting_period = 6; } +message SideSubmitProposal { + // 0x4ACBF03C + string title = 1; + string description = 2; + int64 proposal_type = 3; + bytes proposer = 4; + repeated Token initial_deposit = 5; + int64 voting_period = 6; + string side_chain_id = 7; +} + message Deposit { // 0xA18A56E5 int64 proposal_id = 1; @@ -230,6 +260,14 @@ message Deposit { repeated Token amount = 3; } +message SideDeposit { + // 0x140F2DB4 + int64 proposal_id = 1; + bytes depositer = 2; + repeated Token amount = 3; + string side_chain_id = 4; +} + message Description { string moniker = 1; string identity = 2; @@ -341,8 +379,99 @@ message ClaimHashTimerLockMsg { bytes random_number = 3; } +message SubmitEvidenceMsg { + // A38F1399 + bytes submitter = 1; + repeated BscHeader headers = 2; +} + +message BscHeader { + bytes parentHash = 1; + bytes sha3Uncles = 2; + bytes miner = 3; + bytes stateRoot = 4; + bytes transactionsRoot = 5; + bytes receiptsRoot = 6; + bytes logsBloom = 7; + int64 difficulty = 8; + int64 number = 9; + int64 gasLimit = 10; + int64 gasUsed = 11; + int64 timestamp = 12; + bytes extraData = 13; + bytes mixHash = 14; + bytes nonce = 15; +} + +message SideChainUnJailMsg { + // 5681EC54 + bytes address = 1; + string side_chain_id = 2; +} + message RefundHashTimerLockMsg { // bytes from = 1; bytes swap_id = 2; +} + +message Status { + int32 text = 1; + string finalClaim = 2; +} + +message Prophecy { + string id = 1; + Status status = 2; + + map claimValidators = 3; + map validatorClaims = 4; +} + +//mini token issue +message TinyTokenIssue { + // ED2832D4 // hardcoded, object type prefix in 4 bytes + bytes from = 1; // issue token owner + string name = 2; + string symbol = 3; + int64 total_supply = 4; + bool mintable = 5; + string token_uri = 6; +} + +message MiniTokenIssue { + // A3F16C41 // hardcoded, object type prefix in 4 bytes + bytes from = 1; // issue token owner + string name = 2; + string symbol = 3; + int64 total_supply = 4; + bool mintable = 5; + string token_uri = 6; +} + +message MiniTokenSetURI { + // 7B1D34E7 // hardcoded, object type prefix in 4 bytes + bytes from = 1; // issue token owner + string symbol = 2; + string token_uri = 3; +} + +message MiniTokenList { + // 4C264019 // hardcoded, object type prefix in 4 bytes + bytes from = 1; + string base_asset_symbol = 2; + string quote_asset_symbol = 3; + int64 init_price = 4; +} + +message TransferTokenOwnershipMsg { + // 6d99d273 + bytes from = 1; + string symbol = 2; + bytes new_owner = 3; +} + +message UnJailMsg { + // 543AEC70 + bytes address = 1; } \ No newline at end of file diff --git a/src/main/proto/types.proto b/src/main/proto/types.proto index b48ff1e8..680026c9 100644 --- a/src/main/proto/types.proto +++ b/src/main/proto/types.proto @@ -315,6 +315,10 @@ message Evidence { int64 total_voting_power = 5; } +message KVPairs { + repeated common.KVPair pairs = 1; +} + //---------------------------------------- // Service Definition diff --git a/src/test/java/com/binance/dex/api/client/encoding/AminoTest.java b/src/test/java/com/binance/dex/api/client/encoding/AminoTest.java new file mode 100644 index 00000000..c3432860 --- /dev/null +++ b/src/test/java/com/binance/dex/api/client/encoding/AminoTest.java @@ -0,0 +1,471 @@ +package com.binance.dex.api.client.encoding; + +import com.binance.dex.api.client.BinanceDexEnvironment; +import com.binance.dex.api.client.TransactionConverter; +import com.binance.dex.api.client.Wallet; +import com.binance.dex.api.client.domain.broadcast.Transaction; +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.domain.stake.sidechain.*; +import com.binance.dex.api.client.encoding.amino.Amino; +import com.binance.dex.api.client.encoding.amino.types.PubKeyEd25519; +import com.binance.dex.api.client.encoding.message.MessageType; +import com.binance.dex.api.client.encoding.message.Token; +import com.binance.dex.api.client.encoding.message.beaconchain.transaction.EditBeaconChainValidatorMessage; +import com.binance.dex.api.client.encoding.message.bridge.*; +import com.binance.dex.api.client.encoding.message.common.*; +import com.binance.dex.api.client.encoding.message.sidechain.transaction.*; +import com.binance.dex.api.client.encoding.message.sidechain.value.CommissionMsgValue; +import com.binance.dex.api.client.encoding.message.sidechain.value.DescriptionValue; +import com.binance.dex.api.client.encoding.message.sidechain.value.RedelegationValue; +import org.bouncycastle.util.encoders.Hex; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; + +/** + * @author Fitz.Lu + **/ +public class AminoTest { + + private final Amino amino = new Amino(); + + private final Wallet wallet = new Wallet("bce1c934173e84cb4a0abf06b371f7568d3c4686da8f3ea7e1e8d230ae681920", BinanceDexEnvironment.PROD); + private final TransactionConverter transactionConverter = new TransactionConverter("bnb", "bva"); + + @Test + public void testDecodeRedelegation() throws IOException { + String hex = "2a08a554120c08c08994f50510a0b0df93011a080a03424e4210904e22090a03424e4210d099052a0a3232"; + RedelegationValue value = new RedelegationValue(); + amino.decodeWithLengthPrefix(Hex.decode(hex), value); + Assert.assertNotNull(value.getSharesDst()); + } + + public void testClaim() throws IOException { + ClaimMsgMessage message = new ClaimMsgMessage(); + message.setChainId(ClaimTypes.ClaimTypeTransferIn); + message.setPayload("claim content".getBytes()); + message.setSequence(1); + message.setValidatorAddress(Bech32AddressValue.fromBech32String("bva1337r5pk3r6kvs4a8kc3u5yhdjc79c5lg78343t")); + byte[] data = amino.encode(message, MessageType.Claim.getTypePrefixBytes(), false); + Transaction transaction = transactionConverter.convert(data); + Assert.assertNotNull(transaction.getRealTx()); + } + + public static byte[] hexStringToByteArray(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i + 1), 16)); + } + return data; + } + + @Test + public void testTransferOut() throws IOException { + TransferOutMsgMessage message = new TransferOutMsgMessage(); + message.setAmount(new CoinValue("BNB", 1000000L)); + message.setExpireTime(System.currentTimeMillis()); + message.setFrom(Bech32AddressValue.fromBech32StringWithNewHrp("bva1337r5pk3r6kvs4a8kc3u5yhdjc79c5lg78343t", "bnb")); + message.setToAddress(EthAddressValue.from("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08")); + byte[] data = amino.encode(message, MessageType.TransferOut.getTypePrefixBytes(), false); + Transaction transaction = transactionConverter.convert(data); + Assert.assertNotNull(transaction.getRealTx()); + } + + @Test + public void testBind() throws IOException { + BindMsgMessage message = new BindMsgMessage(); + message.setAmount(1000000L); + message.setContractAddress(EthAddressValue.from("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08")); + message.setContractDecimal(8); + message.setExpireTime(System.currentTimeMillis()); + message.setFrom(Bech32AddressValue.fromBech32StringWithNewHrp("bva1337r5pk3r6kvs4a8kc3u5yhdjc79c5lg78343t", "bnb")); + message.setSymbol("BNB"); + byte[] data = amino.encode(message, MessageType.Bind.getTypePrefixBytes(), false); + Transaction transaction = transactionConverter.convert(data); + Assert.assertNotNull(transaction.getRealTx()); + } + + @Test + public void testUnBind() throws IOException { + UnbindMsgMessage message = new UnbindMsgMessage(); + message.setFrom(Bech32AddressValue.fromBech32StringWithNewHrp("bva1337r5pk3r6kvs4a8kc3u5yhdjc79c5lg78343t", "bnb")); + message.setSymbol("BNB"); + byte[] data = amino.encode(message, MessageType.UnBind.getTypePrefixBytes(), false); + Transaction transaction = transactionConverter.convert(data); + Assert.assertNotNull(transaction.getRealTx()); + } + + @Test + public void testCreateSideChainValidator() throws IOException { + CreateSideChainValidator createSideChainValidator = new CreateSideChainValidator(); + + //create and set description + Description validatorDescription = new Description(); + validatorDescription.setMoniker("custom-moniker"); + validatorDescription.setIdentity("ide"); + validatorDescription.setWebsite("https://www.website.com"); + validatorDescription.setDetails("This is a side-chain validator"); + + createSideChainValidator.setDescription(validatorDescription); + + //create and set commission + Commission commission = new Commission(); + commission.setRate(5L); + commission.setMaxRate(100L); + commission.setMaxChangeRate(5L); + + createSideChainValidator.setCommission(commission); + + //set delegator address, here use self address + createSideChainValidator.setDelegatorAddr(wallet.getAddress()); + + createSideChainValidator.setValidatorAddr(wallet.getAddress()); + + //set delegation token, here use 1000000 BNB + Token delegationToken = new Token(); + delegationToken.setDenom("BNB"); + delegationToken.setAmount(10000000000L); + createSideChainValidator.setDelegation(delegationToken); + + //set side-chain id + createSideChainValidator.setSideChainId("bsc"); + + //set side-chain validator cons address + createSideChainValidator.setSideConsAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"); + + //set side-chain validator fee address + createSideChainValidator.setSideFeeAddr("0x9fB29AAc15b9A4B7F17c3385939b007540f4d791"); + + byte[] msg = amino.encode(convert(createSideChainValidator), MessageType.CreateSideChainValidator.getTypePrefixBytes(), false); + + Transaction tx = transactionConverter.convert(msg); + Assert.assertNotNull(tx.getRealTx()); + } + + @Test + public void testDecodeEditSideChainValidator() throws IOException { + EditSideChainValidator editSideChainValidator = new EditSideChainValidator(); + + //set new description if needed + Description description = new Description(); + description.setMoniker("new Moniker"); + editSideChainValidator.setDescription(description); + + editSideChainValidator.setValidatorAddress(wallet.getAddress()); + + //set new rate if needed + editSideChainValidator.setCommissionRate(1L); + + //set new fee address if needed + editSideChainValidator.setSideFeeAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"); + + editSideChainValidator.setSideChainId("bsc"); + + EditSideChainValidatorMessage message = new EditSideChainValidatorMessage(); + byte[] msg = amino.encode(convert(editSideChainValidator), MessageType.EditSideChainValidator.getTypePrefixBytes(), false); + + Transaction tx = transactionConverter.convert(msg); + Assert.assertNotNull(tx.getRealTx()); + } + + @Test + public void testDecodeSideChainDelegate() throws IOException { + SideChainDelegate sideChainDelegate = new SideChainDelegate(); + + //set delegate token + Token delegation = new Token("BNB", 100000000L); + sideChainDelegate.setDelegation(delegation); + + //set delegator address, here is self + sideChainDelegate.setDelegatorAddress(wallet.getAddress()); + + //set validator address + sideChainDelegate.setValidatorAddress("bva1337r5pk3r6kvs4a8kc3u5yhdjc79c5lg78343t"); + + //set side-chain id + sideChainDelegate.setSideChainId("bsc"); + + byte[] msg = amino.encode(convert(sideChainDelegate), MessageType.SideChainDelegate.getTypePrefixBytes(), false); + + Transaction tx = transactionConverter.convert(msg); + Assert.assertNotNull(tx.getRealTx()); + } + + @Test + public void testDecodeSideChainRedelegate() throws IOException { + SideChainRedelegate redelegate = new SideChainRedelegate(); + + //set redelegate amount + redelegate.setAmount(new Token("bnb".toUpperCase(), 100000000L)); + + //set delegator address + redelegate.setDelegatorAddress(wallet.getAddress()); + + //set source validator address + redelegate.setSrcValidatorAddress("bva1337r5pk3r6kvs4a8kc3u5yhdjc79c5lg78343t"); + + //set destination validator address + redelegate.setDstValidatorAddress("bva10l34nul25nfxyurfkvkyn7z5kumrg0rjun409e"); + + //set side-chain id + redelegate.setSideChainId("bsc"); + + byte[] msg = amino.encode(convert(redelegate), MessageType.SideChainRedelegate.getTypePrefixBytes(), false); + + Transaction tx = transactionConverter.convert(msg); + Assert.assertNotNull(tx.getRealTx()); + } + + @Test + public void testDecodeSideChainUnBond() throws IOException { + SideChainUnBond sideChainUndelegate = new SideChainUnBond(); + + //set unbond amount + sideChainUndelegate.setAmount(new Token("BNB", 5000L)); + + //set delegator address + sideChainUndelegate.setDelegatorAddress(wallet.getAddress()); + + //set validator address + sideChainUndelegate.setValidatorAddress("bva1337r5pk3r6kvs4a8kc3u5yhdjc79c5lg78343t"); + + //set side-chain id + sideChainUndelegate.setSideChainId("bsc"); + + byte[] msg = amino.encode(convert(sideChainUndelegate), MessageType.SideChainUndelegate.getTypePrefixBytes(), false); + + Transaction tx = transactionConverter.convert(msg); + Assert.assertNotNull(tx.getRealTx()); + } + + @Test + public void testCreateSideChainValidatorWithVoteAddr() throws IOException { + CreateSideChainValidatorWithVoteAddr createSideChainValidator = new CreateSideChainValidatorWithVoteAddr(); + + //create and set description + Description validatorDescription = new Description(); + validatorDescription.setMoniker("custom-moniker"); + validatorDescription.setIdentity("ide"); + validatorDescription.setWebsite("https://www.website.com"); + validatorDescription.setDetails("This is a side-chain validator"); + + createSideChainValidator.setDescription(validatorDescription); + + //create and set commission + Commission commission = new Commission(); + commission.setRate(5L); + commission.setMaxRate(100L); + commission.setMaxChangeRate(5L); + + createSideChainValidator.setCommission(commission); + + //set delegator address, here use self address + createSideChainValidator.setDelegatorAddr(wallet.getAddress()); + + createSideChainValidator.setValidatorAddr(wallet.getAddress()); + + //set delegation token, here use 1000000 BNB + Token delegationToken = new Token(); + delegationToken.setDenom("BNB"); + delegationToken.setAmount(10000000000L); + createSideChainValidator.setDelegation(delegationToken); + + //set side-chain id + createSideChainValidator.setSideChainId("bsc"); + + //set side-chain validator cons address + createSideChainValidator.setSideConsAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"); + + //set side-chain validator fee address + createSideChainValidator.setSideFeeAddr("0x9fB29AAc15b9A4B7F17c3385939b007540f4d791"); + + createSideChainValidator.setSideVoteAddr("0x11FfBAC7fA17f5c9084a15C8f0f15dAe845A5712"); + + byte[] msg = amino.encode(convert(createSideChainValidator), MessageType.CreateSideChainValidatorWithVoteAddr.getTypePrefixBytes(), false); + + Transaction tx = transactionConverter.convert(msg); + Assert.assertNotNull(tx.getRealTx()); + } + + @Test + public void testDecodeEditSideChainValidatorWithVoteAddr() throws IOException { + EditSideChainValidatorWithVoteAddr editSideChainValidator = new EditSideChainValidatorWithVoteAddr(); + + //set new description if needed + Description description = new Description(); + description.setMoniker("new Moniker"); + editSideChainValidator.setDescription(description); + + editSideChainValidator.setValidatorAddress(wallet.getAddress()); + + //set new rate if needed + editSideChainValidator.setCommissionRate(1L); + + editSideChainValidator.setSideChainId("bsc"); + + //set new fee address if needed + editSideChainValidator.setSideFeeAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"); + editSideChainValidator.setSideConsAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C99"); + editSideChainValidator.setSideVoteAddr("0xa96c45e0043e98a4271d84265a0a5177795c61aa188c42a94ecc4b2e54073613a46f49ff1c03e29d4a744fd56589e3a0"); + + byte[] msg = amino.encode(convert(editSideChainValidator), MessageType.EditSideChainValidatorWithVoteAddr.getTypePrefixBytes(), false); + + Transaction tx = transactionConverter.convert(msg); + Assert.assertNotNull(tx.getRealTx()); + Assert.assertEquals("0xa96c45e0043e98a4271d84265a0a5177795c61aa188c42a94ecc4b2e54073613a46f49ff1c03e29d4a744fd56589e3a0", ((EditSideChainValidatorWithVoteAddr)tx.getRealTx()).getSideVoteAddr()); + } + + EditSideChainValidatorMessage convert(EditSideChainValidator editSideChainValidator) { + EditSideChainValidatorMessage message = new EditSideChainValidatorMessage(); + + if (editSideChainValidator.getDescription() != null) { + message.setDescription(convert(editSideChainValidator.getDescription())); + } + + message.setValidatorOperatorAddress(Bech32AddressValue.fromBech32String(editSideChainValidator.getValidatorAddress())); + + message.setCommissionRate(Dec.newInstance(editSideChainValidator.getCommissionRate())); + message.setSideChainId(editSideChainValidator.getSideChainId()); + message.setSideFeeAddr(decodeHexAddress(editSideChainValidator.getSideFeeAddr())); + + return message; + } + + CreateSideChainValidatorMessage convert(CreateSideChainValidator createSideChainValidator) { + CreateSideChainValidatorMessage message = new CreateSideChainValidatorMessage(); + + if (createSideChainValidator.getDescription() != null) { + message.setDescription(convert(createSideChainValidator.getDescription())); + } + if (createSideChainValidator.getCommission() != null) { + message.setCommission(convert(createSideChainValidator.getCommission())); + } + + message.setDelegatorAddr(Bech32AddressValue.fromBech32String(createSideChainValidator.getDelegatorAddr())); + message.setValidatorOperatorAddr(Bech32AddressValue.fromBech32String(createSideChainValidator.getValidatorAddr())); + + if (createSideChainValidator.getDelegation() != null) { + message.setDelegation(convert(createSideChainValidator.getDelegation())); + } + + message.setSideChainId(createSideChainValidator.getSideChainId()); + message.setSideConsAddr(decodeHexAddress(createSideChainValidator.getSideConsAddr())); + message.setSideFeeAddr(decodeHexAddress(createSideChainValidator.getSideFeeAddr())); + return message; + } + + private DescriptionValue convert(Description description) { + DescriptionValue value = new DescriptionValue(); + value.setMoniker(description.getMoniker()); + value.setDetails(description.getDetails()); + value.setIdentity(description.getIdentity()); + value.setWebsite(description.getWebsite()); + return value; + } + + private CommissionMsgValue convert(Commission commission) { + CommissionMsgValue value = new CommissionMsgValue(); + value.setRate(Dec.newInstance(commission.getRate())); + value.setMaxRate(Dec.newInstance(commission.getMaxRate())); + value.setMaxChangeRate(Dec.newInstance(commission.getMaxChangeRate())); + return value; + } + + private CoinValueStr convert(Token token) { + CoinValueStr value = new CoinValueStr(); + value.setDenom(token.getDenom()); + value.setAmount(token.getAmount()); + return value; + } + + private SideChainDelegateMessage convert(SideChainDelegate sideChainDelegate) { + SideChainDelegateMessage message = new SideChainDelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(sideChainDelegate.getDelegatorAddress())); + message.setValidatorAddress(Bech32AddressValue.fromBech32String(sideChainDelegate.getValidatorAddress())); + + if (sideChainDelegate.getDelegation() != null) { + message.setDelegation(convert(sideChainDelegate.getDelegation())); + } + + message.setSideChainId(sideChainDelegate.getSideChainId()); + return message; + } + + private SideChainRedelegateMessage convert(SideChainRedelegate redelegate) { + SideChainRedelegateMessage message = new SideChainRedelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(redelegate.getDelegatorAddress())); + message.setSrcValidatorAddress(Bech32AddressValue.fromBech32String(redelegate.getSrcValidatorAddress())); + message.setDstValidatorAddress(Bech32AddressValue.fromBech32String(redelegate.getDstValidatorAddress())); + if (redelegate.getAmount() != null) { + message.setAmount(convert(redelegate.getAmount())); + } + message.setSideChainId(redelegate.getSideChainId()); + return message; + } + + private SideChainUndelegateMessage convert(SideChainUnBond unBond) { + SideChainUndelegateMessage message = new SideChainUndelegateMessage(); + message.setDelegatorAddress(Bech32AddressValue.fromBech32String(unBond.getDelegatorAddress())); + message.setValidatorAddress(Bech32AddressValue.fromBech32String(unBond.getValidatorAddress())); + if (unBond.getAmount() != null) { + message.setAmount(convert(unBond.getAmount())); + } + message.setSideChainId(unBond.getSideChainId()); + return message; + } + + CreateSideChainValidatorWithVoteAddrMessage convert(CreateSideChainValidatorWithVoteAddr createSideChainValidator) { + CreateSideChainValidatorWithVoteAddrMessage message = new CreateSideChainValidatorWithVoteAddrMessage(); + + if (createSideChainValidator.getDescription() != null) { + message.setDescription(convert(createSideChainValidator.getDescription())); + } + if (createSideChainValidator.getCommission() != null) { + message.setCommission(convert(createSideChainValidator.getCommission())); + } + + message.setDelegatorAddr(Bech32AddressValue.fromBech32String(createSideChainValidator.getDelegatorAddr())); + message.setValidatorOperatorAddr(Bech32AddressValue.fromBech32String(createSideChainValidator.getValidatorAddr())); + + if (createSideChainValidator.getDelegation() != null) { + message.setDelegation(convert(createSideChainValidator.getDelegation())); + } + + message.setSideChainId(createSideChainValidator.getSideChainId()); + message.setSideConsAddr(decodeHexAddress(createSideChainValidator.getSideConsAddr())); + message.setSideFeeAddr(decodeHexAddress(createSideChainValidator.getSideFeeAddr())); + message.setSideVoteAddr(decodeHexAddress(createSideChainValidator.getSideVoteAddr())); + return message; + } + + EditSideChainValidatorWithVoteAddrMessage convert(EditSideChainValidatorWithVoteAddr editSideChainValidator) { + EditSideChainValidatorWithVoteAddrMessage message = new EditSideChainValidatorWithVoteAddrMessage(); + + if (editSideChainValidator.getDescription() != null) { + message.setDescription(convert(editSideChainValidator.getDescription())); + } + + message.setValidatorOperatorAddress(Bech32AddressValue.fromBech32String(editSideChainValidator.getValidatorAddress())); + + message.setCommissionRate(Dec.newInstance(editSideChainValidator.getCommissionRate())); + message.setSideChainId(editSideChainValidator.getSideChainId()); + message.setSideFeeAddr(decodeHexAddress(editSideChainValidator.getSideFeeAddr())); + message.setSideConsAddr(decodeHexAddress(editSideChainValidator.getSideConsAddr())); + message.setSideVoteAddr(decodeHexAddress(editSideChainValidator.getSideVoteAddr())); + + return message; + } + + private byte[] decodeHexAddress(String address) { + String addr = address; + if (addr.startsWith("0x")) { + addr = address.substring(2); + } + return Hex.decode(addr); + } + +} diff --git a/src/test/java/com/binance/dex/api/client/encoding/message/TestRestClient.java b/src/test/java/com/binance/dex/api/client/encoding/message/TestRestClient.java index 92fa9248..dec51f80 100644 --- a/src/test/java/com/binance/dex/api/client/encoding/message/TestRestClient.java +++ b/src/test/java/com/binance/dex/api/client/encoding/message/TestRestClient.java @@ -14,12 +14,14 @@ @Ignore("Manual run only") public class TestRestClient { private BinanceDexApiRestClient client = - BinanceDexApiClientFactory.newInstance().newRestClient(BinanceDexEnvironment.TEST_NET.getBaseUrl()); + BinanceDexApiClientFactory.newInstance().newRestClient("https://dex-api.fdgahl.cn"); private String address = "tbnb16hywxpvvkaz6cecjz89mf2w0da3vfeg6z6yky2"; private String symbol = "ADA.B-F2F_BNB"; + private String miniSymbol = "MSDK-400M_BNB"; + @Test public void testGetMarkets() { List mkts = client.getMarkets(1000); @@ -125,4 +127,52 @@ public void testGetFees() { List fees = client.getFees(); System.out.println(fees); } + + @Test + public void testGetMiniToken() { + List tokens = client.getMiniTokens(100); + System.out.println(tokens); + } + + @Test + public void testGetMiniMarkets() { + List mkts = client.getMiniMarkets(1000); + for (Market m : mkts) { + System.out.println(m); + } + } + + @Test + public void testGetMiniCandlestickBars() { + List klines = client.getMiniCandleStickBars(miniSymbol, CandlestickInterval.HOURLY); + System.out.println(klines); + + System.out.println(client.getMiniCandleStickBars(miniSymbol, CandlestickInterval.ONE_MINUTE, + 10, System.currentTimeMillis() - 24L * 60 * 60 * 1000L, null)); + } + + @Test + public void testGetMiniOpenOrders() { + System.out.println(client.getMiniOpenOrders(address)); + } + + @Test + public void testGetMiniClosedOrders() { + System.out.println(client.getMiniClosedOrders(address)); + } + + @Test + public void testGetMini24HrPriceStatistics() { + System.out.println(client.getMini24HrPriceStatistics()); + System.out.println(client.getMini24HrPriceStatistics(miniSymbol)); + } + + @Test + public void testGetMiniTrades() { + System.out.println(client.getMiniTrades()); + TradesRequest request = new TradesRequest(); + request.setAddress(address); + request.setLimit(10); + System.out.println(client.getMiniTrades(request)); + } } diff --git a/src/test/java/com/binance/dex/api/client/encoding/rlp/RLPTest.java b/src/test/java/com/binance/dex/api/client/encoding/rlp/RLPTest.java new file mode 100644 index 00000000..d787e11b --- /dev/null +++ b/src/test/java/com/binance/dex/api/client/encoding/rlp/RLPTest.java @@ -0,0 +1,101 @@ +package com.binance.dex.api.client.encoding.rlp; + + +import com.binance.dex.api.client.crosschain.Package; +import com.binance.dex.api.client.crosschain.Payload; +import com.binance.dex.api.client.crosschain.content.ApproveBindSyn; +import com.binance.dex.api.client.crosschain.content.SideDowntimeSlash; +import com.binance.dex.api.client.crosschain.content.TransferInSyn; +import com.binance.dex.api.client.crosschain.content.TransferOutRefund; +import com.binance.dex.api.client.encoding.Crypto; +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.rlp.Decoder; +import org.bouncycastle.util.encoders.Hex; +import org.junit.Assert; +import org.junit.Test; + + +import java.math.BigInteger; +import java.util.List; + +public class RLPTest { + + @Test + public void testApproveBindSynDecode() throws Exception { + byte[] raw = Hex.decode("f84af8480110b8440000000000000000000000000000000000000000000000000000000000000f4240e280a04142432d44453700000000000000000000000000000000000000000000000000"); + List result = Decoder.decodeList(raw, Package.class); + Assert.assertEquals(1, result.size()); + Assert.assertEquals(1, result.get(0).getChannelId().getValue()); + Assert.assertEquals(16, result.get(0).getSequence().getNumber().longValue()); + Payload payload = result.get(0).getPayload(); + Assert.assertEquals(0, (int) payload.getPackageType()); + Assert.assertEquals(new BigInteger("1000000"), payload.getCrossChainFee()); + Assert.assertTrue(payload.getContent() instanceof ApproveBindSyn); + ApproveBindSyn approveBindSyn = (ApproveBindSyn) payload.getContent(); + Assert.assertEquals(0, approveBindSyn.getStatus().getValue()); + Assert.assertEquals("ABC-DE7", approveBindSyn.getSymbol().getSymbol()); + } + + @Test + public void testTransferOutRefundDecode() throws Exception { + byte[] raw = Hex.decode("f865f8630280b85f010000000000000000000000000000000000000000000000000000000000000000f83ca0424e4200000000000000000000000000000000000000000000000000000000008401312d009425016278faceb917ed90ec5d940352965ac096ad01"); + List result = Decoder.decodeList(raw, Package.class); + result.forEach(pack -> pack.setHrp("tbnb")); + Assert.assertEquals(1, result.size()); + Assert.assertEquals(2, result.get(0).getChannelId().getValue()); + Assert.assertEquals(0, result.get(0).getSequence().getNumber().longValue()); + Payload payload = result.get(0).getPayload(); + Assert.assertEquals(1, (int) payload.getPackageType()); + Assert.assertEquals(new BigInteger("0"), payload.getCrossChainFee()); + Assert.assertTrue(payload.getContent() instanceof TransferOutRefund); + TransferOutRefund transferOutRefund = (TransferOutRefund) payload.getContent(); + Assert.assertEquals("BNB", transferOutRefund.getSymbol().getSymbol()); + Assert.assertEquals(20000000L, transferOutRefund.getRefundAmount().getNumber().longValue()); + Assert.assertEquals("tbnb1y5qky786e6u30mvsa3wegq6jjedvp94dfeyvkw", Crypto.encodeAddress("tbnb", transferOutRefund.getRefundAddr().getRaw())); + Assert.assertEquals(1, transferOutRefund.getRefundReason().getValue()); + } + + @Test + public void testTransferInSyncDecode() throws Exception { + byte[] raw = Hex.decode("f8c7f8c5038306985ab8be0000000000000000000000000000000000000000000000000000000000001e8480f89ba0424e420000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000c9831e84808401312d00ea9425016278faceb917ed90ec5d940352965ac096ad943ece21ac0d97a24d004a6778babda59bbb167deaea9456ec2590d32b63a04f0a8613a85ab829dfc0ef259456ec2590d32b63a04f0a8613a85ab829dfc0ef25845f0415ea"); + List result = Decoder.decodeList(raw, Package.class); + result.forEach(pack -> pack.setHrp("tbnb")); + Assert.assertEquals(1, result.size()); + Assert.assertEquals(3, result.get(0).getChannelId().getValue()); + Assert.assertEquals(432218, result.get(0).getSequence().getNumber().longValue()); + Payload payload = result.get(0).getPayload(); + Assert.assertEquals(0, (int) payload.getPackageType()); + Assert.assertEquals(new BigInteger("2000000"), payload.getCrossChainFee()); + Assert.assertTrue(payload.getContent() instanceof TransferInSyn); + TransferInSyn transferInSyn = (TransferInSyn) payload.getContent(); + Assert.assertEquals("BNB", transferInSyn.getSymbol().getSymbol()); + Assert.assertEquals("0x0000000000000000000000000000000000000000", transferInSyn.getContractAddress().getAddress()); + Assert.assertEquals(2000000, transferInSyn.getAmounts().get(0).getNumber().longValue()); + Assert.assertEquals(20000000, transferInSyn.getAmounts().get(1).getNumber().longValue()); + Assert.assertEquals("tbnb1y5qky786e6u30mvsa3wegq6jjedvp94dfeyvkw", Crypto.encodeAddress("tbnb", transferInSyn.getReceiverAddresses().get(0).getRaw())); + Assert.assertEquals("tbnb18m8zrtqdj73y6qz2vaut40d9nwa3vl02vmyvez", Crypto.encodeAddress("tbnb", transferInSyn.getReceiverAddresses().get(1).getRaw())); + Assert.assertEquals("0x56ec2590d32b63a04f0a8613a85ab829dfc0ef25", transferInSyn.getRefundAddresses().get(0).getAddress()); + Assert.assertEquals("0x56ec2590d32b63a04f0a8613a85ab829dfc0ef25", transferInSyn.getRefundAddresses().get(1).getAddress()); + Assert.assertEquals(1594103274L, transferInSyn.getExpireTime().getValue()); + } + + @Test + public void testSlashDowntimeDecode() throws Exception { + byte[] raw = Hex.decode("f847f8450b80b841000000000000000000000000000000000000000000000000000000000000000000df940dd11a413972d8b1e1367c4b9196f75348424e708301c23c60845f02fca7"); + List result = Decoder.decodeList(raw, Package.class); + result.forEach(pack -> pack.setHrp("tbnb")); + Assert.assertEquals(1, result.size()); + Assert.assertEquals(11, result.get(0).getChannelId().getValue()); + Assert.assertEquals(0, result.get(0).getSequence().getNumber().longValue()); + Payload payload = result.get(0).getPayload(); + Assert.assertEquals(0, (int) payload.getPackageType()); + Assert.assertEquals(new BigInteger("0"), payload.getCrossChainFee()); + Assert.assertTrue(payload.getContent() instanceof SideDowntimeSlash); + SideDowntimeSlash sideDowntimeSlash = (SideDowntimeSlash) payload.getContent(); + Assert.assertEquals("0x0dd11a413972d8b1e1367c4b9196f75348424e70", EncodeUtils.bytesToPrefixHex(sideDowntimeSlash.getSideConsAddr())); + Assert.assertEquals(115260, sideDowntimeSlash.getSideHeight().getValue()); + Assert.assertEquals(96, sideDowntimeSlash.getSideChainId().getValue()); + Assert.assertEquals(1594031271, sideDowntimeSlash.getSideTimestamp().getValue()); + } + +} diff --git a/src/test/java/com/binance/dex/api/client/examples/BeaconChainStakingNodeExample.java b/src/test/java/com/binance/dex/api/client/examples/BeaconChainStakingNodeExample.java new file mode 100644 index 00000000..5cf8deb2 --- /dev/null +++ b/src/test/java/com/binance/dex/api/client/examples/BeaconChainStakingNodeExample.java @@ -0,0 +1,443 @@ +package com.binance.dex.api.client.examples; + +import com.binance.dex.api.client.BinanceDexApiClientFactory; +import com.binance.dex.api.client.BinanceDexApiNodeClient; +import com.binance.dex.api.client.BinanceDexEnvironment; +import com.binance.dex.api.client.Wallet; +import com.binance.dex.api.client.domain.Infos; +import com.binance.dex.api.client.domain.StakeValidator; +import com.binance.dex.api.client.domain.TransactionMetadata; +import com.binance.dex.api.client.domain.broadcast.TransactionOption; +import com.binance.dex.api.client.domain.broadcast.Transfer; +import com.binance.dex.api.client.domain.stake.*; +import com.binance.dex.api.client.domain.stake.beaconchain.*; +import com.binance.dex.api.client.encoding.Crypto; +import com.binance.dex.api.client.encoding.message.Token; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Francis.Liu + **/ +public class BeaconChainStakingNodeExample { + + private Logger logger = LoggerFactory.getLogger(BeaconChainStakingNodeExample.class); + + private BinanceDexApiNodeClient nodeClient = null; + + private BinanceDexEnvironment env; + private Wallet wallet; + + private List getMnemonicCodeWords() { + String mnemonicCodeWordStr = "bottom quick strong ranch section decide pepper broken oven demand coin run jacket curious business achieve mule bamboo remain vote kid rigid bench rubber"; + List mnemonicCodeWords = new ArrayList(); + String[] mnemonicCodeWordStrs = mnemonicCodeWordStr.split(" "); + for (String mnemonicCodeWord : mnemonicCodeWordStrs) { + mnemonicCodeWords.add(mnemonicCodeWord); + } + return mnemonicCodeWords; + } + + @Before + public void setup() { + env = BinanceDexEnvironment.LOCAL_NET; + + nodeClient = BinanceDexApiClientFactory.newInstance().newNodeRpcClient(env.getNodeUrl() + , env.getHrp(), env.getValHrp()); + try { + wallet = Wallet.createWalletFromMnemonicCode(this.getMnemonicCodeWords(), env); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +// @Test +// public void testCreateSideChainValidator() throws IOException, NoSuchAlgorithmException { +// CreateSideChainValidator createSideChainValidator = new CreateSideChainValidator(); +// +// //create and set description +// Description validatorDescription = new Description(); +// validatorDescription.setMoniker("rose-moniker"); +// validatorDescription.setIdentity("rose id"); +// validatorDescription.setWebsite("https://www.rose.com"); +// validatorDescription.setDetails("This is rose validator"); +// +// createSideChainValidator.setDescription(validatorDescription); +// +// //create and set commission +// Commission commission = new Commission(); +// commission.setRate(5L); +// commission.setMaxRate(1000L); +// commission.setMaxChangeRate(10L); +// +// createSideChainValidator.setCommission(commission); +// +// //set delegator address, here use self address +// createSideChainValidator.setDelegatorAddr(wallet.getAddress()); +// +// //set delegation token, here use 1000000 BNB +// Token delegationToken = new Token(); +// delegationToken.setDenom("BNB"); +// delegationToken.setAmount(2000000000000L); +// +// createSideChainValidator.setDelegation(delegationToken); +// //set side-chain id +// createSideChainValidator.setSideChainId("bsc"); +// +// //set side-chain validator cons address +// createSideChainValidator.setSideConsAddr("0x9fB29AAc15b9A4B7F17c3385939b007540f4d791"); +// +// //set side-chain validator fee address +// createSideChainValidator.setSideFeeAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"); +// +// TransactionOption options = new TransactionOption("", 0, null); +// +// List transactionMetadatas = nodeClient.createSideChainValidator(createSideChainValidator, wallet, options, true); +// Assert.assertEquals(1, transactionMetadatas.size()); +// } +// +// @Test +// public void testEditSideChainValidator() throws IOException, NoSuchAlgorithmException { +// EditSideChainValidator editSideChainValidator = new EditSideChainValidator(); +// +// //set new description if needed +// Description description = new Description(); +// description.setMoniker("new Moniker"); +// editSideChainValidator.setDescription(description); +// +// //set new rate if needed +//// editSideChainValidator.setCommissionRate(1L); +// +// //set new fee address if needed +// editSideChainValidator.setSideFeeAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"); +// +// editSideChainValidator.setSideChainId("bsc"); +// +// List transactionMetadatas = nodeClient.editSideChainValidator(editSideChainValidator, wallet, createTransactionOptionForTest(), true); +// Assert.assertEquals(1, transactionMetadatas.size()); +// } + + + private int pubKeyIndex = 0; + + private String genPubKey() throws IOException { + ArrayList pubKeys = new ArrayList<>(); + pubKeys.add("bcap1zcjduepq2equ54uaf02j98y9k5ksq2aau9ajns22gfkwgv8ut6ngx5cyteaq6jh5kf"); + pubKeys.add("bcap1zcjduepq6hpw8zdrqdj2cd07p07pktp2lym7fkm9hn5dkwqczm3rplcupgqsq0w7ev"); + pubKeys.add("bcap1zcjduepqcr6zgwf95lmxyj0tq6yh4dz4p3r0dkl4m0zrwj9jzgr2pmmct3qqtepuh3"); + pubKeys.add("bcap1zcjduepqq8600wvagq3n6j3ldk223tzkw433jjwywj4wfjevx74hvtztp8tsndacz7"); + pubKeys.add("bcap1zcjduepqhrmhu3a7f9z4v3a50z3pa39p872hgqud2t3quh2zsvx3fj0plu3qmar9mh"); + String pubKey = pubKeys.get(pubKeyIndex); + pubKeyIndex = pubKeyIndex + 1; + return pubKey; + } + + private Wallet genWalletWithBNB(Wallet tokenFrom) throws IOException, NoSuchAlgorithmException { + Wallet newWallet = Wallet.createRandomWallet(env); + + String symbol = "BNB"; + Transfer transfer = new Transfer(); + transfer.setCoin(symbol); + transfer.setFromAddress(tokenFrom.getAddress()); + transfer.setToAddress(newWallet.getAddress()); + transfer.setAmount("150"); + + TransactionOption options = new TransactionOption("test", 1, null); + List resp = nodeClient.transfer(transfer, tokenFrom, options, true); + return newWallet; + } + + + @Test + public void testStaking() throws IOException, NoSuchAlgorithmException { + logger.info("-------------------- begin staking test -------------------"); + Wallet bob = Wallet.createWalletFromMnemonicCode(this.getMnemonicCodeWords(), env); + logger.info(String.format("chainId = %s \n", bob.getChainId())); + + Infos infos = nodeClient.getNodeInfo(); + logger.info(String.format("infos = %s\n", infos)); + logger.info(String.format("bob address %s \n", bob.getAddress())); + + // create a random account + Wallet validator0 = this.genWalletWithBNB(bob); + logger.info(String.format("validator0 address %s \n", validator0.getAddress())); + + // validators + List validators = nodeClient.getStakeValidator(); + logger.info(String.format("validators %s \n", validators)); + logger.info(String.format("validators length %s \n", validators.size())); + Assert.assertTrue("validators len should be >= 1", validators.size() >= 1); + + // query validators count (including jailed) + long validatorCount = nodeClient.getAllValidatorsCount(true); + logger.info(String.format("validators count: %d \n", validatorCount)); + + // query validators count (excluding jailed) + long validatorCountWithoutJail = nodeClient.getAllValidatorsCount(false); + logger.info(String.format("validators count: %d \n", validatorCountWithoutJail)); + + Assert.assertEquals("there is no jailed validators yet", validatorCount, validatorCountWithoutJail); + + // create validator + String consensusPubKey = genPubKey(); + this.createBeaconChainValidator(validator0, consensusPubKey); + long validatorCountAfterCreate = nodeClient.getAllValidatorsCount(true); + logger.info(String.format("validators count: %d \n", validatorCountAfterCreate)); + Assert.assertEquals("validators count should be +1", validatorCountAfterCreate, validatorCount + 1); + + // query top validators + int topValidatorNum = 3; + List topValidators = nodeClient.getTopValidators(topValidatorNum); + logger.info(String.format("top validators %s \n", topValidators)); + Assert.assertTrue("top validators should be 1", topValidators.size() == topValidatorNum); + Validator topValidator = topValidators.get(0); + + // query validator + String validator0ValAddr = Crypto.getAddressFromPrivateKey(validator0.getPrivateKey(), env.getValHrp()); + logger.info(String.format("validator addr %s \n", validator0ValAddr)); + Validator validator = nodeClient.getValidator(validator0ValAddr); + logger.info(String.format("query validator: %s \n", validator)); + Assert.assertNotNull("validator should not be nil", validator); + Assert.assertEquals("validator address should be equal", validator.getFeeAddr(), validator0.getAddress()); + Assert.assertEquals("validator tokens should be 123e8", validator.getTokens(), 12300000000L); + Assert.assertEquals("validator description should be equal", validator.getDescription().getMoniker(), "node1"); + Assert.assertEquals("validator rate should be equal", validator.getCommission().getRate(), 1); + Assert.assertEquals("validator consensusPubKey should be equal", new String(validator.getConsPubKey()), consensusPubKey); + + // edit validator todo + String consensusPubKey2 = genPubKey(); +// this.editBeaconChainValidator(validator0, consensusPubKey2); + + // check edit validator change +// validator = nodeClient.getValidator(validator0.getAddress()); +// logger.info(String.format("query validator: %s \n", validator)); +// Assert.assertNotNull("validator should not be nil", validator); +// Assert.assertEquals("validator address should be equal", validator.getFeeAddr(), validator0.getAddress()); +// Assert.assertEquals("validator tokens should be 123e8", validator.getTokens(), 12300000000L); +// Assert.assertEquals("validator description should be equal", validator.getDescription().getMoniker(), "node1_v2"); +// Assert.assertEquals("validator rate should be equal", validator.getCommission().getRate(), 1); +// Assert.assertEquals("validator consensusPubKey should be equal", new String(validator.getConsPubKey()), consensusPubKey2); + long tokenBeforeDelegate = validator.getTokens(); + + // delegate + Wallet delegator = this.genWalletWithBNB(bob); + String delegatorValAddr = Crypto.getAddressFromPrivateKey(delegator.getPrivateKey(), env.getValHrp()); + long delegateAmount = 500000000L; + this.beaconChainDelegate(delegator, validator0.getAddress(), delegateAmount); + + // check delegation + validator = nodeClient.getValidator(validator0.getAddress()); + logger.info(String.format("query validator: %s \n", validator)); + long tokenAfterDelegate = validator.getTokens(); + Assert.assertEquals("delegate tokens should be equal", tokenAfterDelegate - tokenBeforeDelegate, delegateAmount); + + // query delegation + Delegation delegationQuery = nodeClient.getDelegation(delegator.getAddress(), validator0ValAddr); + logger.info(String.format("query delegation: %s \n", delegationQuery)); + Assert.assertEquals("delegation shares should be equal", delegationQuery.getDelegation().getShares(), delegateAmount); + + // query delegations + List delegations = nodeClient.getDelegations(delegator.getAddress()); + logger.info(String.format("query delegations: %s \n", delegations)); + + // check redelegate preparation + String topValAddr = topValidator.getOperatorAddr(); + Validator topValidatorBeforeRedelegate = nodeClient.getValidator(topValAddr); + logger.info(String.format("top validator before redelegate: %s \n", topValidatorBeforeRedelegate)); + + // redelegate from validator0 to top validator, should success immediately + long redelegateAmount = 200000000L; + this.beaconChainRedelegate(delegator, validator0.getAddress(), topValAddr, redelegateAmount); + Validator topValidatorAfterRedelegate = nodeClient.getValidator(topValAddr); + logger.info(String.format("top validator after redelegate: %s \n", topValidatorAfterRedelegate)); + Assert.assertEquals("redelegate tokens should be equal", topValidatorAfterRedelegate.getTokens() - topValidatorBeforeRedelegate.getTokens(), redelegateAmount); + + // undelegate + this.beaconChainUndelegate(delegator, topValAddr, redelegateAmount); + Validator topValidatorAfterUndelegate = nodeClient.getValidator(topValAddr); + logger.info(String.format("top validator after undelegate: %s \n", topValidatorAfterUndelegate)); + Assert.assertEquals("check undelegation token change", topValidatorAfterUndelegate.getTokens(), topValidatorBeforeRedelegate.getTokens()); + + // query pool + Pool pool = nodeClient.getPool(); + logger.info(String.format("pool: %s \n", pool)); + + // query unbonding delegation + UnBondingDelegation unbondingDelegation = nodeClient.getUnBondingDelegation(delegator.getAddress(), topValAddr); + logger.info(String.format("query unbonding delegation: %s \n", unbondingDelegation)); + + // query unbonding delegations + List unbondingDelegations = nodeClient.getUnBondingDelegations(delegator.getAddress()); + logger.info(String.format("query unbonding delegations: %s \n", unbondingDelegations)); + + // query unbonding delegations by validator + List unbondingDelegationsByValidator = nodeClient.getUnBondingDelegationsByValidator(topValAddr); + logger.info(String.format("query unbonding delegations by validator: %s \n", unbondingDelegationsByValidator)); + + // delegate to top validator and then redelegate + Wallet delegator0 = genWalletWithBNB(bob); + this.beaconChainDelegate(delegator0, topValAddr, delegateAmount); + logger.info(String.format("dest validator: %s \n", topValAddr)); + logger.info(String.format("validator0 val address: %s \n", validator0.getAddress())); + logger.info(String.format("delegator address: %s \n", delegator0.getAddress())); + + this.beaconChainRedelegate(delegator0, topValAddr, validator0.getAddress(), delegateAmount); + + // query redelegation + Redelegation redelegation = nodeClient.getRedelegation(delegator0.getAddress(), topValAddr, validator0ValAddr); + logger.info(String.format("query redelegation: %s \n", redelegation)); + Assert.assertNotNull("redelegation should not be nil", redelegation); + + // query redelegations + List redelegations = nodeClient.getRedelegations(delegator0.getAddress()); + logger.info(String.format("query redelegations: %s \n", redelegations)); + Assert.assertTrue("redelegations should not be empty", redelegations.size() > 0); + + // query redelegations by source validator + List redelegationsByValidator = nodeClient.getRedelegationsByValidator(topValAddr); + logger.info(String.format("query redelegations by validator: %s \n", redelegationsByValidator)); + Assert.assertTrue("redelegations by validator should not be empty", redelegationsByValidator.size() > 0); + + + logger.info("-------------------- end staking test -------------------"); + } + + + public void createBeaconChainValidator(Wallet wallet, String pubKey) throws IOException, NoSuchAlgorithmException { + CreateBeaconChainValidator createBeaconChainValidator = new CreateBeaconChainValidator(); + + //create and set description + Description validatorDescription = new Description(); + validatorDescription.setMoniker("node1"); + validatorDescription.setIdentity("rose id"); + validatorDescription.setWebsite("https://www.rose.com"); + validatorDescription.setDetails("This is rose validator"); + + createBeaconChainValidator.setDescription(validatorDescription); + + //create and set commission + Commission commission = new Commission(); + commission.setRate(1); + commission.setMaxRate(1); + commission.setMaxChangeRate(1); + + createBeaconChainValidator.setCommission(commission); + + //set delegator address, here use self address + createBeaconChainValidator.setDelegatorAddr(wallet.getAddress()); + + //set delegation token, here use 1000000 BNB + Token delegationToken = new Token(); + delegationToken.setDenom("BNB"); + delegationToken.setAmount(12300000000L); + createBeaconChainValidator.setDelegation(delegationToken); + + + createBeaconChainValidator.setPubKey(pubKey); + + TransactionOption options = new TransactionOption("", 0, null); + + List transactionMetadatas = nodeClient.createValidator(createBeaconChainValidator, wallet, options, true); + logger.info(String.format("create validator res %s \n", transactionMetadatas)); + Assert.assertEquals(1, transactionMetadatas.size()); + Assert.assertEquals(0, transactionMetadatas.get(0).getCode()); + } + + + public void editBeaconChainValidator(Wallet wallet, String pubKey) throws IOException, NoSuchAlgorithmException { + EditBeaconChainValidator editBeaconChainValidator = new EditBeaconChainValidator(); + + //set new description if needed + Description validatorDescription = new Description(); + validatorDescription.setMoniker("node1_v2"); + + editBeaconChainValidator.setDescription(validatorDescription); + +// editBeaconChainValidator.setCommissionRate(1L); + + editBeaconChainValidator.setPubKey(pubKey); + + List transactionMetadatas = nodeClient.editValidator(editBeaconChainValidator, wallet, createTransactionOptionForTest(), true); + logger.info(String.format("edit validator res %s \n", transactionMetadatas)); + Assert.assertEquals(1, transactionMetadatas.size()); + Assert.assertEquals(0, transactionMetadatas.get(0).getCode()); + } + + public void beaconChainDelegate(Wallet wallet, String validatorAddress, Long amount) throws IOException, NoSuchAlgorithmException { + BeaconChainDelegate beaconChainDelegate = new BeaconChainDelegate(); + + //set delegate token + Token delegation = new Token("BNB", amount); + beaconChainDelegate.setDelegation(delegation); + + //set delegator address, here is self + beaconChainDelegate.setDelegatorAddress(wallet.getAddress()); + + //set validator address + beaconChainDelegate.setValidatorAddress(validatorAddress); + + + List transactionMetadatas = nodeClient.delegate(beaconChainDelegate, wallet, createTransactionOptionForTest(), true); + logger.info(String.format("delegate validator res %s \n", transactionMetadatas)); + Assert.assertEquals(1, transactionMetadatas.size()); + Assert.assertEquals(0, transactionMetadatas.get(0).getCode()); + } + + public void beaconChainRedelegate(Wallet wallet, String srcValidatorAddress, String dstValidatorAddress, Long amount) throws IOException, NoSuchAlgorithmException { + BeaconChainRedelegate redelegate = new BeaconChainRedelegate(); + + //set redelegate amount + redelegate.setAmount(new Token("bnb".toUpperCase(), amount)); + + //set delegator address + redelegate.setDelegatorAddress(wallet.getAddress()); + + //set source validator address + redelegate.setSrcValidatorAddress(srcValidatorAddress); + + //set destination validator address + redelegate.setDstValidatorAddress(dstValidatorAddress); + + List transactionMetadatas = nodeClient.redelegate(redelegate, wallet, createTransactionOptionForTest(), true); + logger.info(String.format("redelegate res %s \n", transactionMetadatas)); + Assert.assertEquals(1, transactionMetadatas.size()); + Assert.assertEquals(0, transactionMetadatas.get(0).getCode()); + } + + public void beaconChainUndelegate(Wallet wallet, String validatorAddress, Long amount) throws IOException, NoSuchAlgorithmException { + BeaconChainUndelegate beaconChainUndelegate = new BeaconChainUndelegate(); + + //set unbond amount + beaconChainUndelegate.setAmount(new Token("BNB", amount)); + + //set delegator address + beaconChainUndelegate.setDelegatorAddress(wallet.getAddress()); + + //set validator address + beaconChainUndelegate.setValidatorAddress(validatorAddress); + + + List transactionMetadatas = nodeClient.undelegate(beaconChainUndelegate, wallet, createTransactionOptionForTest(), true); + logger.info(String.format("undelegate res %s \n", transactionMetadatas)); + Assert.assertEquals(1, transactionMetadatas.size()); + Assert.assertEquals(0, transactionMetadatas.get(0).getCode()); + } + + /** + * Create a transaction option for test + * + * @return TransactionOption + */ + private TransactionOption createTransactionOptionForTest() { + return new TransactionOption("", 0, null); + } + +} diff --git a/src/test/java/com/binance/dex/api/client/examples/BinanceDexWSApiExample.java b/src/test/java/com/binance/dex/api/client/examples/BinanceDexWSApiExample.java index b0406171..f85465cb 100644 --- a/src/test/java/com/binance/dex/api/client/examples/BinanceDexWSApiExample.java +++ b/src/test/java/com/binance/dex/api/client/examples/BinanceDexWSApiExample.java @@ -54,9 +54,9 @@ public void testNetInfo(){ @Test public void testBlockByHeight() { - BlockMeta.BlockMetaResult result = binanceDexWSApi.blockByHeight(13513018L); + BlockMeta.BlockMetaResult result = binanceDexWSApi.blockByHeight(18L); Assert.assertNotNull(result); - Assert.assertEquals(13513018L,result.getBlockMeta().getHeader().getHeight().longValue()); + Assert.assertEquals(18L,result.getBlockMeta().getHeader().getHeight().longValue()); } @Test diff --git a/src/test/java/com/binance/dex/api/client/examples/BridgeNodeExample.java b/src/test/java/com/binance/dex/api/client/examples/BridgeNodeExample.java new file mode 100644 index 00000000..8fc2a961 --- /dev/null +++ b/src/test/java/com/binance/dex/api/client/examples/BridgeNodeExample.java @@ -0,0 +1,142 @@ +package com.binance.dex.api.client.examples; + +import com.binance.dex.api.client.BinanceDexApiClientFactory; +import com.binance.dex.api.client.BinanceDexApiNodeClient; +import com.binance.dex.api.client.BinanceDexEnvironment; +import com.binance.dex.api.client.Wallet; +import com.binance.dex.api.client.crosschain.Package; +import com.binance.dex.api.client.domain.TransactionMetadata; +import com.binance.dex.api.client.domain.bridge.TransferIn; +import com.binance.dex.api.client.domain.broadcast.Transaction; +import com.binance.dex.api.client.domain.broadcast.TransactionOption; +import com.binance.dex.api.client.domain.oracle.ClaimMsg; +import com.binance.dex.api.client.domain.oracle.Prophecy; +import com.binance.dex.api.client.encoding.EncodeUtils; +import com.binance.dex.api.client.encoding.message.Token; +import com.binance.dex.api.client.encoding.message.bridge.BindStatus; +import com.binance.dex.api.client.encoding.message.bridge.ClaimMsgMessage; +import com.binance.dex.api.client.encoding.message.bridge.ClaimTypes; +import com.binance.dex.api.client.encoding.message.bridge.RefundReason; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.apache.commons.codec.binary.Hex; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author Fitz.Lu + **/ +public class BridgeNodeExample { + + private BinanceDexApiNodeClient nodeClient = null; + private Wallet wallet = null; + + @Before + public void setup() throws IOException { + nodeClient = BinanceDexApiClientFactory.newInstance().newNodeRpcClient("http://dex-qa-s1-bsc-dev-validator-alb-501442930.ap-northeast-1.elb.amazonaws.com:27147",BinanceDexEnvironment.TEST_NET.getHrp(), BinanceDexEnvironment.TEST_NET.getValHrp()); + String mnemonic = "ten spring excite fluid pizza amused goat equal language cinnamon change drive alien second table onion obscure culture void science renew scrub capable wet"; + wallet = Wallet.createWalletFromMnemonicCode(Arrays.asList(mnemonic.split(" ")), BinanceDexEnvironment.TEST_NET); + } + + @Test + public void t() throws JsonProcessingException { + System.out.println(); + Transaction transaction = nodeClient.getTransaction("0757F090A88F99436A6E1B138EA5ED1A5F2A8CC46BF03912F663119A5924DF62"); + ClaimMsg msg = (ClaimMsg)transaction.getRealTx(); + List packages = msg.getPayload(); + System.out.println(EncodeUtils.toJsonStringSortKeys(packages)); + + System.out.println(); + + transaction = nodeClient.getTransaction("59619D76EAB7B5D3FCE17589B6735869A49B77B5A059168731EA31ACE5A3119D"); + msg = (ClaimMsg)transaction.getRealTx(); + packages = msg.getPayload(); + System.out.println(EncodeUtils.toJsonStringSortKeys(packages)); + + System.out.println(); + + transaction = nodeClient.getTransaction("35568AB9D81409A54B38C11924C8B3BB374B8A57A4FF2070EF71BB393E94EE02"); + msg = (ClaimMsg)transaction.getRealTx(); + packages = msg.getPayload(); + System.out.println(EncodeUtils.toJsonStringSortKeys(packages)); + + System.out.println(); + + transaction = nodeClient.getTransaction("29FE859C0B40F73996346FBD9261B4F8B28C8381F13F3D3DCAE87ED3C6EE0A72"); + msg = (ClaimMsg)transaction.getRealTx(); + packages = msg.getPayload(); + System.out.println(EncodeUtils.toJsonStringSortKeys(packages)); + + System.out.println(); + + transaction = nodeClient.getTransaction("362BA6ACD9A831AC30D1C83AAD02F954C38940DCB91610DA4EA43CF7DCEAE0EA"); + msg = (ClaimMsg)transaction.getRealTx(); + packages = msg.getPayload(); + System.out.println(EncodeUtils.toJsonStringSortKeys(packages)); + } + + @Test + public void transferOut() throws IOException, NoSuchAlgorithmException { + String toAddress = "0x9fB29AAc15b9A4B7F17c3385939b007540f4d791"; + Token token = new Token("BNB", 100000L); + long expireTime = System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 3; + + TransactionOption options = new TransactionOption("", 0, null); + + List results = nodeClient.transferOut(toAddress, token, expireTime / 1000, wallet, options, true); + Assert.assertEquals(1, results.size()); + } + + @Test + public void bind() throws IOException, NoSuchAlgorithmException { + String symbol = "BNB"; + long amount = 1000000L; + String contractAddress = "0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"; + int contractDecimal = 2; + long expireTime = System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 3; + + TransactionOption options = new TransactionOption("", 0, null); + + List results = nodeClient.bind(symbol, amount, contractAddress, contractDecimal, expireTime / 1000, wallet, options, true); + Assert.assertEquals(1, results.size()); + } + + @Test + public void unBind() throws IOException, NoSuchAlgorithmException { + String symbol = "ABC-196"; + TransactionOption options = new TransactionOption("", 0, null); + List results = nodeClient.unBind(symbol, wallet, options, true); + System.out.println(EncodeUtils.toJsonStringSortKeys(results)); + Assert.assertEquals(1, results.size()); + Assert.assertTrue(results.get(0).isOk()); + } + + @Test + public void claim() throws IOException, NoSuchAlgorithmException { + TransactionOption options = new TransactionOption("", 0, null); + List results = nodeClient.claim(2, "test claim message message message message message".getBytes(), 0, wallet, options, true); + Assert.assertEquals(1, results.size()); + Assert.assertTrue(results.get(0).isOk()); + } + + @Test + public void getProphecy() throws IOException { + Prophecy prophecy = nodeClient.getProphecy(ClaimTypes.ClaimTypeTransferIn, 1); + if (prophecy != null){ + Assert.assertNotNull(prophecy.getClaimValidators()); + } + } + + @Test + public void getCurrentSequence(){ + long sequence = nodeClient.getCurrentSequence(ClaimTypes.ClaimTypeTransferIn); + Assert.assertTrue(sequence >= 0); + } + +} diff --git a/src/test/java/com/binance/dex/api/client/examples/NodeClientExample.java b/src/test/java/com/binance/dex/api/client/examples/NodeClientExample.java index 2c20c8af..ad1440fc 100644 --- a/src/test/java/com/binance/dex/api/client/examples/NodeClientExample.java +++ b/src/test/java/com/binance/dex/api/client/examples/NodeClientExample.java @@ -1,6 +1,5 @@ package com.binance.dex.api.client.examples; - import com.binance.dex.api.client.BinanceDexApiClientFactory; import com.binance.dex.api.client.BinanceDexApiNodeClient; import com.binance.dex.api.client.BinanceDexEnvironment; @@ -28,7 +27,7 @@ public class NodeClientExample { @Before public void setup() { - binanceDexNodeApi = BinanceDexApiClientFactory.newInstance().newNodeRpcClient(BinanceDexEnvironment.TEST_NET.getNodeUrl(),BinanceDexEnvironment.TEST_NET.getHrp()); + binanceDexNodeApi = BinanceDexApiClientFactory.newInstance().newNodeRpcClient(BinanceDexEnvironment.PROD.getNodeUrl(), BinanceDexEnvironment.PROD.getHrp(), BinanceDexEnvironment.PROD.getValHrp()); } @Test @@ -39,7 +38,7 @@ public void testAccount() { } @Test - public void testCommittedAccount(){ + public void testCommittedAccount() { String address = "tbnb16hywxpvvkaz6cecjz89mf2w0da3vfeg6z6yky2"; Account account = binanceDexNodeApi.getCommittedAccount(address); Assert.assertEquals(address, account.getAddress()); @@ -47,10 +46,37 @@ public void testCommittedAccount(){ @Test public void testBlockTransactions() { + //Mini Issue + Long height = 87908207L; + List transactions = binanceDexNodeApi.getBlockTransactions(height); + Assert.assertNotNull(transactions); + Assert.assertTrue(transactions.size() == 1); + Assert.assertEquals(transactions.get(0).getTxType(), TxType.MINI_TOKEN_ISSUE); + + //Tiny Issue + height = 86888933L; + transactions = binanceDexNodeApi.getBlockTransactions(height); + Assert.assertNotNull(transactions); + Assert.assertTrue(transactions.size() == 1); + Assert.assertEquals(transactions.get(0).getTxType(), TxType.TINY_TOKEN_ISSUE); + + //List Mini + height = 86890587L; + transactions = binanceDexNodeApi.getBlockTransactions(height); + Assert.assertNotNull(transactions); + Assert.assertTrue(transactions.size() == 1); + Assert.assertEquals(transactions.get(0).getTxType(), TxType.MINI_TOKEN_LIST); + + //Set token uri + height = 86881980L; + transactions = binanceDexNodeApi.getBlockTransactions(height); + Assert.assertNotNull(transactions); + Assert.assertTrue(transactions.size() == 1); + Assert.assertEquals(transactions.get(0).getTxType(), TxType.MINI_TOKEN_SET_URI); //Transfer - Long height = 33896036L; - List transactions = binanceDexNodeApi.getBlockTransactions(height); + height = 33896036L; + transactions = binanceDexNodeApi.getBlockTransactions(height); Assert.assertNotNull(transactions); Assert.assertTrue(transactions.size() == 1); Assert.assertEquals(transactions.get(0).getTxType(), TxType.TRANSFER); @@ -205,9 +231,9 @@ public void testNodeInfo() { @Test public void testGetTransaction() { - Transaction transaction = binanceDexNodeApi.getTransaction("A1D07086EC08E983A47157FEACC1CF42179C37FCCDD56E7A4460CD1E4C82E51F"); + Transaction transaction = binanceDexNodeApi.getTransaction("1218DC0B64E3A128790AD8697CC9EC19F840D1D4202A5FA6EC64C4424793F5F0"); Assert.assertNotNull(transaction); - Assert.assertEquals("A1D07086EC08E983A47157FEACC1CF42179C37FCCDD56E7A4460CD1E4C82E51F", transaction.getHash()); + Assert.assertEquals("1218DC0B64E3A128790AD8697CC9EC19F840D1D4202A5FA6EC64C4424793F5F0", transaction.getHash()); Assert.assertEquals(0, transaction.getCode().intValue()); } @@ -226,10 +252,17 @@ public void testGetBlockMetaByHash() { } @Test - public void testGetTokenInfoBySymbol(){ + public void testGetTokenInfoBySymbol() { Token token = binanceDexNodeApi.getTokenInfoBySymbol("BNB"); Assert.assertNotNull(token); - Assert.assertEquals("BNB",token.getSymbol()); + Assert.assertEquals("BNB", token.getSymbol()); + } + + @Test + public void testGetMiniTokenInfoBySymbol() { + MiniToken token = binanceDexNodeApi.getMiniTokenInfoBySymbol("TTT-873M"); + Assert.assertNotNull(token); + Assert.assertEquals("TTT-873M", token.getSymbol()); } @Test @@ -247,8 +280,28 @@ public void testStakeValidator() { } @Test - public void testGetProposalById(){ + public void testGetProposalById() { Proposal proposal = binanceDexNodeApi.getProposalById("1"); - Assert.assertEquals("1",proposal.getValue().getProposalId()); + Assert.assertEquals("1", proposal.getValue().getProposalId()); + } + + @Test + public void testGetSideProposalById() { + Proposal proposal = binanceDexNodeApi.getSideProposalById("4", "rialto"); + Assert.assertEquals("4", proposal.getValue().getProposalId()); + } + + @Test + public void testCreateSidechainValidatorWithVoteAddr() { + Transaction transaction = binanceDexNodeApi.getTransaction("7A6A818048DBE4330BC72DD169F684F2E51E8780185A140E1F1B0AF5414EA48A"); + Assert.assertNotNull(transaction); + Assert.assertEquals(transaction.getTxType(), TxType.CREATE_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR); + } + + @Test + public void testEditSidechainValidatorWithVoteAddr() { + Transaction transaction = binanceDexNodeApi.getTransaction("30A5699E193929FB04F1D6C151303ABAA4E9D51CC1F718A9E8BD4E086DFDE305"); + Assert.assertNotNull(transaction); + Assert.assertEquals(transaction.getTxType(), TxType.EDIT_SIDECHAIN_VALIDATOR_WITH_VOTE_ADDR); } } diff --git a/src/test/java/com/binance/dex/api/client/examples/SideChainStakingNodeExample.java b/src/test/java/com/binance/dex/api/client/examples/SideChainStakingNodeExample.java new file mode 100644 index 00000000..21d28720 --- /dev/null +++ b/src/test/java/com/binance/dex/api/client/examples/SideChainStakingNodeExample.java @@ -0,0 +1,281 @@ +package com.binance.dex.api.client.examples; + +import com.binance.dex.api.client.BinanceDexApiClientFactory; +import com.binance.dex.api.client.BinanceDexApiNodeClient; +import com.binance.dex.api.client.BinanceDexEnvironment; +import com.binance.dex.api.client.Wallet; +import com.binance.dex.api.client.domain.TransactionMetadata; +import com.binance.dex.api.client.domain.broadcast.*; +import com.binance.dex.api.client.domain.stake.Commission; +import com.binance.dex.api.client.domain.stake.Description; +import com.binance.dex.api.client.domain.stake.Pool; +import com.binance.dex.api.client.domain.stake.Delegation; +import com.binance.dex.api.client.domain.stake.Redelegation; +import com.binance.dex.api.client.domain.stake.UnBondingDelegation; +import com.binance.dex.api.client.domain.stake.Validator; +import com.binance.dex.api.client.domain.stake.sidechain.*; +import com.binance.dex.api.client.encoding.message.*; +import com.binance.dex.api.client.encoding.message.sidechain.SideChainIds; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +/** + * @author Fitz.Lu + **/ +public class SideChainStakingNodeExample { + + private BinanceDexApiNodeClient nodeClient = null; + + private String jackPrivKey = "bce1c934173e84cb4a0abf06b371f7568d3c4686da8f3ea7e1e8d230ae681920"; + private String rosePrivKey = "50111155e4d9adca98c3f9318e896aedeac7fbec8c9f416af076ff042c56b4c5"; + private String markPrivKey = "68931b8fe68ebec5b8fe81420b8de3d47f4ad1dd01619c7e0c93ce9c3a0e3d22"; + + private String jackValidator = "bva1lrzg56jhtkqu7fmca3394vdx00r7apx4gjdzy2"; + private String roseValidator = "bva1rxnydtfjccaz2tck7wrentntdylrnnqzmspush"; + + private final Wallet wallet = new Wallet(markPrivKey, BinanceDexEnvironment.PROD); + + @Before + public void setup() { + nodeClient = BinanceDexApiClientFactory.newInstance().newNodeRpcClient(BinanceDexEnvironment.TEST_NET.getNodeUrl() + ,BinanceDexEnvironment.TEST_NET.getHrp(), BinanceDexEnvironment.TEST_NET.getValHrp()); + } + + @Test + public void testCreateSideChainValidator() throws IOException, NoSuchAlgorithmException { + CreateSideChainValidator createSideChainValidator = new CreateSideChainValidator(); + + //create and set description + Description validatorDescription = new Description(); + validatorDescription.setMoniker("rose-moniker"); + validatorDescription.setIdentity("rose id"); + validatorDescription.setWebsite("https://www.rose.com"); + validatorDescription.setDetails("This is rose validator"); + + createSideChainValidator.setDescription(validatorDescription); + + //create and set commission + Commission commission = new Commission(); + commission.setRate(5L); + commission.setMaxRate(1000L); + commission.setMaxChangeRate(10L); + + createSideChainValidator.setCommission(commission); + + //set delegator address, here use self address + createSideChainValidator.setDelegatorAddr(wallet.getAddress()); + + //set delegation token, here use 1000000 BNB + Token delegationToken = new Token(); + delegationToken.setDenom("BNB"); + delegationToken.setAmount(1000000000000L); + createSideChainValidator.setDelegation(delegationToken); + + //set side-chain id + createSideChainValidator.setSideChainId(SideChainIds.RIALTO); + + //set side-chain validator cons address + createSideChainValidator.setSideConsAddr("0x9fB29AAc15b9A4B7F17c3385939b007540f4d791"); + + //set side-chain validator fee address + createSideChainValidator.setSideFeeAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"); + + TransactionOption options = new TransactionOption("", 0, null); + + List transactionMetadatas = nodeClient.createSideChainValidator(createSideChainValidator, wallet, options, true); + Assert.assertEquals(1, transactionMetadatas.size()); + } + + @Test + public void testEditSideChainValidator() throws IOException, NoSuchAlgorithmException { + EditSideChainValidator editSideChainValidator = new EditSideChainValidator(); + + //set new description if needed + Description description = new Description(); + description.setMoniker("new Moniker"); + editSideChainValidator.setDescription(description); + + //set new rate if needed + editSideChainValidator.setCommissionRate(1L); + + //set new fee address if needed + editSideChainValidator.setSideFeeAddr("0xd1B22dCC24C55f4d728E7aaA5c9b5a22e1512C08"); + + editSideChainValidator.setSideChainId(SideChainIds.RIALTO); + + List transactionMetadatas = nodeClient.editSideChainValidator(editSideChainValidator, wallet, createTransactionOptionForTest(), true); + Assert.assertEquals(1, transactionMetadatas.size()); + } + + @Test + public void testSideChainDelegate() throws IOException, NoSuchAlgorithmException { + SideChainDelegate sideChainDelegate = new SideChainDelegate(); + + //set delegate token + Token delegation = new Token("BNB", 123456700L); + sideChainDelegate.setDelegation(delegation); + + //set delegator address, here is self + sideChainDelegate.setDelegatorAddress(wallet.getAddress()); + + //set validator address + sideChainDelegate.setValidatorAddress(roseValidator); + + //set side-chain id + sideChainDelegate.setSideChainId(SideChainIds.RIALTO); + + List transactionMetadatas = nodeClient.sideChainDelegate(sideChainDelegate, wallet, createTransactionOptionForTest(), true); + Assert.assertEquals(1, transactionMetadatas.size()); + } + + @Test + public void testSideChainRedelegate() throws IOException, NoSuchAlgorithmException { + SideChainRedelegate redelegate = new SideChainRedelegate(); + + //set redelegate amount + redelegate.setAmount(new Token("bnb".toUpperCase(), 100000000L)); + + //set delegator address + redelegate.setDelegatorAddress(wallet.getAddress()); + + //set source validator address + redelegate.setSrcValidatorAddress(jackValidator); + + //set destination validator address + redelegate.setDstValidatorAddress(roseValidator); + + //set side-chain id + redelegate.setSideChainId(SideChainIds.RIALTO); + + List transactionMetadatas = nodeClient.sideChainRedelagate(redelegate, wallet, createTransactionOptionForTest(), true); + Assert.assertEquals(1, transactionMetadatas.size()); + } + + @Test + public void testSideChainUnbond() throws IOException, NoSuchAlgorithmException { + SideChainUnBond sideChainUndelegate = new SideChainUnBond(); + + //set unbond amount + sideChainUndelegate.setAmount(new Token("BNB", 1000L)); + + //set delegator address + sideChainUndelegate.setDelegatorAddress(wallet.getAddress()); + + //set validator address + sideChainUndelegate.setValidatorAddress(jackValidator); + + //set side-chain id + sideChainUndelegate.setSideChainId(SideChainIds.RIALTO); + + List transactionMetadatas = nodeClient.sideChainUnbond(sideChainUndelegate, wallet, createTransactionOptionForTest(), true); + Assert.assertEquals(1, transactionMetadatas.size()); + } + + @Test + public void testGetSideChainValidator() throws IOException { + Validator validator = nodeClient.getSideChainValidator(SideChainIds.RIALTO, jackValidator); + if (validator != null){ + Assert.assertNotNull(validator.getOperatorAddr()); + } + } + + @Test + public void testGetSideChainTopValidators() throws IOException { + List validators = nodeClient.getSideChainTopValidators(SideChainIds.RIALTO, 5); + Assert.assertNotNull(validators); + } + + @Test + public void testGetSideChainDelegation() throws IOException { + Delegation delegation = nodeClient.getSideChainDelegation(SideChainIds.RIALTO, wallet.getAddress(), roseValidator); + if (delegation != null) { + Assert.assertNotNull(delegation.getDelegation()); + Assert.assertNotNull(delegation.getBalance()); + } + } + + @Test + public void testGetSideChainDelegations() throws IOException { + List delegations = nodeClient.getSideChainDelegations(SideChainIds.RIALTO, wallet.getAddress()); + Assert.assertNotNull(delegations); + } + + @Test + public void getSideChainRedelegation() throws IOException { + Redelegation redelegation = nodeClient.getSideChainRedelegation(SideChainIds.RIALTO, wallet.getAddress(), jackValidator, roseValidator); + if (redelegation != null) { + Assert.assertNotNull(redelegation.getDelegatorAddress()); + } + } + + @Test + public void getSideChainRedelegations() throws IOException { + List redelegations = nodeClient.getSideChainRedelegations(SideChainIds.RIALTO, wallet.getAddress()); + Assert.assertNotNull(redelegations); + } + + @Test + public void getSideChainUnBondingDelegation() throws IOException { + UnBondingDelegation unBondingDelegation = nodeClient.getSideChainUnBondingDelegation(SideChainIds.RIALTO, wallet.getAddress(), jackValidator); + if (unBondingDelegation != null) { + Assert.assertNotNull(unBondingDelegation.getDelegatorAddress()); + } + } + + @Test + public void getSideChainUnBondingDelegations() throws IOException { + List unBondingDelegations = nodeClient.getSideChainUnBondingDelegations(SideChainIds.RIALTO, wallet.getAddress()); + Assert.assertNotNull(unBondingDelegations); + } + + @Test + public void testGetSideChainUnBondingDelegationsByValidator() throws IOException { + List unBondingDelegations = nodeClient.getSideChainUnBondingDelegationsByValidator(SideChainIds.RIALTO, jackValidator); + Assert.assertNotNull(unBondingDelegations); + } + + @Test + public void testGetSideChainRedelegationsByValidator() throws IOException { + List redelegations = nodeClient.getSideChainRedelegationsByValidator(SideChainIds.RIALTO, jackValidator); + Assert.assertNotNull(redelegations); + } + + @Test + public void testGetSideChainPool() throws IOException { + Pool pool = nodeClient.getSideChainPool(SideChainIds.RIALTO); + if (pool != null){ + Assert.assertTrue(pool.getBondedTokens() >= 0L); + } + } + + @Test + public void testGetSideChainValidatorsCount() throws IOException { + long count = nodeClient.getAllSideChainValidatorsCount(SideChainIds.RIALTO, false); + Assert.assertTrue(count >= 0); + } + + /** + * Print message to console for debug, call + * its toString() method. + * + * @param message the specify message object + * */ + private void consolePrintln(Object message){ + System.out.println(message.toString()); + } + + /** + * Create a transaction option for test + * + * @return TransactionOption + * */ + private TransactionOption createTransactionOptionForTest(){ + return new TransactionOption("", 0, null); + } + +} diff --git a/src/test/java/com/binance/dex/api/client/examples/SideVoteExample.java b/src/test/java/com/binance/dex/api/client/examples/SideVoteExample.java new file mode 100644 index 00000000..c667dcc0 --- /dev/null +++ b/src/test/java/com/binance/dex/api/client/examples/SideVoteExample.java @@ -0,0 +1,31 @@ +package com.binance.dex.api.client.examples; + +import java.io.IOException; +import java.util.List; + +import com.binance.dex.api.client.*; +import com.binance.dex.api.client.domain.TransactionMetadata; +import com.binance.dex.api.client.domain.broadcast.SideVote; +import com.binance.dex.api.client.domain.broadcast.TransactionOption; + +public class SideVoteExample { + + public static void main(String[] args) throws IOException { + Wallet wallet = Wallet.createRandomWallet(BinanceDexEnvironment.TEST_NET); + BinanceDexApiNodeClient binanceDexNodeApi = BinanceDexApiClientFactory.newInstance().newNodeRpcClient(BinanceDexEnvironment.TEST_NET.getNodeUrl(),BinanceDexEnvironment.TEST_NET.getHrp(), BinanceDexEnvironment.TEST_NET.getValHrp()); + + + TransactionOption options = TransactionOption.DEFAULT_INSTANCE; + SideVote vote = new SideVote(); + vote.setOption(1); + vote.setProposalId(2L); + vote.setSideChainId("rialto"); + try{ + List resp = binanceDexNodeApi.sideVote(vote,wallet,options,true); + System.out.println(resp.get(0)); + }catch (Exception e){ + e.printStackTrace(); + } + } + +} diff --git a/src/test/java/com/binance/dex/api/client/examples/TransactionExample.java b/src/test/java/com/binance/dex/api/client/examples/TransactionExample.java new file mode 100644 index 00000000..2644797f --- /dev/null +++ b/src/test/java/com/binance/dex/api/client/examples/TransactionExample.java @@ -0,0 +1,42 @@ +package com.binance.dex.api.client.examples; + +import com.binance.dex.api.client.BinanceDexApiClientFactory; +import com.binance.dex.api.client.BinanceDexApiRestClient; +import com.binance.dex.api.client.BinanceDexEnvironment; +import com.binance.dex.api.client.domain.TransactionPage; +import com.binance.dex.api.client.domain.TransactionPageV2; +import com.binance.dex.api.client.domain.request.TransactionsRequest; +import com.binance.dex.api.client.utils.converter.TransactionConverterFactory; + +public class TransactionExample { + public static void main(String[] args) { + BinanceDexApiRestClient client = + BinanceDexApiClientFactory.newInstance().newRestClient(BinanceDexEnvironment.TEST_NET.getBaseUrl()); + + //Get transactions in last 24 hours + TransactionPageV2 transactions = client.getTransactions("tbnb135mqtf9gef879nmjlpwz6u2fzqcw4qlzrqwgvw"); + System.out.println(transactions); + + //Get transactions by criteria + //Refer to this for more: https://docs.binance.org/api-reference/dex-api/block-service.html#apiv1txs + TransactionsRequest request = new TransactionsRequest(); + request.setStartTime(1629272621945L); + request.setEndTime(1629359021945L); + request.setType("ORACLE_CLAIM"); + request.setAddress("tbnb135mqtf9gef879nmjlpwz6u2fzqcw4qlzrqwgvw"); + request.setAddressType("FROM"); + request.setOffset(5); + request.setLimit(1); + transactions = client.getTransactions(request); + System.out.println(transactions); + + //Get transaction a block + transactions = client.getTransactionsInBlock(15759101); + System.out.println(transactions); + + //Convert transaction to previous models + TransactionConverterFactory converterFactory = new TransactionConverterFactory(); + TransactionPage transactionPage = converterFactory.convert(transactions); + System.out.println(transactionPage); + } +} diff --git a/src/test/java/com/binance/dex/api/client/examples/TransactionExampleAsync.java b/src/test/java/com/binance/dex/api/client/examples/TransactionExampleAsync.java new file mode 100644 index 00000000..c06f4ff7 --- /dev/null +++ b/src/test/java/com/binance/dex/api/client/examples/TransactionExampleAsync.java @@ -0,0 +1,33 @@ +package com.binance.dex.api.client.examples; + +import com.binance.dex.api.client.BinanceDexApiAsyncRestClient; +import com.binance.dex.api.client.BinanceDexApiClientFactory; +import com.binance.dex.api.client.BinanceDexApiRestClient; +import com.binance.dex.api.client.BinanceDexEnvironment; +import com.binance.dex.api.client.domain.TransactionPageV2; +import com.binance.dex.api.client.domain.request.TransactionsRequest; + +public class TransactionExampleAsync { + public static void main(String[] args) { + BinanceDexApiAsyncRestClient client = + BinanceDexApiClientFactory.newInstance().newAsyncRestClient(BinanceDexEnvironment.TEST_NET.getBaseUrl()); + + //Get transactions in last 24 hours + client.getTransactions("tbnb135mqtf9gef879nmjlpwz6u2fzqcw4qlzrqwgvw", response -> System.out.println(response)); + + //Get transactions by criteria + //Refer to this for more: https://docs.binance.org/api-reference/dex-api/block-service.html#apiv1txs + TransactionsRequest request = new TransactionsRequest(); + request.setStartTime(1629272621945L); + request.setEndTime(1629359021945L); + request.setType("ORACLE_CLAIM"); + request.setAddress("tbnb135mqtf9gef879nmjlpwz6u2fzqcw4qlzrqwgvw"); + request.setAddressType("FROM"); + request.setOffset(5); + request.setLimit(1); + client.getTransactions(request, response -> System.out.println(response)); + + //Get transaction a block + client.getTransactionsInBlock(15759101, response -> System.out.println(response)); + } +}