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 extends Content> clazz;
+
+ public static Class extends Content> 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 extends Content> 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 extends CrossStakeFailAckParamsBytes> 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 extends CrossStakeSynParamsBytes> 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