diff --git a/.gitignore b/.gitignore index 39d65ab0a1..0fde302b00 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ local.properties .idea/codeStyles # LayoutInspector files -.captures +/captures # OS-specific files .DS_Store diff --git a/app/src/main/java/com/tangem/ui/fragment/id/IdFragment.kt b/app/src/main/java/com/tangem/ui/fragment/id/IdFragment.kt index 8013e66fed..f37118f1ba 100644 --- a/app/src/main/java/com/tangem/ui/fragment/id/IdFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/id/IdFragment.kt @@ -8,6 +8,7 @@ import android.nfc.NfcAdapter import android.nfc.Tag import android.nfc.tech.IsoDep import android.os.Bundle +import android.util.Log import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -231,6 +232,8 @@ class IdFragment : BaseFragment(), NfcAdapter.ReaderCallback, mpSecondScanSound.start() } } else { + Log.d(this.javaClass.simpleName, + "Error while reading ID card: ${cardProtocol.error.localizedMessage}") // remove last UIDs because of error and no card read FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) rlProgressBar?.post { @@ -338,6 +341,7 @@ class IdFragment : BaseFragment(), NfcAdapter.ReaderCallback, validator.check(ctx, false) context?.let { ContextCompat.getColor(it, validator.color) }?.let { tvBalanceLine1?.setTextColor(it) } tvBalanceLine1?.text = getString(validator.firstLine) + tvBalanceLine2?.text = getString(validator.getSecondLine(false)).format(ctx.card.idCardData.trustedAddress) } if (ctx.card.hasIDCardData()) { diff --git a/app/src/main/java/com/tangem/ui/fragment/id/IssueNewIdFragment.kt b/app/src/main/java/com/tangem/ui/fragment/id/IssueNewIdFragment.kt index d61191457f..8418037d86 100644 --- a/app/src/main/java/com/tangem/ui/fragment/id/IssueNewIdFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/id/IssueNewIdFragment.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.os.Parcelable import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import android.widget.EditText import android.widget.RadioButton @@ -22,7 +23,6 @@ import com.tangem.wallet.ethID.EthIdEngine import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_issue_new_id.* import java.io.ByteArrayOutputStream -import java.lang.Exception import java.text.SimpleDateFormat import java.util.* @@ -54,6 +54,8 @@ class IssueNewIdFragment : BaseFragment(), NavigationResultListener { try { processData() } catch (exception: Exception) { + Log.e(this.javaClass.simpleName, + "Exception while processing data: ${exception.localizedMessage}") Toast.makeText(context, "Check for correctness of data", Toast.LENGTH_LONG).show() return@setOnClickListener } @@ -117,12 +119,15 @@ class IssueNewIdFragment : BaseFragment(), NavigationResultListener { photoInBytes, issuerExpireDate.issueDate, issuerExpireDate.expireDate, - (CoinEngineFactory.create(ctx) as? EthIdEngine)?.approvalAddress + (CoinEngineFactory.create(ctx) as? EthIdEngine)?.coinData?.approvalAddress ) val inputs = "$name $lastName;$birthDate${gender.toString()}" val info = inputs.toByteArray() + photoInBytes!! ctx.card.idHash = Util.calculateSHA256(info) + + Log.d(this.javaClass.simpleName, + "ID info provided: $inputs,\n photo of size ${photoInBytes?.size}") } private fun convertDate(inputDate: CharSequence): String { diff --git a/app/src/main/java/com/tangem/ui/fragment/id/ValidateIdFragment.kt b/app/src/main/java/com/tangem/ui/fragment/id/ValidateIdFragment.kt index 0fb2c13aa6..61019f8ab9 100644 --- a/app/src/main/java/com/tangem/ui/fragment/id/ValidateIdFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/id/ValidateIdFragment.kt @@ -8,6 +8,7 @@ import android.nfc.NfcAdapter import android.nfc.Tag import android.nfc.tech.IsoDep import android.os.Bundle +import android.util.Log import android.view.View import androidx.activity.OnBackPressedCallback import com.google.firebase.crashlytics.FirebaseCrashlytics @@ -114,6 +115,10 @@ class ValidateIdFragment : BaseFragment(), NavigationResultListener, val data = Bundle() ctx.saveToBundle(data) data.putByteArray(Constant.EXTRA_TX, tx) + + Log.d(this.javaClass.simpleName, + "Transaction is ready to be sent.") + navigateForResult( Constant.REQUEST_CODE_SEND_TRANSACTION_, R.id.action_validateIdFragment_to_writeIdFragment, @@ -161,6 +166,8 @@ class ValidateIdFragment : BaseFragment(), NavigationResultListener, } PINStorage.setPIN2(PINStorage.getDefaultPIN2()) + Log.d(this.javaClass.simpleName, + "Ready to sing transaction, launching OneTouchSignTask") signTransactionTask = OneTouchSignTask(NfcReader((activity as MainActivity).nfcManager, isoDep), App.localStorage, App.pinStorage, this@ValidateIdFragment, transaction) signTransactionTask?.start() @@ -216,6 +223,8 @@ class ValidateIdFragment : BaseFragment(), NavigationResultListener, mpFinishSignSound.start() } else { + Log.d(this.javaClass.simpleName, + "Error while signing with ID Issuer card: ${cardProtocol.error.localizedMessage}") FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) lastReadSuccess = false if (cardProtocol.error.javaClass == CardProtocol.TangemException_InvalidPIN::class.java) { diff --git a/app/src/main/java/com/tangem/ui/fragment/id/WriteIdFragment.kt b/app/src/main/java/com/tangem/ui/fragment/id/WriteIdFragment.kt index 53f19ff2a5..03e96331c8 100644 --- a/app/src/main/java/com/tangem/ui/fragment/id/WriteIdFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/id/WriteIdFragment.kt @@ -8,6 +8,7 @@ import android.nfc.NfcAdapter import android.nfc.Tag import android.nfc.tech.IsoDep import android.os.Bundle +import android.util.Log import android.view.View import androidx.activity.OnBackPressedCallback import com.google.firebase.crashlytics.FirebaseCrashlytics @@ -186,6 +187,8 @@ class WriteIdFragment : BaseFragment(), NavigationResultListener, ) } else { + Log.d(this.javaClass.simpleName, + "Error while writing on ID card: ${cardProtocol.error}") lastReadSuccess = false FirebaseCrashlytics.getInstance().recordException(cardProtocol.error) if (cardProtocol.error.javaClass == CardProtocol.TangemException_InvalidPIN::class.java) { diff --git a/app/src/main/java/com/tangem/wallet/ethID/EthIdData.java b/app/src/main/java/com/tangem/wallet/ethID/EthIdData.java index 6cdf9fcf0b..c632f85a76 100644 --- a/app/src/main/java/com/tangem/wallet/ethID/EthIdData.java +++ b/app/src/main/java/com/tangem/wallet/ethID/EthIdData.java @@ -9,6 +9,7 @@ public class EthIdData extends CoinData { private boolean hasApprovalTx = false; private Long approvalAddressNonce; private byte[] CKDpub = null; + private String approvalAddress = null; //default approval address for issuance public boolean isHasApprovalTx() { return hasApprovalTx; @@ -34,6 +35,14 @@ public class EthIdData extends CoinData { this.CKDpub = CKDpub; } + public String getApprovalAddress() { + return approvalAddress; + } + + public void setApprovalAddress(String approvalAddress) { + this.approvalAddress = approvalAddress; + } + @Override public void clearInfo() { super.clearInfo(); @@ -50,6 +59,8 @@ public class EthIdData extends CoinData { } if (B.containsKey("CKDpub")) CKDpub = B.getByteArray("CKDpub"); hasApprovalTx = B.getBoolean("HasApprovalTx"); + if (B.containsKey("ApprovalAddress")) approvalAddress = B.getString("ApprovalAddress"); + } @Override @@ -59,6 +70,7 @@ public class EthIdData extends CoinData { if (approvalAddressNonce != null) B.putLong("ApprovalAddressNonce", approvalAddressNonce); if (CKDpub != null) B.putByteArray("CKDpub", CKDpub); B.putBoolean("HasApprovalTx", hasApprovalTx); + if (approvalAddress != null) B.putString("ApprovalAddress", approvalAddress); } catch (Exception e) { Log.e("Can't save to bundle ", e.getMessage()); diff --git a/app/src/main/java/com/tangem/wallet/ethID/EthIdEngine.java b/app/src/main/java/com/tangem/wallet/ethID/EthIdEngine.java index 3c9e6c0017..c62a51522d 100644 --- a/app/src/main/java/com/tangem/wallet/ethID/EthIdEngine.java +++ b/app/src/main/java/com/tangem/wallet/ethID/EthIdEngine.java @@ -43,8 +43,8 @@ public class EthIdEngine extends CoinEngine { private static final String TAG = com.tangem.wallet.eth.EthEngine.class.getSimpleName(); public EthIdData coinData = null; - private byte[] approvalPubKey = Util.hexToBytes("04EAD74FEEE4061044F46B19EB654CEEE981E9318F0C8FE99AF5CDB9D779D2E52BB51EA2D14545E0B323F7A90CF4CC72753C973149009C10DB2D83DCEC28487729"); //TODO - public String approvalAddress = calculateAddress(approvalPubKey); //TODO + //default approval public key for issuance + private byte[] approvalPubKey = Util.hexToBytes("04EAD74FEEE4061044F46B19EB654CEEE981E9318F0C8FE99AF5CDB9D779D2E52BB51EA2D14545E0B323F7A90CF4CC72753C973149009C10DB2D83DCEC28487729"); public EthIdEngine(TangemContext ctx) throws Exception { super(ctx); @@ -56,12 +56,24 @@ public class EthIdEngine extends CoinEngine { } else { throw new Exception("Invalid type of Blockchain data for " + this.getClass().getSimpleName()); } + defineApprovalAddress(); } public EthIdEngine() { super(); } + private void defineApprovalAddress() { + TangemCard.IDCardData idCardData = ctx.getCard().getIDCardData(); + String approvalAddress; + if (idCardData != null && idCardData.trustedAddress != null) { + approvalAddress = ctx.getCard().getIDCardData().trustedAddress; + } else { + approvalAddress = calculateAddress(approvalPubKey); + } + coinData.setApprovalAddress(approvalAddress); + } + private static int getDecimals() { return 18; } @@ -232,12 +244,12 @@ public class EthIdEngine extends CoinEngine { if (coinData != null && coinData.isHasApprovalTx()) { balanceValidator.setScore(100); balanceValidator.setFirstLine(R.string.id_verified); - balanceValidator.setSecondLine(R.string.balance_validator_second_line_unverified_balance); + balanceValidator.setSecondLine(R.string.balance_validator_second_line_issued_by); return false; } else { balanceValidator.setScore(0); balanceValidator.setFirstLine(R.string.id_not_registered); - balanceValidator.setSecondLine(R.string.balance_validator_second_line_unverified_balance); + balanceValidator.setSecondLine(R.string.empty_string); return false; } } @@ -277,6 +289,9 @@ public class EthIdEngine extends CoinEngine { @Override public SignTask.TransactionToSign constructTransaction(Amount amountValue, Amount feeValue, boolean IncFee, String targetAddress) { + Log.d(this.getClass().getSimpleName(), + "Constructing transaction for signature"); + final EthTransaction tx = constructIdTxForSign(coinData.getApprovalAddressNonce()); return new SignTask.TransactionToSign() { @@ -309,6 +324,9 @@ public class EthIdEngine extends CoinEngine { @Override public byte[] onSignCompleted(byte[] signFromCard) throws Exception { + Log.d(this.getClass().getSimpleName(), + "Transaction has been signed, now preparing transaction to send"); + byte[] for_hash = tx.getRawHash(); BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); @@ -330,6 +348,8 @@ public class EthIdEngine extends CoinEngine { Log.e(this.getClass().getSimpleName(), " V: " + String.valueOf(v)); byte[] txForSend = tx.getEncoded(); + Log.d(this.getClass().getSimpleName(), + "Tx is ready to be sent"); notifyOnNeedSendTransaction(txForSend); return txForSend; } @@ -381,7 +401,7 @@ public class EthIdEngine extends CoinEngine { public void onSuccess(BlockcypherTx response) { Log.i(TAG, "onSuccess: BlockcypherTx"); try { - String address = approvalAddress; + String address = coinData.getApprovalAddress(); if (address.startsWith("0x") || address.startsWith("0X")) { address = address.substring(2); } @@ -434,9 +454,13 @@ public class EthIdEngine extends CoinEngine { if (method.equals(ServerApiInfura.INFURA_ETH_SEND_RAW_TRANSACTION)) { if (infuraResponse.getResult() == null || infuraResponse.getResult().isEmpty()) { ctx.setError("Rejected by node: " + infuraResponse.getError()); + Log.d(this.getClass().getSimpleName(), + "Rejected by node:" + infuraResponse.getError()); blockchainRequestsCallbacks.onComplete(false); } else { ctx.setError(null); + Log.d(this.getClass().getSimpleName(), + "Transaction has been sent successfully"); blockchainRequestsCallbacks.onComplete(true); } } @@ -444,6 +468,8 @@ public class EthIdEngine extends CoinEngine { @Override public void onFail(String method, String message) { + Log.d(this.getClass().getSimpleName(), + "requestSendTransaction failed with message: " + message); if (method.equals(ServerApiInfura.INFURA_ETH_SEND_RAW_TRANSACTION)) { ctx.setError(message); blockchainRequestsCallbacks.onComplete(false); @@ -528,6 +554,6 @@ public class EthIdEngine extends CoinEngine { }; serverApiInfura.setResponseListener(responseListener); - serverApiInfura.requestData(ServerApiInfura.INFURA_ETH_GET_PENDING_COUNT, 67, approvalAddress, "", ""); + serverApiInfura.requestData(ServerApiInfura.INFURA_ETH_GET_PENDING_COUNT, 67, coinData.getApprovalAddress(), "", ""); } } diff --git a/app/src/main/java/com/tangem/wallet/tokenEmv/TokenEmvEngine.kt b/app/src/main/java/com/tangem/wallet/tokenEmv/TokenEmvEngine.kt index c63851d57c..e15b3071f0 100644 --- a/app/src/main/java/com/tangem/wallet/tokenEmv/TokenEmvEngine.kt +++ b/app/src/main/java/com/tangem/wallet/tokenEmv/TokenEmvEngine.kt @@ -24,6 +24,7 @@ import io.reactivex.observers.DisposableSingleObserver import org.apache.commons.lang3.SerializationUtils import org.kethereum.extensions.toBytesPadded import java.math.BigInteger +import java.util.* class TokenEmvEngine : TokenEngine { constructor() : super() @@ -40,7 +41,11 @@ class TokenEmvEngine : TokenEngine { } override fun getChainIdNum(): Int { - return EthTransaction.ChainEnum.Ropsten.value + if( ctx.card.tokenSymbol=="MyERC" || ctx.card.tokenSymbol.toLowerCase(Locale.getDefault()).startsWith("test")) { + return EthTransaction.ChainEnum.Ropsten.value + }else{ + return EthTransaction.ChainEnum.Mainnet.value + } } override fun getBalance(): Amount? { @@ -110,7 +115,11 @@ class TokenEmvEngine : TokenEngine { } override fun getWalletExplorerUri(): Uri { - return Uri.parse("https://ropsten.etherscan.io/token/" + getContractAddress(ctx.card) + "?a=" + ctx.coinData.wallet) + if( chainIdNum==EthTransaction.ChainEnum.Ropsten.value ) { + return Uri.parse("https://ropsten.etherscan.io/token/" + getContractAddress(ctx.card) + "?a=" + ctx.coinData.wallet) + }else{ + return Uri.parse("https://etherscan.io/token/" + getContractAddress(ctx.card) + "?a=" + ctx.coinData.wallet) + } } override fun isExtractPossible(): Boolean { @@ -236,7 +245,7 @@ class TokenEmvEngine : TokenEngine { } override fun requestBalanceAndUnspentTransactions(blockchainRequestsCallbacks: BlockchainRequestsCallbacks) { - val serverApiInfura = ServerApiInfura(ctx.blockchain) + val serverApiInfura = if( chainIdNum== EthTransaction.ChainEnum.Ropsten.value ) ServerApiInfura(ctx.blockchain) else ServerApiInfura() val responseListener: ServerApiInfura.ResponseListener = object : ServerApiInfura.ResponseListener { override fun onSuccess(method: String, infuraResponse: InfuraResponse) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ce8a2776e1..a2cd5b4f1e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -53,7 +53,7 @@ This card has enforced security delay Please hold the card firmly\n until the operation is completed… You may be required to repeat this operation a few times depending on the NFC performance of your smartphone.\n This is made for safety of your funds. - This is a genuine Tangem card. Please follow instructions written on the card to install the official app. + Uh oh!\nYour Tangem card was made to work with a different application. Please see the name and instructions on your card, and install the correct app. Manage user PIN1… @@ -148,6 +148,7 @@ To create account send 1+ XLM to this address Load 20+ XRP to create account Authenticity cannot be verified. Swipe down to refresh. + Issued by %s Now touch the card with ID diff --git a/blockchain-demo/src/main/java/com/tangem/blockchain_demo/BlockchainDemoActivity.kt b/blockchain-demo/src/main/java/com/tangem/blockchain_demo/BlockchainDemoActivity.kt index 76d9ce0ffa..809eb2e976 100644 --- a/blockchain-demo/src/main/java/com/tangem/blockchain_demo/BlockchainDemoActivity.kt +++ b/blockchain-demo/src/main/java/com/tangem/blockchain_demo/BlockchainDemoActivity.kt @@ -7,9 +7,9 @@ import androidx.appcompat.app.AppCompatActivity import com.tangem.SessionError import com.tangem.TangemSdk import com.tangem.blockchain.common.* -import com.tangem.blockchain.common.extensions.Result -import com.tangem.blockchain.common.extensions.Signer -import com.tangem.blockchain.common.extensions.SimpleResult +import com.tangem.blockchain.extensions.Result +import com.tangem.blockchain.extensions.Signer +import com.tangem.blockchain.extensions.SimpleResult import com.tangem.blockchain_demo.databinding.ActivityBlockchainDemoBinding import com.tangem.commands.Card import com.tangem.common.CompletionResult @@ -78,18 +78,18 @@ class BlockchainDemoActivity : AppCompatActivity() { walletManager.update() withContext(Dispatchers.Main) { binding.tvBalance.text = - "${walletManager.wallet.balances[AmountType.Coin]?.value - ?: "error"} ${walletManager.blockchain.currency}" - val token = walletManager.wallet.balances[AmountType.Token] + "${walletManager.wallet.amounts[AmountType.Coin]?.value?.toPlainString() + ?: "error"} ${walletManager.wallet.blockchain.currency}" + val token = walletManager.wallet.amounts[AmountType.Token] if (token != null) { - binding.tvBalance.text = token.currencySymbol + " " + token.value + binding.tvBalance.text = token.value?.toPlainString() + " " + token.currencySymbol binding.etSumToSend.text = Editable.Factory.getInstance().newEditable( - token.value.toString() + token.value?.toPlainString() ?: "" ) } else { binding.etSumToSend.text = Editable.Factory.getInstance().newEditable( - walletManager.wallet.balances[AmountType.Coin]?.value.toString() + walletManager.wallet.amounts[AmountType.Coin]?.value?.toPlainString() ) } binding.btnCheckFee.isEnabled = true @@ -107,9 +107,9 @@ class BlockchainDemoActivity : AppCompatActivity() { } scope.launch { - val feeResult = (walletManager as FeeProvider).getFee( - walletManager.wallet.balances[AmountType.Token] - ?: walletManager.wallet.balances[AmountType.Coin]!!, + val feeResult = (walletManager as TransactionSender).getFee( + walletManager.wallet.amounts[AmountType.Token] + ?: walletManager.wallet.amounts[AmountType.Coin]!!, binding.etReceiverAddress.text.toString()) withContext(Dispatchers.Main) { when (feeResult) { @@ -154,18 +154,21 @@ class BlockchainDemoActivity : AppCompatActivity() { } private fun formTransactionData(): TransactionData { - val amount = if (walletManager.wallet.balances[AmountType.Token] != null) { - walletManager.wallet.balances[AmountType.Token]!! + val amount = if (walletManager.wallet.amounts[AmountType.Token] != null) { + walletManager.wallet.amounts[AmountType.Token]!!.copy( + value = binding.etSumToSend.text.toString().toBigDecimal() + ) } else { - walletManager.wallet.balances[AmountType.Coin]!!.copy( + walletManager.wallet.amounts[AmountType.Coin]!!.copy( value = binding.etSumToSend.text.toString().toBigDecimal() - fee ) } return TransactionData( amount, - walletManager.wallet.balances[AmountType.Coin]!!.copy(value = fee), - walletManager.wallet.balances[AmountType.Coin]!!.address!!, - binding.etReceiverAddress.text.toString() + walletManager.wallet.amounts[AmountType.Coin]!!.copy(value = fee), + walletManager.wallet.amounts[AmountType.Coin]!!.address!!, + binding.etReceiverAddress.text.toString(), + contractAddress = walletManager.wallet.amounts[AmountType.Token]?.address ) } diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceAddress.kt deleted file mode 100644 index f0634cb9fd..0000000000 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceAddress.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.tangem.blockchain.binance - -import com.tangem.blockchain.binance.client.encoding.Crypto -import com.tangem.common.extensions.calculateRipemd160 -import com.tangem.common.extensions.calculateSha256 -import com.tangem.common.extensions.toCompressedPublicKey -import org.bitcoinj.core.Bech32 - -class BinanceAddressFactory { - companion object { - fun makeAddress(walletPublicKey: ByteArray, testNet: Boolean = false): String { - val publicKeyHash = walletPublicKey.toCompressedPublicKey().calculateSha256().calculateRipemd160() - return if (testNet) { - Bech32.encode("tbnb", Crypto.convertBits(publicKeyHash, 0, publicKeyHash.size, 8, 5, false)) - } else { - Bech32.encode("bnb", Crypto.convertBits(publicKeyHash, 0, publicKeyHash.size, 8, 5, false)) - } - } - } -} - -class BinanceAddressValidator { - companion object { - fun validate(address: String, testNet: Boolean = false): Boolean { - return try { - Crypto.decodeAddress(address) - if (testNet) { - address.startsWith("tbnb1") - } else { - address.startsWith("bnb1") - } - } catch (exception: Exception) { - false - } - } - } -} \ No newline at end of file diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceTransactionBuilder.kt deleted file mode 100644 index d9f770f25e..0000000000 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceTransactionBuilder.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.tangem.blockchain.binance - -import com.tangem.blockchain.binance.client.BinanceDexApiClientFactory -import com.tangem.blockchain.binance.client.BinanceDexEnvironment -import com.tangem.blockchain.binance.client.domain.broadcast.TransactionOption -import com.tangem.blockchain.binance.client.domain.broadcast.Transfer -import com.tangem.blockchain.binance.client.encoding.message.MessageType -import com.tangem.blockchain.binance.client.encoding.message.TransactionRequestAssemblerExtSign -import com.tangem.blockchain.binance.client.encoding.message.TransferMessage -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.TransactionData -import com.tangem.common.extensions.calculateSha256 -import com.tangem.common.extensions.toCompressedPublicKey -import org.bitcoinj.core.ECKey -import org.bitcoinj.core.Utils -import java.math.BigInteger - -class BinanceTransactionBuilder(publicKey: ByteArray, isTestNet: Boolean) { - val chainId = if (isTestNet) "Binance-Chain-Nile" else "Binance-Chain-Tigris" - val prefixedPubKey = MessageType.PubKey.typePrefixBytes + 33.toByte() + publicKey.toCompressedPublicKey() - val client = BinanceDexApiClientFactory.newInstance().newRestClient( - if (isTestNet) BinanceDexEnvironment.PROD.baseUrl else BinanceDexEnvironment.TEST_NET.baseUrl - ) - - var accountNumber: Long? = null - var sequence: Long? = null - var transactionAssembler: TransactionRequestAssemblerExtSign? = null - var transferMessage: TransferMessage? = null - - fun buildToSign(transactionData: TransactionData): ByteArray { - val transfer = Transfer() - transfer.coin = transactionData.amount.currencySymbol - transfer.fromAddress = transactionData.sourceAddress - transfer.toAddress = transactionData.destinationAddress - transfer.amount = transactionData.amount.value!! - .setScale(Blockchain.Binance.decimals.toInt()).toPlainString() - - val options = TransactionOption.DEFAULT_INSTANCE - - val accountData = BinanceAccountData(chainId, accountNumber!!, sequence!!) - - transactionAssembler = client.prepareTransfer(transfer, accountData, prefixedPubKey, options, true) - transferMessage = transactionAssembler!!.createTransferMessage(transfer) - - return transactionAssembler!!.prepareForSign(transferMessage).calculateSha256() - } - - fun buildToSend(signature: ByteArray): ByteArray { - val r = BigInteger(1, signature.copyOfRange(0, 32)) - val s = BigInteger(1, signature.copyOfRange(32, 64)) - val canonicalS = ECKey.ECDSASignature(r, s).toCanonicalised().s - - //bigIntegerToBytes cuts leading zero if present - val canonicalSignature = Utils.bigIntegerToBytes(r, 32) + Utils.bigIntegerToBytes(canonicalS, 32) - val encodedSignature = transactionAssembler!!.encodeSignature(canonicalSignature) - - val encodedTransferMessage = transactionAssembler!!.encodeTransferMessage(transferMessage) - - return transactionAssembler!!.encodeStdTx(encodedTransferMessage, encodedSignature) - } -} - -data class BinanceAccountData( - val chainId: String, - val accountNumber: Long, - val sequence: Long -) \ No newline at end of file diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt deleted file mode 100644 index 5c131c16e0..0000000000 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.tangem.blockchain.binance - -import android.util.Log -import com.tangem.blockchain.binance.network.BinanceInfoResponse -import com.tangem.blockchain.binance.network.BinanceNetworkManager -import com.tangem.blockchain.common.* -import com.tangem.blockchain.common.extensions.Result -import com.tangem.blockchain.common.extensions.SimpleResult -import com.tangem.blockchain.wallets.CurrencyWallet -import com.tangem.common.CompletionResult - -class BinanceWalletManager( - private val cardId: String, - walletPublicKey: ByteArray, - override var wallet: CurrencyWallet, - isTestNet: Boolean = false -) : WalletManager, - TransactionSender, - FeeProvider { - - override val blockchain = if (isTestNet) Blockchain.BinanceTestnet else Blockchain.Binance - private val address = blockchain.makeAddress(walletPublicKey) - private val transactionBuilder = BinanceTransactionBuilder(walletPublicKey, isTestNet) - private val networkManager = BinanceNetworkManager(isTestNet) - - init { - wallet.balances[AmountType.Coin] = Amount(null, blockchain, address) - } - - override suspend fun update() { - val result = networkManager.getInfo(address) - when (result) { - is Result.Success -> updateWallet(result.data) - is Result.Failure -> updateError(result.error) - } - } - - private fun updateWallet(response: BinanceInfoResponse) { - Log.d(this::class.java.simpleName, "Balance is ${response.balance}") - wallet.balances[AmountType.Coin]?.value = response.balance - - transactionBuilder.accountNumber = response.accountNumber - transactionBuilder.sequence = response.sequence - } - - private fun updateError(error: Throwable?) { - Log.e(this::class.java.simpleName, error?.message ?: "") - if (error != null) throw error - } - - override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult { - val transactionHash = transactionBuilder.buildToSign(transactionData) - - when (val signerResponse = signer.sign(arrayOf(transactionHash), cardId)) { - is CompletionResult.Success -> { - val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature) - return networkManager.sendTransaction(transactionToSend) - } - is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error) - } - } - - override suspend fun getFee(amount: Amount, destination: String): Result> { - when (val result = networkManager.getFee()) { - is Result.Success -> return Result.Success(listOf(Amount(result.data, blockchain))) - is Result.Failure -> return result - } - } - - -} \ No newline at end of file diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/BinanceDexTransactionMessage.java b/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/BinanceDexTransactionMessage.java deleted file mode 100644 index cd17d401db..0000000000 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/BinanceDexTransactionMessage.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.tangem.blockchain.binance.client.encoding.message; - -public interface BinanceDexTransactionMessage { -} diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt deleted file mode 100644 index 72a18f08fc..0000000000 --- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt +++ /dev/null @@ -1,112 +0,0 @@ -package com.tangem.blockchain.bitcoin - -import android.util.Log -import com.tangem.blockchain.bitcoin.network.BitcoinAddressResponse -import com.tangem.blockchain.bitcoin.network.BitcoinNetworkManager -import com.tangem.blockchain.bitcoin.network.BitcoinNetworkManager.Companion.SATOSHI_IN_BTC -import com.tangem.blockchain.common.* -import com.tangem.blockchain.common.extensions.Result -import com.tangem.blockchain.common.extensions.SimpleResult -import com.tangem.blockchain.wallets.CurrencyWallet -import com.tangem.common.CompletionResult -import com.tangem.common.extensions.toHexString -import java.math.BigDecimal - -class BitcoinWalletManager( - private val cardId: String, - private val walletPublicKey: ByteArray, - override var wallet: CurrencyWallet, - isTestNet: Boolean = false -) : WalletManager, - TransactionSender, - FeeProvider { - - override val blockchain = if (isTestNet) Blockchain.BitcoinTestnet else Blockchain.Bitcoin - private val address = blockchain.makeAddress(walletPublicKey) - private val transactionBuilder = BitcoinTransactionBuilder(isTestNet) - private val networkManager = BitcoinNetworkManager(isTestNet) - - init { - wallet.balances[AmountType.Coin] = Amount(null, blockchain) - } - - override suspend fun update() { - val response = networkManager.getInfo(address) - when (response) { - is Result.Success -> updateWallet(response.data) - is Result.Failure -> updateError(response.error) - } - } - - private fun updateWallet(response: BitcoinAddressResponse) { - Log.d(this::class.java.simpleName, "Balance is ${response.balance}") - wallet.balances[AmountType.Coin]?.value = response.balance - transactionBuilder.unspentOutputs = response.unspentTransactions - if (response.hasUnconfirmed) { - if (wallet.pendingTransactions.isEmpty()) { - wallet.pendingTransactions.add(TransactionData( - Amount(blockchain.currency, decimals = blockchain.decimals), - null, - "unknown", - wallet.address)) - } - } else { - wallet.pendingTransactions.clear() - } - } - - private fun updateError(error: Throwable?) { - Log.e(this::class.java.simpleName, error?.message ?: "") - if (error != null) throw error - } - - override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult { - val buildTransactionResult = transactionBuilder.buildToSign(transactionData) - when (buildTransactionResult) { - is Result.Failure -> return SimpleResult.Failure(buildTransactionResult.error) - is Result.Success -> { - when (val signerResponse = signer.sign(buildTransactionResult.data.toTypedArray(), cardId)) { - is CompletionResult.Success -> { - val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature, walletPublicKey) - return networkManager.sendTransaction(transactionToSend.toHexString()) - } - is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error) - } - } - } - } - - override suspend fun getFee(amount: Amount, destination: String): Result> { - when (val result = networkManager.getFee()) { - is Result.Failure -> return result - is Result.Success -> { - val sizeResult = transactionBuilder.getEstimateSize( - TransactionData(amount, - Amount(1.toBigDecimal().divide(SATOSHI_IN_BTC), blockchain), - address, destination), - walletPublicKey - ) - when (sizeResult) { - is Result.Failure -> return sizeResult - is Result.Success -> { - val transactionSize = sizeResult.data.toBigDecimal() - val minFee = result.data.minimalPerKb.calculateFee(transactionSize) - val normalFee = result.data.normalPerKb.calculateFee(transactionSize) - val priorityFee = result.data.priorityPerKb.calculateFee(transactionSize) - return Result.Success( - listOf(Amount(minFee, blockchain), - Amount(normalFee, blockchain), - Amount(priorityFee, blockchain)) - ) - } - } - } - } - } - - private fun BigDecimal.calculateFee(transactionSize: BigDecimal): BigDecimal { - val bytesInKb = BigDecimal(1024) - return this.divide(bytesInKb).multiply(transactionSize) - .setScale(8, blockchain.roundingMode()) - } -} \ No newline at end of file diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddressService.kt new file mode 100644 index 0000000000..f531bf5519 --- /dev/null +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddressService.kt @@ -0,0 +1,45 @@ +package com.tangem.blockchain.blockchains.binance + +import com.tangem.blockchain.blockchains.binance.client.encoding.Crypto +import com.tangem.blockchain.common.AddressService +import com.tangem.common.extensions.calculateRipemd160 +import com.tangem.common.extensions.calculateSha256 +import com.tangem.common.extensions.toCompressedPublicKey +import org.bitcoinj.core.Bech32 + +class BinanceAddressService(private val testNet: Boolean = false) : AddressService { + override fun makeAddress(walletPublicKey: ByteArray): String { + val publicKeyHash = walletPublicKey.toCompressedPublicKey().calculateSha256().calculateRipemd160() + return if (testNet) { + Bech32.encode("tbnb", Crypto.convertBits(publicKeyHash, 0, + publicKeyHash.size, 8, 5, false) + ) + } else { + Bech32.encode("bnb", Crypto.convertBits(publicKeyHash, 0, + publicKeyHash.size, 8, 5, false) + ) + } + } + + override fun validate(address: String): Boolean { + return try { + Crypto.decodeAddress(address) + if (testNet) { + address.startsWith("tbnb1") + } else { + address.startsWith("bnb1") + } + } catch (exception: Exception) { + false + } + } +} + +enum class BinanceChain(val value: String) { + Nile("Binance-Chain-Nile"), + Tigris("Binance-Chain-Tigris"); + + companion object { + fun getChain(testNet: Boolean): BinanceChain = if (testNet) Nile else Tigris + } +} \ No newline at end of file diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt new file mode 100644 index 0000000000..49c7c20368 --- /dev/null +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt @@ -0,0 +1,72 @@ +package com.tangem.blockchain.blockchains.binance + +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TransactionOption +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.Transfer +import com.tangem.blockchain.blockchains.binance.client.encoding.message.MessageType +import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransactionRequestAssemblerExtSign +import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransferMessage +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.TransactionData +import com.tangem.blockchain.extensions.Result +import com.tangem.blockchain.extensions.isAboveZero +import com.tangem.common.extensions.calculateSha256 +import com.tangem.common.extensions.toCompressedPublicKey +import org.bitcoinj.core.ECKey +import org.bitcoinj.core.Utils +import java.math.BigInteger + +class BinanceTransactionBuilder( + publicKey: ByteArray, isTestNet: Boolean = false +) { + var accountNumber: Long? = null + var sequence: Long? = null + + private val chainId = BinanceChain.getChain(isTestNet).value + private val prefixedPubKey = MessageType.PubKey.typePrefixBytes + 33.toByte() + publicKey.toCompressedPublicKey() + + private var transactionAssembler: TransactionRequestAssemblerExtSign? = null + private var transferMessage: TransferMessage? = null + + fun buildToSign(transactionData: TransactionData): Result { + + if (!transactionData.amount.isAboveZero()) return Result.Failure(Exception("Transaction amount is not defined")) + val accountNumber = accountNumber ?: return Result.Failure(Exception("No account number")) + val sequence = sequence ?: return Result.Failure(Exception("No sequence")) + + val transfer = Transfer() + transfer.coin = transactionData.amount.currencySymbol + transfer.fromAddress = transactionData.sourceAddress + transfer.toAddress = transactionData.destinationAddress + transfer.amount = transactionData.amount.value!! + .setScale(Blockchain.Binance.decimals()).toPlainString() + + val options = TransactionOption.DEFAULT_INSTANCE + + val accountData = BinanceAccountData(chainId, accountNumber, sequence) + + transactionAssembler = TransactionRequestAssemblerExtSign(accountData, prefixedPubKey, options) + transferMessage = transactionAssembler!!.createTransferMessage(transfer) + + return Result.Success(transactionAssembler!!.prepareForSign(transferMessage).calculateSha256()) + } + + fun buildToSend(signature: ByteArray): ByteArray { + val r = BigInteger(1, signature.copyOfRange(0, 32)) + val s = BigInteger(1, signature.copyOfRange(32, 64)) + val canonicalS = ECKey.ECDSASignature(r, s).toCanonicalised().s + + //bigIntegerToBytes cuts leading zero if present + val canonicalSignature = Utils.bigIntegerToBytes(r, 32) + Utils.bigIntegerToBytes(canonicalS, 32) + val encodedSignature = transactionAssembler!!.encodeSignature(canonicalSignature) + + val encodedTransferMessage = transactionAssembler!!.encodeTransferMessage(transferMessage) + + return transactionAssembler!!.encodeStdTx(encodedTransferMessage, encodedSignature) + } +} + +data class BinanceAccountData( + val chainId: String, + val accountNumber: Long, + val sequence: Long +) \ No newline at end of file diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt new file mode 100644 index 0000000000..e8d2b759eb --- /dev/null +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt @@ -0,0 +1,65 @@ +package com.tangem.blockchain.blockchains.binance + +import android.util.Log +import com.tangem.blockchain.blockchains.binance.network.BinanceInfoResponse +import com.tangem.blockchain.blockchains.binance.network.BinanceNetworkManager +import com.tangem.blockchain.common.* +import com.tangem.blockchain.extensions.Result +import com.tangem.blockchain.extensions.SimpleResult +import com.tangem.common.CompletionResult + +class BinanceWalletManager( + cardId: String, + wallet: Wallet, + private val transactionBuilder: BinanceTransactionBuilder, + private val networkManager: BinanceNetworkManager +) : WalletManager(cardId, wallet), TransactionSender { + + private val blockchain = wallet.blockchain + + override suspend fun update() { + val result = networkManager.getInfo(wallet.address) + when (result) { + is Result.Success -> updateWallet(result.data) + is Result.Failure -> updateError(result.error) + } + } + + private fun updateWallet(response: BinanceInfoResponse) { + Log.d(this::class.java.simpleName, "Balance is ${response.balance}") + wallet.amounts[AmountType.Coin]?.value = response.balance + + transactionBuilder.accountNumber = response.accountNumber + transactionBuilder.sequence = response.sequence + } + + private fun updateError(error: Throwable?) { + Log.e(this::class.java.simpleName, error?.message ?: "") + if (error != null) throw error + } + + override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult { + val buildTransactionResult = transactionBuilder.buildToSign(transactionData) + when (buildTransactionResult) { + is Result.Failure -> return SimpleResult.Failure(buildTransactionResult.error) + is Result.Success -> { + when (val signerResponse = signer.sign(arrayOf(buildTransactionResult.data), cardId)) { + is CompletionResult.Success -> { + val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature) + return networkManager.sendTransaction(transactionToSend) + } + is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error) + } + } + } + } + + override suspend fun getFee(amount: Amount, destination: String): Result> { + when (val result = networkManager.getFee()) { + is Result.Success -> return Result.Success(listOf(Amount(result.data, blockchain))) + is Result.Failure -> return result + } + } + + +} \ No newline at end of file diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApi.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApi.java similarity index 71% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApi.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApi.java index a7fdf9f46a..41b15a0fb2 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApi.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApi.java @@ -1,13 +1,31 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; + +import com.tangem.blockchain.blockchains.binance.client.domain.Account; +import com.tangem.blockchain.blockchains.binance.client.domain.AccountSequence; +import com.tangem.blockchain.blockchains.binance.client.domain.Candlestick; +import com.tangem.blockchain.blockchains.binance.client.domain.Infos; +import com.tangem.blockchain.blockchains.binance.client.domain.Market; +import com.tangem.blockchain.blockchains.binance.client.domain.Order; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderBook; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderList; +import com.tangem.blockchain.blockchains.binance.client.domain.Peer; +import com.tangem.blockchain.blockchains.binance.client.domain.TickerStatistics; +import com.tangem.blockchain.blockchains.binance.client.domain.Time; +import com.tangem.blockchain.blockchains.binance.client.domain.Token; +import com.tangem.blockchain.blockchains.binance.client.domain.TradePage; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionMetadata; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionPage; +import com.tangem.blockchain.blockchains.binance.client.domain.Validators; import java.util.List; -import com.tangem.blockchain.binance.client.domain.*; import okhttp3.RequestBody; import retrofit2.Call; -import retrofit2.http.*; - -import java.util.List; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; public interface BinanceDexApi { @GET("/api/v1/time") diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiAsyncRestClient.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiAsyncRestClient.java similarity index 55% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiAsyncRestClient.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiAsyncRestClient.java index cc2ca23f34..45df9b1ade 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiAsyncRestClient.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiAsyncRestClient.java @@ -1,10 +1,26 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; -import com.tangem.blockchain.binance.client.domain.*; -import com.tangem.blockchain.binance.client.domain.request.ClosedOrdersRequest; -import com.tangem.blockchain.binance.client.domain.request.OpenOrdersRequest; -import com.tangem.blockchain.binance.client.domain.request.TradesRequest; -import com.tangem.blockchain.binance.client.domain.request.TransactionsRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.Account; +import com.tangem.blockchain.blockchains.binance.client.domain.AccountSequence; +import com.tangem.blockchain.blockchains.binance.client.domain.Candlestick; +import com.tangem.blockchain.blockchains.binance.client.domain.CandlestickInterval; +import com.tangem.blockchain.blockchains.binance.client.domain.Infos; +import com.tangem.blockchain.blockchains.binance.client.domain.Market; +import com.tangem.blockchain.blockchains.binance.client.domain.Order; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderBook; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderList; +import com.tangem.blockchain.blockchains.binance.client.domain.Peer; +import com.tangem.blockchain.blockchains.binance.client.domain.TickerStatistics; +import com.tangem.blockchain.blockchains.binance.client.domain.Time; +import com.tangem.blockchain.blockchains.binance.client.domain.Token; +import com.tangem.blockchain.blockchains.binance.client.domain.TradePage; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionMetadata; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionPage; +import com.tangem.blockchain.blockchains.binance.client.domain.Validators; +import com.tangem.blockchain.blockchains.binance.client.domain.request.ClosedOrdersRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.OpenOrdersRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.TradesRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.TransactionsRequest; import java.util.List; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiCallback.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiCallback.java similarity index 91% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiCallback.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiCallback.java index 33e2bba139..a776443079 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiCallback.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiCallback.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; /** * BinanceDexApiCallback is a functional interface used together with the BinanceApiAsyncClient to provide a non-blocking REST client. diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiCallbackAdapter.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiCallbackAdapter.java similarity index 90% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiCallbackAdapter.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiCallbackAdapter.java index e96fc66946..cf12dcbf6f 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiCallbackAdapter.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiCallbackAdapter.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; import java.io.IOException; @@ -6,7 +6,7 @@ import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; -import static com.tangem.blockchain.binance.client.BinanceDexApiClientGenerator.getBinanceApiError; +import static com.tangem.blockchain.blockchains.binance.client.BinanceDexApiClientGenerator.getBinanceApiError; /** * An adapter/wrapper which transforms a Callback from Retrofit into a BinanceDexApiCallback which is exposed to the client. diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiClientFactory.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiClientFactory.java similarity index 75% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiClientFactory.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiClientFactory.java index 8cab3bb433..56b6ab6826 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiClientFactory.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiClientFactory.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; -import com.tangem.blockchain.binance.client.impl.BinanceDexApiAsyncRestClientImpl; -import com.tangem.blockchain.binance.client.impl.BinanceDexApiRestClientImpl; +import com.tangem.blockchain.blockchains.binance.client.impl.BinanceDexApiAsyncRestClientImpl; +import com.tangem.blockchain.blockchains.binance.client.impl.BinanceDexApiRestClientImpl; public class BinanceDexApiClientFactory { private BinanceDexApiClientFactory() { diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiClientGenerator.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiClientGenerator.java similarity index 97% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiClientGenerator.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiClientGenerator.java index 1313e621d3..5b67b2f3e4 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiClientGenerator.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiClientGenerator.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.joda.JodaModule; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiError.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiError.java similarity index 93% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiError.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiError.java index 5aa7b1826c..e9a2cc6ee0 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiError.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiError.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiException.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiException.java similarity index 92% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiException.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiException.java index 9f423dbbb4..dd17402aea 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiException.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiException.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; public class BinanceDexApiException extends RuntimeException { diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiRestClient.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiRestClient.java similarity index 51% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiRestClient.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiRestClient.java index 48fa5f1410..c5e8d08eea 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexApiRestClient.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexApiRestClient.java @@ -1,34 +1,34 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; -import com.tangem.blockchain.binance.BinanceAccountData; -import com.tangem.blockchain.binance.client.domain.Account; -import com.tangem.blockchain.binance.client.domain.AccountSequence; -import com.tangem.blockchain.binance.client.domain.Candlestick; -import com.tangem.blockchain.binance.client.domain.CandlestickInterval; -import com.tangem.blockchain.binance.client.domain.Infos; -import com.tangem.blockchain.binance.client.domain.Market; -import com.tangem.blockchain.binance.client.domain.Order; -import com.tangem.blockchain.binance.client.domain.OrderBook; -import com.tangem.blockchain.binance.client.domain.OrderList; -import com.tangem.blockchain.binance.client.domain.Peer; -import com.tangem.blockchain.binance.client.domain.TickerStatistics; -import com.tangem.blockchain.binance.client.domain.Time; -import com.tangem.blockchain.binance.client.domain.Token; -import com.tangem.blockchain.binance.client.domain.TradePage; -import com.tangem.blockchain.binance.client.domain.TransactionMetadata; -import com.tangem.blockchain.binance.client.domain.TransactionPage; -import com.tangem.blockchain.binance.client.domain.Validators; -import com.tangem.blockchain.binance.client.domain.broadcast.CancelOrder; -import com.tangem.blockchain.binance.client.domain.broadcast.NewOrder; -import com.tangem.blockchain.binance.client.domain.broadcast.TokenFreeze; -import com.tangem.blockchain.binance.client.domain.broadcast.TokenUnfreeze; -import com.tangem.blockchain.binance.client.domain.broadcast.TransactionOption; -import com.tangem.blockchain.binance.client.domain.broadcast.Transfer; -import com.tangem.blockchain.binance.client.domain.request.ClosedOrdersRequest; -import com.tangem.blockchain.binance.client.domain.request.OpenOrdersRequest; -import com.tangem.blockchain.binance.client.domain.request.TradesRequest; -import com.tangem.blockchain.binance.client.domain.request.TransactionsRequest; -import com.tangem.blockchain.binance.client.encoding.message.TransactionRequestAssemblerExtSign; +import com.tangem.blockchain.blockchains.binance.BinanceAccountData; +import com.tangem.blockchain.blockchains.binance.client.domain.Account; +import com.tangem.blockchain.blockchains.binance.client.domain.AccountSequence; +import com.tangem.blockchain.blockchains.binance.client.domain.Candlestick; +import com.tangem.blockchain.blockchains.binance.client.domain.CandlestickInterval; +import com.tangem.blockchain.blockchains.binance.client.domain.Infos; +import com.tangem.blockchain.blockchains.binance.client.domain.Market; +import com.tangem.blockchain.blockchains.binance.client.domain.Order; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderBook; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderList; +import com.tangem.blockchain.blockchains.binance.client.domain.Peer; +import com.tangem.blockchain.blockchains.binance.client.domain.TickerStatistics; +import com.tangem.blockchain.blockchains.binance.client.domain.Time; +import com.tangem.blockchain.blockchains.binance.client.domain.Token; +import com.tangem.blockchain.blockchains.binance.client.domain.TradePage; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionMetadata; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionPage; +import com.tangem.blockchain.blockchains.binance.client.domain.Validators; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.CancelOrder; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.NewOrder; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TokenFreeze; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TokenUnfreeze; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TransactionOption; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.Transfer; +import com.tangem.blockchain.blockchains.binance.client.domain.request.ClosedOrdersRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.OpenOrdersRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.TradesRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.TransactionsRequest; +import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransactionRequestAssemblerExtSign; import java.io.IOException; import java.security.NoSuchAlgorithmException; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexConstants.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexConstants.java similarity index 89% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexConstants.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexConstants.java index 104d109656..6c9cedb7ed 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexConstants.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexConstants.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; import org.apache.commons.lang3.builder.ToStringStyle; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexEnvironment.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexEnvironment.java similarity index 93% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexEnvironment.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexEnvironment.java index 02d6b8a1c4..7580366fab 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/BinanceDexEnvironment.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/BinanceDexEnvironment.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; public enum BinanceDexEnvironment { PROD( diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/Wallet.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/Wallet.java similarity index 92% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/Wallet.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/Wallet.java index e24bab0187..98ca88f468 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/Wallet.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/Wallet.java @@ -1,10 +1,10 @@ -package com.tangem.blockchain.binance.client; +package com.tangem.blockchain.blockchains.binance.client; -import com.tangem.blockchain.binance.client.domain.Account; -import com.tangem.blockchain.binance.client.domain.AccountSequence; -import com.tangem.blockchain.binance.client.domain.Infos; -import com.tangem.blockchain.binance.client.encoding.Crypto; -import com.tangem.blockchain.binance.client.encoding.message.MessageType; +import com.tangem.blockchain.blockchains.binance.client.domain.Account; +import com.tangem.blockchain.blockchains.binance.client.domain.AccountSequence; +import com.tangem.blockchain.blockchains.binance.client.domain.Infos; +import com.tangem.blockchain.blockchains.binance.client.encoding.Crypto; +import com.tangem.blockchain.blockchains.binance.client.encoding.message.MessageType; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Account.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Account.java similarity index 92% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Account.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Account.java index b9a4768da8..d5994c729b 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Account.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Account.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/AccountSequence.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/AccountSequence.java similarity index 80% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/AccountSequence.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/AccountSequence.java index 656aaf0359..1c5d8276e3 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/AccountSequence.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/AccountSequence.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Balance.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Balance.java similarity index 89% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Balance.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Balance.java index 590d1452c3..9c3cfa2d23 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Balance.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Balance.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Candlestick.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Candlestick.java similarity index 94% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Candlestick.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Candlestick.java index 700cdd4193..276002fff3 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Candlestick.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Candlestick.java @@ -1,9 +1,9 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/CandlestickInterval.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/CandlestickInterval.java similarity index 95% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/CandlestickInterval.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/CandlestickInterval.java index 9203590789..8b7611675f 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/CandlestickInterval.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/CandlestickInterval.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Infos.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Infos.java similarity index 90% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Infos.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Infos.java index 210454c815..4b0de253ad 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Infos.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Infos.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Market.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Market.java similarity index 92% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Market.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Market.java index 5b50b07297..35cf20e04b 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Market.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Market.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/NodeInfo.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/NodeInfo.java similarity index 93% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/NodeInfo.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/NodeInfo.java index c6659acdce..df3c219135 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/NodeInfo.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/NodeInfo.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Order.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Order.java similarity index 97% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Order.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Order.java index 5c6514990f..ed9df01889 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Order.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Order.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; import org.joda.time.DateTime; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBook.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBook.java similarity index 88% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBook.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBook.java index 2feee36a1e..b658053989 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBook.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBook.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntry.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntry.java similarity index 88% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntry.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntry.java index b8c7f2cddb..b3c3cb79ff 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntry.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntry.java @@ -1,9 +1,9 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntryDeserializer.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntryDeserializer.java similarity index 92% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntryDeserializer.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntryDeserializer.java index b9d15941a0..9cd19067e2 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntryDeserializer.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntryDeserializer.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.ObjectCodec; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntrySerializer.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntrySerializer.java similarity index 90% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntrySerializer.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntrySerializer.java index 1788669945..5ce430af9d 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderBookEntrySerializer.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderBookEntrySerializer.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderList.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderList.java similarity index 85% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderList.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderList.java index b116e0840d..79a8fbb207 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderList.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderList.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderSide.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderSide.java similarity index 89% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderSide.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderSide.java index 02ca808e6c..25e7c697c4 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderSide.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderSide.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderStatus.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderStatus.java similarity index 65% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderStatus.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderStatus.java index 052ba39b18..d0d2a944b5 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderStatus.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderStatus.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; public enum OrderStatus { Ack, diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderType.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderType.java similarity index 89% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderType.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderType.java index 8f91622044..6ff51931b6 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/OrderType.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/OrderType.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Peer.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Peer.java similarity index 95% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Peer.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Peer.java index 2941def17c..0d7bc3cb3c 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Peer.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Peer.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/SyncInfo.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/SyncInfo.java similarity index 93% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/SyncInfo.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/SyncInfo.java index 21cc75e9f0..0be0ff7187 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/SyncInfo.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/SyncInfo.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; import org.joda.time.DateTime; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TickerStatistics.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TickerStatistics.java similarity index 97% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TickerStatistics.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TickerStatistics.java index 18eb76fbd7..55fb81250d 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TickerStatistics.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TickerStatistics.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Time.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Time.java similarity index 87% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Time.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Time.java index 868a45dc58..699f86ab3e 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Time.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Time.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; import org.joda.time.DateTime; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TimeInForce.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TimeInForce.java similarity index 89% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TimeInForce.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TimeInForce.java index d01a4f3638..de43af7990 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TimeInForce.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TimeInForce.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Token.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Token.java similarity index 92% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Token.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Token.java index 772b39147f..d240e628fd 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Token.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Token.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Trade.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Trade.java similarity index 96% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Trade.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Trade.java index 8b3529f8d9..f854e6fbca 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Trade.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Trade.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TradePage.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TradePage.java similarity index 85% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TradePage.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TradePage.java index ecd67deba7..7e4fea549b 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TradePage.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TradePage.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TradeStatistics.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TradeStatistics.java similarity index 68% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TradeStatistics.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TradeStatistics.java index ed33feb78f..70fd04853d 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TradeStatistics.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TradeStatistics.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Transaction.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Transaction.java similarity index 96% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Transaction.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Transaction.java index 6ba2c8ccb7..52d91aca67 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Transaction.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Transaction.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionMetadata.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionMetadata.java similarity index 93% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionMetadata.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionMetadata.java index 831916b742..1d792e1563 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionMetadata.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionMetadata.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionPage.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionPage.java similarity index 85% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionPage.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionPage.java index 992ac7cbd1..fa73514164 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionPage.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionPage.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionType.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionType.java similarity index 74% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionType.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionType.java index f8be339797..97629c2dcc 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/TransactionType.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/TransactionType.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; public enum TransactionType { NEW_ORDER, diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/ValidatorInfo.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/ValidatorInfo.java similarity index 89% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/ValidatorInfo.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/ValidatorInfo.java index 8c0883cca8..746b6cb6a0 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/ValidatorInfo.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/ValidatorInfo.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Validators.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Validators.java similarity index 87% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Validators.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Validators.java index c1bb9d9f7b..9c1930bbee 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/Validators.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/Validators.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain; +package com.tangem.blockchain.blockchains.binance.client.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/CancelOrder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/CancelOrder.java similarity index 83% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/CancelOrder.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/CancelOrder.java index 6129228ac1..b5770a3fd6 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/CancelOrder.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/CancelOrder.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain.broadcast; +package com.tangem.blockchain.blockchains.binance.client.domain.broadcast; import com.fasterxml.jackson.annotation.JsonProperty; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/NewOrder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/NewOrder.java similarity index 81% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/NewOrder.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/NewOrder.java index 345cb44b97..63bd461d3a 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/NewOrder.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/NewOrder.java @@ -1,9 +1,9 @@ -package com.tangem.blockchain.binance.client.domain.broadcast; +package com.tangem.blockchain.blockchains.binance.client.domain.broadcast; -import com.tangem.blockchain.binance.client.BinanceDexConstants; -import com.tangem.blockchain.binance.client.domain.OrderSide; -import com.tangem.blockchain.binance.client.domain.OrderType; -import com.tangem.blockchain.binance.client.domain.TimeInForce; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderSide; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderType; +import com.tangem.blockchain.blockchains.binance.client.domain.TimeInForce; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TokenFreeze.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TokenFreeze.java similarity index 81% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TokenFreeze.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TokenFreeze.java index 1e7b060765..228b7162ba 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TokenFreeze.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TokenFreeze.java @@ -1,6 +1,6 @@ -package com.tangem.blockchain.binance.client.domain.broadcast; +package com.tangem.blockchain.blockchains.binance.client.domain.broadcast; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TokenUnfreeze.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TokenUnfreeze.java similarity index 81% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TokenUnfreeze.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TokenUnfreeze.java index 3237ea9c97..798d5e5512 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TokenUnfreeze.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TokenUnfreeze.java @@ -1,6 +1,6 @@ -package com.tangem.blockchain.binance.client.domain.broadcast; +package com.tangem.blockchain.blockchains.binance.client.domain.broadcast; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TransactionOption.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TransactionOption.java similarity index 89% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TransactionOption.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TransactionOption.java index 4dea64843c..fdae3fc302 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/TransactionOption.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/TransactionOption.java @@ -1,6 +1,6 @@ -package com.tangem.blockchain.binance.client.domain.broadcast; +package com.tangem.blockchain.blockchains.binance.client.domain.broadcast; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/Transfer.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/Transfer.java similarity index 88% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/Transfer.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/Transfer.java index e9a9d0cbed..5b7c88693c 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/broadcast/Transfer.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/broadcast/Transfer.java @@ -1,6 +1,6 @@ -package com.tangem.blockchain.binance.client.domain.broadcast; +package com.tangem.blockchain.blockchains.binance.client.domain.broadcast; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/ClosedOrdersRequest.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/ClosedOrdersRequest.java similarity index 87% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/ClosedOrdersRequest.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/ClosedOrdersRequest.java index e9a0245677..5008ea4f91 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/ClosedOrdersRequest.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/ClosedOrdersRequest.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain.request; +package com.tangem.blockchain.blockchains.binance.client.domain.request; -import com.tangem.blockchain.binance.client.BinanceDexConstants; -import com.tangem.blockchain.binance.client.domain.OrderSide; -import com.tangem.blockchain.binance.client.domain.OrderStatus; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderSide; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderStatus; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/OpenOrdersRequest.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/OpenOrdersRequest.java similarity index 89% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/OpenOrdersRequest.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/OpenOrdersRequest.java index d7c764d453..0ad10b0949 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/OpenOrdersRequest.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/OpenOrdersRequest.java @@ -1,6 +1,6 @@ -package com.tangem.blockchain.binance.client.domain.request; +package com.tangem.blockchain.blockchains.binance.client.domain.request; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/TradesRequest.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/TradesRequest.java similarity index 92% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/TradesRequest.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/TradesRequest.java index ebf505f1d7..eb715f18a4 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/TradesRequest.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/TradesRequest.java @@ -1,7 +1,7 @@ -package com.tangem.blockchain.binance.client.domain.request; +package com.tangem.blockchain.blockchains.binance.client.domain.request; -import com.tangem.blockchain.binance.client.BinanceDexConstants; -import com.tangem.blockchain.binance.client.domain.OrderSide; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderSide; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/TransactionsRequest.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/TransactionsRequest.java similarity index 88% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/TransactionsRequest.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/TransactionsRequest.java index f1fab0e58d..3383340338 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/domain/request/TransactionsRequest.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/domain/request/TransactionsRequest.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.domain.request; +package com.tangem.blockchain.blockchains.binance.client.domain.request; -import com.tangem.blockchain.binance.client.BinanceDexConstants; -import com.tangem.blockchain.binance.client.domain.OrderSide; -import com.tangem.blockchain.binance.client.domain.TransactionType; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderSide; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionType; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/AddressFormatException.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/AddressFormatException.java similarity index 98% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/AddressFormatException.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/AddressFormatException.java index beb65209fe..e317e9ab57 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/AddressFormatException.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/AddressFormatException.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.tangem.blockchain.binance.client.encoding; +package com.tangem.blockchain.blockchains.binance.client.encoding; import org.bitcoinj.core.Base58; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/Bech32.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/Bech32.java similarity index 99% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/Bech32.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/Bech32.java index b4fd3d8928..0cc3ba6cf4 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/Bech32.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/Bech32.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.tangem.blockchain.binance.client.encoding; +package com.tangem.blockchain.blockchains.binance.client.encoding; import java.util.Arrays; import java.util.Locale; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/Crypto.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/Crypto.java similarity index 98% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/Crypto.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/Crypto.java index 03bc61e8fc..978ee1688c 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/Crypto.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/Crypto.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.encoding; +package com.tangem.blockchain.blockchains.binance.client.encoding; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.Sha256Hash; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/EncodeUtils.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/EncodeUtils.java similarity index 96% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/EncodeUtils.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/EncodeUtils.java index 16c884de83..e115f2842d 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/EncodeUtils.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/EncodeUtils.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.encoding; +package com.tangem.blockchain.blockchains.binance.client.encoding; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/BinanceDexTransactionMessage.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/BinanceDexTransactionMessage.java new file mode 100644 index 0000000000..d5d8eb741b --- /dev/null +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/BinanceDexTransactionMessage.java @@ -0,0 +1,4 @@ +package com.tangem.blockchain.blockchains.binance.client.encoding.message; + +public interface BinanceDexTransactionMessage { +} diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/CancelOrderMessage.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/CancelOrderMessage.java similarity index 88% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/CancelOrderMessage.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/CancelOrderMessage.java index 97c02a3963..86ef9ac37e 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/CancelOrderMessage.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/CancelOrderMessage.java @@ -1,9 +1,9 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/InputOutput.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/InputOutput.java similarity index 85% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/InputOutput.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/InputOutput.java index 4600475f79..f721c72d80 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/InputOutput.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/InputOutput.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/MessageType.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/MessageType.java similarity index 80% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/MessageType.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/MessageType.java index bb0107b6ec..df1461e92d 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/MessageType.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/MessageType.java @@ -1,6 +1,6 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; -import com.tangem.blockchain.binance.client.encoding.EncodeUtils; +import com.tangem.blockchain.blockchains.binance.client.encoding.EncodeUtils; /** * Binance dex standard transactiont types. diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/NewOrderMessage.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/NewOrderMessage.java similarity index 94% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/NewOrderMessage.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/NewOrderMessage.java index 66595d37f5..1739985a5c 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/NewOrderMessage.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/NewOrderMessage.java @@ -1,11 +1,11 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.tangem.blockchain.binance.client.domain.OrderSide; -import com.tangem.blockchain.binance.client.domain.OrderType; -import com.tangem.blockchain.binance.client.domain.TimeInForce; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderSide; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderType; +import com.tangem.blockchain.blockchains.binance.client.domain.TimeInForce; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/SignData.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/SignData.java similarity index 96% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/SignData.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/SignData.java index 4b259dc94b..fcf009416b 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/SignData.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/SignData.java @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/Token.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/Token.java similarity index 85% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/Token.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/Token.java index 62b5826b6c..7a1c22586c 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/Token.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/Token.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TokenFreezeMessage.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TokenFreezeMessage.java similarity index 88% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TokenFreezeMessage.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TokenFreezeMessage.java index a8f107f81b..6cb2e22052 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TokenFreezeMessage.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TokenFreezeMessage.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TokenUnfreezeMessage.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TokenUnfreezeMessage.java similarity index 88% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TokenUnfreezeMessage.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TokenUnfreezeMessage.java index 2ec5827eaa..8fbc8071a4 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TokenUnfreezeMessage.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TokenUnfreezeMessage.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransactionRequestAssembler.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransactionRequestAssembler.java similarity index 77% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransactionRequestAssembler.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransactionRequestAssembler.java index 74c27ae9b4..3def18de6d 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransactionRequestAssembler.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransactionRequestAssembler.java @@ -1,17 +1,17 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.annotations.VisibleForTesting; import com.google.protobuf.ByteString; -import com.tangem.blockchain.binance.client.Wallet; -import com.tangem.blockchain.binance.client.domain.broadcast.TokenFreeze; -import com.tangem.blockchain.binance.client.domain.broadcast.TokenUnfreeze; -import com.tangem.blockchain.binance.client.domain.broadcast.TransactionOption; -import com.tangem.blockchain.binance.client.domain.broadcast.Transfer; -import com.tangem.blockchain.binance.client.encoding.Crypto; -import com.tangem.blockchain.binance.client.encoding.EncodeUtils; -import com.tangem.blockchain.binance.proto.StdSignature; -import com.tangem.blockchain.binance.proto.StdTx; +import com.tangem.blockchain.blockchains.binance.client.Wallet; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TokenFreeze; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TokenUnfreeze; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TransactionOption; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.Transfer; +import com.tangem.blockchain.blockchains.binance.client.encoding.Crypto; +import com.tangem.blockchain.blockchains.binance.client.encoding.EncodeUtils; +import com.tangem.blockchain.blockchains.binance.proto.StdSignature; +import com.tangem.blockchain.blockchains.binance.proto.StdTx; import java.io.IOException; import java.math.BigDecimal; @@ -102,7 +102,7 @@ public class TransactionRequestAssembler { @VisibleForTesting NewOrderMessage createNewOrderMessage( - com.tangem.blockchain.binance.client.domain.broadcast.NewOrder newOrder) { + com.tangem.blockchain.blockchains.binance.client.domain.broadcast.NewOrder newOrder) { return NewOrderMessage.newBuilder() .setId(generateOrderId()) .setOrderType(newOrder.getOrderType()) @@ -118,7 +118,7 @@ public class TransactionRequestAssembler { @VisibleForTesting byte[] encodeNewOrderMessage(NewOrderMessage newOrder) throws IOException { - com.tangem.blockchain.binance.proto.NewOrder proto = com.tangem.blockchain.binance.proto.NewOrder.newBuilder() + com.tangem.blockchain.blockchains.binance.proto.NewOrder proto = com.tangem.blockchain.blockchains.binance.proto.NewOrder.newBuilder() .setSender(ByteString.copyFrom(wallet.getAddressBytes())) .setId(newOrder.getId()) .setSymbol(newOrder.getSymbol()) @@ -131,7 +131,7 @@ public class TransactionRequestAssembler { return EncodeUtils.aminoWrap(proto.toByteArray(), MessageType.NewOrder.getTypePrefixBytes(), false); } - public RequestBody buildNewOrder(com.tangem.blockchain.binance.client.domain.broadcast.NewOrder newOrder) + public RequestBody buildNewOrder(com.tangem.blockchain.blockchains.binance.client.domain.broadcast.NewOrder newOrder) throws IOException, NoSuchAlgorithmException { NewOrderMessage msgBean = createNewOrderMessage(newOrder); byte[] msg = encodeNewOrderMessage(msgBean); @@ -142,7 +142,7 @@ public class TransactionRequestAssembler { @VisibleForTesting CancelOrderMessage createCancelOrderMessage( - com.tangem.blockchain.binance.client.domain.broadcast.CancelOrder cancelOrder) { + com.tangem.blockchain.blockchains.binance.client.domain.broadcast.CancelOrder cancelOrder) { CancelOrderMessage bean = new CancelOrderMessage(); bean.setRefId(cancelOrder.getRefId()); @@ -154,7 +154,7 @@ public class TransactionRequestAssembler { @VisibleForTesting byte[] encodeCancelOrderMessage(CancelOrderMessage cancelOrder) throws IOException { - com.tangem.blockchain.binance.proto.CancelOrder proto = com.tangem.blockchain.binance.proto.CancelOrder.newBuilder() + com.tangem.blockchain.blockchains.binance.proto.CancelOrder proto = com.tangem.blockchain.blockchains.binance.proto.CancelOrder.newBuilder() .setSender(ByteString.copyFrom(wallet.getAddressBytes())) .setSymbol(cancelOrder.getSymbol()) .setRefid(cancelOrder.getRefId()) @@ -162,7 +162,7 @@ public class TransactionRequestAssembler { return EncodeUtils.aminoWrap(proto.toByteArray(), MessageType.CancelOrder.getTypePrefixBytes(), false); } - public RequestBody buildCancelOrder(com.tangem.blockchain.binance.client.domain.broadcast.CancelOrder cancelOrder) + public RequestBody buildCancelOrder(com.tangem.blockchain.blockchains.binance.client.domain.broadcast.CancelOrder cancelOrder) throws IOException, NoSuchAlgorithmException { CancelOrderMessage msgBean = createCancelOrderMessage(cancelOrder); byte[] msg = encodeCancelOrderMessage(msgBean); @@ -191,28 +191,28 @@ public class TransactionRequestAssembler { return msgBean; } - private com.tangem.blockchain.binance.proto.Send.Input toProtoInput(InputOutput input) { + private com.tangem.blockchain.blockchains.binance.proto.Send.Input toProtoInput(InputOutput input) { byte[] address = Crypto.decodeAddress(input.getAddress()); - com.tangem.blockchain.binance.proto.Send.Input.Builder builder = - com.tangem.blockchain.binance.proto.Send.Input.newBuilder().setAddress(ByteString.copyFrom(address)); + com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder builder = + com.tangem.blockchain.blockchains.binance.proto.Send.Input.newBuilder().setAddress(ByteString.copyFrom(address)); for (Token coin : input.getCoins()) { - com.tangem.blockchain.binance.proto.Send.Token protCoin = - com.tangem.blockchain.binance.proto.Send.Token.newBuilder().setAmount(coin.getAmount()) + com.tangem.blockchain.blockchains.binance.proto.Send.Token protCoin = + com.tangem.blockchain.blockchains.binance.proto.Send.Token.newBuilder().setAmount(coin.getAmount()) .setDenom(coin.getDenom()).build(); builder.addCoins(protCoin); } return builder.build(); } - private com.tangem.blockchain.binance.proto.Send.Output toProtoOutput(InputOutput output) { + private com.tangem.blockchain.blockchains.binance.proto.Send.Output toProtoOutput(InputOutput output) { byte[] address = Crypto.decodeAddress(output.getAddress()); - com.tangem.blockchain.binance.proto.Send.Output.Builder builder = - com.tangem.blockchain.binance.proto.Send.Output.newBuilder().setAddress(ByteString.copyFrom(address)); + com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder builder = + com.tangem.blockchain.blockchains.binance.proto.Send.Output.newBuilder().setAddress(ByteString.copyFrom(address)); for (Token coin : output.getCoins()) { - com.tangem.blockchain.binance.proto.Send.Token protCoin = - com.tangem.blockchain.binance.proto.Send.Token.newBuilder().setAmount(coin.getAmount()) + com.tangem.blockchain.blockchains.binance.proto.Send.Token protCoin = + com.tangem.blockchain.blockchains.binance.proto.Send.Token.newBuilder().setAmount(coin.getAmount()) .setDenom(coin.getDenom()).build(); builder.addCoins(protCoin); } @@ -222,14 +222,14 @@ public class TransactionRequestAssembler { @VisibleForTesting byte[] encodeTransferMessage(TransferMessage msg) throws IOException { - com.tangem.blockchain.binance.proto.Send.Builder builder = com.tangem.blockchain.binance.proto.Send.newBuilder(); + com.tangem.blockchain.blockchains.binance.proto.Send.Builder builder = com.tangem.blockchain.blockchains.binance.proto.Send.newBuilder(); for (InputOutput input : msg.getInputs()) { builder.addInputs(toProtoInput(input)); } for (InputOutput output : msg.getOutputs()) { builder.addOutputs(toProtoOutput(output)); } - com.tangem.blockchain.binance.proto.Send proto = builder.build(); + com.tangem.blockchain.blockchains.binance.proto.Send proto = builder.build(); return EncodeUtils.aminoWrap(proto.toByteArray(), MessageType.Send.getTypePrefixBytes(), false); } @@ -254,8 +254,8 @@ public class TransactionRequestAssembler { @VisibleForTesting byte[] encodeTokenFreezeMessage(TokenFreezeMessage freeze) throws IOException { byte[] address = Crypto.decodeAddress(freeze.getFrom()); - com.tangem.blockchain.binance.proto.TokenFreeze proto = - com.tangem.blockchain.binance.proto.TokenFreeze.newBuilder().setFrom(ByteString.copyFrom(address)) + com.tangem.blockchain.blockchains.binance.proto.TokenFreeze proto = + com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.newBuilder().setFrom(ByteString.copyFrom(address)) .setAmount(freeze.getAmount()) .setSymbol(freeze.getSymbol()) .build(); @@ -283,8 +283,8 @@ public class TransactionRequestAssembler { @VisibleForTesting byte[] encodeTokenUnfreezeMessage(TokenUnfreezeMessage unfreeze) throws IOException { byte[] address = Crypto.decodeAddress(unfreeze.getFrom()); - com.tangem.blockchain.binance.proto.TokenUnfreeze proto = - com.tangem.blockchain.binance.proto.TokenUnfreeze.newBuilder().setFrom(ByteString.copyFrom(address)) + com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze proto = + com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.newBuilder().setFrom(ByteString.copyFrom(address)) .setAmount(unfreeze.getAmount()) .setSymbol(unfreeze.getSymbol()) .build(); diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransactionRequestAssemblerExtSign.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransactionRequestAssemblerExtSign.java similarity index 74% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransactionRequestAssemblerExtSign.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransactionRequestAssemblerExtSign.java index 542035b54f..56090e756c 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransactionRequestAssemblerExtSign.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransactionRequestAssemblerExtSign.java @@ -1,14 +1,14 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.protobuf.ByteString; -import com.tangem.blockchain.binance.BinanceAccountData; -import com.tangem.blockchain.binance.client.domain.broadcast.TransactionOption; -import com.tangem.blockchain.binance.client.domain.broadcast.Transfer; -import com.tangem.blockchain.binance.client.encoding.Crypto; -import com.tangem.blockchain.binance.client.encoding.EncodeUtils; -import com.tangem.blockchain.binance.proto.StdSignature; -import com.tangem.blockchain.binance.proto.StdTx; +import com.tangem.blockchain.blockchains.binance.BinanceAccountData; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TransactionOption; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.Transfer; +import com.tangem.blockchain.blockchains.binance.client.encoding.Crypto; +import com.tangem.blockchain.blockchains.binance.client.encoding.EncodeUtils; +import com.tangem.blockchain.blockchains.binance.proto.StdSignature; +import com.tangem.blockchain.blockchains.binance.proto.StdTx; import java.io.IOException; import java.math.BigDecimal; @@ -107,28 +107,28 @@ public class TransactionRequestAssemblerExtSign { return msgBean; } - private com.tangem.blockchain.binance.proto.Send.Input toProtoInput(InputOutput input) { + private com.tangem.blockchain.blockchains.binance.proto.Send.Input toProtoInput(InputOutput input) { byte[] address = Crypto.decodeAddress(input.getAddress()); - com.tangem.blockchain.binance.proto.Send.Input.Builder builder = - com.tangem.blockchain.binance.proto.Send.Input.newBuilder().setAddress(ByteString.copyFrom(address)); + com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder builder = + com.tangem.blockchain.blockchains.binance.proto.Send.Input.newBuilder().setAddress(ByteString.copyFrom(address)); for (Token coin : input.getCoins()) { - com.tangem.blockchain.binance.proto.Send.Token protCoin = - com.tangem.blockchain.binance.proto.Send.Token.newBuilder().setAmount(coin.getAmount()) + com.tangem.blockchain.blockchains.binance.proto.Send.Token protCoin = + com.tangem.blockchain.blockchains.binance.proto.Send.Token.newBuilder().setAmount(coin.getAmount()) .setDenom(coin.getDenom()).build(); builder.addCoins(protCoin); } return builder.build(); } - private com.tangem.blockchain.binance.proto.Send.Output toProtoOutput(InputOutput output) { + private com.tangem.blockchain.blockchains.binance.proto.Send.Output toProtoOutput(InputOutput output) { byte[] address = Crypto.decodeAddress(output.getAddress()); - com.tangem.blockchain.binance.proto.Send.Output.Builder builder = - com.tangem.blockchain.binance.proto.Send.Output.newBuilder().setAddress(ByteString.copyFrom(address)); + com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder builder = + com.tangem.blockchain.blockchains.binance.proto.Send.Output.newBuilder().setAddress(ByteString.copyFrom(address)); for (Token coin : output.getCoins()) { - com.tangem.blockchain.binance.proto.Send.Token protCoin = - com.tangem.blockchain.binance.proto.Send.Token.newBuilder().setAmount(coin.getAmount()) + com.tangem.blockchain.blockchains.binance.proto.Send.Token protCoin = + com.tangem.blockchain.blockchains.binance.proto.Send.Token.newBuilder().setAmount(coin.getAmount()) .setDenom(coin.getDenom()).build(); builder.addCoins(protCoin); } @@ -137,14 +137,14 @@ public class TransactionRequestAssemblerExtSign { public byte[] encodeTransferMessage(TransferMessage msg) throws IOException { - com.tangem.blockchain.binance.proto.Send.Builder builder = com.tangem.blockchain.binance.proto.Send.newBuilder(); + com.tangem.blockchain.blockchains.binance.proto.Send.Builder builder = com.tangem.blockchain.blockchains.binance.proto.Send.newBuilder(); for (InputOutput input : msg.getInputs()) { builder.addInputs(toProtoInput(input)); } for (InputOutput output : msg.getOutputs()) { builder.addOutputs(toProtoOutput(output)); } - com.tangem.blockchain.binance.proto.Send proto = builder.build(); + com.tangem.blockchain.blockchains.binance.proto.Send proto = builder.build(); return EncodeUtils.aminoWrap(proto.toByteArray(), MessageType.Send.getTypePrefixBytes(), false); } diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransferMessage.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransferMessage.java similarity index 87% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransferMessage.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransferMessage.java index 03127c1b4e..c65f80f672 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/TransferMessage.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/TransferMessage.java @@ -1,8 +1,8 @@ -package com.tangem.blockchain.binance.client.encoding.message; +package com.tangem.blockchain.blockchains.binance.client.encoding.message; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.tangem.blockchain.binance.client.BinanceDexConstants; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexConstants; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/impl/BinanceDexApiAsyncRestClientImpl.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/impl/BinanceDexApiAsyncRestClientImpl.java similarity index 76% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/impl/BinanceDexApiAsyncRestClientImpl.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/impl/BinanceDexApiAsyncRestClientImpl.java index 8a0b39ff41..599eefc9bd 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/impl/BinanceDexApiAsyncRestClientImpl.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/impl/BinanceDexApiAsyncRestClientImpl.java @@ -1,15 +1,35 @@ -package com.tangem.blockchain.binance.client.impl; +package com.tangem.blockchain.blockchains.binance.client.impl; import android.os.Build; import androidx.annotation.RequiresApi; -import com.tangem.blockchain.binance.client.*; -import com.tangem.blockchain.binance.client.domain.*; -import com.tangem.blockchain.binance.client.domain.request.ClosedOrdersRequest; -import com.tangem.blockchain.binance.client.domain.request.OpenOrdersRequest; -import com.tangem.blockchain.binance.client.domain.request.TradesRequest; -import com.tangem.blockchain.binance.client.domain.request.TransactionsRequest; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApi; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiAsyncRestClient; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiCallback; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiCallbackAdapter; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiClientGenerator; +import com.tangem.blockchain.blockchains.binance.client.domain.Account; +import com.tangem.blockchain.blockchains.binance.client.domain.AccountSequence; +import com.tangem.blockchain.blockchains.binance.client.domain.Candlestick; +import com.tangem.blockchain.blockchains.binance.client.domain.CandlestickInterval; +import com.tangem.blockchain.blockchains.binance.client.domain.Infos; +import com.tangem.blockchain.blockchains.binance.client.domain.Market; +import com.tangem.blockchain.blockchains.binance.client.domain.Order; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderBook; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderList; +import com.tangem.blockchain.blockchains.binance.client.domain.Peer; +import com.tangem.blockchain.blockchains.binance.client.domain.TickerStatistics; +import com.tangem.blockchain.blockchains.binance.client.domain.Time; +import com.tangem.blockchain.blockchains.binance.client.domain.Token; +import com.tangem.blockchain.blockchains.binance.client.domain.TradePage; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionMetadata; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionPage; +import com.tangem.blockchain.blockchains.binance.client.domain.Validators; +import com.tangem.blockchain.blockchains.binance.client.domain.request.ClosedOrdersRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.OpenOrdersRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.TradesRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.TransactionsRequest; import java.util.List; import java.util.stream.Collectors; diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/client/impl/BinanceDexApiRestClientImpl.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/impl/BinanceDexApiRestClientImpl.java similarity index 76% rename from blockchain/src/main/java/com/tangem/blockchain/binance/client/impl/BinanceDexApiRestClientImpl.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/impl/BinanceDexApiRestClientImpl.java index 1203500906..ce3718eecb 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/client/impl/BinanceDexApiRestClientImpl.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/impl/BinanceDexApiRestClientImpl.java @@ -1,27 +1,52 @@ -package com.tangem.blockchain.binance.client.impl; +package com.tangem.blockchain.blockchains.binance.client.impl; import android.os.Build; import androidx.annotation.RequiresApi; -import com.tangem.blockchain.binance.BinanceAccountData; -import com.tangem.blockchain.binance.client.*; -import com.tangem.blockchain.binance.client.domain.*; -import com.tangem.blockchain.binance.client.domain.broadcast.*; -import com.tangem.blockchain.binance.client.domain.request.ClosedOrdersRequest; -import com.tangem.blockchain.binance.client.domain.request.OpenOrdersRequest; -import com.tangem.blockchain.binance.client.domain.request.TradesRequest; -import com.tangem.blockchain.binance.client.domain.request.TransactionsRequest; -import com.tangem.blockchain.binance.client.encoding.message.TransactionRequestAssembler; -import com.tangem.blockchain.binance.client.encoding.message.TransactionRequestAssemblerExtSign; - -import okhttp3.RequestBody; +import com.tangem.blockchain.blockchains.binance.BinanceAccountData; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApi; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiClientGenerator; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiException; +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiRestClient; +import com.tangem.blockchain.blockchains.binance.client.Wallet; +import com.tangem.blockchain.blockchains.binance.client.domain.Account; +import com.tangem.blockchain.blockchains.binance.client.domain.AccountSequence; +import com.tangem.blockchain.blockchains.binance.client.domain.Candlestick; +import com.tangem.blockchain.blockchains.binance.client.domain.CandlestickInterval; +import com.tangem.blockchain.blockchains.binance.client.domain.Infos; +import com.tangem.blockchain.blockchains.binance.client.domain.Market; +import com.tangem.blockchain.blockchains.binance.client.domain.Order; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderBook; +import com.tangem.blockchain.blockchains.binance.client.domain.OrderList; +import com.tangem.blockchain.blockchains.binance.client.domain.Peer; +import com.tangem.blockchain.blockchains.binance.client.domain.TickerStatistics; +import com.tangem.blockchain.blockchains.binance.client.domain.Time; +import com.tangem.blockchain.blockchains.binance.client.domain.Token; +import com.tangem.blockchain.blockchains.binance.client.domain.TradePage; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionMetadata; +import com.tangem.blockchain.blockchains.binance.client.domain.TransactionPage; +import com.tangem.blockchain.blockchains.binance.client.domain.Validators; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.CancelOrder; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.NewOrder; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TokenFreeze; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TokenUnfreeze; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TransactionOption; +import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.Transfer; +import com.tangem.blockchain.blockchains.binance.client.domain.request.ClosedOrdersRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.OpenOrdersRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.TradesRequest; +import com.tangem.blockchain.blockchains.binance.client.domain.request.TransactionsRequest; +import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransactionRequestAssembler; +import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransactionRequestAssemblerExtSign; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.List; import java.util.stream.Collectors; +import okhttp3.RequestBody; + /** * Binance DEX API rest client, supporting synchronous/blocking access Binance DEX's REST API. diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceApi.kt similarity index 63% rename from blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceApi.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceApi.kt index 94848788e5..c09f7d88f4 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceApi.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceApi.kt @@ -1,6 +1,5 @@ -package com.tangem.blockchain.binance.network +package com.tangem.blockchain.blockchains.binance.network -import retrofit2.Call import retrofit2.http.GET interface BinanceApi { diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt similarity index 67% rename from blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceNetworkManager.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt index 9e23db4578..92532a3ceb 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceNetworkManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt @@ -1,24 +1,29 @@ -package com.tangem.blockchain.binance.network +package com.tangem.blockchain.blockchains.binance.network -import com.tangem.blockchain.binance.client.BinanceDexApiClientFactory -import com.tangem.blockchain.binance.client.BinanceDexEnvironment -import com.tangem.blockchain.binance.client.encoding.message.TransactionRequestAssemblerExtSign +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiClientFactory +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiRestClient +import com.tangem.blockchain.blockchains.binance.client.BinanceDexEnvironment +import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransactionRequestAssemblerExtSign import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.extensions.Result -import com.tangem.blockchain.common.extensions.SimpleResult -import com.tangem.blockchain.common.extensions.retryIO -import com.tangem.blockchain.common.network.API_BINANCE -import com.tangem.blockchain.common.network.API_BINANCE_TESTNET -import com.tangem.blockchain.common.network.createRetrofitInstance +import com.tangem.blockchain.extensions.Result +import com.tangem.blockchain.extensions.SimpleResult +import com.tangem.blockchain.extensions.retryIO +import com.tangem.blockchain.network.API_BINANCE +import com.tangem.blockchain.network.API_BINANCE_TESTNET +import com.tangem.blockchain.network.createRetrofitInstance import okhttp3.RequestBody import java.math.BigDecimal -class BinanceNetworkManager(isTestNet: Boolean) { - val api = createRetrofitInstance(if (!isTestNet) API_BINANCE else API_BINANCE_TESTNET) - .create(BinanceApi::class.java) - val client = BinanceDexApiClientFactory.newInstance().newRestClient( - if (!isTestNet) BinanceDexEnvironment.PROD.baseUrl else BinanceDexEnvironment.TEST_NET.baseUrl - ) +class BinanceNetworkManager(isTestNet: Boolean = false) { + val api: BinanceApi by lazy { + createRetrofitInstance(if (!isTestNet) API_BINANCE else API_BINANCE_TESTNET) + .create(BinanceApi::class.java) + } + val client: BinanceDexApiRestClient by lazy { + BinanceDexApiClientFactory.newInstance().newRestClient( + if (!isTestNet) BinanceDexEnvironment.PROD.baseUrl else BinanceDexEnvironment.TEST_NET.baseUrl + ) + } suspend fun getInfo(address: String): Result { return try { @@ -57,7 +62,7 @@ class BinanceNetworkManager(isTestNet: Boolean) { for (binanceFee in feeData) { if (binanceFee.transactionFee != null) { fee = binanceFee.transactionFee?.value?.toBigDecimal() - ?.movePointLeft(Blockchain.Binance.decimals.toInt()) + ?.movePointLeft(Blockchain.Binance.decimals()) break } } diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceResponse.kt similarity index 87% rename from blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceResponse.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceResponse.kt index 19b1d6790e..94ac501363 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceResponse.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceResponse.kt @@ -1,4 +1,4 @@ -package com.tangem.blockchain.binance.network +package com.tangem.blockchain.blockchains.binance.network import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrder.java similarity index 82% rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrder.java rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrder.java index 25851c0dd9..848458ae27 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrder.java +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrder.java @@ -1,7 +1,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: dex.proto -package com.tangem.blockchain.binance.proto; +package com.tangem.blockchain.blockchains.binance.proto; /** *
@@ -87,15 +87,15 @@ private static final long serialVersionUID = 0L;
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
   }
 
   @Override
   protected FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_fieldAccessorTable
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.tangem.blockchain.binance.proto.CancelOrder.class, com.tangem.blockchain.binance.proto.CancelOrder.Builder.class);
+            com.tangem.blockchain.blockchains.binance.proto.CancelOrder.class, com.tangem.blockchain.blockchains.binance.proto.CancelOrder.Builder.class);
   }
 
   public static final int SENDER_FIELD_NUMBER = 1;
@@ -247,10 +247,10 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.tangem.blockchain.binance.proto.CancelOrder)) {
+    if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.CancelOrder)) {
       return super.equals(obj);
     }
-    com.tangem.blockchain.binance.proto.CancelOrder other = (com.tangem.blockchain.binance.proto.CancelOrder) obj;
+    com.tangem.blockchain.blockchains.binance.proto.CancelOrder other = (com.tangem.blockchain.blockchains.binance.proto.CancelOrder) obj;
 
     if (!getSender()
         .equals(other.getSender())) return false;
@@ -280,69 +280,69 @@ private static final long serialVersionUID = 0L;
     return hash;
   }
 
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(byte[] data)
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseDelimitedFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseDelimitedFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -355,7 +355,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.tangem.blockchain.binance.proto.CancelOrder prototype) {
+  public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.CancelOrder prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @Override
@@ -380,21 +380,21 @@ private static final long serialVersionUID = 0L;
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder implements
       // @@protoc_insertion_point(builder_implements:transaction.CancelOrder)
-      com.tangem.blockchain.binance.proto.CancelOrderOrBuilder {
+      com.tangem.blockchain.blockchains.binance.proto.CancelOrderOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.CancelOrder.class, com.tangem.blockchain.binance.proto.CancelOrder.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.CancelOrder.class, com.tangem.blockchain.blockchains.binance.proto.CancelOrder.Builder.class);
     }
 
-    // Construct using com.tangem.blockchain.binance.proto.CancelOrder.newBuilder()
+    // Construct using com.tangem.blockchain.blockchains.binance.proto.CancelOrder.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -424,17 +424,17 @@ private static final long serialVersionUID = 0L;
     @Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.CancelOrder getDefaultInstanceForType() {
-      return com.tangem.blockchain.binance.proto.CancelOrder.getDefaultInstance();
+    public com.tangem.blockchain.blockchains.binance.proto.CancelOrder getDefaultInstanceForType() {
+      return com.tangem.blockchain.blockchains.binance.proto.CancelOrder.getDefaultInstance();
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.CancelOrder build() {
-      com.tangem.blockchain.binance.proto.CancelOrder result = buildPartial();
+    public com.tangem.blockchain.blockchains.binance.proto.CancelOrder build() {
+      com.tangem.blockchain.blockchains.binance.proto.CancelOrder result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -442,8 +442,8 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.CancelOrder buildPartial() {
-      com.tangem.blockchain.binance.proto.CancelOrder result = new com.tangem.blockchain.binance.proto.CancelOrder(this);
+    public com.tangem.blockchain.blockchains.binance.proto.CancelOrder buildPartial() {
+      com.tangem.blockchain.blockchains.binance.proto.CancelOrder result = new com.tangem.blockchain.blockchains.binance.proto.CancelOrder(this);
       result.sender_ = sender_;
       result.symbol_ = symbol_;
       result.refid_ = refid_;
@@ -485,16 +485,16 @@ private static final long serialVersionUID = 0L;
     }
     @Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.tangem.blockchain.binance.proto.CancelOrder) {
-        return mergeFrom((com.tangem.blockchain.binance.proto.CancelOrder)other);
+      if (other instanceof com.tangem.blockchain.blockchains.binance.proto.CancelOrder) {
+        return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.CancelOrder)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.tangem.blockchain.binance.proto.CancelOrder other) {
-      if (other == com.tangem.blockchain.binance.proto.CancelOrder.getDefaultInstance()) return this;
+    public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.CancelOrder other) {
+      if (other == com.tangem.blockchain.blockchains.binance.proto.CancelOrder.getDefaultInstance()) return this;
       if (other.getSender() != com.google.protobuf.ByteString.EMPTY) {
         setSender(other.getSender());
       }
@@ -521,11 +521,11 @@ private static final long serialVersionUID = 0L;
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      com.tangem.blockchain.binance.proto.CancelOrder parsedMessage = null;
+      com.tangem.blockchain.blockchains.binance.proto.CancelOrder parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (com.tangem.blockchain.binance.proto.CancelOrder) e.getUnfinishedMessage();
+        parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.CancelOrder) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -770,12 +770,12 @@ private static final long serialVersionUID = 0L;
   }
 
   // @@protoc_insertion_point(class_scope:transaction.CancelOrder)
-  private static final com.tangem.blockchain.binance.proto.CancelOrder DEFAULT_INSTANCE;
+  private static final com.tangem.blockchain.blockchains.binance.proto.CancelOrder DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.CancelOrder();
+    DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.CancelOrder();
   }
 
-  public static com.tangem.blockchain.binance.proto.CancelOrder getDefaultInstance() {
+  public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
@@ -800,7 +800,7 @@ private static final long serialVersionUID = 0L;
   }
 
   @Override
-  public com.tangem.blockchain.binance.proto.CancelOrder getDefaultInstanceForType() {
+  public com.tangem.blockchain.blockchains.binance.proto.CancelOrder getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrderOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrderOrBuilder.java
similarity index 95%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrderOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrderOrBuilder.java
index 0e64ead9c6..d38131e1a8 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrderOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrderOrBuilder.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 public interface CancelOrderOrBuilder extends
     // @@protoc_insertion_point(interface_extends:transaction.CancelOrder)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrder.java
similarity index 87%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrder.java
index dbcdad4485..3772da239c 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrder.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 /**
  * 
@@ -112,15 +112,15 @@ private static final long serialVersionUID = 0L;
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
   }
 
   @Override
   protected FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_fieldAccessorTable
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.tangem.blockchain.binance.proto.NewOrder.class, com.tangem.blockchain.binance.proto.NewOrder.Builder.class);
+            com.tangem.blockchain.blockchains.binance.proto.NewOrder.class, com.tangem.blockchain.blockchains.binance.proto.NewOrder.Builder.class);
   }
 
   public static final int SENDER_FIELD_NUMBER = 1;
@@ -372,10 +372,10 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.tangem.blockchain.binance.proto.NewOrder)) {
+    if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.NewOrder)) {
       return super.equals(obj);
     }
-    com.tangem.blockchain.binance.proto.NewOrder other = (com.tangem.blockchain.binance.proto.NewOrder) obj;
+    com.tangem.blockchain.blockchains.binance.proto.NewOrder other = (com.tangem.blockchain.blockchains.binance.proto.NewOrder) obj;
 
     if (!getSender()
         .equals(other.getSender())) return false;
@@ -430,69 +430,69 @@ private static final long serialVersionUID = 0L;
     return hash;
   }
 
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(byte[] data)
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseDelimitedFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseDelimitedFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -505,7 +505,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.tangem.blockchain.binance.proto.NewOrder prototype) {
+  public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.NewOrder prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @Override
@@ -530,21 +530,21 @@ private static final long serialVersionUID = 0L;
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder implements
       // @@protoc_insertion_point(builder_implements:transaction.NewOrder)
-      com.tangem.blockchain.binance.proto.NewOrderOrBuilder {
+      com.tangem.blockchain.blockchains.binance.proto.NewOrderOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.NewOrder.class, com.tangem.blockchain.binance.proto.NewOrder.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.NewOrder.class, com.tangem.blockchain.blockchains.binance.proto.NewOrder.Builder.class);
     }
 
-    // Construct using com.tangem.blockchain.binance.proto.NewOrder.newBuilder()
+    // Construct using com.tangem.blockchain.blockchains.binance.proto.NewOrder.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -584,17 +584,17 @@ private static final long serialVersionUID = 0L;
     @Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.NewOrder getDefaultInstanceForType() {
-      return com.tangem.blockchain.binance.proto.NewOrder.getDefaultInstance();
+    public com.tangem.blockchain.blockchains.binance.proto.NewOrder getDefaultInstanceForType() {
+      return com.tangem.blockchain.blockchains.binance.proto.NewOrder.getDefaultInstance();
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.NewOrder build() {
-      com.tangem.blockchain.binance.proto.NewOrder result = buildPartial();
+    public com.tangem.blockchain.blockchains.binance.proto.NewOrder build() {
+      com.tangem.blockchain.blockchains.binance.proto.NewOrder result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -602,8 +602,8 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.NewOrder buildPartial() {
-      com.tangem.blockchain.binance.proto.NewOrder result = new com.tangem.blockchain.binance.proto.NewOrder(this);
+    public com.tangem.blockchain.blockchains.binance.proto.NewOrder buildPartial() {
+      com.tangem.blockchain.blockchains.binance.proto.NewOrder result = new com.tangem.blockchain.blockchains.binance.proto.NewOrder(this);
       result.sender_ = sender_;
       result.id_ = id_;
       result.symbol_ = symbol_;
@@ -650,16 +650,16 @@ private static final long serialVersionUID = 0L;
     }
     @Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.tangem.blockchain.binance.proto.NewOrder) {
-        return mergeFrom((com.tangem.blockchain.binance.proto.NewOrder)other);
+      if (other instanceof com.tangem.blockchain.blockchains.binance.proto.NewOrder) {
+        return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.NewOrder)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.tangem.blockchain.binance.proto.NewOrder other) {
-      if (other == com.tangem.blockchain.binance.proto.NewOrder.getDefaultInstance()) return this;
+    public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.NewOrder other) {
+      if (other == com.tangem.blockchain.blockchains.binance.proto.NewOrder.getDefaultInstance()) return this;
       if (other.getSender() != com.google.protobuf.ByteString.EMPTY) {
         setSender(other.getSender());
       }
@@ -701,11 +701,11 @@ private static final long serialVersionUID = 0L;
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      com.tangem.blockchain.binance.proto.NewOrder parsedMessage = null;
+      com.tangem.blockchain.blockchains.binance.proto.NewOrder parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (com.tangem.blockchain.binance.proto.NewOrder) e.getUnfinishedMessage();
+        parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.NewOrder) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -1140,12 +1140,12 @@ private static final long serialVersionUID = 0L;
   }
 
   // @@protoc_insertion_point(class_scope:transaction.NewOrder)
-  private static final com.tangem.blockchain.binance.proto.NewOrder DEFAULT_INSTANCE;
+  private static final com.tangem.blockchain.blockchains.binance.proto.NewOrder DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.NewOrder();
+    DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.NewOrder();
   }
 
-  public static com.tangem.blockchain.binance.proto.NewOrder getDefaultInstance() {
+  public static com.tangem.blockchain.blockchains.binance.proto.NewOrder getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
@@ -1170,7 +1170,7 @@ private static final long serialVersionUID = 0L;
   }
 
   @Override
-  public com.tangem.blockchain.binance.proto.NewOrder getDefaultInstanceForType() {
+  public com.tangem.blockchain.blockchains.binance.proto.NewOrder getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrderOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrderOrBuilder.java
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrderOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrderOrBuilder.java
index 90cc743439..42c4c45549 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrderOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrderOrBuilder.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 public interface NewOrderOrBuilder extends
     // @@protoc_insertion_point(interface_extends:transaction.NewOrder)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/Send.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Send.java
similarity index 75%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/Send.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Send.java
index b5b491d6ac..6a8d21f1f9 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/Send.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Send.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 /**
  * 
@@ -50,20 +50,20 @@ private static final long serialVersionUID = 0L;
             break;
           case 10: {
             if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-              inputs_ = new java.util.ArrayList();
+              inputs_ = new java.util.ArrayList();
               mutable_bitField0_ |= 0x00000001;
             }
             inputs_.add(
-                input.readMessage(com.tangem.blockchain.binance.proto.Send.Input.parser(), extensionRegistry));
+                input.readMessage(com.tangem.blockchain.blockchains.binance.proto.Send.Input.parser(), extensionRegistry));
             break;
           }
           case 18: {
             if (!((mutable_bitField0_ & 0x00000002) != 0)) {
-              outputs_ = new java.util.ArrayList();
+              outputs_ = new java.util.ArrayList();
               mutable_bitField0_ |= 0x00000002;
             }
             outputs_.add(
-                input.readMessage(com.tangem.blockchain.binance.proto.Send.Output.parser(), extensionRegistry));
+                input.readMessage(com.tangem.blockchain.blockchains.binance.proto.Send.Output.parser(), extensionRegistry));
             break;
           }
           default: {
@@ -93,15 +93,15 @@ private static final long serialVersionUID = 0L;
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
   }
 
   @Override
   protected FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_fieldAccessorTable
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.tangem.blockchain.binance.proto.Send.class, com.tangem.blockchain.binance.proto.Send.Builder.class);
+            com.tangem.blockchain.blockchains.binance.proto.Send.class, com.tangem.blockchain.blockchains.binance.proto.Send.Builder.class);
   }
 
   public interface TokenOrBuilder extends
@@ -199,15 +199,15 @@ private static final long serialVersionUID = 0L;
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.Send.Token.class, com.tangem.blockchain.binance.proto.Send.Token.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.Send.Token.class, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder.class);
     }
 
     public static final int DENOM_FIELD_NUMBER = 1;
@@ -299,10 +299,10 @@ private static final long serialVersionUID = 0L;
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof com.tangem.blockchain.binance.proto.Send.Token)) {
+      if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Token)) {
         return super.equals(obj);
       }
-      com.tangem.blockchain.binance.proto.Send.Token other = (com.tangem.blockchain.binance.proto.Send.Token) obj;
+      com.tangem.blockchain.blockchains.binance.proto.Send.Token other = (com.tangem.blockchain.blockchains.binance.proto.Send.Token) obj;
 
       if (!getDenom()
           .equals(other.getDenom())) return false;
@@ -329,69 +329,69 @@ private static final long serialVersionUID = 0L;
       return hash;
     }
 
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(byte[] data)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(java.io.InputStream input)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseDelimitedFrom(java.io.InputStream input)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseDelimitedFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -404,7 +404,7 @@ private static final long serialVersionUID = 0L;
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(com.tangem.blockchain.binance.proto.Send.Token prototype) {
+    public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.Send.Token prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @Override
@@ -429,21 +429,21 @@ private static final long serialVersionUID = 0L;
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder implements
         // @@protoc_insertion_point(builder_implements:transaction.Send.Token)
-        com.tangem.blockchain.binance.proto.Send.TokenOrBuilder {
+        com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
       }
 
       @Override
       protected FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_fieldAccessorTable
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                com.tangem.blockchain.binance.proto.Send.Token.class, com.tangem.blockchain.binance.proto.Send.Token.Builder.class);
+                com.tangem.blockchain.blockchains.binance.proto.Send.Token.class, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder.class);
       }
 
-      // Construct using com.tangem.blockchain.binance.proto.Send.Token.newBuilder()
+      // Construct using com.tangem.blockchain.blockchains.binance.proto.Send.Token.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -471,17 +471,17 @@ private static final long serialVersionUID = 0L;
       @Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Token getDefaultInstanceForType() {
-        return com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance();
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token getDefaultInstanceForType() {
+        return com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance();
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Token build() {
-        com.tangem.blockchain.binance.proto.Send.Token result = buildPartial();
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token build() {
+        com.tangem.blockchain.blockchains.binance.proto.Send.Token result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -489,8 +489,8 @@ private static final long serialVersionUID = 0L;
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Token buildPartial() {
-        com.tangem.blockchain.binance.proto.Send.Token result = new com.tangem.blockchain.binance.proto.Send.Token(this);
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token buildPartial() {
+        com.tangem.blockchain.blockchains.binance.proto.Send.Token result = new com.tangem.blockchain.blockchains.binance.proto.Send.Token(this);
         result.denom_ = denom_;
         result.amount_ = amount_;
         onBuilt();
@@ -531,16 +531,16 @@ private static final long serialVersionUID = 0L;
       }
       @Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.tangem.blockchain.binance.proto.Send.Token) {
-          return mergeFrom((com.tangem.blockchain.binance.proto.Send.Token)other);
+        if (other instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Token) {
+          return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.Send.Token)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(com.tangem.blockchain.binance.proto.Send.Token other) {
-        if (other == com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance()) return this;
+      public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.Send.Token other) {
+        if (other == com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance()) return this;
         if (!other.getDenom().isEmpty()) {
           denom_ = other.denom_;
           onChanged();
@@ -563,11 +563,11 @@ private static final long serialVersionUID = 0L;
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        com.tangem.blockchain.binance.proto.Send.Token parsedMessage = null;
+        com.tangem.blockchain.blockchains.binance.proto.Send.Token parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.tangem.blockchain.binance.proto.Send.Token) e.getUnfinishedMessage();
+          parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.Send.Token) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -688,12 +688,12 @@ private static final long serialVersionUID = 0L;
     }
 
     // @@protoc_insertion_point(class_scope:transaction.Send.Token)
-    private static final com.tangem.blockchain.binance.proto.Send.Token DEFAULT_INSTANCE;
+    private static final com.tangem.blockchain.blockchains.binance.proto.Send.Token DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.Send.Token();
+      DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.Send.Token();
     }
 
-    public static com.tangem.blockchain.binance.proto.Send.Token getDefaultInstance() {
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Token getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -718,7 +718,7 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.Send.Token getDefaultInstanceForType() {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Token getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -736,12 +736,12 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    java.util.List
+    java.util.List
         getCoinsList();
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    com.tangem.blockchain.binance.proto.Send.Token getCoins(int index);
+    com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index);
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
@@ -749,12 +749,12 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    java.util.List
+    java.util.List
         getCoinsOrBuilderList();
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+    com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
             int index);
   }
   /**
@@ -805,11 +805,11 @@ private static final long serialVersionUID = 0L;
             }
             case 18: {
               if (!((mutable_bitField0_ & 0x00000002) != 0)) {
-                coins_ = new java.util.ArrayList();
+                coins_ = new java.util.ArrayList();
                 mutable_bitField0_ |= 0x00000002;
               }
               coins_.add(
-                  input.readMessage(com.tangem.blockchain.binance.proto.Send.Token.parser(), extensionRegistry));
+                  input.readMessage(com.tangem.blockchain.blockchains.binance.proto.Send.Token.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -836,15 +836,15 @@ private static final long serialVersionUID = 0L;
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.Send.Input.class, com.tangem.blockchain.binance.proto.Send.Input.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.Send.Input.class, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder.class);
     }
 
     private int bitField0_;
@@ -858,17 +858,17 @@ private static final long serialVersionUID = 0L;
     }
 
     public static final int COINS_FIELD_NUMBER = 2;
-    private java.util.List coins_;
+    private java.util.List coins_;
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    public java.util.List getCoinsList() {
+    public java.util.List getCoinsList() {
       return coins_;
     }
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    public java.util.List
+    public java.util.List
         getCoinsOrBuilderList() {
       return coins_;
     }
@@ -881,13 +881,13 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.Token getCoins(int index) {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index) {
       return coins_.get(index);
     }
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+    public com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
         int index) {
       return coins_.get(index);
     }
@@ -939,10 +939,10 @@ private static final long serialVersionUID = 0L;
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof com.tangem.blockchain.binance.proto.Send.Input)) {
+      if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Input)) {
         return super.equals(obj);
       }
-      com.tangem.blockchain.binance.proto.Send.Input other = (com.tangem.blockchain.binance.proto.Send.Input) obj;
+      com.tangem.blockchain.blockchains.binance.proto.Send.Input other = (com.tangem.blockchain.blockchains.binance.proto.Send.Input) obj;
 
       if (!getAddress()
           .equals(other.getAddress())) return false;
@@ -970,69 +970,69 @@ private static final long serialVersionUID = 0L;
       return hash;
     }
 
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(byte[] data)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(java.io.InputStream input)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseDelimitedFrom(java.io.InputStream input)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseDelimitedFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -1045,7 +1045,7 @@ private static final long serialVersionUID = 0L;
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(com.tangem.blockchain.binance.proto.Send.Input prototype) {
+    public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.Send.Input prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @Override
@@ -1066,21 +1066,21 @@ private static final long serialVersionUID = 0L;
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder implements
         // @@protoc_insertion_point(builder_implements:transaction.Send.Input)
-        com.tangem.blockchain.binance.proto.Send.InputOrBuilder {
+        com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
       }
 
       @Override
       protected FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_fieldAccessorTable
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                com.tangem.blockchain.binance.proto.Send.Input.class, com.tangem.blockchain.binance.proto.Send.Input.Builder.class);
+                com.tangem.blockchain.blockchains.binance.proto.Send.Input.class, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder.class);
       }
 
-      // Construct using com.tangem.blockchain.binance.proto.Send.Input.newBuilder()
+      // Construct using com.tangem.blockchain.blockchains.binance.proto.Send.Input.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -1113,17 +1113,17 @@ private static final long serialVersionUID = 0L;
       @Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Input getDefaultInstanceForType() {
-        return com.tangem.blockchain.binance.proto.Send.Input.getDefaultInstance();
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Input getDefaultInstanceForType() {
+        return com.tangem.blockchain.blockchains.binance.proto.Send.Input.getDefaultInstance();
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Input build() {
-        com.tangem.blockchain.binance.proto.Send.Input result = buildPartial();
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Input build() {
+        com.tangem.blockchain.blockchains.binance.proto.Send.Input result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -1131,8 +1131,8 @@ private static final long serialVersionUID = 0L;
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Input buildPartial() {
-        com.tangem.blockchain.binance.proto.Send.Input result = new com.tangem.blockchain.binance.proto.Send.Input(this);
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Input buildPartial() {
+        com.tangem.blockchain.blockchains.binance.proto.Send.Input result = new com.tangem.blockchain.blockchains.binance.proto.Send.Input(this);
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         result.address_ = address_;
@@ -1184,16 +1184,16 @@ private static final long serialVersionUID = 0L;
       }
       @Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.tangem.blockchain.binance.proto.Send.Input) {
-          return mergeFrom((com.tangem.blockchain.binance.proto.Send.Input)other);
+        if (other instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Input) {
+          return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.Send.Input)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(com.tangem.blockchain.binance.proto.Send.Input other) {
-        if (other == com.tangem.blockchain.binance.proto.Send.Input.getDefaultInstance()) return this;
+      public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.Send.Input other) {
+        if (other == com.tangem.blockchain.blockchains.binance.proto.Send.Input.getDefaultInstance()) return this;
         if (other.getAddress() != com.google.protobuf.ByteString.EMPTY) {
           setAddress(other.getAddress());
         }
@@ -1238,11 +1238,11 @@ private static final long serialVersionUID = 0L;
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        com.tangem.blockchain.binance.proto.Send.Input parsedMessage = null;
+        com.tangem.blockchain.blockchains.binance.proto.Send.Input parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.tangem.blockchain.binance.proto.Send.Input) e.getUnfinishedMessage();
+          parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.Send.Input) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -1282,22 +1282,22 @@ private static final long serialVersionUID = 0L;
         return this;
       }
 
-      private java.util.List coins_ =
+      private java.util.List coins_ =
         java.util.Collections.emptyList();
       private void ensureCoinsIsMutable() {
         if (!((bitField0_ & 0x00000002) != 0)) {
-          coins_ = new java.util.ArrayList(coins_);
+          coins_ = new java.util.ArrayList(coins_);
           bitField0_ |= 0x00000002;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder> coinsBuilder_;
+          com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder> coinsBuilder_;
 
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public java.util.List getCoinsList() {
+      public java.util.List getCoinsList() {
         if (coinsBuilder_ == null) {
           return java.util.Collections.unmodifiableList(coins_);
         } else {
@@ -1317,7 +1317,7 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.Token getCoins(int index) {
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index) {
         if (coinsBuilder_ == null) {
           return coins_.get(index);
         } else {
@@ -1328,7 +1328,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder setCoins(
-          int index, com.tangem.blockchain.binance.proto.Send.Token value) {
+          int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
         if (coinsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
@@ -1345,7 +1345,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder setCoins(
-          int index, com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+          int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
         if (coinsBuilder_ == null) {
           ensureCoinsIsMutable();
           coins_.set(index, builderForValue.build());
@@ -1358,7 +1358,7 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public Builder addCoins(com.tangem.blockchain.binance.proto.Send.Token value) {
+      public Builder addCoins(com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
         if (coinsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
@@ -1375,7 +1375,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder addCoins(
-          int index, com.tangem.blockchain.binance.proto.Send.Token value) {
+          int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
         if (coinsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
@@ -1392,7 +1392,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder addCoins(
-          com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+          com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
         if (coinsBuilder_ == null) {
           ensureCoinsIsMutable();
           coins_.add(builderForValue.build());
@@ -1406,7 +1406,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder addCoins(
-          int index, com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+          int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
         if (coinsBuilder_ == null) {
           ensureCoinsIsMutable();
           coins_.add(index, builderForValue.build());
@@ -1420,7 +1420,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder addAllCoins(
-          Iterable values) {
+          Iterable values) {
         if (coinsBuilder_ == null) {
           ensureCoinsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -1460,14 +1460,14 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.Token.Builder getCoinsBuilder(
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder getCoinsBuilder(
           int index) {
         return getCoinsFieldBuilder().getBuilder(index);
       }
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+      public com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
           int index) {
         if (coinsBuilder_ == null) {
           return coins_.get(index);  } else {
@@ -1477,7 +1477,7 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public java.util.List
+      public java.util.List
            getCoinsOrBuilderList() {
         if (coinsBuilder_ != null) {
           return coinsBuilder_.getMessageOrBuilderList();
@@ -1488,31 +1488,31 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.Token.Builder addCoinsBuilder() {
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder addCoinsBuilder() {
         return getCoinsFieldBuilder().addBuilder(
-            com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance());
+            com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance());
       }
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.Token.Builder addCoinsBuilder(
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder addCoinsBuilder(
           int index) {
         return getCoinsFieldBuilder().addBuilder(
-            index, com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance());
+            index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance());
       }
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public java.util.List
+      public java.util.List
            getCoinsBuilderList() {
         return getCoinsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+          com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
           getCoinsFieldBuilder() {
         if (coinsBuilder_ == null) {
           coinsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>(
+              com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>(
                   coins_,
                   ((bitField0_ & 0x00000002) != 0),
                   getParentForChildren(),
@@ -1538,12 +1538,12 @@ private static final long serialVersionUID = 0L;
     }
 
     // @@protoc_insertion_point(class_scope:transaction.Send.Input)
-    private static final com.tangem.blockchain.binance.proto.Send.Input DEFAULT_INSTANCE;
+    private static final com.tangem.blockchain.blockchains.binance.proto.Send.Input DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.Send.Input();
+      DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.Send.Input();
     }
 
-    public static com.tangem.blockchain.binance.proto.Send.Input getDefaultInstance() {
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Input getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -1568,7 +1568,7 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.Send.Input getDefaultInstanceForType() {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Input getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -1586,12 +1586,12 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    java.util.List
+    java.util.List
         getCoinsList();
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    com.tangem.blockchain.binance.proto.Send.Token getCoins(int index);
+    com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index);
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
@@ -1599,12 +1599,12 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    java.util.List
+    java.util.List
         getCoinsOrBuilderList();
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+    com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
             int index);
   }
   /**
@@ -1655,11 +1655,11 @@ private static final long serialVersionUID = 0L;
             }
             case 18: {
               if (!((mutable_bitField0_ & 0x00000002) != 0)) {
-                coins_ = new java.util.ArrayList();
+                coins_ = new java.util.ArrayList();
                 mutable_bitField0_ |= 0x00000002;
               }
               coins_.add(
-                  input.readMessage(com.tangem.blockchain.binance.proto.Send.Token.parser(), extensionRegistry));
+                  input.readMessage(com.tangem.blockchain.blockchains.binance.proto.Send.Token.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -1686,15 +1686,15 @@ private static final long serialVersionUID = 0L;
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.Send.Output.class, com.tangem.blockchain.binance.proto.Send.Output.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.Send.Output.class, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder.class);
     }
 
     private int bitField0_;
@@ -1708,17 +1708,17 @@ private static final long serialVersionUID = 0L;
     }
 
     public static final int COINS_FIELD_NUMBER = 2;
-    private java.util.List coins_;
+    private java.util.List coins_;
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    public java.util.List getCoinsList() {
+    public java.util.List getCoinsList() {
       return coins_;
     }
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    public java.util.List
+    public java.util.List
         getCoinsOrBuilderList() {
       return coins_;
     }
@@ -1731,13 +1731,13 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.Token getCoins(int index) {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index) {
       return coins_.get(index);
     }
     /**
      * repeated .transaction.Send.Token coins = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+    public com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
         int index) {
       return coins_.get(index);
     }
@@ -1789,10 +1789,10 @@ private static final long serialVersionUID = 0L;
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof com.tangem.blockchain.binance.proto.Send.Output)) {
+      if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Output)) {
         return super.equals(obj);
       }
-      com.tangem.blockchain.binance.proto.Send.Output other = (com.tangem.blockchain.binance.proto.Send.Output) obj;
+      com.tangem.blockchain.blockchains.binance.proto.Send.Output other = (com.tangem.blockchain.blockchains.binance.proto.Send.Output) obj;
 
       if (!getAddress()
           .equals(other.getAddress())) return false;
@@ -1820,69 +1820,69 @@ private static final long serialVersionUID = 0L;
       return hash;
     }
 
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(byte[] data)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(java.io.InputStream input)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseDelimitedFrom(java.io.InputStream input)
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseDelimitedFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -1895,7 +1895,7 @@ private static final long serialVersionUID = 0L;
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(com.tangem.blockchain.binance.proto.Send.Output prototype) {
+    public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.Send.Output prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @Override
@@ -1916,21 +1916,21 @@ private static final long serialVersionUID = 0L;
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder implements
         // @@protoc_insertion_point(builder_implements:transaction.Send.Output)
-        com.tangem.blockchain.binance.proto.Send.OutputOrBuilder {
+        com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
       }
 
       @Override
       protected FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_fieldAccessorTable
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                com.tangem.blockchain.binance.proto.Send.Output.class, com.tangem.blockchain.binance.proto.Send.Output.Builder.class);
+                com.tangem.blockchain.blockchains.binance.proto.Send.Output.class, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder.class);
       }
 
-      // Construct using com.tangem.blockchain.binance.proto.Send.Output.newBuilder()
+      // Construct using com.tangem.blockchain.blockchains.binance.proto.Send.Output.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -1963,17 +1963,17 @@ private static final long serialVersionUID = 0L;
       @Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Output getDefaultInstanceForType() {
-        return com.tangem.blockchain.binance.proto.Send.Output.getDefaultInstance();
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Output getDefaultInstanceForType() {
+        return com.tangem.blockchain.blockchains.binance.proto.Send.Output.getDefaultInstance();
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Output build() {
-        com.tangem.blockchain.binance.proto.Send.Output result = buildPartial();
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Output build() {
+        com.tangem.blockchain.blockchains.binance.proto.Send.Output result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -1981,8 +1981,8 @@ private static final long serialVersionUID = 0L;
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.Send.Output buildPartial() {
-        com.tangem.blockchain.binance.proto.Send.Output result = new com.tangem.blockchain.binance.proto.Send.Output(this);
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Output buildPartial() {
+        com.tangem.blockchain.blockchains.binance.proto.Send.Output result = new com.tangem.blockchain.blockchains.binance.proto.Send.Output(this);
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         result.address_ = address_;
@@ -2034,16 +2034,16 @@ private static final long serialVersionUID = 0L;
       }
       @Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.tangem.blockchain.binance.proto.Send.Output) {
-          return mergeFrom((com.tangem.blockchain.binance.proto.Send.Output)other);
+        if (other instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Output) {
+          return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.Send.Output)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(com.tangem.blockchain.binance.proto.Send.Output other) {
-        if (other == com.tangem.blockchain.binance.proto.Send.Output.getDefaultInstance()) return this;
+      public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.Send.Output other) {
+        if (other == com.tangem.blockchain.blockchains.binance.proto.Send.Output.getDefaultInstance()) return this;
         if (other.getAddress() != com.google.protobuf.ByteString.EMPTY) {
           setAddress(other.getAddress());
         }
@@ -2088,11 +2088,11 @@ private static final long serialVersionUID = 0L;
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        com.tangem.blockchain.binance.proto.Send.Output parsedMessage = null;
+        com.tangem.blockchain.blockchains.binance.proto.Send.Output parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.tangem.blockchain.binance.proto.Send.Output) e.getUnfinishedMessage();
+          parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.Send.Output) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -2132,22 +2132,22 @@ private static final long serialVersionUID = 0L;
         return this;
       }
 
-      private java.util.List coins_ =
+      private java.util.List coins_ =
         java.util.Collections.emptyList();
       private void ensureCoinsIsMutable() {
         if (!((bitField0_ & 0x00000002) != 0)) {
-          coins_ = new java.util.ArrayList(coins_);
+          coins_ = new java.util.ArrayList(coins_);
           bitField0_ |= 0x00000002;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder> coinsBuilder_;
+          com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder> coinsBuilder_;
 
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public java.util.List getCoinsList() {
+      public java.util.List getCoinsList() {
         if (coinsBuilder_ == null) {
           return java.util.Collections.unmodifiableList(coins_);
         } else {
@@ -2167,7 +2167,7 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.Token getCoins(int index) {
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index) {
         if (coinsBuilder_ == null) {
           return coins_.get(index);
         } else {
@@ -2178,7 +2178,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder setCoins(
-          int index, com.tangem.blockchain.binance.proto.Send.Token value) {
+          int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
         if (coinsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
@@ -2195,7 +2195,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder setCoins(
-          int index, com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+          int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
         if (coinsBuilder_ == null) {
           ensureCoinsIsMutable();
           coins_.set(index, builderForValue.build());
@@ -2208,7 +2208,7 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public Builder addCoins(com.tangem.blockchain.binance.proto.Send.Token value) {
+      public Builder addCoins(com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
         if (coinsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
@@ -2225,7 +2225,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder addCoins(
-          int index, com.tangem.blockchain.binance.proto.Send.Token value) {
+          int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
         if (coinsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
@@ -2242,7 +2242,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder addCoins(
-          com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+          com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
         if (coinsBuilder_ == null) {
           ensureCoinsIsMutable();
           coins_.add(builderForValue.build());
@@ -2256,7 +2256,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder addCoins(
-          int index, com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+          int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
         if (coinsBuilder_ == null) {
           ensureCoinsIsMutable();
           coins_.add(index, builderForValue.build());
@@ -2270,7 +2270,7 @@ private static final long serialVersionUID = 0L;
        * repeated .transaction.Send.Token coins = 2;
        */
       public Builder addAllCoins(
-          Iterable values) {
+          Iterable values) {
         if (coinsBuilder_ == null) {
           ensureCoinsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -2310,14 +2310,14 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.Token.Builder getCoinsBuilder(
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder getCoinsBuilder(
           int index) {
         return getCoinsFieldBuilder().getBuilder(index);
       }
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+      public com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
           int index) {
         if (coinsBuilder_ == null) {
           return coins_.get(index);  } else {
@@ -2327,7 +2327,7 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public java.util.List
+      public java.util.List
            getCoinsOrBuilderList() {
         if (coinsBuilder_ != null) {
           return coinsBuilder_.getMessageOrBuilderList();
@@ -2338,31 +2338,31 @@ private static final long serialVersionUID = 0L;
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.Token.Builder addCoinsBuilder() {
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder addCoinsBuilder() {
         return getCoinsFieldBuilder().addBuilder(
-            com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance());
+            com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance());
       }
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public com.tangem.blockchain.binance.proto.Send.Token.Builder addCoinsBuilder(
+      public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder addCoinsBuilder(
           int index) {
         return getCoinsFieldBuilder().addBuilder(
-            index, com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance());
+            index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance());
       }
       /**
        * repeated .transaction.Send.Token coins = 2;
        */
-      public java.util.List
+      public java.util.List
            getCoinsBuilderList() {
         return getCoinsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+          com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
           getCoinsFieldBuilder() {
         if (coinsBuilder_ == null) {
           coinsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>(
+              com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>(
                   coins_,
                   ((bitField0_ & 0x00000002) != 0),
                   getParentForChildren(),
@@ -2388,12 +2388,12 @@ private static final long serialVersionUID = 0L;
     }
 
     // @@protoc_insertion_point(class_scope:transaction.Send.Output)
-    private static final com.tangem.blockchain.binance.proto.Send.Output DEFAULT_INSTANCE;
+    private static final com.tangem.blockchain.blockchains.binance.proto.Send.Output DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.Send.Output();
+      DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.Send.Output();
     }
 
-    public static com.tangem.blockchain.binance.proto.Send.Output getDefaultInstance() {
+    public static com.tangem.blockchain.blockchains.binance.proto.Send.Output getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -2418,24 +2418,24 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.Send.Output getDefaultInstanceForType() {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Output getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
   public static final int INPUTS_FIELD_NUMBER = 1;
-  private java.util.List inputs_;
+  private java.util.List inputs_;
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
-  public java.util.List getInputsList() {
+  public java.util.List getInputsList() {
     return inputs_;
   }
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
-  public java.util.List
+  public java.util.List
       getInputsOrBuilderList() {
     return inputs_;
   }
@@ -2448,29 +2448,29 @@ private static final long serialVersionUID = 0L;
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
-  public com.tangem.blockchain.binance.proto.Send.Input getInputs(int index) {
+  public com.tangem.blockchain.blockchains.binance.proto.Send.Input getInputs(int index) {
     return inputs_.get(index);
   }
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
-  public com.tangem.blockchain.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
+  public com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
       int index) {
     return inputs_.get(index);
   }
 
   public static final int OUTPUTS_FIELD_NUMBER = 2;
-  private java.util.List outputs_;
+  private java.util.List outputs_;
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
-  public java.util.List getOutputsList() {
+  public java.util.List getOutputsList() {
     return outputs_;
   }
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
-  public java.util.List
+  public java.util.List
       getOutputsOrBuilderList() {
     return outputs_;
   }
@@ -2483,13 +2483,13 @@ private static final long serialVersionUID = 0L;
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
-  public com.tangem.blockchain.binance.proto.Send.Output getOutputs(int index) {
+  public com.tangem.blockchain.blockchains.binance.proto.Send.Output getOutputs(int index) {
     return outputs_.get(index);
   }
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
-  public com.tangem.blockchain.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
+  public com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
       int index) {
     return outputs_.get(index);
   }
@@ -2541,10 +2541,10 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.tangem.blockchain.binance.proto.Send)) {
+    if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.Send)) {
       return super.equals(obj);
     }
-    com.tangem.blockchain.binance.proto.Send other = (com.tangem.blockchain.binance.proto.Send) obj;
+    com.tangem.blockchain.blockchains.binance.proto.Send other = (com.tangem.blockchain.blockchains.binance.proto.Send) obj;
 
     if (!getInputsList()
         .equals(other.getInputsList())) return false;
@@ -2574,69 +2574,69 @@ private static final long serialVersionUID = 0L;
     return hash;
   }
 
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(byte[] data)
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseDelimitedFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseDelimitedFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.Send parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -2649,7 +2649,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.tangem.blockchain.binance.proto.Send prototype) {
+  public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.Send prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @Override
@@ -2674,21 +2674,21 @@ private static final long serialVersionUID = 0L;
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder implements
       // @@protoc_insertion_point(builder_implements:transaction.Send)
-      com.tangem.blockchain.binance.proto.SendOrBuilder {
+      com.tangem.blockchain.blockchains.binance.proto.SendOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.Send.class, com.tangem.blockchain.binance.proto.Send.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.Send.class, com.tangem.blockchain.blockchains.binance.proto.Send.Builder.class);
     }
 
-    // Construct using com.tangem.blockchain.binance.proto.Send.newBuilder()
+    // Construct using com.tangem.blockchain.blockchains.binance.proto.Send.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -2726,17 +2726,17 @@ private static final long serialVersionUID = 0L;
     @Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.Send getDefaultInstanceForType() {
-      return com.tangem.blockchain.binance.proto.Send.getDefaultInstance();
+    public com.tangem.blockchain.blockchains.binance.proto.Send getDefaultInstanceForType() {
+      return com.tangem.blockchain.blockchains.binance.proto.Send.getDefaultInstance();
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.Send build() {
-      com.tangem.blockchain.binance.proto.Send result = buildPartial();
+    public com.tangem.blockchain.blockchains.binance.proto.Send build() {
+      com.tangem.blockchain.blockchains.binance.proto.Send result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -2744,8 +2744,8 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.Send buildPartial() {
-      com.tangem.blockchain.binance.proto.Send result = new com.tangem.blockchain.binance.proto.Send(this);
+    public com.tangem.blockchain.blockchains.binance.proto.Send buildPartial() {
+      com.tangem.blockchain.blockchains.binance.proto.Send result = new com.tangem.blockchain.blockchains.binance.proto.Send(this);
       int from_bitField0_ = bitField0_;
       if (inputsBuilder_ == null) {
         if (((bitField0_ & 0x00000001) != 0)) {
@@ -2803,16 +2803,16 @@ private static final long serialVersionUID = 0L;
     }
     @Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.tangem.blockchain.binance.proto.Send) {
-        return mergeFrom((com.tangem.blockchain.binance.proto.Send)other);
+      if (other instanceof com.tangem.blockchain.blockchains.binance.proto.Send) {
+        return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.Send)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.tangem.blockchain.binance.proto.Send other) {
-      if (other == com.tangem.blockchain.binance.proto.Send.getDefaultInstance()) return this;
+    public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.Send other) {
+      if (other == com.tangem.blockchain.blockchains.binance.proto.Send.getDefaultInstance()) return this;
       if (inputsBuilder_ == null) {
         if (!other.inputs_.isEmpty()) {
           if (inputs_.isEmpty()) {
@@ -2880,11 +2880,11 @@ private static final long serialVersionUID = 0L;
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      com.tangem.blockchain.binance.proto.Send parsedMessage = null;
+      com.tangem.blockchain.blockchains.binance.proto.Send parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (com.tangem.blockchain.binance.proto.Send) e.getUnfinishedMessage();
+        parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.Send) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -2895,22 +2895,22 @@ private static final long serialVersionUID = 0L;
     }
     private int bitField0_;
 
-    private java.util.List inputs_ =
+    private java.util.List inputs_ =
       java.util.Collections.emptyList();
     private void ensureInputsIsMutable() {
       if (!((bitField0_ & 0x00000001) != 0)) {
-        inputs_ = new java.util.ArrayList(inputs_);
+        inputs_ = new java.util.ArrayList(inputs_);
         bitField0_ |= 0x00000001;
        }
     }
 
     private com.google.protobuf.RepeatedFieldBuilderV3<
-        com.tangem.blockchain.binance.proto.Send.Input, com.tangem.blockchain.binance.proto.Send.Input.Builder, com.tangem.blockchain.binance.proto.Send.InputOrBuilder> inputsBuilder_;
+        com.tangem.blockchain.blockchains.binance.proto.Send.Input, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder> inputsBuilder_;
 
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public java.util.List getInputsList() {
+    public java.util.List getInputsList() {
       if (inputsBuilder_ == null) {
         return java.util.Collections.unmodifiableList(inputs_);
       } else {
@@ -2930,7 +2930,7 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public com.tangem.blockchain.binance.proto.Send.Input getInputs(int index) {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Input getInputs(int index) {
       if (inputsBuilder_ == null) {
         return inputs_.get(index);
       } else {
@@ -2941,7 +2941,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Input inputs = 1;
      */
     public Builder setInputs(
-        int index, com.tangem.blockchain.binance.proto.Send.Input value) {
+        int index, com.tangem.blockchain.blockchains.binance.proto.Send.Input value) {
       if (inputsBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
@@ -2958,7 +2958,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Input inputs = 1;
      */
     public Builder setInputs(
-        int index, com.tangem.blockchain.binance.proto.Send.Input.Builder builderForValue) {
+        int index, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder builderForValue) {
       if (inputsBuilder_ == null) {
         ensureInputsIsMutable();
         inputs_.set(index, builderForValue.build());
@@ -2971,7 +2971,7 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public Builder addInputs(com.tangem.blockchain.binance.proto.Send.Input value) {
+    public Builder addInputs(com.tangem.blockchain.blockchains.binance.proto.Send.Input value) {
       if (inputsBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
@@ -2988,7 +2988,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Input inputs = 1;
      */
     public Builder addInputs(
-        int index, com.tangem.blockchain.binance.proto.Send.Input value) {
+        int index, com.tangem.blockchain.blockchains.binance.proto.Send.Input value) {
       if (inputsBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
@@ -3005,7 +3005,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Input inputs = 1;
      */
     public Builder addInputs(
-        com.tangem.blockchain.binance.proto.Send.Input.Builder builderForValue) {
+        com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder builderForValue) {
       if (inputsBuilder_ == null) {
         ensureInputsIsMutable();
         inputs_.add(builderForValue.build());
@@ -3019,7 +3019,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Input inputs = 1;
      */
     public Builder addInputs(
-        int index, com.tangem.blockchain.binance.proto.Send.Input.Builder builderForValue) {
+        int index, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder builderForValue) {
       if (inputsBuilder_ == null) {
         ensureInputsIsMutable();
         inputs_.add(index, builderForValue.build());
@@ -3033,7 +3033,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Input inputs = 1;
      */
     public Builder addAllInputs(
-        Iterable values) {
+        Iterable values) {
       if (inputsBuilder_ == null) {
         ensureInputsIsMutable();
         com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -3073,14 +3073,14 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public com.tangem.blockchain.binance.proto.Send.Input.Builder getInputsBuilder(
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder getInputsBuilder(
         int index) {
       return getInputsFieldBuilder().getBuilder(index);
     }
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public com.tangem.blockchain.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
+    public com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
         int index) {
       if (inputsBuilder_ == null) {
         return inputs_.get(index);  } else {
@@ -3090,7 +3090,7 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public java.util.List
+    public java.util.List
          getInputsOrBuilderList() {
       if (inputsBuilder_ != null) {
         return inputsBuilder_.getMessageOrBuilderList();
@@ -3101,31 +3101,31 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public com.tangem.blockchain.binance.proto.Send.Input.Builder addInputsBuilder() {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder addInputsBuilder() {
       return getInputsFieldBuilder().addBuilder(
-          com.tangem.blockchain.binance.proto.Send.Input.getDefaultInstance());
+          com.tangem.blockchain.blockchains.binance.proto.Send.Input.getDefaultInstance());
     }
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public com.tangem.blockchain.binance.proto.Send.Input.Builder addInputsBuilder(
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder addInputsBuilder(
         int index) {
       return getInputsFieldBuilder().addBuilder(
-          index, com.tangem.blockchain.binance.proto.Send.Input.getDefaultInstance());
+          index, com.tangem.blockchain.blockchains.binance.proto.Send.Input.getDefaultInstance());
     }
     /**
      * repeated .transaction.Send.Input inputs = 1;
      */
-    public java.util.List
+    public java.util.List
          getInputsBuilderList() {
       return getInputsFieldBuilder().getBuilderList();
     }
     private com.google.protobuf.RepeatedFieldBuilderV3<
-        com.tangem.blockchain.binance.proto.Send.Input, com.tangem.blockchain.binance.proto.Send.Input.Builder, com.tangem.blockchain.binance.proto.Send.InputOrBuilder>
+        com.tangem.blockchain.blockchains.binance.proto.Send.Input, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder>
         getInputsFieldBuilder() {
       if (inputsBuilder_ == null) {
         inputsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-            com.tangem.blockchain.binance.proto.Send.Input, com.tangem.blockchain.binance.proto.Send.Input.Builder, com.tangem.blockchain.binance.proto.Send.InputOrBuilder>(
+            com.tangem.blockchain.blockchains.binance.proto.Send.Input, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder>(
                 inputs_,
                 ((bitField0_ & 0x00000001) != 0),
                 getParentForChildren(),
@@ -3135,22 +3135,22 @@ private static final long serialVersionUID = 0L;
       return inputsBuilder_;
     }
 
-    private java.util.List outputs_ =
+    private java.util.List outputs_ =
       java.util.Collections.emptyList();
     private void ensureOutputsIsMutable() {
       if (!((bitField0_ & 0x00000002) != 0)) {
-        outputs_ = new java.util.ArrayList(outputs_);
+        outputs_ = new java.util.ArrayList(outputs_);
         bitField0_ |= 0x00000002;
        }
     }
 
     private com.google.protobuf.RepeatedFieldBuilderV3<
-        com.tangem.blockchain.binance.proto.Send.Output, com.tangem.blockchain.binance.proto.Send.Output.Builder, com.tangem.blockchain.binance.proto.Send.OutputOrBuilder> outputsBuilder_;
+        com.tangem.blockchain.blockchains.binance.proto.Send.Output, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder> outputsBuilder_;
 
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public java.util.List getOutputsList() {
+    public java.util.List getOutputsList() {
       if (outputsBuilder_ == null) {
         return java.util.Collections.unmodifiableList(outputs_);
       } else {
@@ -3170,7 +3170,7 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.Output getOutputs(int index) {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Output getOutputs(int index) {
       if (outputsBuilder_ == null) {
         return outputs_.get(index);
       } else {
@@ -3181,7 +3181,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Output outputs = 2;
      */
     public Builder setOutputs(
-        int index, com.tangem.blockchain.binance.proto.Send.Output value) {
+        int index, com.tangem.blockchain.blockchains.binance.proto.Send.Output value) {
       if (outputsBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
@@ -3198,7 +3198,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Output outputs = 2;
      */
     public Builder setOutputs(
-        int index, com.tangem.blockchain.binance.proto.Send.Output.Builder builderForValue) {
+        int index, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder builderForValue) {
       if (outputsBuilder_ == null) {
         ensureOutputsIsMutable();
         outputs_.set(index, builderForValue.build());
@@ -3211,7 +3211,7 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public Builder addOutputs(com.tangem.blockchain.binance.proto.Send.Output value) {
+    public Builder addOutputs(com.tangem.blockchain.blockchains.binance.proto.Send.Output value) {
       if (outputsBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
@@ -3228,7 +3228,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Output outputs = 2;
      */
     public Builder addOutputs(
-        int index, com.tangem.blockchain.binance.proto.Send.Output value) {
+        int index, com.tangem.blockchain.blockchains.binance.proto.Send.Output value) {
       if (outputsBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
@@ -3245,7 +3245,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Output outputs = 2;
      */
     public Builder addOutputs(
-        com.tangem.blockchain.binance.proto.Send.Output.Builder builderForValue) {
+        com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder builderForValue) {
       if (outputsBuilder_ == null) {
         ensureOutputsIsMutable();
         outputs_.add(builderForValue.build());
@@ -3259,7 +3259,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Output outputs = 2;
      */
     public Builder addOutputs(
-        int index, com.tangem.blockchain.binance.proto.Send.Output.Builder builderForValue) {
+        int index, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder builderForValue) {
       if (outputsBuilder_ == null) {
         ensureOutputsIsMutable();
         outputs_.add(index, builderForValue.build());
@@ -3273,7 +3273,7 @@ private static final long serialVersionUID = 0L;
      * repeated .transaction.Send.Output outputs = 2;
      */
     public Builder addAllOutputs(
-        Iterable values) {
+        Iterable values) {
       if (outputsBuilder_ == null) {
         ensureOutputsIsMutable();
         com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -3313,14 +3313,14 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.Output.Builder getOutputsBuilder(
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder getOutputsBuilder(
         int index) {
       return getOutputsFieldBuilder().getBuilder(index);
     }
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
+    public com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
         int index) {
       if (outputsBuilder_ == null) {
         return outputs_.get(index);  } else {
@@ -3330,7 +3330,7 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public java.util.List
+    public java.util.List
          getOutputsOrBuilderList() {
       if (outputsBuilder_ != null) {
         return outputsBuilder_.getMessageOrBuilderList();
@@ -3341,31 +3341,31 @@ private static final long serialVersionUID = 0L;
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.Output.Builder addOutputsBuilder() {
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder addOutputsBuilder() {
       return getOutputsFieldBuilder().addBuilder(
-          com.tangem.blockchain.binance.proto.Send.Output.getDefaultInstance());
+          com.tangem.blockchain.blockchains.binance.proto.Send.Output.getDefaultInstance());
     }
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public com.tangem.blockchain.binance.proto.Send.Output.Builder addOutputsBuilder(
+    public com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder addOutputsBuilder(
         int index) {
       return getOutputsFieldBuilder().addBuilder(
-          index, com.tangem.blockchain.binance.proto.Send.Output.getDefaultInstance());
+          index, com.tangem.blockchain.blockchains.binance.proto.Send.Output.getDefaultInstance());
     }
     /**
      * repeated .transaction.Send.Output outputs = 2;
      */
-    public java.util.List
+    public java.util.List
          getOutputsBuilderList() {
       return getOutputsFieldBuilder().getBuilderList();
     }
     private com.google.protobuf.RepeatedFieldBuilderV3<
-        com.tangem.blockchain.binance.proto.Send.Output, com.tangem.blockchain.binance.proto.Send.Output.Builder, com.tangem.blockchain.binance.proto.Send.OutputOrBuilder>
+        com.tangem.blockchain.blockchains.binance.proto.Send.Output, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder>
         getOutputsFieldBuilder() {
       if (outputsBuilder_ == null) {
         outputsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-            com.tangem.blockchain.binance.proto.Send.Output, com.tangem.blockchain.binance.proto.Send.Output.Builder, com.tangem.blockchain.binance.proto.Send.OutputOrBuilder>(
+            com.tangem.blockchain.blockchains.binance.proto.Send.Output, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder>(
                 outputs_,
                 ((bitField0_ & 0x00000002) != 0),
                 getParentForChildren(),
@@ -3391,12 +3391,12 @@ private static final long serialVersionUID = 0L;
   }
 
   // @@protoc_insertion_point(class_scope:transaction.Send)
-  private static final com.tangem.blockchain.binance.proto.Send DEFAULT_INSTANCE;
+  private static final com.tangem.blockchain.blockchains.binance.proto.Send DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.Send();
+    DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.Send();
   }
 
-  public static com.tangem.blockchain.binance.proto.Send getDefaultInstance() {
+  public static com.tangem.blockchain.blockchains.binance.proto.Send getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
@@ -3421,7 +3421,7 @@ private static final long serialVersionUID = 0L;
   }
 
   @Override
-  public com.tangem.blockchain.binance.proto.Send getDefaultInstanceForType() {
+  public com.tangem.blockchain.blockchains.binance.proto.Send getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/SendOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/SendOrBuilder.java
similarity index 61%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/SendOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/SendOrBuilder.java
index 3b619425a2..326ab8de28 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/SendOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/SendOrBuilder.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 public interface SendOrBuilder extends
     // @@protoc_insertion_point(interface_extends:transaction.Send)
@@ -10,12 +10,12 @@ public interface SendOrBuilder extends
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
-  java.util.List
+  java.util.List
       getInputsList();
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
-  com.tangem.blockchain.binance.proto.Send.Input getInputs(int index);
+  com.tangem.blockchain.blockchains.binance.proto.Send.Input getInputs(int index);
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
@@ -23,23 +23,23 @@ public interface SendOrBuilder extends
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
-  java.util.List
+  java.util.List
       getInputsOrBuilderList();
   /**
    * repeated .transaction.Send.Input inputs = 1;
    */
-  com.tangem.blockchain.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
+  com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
           int index);
 
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
-  java.util.List
+  java.util.List
       getOutputsList();
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
-  com.tangem.blockchain.binance.proto.Send.Output getOutputs(int index);
+  com.tangem.blockchain.blockchains.binance.proto.Send.Output getOutputs(int index);
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
@@ -47,11 +47,11 @@ public interface SendOrBuilder extends
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
-  java.util.List
+  java.util.List
       getOutputsOrBuilderList();
   /**
    * repeated .transaction.Send.Output outputs = 2;
    */
-  com.tangem.blockchain.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
+  com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
           int index);
 }
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignature.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignature.java
similarity index 77%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignature.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignature.java
index a47f46f543..1cadb9f802 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignature.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignature.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 /**
  * Protobuf type {@code transaction.StdSignature}
@@ -85,15 +85,15 @@ private static final long serialVersionUID = 0L;
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
   }
 
   @Override
   protected FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_fieldAccessorTable
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.tangem.blockchain.binance.proto.StdSignature.class, com.tangem.blockchain.binance.proto.StdSignature.Builder.class);
+            com.tangem.blockchain.blockchains.binance.proto.StdSignature.class, com.tangem.blockchain.blockchains.binance.proto.StdSignature.Builder.class);
   }
 
   public interface PubKeyOrBuilder extends
@@ -163,15 +163,15 @@ private static final long serialVersionUID = 0L;
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.StdSignature.PubKey.class, com.tangem.blockchain.binance.proto.StdSignature.PubKey.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.class, com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.Builder.class);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -207,10 +207,10 @@ private static final long serialVersionUID = 0L;
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof com.tangem.blockchain.binance.proto.StdSignature.PubKey)) {
+      if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey)) {
         return super.equals(obj);
       }
-      com.tangem.blockchain.binance.proto.StdSignature.PubKey other = (com.tangem.blockchain.binance.proto.StdSignature.PubKey) obj;
+      com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey other = (com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey) obj;
 
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -228,69 +228,69 @@ private static final long serialVersionUID = 0L;
       return hash;
     }
 
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(byte[] data)
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(java.io.InputStream input)
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseDelimitedFrom(java.io.InputStream input)
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseDelimitedFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -303,7 +303,7 @@ private static final long serialVersionUID = 0L;
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(com.tangem.blockchain.binance.proto.StdSignature.PubKey prototype) {
+    public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @Override
@@ -328,21 +328,21 @@ private static final long serialVersionUID = 0L;
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder implements
         // @@protoc_insertion_point(builder_implements:transaction.StdSignature.PubKey)
-        com.tangem.blockchain.binance.proto.StdSignature.PubKeyOrBuilder {
+        com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKeyOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
       }
 
       @Override
       protected FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_fieldAccessorTable
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                com.tangem.blockchain.binance.proto.StdSignature.PubKey.class, com.tangem.blockchain.binance.proto.StdSignature.PubKey.Builder.class);
+                com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.class, com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.Builder.class);
       }
 
-      // Construct using com.tangem.blockchain.binance.proto.StdSignature.PubKey.newBuilder()
+      // Construct using com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -366,17 +366,17 @@ private static final long serialVersionUID = 0L;
       @Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
+        return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.StdSignature.PubKey getDefaultInstanceForType() {
-        return com.tangem.blockchain.binance.proto.StdSignature.PubKey.getDefaultInstance();
+      public com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey getDefaultInstanceForType() {
+        return com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.getDefaultInstance();
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.StdSignature.PubKey build() {
-        com.tangem.blockchain.binance.proto.StdSignature.PubKey result = buildPartial();
+      public com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey build() {
+        com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -384,8 +384,8 @@ private static final long serialVersionUID = 0L;
       }
 
       @Override
-      public com.tangem.blockchain.binance.proto.StdSignature.PubKey buildPartial() {
-        com.tangem.blockchain.binance.proto.StdSignature.PubKey result = new com.tangem.blockchain.binance.proto.StdSignature.PubKey(this);
+      public com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey buildPartial() {
+        com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey result = new com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey(this);
         onBuilt();
         return result;
       }
@@ -424,16 +424,16 @@ private static final long serialVersionUID = 0L;
       }
       @Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.tangem.blockchain.binance.proto.StdSignature.PubKey) {
-          return mergeFrom((com.tangem.blockchain.binance.proto.StdSignature.PubKey)other);
+        if (other instanceof com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey) {
+          return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(com.tangem.blockchain.binance.proto.StdSignature.PubKey other) {
-        if (other == com.tangem.blockchain.binance.proto.StdSignature.PubKey.getDefaultInstance()) return this;
+      public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey other) {
+        if (other == com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.getDefaultInstance()) return this;
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -449,11 +449,11 @@ private static final long serialVersionUID = 0L;
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        com.tangem.blockchain.binance.proto.StdSignature.PubKey parsedMessage = null;
+        com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.tangem.blockchain.binance.proto.StdSignature.PubKey) e.getUnfinishedMessage();
+          parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -479,12 +479,12 @@ private static final long serialVersionUID = 0L;
     }
 
     // @@protoc_insertion_point(class_scope:transaction.StdSignature.PubKey)
-    private static final com.tangem.blockchain.binance.proto.StdSignature.PubKey DEFAULT_INSTANCE;
+    private static final com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.StdSignature.PubKey();
+      DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey();
     }
 
-    public static com.tangem.blockchain.binance.proto.StdSignature.PubKey getDefaultInstance() {
+    public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -509,7 +509,7 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.StdSignature.PubKey getDefaultInstanceForType() {
+    public com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -628,10 +628,10 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.tangem.blockchain.binance.proto.StdSignature)) {
+    if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.StdSignature)) {
       return super.equals(obj);
     }
-    com.tangem.blockchain.binance.proto.StdSignature other = (com.tangem.blockchain.binance.proto.StdSignature) obj;
+    com.tangem.blockchain.blockchains.binance.proto.StdSignature other = (com.tangem.blockchain.blockchains.binance.proto.StdSignature) obj;
 
     if (!getPubKey()
         .equals(other.getPubKey())) return false;
@@ -667,69 +667,69 @@ private static final long serialVersionUID = 0L;
     return hash;
   }
 
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(byte[] data)
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseDelimitedFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseDelimitedFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -742,7 +742,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.tangem.blockchain.binance.proto.StdSignature prototype) {
+  public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.StdSignature prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @Override
@@ -763,21 +763,21 @@ private static final long serialVersionUID = 0L;
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder implements
       // @@protoc_insertion_point(builder_implements:transaction.StdSignature)
-      com.tangem.blockchain.binance.proto.StdSignatureOrBuilder {
+      com.tangem.blockchain.blockchains.binance.proto.StdSignatureOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.StdSignature.class, com.tangem.blockchain.binance.proto.StdSignature.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.StdSignature.class, com.tangem.blockchain.blockchains.binance.proto.StdSignature.Builder.class);
     }
 
-    // Construct using com.tangem.blockchain.binance.proto.StdSignature.newBuilder()
+    // Construct using com.tangem.blockchain.blockchains.binance.proto.StdSignature.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -809,17 +809,17 @@ private static final long serialVersionUID = 0L;
     @Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.StdSignature getDefaultInstanceForType() {
-      return com.tangem.blockchain.binance.proto.StdSignature.getDefaultInstance();
+    public com.tangem.blockchain.blockchains.binance.proto.StdSignature getDefaultInstanceForType() {
+      return com.tangem.blockchain.blockchains.binance.proto.StdSignature.getDefaultInstance();
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.StdSignature build() {
-      com.tangem.blockchain.binance.proto.StdSignature result = buildPartial();
+    public com.tangem.blockchain.blockchains.binance.proto.StdSignature build() {
+      com.tangem.blockchain.blockchains.binance.proto.StdSignature result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -827,8 +827,8 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.StdSignature buildPartial() {
-      com.tangem.blockchain.binance.proto.StdSignature result = new com.tangem.blockchain.binance.proto.StdSignature(this);
+    public com.tangem.blockchain.blockchains.binance.proto.StdSignature buildPartial() {
+      com.tangem.blockchain.blockchains.binance.proto.StdSignature result = new com.tangem.blockchain.blockchains.binance.proto.StdSignature(this);
       result.pubKey_ = pubKey_;
       result.signature_ = signature_;
       result.accountNumber_ = accountNumber_;
@@ -871,16 +871,16 @@ private static final long serialVersionUID = 0L;
     }
     @Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.tangem.blockchain.binance.proto.StdSignature) {
-        return mergeFrom((com.tangem.blockchain.binance.proto.StdSignature)other);
+      if (other instanceof com.tangem.blockchain.blockchains.binance.proto.StdSignature) {
+        return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.StdSignature)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.tangem.blockchain.binance.proto.StdSignature other) {
-      if (other == com.tangem.blockchain.binance.proto.StdSignature.getDefaultInstance()) return this;
+    public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.StdSignature other) {
+      if (other == com.tangem.blockchain.blockchains.binance.proto.StdSignature.getDefaultInstance()) return this;
       if (other.getPubKey() != com.google.protobuf.ByteString.EMPTY) {
         setPubKey(other.getPubKey());
       }
@@ -908,11 +908,11 @@ private static final long serialVersionUID = 0L;
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      com.tangem.blockchain.binance.proto.StdSignature parsedMessage = null;
+      com.tangem.blockchain.blockchains.binance.proto.StdSignature parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (com.tangem.blockchain.binance.proto.StdSignature) e.getUnfinishedMessage();
+        parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.StdSignature) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -1096,12 +1096,12 @@ private static final long serialVersionUID = 0L;
   }
 
   // @@protoc_insertion_point(class_scope:transaction.StdSignature)
-  private static final com.tangem.blockchain.binance.proto.StdSignature DEFAULT_INSTANCE;
+  private static final com.tangem.blockchain.blockchains.binance.proto.StdSignature DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.StdSignature();
+    DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.StdSignature();
   }
 
-  public static com.tangem.blockchain.binance.proto.StdSignature getDefaultInstance() {
+  public static com.tangem.blockchain.blockchains.binance.proto.StdSignature getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
@@ -1126,7 +1126,7 @@ private static final long serialVersionUID = 0L;
   }
 
   @Override
-  public com.tangem.blockchain.binance.proto.StdSignature getDefaultInstanceForType() {
+  public com.tangem.blockchain.blockchains.binance.proto.StdSignature getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignatureOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignatureOrBuilder.java
similarity index 95%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignatureOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignatureOrBuilder.java
index 622113ae4c..cc73a528fd 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignatureOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignatureOrBuilder.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 public interface StdSignatureOrBuilder extends
     // @@protoc_insertion_point(interface_extends:transaction.StdSignature)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTx.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTx.java
similarity index 88%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTx.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTx.java
index 92c61b4366..637a9f4ac7 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTx.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTx.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 /**
  * 
@@ -109,15 +109,15 @@ private static final long serialVersionUID = 0L;
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
   }
 
   @Override
   protected FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_fieldAccessorTable
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.tangem.blockchain.binance.proto.StdTx.class, com.tangem.blockchain.binance.proto.StdTx.Builder.class);
+            com.tangem.blockchain.blockchains.binance.proto.StdTx.class, com.tangem.blockchain.blockchains.binance.proto.StdTx.Builder.class);
   }
 
   private int bitField0_;
@@ -337,10 +337,10 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.tangem.blockchain.binance.proto.StdTx)) {
+    if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.StdTx)) {
       return super.equals(obj);
     }
-    com.tangem.blockchain.binance.proto.StdTx other = (com.tangem.blockchain.binance.proto.StdTx) obj;
+    com.tangem.blockchain.blockchains.binance.proto.StdTx other = (com.tangem.blockchain.blockchains.binance.proto.StdTx) obj;
 
     if (!getMsgsList()
         .equals(other.getMsgsList())) return false;
@@ -383,69 +383,69 @@ private static final long serialVersionUID = 0L;
     return hash;
   }
 
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(byte[] data)
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseDelimitedFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseDelimitedFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -458,7 +458,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.tangem.blockchain.binance.proto.StdTx prototype) {
+  public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.StdTx prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @Override
@@ -483,21 +483,21 @@ private static final long serialVersionUID = 0L;
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder implements
       // @@protoc_insertion_point(builder_implements:transaction.StdTx)
-      com.tangem.blockchain.binance.proto.StdTxOrBuilder {
+      com.tangem.blockchain.blockchains.binance.proto.StdTxOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.StdTx.class, com.tangem.blockchain.binance.proto.StdTx.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.StdTx.class, com.tangem.blockchain.blockchains.binance.proto.StdTx.Builder.class);
     }
 
-    // Construct using com.tangem.blockchain.binance.proto.StdTx.newBuilder()
+    // Construct using com.tangem.blockchain.blockchains.binance.proto.StdTx.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -531,17 +531,17 @@ private static final long serialVersionUID = 0L;
     @Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.StdTx getDefaultInstanceForType() {
-      return com.tangem.blockchain.binance.proto.StdTx.getDefaultInstance();
+    public com.tangem.blockchain.blockchains.binance.proto.StdTx getDefaultInstanceForType() {
+      return com.tangem.blockchain.blockchains.binance.proto.StdTx.getDefaultInstance();
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.StdTx build() {
-      com.tangem.blockchain.binance.proto.StdTx result = buildPartial();
+    public com.tangem.blockchain.blockchains.binance.proto.StdTx build() {
+      com.tangem.blockchain.blockchains.binance.proto.StdTx result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -549,8 +549,8 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.StdTx buildPartial() {
-      com.tangem.blockchain.binance.proto.StdTx result = new com.tangem.blockchain.binance.proto.StdTx(this);
+    public com.tangem.blockchain.blockchains.binance.proto.StdTx buildPartial() {
+      com.tangem.blockchain.blockchains.binance.proto.StdTx result = new com.tangem.blockchain.blockchains.binance.proto.StdTx(this);
       int from_bitField0_ = bitField0_;
       int to_bitField0_ = 0;
       if (((bitField0_ & 0x00000001) != 0)) {
@@ -605,16 +605,16 @@ private static final long serialVersionUID = 0L;
     }
     @Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.tangem.blockchain.binance.proto.StdTx) {
-        return mergeFrom((com.tangem.blockchain.binance.proto.StdTx)other);
+      if (other instanceof com.tangem.blockchain.blockchains.binance.proto.StdTx) {
+        return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.StdTx)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.tangem.blockchain.binance.proto.StdTx other) {
-      if (other == com.tangem.blockchain.binance.proto.StdTx.getDefaultInstance()) return this;
+    public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.StdTx other) {
+      if (other == com.tangem.blockchain.blockchains.binance.proto.StdTx.getDefaultInstance()) return this;
       if (!other.msgs_.isEmpty()) {
         if (msgs_.isEmpty()) {
           msgs_ = other.msgs_;
@@ -660,11 +660,11 @@ private static final long serialVersionUID = 0L;
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      com.tangem.blockchain.binance.proto.StdTx parsedMessage = null;
+      com.tangem.blockchain.blockchains.binance.proto.StdTx parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (com.tangem.blockchain.binance.proto.StdTx) e.getUnfinishedMessage();
+        parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.StdTx) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -1068,12 +1068,12 @@ private static final long serialVersionUID = 0L;
   }
 
   // @@protoc_insertion_point(class_scope:transaction.StdTx)
-  private static final com.tangem.blockchain.binance.proto.StdTx DEFAULT_INSTANCE;
+  private static final com.tangem.blockchain.blockchains.binance.proto.StdTx DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.StdTx();
+    DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.StdTx();
   }
 
-  public static com.tangem.blockchain.binance.proto.StdTx getDefaultInstance() {
+  public static com.tangem.blockchain.blockchains.binance.proto.StdTx getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
@@ -1098,7 +1098,7 @@ private static final long serialVersionUID = 0L;
   }
 
   @Override
-  public com.tangem.blockchain.binance.proto.StdTx getDefaultInstanceForType() {
+  public com.tangem.blockchain.blockchains.binance.proto.StdTx getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTxOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTxOrBuilder.java
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTxOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTxOrBuilder.java
index b8e6b81057..1e2f47be6a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTxOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTxOrBuilder.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 public interface StdTxOrBuilder extends
     // @@protoc_insertion_point(interface_extends:transaction.StdTx)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreeze.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreeze.java
similarity index 80%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreeze.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreeze.java
index f0cfab3b22..bc61584e2a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreeze.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreeze.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 /**
  * 
@@ -85,15 +85,15 @@ private static final long serialVersionUID = 0L;
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
   }
 
   @Override
   protected FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_fieldAccessorTable
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.tangem.blockchain.binance.proto.TokenFreeze.class, com.tangem.blockchain.binance.proto.TokenFreeze.Builder.class);
+            com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.class, com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.Builder.class);
   }
 
   public static final int FROM_FIELD_NUMBER = 1;
@@ -217,10 +217,10 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.tangem.blockchain.binance.proto.TokenFreeze)) {
+    if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.TokenFreeze)) {
       return super.equals(obj);
     }
-    com.tangem.blockchain.binance.proto.TokenFreeze other = (com.tangem.blockchain.binance.proto.TokenFreeze) obj;
+    com.tangem.blockchain.blockchains.binance.proto.TokenFreeze other = (com.tangem.blockchain.blockchains.binance.proto.TokenFreeze) obj;
 
     if (!getFrom()
         .equals(other.getFrom())) return false;
@@ -251,69 +251,69 @@ private static final long serialVersionUID = 0L;
     return hash;
   }
 
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(byte[] data)
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseDelimitedFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseDelimitedFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -326,7 +326,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.tangem.blockchain.binance.proto.TokenFreeze prototype) {
+  public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.TokenFreeze prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @Override
@@ -351,21 +351,21 @@ private static final long serialVersionUID = 0L;
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder implements
       // @@protoc_insertion_point(builder_implements:transaction.TokenFreeze)
-      com.tangem.blockchain.binance.proto.TokenFreezeOrBuilder {
+      com.tangem.blockchain.blockchains.binance.proto.TokenFreezeOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.TokenFreeze.class, com.tangem.blockchain.binance.proto.TokenFreeze.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.class, com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.Builder.class);
     }
 
-    // Construct using com.tangem.blockchain.binance.proto.TokenFreeze.newBuilder()
+    // Construct using com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -395,17 +395,17 @@ private static final long serialVersionUID = 0L;
     @Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.TokenFreeze getDefaultInstanceForType() {
-      return com.tangem.blockchain.binance.proto.TokenFreeze.getDefaultInstance();
+    public com.tangem.blockchain.blockchains.binance.proto.TokenFreeze getDefaultInstanceForType() {
+      return com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.getDefaultInstance();
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.TokenFreeze build() {
-      com.tangem.blockchain.binance.proto.TokenFreeze result = buildPartial();
+    public com.tangem.blockchain.blockchains.binance.proto.TokenFreeze build() {
+      com.tangem.blockchain.blockchains.binance.proto.TokenFreeze result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -413,8 +413,8 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.TokenFreeze buildPartial() {
-      com.tangem.blockchain.binance.proto.TokenFreeze result = new com.tangem.blockchain.binance.proto.TokenFreeze(this);
+    public com.tangem.blockchain.blockchains.binance.proto.TokenFreeze buildPartial() {
+      com.tangem.blockchain.blockchains.binance.proto.TokenFreeze result = new com.tangem.blockchain.blockchains.binance.proto.TokenFreeze(this);
       result.from_ = from_;
       result.symbol_ = symbol_;
       result.amount_ = amount_;
@@ -456,16 +456,16 @@ private static final long serialVersionUID = 0L;
     }
     @Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.tangem.blockchain.binance.proto.TokenFreeze) {
-        return mergeFrom((com.tangem.blockchain.binance.proto.TokenFreeze)other);
+      if (other instanceof com.tangem.blockchain.blockchains.binance.proto.TokenFreeze) {
+        return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.TokenFreeze)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.tangem.blockchain.binance.proto.TokenFreeze other) {
-      if (other == com.tangem.blockchain.binance.proto.TokenFreeze.getDefaultInstance()) return this;
+    public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.TokenFreeze other) {
+      if (other == com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.getDefaultInstance()) return this;
       if (other.getFrom() != com.google.protobuf.ByteString.EMPTY) {
         setFrom(other.getFrom());
       }
@@ -491,11 +491,11 @@ private static final long serialVersionUID = 0L;
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      com.tangem.blockchain.binance.proto.TokenFreeze parsedMessage = null;
+      com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (com.tangem.blockchain.binance.proto.TokenFreeze) e.getUnfinishedMessage();
+        parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.TokenFreeze) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -689,12 +689,12 @@ private static final long serialVersionUID = 0L;
   }
 
   // @@protoc_insertion_point(class_scope:transaction.TokenFreeze)
-  private static final com.tangem.blockchain.binance.proto.TokenFreeze DEFAULT_INSTANCE;
+  private static final com.tangem.blockchain.blockchains.binance.proto.TokenFreeze DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.TokenFreeze();
+    DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.TokenFreeze();
   }
 
-  public static com.tangem.blockchain.binance.proto.TokenFreeze getDefaultInstance() {
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
@@ -719,7 +719,7 @@ private static final long serialVersionUID = 0L;
   }
 
   @Override
-  public com.tangem.blockchain.binance.proto.TokenFreeze getDefaultInstanceForType() {
+  public com.tangem.blockchain.blockchains.binance.proto.TokenFreeze getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreezeOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreezeOrBuilder.java
similarity index 93%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreezeOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreezeOrBuilder.java
index d0e30a2b2a..b4a525e026 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreezeOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreezeOrBuilder.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 public interface TokenFreezeOrBuilder extends
     // @@protoc_insertion_point(interface_extends:transaction.TokenFreeze)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreeze.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreeze.java
similarity index 80%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreeze.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreeze.java
index 48167e4b06..e1f660b591 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreeze.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreeze.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 /**
  * 
@@ -85,15 +85,15 @@ private static final long serialVersionUID = 0L;
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
   }
 
   @Override
   protected FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_fieldAccessorTable
+    return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.tangem.blockchain.binance.proto.TokenUnfreeze.class, com.tangem.blockchain.binance.proto.TokenUnfreeze.Builder.class);
+            com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.class, com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.Builder.class);
   }
 
   public static final int FROM_FIELD_NUMBER = 1;
@@ -217,10 +217,10 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.tangem.blockchain.binance.proto.TokenUnfreeze)) {
+    if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze)) {
       return super.equals(obj);
     }
-    com.tangem.blockchain.binance.proto.TokenUnfreeze other = (com.tangem.blockchain.binance.proto.TokenUnfreeze) obj;
+    com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze other = (com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze) obj;
 
     if (!getFrom()
         .equals(other.getFrom())) return false;
@@ -251,69 +251,69 @@ private static final long serialVersionUID = 0L;
     return hash;
   }
 
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(byte[] data)
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseDelimitedFrom(java.io.InputStream input)
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseDelimitedFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -326,7 +326,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.tangem.blockchain.binance.proto.TokenUnfreeze prototype) {
+  public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @Override
@@ -351,21 +351,21 @@ private static final long serialVersionUID = 0L;
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder implements
       // @@protoc_insertion_point(builder_implements:transaction.TokenUnfreeze)
-      com.tangem.blockchain.binance.proto.TokenUnfreezeOrBuilder {
+      com.tangem.blockchain.blockchains.binance.proto.TokenUnfreezeOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
     }
 
     @Override
     protected FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_fieldAccessorTable
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.tangem.blockchain.binance.proto.TokenUnfreeze.class, com.tangem.blockchain.binance.proto.TokenUnfreeze.Builder.class);
+              com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.class, com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.Builder.class);
     }
 
-    // Construct using com.tangem.blockchain.binance.proto.TokenUnfreeze.newBuilder()
+    // Construct using com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -395,17 +395,17 @@ private static final long serialVersionUID = 0L;
     @Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
+      return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.TokenUnfreeze getDefaultInstanceForType() {
-      return com.tangem.blockchain.binance.proto.TokenUnfreeze.getDefaultInstance();
+    public com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze getDefaultInstanceForType() {
+      return com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.getDefaultInstance();
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.TokenUnfreeze build() {
-      com.tangem.blockchain.binance.proto.TokenUnfreeze result = buildPartial();
+    public com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze build() {
+      com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -413,8 +413,8 @@ private static final long serialVersionUID = 0L;
     }
 
     @Override
-    public com.tangem.blockchain.binance.proto.TokenUnfreeze buildPartial() {
-      com.tangem.blockchain.binance.proto.TokenUnfreeze result = new com.tangem.blockchain.binance.proto.TokenUnfreeze(this);
+    public com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze buildPartial() {
+      com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze result = new com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze(this);
       result.from_ = from_;
       result.symbol_ = symbol_;
       result.amount_ = amount_;
@@ -456,16 +456,16 @@ private static final long serialVersionUID = 0L;
     }
     @Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.tangem.blockchain.binance.proto.TokenUnfreeze) {
-        return mergeFrom((com.tangem.blockchain.binance.proto.TokenUnfreeze)other);
+      if (other instanceof com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze) {
+        return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.tangem.blockchain.binance.proto.TokenUnfreeze other) {
-      if (other == com.tangem.blockchain.binance.proto.TokenUnfreeze.getDefaultInstance()) return this;
+    public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze other) {
+      if (other == com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.getDefaultInstance()) return this;
       if (other.getFrom() != com.google.protobuf.ByteString.EMPTY) {
         setFrom(other.getFrom());
       }
@@ -491,11 +491,11 @@ private static final long serialVersionUID = 0L;
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      com.tangem.blockchain.binance.proto.TokenUnfreeze parsedMessage = null;
+      com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (com.tangem.blockchain.binance.proto.TokenUnfreeze) e.getUnfinishedMessage();
+        parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -689,12 +689,12 @@ private static final long serialVersionUID = 0L;
   }
 
   // @@protoc_insertion_point(class_scope:transaction.TokenUnfreeze)
-  private static final com.tangem.blockchain.binance.proto.TokenUnfreeze DEFAULT_INSTANCE;
+  private static final com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.TokenUnfreeze();
+    DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze();
   }
 
-  public static com.tangem.blockchain.binance.proto.TokenUnfreeze getDefaultInstance() {
+  public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
@@ -719,7 +719,7 @@ private static final long serialVersionUID = 0L;
   }
 
   @Override
-  public com.tangem.blockchain.binance.proto.TokenUnfreeze getDefaultInstanceForType() {
+  public com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreezeOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreezeOrBuilder.java
similarity index 94%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreezeOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreezeOrBuilder.java
index 7b05351dc3..4b8e0b4d5e 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreezeOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreezeOrBuilder.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 public interface TokenUnfreezeOrBuilder extends
     // @@protoc_insertion_point(interface_extends:transaction.TokenUnfreeze)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/Transaction.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Transaction.java
similarity index 99%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/Transaction.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Transaction.java
index f50167e356..9d79bb6c9b 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/Transaction.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Transaction.java
@@ -1,7 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: dex.proto
 
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
 
 public final class Transaction {
   private Transaction() {}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt
similarity index 88%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt
index 01cdd30770..d4bf305e42 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinAddress.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt
@@ -1,6 +1,7 @@
-package com.tangem.blockchain.bitcoin
+package com.tangem.blockchain.blockchains.bitcoin
 
 
+import com.tangem.blockchain.common.AddressService
 import com.tangem.common.extensions.calculateRipemd160
 import com.tangem.common.extensions.calculateSha256
 import org.bitcoinj.core.AddressFormatException
@@ -10,25 +11,16 @@ import org.bitcoinj.params.MainNetParams
 import org.bitcoinj.params.TestNet3Params
 import java.security.MessageDigest
 
-class BitcoinAddressFactory {
-    companion object {
-        fun makeAddress(walletPublicKey: ByteArray, testNet: Boolean = false): String {
+class BitcoinAddressService(private val testNet: Boolean = false): AddressService {
+    override fun makeAddress(walletPublicKey: ByteArray): String {
             val netSelectionByte = if (testNet) 0x6f.toByte() else 0x00.toByte()
             val hash1 = walletPublicKey.calculateSha256().calculateRipemd160()
             val hash2 = byteArrayOf(netSelectionByte).plus(hash1).calculateSha256().calculateSha256()
             val result = byteArrayOf(netSelectionByte) + hash1 + hash2[0] + hash2[1] + hash2[2] + hash2[3]
             return Base58.encode(result)
         }
-    }
-}
 
-class BitcoinAddressValidator {
-    companion object {
-
-        private const val firstLetters = "123nm"
-        private const val firstLettersNonTestNet = "13"
-
-        fun validate(address: String, testNet: Boolean = false): Boolean {
+       override fun validate(address: String): Boolean {
             if (firstLetters.contains(address.first())) {
                 if (testNet && firstLettersNonTestNet.contains(address.first())) return false
                 if (address.length !in 26..35) return false
@@ -68,5 +60,9 @@ class BitcoinAddressValidator {
                 false
             }
         }
+
+    companion object {
+        private const val firstLetters = "123nm"
+        private const val firstLettersNonTestNet = "13"
     }
 }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
similarity index 75%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
index 664c45fa0d..ef0cbe5500 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
@@ -1,7 +1,8 @@
-package com.tangem.blockchain.bitcoin
+package com.tangem.blockchain.blockchains.bitcoin
 
 import com.tangem.blockchain.common.TransactionData
-import com.tangem.blockchain.common.extensions.Result
+import com.tangem.blockchain.extensions.Result
+import com.tangem.common.extensions.isZero
 import org.bitcoinj.core.*
 import org.bitcoinj.crypto.TransactionSignature
 import org.bitcoinj.script.Script
@@ -9,18 +10,20 @@ import org.bitcoinj.script.ScriptBuilder
 import java.math.BigDecimal
 import java.math.BigInteger
 
-class BitcoinTransactionBuilder(private val testNet: Boolean) {
+open class BitcoinTransactionBuilder(
+        private val walletPublicKey: ByteArray, private val testNet: Boolean = false
+) {
 
     private lateinit var transaction: Transaction
-    private var networkParameters: NetworkParameters? = null
-    var unspentOutputs: List? = null
+    protected var networkParameters: NetworkParameters? = null
+    var unspentOutputs: List? = null
 
-    fun buildToSign(
+    open fun buildToSign(
             transactionData: TransactionData): Result> {
 
         if (unspentOutputs == null) return Result.Failure(Exception("Currently there's an unconfirmed transaction"))
 
-        val change: BigDecimal = calculateChange(transactionData)
+        val change: BigDecimal = calculateChange(transactionData, unspentOutputs!!)
 
         networkParameters = if (testNet) {
             NetworkParameters.fromID(NetworkParameters.ID_TESTNET)
@@ -37,51 +40,51 @@ class BitcoinTransactionBuilder(private val testNet: Boolean) {
         return Result.Success(hashesForSign)
     }
 
-    private fun calculateChange(transactionData: TransactionData): BigDecimal {
+    open fun buildToSend(signedTransaction: ByteArray): ByteArray {
+        for (index in transaction.inputs.indices) {
+            transaction.inputs[index].scriptSig = createScript(index, signedTransaction, walletPublicKey)
+        }
+        return transaction.bitcoinSerialize()
+    }
+
+    fun getEstimateSize(transactionData: TransactionData): Result {
+        val buildTransactionResult = buildToSign(transactionData)
+        when (buildTransactionResult) {
+            is Result.Failure -> return buildTransactionResult
+            is Result.Success -> {
+                val hashes = buildTransactionResult.data
+                val finalTransaction = buildToSend(ByteArray(64 * hashes.size) { 1 })
+                return Result.Success(finalTransaction.size)
+            }
+        }
+    }
+
+    fun calculateChange(transactionData: TransactionData, unspentOutputs: List): BigDecimal {
         val fullAmount = unspentOutputs!!.map { it.amount }.reduce { acc, number -> acc + number }
         return fullAmount - (transactionData.amount.value!! + (transactionData.fee?.value
                 ?: 0.toBigDecimal()))
     }
 
-    fun buildToSend(signedTransaction: ByteArray, publicKey: ByteArray): ByteArray {
-        for (index in transaction.inputs.indices) {
-            transaction.inputs[index].scriptSig = createScript(index, signedTransaction, publicKey)
-        }
-        return transaction.bitcoinSerialize()
-    }
-
-    private fun createScript(index: Int, signedTransaction: ByteArray, publicKey: ByteArray): Script {
+    open fun createScript(index: Int, signedTransaction: ByteArray, publicKey: ByteArray): Script {
         val r = BigInteger(1, signedTransaction.copyOfRange(index * 64, 32 + index * 64))
         val s = BigInteger(1, signedTransaction.copyOfRange(32 + index * 64, 64 + index * 64))
         val canonicalS = ECKey.ECDSASignature(r, s).toCanonicalised().s
         val signature = TransactionSignature(r, canonicalS)
         return ScriptBuilder.createInputScript(signature, ECKey.fromPublicOnly(publicKey))
     }
-
-    fun getEstimateSize(transactionData: TransactionData, walletPublicKey: ByteArray): Result {
-        val buildTransactionResult = buildToSign(transactionData)
-        when (buildTransactionResult) {
-            is Result.Failure -> return buildTransactionResult
-            is Result.Success -> {
-                val hashes = buildTransactionResult.data
-                val finalTransaction = buildToSend(ByteArray(64 * hashes.size) { 1 }, walletPublicKey)
-                return Result.Success(finalTransaction.size)
-            }
-        }
-    }
 }
 
 internal fun TransactionData.toBitcoinJTransaction(networkParameters: NetworkParameters?,
-                                                   unspentOutputs: List,
+                                                   unspentOutputs: List,
                                                    change: BigDecimal): Transaction {
     val transaction = Transaction(networkParameters)
     for (utxo in unspentOutputs) {
-        transaction.addInput(Sha256Hash.wrap(utxo.hash), utxo.outputIndex, Script(utxo.outputScript))
+        transaction.addInput(Sha256Hash.wrap(utxo.transactionHash), utxo.outputIndex, Script(utxo.outputScript))
     }
     transaction.addOutput(
             Coin.parseCoin(this.amount.value!!.toPlainString()),
             Address.fromString(networkParameters, this.destinationAddress))
-    if (change != 0.toBigDecimal()) {
+    if (!change.isZero()) {
         transaction.addOutput(
                 Coin.parseCoin(change.toPlainString()),
                 Address.fromString(networkParameters,
@@ -90,9 +93,9 @@ internal fun TransactionData.toBitcoinJTransaction(networkParameters: NetworkPar
     return transaction
 }
 
-class UnspentTransaction(
+class BitcoinUnspentOutput(
         val amount: BigDecimal,
         val outputIndex: Long,
-        val hash: ByteArray,
+        val transactionHash: ByteArray,
         val outputScript: ByteArray
 )
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
new file mode 100644
index 0000000000..0670f32ad4
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
@@ -0,0 +1,93 @@
+package com.tangem.blockchain.blockchains.bitcoin
+
+import android.util.Log
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinAddressResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinProvider
+import com.tangem.blockchain.common.*
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.common.CompletionResult
+import com.tangem.common.extensions.toHexString
+import java.math.BigDecimal
+
+open class BitcoinWalletManager(
+        cardId: String,
+        wallet: Wallet,
+        private val transactionBuilder: BitcoinTransactionBuilder,
+        private val networkManager: BitcoinProvider
+) : WalletManager(cardId, wallet), TransactionSender {
+
+    protected val blockchain = wallet.blockchain
+
+    override suspend fun update() {
+        val response = networkManager.getInfo(wallet.address)
+        when (response) {
+            is Result.Success -> updateWallet(response.data)
+            is Result.Failure -> updateError(response.error)
+        }
+    }
+
+    private fun updateWallet(response: BitcoinAddressResponse) {
+        Log.d(this::class.java.simpleName, "Balance is ${response.balance}")
+        wallet.amounts[AmountType.Coin]?.value = response.balance
+        transactionBuilder.unspentOutputs = response.unspentOutputs
+        if (response.hasUnconfirmed) {
+            if (wallet.transactions.isEmpty()) wallet.addIncomingTransaction()
+        } else {
+            wallet.transactions.clear()
+        }
+    }
+
+    private fun updateError(error: Throwable?) {
+        Log.e(this::class.java.simpleName, error?.message ?: "")
+        if (error != null) throw error
+    }
+
+    override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
+        when (val buildTransactionResult = transactionBuilder.buildToSign(transactionData)) {
+            is Result.Failure -> return SimpleResult.Failure(buildTransactionResult.error)
+            is Result.Success -> {
+                when (val signerResponse = signer.sign(buildTransactionResult.data.toTypedArray(), cardId)) {
+                    is CompletionResult.Success -> {
+                        val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature)
+                        return networkManager.sendTransaction(transactionToSend.toHexString())
+                    }
+                    is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
+                }
+            }
+        }
+    }
+
+    override suspend fun getFee(amount: Amount, destination: String): Result> {
+        when (val feeResult = networkManager.getFee()) {
+            is Result.Failure -> return feeResult
+            is Result.Success -> {
+                val feeValue = BigDecimal.ONE.movePointLeft(blockchain.decimals())
+                amount.value = amount.value!! - feeValue
+                val sizeResult = transactionBuilder.getEstimateSize(
+                        TransactionData(amount, Amount(amount, feeValue), wallet.address, destination)
+                )
+                when (sizeResult) {
+                    is Result.Failure -> return sizeResult
+                    is Result.Success -> {
+                        val transactionSize = sizeResult.data.toBigDecimal()
+                        val minFee = feeResult.data.minimalPerKb.calculateFee(transactionSize)
+                        val normalFee = feeResult.data.normalPerKb.calculateFee(transactionSize)
+                        val priorityFee = feeResult.data.priorityPerKb.calculateFee(transactionSize)
+                        return Result.Success(
+                                listOf(Amount(minFee, blockchain),
+                                        Amount(normalFee, blockchain),
+                                        Amount(priorityFee, blockchain))
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    private fun BigDecimal.calculateFee(transactionSize: BigDecimal): BigDecimal {
+        val bytesInKb = BigDecimal(1024)
+        return this.divide(bytesInKb).multiply(transactionSize)
+                .setScale(8, BigDecimal.ROUND_DOWN)
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
similarity index 75%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
index 55b686591e..8483883d82 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
@@ -1,21 +1,21 @@
-package com.tangem.blockchain.bitcoin.network
+package com.tangem.blockchain.blockchains.bitcoin.network
 
-import com.tangem.blockchain.bitcoin.UnspentTransaction
-import com.tangem.blockchain.bitcoin.network.api.BlockchainInfoApi
-import com.tangem.blockchain.bitcoin.network.api.BlockcypherApi
-import com.tangem.blockchain.bitcoin.network.api.EstimatefeeApi
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.network.API_BLOCKCHAIN_INFO
-import com.tangem.blockchain.common.network.API_BLOCKCYPHER
-import com.tangem.blockchain.common.network.API_ESTIMATEFEE
-import com.tangem.blockchain.common.network.createRetrofitInstance
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockchainInfoApi
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockcypherApi
+import com.tangem.blockchain.blockchains.bitcoin.network.api.EstimatefeeApi
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_BLOCKCHAIN_INFO
+import com.tangem.blockchain.network.API_BLOCKCYPHER
+import com.tangem.blockchain.network.API_ESTIMATEFEE
+import com.tangem.blockchain.network.createRetrofitInstance
 import retrofit2.HttpException
 import java.io.IOException
 import java.math.BigDecimal
 
 
-class BitcoinNetworkManager(private val isTestNet: Boolean) : BitcoinProvider {
+class BitcoinNetworkManager(private val isTestNet: Boolean = false) : BitcoinProvider {
 
     private val blockcypherProvider by lazy {
         val api = createRetrofitInstance(API_BLOCKCYPHER)
@@ -85,16 +85,12 @@ class BitcoinNetworkManager(private val isTestNet: Boolean) : BitcoinProvider {
             }
         }
     }
-
-    companion object {
-        val SATOSHI_IN_BTC = 100000000.toBigDecimal()
-    }
 }
 
 data class BitcoinAddressResponse(
         val balance: BigDecimal,
         val hasUnconfirmed: Boolean,
-        val unspentTransactions: List?
+        val unspentOutputs: List?
 )
 
 data class BitcoinFee(
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinProvider.kt
similarity index 57%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinProvider.kt
index e82fb2f67c..13e99f95d3 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinProvider.kt
@@ -1,7 +1,7 @@
-package com.tangem.blockchain.bitcoin.network
+package com.tangem.blockchain.blockchains.bitcoin.network
 
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
 
 interface BitcoinProvider {
     suspend fun getInfo(address: String): Result
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
similarity index 79%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
index 7b2882ec57..cb9dc12e6a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
@@ -1,12 +1,12 @@
-package com.tangem.blockchain.bitcoin.network
+package com.tangem.blockchain.blockchains.bitcoin.network
 
-import com.tangem.blockchain.bitcoin.UnspentTransaction
-import com.tangem.blockchain.bitcoin.network.BitcoinNetworkManager.Companion.SATOSHI_IN_BTC
-import com.tangem.blockchain.bitcoin.network.api.BlockchainInfoApi
-import com.tangem.blockchain.bitcoin.network.api.EstimatefeeApi
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockchainInfoApi
+import com.tangem.blockchain.blockchains.bitcoin.network.api.EstimatefeeApi
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
 import com.tangem.common.extensions.hexToBytes
 import kotlinx.coroutines.async
 import kotlinx.coroutines.coroutineScope
@@ -16,6 +16,7 @@ class BlockchainInfoProvider(
         private val blockchainApi: BlockchainInfoApi,
         private val estimatefeeApi: EstimatefeeApi
 ) : BitcoinProvider {
+    val decimals = Blockchain.Bitcoin.decimals()
 
     override suspend fun getInfo(address: String): Result {
         return try {
@@ -28,8 +29,8 @@ class BlockchainInfoProvider(
                 val unconfirmedTransactions = addressData.transactions?.find { it.blockHeight == 0L } != null
 
                 val bitcoinUnspents = unspents.unspentOutputs.map {
-                    UnspentTransaction(
-                            it.amount!!.toBigDecimal().divide(SATOSHI_IN_BTC),
+                    BitcoinUnspentOutput(
+                            it.amount!!.toBigDecimal().movePointLeft(decimals),
                             it.outputIndex!!.toLong(),
                             it.hash!!.hexToBytes(),
                             it.outputScript!!.hexToBytes())
@@ -37,7 +38,7 @@ class BlockchainInfoProvider(
 
                 Result.Success(
                         BitcoinAddressResponse(
-                                addressData.finalBalance?.toBigDecimal()?.divide(SATOSHI_IN_BTC)
+                                addressData.finalBalance?.toBigDecimal()?.movePointLeft(decimals)
                                         ?: 0.toBigDecimal(), unconfirmedTransactions, bitcoinUnspents))
             }
         } catch (exception: Exception) {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockcypherProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
similarity index 64%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockcypherProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
index 94c9e3dd17..58b6bec6a4 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockcypherProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
@@ -1,19 +1,20 @@
-package com.tangem.blockchain.bitcoin.network
+package com.tangem.blockchain.blockchains.bitcoin.network
 
-import com.tangem.blockchain.bitcoin.UnspentTransaction
-import com.tangem.blockchain.bitcoin.network.BitcoinNetworkManager.Companion.SATOSHI_IN_BTC
-import com.tangem.blockchain.bitcoin.network.api.BlockcypherApi
-import com.tangem.blockchain.bitcoin.network.api.BlockcypherBody
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherFee
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherResponse
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockcypherApi
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockcypherBody
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherFee
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherResponse
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
 import com.tangem.common.extensions.hexToBytes
 
 class BlockcypherProvider(private val api: BlockcypherApi, isTestNet: Boolean) : BitcoinProvider {
 
     private val blockchain = "btc"
+    private val decimals = Blockchain.Bitcoin.decimals()
 
     private val network = if (isTestNet) {
         BlockcypherNetwork.Test.network
@@ -25,15 +26,15 @@ class BlockcypherProvider(private val api: BlockcypherApi, isTestNet: Boolean) :
         try {
             val addressData: BlockcypherResponse = retryIO { api.getAddressData(blockchain, network, address) }
             val unspents = addressData.txrefs?.map {
-                UnspentTransaction(
-                        it.amount!!.toBigDecimal().divide(SATOSHI_IN_BTC),
+                BitcoinUnspentOutput(
+                        it.amount!!.toBigDecimal().movePointLeft(decimals),
                         it.outputIndex!!.toLong(),
                         it.hash!!.hexToBytes(),
                         it.outputScript!!.hexToBytes()
                 )
             }
             return Result.Success(BitcoinAddressResponse(
-                    addressData.balance!!.toBigDecimal().divide(SATOSHI_IN_BTC),
+                    addressData.balance!!.toBigDecimal().movePointLeft(decimals),
                     addressData.unconfirmedBalance != 0L,
                     unspents))
 
@@ -43,27 +44,27 @@ class BlockcypherProvider(private val api: BlockcypherApi, isTestNet: Boolean) :
     }
 
     override suspend fun getFee(): Result {
-        try {
+        return try {
             val receivedFee: BlockcypherFee = retryIO { api.getFee(blockchain, network) }
-            return Result.Success(
-                    BitcoinFee(receivedFee.minFeePerKb!!.toBigDecimal().divide(SATOSHI_IN_BTC),
-                            receivedFee.normalFeePerKb!!.toBigDecimal().divide(SATOSHI_IN_BTC),
-                            receivedFee.priorityFeePerKb!!.toBigDecimal().divide(SATOSHI_IN_BTC))
+            Result.Success(
+                    BitcoinFee(receivedFee.minFeePerKb!!.toBigDecimal().movePointLeft(decimals),
+                            receivedFee.normalFeePerKb!!.toBigDecimal().movePointLeft(decimals),
+                            receivedFee.priorityFeePerKb!!.toBigDecimal().movePointLeft(decimals))
             )
         } catch (error: Exception) {
-            return Result.Failure(error)
+            Result.Failure(error)
         }
     }
 
     override suspend fun sendTransaction(transaction: String): SimpleResult {
-        try {
+        return try {
             retryIO {
                 api.sendTransaction(
                         blockchain, network, BlockcypherBody(transaction), BlockcypherToken.getToken())
             }
-            return SimpleResult.Success
+            SimpleResult.Success
         } catch (error: Exception) {
-            return SimpleResult.Failure(error)
+            SimpleResult.Failure(error)
         }
     }
 }
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockchainInfoApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockchainInfoApi.kt
similarity index 64%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockchainInfoApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockchainInfoApi.kt
index 1b43631d5a..294846b58c 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockchainInfoApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockchainInfoApi.kt
@@ -1,7 +1,7 @@
-package com.tangem.blockchain.bitcoin.network.api
+package com.tangem.blockchain.blockchains.bitcoin.network.api
 
-import com.tangem.blockchain.bitcoin.network.response.BlockchainInfoAddress
-import com.tangem.blockchain.bitcoin.network.response.BlockchainInfoUnspents
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockchainInfoAddress
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockchainInfoUnspents
 import okhttp3.ResponseBody
 import retrofit2.http.*
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockcypherApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockcypherApi.kt
similarity index 80%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockcypherApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockcypherApi.kt
index 755191e81e..14b78b0e53 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockcypherApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockcypherApi.kt
@@ -1,9 +1,9 @@
-package com.tangem.blockchain.bitcoin.network.api
+package com.tangem.blockchain.blockchains.bitcoin.network.api
 
 import com.squareup.moshi.JsonClass
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherFee
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherResponse
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherTx
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherFee
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherTx
 import retrofit2.http.*
 
 interface BlockcypherApi {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/EstimateFeeApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/EstimateFeeApi.kt
similarity index 85%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/EstimateFeeApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/EstimateFeeApi.kt
index 22e95304db..393e03a00b 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/EstimateFeeApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/EstimateFeeApi.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.bitcoin.network.api
+package com.tangem.blockchain.blockchains.bitcoin.network.api
 
 import retrofit2.http.GET
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockchainInfoResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockchainInfoResponse.kt
similarity index 94%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockchainInfoResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockchainInfoResponse.kt
index 015d867985..e7ec0f2734 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockchainInfoResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockchainInfoResponse.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.bitcoin.network.response
+package com.tangem.blockchain.blockchains.bitcoin.network.response
 
 import com.squareup.moshi.Json
 import com.squareup.moshi.JsonClass
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockcypherResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockcypherResponse.kt
similarity index 95%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockcypherResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockcypherResponse.kt
index b1e869797a..a0e79c45b2 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockcypherResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockcypherResponse.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.bitcoin.network.response
+package com.tangem.blockchain.blockchains.bitcoin.network.response
 
 import com.squareup.moshi.Json
 import com.squareup.moshi.JsonClass
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressService.kt
new file mode 100644
index 0000000000..20e41a0b49
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressService.kt
@@ -0,0 +1,23 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.tangem.blockchain.blockchains.bitcoincash.cashaddr.BitcoinCashAddressType
+import com.tangem.blockchain.blockchains.bitcoincash.cashaddr.CashAddr
+import com.tangem.blockchain.common.AddressService
+import com.tangem.common.extensions.calculateRipemd160
+import com.tangem.common.extensions.calculateSha256
+import com.tangem.common.extensions.toCompressedPublicKey
+
+class BitcoinCashAddressService() : AddressService {
+    override fun makeAddress(walletPublicKey: ByteArray): String {
+        val publicKeyHash = walletPublicKey.toCompressedPublicKey().calculateSha256().calculateRipemd160()
+        return CashAddr.toCashAddress(BitcoinCashAddressType.P2PKH, publicKeyHash)
+    }
+
+    override fun validate(address: String): Boolean {
+        return CashAddr.isValidCashAddress(address)
+    }
+
+    fun getPublicKeyHash(address: String): ByteArray {
+        return CashAddr.decodeCashAddress(address).hash
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashNetworkManager.kt
new file mode 100644
index 0000000000..5a594aa312
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashNetworkManager.kt
@@ -0,0 +1,33 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinAddressResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinFee
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinProvider
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_BLOCKCHAIR
+import com.tangem.blockchain.network.blockchair.BlockchairApi
+import com.tangem.blockchain.network.blockchair.BlockchairProvider
+import com.tangem.blockchain.network.createRetrofitInstance
+
+class BitcoinCashNetworkManager : BitcoinProvider {
+    private val blockchain: Blockchain = Blockchain.BitcoinCash
+
+    private val blockchairProvider by lazy {
+        val api = createRetrofitInstance(API_BLOCKCHAIR).create(BlockchairApi::class.java)
+        BlockchairProvider(api, blockchain)
+    }
+
+    override suspend fun getInfo(address: String): Result {
+        return blockchairProvider.getInfo(address)
+    }
+
+    override suspend fun getFee(): Result {
+        return blockchairProvider.getFee()
+    }
+
+    override suspend fun sendTransaction(transaction: String): SimpleResult {
+        return blockchairProvider.sendTransaction(transaction)
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransaction.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransaction.java
new file mode 100644
index 0000000000..ec339789c1
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransaction.java
@@ -0,0 +1,110 @@
+package com.tangem.blockchain.blockchains.bitcoincash;
+
+import org.bitcoinj.core.Coin;
+import org.bitcoinj.core.NetworkParameters;
+import org.bitcoinj.core.Sha256Hash;
+import org.bitcoinj.core.Transaction;
+import org.bitcoinj.core.TransactionInput;
+import org.bitcoinj.core.TransactionOutput;
+import org.bitcoinj.core.UnsafeByteArrayOutputStream;
+import org.bitcoinj.core.VarInt;
+import org.bitcoinj.crypto.TransactionSignature;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.util.List;
+
+import static org.bitcoinj.core.Utils.uint32ToByteStreamLE;
+import static org.bitcoinj.core.Utils.uint64ToByteStreamLE;
+
+// logic from https://github.com/pokkst/bitcoincashj
+public class BitcoinCashTransaction extends Transaction {
+//    private ArrayList inputs;
+//    private ArrayList outputs;
+
+//    private long version;
+//    private long lockTime;
+
+    public final byte SIGHASH_FORK_ID = 0x40;
+
+    public BitcoinCashTransaction(NetworkParameters params) {
+        super(params);
+    }
+
+    public synchronized Sha256Hash hashForSignatureWitness(
+            int inputIndex,
+            byte[] connectedScript,
+            Coin prevValue,
+            SigHash type,
+            boolean anyoneCanPay)
+    {
+        byte sigHashType = (byte) TransactionSignature.calcSigHashValue(type, anyoneCanPay);
+        sigHashType |= SIGHASH_FORK_ID;
+
+        ByteArrayOutputStream bos = new UnsafeByteArrayOutputStream(length == UNKNOWN_LENGTH ? 256 : length + 4);
+        try {
+            byte[] hashPrevouts = new byte[32];
+            byte[] hashSequence = new byte[32];
+            byte[] hashOutputs = new byte[32];
+            anyoneCanPay = (sigHashType & SIGHASH_ANYONECANPAY_VALUE) == SIGHASH_ANYONECANPAY_VALUE;
+            List inputs = getInputs();
+            List outputs = getOutputs();
+
+            if (!anyoneCanPay) {
+                ByteArrayOutputStream bosHashPrevouts = new UnsafeByteArrayOutputStream(256);
+                for (int i = 0; i < inputs.size(); ++i) {
+                    bosHashPrevouts.write(inputs.get(i).getOutpoint().getHash().getReversedBytes());
+                    uint32ToByteStreamLE(inputs.get(i).getOutpoint().getIndex(), bosHashPrevouts);
+                }
+                hashPrevouts = Sha256Hash.hashTwice(bosHashPrevouts.toByteArray());
+            }
+
+            if (!anyoneCanPay && type != SigHash.SINGLE && type != SigHash.NONE) {
+                ByteArrayOutputStream bosSequence = new UnsafeByteArrayOutputStream(256);
+                for (int i = 0; i < inputs.size(); ++i) {
+                    uint32ToByteStreamLE(inputs.get(i).getSequenceNumber(), bosSequence);
+                }
+                hashSequence = Sha256Hash.hashTwice(bosSequence.toByteArray());
+            }
+
+            if (type != SigHash.SINGLE && type != SigHash.NONE) {
+                ByteArrayOutputStream bosHashOutputs = new UnsafeByteArrayOutputStream(256);
+                for (int i = 0; i < outputs.size(); ++i) {
+                    uint64ToByteStreamLE(
+                            BigInteger.valueOf(outputs.get(i).getValue().getValue()),
+                            bosHashOutputs
+                    );
+                    bosHashOutputs.write(new VarInt(outputs.get(i).getScriptBytes().length).encode());
+                    bosHashOutputs.write(outputs.get(i).getScriptBytes());
+                }
+                hashOutputs = Sha256Hash.hashTwice(bosHashOutputs.toByteArray());
+            } else if (type == SigHash.SINGLE && inputIndex < outputs.size()) {
+                ByteArrayOutputStream bosHashOutputs = new UnsafeByteArrayOutputStream(256);
+                uint64ToByteStreamLE(
+                        BigInteger.valueOf(outputs.get(inputIndex).getValue().getValue()),
+                        bosHashOutputs
+                );
+                bosHashOutputs.write(new VarInt(outputs.get(inputIndex).getScriptBytes().length).encode());
+                bosHashOutputs.write(outputs.get(inputIndex).getScriptBytes());
+                hashOutputs = Sha256Hash.hashTwice(bosHashOutputs.toByteArray());
+            }
+            uint32ToByteStreamLE(getVersion(), bos);
+            bos.write(hashPrevouts);
+            bos.write(hashSequence);
+            bos.write(inputs.get(inputIndex).getOutpoint().getHash().getReversedBytes());
+            uint32ToByteStreamLE(inputs.get(inputIndex).getOutpoint().getIndex(), bos);
+            bos.write(new VarInt(connectedScript.length).encode());
+            bos.write(connectedScript);
+            uint64ToByteStreamLE(BigInteger.valueOf(prevValue.getValue()), bos);
+            uint32ToByteStreamLE(inputs.get(inputIndex).getSequenceNumber(), bos);
+            bos.write(hashOutputs);
+            uint32ToByteStreamLE(getLockTime(), bos);
+            uint32ToByteStreamLE(0x000000ff & sigHashType, bos);
+        } catch (IOException e) {
+            throw new RuntimeException(e);  // Cannot happen.
+        }
+
+        return Sha256Hash.twiceOf(bos.toByteArray());
+    }
+}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransactionBuilder.kt
new file mode 100644
index 0000000000..58bec1f6e3
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransactionBuilder.kt
@@ -0,0 +1,82 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinTransactionBuilder
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.common.TransactionData
+import com.tangem.blockchain.extensions.Result
+import com.tangem.common.extensions.isZero
+import org.bitcoinj.core.*
+import org.bitcoinj.core.LegacyAddress.fromPubKeyHash
+import org.bitcoinj.crypto.TransactionSignature
+import org.bitcoinj.script.Script
+import org.bitcoinj.script.ScriptBuilder
+import java.math.BigDecimal
+import java.math.BigInteger
+
+class BitcoinCashTransactionBuilder(private val walletPublicKey: ByteArray)
+    : BitcoinTransactionBuilder(walletPublicKey) {
+
+    private lateinit var transaction: BitcoinCashTransaction
+
+    override fun buildToSign(
+            transactionData: TransactionData): Result> {
+
+        if (unspentOutputs == null) return Result.Failure(Exception("Currently there's an unconfirmed transaction"))
+
+        val change: BigDecimal = calculateChange(transactionData, unspentOutputs!!)
+
+        networkParameters = NetworkParameters.fromID(NetworkParameters.ID_MAINNET)
+        transaction = transactionData.toBitcoinCashTransaction(networkParameters, unspentOutputs!!, change)
+
+        val hashesForSign: MutableList = MutableList(transaction.inputs.size) { byteArrayOf() }
+        for (input in transaction.inputs) {
+            val index = input.index
+            val value = Coin.parseCoin(unspentOutputs!![index].amount.toString())
+            hashesForSign[index] = transaction.hashForSignatureWitness(index, input.scriptBytes, value, Transaction.SigHash.ALL, false).bytes
+        }
+        return Result.Success(hashesForSign)
+    }
+
+    override fun buildToSend(signedTransaction: ByteArray): ByteArray {
+        for (index in transaction.inputs.indices) {
+            transaction.inputs[index].scriptSig = createScript(index, signedTransaction, walletPublicKey)
+        }
+        return transaction.bitcoinSerialize()
+    }
+
+    override fun createScript(index: Int, signedTransaction: ByteArray, publicKey: ByteArray): Script {
+        val r = BigInteger(1, signedTransaction.copyOfRange(index * 64, 32 + index * 64))
+        val s = BigInteger(1, signedTransaction.copyOfRange(32 + index * 64, 64 + index * 64))
+        val canonicalS = ECKey.ECDSASignature(r, s).toCanonicalised().s
+
+        val sigHash = 0x41
+        val signature = TransactionSignature(r, canonicalS, sigHash)
+        return ScriptBuilder.createInputScript(signature, ECKey.fromPublicOnly(publicKey))
+    }
+}
+
+internal fun TransactionData.toBitcoinCashTransaction(networkParameters: NetworkParameters?,
+                                                      unspentOutputs: List,
+                                                      change: BigDecimal): BitcoinCashTransaction {
+    val transaction = BitcoinCashTransaction(networkParameters)
+    for (utxo in unspentOutputs) {
+        transaction.addInput(Sha256Hash.wrap(utxo.transactionHash), utxo.outputIndex, Script(utxo.outputScript))
+    }
+    val addressService = BitcoinCashAddressService()
+    val sourceLegacyAddress =
+            fromPubKeyHash(networkParameters, addressService.getPublicKeyHash(this.sourceAddress))
+    val destinationLegacyAddress =
+            fromPubKeyHash(networkParameters, addressService.getPublicKeyHash(this.destinationAddress))
+
+    transaction.addOutput(
+            Coin.parseCoin(this.amount.value!!.toPlainString()),
+            destinationLegacyAddress
+    )
+    if (!change.isZero()) {
+        transaction.addOutput(
+                Coin.parseCoin(change.toPlainString()),
+                sourceLegacyAddress
+        )
+    }
+    return transaction
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashWalletManager.kt
new file mode 100644
index 0000000000..b0793c6cf9
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashWalletManager.kt
@@ -0,0 +1,28 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinWalletManager
+import com.tangem.blockchain.common.Amount
+import com.tangem.blockchain.common.TransactionSender
+import com.tangem.blockchain.common.Wallet
+import com.tangem.blockchain.extensions.Result
+import java.math.BigDecimal
+
+class BitcoinCashWalletManager(
+        cardId: String,
+        wallet: Wallet,
+        private val transactionBuilder: BitcoinCashTransactionBuilder,
+        private val networkManager: BitcoinCashNetworkManager
+) : BitcoinWalletManager(cardId, wallet, transactionBuilder, networkManager), TransactionSender {
+    override suspend fun getFee(amount: Amount, destination: String): Result> {
+        val minimalFee = BigDecimal("0.00001")
+        when (val result = super.getFee(amount, destination)) {
+            is Result.Success -> {
+                for (fee in result.data) {
+                    if (fee.value!! < minimalFee) fee.value = minimalFee
+                }
+                return result
+            }
+            is Result.Failure -> return result
+        }
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressDecodedParts.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressDecodedParts.java
new file mode 100644
index 0000000000..b3675c1f52
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressDecodedParts.java
@@ -0,0 +1,37 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+ 
+// Helper class for CashAddr
+
+public class BitcoinCashAddressDecodedParts {
+
+	String prefix;
+
+	BitcoinCashAddressType addressType;
+
+	byte[] hash;
+
+	public String getPrefix() {
+		return prefix;
+	}
+
+	public void setPrefix(String prefix) {
+		this.prefix = prefix;
+	}
+
+	public BitcoinCashAddressType getAddressType() {
+		return addressType;
+	}
+
+	public void setAddressType(BitcoinCashAddressType addressType) {
+		this.addressType = addressType;
+	}
+
+	public byte[] getHash() {
+		return hash;
+	}
+
+	public void setHash(byte[] hash) {
+		this.hash = hash;
+	}
+
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressType.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressType.java
new file mode 100644
index 0000000000..8654b29a1c
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressType.java
@@ -0,0 +1,23 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+
+
+/**
+ * Copyright (c) 2018 Tobias Brandt
+ * 
+ * Distributed under the MIT software license, see the accompanying file LICENSE
+ * or http://www.opensource.org/licenses/mit-license.php.
+ */
+public enum BitcoinCashAddressType {
+
+	P2PKH((byte) 0), P2SH((byte) 8);
+
+	private final byte versionByte;
+
+	BitcoinCashAddressType(byte versionByte) {
+		this.versionByte = versionByte;
+	}
+
+	public byte getVersionByte() {
+		return versionByte;
+	}
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBase32.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBase32.java
new file mode 100644
index 0000000000..04f3fef9f4
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBase32.java
@@ -0,0 +1,74 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+ 
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Copyright (c) 2018 Tobias Brandt
+ * 
+ * Distributed under the MIT software license, see the accompanying file LICENSE
+ * or http://www.opensource.org/licenses/mit-license.php.
+ */
+public class BitcoinCashBase32 {
+
+	public static final String CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
+
+	private static final char[] CHARS = CHARSET.toCharArray();
+
+	private static Map charPositionMap;
+	static {
+		charPositionMap = new HashMap<>();
+		for (int i = 0; i < CHARS.length; i++) {
+			charPositionMap.put(CHARS[i], i);
+		}
+		if (charPositionMap.size() != 32) {
+			throw new RuntimeException("The charset must contain 32 unique characters.");
+		}
+	}
+
+	/**
+	 * Encode a byte array as base32 string. This method assumes that all bytes
+	 * are only from 0-31
+	 * 
+	 * @param byteArray
+	 * @return
+	 */
+	public static String encode(byte[] byteArray) {
+		StringBuffer sb = new StringBuffer();
+
+		for (int i = 0; i < byteArray.length; i++) {
+			int val = (int) byteArray[i];
+
+			if (val < 0 || val > 31) {
+				throw new RuntimeException("This method assumes that all bytes are only from 0-31. Was: " + val);
+			}
+
+			sb.append(CHARS[val]);
+		}
+
+		return sb.toString();
+	}
+
+	/**
+	 * Decode a base32 string back to the byte array representation
+	 * 
+	 * @param base32String
+	 * @return
+	 */
+	public static byte[] decode(String base32String) {
+		byte[] bytes = new byte[base32String.length()];
+
+		char[] charArray = base32String.toCharArray();
+		for (int i = 0; i < charArray.length; i++) {
+			Integer position = charPositionMap.get(charArray[i]);
+			if (position == null) {
+				throw new RuntimeException("There seems to be an invalid char: " + charArray[i]);
+			}
+			bytes[i] = (byte) ((int) position);
+		}
+
+		return bytes;
+	}
+}
+ 
+ 
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBitArrayConverter.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBitArrayConverter.java
new file mode 100644
index 0000000000..ec0f980198
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBitArrayConverter.java
@@ -0,0 +1,60 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+/**
+ * Copyright (c) 2018 Tobias Brandt
+ * 
+ * Copyright (c) 2017 Pieter Wuille
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ * 
+ */
+public class BitcoinCashBitArrayConverter {
+
+	public static byte[] convertBits(byte[] bytes8Bits, int from, int to, boolean strictMode) {
+		int length = (int) (strictMode ? Math.floor((double) bytes8Bits.length * from / to)
+				: Math.ceil((double) bytes8Bits.length * from / to));
+		int mask = ((1 << to) - 1) & 0xff;
+		byte[] result = new byte[length];
+		int index = 0;
+		int accumulator = 0;
+		int bits = 0;
+		for (int i = 0; i < bytes8Bits.length; i++) {
+			byte value = bytes8Bits[i];
+			accumulator = (((accumulator & 0xff) << from) | (value & 0xff));
+			bits += from;
+			while (bits >= to) {
+				bits -= to;
+				result[index] = (byte) ((accumulator >> bits) & mask);
+				++index;
+			}
+		}
+		if (!strictMode) {
+			if (bits > 0) {
+				result[index] = (byte) ((accumulator << (to - bits)) & mask);
+				++index;
+			}
+		} else {
+			if (!(bits < from && ((accumulator << (to - bits)) & mask) == 0)) {
+				throw new RuntimeException("Strict mode was used but input couldn't be converted without padding");
+			}
+		}
+
+		return result;
+	}
+
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/CashAddr.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/CashAddr.java
new file mode 100644
index 0000000000..8c2cd1bfab
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/CashAddr.java
@@ -0,0 +1,225 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+
+
+/**
+ * Copyright (c) 2018 Tobias Brandt
+ *
+ * Distributed under the MIT software license, see the accompanying file LICENSE
+ * or http://www.opensource.org/licenses/mit-license.php.
+ */
+
+
+public class CashAddr {
+
+    public static final String CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
+
+    private static final char[] CHARS = CHARSET.toCharArray();
+
+
+    public static final String SEPARATOR = ":";
+
+    public static final String MAIN_NET_PREFIX = "bitcoincash";
+
+    public static final String TEST_NET_PREFIX = "bchtest";
+
+    public static final String ASSUMED_DEFAULT_PREFIX = MAIN_NET_PREFIX;
+
+    private static final BigInteger[] POLYMOD_GENERATORS = new BigInteger[] { new BigInteger("98f2bc8e61", 16),
+            new BigInteger("79b76d99e2", 16), new BigInteger("f33e5fb3c4", 16), new BigInteger("ae2eabe2a8", 16),
+            new BigInteger("1e4f43e470", 16) };
+
+    private static final BigInteger POLYMOD_AND_CONSTANT = new BigInteger("07ffffffff", 16);
+
+    public static String toCashAddress(BitcoinCashAddressType addressType, byte[] hash) {
+        String prefixString =  MAIN_NET_PREFIX;
+        byte[] prefixBytes = getPrefixBytes(prefixString);
+        byte[] payloadBytes = concatenateByteArrays(new byte[] { addressType.getVersionByte() }, hash);
+        payloadBytes = convertBits(payloadBytes, 8, 5, false);
+        byte[] allChecksumInput = concatenateByteArrays(
+                concatenateByteArrays(concatenateByteArrays(prefixBytes, new byte[] { 0 }), payloadBytes),
+                new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 });
+        byte[] checksumBytes = calculateChecksumBytesPolymod(allChecksumInput);
+        checksumBytes = convertBits(checksumBytes, 8, 5, true);
+        String cashAddress = BitcoinCashBase32.encode(concatenateByteArrays(payloadBytes, checksumBytes));
+        return prefixString + SEPARATOR + cashAddress;
+    }
+
+    public static BitcoinCashAddressDecodedParts decodeCashAddress(String bitcoinCashAddress) {
+        if (!isValidCashAddress(bitcoinCashAddress)) {
+            throw new RuntimeException("Address wasn't valid: " + bitcoinCashAddress);
+        }
+
+        BitcoinCashAddressDecodedParts decoded = new BitcoinCashAddressDecodedParts();
+        String[] addressParts = bitcoinCashAddress.split(SEPARATOR);
+        if (addressParts.length == 2) {
+            decoded.setPrefix(addressParts[0]);
+        } else {
+            decoded.setPrefix(MAIN_NET_PREFIX);
+        }
+
+        byte[] addressData = BitcoinCashBase32.decode(addressParts[addressParts.length - 1]);
+        addressData = Arrays.copyOfRange(addressData, 0, addressData.length - 8);
+        addressData = BitcoinCashBitArrayConverter.convertBits(addressData, 5, 8, true);
+        byte versionByte = addressData[0];
+        byte[] hash = Arrays.copyOfRange(addressData, 1, addressData.length);
+
+        decoded.setAddressType(getAddressTypeFromVersionByte(versionByte));
+        decoded.setHash(hash);
+
+        return decoded;
+    }
+
+    private static BitcoinCashAddressType getAddressTypeFromVersionByte(byte versionByte) {
+        for (BitcoinCashAddressType addressType : BitcoinCashAddressType.values()) {
+            if (addressType.getVersionByte() == versionByte) {
+                return addressType;
+            }
+        }
+
+        throw new RuntimeException("Unknown version byte: " + versionByte);
+    }
+
+
+
+    public static boolean isValidCashAddress(String bitcoinCashAddress ) {
+        try {
+            if (!isSingleCase(bitcoinCashAddress))
+                return false;
+
+            bitcoinCashAddress = bitcoinCashAddress.toLowerCase();
+            String prefix;
+
+            if (bitcoinCashAddress.contains(SEPARATOR)) {
+                String[] split = bitcoinCashAddress.split(SEPARATOR);
+                prefix = split[0];
+                if (!prefix.equals(MAIN_NET_PREFIX)) {return false;} //for now we use main net only
+                bitcoinCashAddress = split[1];
+            } else {
+                prefix = MAIN_NET_PREFIX;
+            }
+            if (!bitcoinCashAddress.startsWith("q")) {return false;} //for now we use P2PKH addresses only
+
+            byte[] checksumData =  concatenateByteArrays(
+                    concatenateByteArrays(getPrefixBytes(prefix ), new byte[] { 0x00 }),
+                    BitcoinCashBase32.decode(bitcoinCashAddress));
+
+            byte[] calculateChecksumBytesPolymod = calculateChecksumBytesPolymod(checksumData);
+            return new BigInteger(calculateChecksumBytesPolymod).compareTo(BigInteger.ZERO) == 0;
+        } catch (RuntimeException re) {
+            return false;
+        }
+    }
+
+
+
+    private static boolean isSingleCase(String bitcoinCashAddress) {
+        if (bitcoinCashAddress.equals(bitcoinCashAddress.toLowerCase())) {
+            return true;
+        }
+        if (bitcoinCashAddress.equals(bitcoinCashAddress.toUpperCase())) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * @param checksumInput
+     * @return Returns a 40 bits checksum in form of 5 8-bit arrays. This still has
+     *         to me mapped to 5-bit array representation
+     */
+    private static byte[] calculateChecksumBytesPolymod(byte[] checksumInput) {
+        BigInteger c = BigInteger.ONE;
+
+        for (int i = 0; i < checksumInput.length; i++) {
+            byte c0 = c.shiftRight(35).byteValue();
+            c = c.and(POLYMOD_AND_CONSTANT).shiftLeft(5)
+                    .xor(new BigInteger(String.format("%02x", checksumInput[i]), 16));
+
+            if ((c0 & 0x01) != 0)
+                c = c.xor(POLYMOD_GENERATORS[0]);
+            if ((c0 & 0x02) != 0)
+                c = c.xor(POLYMOD_GENERATORS[1]);
+            if ((c0 & 0x04) != 0)
+                c = c.xor(POLYMOD_GENERATORS[2]);
+            if ((c0 & 0x08) != 0)
+                c = c.xor(POLYMOD_GENERATORS[3]);
+            if ((c0 & 0x10) != 0)
+                c = c.xor(POLYMOD_GENERATORS[4]);
+        }
+
+        byte[] checksum = c.xor(BigInteger.ONE).toByteArray();
+        if (checksum.length == 5) {
+            return checksum;
+        } else {
+            byte[] newChecksumArray = new byte[5];
+
+            System.arraycopy(checksum, Math.max(0, checksum.length - 5), newChecksumArray,
+                    Math.max(0, 5 - checksum.length), Math.min(5, checksum.length));
+
+            return newChecksumArray;
+        }
+
+    }
+
+    private static byte[] getPrefixBytes(String prefixString ) {
+        byte[] prefixBytes = new byte[prefixString.length()];
+
+        char[] charArray = prefixString.toCharArray();
+        for (int i = 0; i < charArray.length; i++) {
+            prefixBytes[i] = (byte) (charArray[i] & 0x1f);
+        }
+
+        return prefixBytes;
+    }
+
+    private static byte[] concatenateByteArrays(byte[] first, byte[] second) {
+        byte[] concatenatedBytes = new byte[first.length + second.length];
+
+        System.arraycopy(first, 0, concatenatedBytes, 0, first.length);
+        System.arraycopy(second, 0, concatenatedBytes, first.length, second.length);
+
+        return concatenatedBytes;
+    }
+
+    private static byte[] convertBits(byte[] bytes8Bits, int from, int to, boolean strictMode) {
+        //Copyright (c) 2017 Pieter Wuille
+
+        int length = (int) (strictMode ? Math.floor((double) bytes8Bits.length * from / to)
+                : Math.ceil((double) bytes8Bits.length * from / to));
+        int mask = ((1 << to) - 1) & 0xff;
+        byte[] result = new byte[length];
+        int index = 0;
+        int accumulator = 0;
+        int bits = 0;
+        for (int i = 0; i < bytes8Bits.length; i++) {
+            byte value = bytes8Bits[i];
+            accumulator = (((accumulator & 0xff) << from) | (value & 0xff));
+            bits += from;
+            while (bits >= to) {
+                bits -= to;
+                result[index] = (byte) ((accumulator >> bits) & mask);
+                ++index;
+            }
+        }
+        if (!strictMode) {
+            if (bits > 0) {
+                result[index] = (byte) ((accumulator << (to - bits)) & mask);
+                ++index;
+            }
+        } else {
+            if (!(bits < from && ((accumulator << (to - bits)) & mask) == 0)) {
+                throw new RuntimeException("Strict mode was used but input couldn't be converted without padding");
+            }
+        }
+
+        return result;
+    }
+
+
+
+
+}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt
new file mode 100644
index 0000000000..ec72bc4b69
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt
@@ -0,0 +1,121 @@
+package com.tangem.blockchain.blockchains.cardano
+
+import co.nstant.`in`.cbor.CborBuilder
+import co.nstant.`in`.cbor.CborDecoder
+import co.nstant.`in`.cbor.CborEncoder
+import co.nstant.`in`.cbor.model.Array
+import co.nstant.`in`.cbor.model.ByteString
+import co.nstant.`in`.cbor.model.UnsignedInteger
+import com.tangem.blockchain.blockchains.cardano.crypto.Blake2b
+import com.tangem.blockchain.common.AddressService
+import com.tangem.blockchain.extensions.decodeBase58
+import com.tangem.blockchain.extensions.encodeBase58
+import org.spongycastle.crypto.util.DigestFactory
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import java.util.zip.CRC32
+
+class CardanoAddressService : AddressService {
+    override fun makeAddress(walletPublicKey: ByteArray): String {
+        val extendedPublicKey = extendPublicKey(walletPublicKey)
+
+        val pubKeyWithAttributes = getPubKeyWithAttributes(extendedPublicKey)
+        val sha3Hash = getSha3Hash(pubKeyWithAttributes)
+
+        val blake2b = Blake2b.Digest.newInstance(28)
+        val blakeHash = blake2b.digest(sha3Hash)
+
+        val hashWithAttributes = getHashWithAttributes(blakeHash)
+
+        return getAddress(hashWithAttributes)
+    }
+
+    override fun validate(address: String): Boolean {
+        val decoded = address.decodeBase58() ?: return false
+
+        return try {
+            val bais = ByteArrayInputStream(decoded)
+            val addressList =
+                    (CborDecoder(bais).decode()[0] as Array).dataItems
+            val addressItemBytes = (addressList[0] as ByteString).bytes
+            val checksum = (addressList[1] as UnsignedInteger).value.toLong()
+
+            val crc32 = CRC32()
+            crc32.update(addressItemBytes)
+            val calculatedChecksum = crc32.value
+
+            checksum == calculatedChecksum
+        } catch (e: Exception) {
+            false
+        }
+    }
+
+    private fun getPubKeyWithAttributes(extendedPublicKey: ByteArray): ByteArray {
+        val pubKeyWithAttributes = ByteArrayOutputStream()
+        CborEncoder(pubKeyWithAttributes).encode(CborBuilder()
+                    .addArray()
+                        .add(0)
+                            .addArray()
+                                .add(0)
+                                .add(extendedPublicKey)
+                            .end()
+                        .addMap()
+                        .end()
+                    .end()
+                    .build())
+        return pubKeyWithAttributes.toByteArray()
+    }
+
+    private fun getSha3Hash(pubKeyWithAttributes: ByteArray): ByteArray {
+        val sha3Digest = DigestFactory.createSHA3_256()
+        sha3Digest.update(pubKeyWithAttributes, 0, pubKeyWithAttributes.size)
+        val sha3Hash = ByteArray(32)
+        sha3Digest.doFinal(sha3Hash, 0)
+        return sha3Hash
+    }
+
+    private fun getHashWithAttributes(blakeHash: ByteArray): ByteArray {
+        val hashWithAttributes = ByteArrayOutputStream()
+        CborEncoder(hashWithAttributes).encode(CborBuilder()
+                .addArray()
+                    .add(blakeHash)
+                    .addMap() //additional attributes
+                    .end()
+                    .add(0) //address type
+                .end()
+                .build())
+        return hashWithAttributes.toByteArray()
+    }
+
+    private fun getAddress(hashWithAttributes: ByteArray): String {
+        val checksum = getCheckSum(hashWithAttributes)
+
+        val addressItem = CborBuilder().add(hashWithAttributes).build().get(0)
+        addressItem.setTag(24)
+
+        //addr + checksum
+        val address = ByteArrayOutputStream()
+        CborEncoder(address).encode(CborBuilder()
+                .addArray()
+                    .add(addressItem)
+                    .add(checksum)
+                .end()
+                .build())
+
+        return address.toByteArray().encodeBase58()
+    }
+
+    private fun getCheckSum(hashWithAttributes: ByteArray): Long {
+        val crc32 = CRC32()
+        crc32.update(hashWithAttributes)
+        return crc32.value
+    }
+
+    companion object {
+        fun extendPublicKey(publicKey: ByteArray): ByteArray {
+            val zeroBytes = ByteArray(32)
+            zeroBytes.fill(0)
+            return publicKey + zeroBytes
+        }
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoTransactionBuilder.kt
similarity index 91%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoTransactionBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoTransactionBuilder.kt
index a251e0068c..eb3d2ee289 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoTransactionBuilder.kt
@@ -1,19 +1,20 @@
-package com.tangem.blockchain.cardano
+package com.tangem.blockchain.blockchains.cardano
 
 import co.nstant.`in`.cbor.CborBuilder
 import co.nstant.`in`.cbor.CborDecoder
 import co.nstant.`in`.cbor.CborEncoder
 import co.nstant.`in`.cbor.builder.ArrayBuilder
-import com.tangem.blockchain.cardano.crypto.Blake2b
+import com.tangem.blockchain.blockchains.cardano.crypto.Blake2b
 import com.tangem.blockchain.common.TransactionData
-import com.tangem.blockchain.common.extensions.decodeBase58
+import com.tangem.blockchain.extensions.decodeBase58
 import java.io.ByteArrayInputStream
 import java.io.ByteArrayOutputStream
 import java.math.BigDecimal
 
-class CardanoTransactionBuilder() {
+class CardanoTransactionBuilder(private val walletPublicKey: ByteArray) {
+
     var unspentOutputs: List = listOf()
-    var transactionBody: ByteArray = ByteArray(0)
+    private var transactionBody: ByteArray = ByteArray(0)
 
     fun buildToSign(transactionData: TransactionData): ByteArray {
         val transactionBuilder = CborBuilder()
@@ -43,8 +44,8 @@ class CardanoTransactionBuilder() {
         return prefixedHashBaos.toByteArray()
     }
 
-    fun buildToSend(signature: ByteArray, publicKey: ByteArray): ByteArray {
-        val extendedPublicKey = CardanoAddressFactory.extendPublicKey(publicKey)
+    fun buildToSend(signature: ByteArray): ByteArray {
+        val extendedPublicKey = CardanoAddressService.extendPublicKey(walletPublicKey)
 
         //pubkey + signature
         val witnessBodyBaos = ByteArrayOutputStream()
@@ -144,7 +145,7 @@ class CardanoTransactionBuilder() {
         return fullAmount - (amount + fee)
     }
 
-    fun getEstimateSize(transactionData: TransactionData, walletPublicKey: ByteArray): Int {
+    fun getEstimateSize(transactionData: TransactionData): Int {
         val dummyFeeValue = BigDecimal.valueOf(0.1)
 
         val dummyFee = transactionData.amount.copy(value = dummyFeeValue)
@@ -156,7 +157,7 @@ class CardanoTransactionBuilder() {
                 fee = dummyFee
         )
         buildToSign(dummyTransactionData)
-        return buildToSend(ByteArray(64), walletPublicKey).size
+        return buildToSend(ByteArray(64)).size
     }
 
     companion object {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoWalletManager.kt
similarity index 56%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoWalletManager.kt
index 86b5f25a51..d63bb787ed 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoWalletManager.kt
@@ -1,30 +1,26 @@
-package com.tangem.blockchain.cardano
+package com.tangem.blockchain.blockchains.cardano
 
 import android.util.Log
-import com.tangem.blockchain.cardano.network.CardanoAddressResponse
-import com.tangem.blockchain.cardano.network.CardanoNetworkManager
+import com.tangem.blockchain.blockchains.cardano.network.CardanoAddressResponse
+import com.tangem.blockchain.blockchains.cardano.network.CardanoNetworkManager
 import com.tangem.blockchain.common.*
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.encodeBase64NoWrap
-import com.tangem.blockchain.wallets.CurrencyWallet
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.encodeBase64NoWrap
 import com.tangem.common.CompletionResult
+import java.math.RoundingMode
 
 class CardanoWalletManager(
-        private val cardId: String,
-        private val walletPublicKey: ByteArray,
-        override var wallet: CurrencyWallet
-) : WalletManager,
-        TransactionSender,
-        FeeProvider {
+        cardId: String,
+        wallet: Wallet,
+        private val transactionBuilder: CardanoTransactionBuilder,
+        private val networkManager: CardanoNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
 
-    override val blockchain = Blockchain.Cardano
-    private val address = blockchain.makeAddress(walletPublicKey)
-    private val transactionBuilder = CardanoTransactionBuilder()
-    private val networkManager = CardanoNetworkManager()
+    private val blockchain = wallet.blockchain
 
     override suspend fun update() {
-        val response = networkManager.getInfo(address)
+        val response = networkManager.getInfo(wallet.address)
         when (response) {
             is Result.Success -> updateWallet(response.data)
             is Result.Failure -> updateError(response.error)
@@ -33,8 +29,8 @@ class CardanoWalletManager(
 
     private fun updateWallet(response: CardanoAddressResponse) {
         Log.d(this::class.java.simpleName, "Balance is ${response.balance.toString()}")
-        wallet.balances[AmountType.Coin]?.value =
-                response.balance.toBigDecimal().movePointLeft(blockchain.decimals.toInt())
+        wallet.amounts[AmountType.Coin]?.value =
+                response.balance.toBigDecimal().movePointLeft(blockchain.decimals())
         transactionBuilder.unspentOutputs = response.unspentOutputs
     }
 
@@ -48,7 +44,7 @@ class CardanoWalletManager(
 
         when (val signerResponse = signer.sign(arrayOf(transactionHash), cardId)) {
             is CompletionResult.Success -> {
-                val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature, walletPublicKey)
+                val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature)
                 return networkManager.sendTransaction(transactionToSend.encodeBase64NoWrap())
             }
             is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
@@ -59,9 +55,9 @@ class CardanoWalletManager(
         val a = 0.155381
         val b = 0.000043946
         val size = transactionBuilder.getEstimateSize(
-                TransactionData(amount, null, address, destination), walletPublicKey
+                TransactionData(amount, null, wallet.address, destination)
         )
-        val fee = (a + b * size).toBigDecimal()
-        return Result.Success(listOf(Amount(blockchain.currency, fee, address, blockchain.decimals)))
+        val fee = (a + b * size).toBigDecimal().setScale(blockchain.decimals(), RoundingMode.UP)
+        return Result.Success(listOf(Amount(amount, fee)))
     }
 }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/crypto/Blake2b.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/crypto/Blake2b.java
similarity index 98%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/crypto/Blake2b.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/crypto/Blake2b.java
index 01358597fd..70059e3e6a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/crypto/Blake2b.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/crypto/Blake2b.java
@@ -17,7 +17,7 @@
    this software. If not, see .
 */
 
-package com.tangem.blockchain.cardano.crypto;
+package com.tangem.blockchain.blockchains.cardano.crypto;
 
 import java.io.PrintStream;
 import java.io.Serializable;
@@ -25,14 +25,14 @@ import java.security.Key;
 import java.security.spec.AlgorithmParameterSpec;
 import java.util.Arrays;
 
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.Assert.assertFail;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.Assert.exclusiveLowerBound;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.Assert.inclusiveLowerBound;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.Assert.inclusiveUpperBound;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.LittleEndian.readInt;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.LittleEndian.readLong;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.LittleEndian.writeInt;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.LittleEndian.writeLong;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.Assert.assertFail;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.Assert.exclusiveLowerBound;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.Assert.inclusiveLowerBound;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.Assert.inclusiveUpperBound;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.LittleEndian.readInt;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.LittleEndian.readLong;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.LittleEndian.writeInt;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.LittleEndian.writeLong;
 
 
 /**  */
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/CardanoNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/CardanoNetworkManager.kt
similarity index 77%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/network/CardanoNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/CardanoNetworkManager.kt
index 1852c6b994..907dd1be92 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/CardanoNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/CardanoNetworkManager.kt
@@ -1,13 +1,13 @@
-package com.tangem.blockchain.cardano.network
+package com.tangem.blockchain.blockchains.cardano.network
 
-import com.tangem.blockchain.cardano.UnspentOutput
-import com.tangem.blockchain.cardano.network.adalite.AdaliteProvider
-import com.tangem.blockchain.cardano.network.api.AdaliteApi
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.network.API_ADALITE
-import com.tangem.blockchain.common.network.API_ADALITE_RESERVE
-import com.tangem.blockchain.common.network.createRetrofitInstance
+import com.tangem.blockchain.blockchains.cardano.UnspentOutput
+import com.tangem.blockchain.blockchains.cardano.network.adalite.AdaliteProvider
+import com.tangem.blockchain.blockchains.cardano.network.api.AdaliteApi
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_ADALITE
+import com.tangem.blockchain.network.API_ADALITE_RESERVE
+import com.tangem.blockchain.network.createRetrofitInstance
 import retrofit2.HttpException
 import java.io.IOException
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt
new file mode 100644
index 0000000000..523a2caab7
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt
@@ -0,0 +1,19 @@
+package com.tangem.blockchain.blockchains.cardano.network.api
+
+import com.tangem.blockchain.blockchains.cardano.network.adalite.AdaliteAddress
+import com.tangem.blockchain.blockchains.cardano.network.adalite.AdaliteSendBody
+import com.tangem.blockchain.blockchains.cardano.network.adalite.AdaliteUnspents
+import retrofit2.http.*
+
+interface AdaliteApi {
+    @GET("/api/addresses/summary/{address}")
+    suspend fun getAddress(@Path("address") address: String): AdaliteAddress
+
+    @Headers("Content-Type: application/json")
+    @POST("/api/bulk/addresses/utxo")
+    suspend fun getUnspents(@Body addresses: List): AdaliteUnspents
+
+    @Headers("Content-Type: application/json")
+    @POST("/api/v2/txs/signed")
+    suspend fun sendTransaction(@Body adaliteBody: AdaliteSendBody): String // List?
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteProvider.kt
similarity index 63%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteProvider.kt
index ec05798ced..972e500ced 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteProvider.kt
@@ -1,11 +1,13 @@
-package com.tangem.blockchain.cardano.network.adalite
+package com.tangem.blockchain.blockchains.cardano.network.adalite
 
-import com.tangem.blockchain.cardano.network.CardanoAddressResponse
-import com.tangem.blockchain.cardano.UnspentOutput
-import com.tangem.blockchain.cardano.network.api.AdaliteApi
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
+import com.squareup.moshi.Json
+import com.tangem.blockchain.blockchains.cardano.UnspentOutput
+import com.tangem.blockchain.blockchains.cardano.network.CardanoAddressResponse
+import com.tangem.blockchain.blockchains.cardano.network.api.AdaliteApi
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
+import com.tangem.common.extensions.hexToBytes
 import kotlinx.coroutines.async
 import kotlinx.coroutines.coroutineScope
 
@@ -15,7 +17,7 @@ class AdaliteProvider(private val api: AdaliteApi) {
         return try {
             coroutineScope {
                 val addressDeferred = retryIO { async { api.getAddress(address) } }
-                val unspentsDeferred = retryIO { async { api.getUnspents(address) } }
+                val unspentsDeferred = retryIO { async { api.getUnspents(listOf(address)) } }
 
                 val addressData = addressDeferred.await()
                 val unspents = unspentsDeferred.await()
@@ -24,7 +26,7 @@ class AdaliteProvider(private val api: AdaliteApi) {
                     UnspentOutput(
                             it.amountData!!.amount!!,
                             it.outputIndex!!.toLong(),
-                            it.hash!!.toByteArray()
+                            it.hash!!.hexToBytes()
                     )
                 }
 
@@ -42,7 +44,7 @@ class AdaliteProvider(private val api: AdaliteApi) {
 
     suspend fun sendTransaction(transaction: String): SimpleResult {
         return try {
-            retryIO { api.sendTransaction(AdaliteSendBody(transaction)) }
+            val response = retryIO { api.sendTransaction(AdaliteSendBody(transaction)) }
             SimpleResult.Success
         } catch (exception: Exception) {
             SimpleResult.Failure(exception)
@@ -50,4 +52,7 @@ class AdaliteProvider(private val api: AdaliteApi) {
     }
 }
 
-data class AdaliteSendBody(val signedTransaction: String)
\ No newline at end of file
+data class AdaliteSendBody(
+        @Json(name = "signedTx")
+        val signedTransaction: String
+)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteResponse.kt
similarity index 91%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteResponse.kt
index 4bc1f86894..3aee35cf62 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteResponse.kt
@@ -1,11 +1,11 @@
-package com.tangem.blockchain.cardano.network.adalite
+package com.tangem.blockchain.blockchains.cardano.network.adalite
 
 import com.squareup.moshi.Json
 import com.squareup.moshi.JsonClass
 
 @JsonClass(generateAdapter = true)
 data class AdaliteAddress(
-        @Json(name = "final_balance")
+        @Json(name = "Right")
         var data: AdaliteAddressData? = null
 )
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt
new file mode 100644
index 0000000000..50b9ab2bd0
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt
@@ -0,0 +1,15 @@
+package com.tangem.blockchain.blockchains.ethereum
+
+import com.tangem.blockchain.common.AddressService
+import org.kethereum.crypto.toAddress
+import org.kethereum.erc55.hasValidERC55ChecksumOrNoChecksum
+import org.kethereum.erc55.withERC55Checksum
+import org.kethereum.model.Address
+import org.kethereum.model.PublicKey
+
+class EthereumAddressService : AddressService {
+    override fun makeAddress(walletPublicKey: ByteArray): String =
+            PublicKey(walletPublicKey.sliceArray(1..64)).toAddress().withERC55Checksum().hex
+
+    override fun validate(address: String): Boolean = Address(address).hasValidERC55ChecksumOrNoChecksum()
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumTransactionBuilder.kt
new file mode 100644
index 0000000000..ead68d974b
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumTransactionBuilder.kt
@@ -0,0 +1,115 @@
+package com.tangem.blockchain.blockchains.ethereum
+
+import com.tangem.blockchain.common.Amount
+import com.tangem.blockchain.common.AmountType
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.common.TransactionData
+import com.tangem.common.extensions.hexToBytes
+import org.kethereum.crypto.api.ec.ECDSASignature
+import org.kethereum.crypto.determineRecId
+import org.kethereum.crypto.impl.ec.canonicalise
+import org.kethereum.extensions.toBytesPadded
+import org.kethereum.extensions.toFixedLengthByteArray
+import org.kethereum.extensions.transactions.encodeRLP
+import org.kethereum.extensions.transactions.tokenTransferSignature
+import org.kethereum.keccakshortcut.keccak
+import org.kethereum.model.*
+import java.math.BigDecimal
+import java.math.BigInteger
+
+class EthereumTransactionBuilder(private val walletPublicKey: ByteArray, blockchain: Blockchain) {
+
+    private val chainId = when (blockchain) {
+        Blockchain.Ethereum -> Chain.Mainnet.id
+        Blockchain.RSK -> Chain.RskMainnet.id
+        else -> throw Exception("${blockchain.fullName} blockchain is not supported by EthereumTransactionBuilder")
+    }
+
+    fun buildToSign(transactionData: TransactionData, nonce: BigInteger?): TransactionToSign? {
+
+        val amount: BigDecimal = transactionData.amount.value ?: return null
+        val transactionFee: BigDecimal = transactionData.fee?.value ?: return null
+
+        val fee = transactionFee.movePointRight(transactionData.fee.decimals).toBigInteger()
+        val gasLimit = getGasLimit(transactionData.amount).value.toBigInteger()
+        val bigIntegerAmount = amount.movePointRight(transactionData.amount.decimals).toBigInteger()
+
+        val to: Address
+        val value: BigInteger
+        val input: ByteArray //data for smart contract
+
+        if (transactionData.amount.type == AmountType.Coin) { //coin transfer
+            to = Address(transactionData.destinationAddress)
+            value = bigIntegerAmount
+            input = ByteArray(0)
+        } else { //token transfer
+            to = Address(transactionData.contractAddress
+                    ?: throw Exception("Contract address is not specified!"))
+            value = BigInteger.ZERO
+            input = createErc20TransferData(transactionData.destinationAddress, bigIntegerAmount)
+        }
+
+        val transaction = createTransactionWithDefaults(
+                from = Address(transactionData.sourceAddress),
+                to = to,
+                value = value,
+                gasPrice = fee.divide(gasLimit),
+                gasLimit = gasLimit,
+                nonce = nonce,
+                input = input
+//                chain = ChainId(chainId.toLong())
+        )
+        val hash = transaction.encodeRLP(SignatureData(v = chainId.toBigInteger())).keccak()
+        return TransactionToSign(transaction, listOf(hash))
+    }
+
+    fun buildToSend(signature: ByteArray, transactionToSign: TransactionToSign): ByteArray {
+        val r = BigInteger(1, signature.copyOfRange(0, 32))
+        val s = BigInteger(1, signature.copyOfRange(32, 64))
+
+        val ecdsaSignature = ECDSASignature(r, s).canonicalise()
+
+        val recId = ecdsaSignature.determineRecId(transactionToSign.hashes[0], PublicKey(walletPublicKey.sliceArray(1..64)))
+        val v = (recId + 27 + 8 + (chainId * 2)).toBigInteger()
+        val signatureData = SignatureData(ecdsaSignature.r, ecdsaSignature.s, v)
+
+        return transactionToSign.transaction.encodeRLP(signatureData)
+    }
+
+    private fun createErc20TransferData(recepient: String, amount: BigInteger): ByteArray {
+        return tokenTransferSignature.toByteArray() +
+                recepient.substring(2).hexToBytes().toFixedLengthByteArray(32) +
+                amount.toBytesPadded(32)
+    }
+}
+
+class TransactionToSign(val transaction: Transaction, val hashes: List)
+
+enum class GasLimit(val value: Long) {
+    Default(21000),
+    Token(60000),
+    High(300000)
+}
+
+internal fun getGasLimit(amount: Amount): GasLimit {
+    return when (amount.currencySymbol) {
+        Blockchain.Ethereum.currency -> GasLimit.Default
+        "DGX" -> GasLimit.High
+        "CGT" -> GasLimit.High
+        else -> GasLimit.Token
+    }
+}
+
+enum class Chain(val id: Int) {
+    Mainnet(1),
+    Morden(2),
+    Ropsten(3),
+    Rinkeby(4),
+    RskMainnet(30),
+    RskTestnet(31),
+    Kovan(42),
+    EthereumClassicMainnet(61),
+    EthereumClassicTestnet(62),
+    Geth_private_chains(1337),
+    MaticTestnet(8995);
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt
new file mode 100644
index 0000000000..5ac19d6370
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt
@@ -0,0 +1,74 @@
+package com.tangem.blockchain.blockchains.ethereum
+
+import android.util.Log
+import com.tangem.blockchain.blockchains.ethereum.network.EthereumNetworkManager
+import com.tangem.blockchain.blockchains.ethereum.network.EthereumInfoResponse
+import com.tangem.blockchain.common.*
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.common.CompletionResult
+import com.tangem.common.extensions.toHexString
+import java.math.BigDecimal
+
+class EthereumWalletManager(
+        cardId: String,
+        wallet: Wallet,
+        private val transactionBuilder: EthereumTransactionBuilder,
+        private val networkManager: EthereumNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
+
+    private val blockchain = wallet.blockchain
+
+    private var pendingTxCount = -1L
+    private var txCount = -1L
+
+    override suspend fun update() {
+
+        val result = networkManager.getInfo(wallet.address, wallet.amounts[AmountType.Token]?.address)
+        when (result) {
+            is Result.Failure -> updateError(result.error)
+            is Result.Success -> updateWallet(result.data)
+        }
+    }
+
+    private fun updateWallet(data: EthereumInfoResponse) {
+        wallet.amounts[AmountType.Coin]?.value = data.balance
+        wallet.amounts[AmountType.Token]?.value = data.tokenBalance
+        txCount = data.txCount
+        pendingTxCount = data.pendingTxCount
+        if (txCount == pendingTxCount) {
+            wallet.transactions.forEach { it.status = TransactionStatus.Confirmed }
+        } else if (wallet.transactions.isEmpty()) {
+            wallet.addIncomingTransaction()
+        }
+    }
+
+    private fun updateError(error: Throwable?) {
+        Log.e(this::class.java.simpleName, error?.message ?: "")
+        if (error != null) throw error
+    }
+
+    override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
+        val transactionToSign = transactionBuilder.buildToSign(transactionData, txCount.toBigInteger())
+                ?: return SimpleResult.Failure(Exception("Not enough data"))
+        when (val signerResponse = signer.sign(transactionToSign.hashes.toTypedArray(), cardId)) {
+            is CompletionResult.Success -> {
+                val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature, transactionToSign)
+                return networkManager.sendTransaction(String.format("0x%s", transactionToSend.toHexString()))
+            }
+            is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
+        }
+    }
+
+    override suspend fun getFee(amount: Amount, destination: String): Result> {
+        val result = networkManager.getFee(getGasLimit(amount).value)
+        when (result) {
+            is Result.Success -> {
+                val feeValues: List = result.data
+                return Result.Success(
+                        feeValues.map { feeValue -> Amount(wallet.amounts[AmountType.Coin]!!, feeValue) })
+            }
+            is Result.Failure -> return result
+        }
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumApi.kt
similarity index 68%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumApi.kt
index df84fae5ad..0b0030a779 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumApi.kt
@@ -1,18 +1,19 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
 
 import com.squareup.moshi.JsonClass
 import retrofit2.http.Body
 import retrofit2.http.Headers
 import retrofit2.http.POST
+import retrofit2.http.Path
 
-interface InfuraApi {
+interface EthereumApi {
     @Headers("Content-Type: application/json")
-    @POST("v3/613a0b14833145968b1f656240c7d245")
-    suspend fun postToInfura(@Body body: InfuraBody?): InfuraResponse
+    @POST("{apiKey}")
+    suspend fun post(@Body body: EthereumBody?, @Path("apiKey") apiKey: String): EthereumResponse
 }
 
 @JsonClass(generateAdapter = true)
-data class InfuraBody(
+data class EthereumBody(
         val jsonrpc: String = "2.0",
         val id: Int = 67,
         val method: String? = null,
@@ -21,7 +22,7 @@ data class InfuraBody(
 
 data class EthCallParams(private val data: String, private val to: String)
 
-enum class InfuraMethod(val value: String) {
+enum class EthereumMethod(val value: String) {
     GET_BALANCE("eth_getBalance"),
     GET_TRANSACTION_COUNT("eth_getTransactionCount"),
     GET_PENDING_COUNT("eth_getPendingCount"),
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
similarity index 62%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
index b7318ba032..0fd3078d40 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
@@ -1,26 +1,40 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
 
 import com.tangem.blockchain.common.Blockchain
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
-import com.tangem.blockchain.common.network.API_INFURA
-import com.tangem.blockchain.common.network.createRetrofitInstance
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
+import com.tangem.blockchain.network.API_INFURA
+import com.tangem.blockchain.network.API_RSK
+import com.tangem.blockchain.network.createRetrofitInstance
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.async
 import kotlinx.coroutines.coroutineScope
 import org.kethereum.ETH_IN_WEI
 import java.math.BigDecimal
 import java.math.BigInteger
+import java.math.RoundingMode
 
 
-class EthereumNetworkManager {
+class EthereumNetworkManager(blockchain: Blockchain) {
+    private val infuraPath = "v3/"
 
-    private val api: InfuraApi by lazy {
-        createRetrofitInstance(API_INFURA).create(InfuraApi::class.java)
+    private val api: EthereumApi by lazy {
+        val baseUrl = when (blockchain) {
+            Blockchain.Ethereum -> API_INFURA + infuraPath
+            Blockchain.RSK -> API_RSK
+            else -> throw Exception("${blockchain.fullName} blockchain is not supported by EthereumNetworkManager")
+        }
+        createRetrofitInstance(baseUrl).create(EthereumApi::class.java)
     }
 
-    private val provider: InfuraProvider by lazy { InfuraProvider(api) }
+    private val apiKey = when (blockchain) {
+        Blockchain.Ethereum -> INFURA_API_KEY
+        Blockchain.RSK -> ""
+        else -> throw Exception("${blockchain.fullName} blockchain is not supported by EthereumNetworkManager")
+    }
+
+    private val provider: EthereumProvider by lazy { EthereumProvider(api, apiKey) }
 
     suspend fun sendTransaction(transaction: String): SimpleResult {
         return try {
@@ -45,17 +59,17 @@ class EthereumNetworkManager {
         }
     }
 
-    suspend fun getInfo(address: String, contractAddress: String? = null): Result {
+    suspend fun getInfo(address: String, contractAddress: String? = null): Result {
         return try {
             coroutineScope {
                 val balanceResponse = retryIO { async { provider.getBalance(address) } }
                 val txCountResponse = retryIO { async { provider.getTxCount(address) } }
                 val pendingTxCountResponse = retryIO { async { provider.getPendingTxCount(address) } }
-                var tokenBalanceResponse: Deferred? = null
+                var tokenBalanceResponse: Deferred? = null
                 if (contractAddress != null) {
                     tokenBalanceResponse = retryIO { async { provider.getTokenBalance(address, contractAddress) } }
                 }
-                Result.Success(EthereumResponse(
+                Result.Success(EthereumInfoResponse(
                         balanceResponse.await().result!!.parseAmount(),
                         tokenBalanceResponse?.await()?.result?.parseAmount(),
                         txCountResponse.await().result?.responseToNumber()?.toLong() ?: 0,
@@ -70,8 +84,8 @@ class EthereumNetworkManager {
     private fun String.parseFee(gasLimit: Long): List {
         val gasPrice = this.responseToNumber().toBigDecimal()
         val minFee = gasPrice.multiply(gasLimit.toBigDecimal())
-        val normalFee = minFee.multiply(BigDecimal(1.2))
-        val priorityFee = minFee.multiply(BigDecimal(1.5))
+        val normalFee = minFee.multiply(BigDecimal(1.2)).setScale(0, RoundingMode.HALF_UP)
+        val priorityFee = minFee.multiply(BigDecimal(1.5)).setScale(0, RoundingMode.HALF_UP)
         return listOf(
                 minFee.convertFeeToEth(),
                 normalFee.convertFeeToEth(),
@@ -86,14 +100,16 @@ class EthereumNetworkManager {
 
     private fun BigDecimal.convertFeeToEth(): BigDecimal {
         return this.divide(ETH_IN_WEI.toBigDecimal())
-                .setScale(12, Blockchain.Ethereum.roundingMode()).stripTrailingZeros()
+                .setScale(12, BigDecimal.ROUND_DOWN).stripTrailingZeros()
     }
 
 }
 
-data class EthereumResponse(
+data class EthereumInfoResponse(
         val balance: BigDecimal,
         val tokenBalance: BigDecimal?,
         val txCount: Long,
         val pendingTxCount: Long
-)
\ No newline at end of file
+)
+
+private const val INFURA_API_KEY = "613a0b14833145968b1f656240c7d245"
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumProvider.kt
new file mode 100644
index 0000000000..c320f566b6
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumProvider.kt
@@ -0,0 +1,39 @@
+package com.tangem.blockchain.blockchains.ethereum.network
+
+class EthereumProvider(private val api: EthereumApi, private val apiKey: String) {
+    suspend fun getBalance(address: String) = api.post(createEthereumBody(EthereumMethod.GET_BALANCE, address), apiKey)
+    suspend fun getTokenBalance(address: String, contractAddress: String) = api.post(createEthereumBody(EthereumMethod.CALL, address, contractAddress), apiKey)
+    suspend fun getTxCount(address: String) = api.post(createEthereumBody(EthereumMethod.GET_TRANSACTION_COUNT, address), apiKey)
+    suspend fun getPendingTxCount(address: String) = api.post(createEthereumBody(EthereumMethod.GET_PENDING_COUNT, address), apiKey)
+    suspend fun getGasPrice() = api.post(createEthereumBody(EthereumMethod.GAS_PRICE), apiKey)
+    suspend fun sendTransaction(transaction: String) = api.post(createEthereumBody(EthereumMethod.SEND_RAW_TRANSACTION, transaction = transaction), apiKey)
+}
+
+private fun createEthereumBody(
+        method: EthereumMethod,
+        address: String? = null,
+        contractAddress: String? = null,
+        transaction: String? = null): EthereumBody {
+
+    return when (method) {
+        EthereumMethod.GET_BALANCE ->
+            EthereumBody(method = EthereumMethod.GET_BALANCE.value, params = listOf(address ?: "", "latest"))
+        EthereumMethod.GET_TRANSACTION_COUNT ->
+            EthereumBody(method = EthereumMethod.GET_TRANSACTION_COUNT.value, params = listOf(address ?: "", "latest"))
+        EthereumMethod.GET_PENDING_COUNT ->
+            EthereumBody(method = EthereumMethod.GET_TRANSACTION_COUNT.value, params = listOf(address ?: "", "pending"))
+        EthereumMethod.GAS_PRICE ->
+            EthereumBody(method = EthereumMethod.GAS_PRICE.value)
+        EthereumMethod.SEND_RAW_TRANSACTION ->
+            EthereumBody(method = EthereumMethod.SEND_RAW_TRANSACTION.value, params = listOf(transaction ?: ""))
+        EthereumMethod.CALL -> {
+            EthereumBody(
+                    method = EthereumMethod.CALL.value,
+                    params = listOf(EthCallParams(
+                            "0x70a08231000000000000000000000000" + address?.substring(2), contractAddress
+                            ?: ""),
+                            "latest"
+                    ))
+        }
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumResponse.kt
similarity index 76%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumResponse.kt
index 6e193290b5..3e8da36c84 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumResponse.kt
@@ -1,10 +1,10 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
 
 import com.squareup.moshi.Json
 import com.squareup.moshi.JsonClass
 
 @JsonClass(generateAdapter = true)
-data class InfuraResponse(
+data class EthereumResponse(
         @Json(name = "jsonrpc")
         val jsonrpc: String = "",
 
@@ -15,11 +15,11 @@ data class InfuraResponse(
         val result: String? = null,
 
         @Json(name = "error")
-        val error: InfuraError? = null
+        val error: EthereumError? = null
 )
 
 @JsonClass(generateAdapter = true)
-data class InfuraError(
+data class EthereumError(
         @Json(name = "code")
         val code: Int? = null,
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt
new file mode 100644
index 0000000000..4728c0cda6
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt
@@ -0,0 +1,19 @@
+package com.tangem.blockchain.blockchains.stellar
+
+import com.tangem.blockchain.common.AddressService
+import org.stellar.sdk.KeyPair
+
+class StellarAddressService: AddressService {
+    override fun makeAddress(walletPublicKey: ByteArray): String {
+        val kp = KeyPair.fromPublicKey(walletPublicKey)
+        return kp.accountId
+    }
+
+    override fun validate(address: String): Boolean {
+        return try {
+            KeyPair.fromAccountId(address) != null
+        } catch (exception: IllegalArgumentException) {
+            false
+        }
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarNetworkManager.kt
similarity index 90%
rename from blockchain/src/main/java/com/tangem/blockchain/stellar/StellarNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarNetworkManager.kt
index 85e5cfbd04..ec6ee2cfd8 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarNetworkManager.kt
@@ -1,10 +1,10 @@
-package com.tangem.blockchain.stellar
+package com.tangem.blockchain.blockchains.stellar
 
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.network.API_STELLAR
-import com.tangem.blockchain.common.network.API_STELLAR_TESTNET
-import com.tangem.blockchain.stellar.StellarWalletManager.Companion.STROOPS_IN_XLM
+import com.tangem.blockchain.blockchains.stellar.StellarWalletManager.Companion.STROOPS_IN_XLM
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_STELLAR
+import com.tangem.blockchain.network.API_STELLAR_TESTNET
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.async
 import kotlinx.coroutines.coroutineScope
@@ -15,7 +15,7 @@ import org.stellar.sdk.requests.ErrorResponse
 import java.io.IOException
 import java.math.BigDecimal
 
-class StellarNetworkManager(isTestNet: Boolean) {
+class StellarNetworkManager(isTestNet: Boolean = false) {
 
     val network: Network = if (isTestNet) Network.TESTNET else Network.PUBLIC
     private val stellarServer by lazy {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarTransactionBuilder.kt
similarity index 88%
rename from blockchain/src/main/java/com/tangem/blockchain/stellar/StellarTransactionBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarTransactionBuilder.kt
index ebe47c630e..e5550fe188 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarTransactionBuilder.kt
@@ -1,10 +1,7 @@
-package com.tangem.blockchain.stellar
+package com.tangem.blockchain.blockchains.stellar
 
 import com.tangem.blockchain.common.AmountType
 import com.tangem.blockchain.common.TransactionData
-import com.tangem.blockchain.stellar.StellarWalletManager.Companion.BASE_FEE
-import com.tangem.blockchain.stellar.StellarWalletManager.Companion.STROOPS_IN_XLM
-import com.tangem.common.extensions.hexToBytes
 import org.stellar.sdk.*
 import org.stellar.sdk.xdr.AccountID
 import org.stellar.sdk.xdr.DecoratedSignature
@@ -12,7 +9,7 @@ import org.stellar.sdk.xdr.Signature
 import org.stellar.sdk.xdr.SignatureHint
 import java.util.*
 
-class StellarTransactionBuilder(private val newtorkManager: StellarNetworkManager, private val publicKey: ByteArray) {
+class StellarTransactionBuilder(private val networkManager: StellarNetworkManager, private val publicKey: ByteArray) {
 
     private lateinit var transaction: Transaction
 
@@ -22,7 +19,7 @@ class StellarTransactionBuilder(private val newtorkManager: StellarNetworkManage
         val sourceKeyPair = KeyPair.fromAccountId(transactionData.sourceAddress)
 
         if (transactionData.amount.type == AmountType.Coin) {
-            val operation = if (newtorkManager.checkIsAccountCreated(transactionData.sourceAddress)) {
+            val operation = if (networkManager.checkIsAccountCreated(transactionData.sourceAddress)) {
                 PaymentOperation.Builder(destinationKeyPair.accountId,
                         AssetTypeNative(),
                         transactionData.amount.value.toString())
@@ -64,7 +61,7 @@ class StellarTransactionBuilder(private val newtorkManager: StellarNetworkManage
         val maxTime = currentTime + 120
 
         transaction = Transaction.Builder(
-                Account(sourceKeyPair.accountId, sequence), newtorkManager.network)
+                Account(sourceKeyPair.accountId, sequence), networkManager.network)
                 .addOperation(operation)
                 .addTimeBounds(TimeBounds(minTime, maxTime))
                 .setOperationFee(fee)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarWalletManager.kt
similarity index 60%
rename from blockchain/src/main/java/com/tangem/blockchain/stellar/StellarWalletManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarWalletManager.kt
index 754cf7fa60..fc53c55460 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarWalletManager.kt
@@ -1,33 +1,28 @@
-package com.tangem.blockchain.stellar
+package com.tangem.blockchain.blockchains.stellar
 
 import android.util.Log
 import com.tangem.blockchain.common.*
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.wallets.CurrencyWallet
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
 import com.tangem.common.CompletionResult
 import java.math.BigDecimal
 import java.util.*
 
 class StellarWalletManager(
-        private val cardId: String,
-        walletPublicKey: ByteArray,
-        override var wallet: CurrencyWallet,
-        isTestNet: Boolean = false
-) : WalletManager,
-        TransactionSender,
-        FeeProvider {
+        cardId: String,
+        wallet: Wallet,
+        private val transactionBuilder: StellarTransactionBuilder,
+        private val networkManager: StellarNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
+
+    private val blockchain = wallet.blockchain
 
-    override val blockchain: Blockchain = Blockchain.Stellar
-    private val address = blockchain.makeAddress(walletPublicKey)
-    private val networkManager = StellarNetworkManager(isTestNet)
-    private val builder = StellarTransactionBuilder(networkManager, walletPublicKey)
     private var baseFee = BASE_FEE
     private var baseReserve = BASE_RESERVE
     private var sequence = 0L
 
     override suspend fun update() {
-        val result = networkManager.getInfo(address, wallet.balances[AmountType.Token]?.address)
+        val result = networkManager.getInfo(wallet.address, wallet.amounts[AmountType.Token]?.address)
         when (result) {
             is Result.Failure -> updateError(result.error)
             is Result.Success -> updateWallet(result.data)
@@ -35,15 +30,15 @@ class StellarWalletManager(
     }
 
     private fun updateWallet(data: StellarResponse) {
-        wallet.balances[AmountType.Coin]?.value = data.balance
-        wallet.balances[AmountType.Token]?.value = data.assetBalance
-        wallet.balances[AmountType.Reserve]?.value = data.baseReserve
+        wallet.amounts[AmountType.Coin]?.value = data.balance
+        wallet.amounts[AmountType.Token]?.value = data.assetBalance
+        wallet.amounts[AmountType.Reserve]?.value = data.baseReserve
         sequence = data.sequence
         baseFee = data.baseFee
         baseReserve = data.baseReserve
 
         val currentTime = Calendar.getInstance().timeInMillis
-        wallet.pendingTransactions.forEach { transaction ->
+        wallet.transactions.forEach { transaction ->
             if (transaction.date?.timeInMillis ?: 0 - currentTime > 10) {
                 transaction.status = TransactionStatus.Confirmed
             }
@@ -56,10 +51,10 @@ class StellarWalletManager(
     }
 
     override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
-        val hashes = builder.buildToSign(transactionData, sequence, baseFee.toStroops())
+        val hashes = transactionBuilder.buildToSign(transactionData, sequence, baseFee.toStroops())
         when (val signerResponse = signer.sign(hashes.toTypedArray(), cardId)) {
             is CompletionResult.Success -> {
-                val transactionToSend = builder.buildToSend(signerResponse.data.signature)
+                val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature)
                 return networkManager.sendTransaction(transactionToSend)
             }
             is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt
new file mode 100644
index 0000000000..9c0b49c23a
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt
@@ -0,0 +1,35 @@
+package com.tangem.blockchain.blockchains.xrp
+
+import com.ripple.encodings.addresses.Addresses
+import com.tangem.blockchain.common.AddressService
+import com.tangem.common.extensions.calculateRipemd160
+import com.tangem.common.extensions.calculateSha256
+import com.tangem.common.extensions.toCompressedPublicKey
+
+class XrpAddressService : AddressService {
+    override fun makeAddress(walletPublicKey: ByteArray): String {
+        val canonicalPublicKey = canonizePublicKey(walletPublicKey)
+        val publicKeyHash = canonicalPublicKey.calculateSha256().calculateRipemd160()
+        return Addresses.encodeAccountID(publicKeyHash)
+    }
+
+    override fun validate(address: String): Boolean {
+        return try {
+            Addresses.decodeAccountID(address)
+            address.startsWith("r")
+        } catch (excpetion: Exception) {
+            false
+        }
+    }
+
+    companion object {
+        fun canonizePublicKey(publicKey: ByteArray): ByteArray {
+            val compressedPublicKey = publicKey.toCompressedPublicKey()
+            return if (compressedPublicKey.size == 32) {
+                byteArrayOf(0xED.toByte()) + compressedPublicKey
+            } else {
+                compressedPublicKey
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpTransactionBuilder.kt
similarity index 86%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/XrpTransactionBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpTransactionBuilder.kt
index a91258d524..1906d38fb1 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpTransactionBuilder.kt
@@ -1,20 +1,21 @@
-package com.tangem.blockchain.xrp
+package com.tangem.blockchain.blockchains.xrp
 
 import com.ripple.core.coretypes.AccountID
 import com.ripple.core.coretypes.Amount
 import com.ripple.core.coretypes.uint.UInt32
 import com.ripple.crypto.ecdsa.ECDSASignature
 import com.ripple.utils.HashUtils
+import com.tangem.blockchain.blockchains.xrp.override.XrpPayment
+import com.tangem.blockchain.blockchains.xrp.override.XrpSignedTransaction
 import com.tangem.blockchain.common.TransactionData
-import com.tangem.blockchain.common.extensions.bigIntegerValue
-import com.tangem.blockchain.xrp.override.XrpPayment
-import com.tangem.blockchain.xrp.override.XrpSignedTransaction
+import com.tangem.blockchain.extensions.bigIntegerValue
 import org.bitcoinj.core.ECKey
 import java.math.BigInteger
 
 class XrpTransactionBuilder(walletPublicKey: ByteArray) {
-    private val canonicalPublicKey = XrpAddressFactory.canonizePublicKey(walletPublicKey)
     var sequence: Long? = null
+
+    private val canonicalPublicKey = XrpAddressService.canonizePublicKey(walletPublicKey)
     private var transaction: XrpSignedTransaction? = null
 
     fun buildToSign(transactionData: TransactionData): ByteArray {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpWalletManager.kt
similarity index 56%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpWalletManager.kt
index cf6c8206a8..4301da80ad 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpWalletManager.kt
@@ -1,34 +1,24 @@
-package com.tangem.blockchain.xrp
+package com.tangem.blockchain.blockchains.xrp
 
 import android.util.Log
+import com.tangem.blockchain.blockchains.xrp.network.XrpInfoResponse
+import com.tangem.blockchain.blockchains.xrp.network.XrpNetworkManager
 import com.tangem.blockchain.common.*
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.wallets.CurrencyWallet
-import com.tangem.blockchain.xrp.network.XrpInfoResponse
-import com.tangem.blockchain.xrp.network.XrpNetworkManager
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
 import com.tangem.common.CompletionResult
 
 class XrpWalletManager(
-        private val cardId: String,
-        private val walletPublicKey: ByteArray,
-        override var wallet: CurrencyWallet
-) : WalletManager,
-        TransactionSender,
-        FeeProvider {
+        cardId: String,
+        wallet: Wallet,
+        private val transactionBuilder: XrpTransactionBuilder,
+        private val networkManager: XrpNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
 
-    override val blockchain = Blockchain.XRP
-    private val address = blockchain.makeAddress(walletPublicKey)
-    private val transactionBuilder = XrpTransactionBuilder(walletPublicKey)
-    private val networkManager = XrpNetworkManager()
-
-    init {
-        wallet.balances[AmountType.Coin] = Amount(null, blockchain)
-        wallet.balances[AmountType.Reserve] = Amount(null, blockchain, type = AmountType.Reserve)
-    }
+    private val blockchain = wallet.blockchain
 
     override suspend fun update() {
-        val result = networkManager.getInfo(address)
+        val result = networkManager.getInfo(wallet.address)
         when (result) {
             is Result.Success -> updateWallet(result.data)
             is Result.Failure -> updateError(result.error)
@@ -37,25 +27,19 @@ class XrpWalletManager(
 
     private fun updateWallet(response: XrpInfoResponse) {
         Log.d(this::class.java.simpleName, "Balance is ${response.balance}")
-        wallet.balances[AmountType.Reserve]?.value = response.reserveBase
+        wallet.amounts[AmountType.Reserve]?.value = response.reserveBase
 
         if (!response.accountFound) {
             updateError(Exception("Account not found")) //TODO rework, add reserve
             return
         }
-        wallet.balances[AmountType.Coin]?.value = response.balance - response.reserveBase
+        wallet.amounts[AmountType.Coin]?.value = response.balance - response.reserveBase
         transactionBuilder.sequence = response.sequence
 
         if (response.hasUnconfirmed) {
-            if (wallet.pendingTransactions.isEmpty()) {
-                wallet.pendingTransactions.add(TransactionData(
-                        Amount(blockchain.currency, decimals = blockchain.decimals),
-                        null,
-                        "unknown",
-                        wallet.address))
-            }
+            if (wallet.transactions.isEmpty()) wallet.addIncomingTransaction()
         } else {
-            wallet.pendingTransactions.clear()
+            wallet.transactions.clear()
         }
     }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/XrpNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/XrpNetworkManager.kt
similarity index 84%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/network/XrpNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/XrpNetworkManager.kt
index 8066fe1bea..7191b98d53 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/XrpNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/XrpNetworkManager.kt
@@ -1,12 +1,12 @@
-package com.tangem.blockchain.xrp.network
+package com.tangem.blockchain.blockchains.xrp.network
 
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.network.API_RIPPLED
-import com.tangem.blockchain.common.network.API_RIPPLED_RESERVE
-import com.tangem.blockchain.common.network.createRetrofitInstance
-import com.tangem.blockchain.xrp.network.rippled.RippledApi
-import com.tangem.blockchain.xrp.network.rippled.RippledProvider
+import com.tangem.blockchain.blockchains.xrp.network.rippled.RippledApi
+import com.tangem.blockchain.blockchains.xrp.network.rippled.RippledProvider
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_RIPPLED
+import com.tangem.blockchain.network.API_RIPPLED_RESERVE
+import com.tangem.blockchain.network.createRetrofitInstance
 import retrofit2.HttpException
 import java.io.IOException
 import java.math.BigDecimal
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledApi.kt
similarity index 94%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledApi.kt
index e881830e69..bf4fbef679 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledApi.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.network.rippled
+package com.tangem.blockchain.blockchains.xrp.network.rippled
 
 import retrofit2.http.Body
 import retrofit2.http.Headers
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledProvider.kt
similarity index 90%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledProvider.kt
index 73e67cd19c..bfceb241ca 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledProvider.kt
@@ -1,16 +1,16 @@
-package com.tangem.blockchain.xrp.network.rippled
+package com.tangem.blockchain.blockchains.xrp.network.rippled
 
+import com.tangem.blockchain.blockchains.xrp.network.XrpFeeResponse
+import com.tangem.blockchain.blockchains.xrp.network.XrpInfoResponse
 import com.tangem.blockchain.common.Blockchain
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
-import com.tangem.blockchain.xrp.network.XrpFeeResponse
-import com.tangem.blockchain.xrp.network.XrpInfoResponse
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
 import kotlinx.coroutines.async
 import kotlinx.coroutines.coroutineScope
 
 class RippledProvider(private val api: RippledApi) {
-    private val decimals = Blockchain.XRP.decimals.toInt()
+    private val decimals = Blockchain.XRP.decimals()
 
     suspend fun getInfo(address: String): Result {
         return try {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledResponse.kt
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledResponse.kt
index 47d91f3634..c8137a6cd5 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledResponse.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.network.rippled
+package com.tangem.blockchain.blockchains.xrp.network.rippled
 
 import com.squareup.moshi.Json
 import com.squareup.moshi.JsonClass
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpBase58.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpBase58.java
similarity index 98%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpBase58.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpBase58.java
index 3ab3f6f16a..24c47219bf 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpBase58.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpBase58.java
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.override;
+package com.tangem.blockchain.blockchains.xrp.override;
 
 import java.math.BigInteger;
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpPayment.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpPayment.java
similarity index 85%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpPayment.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpPayment.java
index 1fa01213a5..d00d8184bd 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpPayment.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpPayment.java
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.override;
+package com.tangem.blockchain.blockchains.xrp.override;
 
 
 import com.ripple.core.types.known.tx.txns.Payment;
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpSignedTransaction.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpSignedTransaction.java
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpSignedTransaction.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpSignedTransaction.java
index 926a176adb..a455b853fa 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpSignedTransaction.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpSignedTransaction.java
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.override;
+package com.tangem.blockchain.blockchains.xrp.override;
 
 import com.ripple.core.coretypes.Amount;
 import com.ripple.core.coretypes.Blob;
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt
deleted file mode 100644
index 3aecd18ff1..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.tangem.blockchain.cardano
-
-import co.nstant.`in`.cbor.CborBuilder
-import co.nstant.`in`.cbor.CborDecoder
-import co.nstant.`in`.cbor.CborEncoder
-import co.nstant.`in`.cbor.model.Array
-import co.nstant.`in`.cbor.model.ByteString
-import co.nstant.`in`.cbor.model.UnsignedInteger
-import com.tangem.blockchain.cardano.crypto.Blake2b
-import com.tangem.blockchain.common.extensions.decodeBase58
-import com.tangem.blockchain.common.extensions.encodeBase58
-import org.spongycastle.crypto.util.DigestFactory
-import java.io.ByteArrayInputStream
-import java.io.ByteArrayOutputStream
-import java.util.zip.CRC32
-
-class CardanoAddressFactory {
-    companion object {
-        fun makeAddress(cardPublicKey: ByteArray, testNet: Boolean = false): String {
-            val extendedPublicKey = extendPublicKey(cardPublicKey)
-
-            val pubKeyWithAttributesBaos = ByteArrayOutputStream()
-            CborEncoder(pubKeyWithAttributesBaos).encode(CborBuilder()
-                    .addArray()
-                        .add(0)
-                            .addArray()
-                                .add(0)
-                                .add(extendedPublicKey)
-                            .end()
-                        .addMap()
-                        .end()
-                    .end()
-                    .build())
-            val pubKeyWithAttributes = pubKeyWithAttributesBaos.toByteArray()
-
-            val sha3Digest = DigestFactory.createSHA3_256()
-            sha3Digest.update(pubKeyWithAttributes, 0, pubKeyWithAttributes.size)
-            val sha3Hash = ByteArray(32)
-            sha3Digest.doFinal(sha3Hash, 0)
-
-            val blake2b = Blake2b.Digest.newInstance(28)
-            val blakeHash = blake2b.digest(sha3Hash)
-
-            val hashWithAttributesBaos = ByteArrayOutputStream()
-            CborEncoder(hashWithAttributesBaos).encode(CborBuilder()
-                    .addArray()
-                        .add(blakeHash)
-                        .addMap() //additional attributes
-                        .end()
-                        .add(0) //address type
-                    .end()
-                    .build())
-            val hashWithAttributes = hashWithAttributesBaos.toByteArray()
-
-            val crc32 = CRC32()
-            crc32.update(hashWithAttributes)
-            val checksum = crc32.value
-
-            val addressItem = CborBuilder().add(hashWithAttributes).build().get(0)
-            addressItem.setTag(24)
-
-            //addr + checksum
-            val addressBaos = ByteArrayOutputStream()
-            CborEncoder(addressBaos).encode(CborBuilder()
-                    .addArray()
-                        .add(addressItem)
-                        .add(checksum)
-                    .end()
-                    .build())
-
-            val hexAddress = addressBaos.toByteArray()
-            return hexAddress.encodeBase58()
-        }
-
-        fun extendPublicKey(publicKey: ByteArray): ByteArray {
-            val zeroBytes = ByteArray(32)
-            zeroBytes.fill(0)
-            return publicKey + zeroBytes
-        }
-    }
-}
-
-class CardanoAddressValidator {
-    companion object {
-        fun validate(address: String): Boolean {
-            val decoded = address.decodeBase58() ?: return false
-
-            return try {
-                val bais = ByteArrayInputStream(decoded)
-                val addressList =
-                        (CborDecoder(bais).decode()[0] as Array).dataItems
-                val addressItemBytes = (addressList[0] as ByteString).bytes
-                val checksum = (addressList[1] as UnsignedInteger).value.toLong()
-
-                val crc32 = CRC32()
-                crc32.update(addressItemBytes)
-                val calculatedChecksum = crc32.value
-
-                checksum == calculatedChecksum
-            } catch (e: Exception) {
-                false
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteApi.kt b/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteApi.kt
deleted file mode 100644
index e394d424f6..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteApi.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.tangem.blockchain.cardano.network.api
-
-import com.tangem.blockchain.cardano.network.adalite.AdaliteAddress
-import com.tangem.blockchain.cardano.network.adalite.AdaliteSendBody
-import com.tangem.blockchain.cardano.network.adalite.AdaliteUnspents
-import retrofit2.http.*
-import shadow.okhttp3.ResponseBody
-
-interface AdaliteApi {
-    @GET("/api/addresses/summary/{address}")
-    suspend fun getAddress(@Path("address") address: String): AdaliteAddress
-
-    @Headers("Content-Type: application/json")
-    @POST("/api/bulk/addresses/utxo")
-    suspend fun getUnspents(@Body address: String): AdaliteUnspents
-
-    @Headers("Content-Type: application/json")
-    @POST("/api/v2/txs/signed")
-    suspend fun sendTransaction(@Body adaliteBody: AdaliteSendBody): ResponseBody // List?
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/AddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/common/AddressService.kt
new file mode 100644
index 0000000000..2e408eaee2
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/AddressService.kt
@@ -0,0 +1,6 @@
+package com.tangem.blockchain.common
+
+interface AddressService {
+    fun makeAddress(walletPublicKey: ByteArray): String
+    fun validate(address: String): Boolean
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt
new file mode 100644
index 0000000000..bf30907a9e
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt
@@ -0,0 +1,26 @@
+package com.tangem.blockchain.common
+
+import java.math.BigDecimal
+
+data class Amount(
+        val currencySymbol: String,
+        var value: BigDecimal? = null,
+        val address: String? = null,
+        val decimals: Int,
+        val type: AmountType = AmountType.Coin
+) {
+    constructor(
+            value: BigDecimal?,
+            blockchain: Blockchain,
+            address: String? = null,
+            type: AmountType = AmountType.Coin
+    ) : this(blockchain.currency, value, address, blockchain.decimals(), type)
+
+    constructor(token: Token, value: BigDecimal? = null) :
+            this(token.symbol, value, token.contractAddress, token.decimals, AmountType.Token)
+
+    constructor(amount: Amount, value: BigDecimal) :
+            this(amount.currencySymbol, value, amount.address, amount.decimals, amount.type)
+}
+
+enum class AmountType { Coin, Token, Reserve }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
index 5d98bdceef..c579c2d3db 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
@@ -1,74 +1,87 @@
 package com.tangem.blockchain.common
 
-import com.tangem.blockchain.binance.BinanceAddressFactory
-import com.tangem.blockchain.binance.BinanceAddressValidator
-import com.tangem.blockchain.bitcoin.BitcoinAddressFactory
-import com.tangem.blockchain.bitcoin.BitcoinAddressValidator
-import com.tangem.blockchain.cardano.CardanoAddressFactory
-import com.tangem.blockchain.cardano.CardanoAddressValidator
-import com.tangem.blockchain.ethereum.EthereumAddressFactory
-import com.tangem.blockchain.ethereum.EthereumAddressValidator
-
-import com.tangem.blockchain.stellar.StellarAddressFactory
-import com.tangem.blockchain.xrp.XrpAddressFactory
-import com.tangem.blockchain.xrp.XrpAddressValidator
-
-import java.math.BigDecimal
+import com.tangem.blockchain.blockchains.binance.BinanceAddressService
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinAddressService
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashAddressService
+import com.tangem.blockchain.blockchains.cardano.CardanoAddressService
+import com.tangem.blockchain.blockchains.ethereum.EthereumAddressService
+import com.tangem.blockchain.blockchains.stellar.StellarAddressService
+import com.tangem.blockchain.blockchains.xrp.XrpAddressService
 
 enum class Blockchain(
         val id: String,
         val currency: String,
-        val decimals: Byte,
-        val fullName: String,
-        val pendingTransactionTimeout: Int
+        val fullName: String
 ) {
-    Unknown("", "", 0, "", 0),
-    Bitcoin("BTC", "BTC", 8, "Bitcoin", 0),
-    BitcoinTestnet("BTC/test", "BTCt", 8, "Bitcoin Testnet", 0),
-    Ethereum("ETH", "ETH", 18, "Ethereum", 0),
-    Rootstock("", "", 18, "", 0),
-    Cardano("CARDANO", "ADA", 6, "Cardano", 0),
-    XRP("XRP", "XRP", 6, "XRP Ledger", 0),
-    Binance("BINANCE", "BNB", 8, "Binance", 0),
-    BinanceTestnet("BINANCE/test", "BNBt", 8, "Binance", 0),
-    Stellar("XLM", "XLM", 7, "Stellar", 0);
+    Unknown("", "", ""),
+    Bitcoin("BTC", "BTC", "Bitcoin"),
+    BitcoinTestnet("BTC/test", "BTCt", "Bitcoin Testnet"),
+    BitcoinCash("BCH", "BCH", "Bitcoin Cash"),
+    Ethereum("ETH", "ETH", "Ethereum"),
+    RSK("RSK", "RBTC", "RSK"),
+    Cardano("CARDANO", "ADA", "Cardano"),
+    XRP("XRP", "XRP", "XRP Ledger"),
+    Binance("BINANCE", "BNB", "Binance"),
+    BinanceTestnet("BINANCE/test", "BNBt", "Binance"),
+    Stellar("XLM", "XLM", "Stellar");
 
-    fun roundingMode(): Int = when (this) {
-        Bitcoin, Ethereum, Rootstock, Binance -> BigDecimal.ROUND_DOWN
-        Cardano -> BigDecimal.ROUND_UP
-        else -> BigDecimal.ROUND_HALF_UP
+    fun decimals(): Int = when (this) {
+        Bitcoin, BitcoinTestnet, BitcoinCash, Binance, BinanceTestnet -> 8
+        Cardano, XRP -> 6
+        Ethereum, RSK -> 18
+        Stellar -> 7
+        Unknown -> 0
     }
 
-    fun makeAddress(walletPublicKey: ByteArray): String {
-        return when (this) {
-            Unknown -> throw Exception("unsupported blockchain")
-            Bitcoin -> BitcoinAddressFactory.makeAddress(walletPublicKey)
-            BitcoinTestnet -> BitcoinAddressFactory.makeAddress(walletPublicKey, testNet = true)
-            Ethereum -> EthereumAddressFactory.makeAddress(walletPublicKey)
-//            Rootstock -> RootstockAddressFactory.makeAddress(cardPublicKey)
-            Cardano -> CardanoAddressFactory.makeAddress(walletPublicKey)
-            XRP -> XrpAddressFactory.makeAddress(walletPublicKey)
-            Binance -> BinanceAddressFactory.makeAddress(walletPublicKey)
-            BinanceTestnet -> BinanceAddressFactory.makeAddress(walletPublicKey, testNet = true)
-            Stellar -> StellarAddressFactory.makeAddress(walletPublicKey)
-            else -> throw Exception("unsupported blockchain")
-        }
+    fun pendingTransactionsTimeout(): Int = when (this) {
+        else -> 0
     }
 
-    fun validateAddress(address: String): Boolean {
-        return when (this) {
-            Unknown -> throw Exception("unsupported blockchain")
-            Bitcoin -> BitcoinAddressValidator.validate(address)
-            BitcoinTestnet -> BitcoinAddressValidator.validate(address, testNet = true)
-            Ethereum -> EthereumAddressValidator.validate(address)
-//            Rootstock -> RootstockAddressValidator.validate(address)
-            Cardano -> CardanoAddressValidator.validate(address)
-            XRP -> XrpAddressValidator.validate(address)
-            Binance -> BinanceAddressValidator.validate(address)
-            BinanceTestnet -> BinanceAddressValidator.validate(address, testNet = true)
-//            Stellar -> StellarAddressValidator.validate(address)
-            else -> throw Exception("unsupported blockchain")
+    fun makeAddress(walletPublicKey: ByteArray): String = getAddressService().makeAddress(walletPublicKey)
+
+    fun validateAddress(address: String): Boolean = getAddressService().validate(address)
+
+    private fun getAddressService(): AddressService = when (this) {
+        Unknown -> throw Exception("unsupported blockchain")
+        Bitcoin -> BitcoinAddressService()
+        BitcoinTestnet -> BitcoinAddressService(true)
+        BitcoinCash -> BitcoinCashAddressService()
+        Ethereum, RSK -> EthereumAddressService()
+        Cardano -> CardanoAddressService()
+        XRP -> XrpAddressService()
+        Binance -> BinanceAddressService()
+        BinanceTestnet -> BinanceAddressService(true)
+        Stellar -> StellarAddressService()
+    }
+
+    fun getShareUri(address: String): String = when (this) {
+        Bitcoin -> "bitcoin:$address"
+        Ethereum -> "ethereum:$address"
+        XRP -> "ripple:$address"
+        else -> address
+    }
+
+    fun getExploreUrl(address: String, token: Token? = null): String = when (this) {
+        Binance -> "https://explorer.binance.org/address/$address"
+        Bitcoin -> "https://blockchain.info/address/$address"
+        BitcoinTestnet -> "https://live.blockcypher.com/btc-testnet/address/$address"
+        BitcoinCash -> "https://blockchair.com/bitcoin-cash/address/$address"
+        Cardano -> "https://cardanoexplorer.com/address/$address"
+        Ethereum -> if (token == null) {
+            "https://etherscan.io/address/"
+        } else {
+            "https://etherscan.io/token/${token.contractAddress}?a=$address"
         }
+        RSK -> {
+            var url = "https://explorer.rsk.co/address/$address"
+            if (token != null) {
+                url += "?__tab=tokens"
+            }
+            url
+        }
+        Stellar -> "https://stellar.expert/explorer/public/account/$address"
+        XRP -> "https://xrpscan.com/account/$address"
+        else -> throw Exception("Explore URL not defined!")
     }
 
     companion object {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Token.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Token.kt
new file mode 100644
index 0000000000..26fbb8af6b
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Token.kt
@@ -0,0 +1,7 @@
+package com.tangem.blockchain.common
+
+data class Token(
+        val symbol: String,
+        val contractAddress: String,
+        val decimals: Int
+)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/TransactionData.kt b/blockchain/src/main/java/com/tangem/blockchain/common/TransactionData.kt
new file mode 100644
index 0000000000..d1774c0b99
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/TransactionData.kt
@@ -0,0 +1,19 @@
+package com.tangem.blockchain.common
+
+import java.util.*
+
+data class TransactionData(
+        val amount: Amount,
+        val fee: Amount?,
+        val sourceAddress: String,
+        val destinationAddress: String,
+        val contractAddress: String? = null,
+        var status: TransactionStatus = TransactionStatus.Unconfirmed,
+        var date: Calendar? = null,
+        val hash: String? = null
+)
+
+
+enum class TransactionStatus { Confirmed, Unconfirmed }
+
+enum class TransactionError { WrongAmount, WrongFee, WrongTotal }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
index 6cca63b075..9273763196 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
@@ -3,53 +3,59 @@ package com.tangem.blockchain.common
 import java.math.BigDecimal
 import java.util.*
 
-interface Wallet {
-    val config: WalletConfig
-    val address: String
-    val exploreUrl: String?
-    val shareUrl: String?
-}
-
-class WalletConfig(
-        val allowFeeSelection: Boolean,
-        val allowFeeInclusion: Boolean,
-        var allowExtract: Boolean = false,
-        var allowLoad: Boolean = false
-)
-
-data class Amount(
-        val currencySymbol: String,
-        var value: BigDecimal? = null,
-        val address: String? = null,
-        val decimals: Byte,
-        val type: AmountType = AmountType.Coin
+class Wallet(
+        val blockchain: Blockchain,
+        val address: String,
+        val token: Token? = null
 ) {
-    constructor(
-            value: BigDecimal?,
-            blockchain: Blockchain,
-            address: String? = null,
-            type: AmountType = AmountType.Coin
-    ) : this(blockchain.currency, value, address, blockchain.decimals, type)
+    val exploreUrl: String
+    val shareUrl: String
+    val transactions: MutableList = mutableListOf()
+    val amounts: MutableMap = mutableMapOf()
 
-    constructor(token: Token, value: BigDecimal? = null) :
-            this(token.symbol, value, token.contractAddress, token.decimals, AmountType.Token)
-}
+    init {
+        setAmount(Amount(null, blockchain, address))
+        if (token != null) setAmount(Amount(token))
 
-data class TransactionData(
-        val amount: Amount,
-        val fee: Amount?,
-        val sourceAddress: String,
-        val destinationAddress: String,
-        var status: TransactionStatus = TransactionStatus.Unconfirmed,
-        var date: Calendar? = null
-)
+        exploreUrl = blockchain.getExploreUrl(address, token)
+        shareUrl = blockchain.getShareUri(address)
+    }
 
-enum class AmountType { Coin, Token, Reserve }
+    fun setAmount(amount: Amount) {
+        amounts[amount.type] = amount
+    }
 
-enum class TransactionStatus { Confirmed, Unconfirmed }
+    fun setCoinValue(value: BigDecimal) {
+        val amount = Amount(value, blockchain, address)
+        setAmount(amount)
+    }
 
-enum class ValidationError { WrongAmount, WrongFee, WrongTotal }
+    fun setTokenValue(value: BigDecimal) {
+        if (token != null) {
+            val amount = Amount(token, value)
+            setAmount(amount)
+        }
+    }
+
+    fun setReserveValue(value: BigDecimal) {
+        val amount = Amount(value, blockchain, address, AmountType.Reserve)
+        setAmount(amount)
+    }
+
+    fun addTransaction(transaction: TransactionData) {
+        transactions.add(transaction.copy(date = Calendar.getInstance()))
+    }
+
+    fun addIncomingTransaction() {
+        val dummyAmount = Amount(null, blockchain)
+        val transaction = TransactionData(dummyAmount, dummyAmount,
+                "unknown", address, date = Calendar.getInstance()
+        )
+        transactions.add(transaction)
+    }
+
+    fun fundsAvailable(amountType: AmountType): BigDecimal {
+        return amounts[amountType]?.value ?: BigDecimal.ZERO
+    }
 
-interface TransactionValidator {
-    fun validateTransaction(amount: Amount, fee: Amount?): EnumSet
 }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManager.kt
index 6fe5a862ea..3271af9575 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManager.kt
@@ -1,26 +1,48 @@
 package com.tangem.blockchain.common
 
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.wallets.CurrencyWallet
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.isAboveZero
 import com.tangem.commands.SignResponse
 import com.tangem.common.CompletionResult
+import java.math.BigDecimal
+import java.util.*
 
-interface WalletManager {
-    var wallet: CurrencyWallet
-    val blockchain: Blockchain
+abstract class WalletManager(val cardId: String, var wallet: Wallet) {
 
-    suspend fun update()
+    abstract suspend fun update()
+
+    fun createTransaction(amount: Amount, fee: Amount, destination: String): TransactionData {
+        return TransactionData(amount, fee,
+                    wallet.address, destination, wallet.token?.contractAddress,
+                    TransactionStatus.Unconfirmed, Calendar.getInstance(), null)
+    }
+
+    fun validateTransaction(amount: Amount, fee: Amount?): EnumSet {
+        val errors = EnumSet.noneOf(TransactionError::class.java)
+
+        if (!validateAmount(amount)) errors.add(TransactionError.WrongAmount)
+        if (fee == null) return errors
+
+        if (!validateAmount(fee)) errors.add(TransactionError.WrongFee)
+        val total = (amount.value ?: BigDecimal.ZERO) + (fee.value ?: BigDecimal.ZERO)
+        if (!validateAmount(Amount(amount, total))) errors.add(TransactionError.WrongTotal)
+
+        return errors
+    }
+
+    private fun validateAmount(amount: Amount): Boolean {
+        return !amount.isAboveZero() &&
+                wallet.fundsAvailable(amount.type) >= amount.value
+    }
 }
 
 interface TransactionSender {
-    suspend fun send(transactionData: TransactionData, signer: TransactionSigner) : SimpleResult
+    suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult
+    suspend fun getFee(amount: Amount, destination: String): Result>
+
 }
 
 interface TransactionSigner {
     suspend fun sign(hashes: Array, cardId: String): CompletionResult
-}
-
-interface FeeProvider {
-    suspend fun getFee(amount: Amount, destination: String): Result>
 }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
index 3b2d48fb04..621ed2f129 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
@@ -1,15 +1,29 @@
 package com.tangem.blockchain.common
 
-import com.tangem.blockchain.binance.BinanceWalletManager
-import com.tangem.blockchain.bitcoin.BitcoinWalletManager
-import com.tangem.blockchain.cardano.CardanoWalletManager
-import com.tangem.blockchain.ethereum.Chain
-import com.tangem.blockchain.ethereum.EthereumWalletManager
+import com.tangem.blockchain.blockchains.binance.BinanceTransactionBuilder
+import com.tangem.blockchain.blockchains.binance.BinanceWalletManager
+import com.tangem.blockchain.blockchains.binance.network.BinanceNetworkManager
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinTransactionBuilder
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinWalletManager
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinNetworkManager
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashNetworkManager
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashTransactionBuilder
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashWalletManager
+import com.tangem.blockchain.blockchains.cardano.CardanoTransactionBuilder
+import com.tangem.blockchain.blockchains.cardano.CardanoWalletManager
+import com.tangem.blockchain.blockchains.cardano.network.CardanoNetworkManager
+import com.tangem.blockchain.blockchains.ethereum.EthereumTransactionBuilder
+import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager
+import com.tangem.blockchain.blockchains.ethereum.network.EthereumNetworkManager
+import com.tangem.blockchain.blockchains.stellar.StellarNetworkManager
+import com.tangem.blockchain.blockchains.stellar.StellarTransactionBuilder
 
-import com.tangem.blockchain.stellar.StellarWalletManager
-import com.tangem.blockchain.wallets.CurrencyWallet
-import com.tangem.blockchain.xrp.XrpWalletManager
+import com.tangem.blockchain.blockchains.stellar.StellarWalletManager
+import com.tangem.blockchain.blockchains.xrp.XrpTransactionBuilder
+import com.tangem.blockchain.blockchains.xrp.XrpWalletManager
+import com.tangem.blockchain.blockchains.xrp.network.XrpNetworkManager
 import com.tangem.commands.Card
+import com.tangem.common.extensions.toCompressedPublicKey
 
 object WalletManagerFactory {
 
@@ -18,69 +32,76 @@ object WalletManagerFactory {
         val blockchainName: String = card.cardData?.blockchainName ?: return null
         val blockchain = Blockchain.fromId(blockchainName)
 
-        val token = getToken(card)
-        val wallet = CurrencyWallet.newInstance(blockchain, blockchain.makeAddress(walletPublicKey), token)
+        val cardId = card.cardId
 
+        val token = getToken(card)
+
+        val wallet = Wallet(blockchain, blockchain.makeAddress(walletPublicKey), token)
 
         when (blockchain) {
             Blockchain.Bitcoin -> {
                 return BitcoinWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet
+                        cardId, wallet,
+                        BitcoinTransactionBuilder(walletPublicKey),
+                        BitcoinNetworkManager()
                 )
             }
             Blockchain.BitcoinTestnet -> {
                 return BitcoinWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet,
-                        isTestNet = true
+                        cardId, wallet,
+                        BitcoinTransactionBuilder(walletPublicKey, true),
+                        BitcoinNetworkManager(true)
                 )
             }
-            Blockchain.Ethereum -> {
-                val chain = Chain.Mainnet
+            Blockchain.BitcoinCash -> {
+                return BitcoinCashWalletManager(
+                        cardId, wallet,
+                        BitcoinCashTransactionBuilder(walletPublicKey.toCompressedPublicKey()),
+                        BitcoinCashNetworkManager()
+                )
+            }
+            Blockchain.Ethereum, Blockchain.RSK -> {
                 return EthereumWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet,
-                        chain = chain
+                        cardId, wallet,
+                        EthereumTransactionBuilder(walletPublicKey, blockchain),
+                        EthereumNetworkManager(blockchain)
                 )
             }
             Blockchain.Stellar -> {
+                val networkManager = StellarNetworkManager()
+
                 return StellarWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet
+                        cardId, wallet,
+                        StellarTransactionBuilder(networkManager, walletPublicKey),
+                        networkManager
                 )
             }
             Blockchain.Cardano -> {
                 return CardanoWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet
+                        cardId, wallet,
+                        CardanoTransactionBuilder(walletPublicKey),
+                        CardanoNetworkManager()
                 )
             }
             Blockchain.XRP -> {
                 return XrpWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet
+                        cardId, wallet,
+                        XrpTransactionBuilder(walletPublicKey),
+                        XrpNetworkManager()
                 )
             }
             Blockchain.Binance -> {
                 return BinanceWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet
+                        cardId, wallet,
+                        BinanceTransactionBuilder(walletPublicKey),
+                        BinanceNetworkManager()
                 )
             }
             Blockchain.BinanceTestnet -> {
                 return BinanceWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet,
-                        isTestNet = true
+                        cardId, wallet,
+                        BinanceTransactionBuilder(walletPublicKey, true),
+                        BinanceNetworkManager(true)
                 )
             }
             else -> return null
@@ -91,13 +112,6 @@ object WalletManagerFactory {
         val symbol = card.cardData?.tokenSymbol ?: return null
         val contractAddress = card.cardData?.tokenContractAddress ?: return null
         val decimals = card.cardData?.tokenDecimal ?: return null
-        return Token(symbol, contractAddress, decimals.toByte())
+        return Token(symbol, contractAddress, decimals)
     }
-}
-
-
-data class Token(
-        val symbol: String,
-        val contractAddress: String,
-        val decimals: Byte
-)
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt
deleted file mode 100644
index a301ee7e1c..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.tangem.blockchain.ethereum
-
-import org.kethereum.crypto.toAddress
-import org.kethereum.erc55.isValid
-import org.kethereum.model.Address
-import org.kethereum.model.PublicKey
-
-class EthereumAddressFactory {
-    companion object {
-        fun makeAddress(walletPublicKey: ByteArray): String =
-                PublicKey(walletPublicKey.sliceArray(1..64)).toAddress().hex
-    }
-}
-
-class EthereumAddressValidator {
-    companion object {
-        fun validate(address: String): Boolean = Address(address).isValid()
-    }
-}
-
-enum class Chain(val id: Int) {
-    Mainnet(1),
-    Morden(2),
-    Ropsten(3),
-    Rinkeby(4),
-    RootstockMainnet(30),
-    RootstockTestnet(31),
-    Kovan(42),
-    EthereumClassicMainnet(61),
-    EthereumClassicTestnet(62),
-    Geth_private_chains(1337),
-    MaticTestnet(8995);
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt
deleted file mode 100644
index 3999bdf7a3..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt
+++ /dev/null
@@ -1,157 +0,0 @@
-package com.tangem.blockchain.ethereum
-
-import android.util.Log
-import com.tangem.blockchain.common.*
-import com.tangem.blockchain.common.Token
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.ethereum.network.EthereumNetworkManager
-import com.tangem.blockchain.ethereum.network.EthereumResponse
-import com.tangem.blockchain.wallets.CurrencyWallet
-import com.tangem.common.CompletionResult
-import com.tangem.common.extensions.toHexString
-import org.kethereum.DEFAULT_GAS_LIMIT
-import org.kethereum.crypto.api.ec.ECDSASignature
-import org.kethereum.crypto.determineRecId
-import org.kethereum.crypto.impl.ec.canonicalise
-import org.kethereum.extensions.transactions.encodeRLP
-import org.kethereum.keccakshortcut.keccak
-import org.kethereum.model.*
-import java.math.BigDecimal
-import java.math.BigInteger
-
-class EthereumWalletManager(
-        private val cardId: String,
-        private val walletPublicKey: ByteArray,
-        chain: Chain,
-        token: Token? = null,
-        override var wallet: CurrencyWallet
-) : WalletManager,
-        TransactionSender,
-        FeeProvider {
-
-    override val blockchain: Blockchain = Blockchain.Ethereum
-    private val address = blockchain.makeAddress(walletPublicKey)
-    private val builder = EthereumTransactionBuilder(chain)
-    private val networkManager = EthereumNetworkManager()
-    private var pendingTxCount = -1L
-    private var txCount = -1L
-
-    init {
-        if (token != null) wallet.balances[AmountType.Token] =
-                Amount(
-                        token.symbol,
-                        null,
-                        token.contractAddress,
-                        token.decimals,
-                        AmountType.Token)
-        wallet.balances[AmountType.Coin] = Amount(null, blockchain)
-    }
-
-    override suspend fun update() {
-        val result = networkManager.getInfo(address, wallet.balances[AmountType.Token]?.address)
-        when (result) {
-            is Result.Failure -> updateError(result.error)
-            is Result.Success -> updateWallet(result.data)
-        }
-    }
-
-    private fun updateWallet(data: EthereumResponse) {
-        wallet.balances[AmountType.Coin]?.value = data.balance
-        wallet.balances[AmountType.Token]?.value = data.tokenBalance
-        txCount = data.txCount
-        pendingTxCount = data.pendingTxCount
-        if (txCount == pendingTxCount) {
-            wallet.pendingTransactions.forEach { it.status = TransactionStatus.Confirmed }
-        } else if (wallet.pendingTransactions.isEmpty()) {
-            wallet.pendingTransactions.add(TransactionData(
-                    Amount(blockchain.currency, decimals = blockchain.decimals),
-                    null,
-                    "unknown",
-                    wallet.address))
-        }
-    }
-
-    private fun updateError(error: Throwable?) {
-        Log.e(this::class.java.simpleName, error?.message ?: "")
-        if (error != null) throw error
-    }
-
-    override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
-        val transactionToSign = builder.buildToSign(transactionData, txCount.toBigInteger())
-                ?: return SimpleResult.Failure(Exception("Not enough data"))
-        when (val signerResponse = signer.sign(transactionToSign.hashes.toTypedArray(), cardId)) {
-            is CompletionResult.Success -> {
-                val transactionToSend = builder.buildToSend(signerResponse.data.signature, transactionToSign, walletPublicKey)
-                return networkManager.sendTransaction(String.format("0x%s", transactionToSend.toHexString()))
-            }
-            is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
-        }
-    }
-
-    override suspend fun getFee(amount: Amount, destination: String): Result> {
-        val result = networkManager.getFee(getGasLimit(amount).value)
-        when (result) {
-            is Result.Success -> {
-                val feeValues: List = result.data
-                return Result.Success(
-                        feeValues.map { Amount(blockchain.currency, it, address, blockchain.decimals) })
-            }
-            is Result.Failure -> return result
-        }
-    }
-}
-
-private class EthereumTransactionBuilder(private val chain: Chain) {
-
-    fun buildToSign(transactionData: TransactionData, nonce: BigInteger?): TransactionToSign? {
-
-        val amount: BigDecimal = transactionData.amount.value ?: return null
-        val transactionFee: BigDecimal = transactionData.fee?.value ?: return null
-
-        val value = amount.movePointRight(transactionData.amount.decimals.toInt()).toBigInteger()
-        val fee = transactionFee.movePointRight(transactionData.fee.decimals.toInt()).toBigInteger()
-
-        val transaction = createTransactionWithDefaults(
-                from = Address(transactionData.sourceAddress),
-                to = Address(transactionData.destinationAddress),
-                value = value,
-                gasPrice = fee.divide(DEFAULT_GAS_LIMIT),
-                gasLimit = DEFAULT_GAS_LIMIT,
-                nonce = nonce,
-                chain = ChainId(chain.id.toLong())
-        )
-        val hash = transaction.encodeRLP(SignatureData(v = chain.id.toBigInteger())).keccak()
-        return TransactionToSign(transaction, listOf(hash))
-    }
-
-    fun buildToSend(signature: ByteArray, transactionToSign: TransactionToSign, walletPublicKey: ByteArray): ByteArray {
-        val r = BigInteger(1, signature.copyOfRange(0, 32))
-        val s = BigInteger(1, signature.copyOfRange(32, 64))
-
-        val ecdsaSignature = ECDSASignature(r, s).canonicalise()
-
-        val recId = ecdsaSignature.determineRecId(transactionToSign.hashes[0], PublicKey(walletPublicKey.sliceArray(1..64)))
-        val v = (recId + 27 + 8 + (chain.id * 2)).toBigInteger()
-        val signatureData = SignatureData(ecdsaSignature.r, ecdsaSignature.s, v)
-
-        return transactionToSign.transaction.encodeRLP(signatureData)
-    }
-}
-
-private class TransactionToSign(val transaction: Transaction, val hashes: List)
-
-enum class GasLimit(val value: Long) {
-    Default(21000),
-    Token(60000),
-    High(300000)
-}
-
-private fun getGasLimit(amount: Amount): GasLimit {
-    return when (amount.currencySymbol) {
-        Blockchain.Ethereum.currency -> GasLimit.Default
-        "DGX" -> GasLimit.High
-        "CGT" -> GasLimit.High
-        else -> GasLimit.Token
-    }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt
deleted file mode 100644
index 2a04de5825..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.tangem.blockchain.ethereum.network
-
-class InfuraProvider(private val api: InfuraApi) {
-    suspend fun getBalance(address: String) = api.postToInfura(createInfuraBody(InfuraMethod.GET_BALANCE, address))
-    suspend fun getTokenBalance(address: String, contractAddress: String) = api.postToInfura(createInfuraBody(InfuraMethod.CALL, address, contractAddress))
-    suspend fun getTxCount(address: String) = api.postToInfura(createInfuraBody(InfuraMethod.GET_TRANSACTION_COUNT, address))
-    suspend fun getPendingTxCount(address: String) = api.postToInfura(createInfuraBody(InfuraMethod.GET_PENDING_COUNT, address))
-    suspend fun getGasPrice() = api.postToInfura(createInfuraBody(InfuraMethod.GAS_PRICE))
-    suspend fun sendTransaction(transaction: String) = api.postToInfura(createInfuraBody(InfuraMethod.SEND_RAW_TRANSACTION, transaction = transaction))
-}
-
-private fun createInfuraBody(
-        method: InfuraMethod,
-        address: String? = null,
-        contractAddress: String? = null,
-        transaction: String? = null): InfuraBody {
-
-    return when (method) {
-        InfuraMethod.GET_BALANCE ->
-            InfuraBody(method = InfuraMethod.GET_BALANCE.value, params = listOf(address ?: "", "latest"))
-        InfuraMethod.GET_TRANSACTION_COUNT ->
-            InfuraBody(method = InfuraMethod.GET_TRANSACTION_COUNT.value, params = listOf(address ?: "", "latest"))
-        InfuraMethod.GET_PENDING_COUNT ->
-            InfuraBody(method = InfuraMethod.GET_TRANSACTION_COUNT.value, params = listOf(address ?: "", "pending"))
-        InfuraMethod.GAS_PRICE ->
-            InfuraBody(method = InfuraMethod.GAS_PRICE.value)
-        InfuraMethod.SEND_RAW_TRANSACTION ->
-            InfuraBody(method = InfuraMethod.SEND_RAW_TRANSACTION.value, params = listOf(transaction ?: ""))
-        InfuraMethod.CALL -> {
-            InfuraBody(
-                    method = InfuraMethod.CALL.value,
-                    params = listOf(EthCallParams(
-                            "0x70a08231000000000000000000000000" + address?.substring(2), contractAddress
-                            ?: ""),
-                            "latest"
-                    ))
-        }
-    }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/Amount.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/Amount.kt
similarity index 55%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/Amount.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/Amount.kt
index 8a9f4445e1..9c76097bc5 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/Amount.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/Amount.kt
@@ -1,8 +1,13 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
 
 import com.tangem.blockchain.common.Amount
 import java.math.BigInteger
 
 fun Amount.bigIntegerValue(): BigInteger? {
     return this.value?.movePointRight(this.decimals.toInt())?.toBigInteger()
+}
+
+fun Amount.isAboveZero(): Boolean {
+    val value = this.value ?: return false
+    return value.signum() == 1
 }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/BitInteger.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/BitInteger.kt
similarity index 83%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/BitInteger.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/BitInteger.kt
index 6ac80e1bbd..09299f4e86 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/BitInteger.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/BitInteger.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
 
 import org.bitcoinj.core.ECKey
 import java.math.BigInteger
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/ByteArray.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/ByteArray.kt
similarity index 83%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/ByteArray.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/ByteArray.kt
index 29ce488afc..8b251179ca 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/ByteArray.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/ByteArray.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
 
 import android.util.Base64
 import org.bitcoinj.core.Base58
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/Coroutines.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/Coroutines.kt
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/Coroutines.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/Coroutines.kt
index 8451a23b67..52e65b7046 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/Coroutines.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/Coroutines.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
 
 import com.tangem.TangemSdk
 import com.tangem.blockchain.common.TransactionSigner
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/String.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/String.kt
similarity index 83%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/String.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/String.kt
index 8f14abf5f8..149d43ab34 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/String.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/String.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
 
 import org.bitcoinj.core.AddressFormatException
 import org.bitcoinj.core.Base58
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
similarity index 85%
rename from blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
index afcffa0bfb..94d89c0531 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.network
+package com.tangem.blockchain.network
 
 import com.squareup.moshi.Moshi
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
@@ -40,7 +40,7 @@ const val API_INFURA = "https://mainnet.infura.io/"
 const val API_SOCHAIN_V2 = "https://chain.so/"
 const val API_ESTIMATEFEE = "https://estimatefee.com/"
 const val API_UPDATE_VERSION = "https://raw.githubusercontent.com/"
-const val API_ROOTSTOCK = "https://public-node.rsk.co/"
+const val API_RSK = "https://public-node.rsk.co/"
 const val API_BLOCKCYPHER = "https://api.blockcypher.com/"
 const val API_BINANCE = "https://dex.binance.org/"
 const val API_BINANCE_TESTNET = "https://testnet-dex.binance.org/"
@@ -49,7 +49,8 @@ const val API_STELLAR = "https://horizon.stellar.org/"
 const val API_STELLAR_RESERVE = "https://horizon.sui.li/"
 const val API_STELLAR_TESTNET = "https://horizon-testnet.stellar.org/"
 const val API_BLOCKCHAIN_INFO = "https://blockchain.info/"
-const val API_ADALITE = "https://explorer2.adalite.io"
-const val API_ADALITE_RESERVE = "https://nodes.southeastasia.cloudapp.azure.com"
-const val API_RIPPLED = "https://s1.ripple.com:51234"
-const val API_RIPPLED_RESERVE = "https://s2.ripple.com:51234"
\ No newline at end of file
+const val API_ADALITE = "https://explorer3.adalite.io/"
+const val API_ADALITE_RESERVE = "https://nodes.southeastasia.cloudapp.azure.com/"
+const val API_RIPPLED = "https://s1.ripple.com:51234/"
+const val API_RIPPLED_RESERVE = "https://s2.ripple.com:51234/"
+const val API_BLOCKCHAIR = "https://api.blockchair.com/"
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairApi.kt b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairApi.kt
new file mode 100644
index 0000000000..b078327847
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairApi.kt
@@ -0,0 +1,36 @@
+package com.tangem.blockchain.network.blockchair
+
+import com.squareup.moshi.JsonClass
+import retrofit2.http.*
+
+interface BlockchairApi {
+    @GET("{blockchain}/dashboards/address/{address}")
+    suspend fun getAddressData(
+            @Path("address") address: String,
+            @Path("blockchain") blockchain: String,
+            @Query("key") key: String
+    ): BlockchairAddress
+
+    @GET("{blockchain}/dashboards/transaction/{transaction}")
+    suspend fun getTransaction(
+            @Path("transaction") transactionHash: String,
+            @Path("blockchain") blockchain: String,
+            @Query("key") key: String
+    ): BlockchairTransaction
+
+    @GET("{blockchain}/stats")
+    suspend fun getBlockchainStats(
+            @Path("blockchain") blockchain: String,
+            @Query("key") key: String
+    ): BlockchairStats
+
+    @POST("{blockchain}/push/transaction")
+    suspend fun sendTransaction(
+            @Body sendBody: BlockchairBody,
+            @Path("blockchain") blockchain: String,
+            @Query("key") key: String
+    )
+}
+
+@JsonClass(generateAdapter = true)
+data class BlockchairBody(val data: String)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairProvider.kt
new file mode 100644
index 0000000000..a14c6b8561
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairProvider.kt
@@ -0,0 +1,96 @@
+package com.tangem.blockchain.network.blockchair
+
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinAddressResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinFee
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinProvider
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
+import com.tangem.common.extensions.hexToBytes
+import java.math.BigDecimal
+import java.math.RoundingMode
+
+class BlockchairProvider(private val api: BlockchairApi, blockchain: Blockchain) : BitcoinProvider {
+    private val blockchainPath = when (blockchain) {
+        Blockchain.BitcoinCash -> "bitcoin-cash"
+        else -> throw Exception("${blockchain.fullName} blockchain is not supported by BlockchairProvider")
+    }
+    private val decimals = blockchain.decimals()
+
+    override suspend fun getInfo(address: String): Result {
+        return try {
+            val blockchairAddress = retryIO { api.getAddressData(address, blockchainPath, API_KEY) }
+
+            val addressData = blockchairAddress.data!!.getValue(address)
+            val addressInfo = addressData.addressInfo!!
+            val script = addressInfo.script!!.hexToBytes()
+
+            val hasUnconfirmed = checkHasUnconfirmed(addressData)
+
+            val unspentTransactions = addressData.unspentOutputs!!.map {
+                BitcoinUnspentOutput(
+                        amount = it.amount!!.toBigDecimal().movePointLeft(decimals),
+                        outputIndex = it.index!!.toLong(),
+                        transactionHash = it.transactionHash!!.hexToBytes(),
+                        outputScript = script
+                )
+            }
+
+            Result.Success(BitcoinAddressResponse(
+                    balance = addressInfo.balance!!.toBigDecimal().movePointLeft(decimals),
+                    hasUnconfirmed = hasUnconfirmed,
+                    unspentOutputs = unspentTransactions
+            ))
+        } catch (error: Exception) {
+            Result.Failure(error)
+        }
+
+    }
+
+    private suspend fun checkHasUnconfirmed(addressData: BlockchairAddressData): Boolean {
+        for (utxo in addressData.unspentOutputs!!) { //check utxos first
+            if (utxo.block == -1) return true
+        }
+
+        return if (addressData.addressInfo!!.balance != 0L) { // if balance is not zero, unconfirmed tx should have unconfirmed utxo
+            false
+        } else {
+            if (addressData.transactions!!.isEmpty()) { // no transactions from this address ever
+                false
+            } else { // check last transaction in case it spent all funds
+                val lastTransactionHash = addressData.transactions[0]
+                val blockchairTransaction = retryIO {
+                    api.getTransaction(lastTransactionHash, blockchainPath, API_KEY)
+                }
+                blockchairTransaction.data!!.getValue(lastTransactionHash).transaction!!.block == -1
+            }
+        }
+    }
+
+    override suspend fun getFee(): Result {
+        return try {
+            val stats = retryIO { api.getBlockchainStats(blockchainPath, API_KEY) }
+            val feePerKb = (stats.data!!.feePerByte!! * 1024).toBigDecimal().movePointLeft(decimals)
+            Result.Success(BitcoinFee(
+                    minimalPerKb = (feePerKb * BigDecimal.valueOf(0.8)).setScale(decimals, RoundingMode.DOWN),
+                    normalPerKb = feePerKb.setScale(decimals, RoundingMode.DOWN),
+                    priorityPerKb = (feePerKb * BigDecimal.valueOf(1.2)).setScale(decimals, RoundingMode.DOWN)
+            ))
+        } catch (error: Exception) {
+            Result.Failure(error)
+        }
+    }
+
+    override suspend fun sendTransaction(transaction: String): SimpleResult {
+        return try {
+            retryIO { api.sendTransaction(BlockchairBody(transaction), blockchainPath, API_KEY) }
+            SimpleResult.Success
+        } catch (error: Exception) {
+            SimpleResult.Failure(error)
+        }
+    }
+}
+
+private const val API_KEY = "A___0Shpsu4KagE7oSabrw20DfXAqWlT"
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairResponse.kt
new file mode 100644
index 0000000000..8962ce7860
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairResponse.kt
@@ -0,0 +1,75 @@
+package com.tangem.blockchain.network.blockchair
+
+import com.google.gson.annotations.SerializedName
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+@JsonClass(generateAdapter = true)
+data class BlockchairAddress(
+        @Json(name = "data")
+        val data: Map? = null
+)
+
+data class BlockchairAddressData(
+        @Json(name = "address")
+        val addressInfo: BlockchairAddressInfo? = null,
+
+        @Json(name = "utxo")
+        val unspentOutputs: List? = null,
+
+        @Json(name = "transactions")
+        val transactions: List? = null
+)
+
+data class BlockchairAddressInfo(
+        @Json(name = "balance")
+        val balance: Long? = null,
+
+        @Json(name = "script_hex")
+        val script: String? = null,
+
+        @Json(name = "output_count")
+        val outputCount: Int? = null,
+
+        @Json(name = "unspent_output_count")
+        val unspentOutputCount: Int? = null
+)
+
+data class BlockchairUnspentOutput(
+        @Json(name = "block_id")
+        val block: Int? = null,
+
+        @Json(name = "transaction_hash")
+        val transactionHash: String? = null,
+
+        @Json(name = "index")
+        val index: Int? = null,
+
+        @Json(name = "value")
+        val amount: Long? = null
+)
+
+data class BlockchairTransaction(
+        @Json(name = "data")
+        val data: Map? = null
+)
+
+data class BlockchairTransactionData(
+        @Json(name = "transaction")
+        val transaction: BlockchairTransactionInfo? = null
+)
+
+data class BlockchairTransactionInfo(
+        @Json(name = "block_id")
+        val block: Int? = null
+)
+
+data class BlockchairStats(
+        @Json(name = "data")
+        val data: BlockchairStatsData? = null
+)
+
+data class BlockchairStatsData(
+        @Json(name = "suggested_transaction_fee_per_byte_sat")
+        val feePerByte: Int? = null
+)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarAddress.kt
deleted file mode 100644
index 605d8f3e2e..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarAddress.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.tangem.blockchain.stellar
-
-import org.stellar.sdk.KeyPair
-
-class StellarAddressFactory {
-    companion object {
-        fun makeAddress(cardPublicKey: ByteArray): String {
-            val kp = KeyPair.fromPublicKey(cardPublicKey)
-            return kp.accountId
-        }
-    }
-}
-
-class StellarAddressValidator {
-    companion object {
-        fun validate(address: String): Boolean {
-            return try {
-                KeyPair.fromAccountId(address) != null
-            } catch (exception: IllegalArgumentException) {
-                false
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/wallets/CurrencyWallet.kt b/blockchain/src/main/java/com/tangem/blockchain/wallets/CurrencyWallet.kt
deleted file mode 100644
index 7710b95439..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/wallets/CurrencyWallet.kt
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.tangem.blockchain.wallets
-
-import com.tangem.blockchain.common.*
-import java.util.*
-
-class CurrencyWallet(
-        val blockchain: Blockchain,
-        address: String,
-        override val config: WalletConfig
-) : Wallet, TransactionValidator {
-
-    override val exploreUrl: String? = null
-    override val shareUrl: String? = null
-    override val address: String
-        get() = balances[AmountType.Coin]!!.address!!
-
-    val pendingTransactions: MutableList = mutableListOf()
-    val balances: MutableMap = mutableMapOf()
-
-    init {
-        addAmount(Amount(null, blockchain, address))
-    }
-
-    override fun validateTransaction(amount: Amount, fee: Amount?): EnumSet {
-        TODO("not implemented")
-    }
-
-    fun addAmount(amount: Amount) {
-        balances[amount.type] = amount
-    }
-
-    fun addPendingTransaction(transaction: TransactionData) {
-        pendingTransactions.add(transaction.copy(date = Calendar.getInstance()))
-    }
-
-    companion object {
-        fun newInstance(blockchain: Blockchain, address: String, token: Token?): CurrencyWallet {
-
-            return when (blockchain) {
-                Blockchain.Bitcoin, Blockchain.BitcoinTestnet, Blockchain.XRP -> {
-                    val config = WalletConfig(true, true)
-                    CurrencyWallet(blockchain, address, config)
-                }
-                Blockchain.Cardano, Blockchain.Binance, Blockchain.BinanceTestnet -> {
-                    val config = WalletConfig(false, true)
-                    CurrencyWallet(blockchain, address, config)
-                }
-                Blockchain.Ethereum -> {
-                    val config = WalletConfig(true, token == null)
-                    val wallet = CurrencyWallet(blockchain, address, config)
-                    if (token != null) wallet.addAmount(Amount(token))
-                    wallet
-                }
-                Blockchain.Stellar -> {
-                    val config = WalletConfig(false, token == null)
-                    val wallet = CurrencyWallet(blockchain, address, config)
-                    if (token != null) wallet.addAmount(Amount(token))
-                    wallet.addAmount(Amount(null, blockchain, address, AmountType.Reserve))
-                    wallet
-                }
-                else -> throw Exception("Unsupported blockchain")
-            }
-
-        }
-    }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpAddress.kt
deleted file mode 100644
index 2bd702f67f..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpAddress.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.tangem.blockchain.xrp
-
-import com.ripple.encodings.addresses.Addresses
-import com.tangem.common.extensions.calculateRipemd160
-import com.tangem.common.extensions.calculateSha256
-import com.tangem.common.extensions.toCompressedPublicKey
-
-class XrpAddressFactory {
-    companion object {
-        fun makeAddress(walletPublicKey: ByteArray): String {
-            val canonicalPublicKey = canonizePublicKey(walletPublicKey)
-            val publicKeyHash = canonicalPublicKey.calculateSha256().calculateRipemd160()
-            return Addresses.encodeAccountID(publicKeyHash)
-        }
-
-        fun canonizePublicKey(publicKey: ByteArray): ByteArray {
-            val compressedPublicKey = publicKey.toCompressedPublicKey()
-            return if (compressedPublicKey.size == 32) {
-                byteArrayOf(0xED.toByte()) + compressedPublicKey
-            } else {
-                compressedPublicKey
-            }
-        }
-    }
-}
-
-class XrpAddressValidator {
-    companion object {
-        fun validate(address: String): Boolean {
-            return try {
-                Addresses.decodeAccountID(address)
-                address.startsWith("r")
-            } catch (excpetion: Exception) {
-                false
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/binance/BinanceAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/binance/BinanceAddressTest.kt
similarity index 72%
rename from blockchain/src/test/java/com/tangem/blockchain/binance/BinanceAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/binance/BinanceAddressTest.kt
index 7501ec0105..3293a1fe37 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/binance/BinanceAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/binance/BinanceAddressTest.kt
@@ -1,23 +1,26 @@
-package com.tangem.blockchain.binance
+package com.tangem.blockchain.blockchains.binance
 
 import com.google.common.truth.Truth
 import com.tangem.common.extensions.hexToBytes
 import org.junit.Test
 
 internal class BinanceAddressTest {
+
+    private val addressService = BinanceAddressService()
+
     @Test
     fun makeAddressFromCorrectPublicKey() {
         val walletPublicKey = "04E3F3BE3CE3D8284DB3BA073AD0291040093D83C11A277B905D5555C9EC41073E103F4D9D299EDEA8285C51C3356A8681A545618C174251B984DF841F49D2376F".hexToBytes()
         val expected = "bnb1m9wu5ncxk8mqhm3nfmxa552728wkty700rzhvu"
 
-        Truth.assertThat(BinanceAddressFactory.makeAddress(walletPublicKey))
+        Truth.assertThat(addressService.makeAddress(walletPublicKey))
                 .isEqualTo(expected)
     }
 
     @Test
     fun validateCorrectAddress() {
         val address = "bnb1m9wu5ncxk8mqhm3nfmxa552728wkty700rzhvu"
-        Truth.assertThat(BinanceAddressValidator.validate(address))
+        Truth.assertThat(addressService.validate(address))
                 .isTrue()
     }
 }
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/bitcoin/BitcoinAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressTest.kt
similarity index 71%
rename from blockchain/src/test/java/com/tangem/blockchain/bitcoin/BitcoinAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressTest.kt
index ea4b181980..c8b7cca7ef 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/bitcoin/BitcoinAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressTest.kt
@@ -1,25 +1,26 @@
-package com.tangem.blockchain.bitcoin
+package com.tangem.blockchain.blockchains.bitcoin
 
 import com.google.common.truth.Truth
 import com.tangem.common.extensions.hexToBytes
 import org.junit.Test
-import org.junit.jupiter.api.Assertions.*
 
 class BitcoinAddressTest {
 
+    private val addressService = BitcoinAddressService()
+
     @Test
     fun makeAddressFromCorrectPublicKey() {
         val walletPublicKey = "04752A727E14BBA5BD73B6714D72500F61FFD11026AD1196D2E1C54577CBEEAC3D11FC68A64700F8D533F4E311964EA8FB3AA26C588295F2133868D69C3E628693".hexToBytes()
         val expected = "1D3vYSjCvzrsVVK5bNaPTjU3NxcN7NNXMN"
 
-        Truth.assertThat(BitcoinAddressFactory.makeAddress(walletPublicKey))
+        Truth.assertThat(addressService.makeAddress(walletPublicKey))
                 .isEqualTo(expected)
     }
 
     @Test
     fun validateCorrectAddress() {
         val address = "1D3vYSjCvzrsVVK5bNaPTjU3NxcN7NNXMN"
-        Truth.assertThat(BitcoinAddressValidator.validate(address))
+        Truth.assertThat(addressService.validate(address))
                 .isTrue()
     }
 }
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressTest.kt
new file mode 100644
index 0000000000..ff0d1a7f95
--- /dev/null
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressTest.kt
@@ -0,0 +1,27 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.google.common.truth.Truth
+import com.tangem.common.extensions.hexToBytes
+import com.tangem.common.extensions.toCompressedPublicKey
+import org.junit.Test
+
+class BitcoinCashAddressTest {
+
+    private val addressService = BitcoinCashAddressService()
+
+    @Test
+    fun makeAddressFromCorrectPublicKey() {
+        val walletPublicKey = "04BE37CD5251C8999EDBBFC759D800EB41E4DCB718289601EB15819404E1B2F2ED90FE50C2A481D06EC790D1EF6184974EB655ABAE4BE56A6D1C9E1A17B1EFDF02".hexToBytes()
+        val expected = "bitcoincash:qp7atyzvetwq8a0x02y2snvnns5jfwnzacf9vfa4x3"
+
+        Truth.assertThat(addressService.makeAddress(walletPublicKey.toCompressedPublicKey()))
+                .isEqualTo(expected)
+    }
+
+    @Test
+    fun validateCorrectAddress() {
+        val address = "bitcoincash:qp7atyzvetwq8a0x02y2snvnns5jfwnzacf9vfa4x3"
+        Truth.assertThat(addressService.validate(address))
+                .isTrue()
+    }
+}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/ethereum/EthereumAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressTest.kt
similarity index 51%
rename from blockchain/src/test/java/com/tangem/blockchain/ethereum/EthereumAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressTest.kt
index b1325c8493..b4892fb1d4 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/ethereum/EthereumAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressTest.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.ethereum
+package com.tangem.blockchain.blockchains.ethereum
 
 import com.google.common.truth.Truth
 import com.tangem.common.extensions.hexToBytes
@@ -6,19 +6,28 @@ import org.junit.Test
 
 internal class EthereumAddressTest {
 
+    private val addressService = EthereumAddressService()
+
     @Test
     fun makeAddressFromCorrectPublicKey() {
         val walletPublicKey = "04BAEC8CD3BA50FDFE1E8CF2B04B58E17041245341CD1F1C6B3A496B48956DB4C896A6848BCF8FCFC33B88341507DD25E5F4609386C68086C74CF472B86E5C3820".hexToBytes()
-        val expected = "0xc63763572d45171e4c25ca0818b44e5dd7f5c15b"
+        val expected = "0xc63763572D45171e4C25cA0818b44E5Dd7F5c15B"
 
-        Truth.assertThat(EthereumAddressFactory.makeAddress(walletPublicKey))
+        Truth.assertThat(addressService.makeAddress(walletPublicKey))
                 .isEqualTo(expected)
     }
 
     @Test
     fun validateCorrectAddress() {
         val address = "0xc63763572d45171e4c25ca0818b44e5dd7f5c15b"
-        Truth.assertThat(EthereumAddressValidator.validate(address))
+        Truth.assertThat(addressService.validate(address))
+                .isTrue()
+    }
+
+    @Test
+    fun validateCorrectAddressWithChecksum() {
+        val address = "0xc63763572D45171e4C25cA0818b44E5Dd7F5c15B"
+        Truth.assertThat(addressService.validate(address))
                 .isTrue()
     }
 }
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/stellar/StellarAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/stellar/StellarAddressTest.kt
similarity index 71%
rename from blockchain/src/test/java/com/tangem/blockchain/stellar/StellarAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/stellar/StellarAddressTest.kt
index 5c6f18561f..e53d557e53 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/stellar/StellarAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/stellar/StellarAddressTest.kt
@@ -1,23 +1,26 @@
-package com.tangem.blockchain.stellar
+package com.tangem.blockchain.blockchains.stellar
 
 import com.google.common.truth.Truth
 import com.tangem.common.extensions.hexToBytes
 import org.junit.Test
 
 internal class StellarAddressTest {
+
+    private val addressService = StellarAddressService()
+
     @Test
     fun makeAddressFromCorrectPublicKey() {
         val walletPublicKey = "EC5387D8B38BD9EF80BDBC78D0D7E1C53F08E269436C99D5B3C2DF4B2CE73012".hexToBytes()
         val expected = "GDWFHB6YWOF5T34AXW6HRUGX4HCT6CHCNFBWZGOVWPBN6SZM44YBFUDZ"
 
-        Truth.assertThat(StellarAddressFactory.makeAddress(walletPublicKey))
+        Truth.assertThat(addressService.makeAddress(walletPublicKey))
                 .isEqualTo(expected)
     }
 
     @Test
     fun validateCorrectAddress() {
         val address = "GDWFHB6YWOF5T34AXW6HRUGX4HCT6CHCNFBWZGOVWPBN6SZM44YBFUDZ"
-        Truth.assertThat(StellarAddressValidator.validate(address))
+        Truth.assertThat(addressService.validate(address))
                 .isTrue()
     }
 }
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/xrp/XrpAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/xrp/XrpAddressTest.kt
similarity index 74%
rename from blockchain/src/test/java/com/tangem/blockchain/xrp/XrpAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/xrp/XrpAddressTest.kt
index 1f82c1f777..a6d2f97a91 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/xrp/XrpAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/xrp/XrpAddressTest.kt
@@ -1,16 +1,19 @@
-package com.tangem.blockchain.xrp
+package com.tangem.blockchain.blockchains.xrp
 
 import com.google.common.truth.Truth
 import com.tangem.common.extensions.hexToBytes
 import org.junit.Test
 
 internal class XrpAddressTest {
+
+    private val addressService = XrpAddressService()
+
     @Test
     fun makeAddressFromCorrectSecpPublicKey() {
         val walletPublicKey = "04D2B9FB288540D54E5B32ECAF0381CD571F97F6F1ECD036B66BB11AA52FFE9981110D883080E2E255C6B1640586F7765E6FAA325D1340F49B56B83D9DE56BC7ED".hexToBytes()
         val expected = "rNxCXgKaCMAmowENKnYa5r8Ue78rjgrM6B"
 
-        Truth.assertThat(XrpAddressFactory.makeAddress(walletPublicKey))
+        Truth.assertThat(addressService.makeAddress(walletPublicKey))
                 .isEqualTo(expected)
     }
 
@@ -19,14 +22,14 @@ internal class XrpAddressTest {
         val walletPublicKey = "12CC4DE73BACF875D7423D152E46C1A665F1718CBE7CA0FEB2BA28C149E11909".hexToBytes()
         val expected = "rwWMNBs2GtJwfX7YNVV1sUYaPy6DRmDHB4"
 
-        Truth.assertThat(XrpAddressFactory.makeAddress(walletPublicKey))
+        Truth.assertThat(addressService.makeAddress(walletPublicKey))
                 .isEqualTo(expected)
     }
 
     @Test
     fun validateCorrectAddress() {
         val address = "rwWMNBs2GtJwfX7YNVV1sUYaPy6DRmDHB4"
-        Truth.assertThat(XrpAddressValidator.validate(address))
+        Truth.assertThat(addressService.validate(address))
                 .isTrue()
     }
 }
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt b/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
index 32ab0256cb..ff9edbcdd1 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
@@ -2,12 +2,13 @@ package com.tangem.blockchain.common
 
 import com.google.common.truth.Truth
 import com.tangem.SessionEnvironment
-import com.tangem.blockchain.binance.BinanceWalletManager
-import com.tangem.blockchain.bitcoin.BitcoinWalletManager
-import com.tangem.blockchain.cardano.CardanoWalletManager
-import com.tangem.blockchain.ethereum.EthereumWalletManager
-import com.tangem.blockchain.stellar.StellarWalletManager
-import com.tangem.blockchain.xrp.XrpWalletManager
+import com.tangem.blockchain.blockchains.binance.BinanceWalletManager
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinWalletManager
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashWalletManager
+import com.tangem.blockchain.blockchains.cardano.CardanoWalletManager
+import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager
+import com.tangem.blockchain.blockchains.stellar.StellarWalletManager
+import com.tangem.blockchain.blockchains.xrp.XrpWalletManager
 import com.tangem.commands.ReadCommand
 import com.tangem.common.apdu.ResponseApdu
 import com.tangem.common.extensions.hexToBytes
@@ -80,4 +81,15 @@ internal class WalletManagerFactoryTest {
         Truth.assertThat(walletManager)
                 .isInstanceOf(BinanceWalletManager::class.java)
     }
+
+    @Test
+    fun createBitcoinCashWalletManager() {
+        val data = "0108BB00000000000049200754414E47454D00020102800A322E3432642053444B00034104766A1586D164B436E5D420AED01FDAB41B2AE7EDF0C865D7AF1DA995D70AB297E5B94B761CFBB405084C21BC97C02B4A1EA9ED4F515576EAB4D83AD3A0DFAA8A0A04041E76310C618102FFFF8A0101820407E4041B830B54414E47454D2053444B00840342434886408058F0F628C2466B09ECEB13F2A8EFDD4558F5D2DBDA9BD0628EE8C8CC99A778FF0F1AECD35704B9F3518486EA5C1D20F9DFCBAA66184F4CCCD9282E2632882C3041045F16BD1D2EAFE463E62A335A09E6B2BBCBD04452526885CB679FC4D27AF1BD22F553C7DEEFB54FD3D4F361D14E6DC3F11B7D4EA183250A60720EBDF9E110CD26050A736563703235366B31000804000186A0070100604104BE37CD5251C8999EDBBFC759D800EB41E4DCB718289601EB15819404E1B2F2ED90FE50C2A481D06EC790D1EF6184974EB655ABAE4BE56A6D1C9E1A17B1EFDF0262040001869A6304000000060F01009000"
+        val responseApdu = ResponseApdu(data.hexToBytes())
+        val card = ReadCommand().deserialize(SessionEnvironment(), responseApdu)
+        val walletManager = WalletManagerFactory.makeWalletManager(card!!)
+
+        Truth.assertThat(walletManager)
+                .isInstanceOf(BitcoinCashWalletManager::class.java)
+    }
 }
\ No newline at end of file
diff --git a/dependencies.gradle b/dependencies.gradle
index 030d85bfd8..3c7aaf12d8 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -1,4 +1,4 @@
 ext.versions = [
         kotlin      : '1.3.72',
-        build_gradle: '3.6.2',
+        build_gradle: '3.6.3',
 ]
diff --git a/settings.gradle b/settings.gradle
index db8941d8f2..9a87107347 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':app', ':tangem-sdk-old', ':server-android', ':tangem-card-old', ':tangem-core', ':tangem-sdk', ':tangem-demo', ':blockchain', ':blockchain-demo'
\ No newline at end of file
+include ':app', ':tangem-sdk-old', ':server-android', ':tangem-card-old', ':tangem-core', ':tangem-sdk', ':tangem-devkit', ':blockchain', ':blockchain-demo'
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/CardFilter.kt b/tangem-core/src/main/java/com/tangem/CardFilter.kt
new file mode 100644
index 0000000000..d1275d1d1d
--- /dev/null
+++ b/tangem-core/src/main/java/com/tangem/CardFilter.kt
@@ -0,0 +1,14 @@
+package com.tangem
+
+import com.tangem.common.extensions.CardType
+import java.util.*
+
+/**
+ * Filter that can be used to limit cards that can be interacted with in TangemSdk.
+ *
+ * @property allowedCardTypes Type of cards that are allowed to be interacted with in TangemSdk.
+ */
+data class CardFilter(
+
+        var allowedCardTypes: EnumSet = EnumSet.allOf(CardType::class.java)
+)
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/CardSession.kt b/tangem-core/src/main/java/com/tangem/CardSession.kt
index 450c056997..e2cbafb179 100644
--- a/tangem-core/src/main/java/com/tangem/CardSession.kt
+++ b/tangem-core/src/main/java/com/tangem/CardSession.kt
@@ -8,6 +8,7 @@ import com.tangem.common.CompletionResult
 import com.tangem.common.apdu.CommandApdu
 import com.tangem.common.apdu.ResponseApdu
 import com.tangem.common.extensions.calculateSha256
+import com.tangem.common.extensions.getType
 import com.tangem.crypto.EncryptionHelper
 import com.tangem.crypto.FastEncryptionHelper
 import com.tangem.crypto.StrongEncryptionHelper
@@ -20,7 +21,7 @@ interface CardSessionRunnable {
 
     /**
      * The starting point for custom business logic.
-     * Implement this interface and use [TangemSdk.startSession] to run.
+     * Implement this interface and use [TangemSdk.startSessionWithRunnable] to run.
      * @param session run commands in this [CardSession].
      * @param callback trigger the callback to complete the task.
      */
@@ -136,6 +137,12 @@ class CardSession(
                         callback(CompletionResult.Failure(SessionError.WrongCard()))
                         return@run
                     }
+                    val allowedCardTypes = environment.cardFilter.allowedCardTypes
+                    if (!allowedCardTypes.contains(result.data.getType())) {
+                        stopWithError(SessionError.WrongCardType())
+                        callback(CompletionResult.Failure(SessionError.WrongCardType()))
+                        return@run
+                    }
                     environment.card = result.data
                     cardId = receivedCardId
                     callback(CompletionResult.Success(result.data))
diff --git a/tangem-core/src/main/java/com/tangem/Config.kt b/tangem-core/src/main/java/com/tangem/Config.kt
index d99c57fcf9..20c5c849bd 100644
--- a/tangem-core/src/main/java/com/tangem/Config.kt
+++ b/tangem-core/src/main/java/com/tangem/Config.kt
@@ -18,16 +18,21 @@ class Config(
         the correctness of Terminal_Transaction_Signature using previously stored Terminal_PublicKey
         and, if correct, will skip security delay for the current SIGN operation.
          */
-        val linkedTerminal: Boolean = true,
+        var linkedTerminal: Boolean = true,
 
         /**
          * If not null, it will be used to validate Issuer data and issuer extra data.
          * If null, issuerPublicKey from current card will be used.
          */
-        val issuerPublicKey: ByteArray? = null,
+        var issuerPublicKey: ByteArray? = null,
 
         /**
          * Level of encryption used in communication with a Tangem Card.
          */
-        val encryptionMode: EncryptionMode = EncryptionMode.NONE
+        var encryptionMode: EncryptionMode = EncryptionMode.NONE,
+
+        /**
+         * Filter that can be used to limit cards that can be interacted with in TangemSdk.
+         */
+        val cardFilter: CardFilter = CardFilter()
 )
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
index 0dabbc74d6..c1c9a296b2 100644
--- a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
+++ b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
@@ -20,7 +20,8 @@ data class SessionEnvironment(
         val terminalKeys: KeyPair? = null,
         var encryptionMode: EncryptionMode = EncryptionMode.NONE,
         var encryptionKey: ByteArray? = null,
-        val cvc: ByteArray? = null
+        val cvc: ByteArray? = null,
+        var cardFilter: CardFilter = CardFilter()
 ) {
 
     fun setPin1(pin1: String) {
diff --git a/tangem-core/src/main/java/com/tangem/SessionError.kt b/tangem-core/src/main/java/com/tangem/SessionError.kt
index 07209b6a3f..b5f702ceb2 100644
--- a/tangem-core/src/main/java/com/tangem/SessionError.kt
+++ b/tangem-core/src/main/java/com/tangem/SessionError.kt
@@ -106,6 +106,13 @@ sealed class SessionError(val code: Int) : Exception() {
      */
     class HashSizeMustBeEqual : SessionError(3005)
 
+
+    /**
+     * This error is returned when a user scans a card of a [com.tangem.common.extensions.CardType]
+     * that is not specified in [Config.allowedCards].
+     */
+    class WrongCardType : SessionError(3006)
+
     /**
      * This error is returned when [com.tangem.TangemSdk] was called with a new [Task],
      * while a previous [Task] is still in progress.
diff --git a/tangem-core/src/main/java/com/tangem/TangemSdk.kt b/tangem-core/src/main/java/com/tangem/TangemSdk.kt
index 145efc088e..a5f90dc0ca 100644
--- a/tangem-core/src/main/java/com/tangem/TangemSdk.kt
+++ b/tangem-core/src/main/java/com/tangem/TangemSdk.kt
@@ -49,7 +49,7 @@ class TangemSdk(
      * in the form of [Card] if the task was performed successfully or [SessionError] in case of an error.
      */
     fun scanCard(initialMessage: Message? = null, callback: (result: CompletionResult) -> Unit) {
-        startSession(ScanTask(), null, initialMessage, callback)
+        startSessionWithRunnable(ScanTask(), null, initialMessage, callback)
     }
 
     /**
@@ -72,7 +72,7 @@ class TangemSdk(
      */
     fun sign(hashes: Array, cardId: String, initialMessage: Message? = null,
              callback: (result: CompletionResult) -> Unit) {
-        startSession(SignCommand(hashes), cardId, initialMessage, callback)
+        startSessionWithRunnable(SignCommand(hashes), cardId, initialMessage, callback)
     }
 
     /**
@@ -90,7 +90,7 @@ class TangemSdk(
      */
     fun readIssuerData(cardId: String, initialMessage: Message? = null,
                        callback: (result: CompletionResult) -> Unit) {
-        startSession(ReadIssuerDataCommand(config.issuerPublicKey), cardId, initialMessage, callback)
+        startSessionWithRunnable(ReadIssuerDataCommand(config.issuerPublicKey), cardId, initialMessage, callback)
     }
 
     /**
@@ -109,7 +109,7 @@ class TangemSdk(
      */
     fun readIssuerExtraData(cardId: String,
                             callback: (result: CompletionResult) -> Unit) {
-        startSession(ReadIssuerExtraDataCommand(config.issuerPublicKey), cardId, null, callback)
+        startSessionWithRunnable(ReadIssuerExtraDataCommand(config.issuerPublicKey), cardId, null, callback)
     }
 
     /**
@@ -140,7 +140,7 @@ class TangemSdk(
                 issuerDataCounter,
                 config.issuerPublicKey
         )
-        startSession(command, cardId, initialMessage, callback)
+        startSessionWithRunnable(command, cardId, initialMessage, callback)
     }
 
     /**
@@ -179,7 +179,7 @@ class TangemSdk(
                 issuerDataCounter,
                 config.issuerPublicKey
         )
-        startSession(command, cardId, initialMessage, callback)
+        startSessionWithRunnable(command, cardId, initialMessage, callback)
     }
 
     /**
@@ -206,7 +206,7 @@ class TangemSdk(
             callback: (result: CompletionResult) -> Unit
     ) {
         val command = WriteUserDataCommand(userData, userProtectedData, userCounter, userProtectedCounter)
-        startSession(command, cardId, initialMessage, callback)
+        startSessionWithRunnable(command, cardId, initialMessage, callback)
     }
 
     /**
@@ -228,7 +228,7 @@ class TangemSdk(
      */
     fun readUserData(cardId: String, initialMessage: Message? = null,
                      callback: (result: CompletionResult) -> Unit) {
-        startSession(ReadUserDataCommand(), cardId, initialMessage, callback)
+        startSessionWithRunnable(ReadUserDataCommand(), cardId, initialMessage, callback)
     }
 
     /**
@@ -250,7 +250,7 @@ class TangemSdk(
      */
     fun createWallet(cardId: String, initialMessage: Message? = null,
                      callback: (result: CompletionResult) -> Unit) {
-        startSession(CreateWalletTask(), cardId, initialMessage, callback)
+        startSessionWithRunnable(CreateWalletTask(), cardId, initialMessage, callback)
     }
 
     /**
@@ -269,7 +269,7 @@ class TangemSdk(
      */
     fun purgeWallet(cardId: String, initialMessage: Message? = null,
                     callback: (result: CompletionResult) -> Unit) {
-        startSession(PurgeWalletCommand(), cardId, initialMessage, callback)
+        startSessionWithRunnable(PurgeWalletCommand(), cardId, initialMessage, callback)
     }
 
     /**
@@ -287,7 +287,7 @@ class TangemSdk(
      * */
     fun depersonalize(cardId: String, initialMessage: Message? = null,
                       callback: (result: CompletionResult) -> Unit) {
-        startSession(DepersonalizeCommand(), cardId, initialMessage, callback)
+        startSessionWithRunnable(DepersonalizeCommand(), cardId, initialMessage, callback)
     }
 
     /**
@@ -313,7 +313,7 @@ class TangemSdk(
                     initialMessage: Message? = null,
                     callback: (result: CompletionResult) -> Unit) {
         val command = PersonalizeCommand(config, issuer, manufacturer, acquirer)
-        startSession(command, null, initialMessage, callback)
+        startSessionWithRunnable(command, null, initialMessage, callback)
     }
 
     /**
@@ -330,7 +330,7 @@ class TangemSdk(
      * If null, default message will be used.
      *  @callback: Standard [TangemSdk] callback.
      */
-    fun  startSession(
+    fun  startSessionWithRunnable(
             runnable: CardSessionRunnable, cardId: String? = null, initialMessage: Message? = null,
             callback: (result: CompletionResult) -> Unit) {
         val cardSession = CardSession(buildEnvironment(), reader, viewDelegate, cardId, initialMessage)
@@ -349,8 +349,7 @@ class TangemSdk(
      * @callback: At first, you should check that the [SessionError] is not null,
      * then you can use the [CardSession] to interact with a card.
      */
-    fun  startSession(
-            cardId: String? = null, initialMessage: Message? = null,
+    fun startSession(cardId: String? = null, initialMessage: Message? = null,
             callback: (session: CardSession, error: SessionError?) -> Unit) {
         val cardSession = CardSession(buildEnvironment(), reader, viewDelegate, cardId, initialMessage)
         Thread().run { cardSession.start(callback) }
@@ -367,7 +366,8 @@ class TangemSdk(
     private fun buildEnvironment(): SessionEnvironment {
         val terminalKeys = if (config.linkedTerminal) terminalKeysService?.getKeys() else null
         return SessionEnvironment(
-                terminalKeys = terminalKeys
+                terminalKeys = terminalKeys,
+                cardFilter = config.cardFilter
         )
     }
 
diff --git a/tangem-core/src/main/java/com/tangem/commands/ReadIssuerExtraDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/ReadIssuerExtraDataCommand.kt
index 4140000621..db748d8ec5 100644
--- a/tangem-core/src/main/java/com/tangem/commands/ReadIssuerExtraDataCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/ReadIssuerExtraDataCommand.kt
@@ -44,7 +44,7 @@ class ReadIssuerExtraDataResponse(
         val issuerDataSignature: ByteArray?,
 
         /**
-         * An optional counter that protect issuer data against replay attack.
+         * An optional counter that protects issuer data against replay attack.
          * When flag [Settings.ProtectIssuerDataAgainstReplay] set in [SettingsMask]
          * then this value is mandatory and must increase on each execution of [WriteIssuerDataCommand].
          */
diff --git a/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt
index e9771d0b87..7b43e879e7 100644
--- a/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt
@@ -17,7 +17,7 @@ class WriteUserDataResponse(
 ) : CommandResponse
 
 /**
- * This command write some of User_Data, User_ProtectedData, User_Counter and User_ProtectedCounter fields.
+ * This command writes to the card any of User_Data, User_ProtectedData, User_Counter and User_ProtectedCounter fields.
  * User_Data and User_ProtectedData are never changed or parsed by the executable code the Tangem COS.
  * The App defines purpose of use, format and it's payload. For example, this field may contain cashed information
  * from blockchain to accelerate preparing new transaction.
diff --git a/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt b/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
index 2cfd173be1..4417374a87 100644
--- a/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
@@ -12,6 +12,7 @@ data class NdefRecord(
         URI, AAR, TEXT
     }
 
+    @delegate:Transient
     val valueInBytes: ByteArray by lazy { value.toByteArray() }
 }
 
diff --git a/tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt b/tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt
new file mode 100644
index 0000000000..6d23ffee09
--- /dev/null
+++ b/tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt
@@ -0,0 +1,7 @@
+package com.tangem.common.extensions
+
+import java.math.BigDecimal
+
+fun BigDecimal.isZero() : Boolean {
+    return this.compareTo(BigDecimal.ZERO) == 0
+}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt b/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt
new file mode 100644
index 0000000000..97243f3655
--- /dev/null
+++ b/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt
@@ -0,0 +1,22 @@
+package com.tangem.common.extensions
+
+import com.tangem.commands.Card
+
+fun Card.getType(): CardType {
+    val firmware = this.firmwareVersion ?: return CardType.Unknown
+    return when {
+        firmware.endsWith("d SDK") -> {
+            CardType.Sdk
+        }
+        firmware.endsWith("r") -> {
+            CardType.Release
+        }
+        else -> {
+            CardType.Unknown
+        }
+    }
+}
+
+enum class CardType {
+    Sdk, Release, Unknown
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt
deleted file mode 100644
index 5e517808f2..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.tangem.tangemtest._arch.structure
-
-/**
-[REDACTED_AUTHOR]
- */
-interface Id
-
-class StringId(val value: String) : Id
-
-class StringResId(val value: Int) : Id
-
-enum class Additional : Id {
-    UNDEFINED,
-    JSON_INCOMING,
-    JSON_OUTGOING,
-    JSON_TAILS,
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt
deleted file mode 100644
index 2ed1e1ab8f..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.tangem.tangemtest._arch.widget
-
-import android.view.ViewGroup
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
-
-/**
-[REDACTED_AUTHOR]
- */
-interface ItemWidgetBuilder {
-    fun build(item: BaseItem, parent: ViewGroup): ViewWidget?
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt
deleted file mode 100644
index 1b832e362a..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.tangem.tangemtest._arch.widget.impl
-
-import android.view.ViewGroup
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel
-import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget
-
-/**
-[REDACTED_AUTHOR]
- */
-class StubWidget(id: Id, parent: ViewGroup) : BaseViewWidget(parent, BaseItem(id, BaseItemViewModel())) {
-    override fun getLayoutId(): Int = R.layout.w_empty
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt
deleted file mode 100644
index ab8c84334b..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-package com.tangem.tangemtest.extensions
-
-import android.app.Application
-import android.content.Context
-import com.tangem.commands.*
-import com.tangem.commands.personalization.entities.CardConfig
-import com.tangem.commands.personalization.entities.NdefRecord
-import java.util.*
-
-fun CardConfig.Companion.create(application: Application): CardConfig {
-
-    val preferences = application.getSharedPreferences("prefs", Context.MODE_PRIVATE)
-
-    val signingMethodMaskBuilder = SigningMethodMaskBuilder()
-    if (preferences.getBoolean("personalization_SigningMethod_0", false)) {
-        signingMethodMaskBuilder.add(SigningMethod.SignHash)
-    }
-    if (preferences.getBoolean("personalization_SigningMethod_1", false)) {
-        signingMethodMaskBuilder.add(SigningMethod.SignRaw)
-    }
-    if (preferences.getBoolean("personalization_SigningMethod_2", false)) {
-        signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuer)
-    }
-    if (preferences.getBoolean("personalization_SigningMethod_3", false)) {
-        signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuer)
-    }
-    if (preferences.getBoolean("personalization_SigningMethod_4", false)) {
-        signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuerWriteIssuerData)
-    }
-    if (preferences.getBoolean("personalization_SigningMethod_5", false)) {
-        signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuerWriteIssuerData)
-    }
-    if (preferences.getBoolean("personalization_SigningMethod_6", false)) {
-        signingMethodMaskBuilder.add(SigningMethod.SignHash)
-    }
-    val signingMethod = signingMethodMaskBuilder.build()
-
-    val isNote = preferences.getBoolean("personalization_ProductMask_IsNote", true)
-    val isTag = preferences.getBoolean("personalization_ProductMask_IsTag", false)
-    val isIdCard = preferences.getBoolean("personalization_ProductMask_IsIDCard", false)
-
-    val productMaskBuilder = ProductMaskBuilder()
-    if (isNote) productMaskBuilder.add(Product.Note)
-    if (isTag) productMaskBuilder.add(Product.Tag)
-    if (isIdCard) productMaskBuilder.add(Product.IdCard)
-    val productMask = productMaskBuilder.build()
-
-    var tokenSymbol: String? = null
-    var tokenContractAddress: String? = null
-    var tokenDecimal: Int? = null
-    if (preferences.getBoolean("personalization_isToken", false)) {
-        tokenSymbol = preferences.getString("personalization_token_symbol", "")
-        tokenContractAddress = preferences.getString("personalization_token_contract_address", "")
-        tokenDecimal = preferences.getString("personalization_token_decimal", "")!!.toInt()
-    }
-
-    val cardData = CardData(
-            blockchainName = preferences.getString("personalization_Blockchain", "BTC"),
-            batchId = preferences.getString("personalization_card_batch", "FFFF"),
-            productMask = productMask,
-            tokenSymbol = tokenSymbol,
-            tokenContractAddress = tokenContractAddress,
-            tokenDecimal = tokenDecimal,
-            issuerName = null,
-            manufactureDateTime = Calendar.getInstance().time,
-            manufacturerSignature = null)
-
-
-    val ndefAar = preferences.getString("personalization_NDEF_AAR", "Release APP")
-    val ndefUri = preferences.getString("personalization_NDEF_URI", "https://tangem.com")
-
-    val ndefs = mutableListOf()
-    if (!ndefUri.isNullOrEmpty()) {
-        ndefs.add(NdefRecord(NdefRecord.Type.URI, ndefUri))
-    }
-    if (ndefAar != "None") {
-        val type = NdefRecord.Type.AAR
-        val value = when (ndefAar) {
-            "Debug APP" -> {
-                "com.tangem.wallet.debug"
-            }
-            "Release APP" -> {
-                "com.tangem.wallet"
-            }
-            "--- CUSTOM ---" -> {
-                preferences.getString("personalization_NDEF_CUSTOM_AAR", "com.tangem.wallet")!!
-            }
-            else -> ""
-        }
-        ndefs.add(NdefRecord(type, value))
-    }
-
-    return CardConfig(
-            cardData = cardData,
-            curveID = EllipticCurve.byName(preferences.getString("personalization_CurveId", "secp256k1")!!)
-                    ?: EllipticCurve.Secp256k1,
-            signingMethods = signingMethod,
-            createWallet = preferences.getBoolean("personalization_CreateWallet", true),
-            maxSignatures = preferences.getString("personalization_MaxSignatures", "1000")!!.toInt(),
-            isReusable = preferences.getBoolean("personalization_SettingsMask_IsReusable", true),
-            protocolAllowUnencrypted = preferences.getBoolean("personalization_SettingsMask_AllowEncryption_None", true),
-            protocolAllowStaticEncryption = preferences.getBoolean("personalization_SettingsMask_AllowEncryption_Fast", true),
-            useActivation = preferences.getBoolean("personalization_SettingsMask_NeedActivation", false),
-
-            useOneCommandAtTime = preferences.getBoolean("personalization_SettingsMask_OneApduAtOnce", false),
-            useCvc = preferences.getBoolean("personalization_SettingsMask_UseCVC", false),
-            useBlock = preferences.getBoolean("personalization_SettingsMask_UseBlock", false),
-            allowSwapPin = preferences.getBoolean("personalization_SettingsMask_AllowSwapPIN", true),
-            allowSwapPin2 = preferences.getBoolean("personalization_SettingsMask_AllowSwapPIN2", true),
-            useNdef = preferences.getBoolean("personalization_SettingsMask_UseNDEF", true),
-            useDynamicNdef = preferences.getBoolean("personalization_SettingsMask_UseDynamicNDEF", true),
-            protectIssuerDataAgainstReplay = preferences.getBoolean("personalization_SettingsMask_ProtectIssuerDataAgainstReplay", true),
-            forbidDefaultPin = preferences.getBoolean("personalization_SettingsMask_ForbidDefaultPIN", false),
-            smartSecurityDelay = preferences.getBoolean("personalization_SettingsMask_SmartSecurityDelay", false),
-            pauseBeforePin2 = preferences.getString("personalization_PauseBeforePIN2", "15")!!.toInt() * 1000,
-            allowSelectBlockchain = preferences.getBoolean("personalization_SettingsMask_AllowSelectBlockchain", false),
-            forbidPurgeWallet = preferences.getBoolean("personalization_SettingsMask_ForbidPurgeWallet", false)
-                    ?: false,
-            disablePrecomputedNdef = preferences.getBoolean("personalization_SettingsMask_DisablePrecomputedNDEF", false)
-                    ?: false,
-            skipSecurityDelayIfValidatedByIssuer = preferences.getBoolean("personalization_SettingsMask_SkipSecurityDelayIfValidatedByIssuer", true),
-            skipCheckPIN2andCVCIfValidatedByIssuer = preferences.getBoolean("personalization_SettingsMask_SkipCheckPIN2andCVCIfValidatedByIssuer", true),
-
-            skipSecurityDelayIfValidatedByLinkedTerminal = preferences.getBoolean("personalization_SettingsMask_SkipSecurityDelayIfValidatedByLinkedTerminal", true),
-            restrictOverwriteIssuerDataEx = preferences.getBoolean("personalization_SettingsMask_RestrictOverwriteIssuerDataEx", true),
-
-            requireTerminalTxSignature = preferences.getBoolean("personalization_SettingsMask_RequireTerminalTxSignature", false),
-            requireTerminalCertSignature = preferences.getBoolean("personalization_SettingsMask_RequireTerminalCertSignature", false),
-            checkPin3onCard = preferences.getBoolean("personalization_SettingsMask_CheckPIN3onCard", true),
-
-            cvc = preferences.getString("personalization_cvc", "000") ?: "000",
-            pin = preferences.getString("personalization_pin", "000000") ?: "000000",
-            pin2 = preferences.getString("personalization_pin2", "000") ?: "000",
-            pin3 = preferences.getString("personalization_pin3", "123") ?: "123",
-            hexCrExKey = preferences.getString("personalization_CrEx_Key", "00112233445566778899AABBCCDDEEFFFFEEDDCCBBAA998877665544332211000000111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF"),
-
-            ndefRecords = ndefs
-    )
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt
deleted file mode 100644
index 457b4baac3..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.actions
-
-import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.findItem
-import com.tangem.tangemtest._arch.structure.impl.EditTextItem
-import com.tangem.tangemtest._arch.structure.impl.NumberItem
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
-import com.tangem.tangemtest.ucase.tunnel.ActionView
-import com.tangem.tangemtest.ucase.tunnel.ItemError
-import com.tangem.tangemtest.ucase.variants.personalize.CardNumber
-import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter
-import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigToCardConfig
-import com.tangem.tangemtest.ucase.variants.personalize.dto.DefaultPersonalizationParams
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
-import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
-
-/**
-[REDACTED_AUTHOR]
- */
-class PersonalizeAction : BaseAction() {
-    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
-        val itemList = attrs.payload[PayloadKey.itemList] as? List ?: return
-        val actionView = attrs.payload[PayloadKey.actionView] as? ActionView ?: return
-
-        if (!checkSeries(itemList)) {
-            actionView.showSnackbar(ItemError.BadSeries)
-            return
-        }
-        if (!checkNumber(itemList)) {
-            actionView.showSnackbar(ItemError.BadCardNumber)
-            return
-        }
-
-        val issuer = DefaultPersonalizationParams.issuer()
-        val acquirer = DefaultPersonalizationParams.acquirer()
-        val manufacturer = DefaultPersonalizationParams.manufacturer()
-
-        val personalizeConfig = PersonalizationConfigConverter().convert(itemList, PersonalizationConfig.default())
-        val cardConfig = PersonalizationConfigToCardConfig().convert(personalizeConfig)
-
-        attrs.tangemSdk.personalize(cardConfig, issuer, manufacturer, acquirer) {
-            handleResult(payload, it, null, attrs, callback)
-        }
-    }
-
-    private fun checkSeries(itemList: List): Boolean {
-        val seriesItem = itemList.findItem(CardNumber.Series) as? EditTextItem ?: return false
-        val data = seriesItem.getData() as? String ?: return false
-
-        seriesItem.setData(data.toUpperCase())
-        return data.length == 2 || data.length == 4
-    }
-
-    private fun checkNumber(itemList: List): Boolean {
-        val seriesItem = itemList.findItem(CardNumber.Series) as? EditTextItem ?: return false
-        val numberItem = itemList.findItem(CardNumber.Number) as? NumberItem ?: return false
-        val seriesData = seriesItem.getData() as? String ?: return false
-        val numberData = stringOf(numberItem.getData() as? Number)
-
-        return if (seriesData.length == 2 && numberData.length > 13) false
-        else !(seriesData.length == 4 && numberData.length > 11)
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
deleted file mode 100644
index 4a9c0b0572..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
-
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.OnLifecycleEvent
-import com.tangem.TangemSdk
-import com.tangem.tangemtest.commons.Store
-import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
-
-/**
-[REDACTED_AUTHOR]
- */
-class PersonalizationItemsManager(
-        private val store: Store
-) : BaseItemsManager(PersonalizeAction()) {
-
-    private val converter = PersonalizationConfigConverter()
-
-    init {
-        val config = store.restore()
-        setItems(converter.convert(config))
-    }
-
-    override fun invokeMainAction(tangemSdk: TangemSdk, callback: ActionCallback) {
-        action.executeMainAction(this, getAttrsForAction(tangemSdk), callback)
-    }
-
-    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
-    fun onDestroy() {
-        val config = converter.convert(itemList, PersonalizationConfig.default())
-        store.save(config)
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt
deleted file mode 100644
index c892b6761b..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
-
-import com.tangem.tangemtest._arch.structure.impl.EditTextItem
-import com.tangem.tangemtest.ucase.domain.actions.DepersonalizeAction
-import com.tangem.tangemtest.ucase.domain.actions.ScanAction
-import com.tangem.tangemtest.ucase.domain.actions.SignAction
-import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.SignScanConsequence
-import com.tangem.tangemtest.ucase.variants.TlvId
-
-/**
-[REDACTED_AUTHOR]
- */
-class ScanItemsManager : BaseItemsManager(ScanAction())
-
-class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) {
-
-    init {
-        setItems(listOf(EditTextItem(TlvId.CardId, null)))
-    }
-}
-
-class SignItemsManager : BaseItemsManager(SignAction()) {
-
-    init {
-        setItemChangeConsequences(SignScanConsequence())
-        setItems(listOf(
-                EditTextItem(TlvId.CardId, null),
-                EditTextItem(TlvId.TransactionOutHash, "Data used for hashing")
-        ))
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
deleted file mode 100644
index bb771e86f6..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence
-
-import com.tangem.commands.Card
-import com.tangem.commands.EllipticCurve
-import com.tangem.common.extensions.calculateSha256
-import com.tangem.common.extensions.calculateSha512
-import com.tangem.common.extensions.toHexString
-import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.findItem
-import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
-import com.tangem.tangemtest.ucase.tunnel.ActionView
-import com.tangem.tangemtest.ucase.variants.TlvId
-import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI
-
-/**
-[REDACTED_AUTHOR]
- *
- * The ParamsChangeConsequence class family modifies parameters depending on the state
- * of the incoming parameter
- */
-interface ItemsChangeConsequence {
-    fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List?
-}
-
-class SignScanConsequence : ItemsChangeConsequence {
-
-    override fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List? {
-        if (changedItem.id != TlvId.CardId) return null
-
-        val hashItem = itemList.findItem(TlvId.TransactionOutHash) ?: return null
-        val affectedItems = mutableListOf(hashItem)
-        val card = payload.remove(PayloadKey.card) as Card?
-        if (card == null) {
-            hashItem.restoreDefaultData()
-            postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.enableActionFab(false) }
-        } else {
-            val dataForHashing = hashItem.getData() as? String ?: "Any data mother...s"
-            val hashedData = when (card.curve) {
-                EllipticCurve.Secp256k1 -> dataForHashing.calculateSha256()
-                EllipticCurve.Ed25519 -> dataForHashing.calculateSha512()
-                else -> return null
-            }
-            hashItem.setData(hashedData.toHexString())
-        }
-        return affectedItems.toList()
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt
deleted file mode 100644
index a45bc55ed4..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt
+++ /dev/null
@@ -1,134 +0,0 @@
-package com.tangem.tangemtest.ucase.resources.initializers
-
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest.ucase.resources.ResourceHolder
-import com.tangem.tangemtest.ucase.resources.Resources
-import com.tangem.tangemtest.ucase.variants.personalize.*
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.TypedHolder
-
-/**
-[REDACTED_AUTHOR]
- */
-class PersonalizationResources() {
-    fun init(holder: ResourceHolder) {
-        initBlock(holder)
-        initCardNumber(holder)
-        initCommon(holder)
-        initSigningMethod(holder)
-        initSignHashExProp(holder)
-        initDenomination(holder)
-        initToken(holder)
-        initProductMask(holder)
-        initSettingsMask(holder)
-        initSettingsMaskProtocolEnc(holder)
-        initSettingsMaskNdef(holder)
-        initPins(holder)
-    }
-
-    private fun initBlock(holder: TypedHolder) {
-        holder.register(BlockId.CardNumber, Resources(R.string.pers_block_card_number, R.string.info_pers_block_card_number))
-        holder.register(BlockId.Common, Resources(R.string.pers_block_common, R.string.info_pers_block_common))
-        holder.register(BlockId.SigningMethod, Resources(R.string.pers_block_signing_method, R.string.info_pers_block_signing_method))
-        holder.register(BlockId.SignHashExProp, Resources(R.string.pers_block_sign_hash_ex_prop, R.string.info_pers_block_sign_hash_ex_prop))
-        holder.register(BlockId.Denomination, Resources(R.string.pers_block_denomination, R.string.info_pers_block_denomination))
-        holder.register(BlockId.Token, Resources(R.string.pers_block_token, R.string.info_pers_block_token))
-        holder.register(BlockId.ProdMask, Resources(R.string.pers_block_product_mask, R.string.info_pers_block_product_mask))
-        holder.register(BlockId.SettingsMask, Resources(R.string.pers_block_settings_mask, R.string.info_pers_block_settings_mask))
-        holder.register(BlockId.SettingsMaskProtocolEnc, Resources(R.string.pers_block_settings_mask_protocol_enc, R.string.info_pers_block_settings_mask_protocol_enc))
-        holder.register(BlockId.SettingsMaskNdef, Resources(R.string.pers_block_settings_mask_ndef, R.string.info_pers_block_settings_mask_ndef))
-        holder.register(BlockId.Pins, Resources(R.string.pers_block_pins, R.string.info_pers_block_pins))
-    }
-
-    private fun initCardNumber(holder: TypedHolder) {
-        holder.register(CardNumber.Series, Resources(R.string.pers_item_series, R.string.info_pers_item_series))
-        holder.register(CardNumber.Number, Resources(R.string.pers_item_number, R.string.info_pers_item_number))
-        holder.register(CardNumber.BatchId, Resources(R.string.pers_item_batch_id, R.string.info_pers_item_batch_id))
-    }
-
-    private fun initCommon(holder: TypedHolder) {
-        holder.register(Common.Curve, Resources(R.string.pers_item_curve, R.string.info_pers_item_curve))
-        holder.register(Common.Blockchain, Resources(R.string.pers_item_blockchain, R.string.info_pers_item_blockchain))
-        holder.register(Common.BlockchainCustom, Resources(R.string.pers_item_custom_blockchain, R.string.info_pers_item_custom_blockchain))
-        holder.register(Common.MaxSignatures, Resources(R.string.pers_item_max_signatures, R.string.info_pers_item_max_signatures))
-        holder.register(Common.CreateWallet, Resources(R.string.pers_item_create_wallet, R.string.info_pers_item_create_wallet))
-    }
-
-    private fun initSigningMethod(holder: TypedHolder) {
-        holder.register(SigningMethod.SignTx, Resources(R.string.pers_item_sign_tx_hashes, R.string.info_pers_item_sign_tx_hashes))
-        holder.register(SigningMethod.SignTxRaw, Resources(R.string.pers_item_sign_raw_tx, R.string.info_pers_item_sign_raw_tx))
-        holder.register(SigningMethod.SignValidatedTx, Resources(R.string.pers_item_sign_validated_tx_hashes, R.string.info_pers_item_sign_validated_tx_hashes))
-        holder.register(SigningMethod.SignValidatedTxRaw, Resources(R.string.pers_item_sign_validated_raw_tx, R.string.info_pers_item_sign_validated_raw_tx))
-        holder.register(SigningMethod.SignValidatedTxIssuer, Resources(R.string.pers_item_sign_validated_tx_hashes_with_iss_data, R.string.info_pers_item_sign_validated_tx_hashes_with_iss_data))
-        holder.register(SigningMethod.SignValidatedTxRawIssuer, Resources(R.string.pers_item_sign_validated_raw_tx_with_iss_data, R.string.info_pers_item_sign_validated_raw_tx_with_iss_data))
-        holder.register(SigningMethod.SignExternal, Resources(R.string.pers_item_sign_hash_ex, R.string.info_pers_item_sign_hash_ex))
-    }
-
-    private fun initSignHashExProp(holder: TypedHolder) {
-        holder.register(SignHashExProp.PinLessFloorLimit, Resources(R.string.pers_item_pin_less_floor_limit, R.string.info_pers_item_pin_less_floor_limit))
-        holder.register(SignHashExProp.CryptoExKey, Resources(R.string.pers_item_cr_ex_key, R.string.info_pers_item_cr_ex_key))
-        holder.register(SignHashExProp.RequireTerminalCertSig, Resources(R.string.pers_item_require_terminal_cert_sig, R.string.info_pers_item_require_terminal_cert_sig))
-        holder.register(SignHashExProp.RequireTerminalTxSig, Resources(R.string.pers_item_require_terminal_tx_sig, R.string.info_pers_item_require_terminal_tx_sig))
-        holder.register(SignHashExProp.CheckPin3, Resources(R.string.pers_item_check_pin3_on_card, R.string.info_pers_item_check_pin3_on_card))
-    }
-
-    private fun initDenomination(holder: TypedHolder) {
-        holder.register(Denomination.WriteOnPersonalize, Resources(R.string.pers_item_write_on_personalize, R.string.info_pers_item_write_on_personalize))
-        holder.register(Denomination.Denomination, Resources(R.string.pers_item_denomination, R.string.info_pers_item_denomination))
-    }
-
-    private fun initToken(holder: TypedHolder) {
-        holder.register(Token.ItsToken, Resources(R.string.pers_item_its_token, R.string.info_pers_item_its_token))
-        holder.register(Token.Symbol, Resources(R.string.pers_item_symbol, R.string.info_pers_item_symbol))
-        holder.register(Token.ContractAddress, Resources(R.string.pers_item_contract_address, R.string.info_pers_item_contract_address))
-        holder.register(Token.Decimal, Resources(R.string.pers_item_decimal, R.string.info_pers_item_decimal))
-    }
-
-    private fun initProductMask(holder: TypedHolder) {
-        holder.register(ProductMask.Note, Resources(R.string.pers_item_note, R.string.info_pers_item_note))
-        holder.register(ProductMask.Tag, Resources(R.string.pers_item_tag, R.string.info_pers_item_tag))
-        holder.register(ProductMask.IdCard, Resources(R.string.pers_item_id_card, R.string.info_pers_item_id_card))
-        holder.register(ProductMask.IdIssuerCard, Resources(R.string.pers_item_id_issuer_card, R.string.info_pers_item_id_issuer_card))
-    }
-
-    private fun initSettingsMask(holder: TypedHolder) {
-        holder.register(SettingsMask.IsReusable, Resources(R.string.pers_item_is_reusable, R.string.info_pers_item_is_reusable))
-        holder.register(SettingsMask.NeedActivation, Resources(R.string.pers_item_need_activation, R.string.info_pers_item_need_activation))
-        holder.register(SettingsMask.ForbidPurge, Resources(R.string.pers_item_forbid_purge, R.string.info_pers_item_forbid_purge))
-        holder.register(SettingsMask.AllowSelectBlockchain, Resources(R.string.pers_item_allow_select_blockchain, R.string.info_pers_item_allow_select_blockchain))
-        holder.register(SettingsMask.UseBlock, Resources(R.string.pers_item_use_block, R.string.info_pers_item_use_block))
-        holder.register(SettingsMask.OneApdu, Resources(R.string.pers_item_one_apdu_at_once, R.string.info_pers_item_one_apdu_at_once))
-        holder.register(SettingsMask.UseCvc, Resources(R.string.pers_item_use_cvc, R.string.info_pers_item_use_cvc))
-        holder.register(SettingsMask.AllowSwapPin, Resources(R.string.pers_item_allow_swap_pin, R.string.info_pers_item_allow_swap_pin))
-        holder.register(SettingsMask.AllowSwapPin2, Resources(R.string.pers_item_allow_swap_pin2, R.string.info_pers_item_allow_swap_pin2))
-        holder.register(SettingsMask.ForbidDefaultPin, Resources(R.string.pers_item_forbid_default_pin, R.string.info_pers_item_forbid_default_pin))
-        holder.register(SettingsMask.SmartSecurityDelay, Resources(R.string.pers_item_smart_security_delay, R.string.info_pers_item_smart_security_delay))
-        holder.register(SettingsMask.ProtectIssuerDataAgainstReplay, Resources(R.string.pers_item_protect_issuer_data_against_replay, R.string.info_pers_item_protect_issuer_data_against_replay))
-        holder.register(SettingsMask.SkipSecurityDelayIfValidated, Resources(R.string.pers_item_skip_security_delay_if_validated, R.string.info_pers_item_skip_security_delay_if_validated))
-        holder.register(SettingsMask.SkipPin2CvcIfValidated, Resources(R.string.pers_item_skip_pin2_and_cvc_if_validated, R.string.info_pers_item_skip_pin2_and_cvc_if_validated))
-        holder.register(SettingsMask.SkipSecurityDelayOnLinkedTerminal, Resources(R.string.pers_item_skip_security_delay_on_linked_terminal, R.string.info_pers_item_skip_security_delay_on_linked_terminal))
-        holder.register(SettingsMask.RestrictOverwriteExtraIssuerData, Resources(R.string.pers_item_restrict_overwrite_ex_issuer_data, R.string.info_pers_item_restrict_overwrite_ex_issuer_data))
-    }
-
-    private fun initSettingsMaskProtocolEnc(holder: TypedHolder) {
-        holder.register(SettingsMaskProtocolEnc.AllowUnencrypted, Resources(R.string.pers_item_allow_unencrypted, R.string.info_pers_item_allow_unencrypted))
-        holder.register(SettingsMaskProtocolEnc.AllowStaticEncryption, Resources(R.string.pers_item_allow_fast_encryption, R.string.info_pers_item_allow_fast_encryption))
-    }
-
-    private fun initSettingsMaskNdef(holder: TypedHolder) {
-        holder.register(SettingsMaskNdef.UseNdef, Resources(R.string.pers_item_use_ndef, R.string.info_pers_item_use_ndef))
-        holder.register(SettingsMaskNdef.DynamicNdef, Resources(R.string.pers_item_dynamic_ndef, R.string.info_pers_item_dynamic_ndef))
-        holder.register(SettingsMaskNdef.DisablePrecomputedNdef, Resources(R.string.pers_item_disable_precomputed_ndef, R.string.info_pers_item_disable_precomputed_ndef))
-        holder.register(SettingsMaskNdef.Aar, Resources(R.string.pers_item_aar, R.string.info_pers_item_aar))
-        holder.register(SettingsMaskNdef.AarCustom, Resources(R.string.pers_item_custom_aar_package_name, R.string.info_pers_item_custom_aar_package_name))
-        holder.register(SettingsMaskNdef.Uri, Resources(R.string.pers_item_uri, R.string.info_pers_item_uri))
-    }
-
-    private fun initPins(holder: TypedHolder) {
-        holder.register(Pins.Pin, Resources(R.string.pers_item_pin, R.string.info_pers_item_pin))
-        holder.register(Pins.Pin2, Resources(R.string.pers_item_pin2, R.string.info_pers_item_pin2))
-        holder.register(Pins.Pin3, Resources(R.string.pers_item_pin3, R.string.info_pers_item_pin3))
-        holder.register(Pins.Cvc, Resources(R.string.pers_item_cvc, R.string.info_pers_item_cvc))
-        holder.register(Pins.PauseBeforePin2, Resources(R.string.pers_item_pause_before_pin2, R.string.info_pers_item_pause_before_pin2))
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt
deleted file mode 100644
index 4de4ab008f..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.tangem.tangemtest.ucase.resources.initializers
-
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest.ucase.resources.MainResourceHolder
-import com.tangem.tangemtest.ucase.resources.Resources
-import com.tangem.tangemtest.ucase.variants.TlvId
-
-/**
-[REDACTED_AUTHOR]
- */
-class TlvResources {
-    fun init(holder: MainResourceHolder) {
-        initScan(holder)
-    }
-
-    private fun initScan(holder: MainResourceHolder) {
-        holder.register(TlvId.CardId, Resources(R.string.tlv_card_id, R.string.info_tlv_card_id))
-        holder.register(TlvId.TransactionOutHash, Resources(R.string.tlv_transaction_out_hash, R.string.info_tlv_transaction_out_hash))
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt
deleted file mode 100644
index 13f4ddcf27..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.tangem.tangemtest.ucase.variants
-
-import com.tangem.tangemtest._arch.structure.Id
-
-/**
-[REDACTED_AUTHOR]
- */
-enum class TlvId : Id {
-    CardId,
-    TransactionOutHash,
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
deleted file mode 100644
index 107ab9b3b3..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.depersonalize.ui
-
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.managers.DepersonalizeItemsManager
-import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
-
-/**
-[REDACTED_AUTHOR]
- */
-class DepersonalizeActionFragment : BaseCardActionFragment() {
-
-    override val itemsManager: ItemsManager by lazy { DepersonalizeItemsManager() }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt
deleted file mode 100644
index 2f406d98c3..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt
+++ /dev/null
@@ -1,137 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter
-
-import com.tangem.commands.EllipticCurve
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.KeyValue
-import com.tangem.tangemtest.ucase.variants.personalize.*
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
-
-/**
-[REDACTED_AUTHOR]
- */
-class ConfigValuesHolder : BaseTypedHolder() {
-
-    // All registered association values can't be objects
-    fun init(default: PersonalizationConfig) {
-        register(CardNumber.Series, Value(default.series))
-        register(CardNumber.Number, Value(default.startNumber))
-        register(CardNumber.BatchId, Value(default.batchId))
-        register(Common.Curve, Value(default.curveID, Helper.listOfCurves()))
-        register(Common.Blockchain, Value(default.blockchain, Helper.listOfBlockchain()))
-        register(Common.BlockchainCustom, Value(default.blockchainCustom))
-        register(Common.MaxSignatures, Value(default.MaxSignatures))
-        register(Common.CreateWallet, Value(default.createWallet))
-        register(SigningMethod.SignTx, Value(default.SigningMethod0))
-        register(SigningMethod.SignTxRaw, Value(default.SigningMethod1))
-        register(SigningMethod.SignValidatedTx, Value(default.SigningMethod2))
-        register(SigningMethod.SignValidatedTxRaw, Value(default.SigningMethod3))
-        register(SigningMethod.SignValidatedTxIssuer, Value(default.SigningMethod4))
-        register(SigningMethod.SignValidatedTxRawIssuer, Value(default.SigningMethod5))
-        register(SigningMethod.SignExternal, Value(default.SigningMethod6))
-        register(SignHashExProp.PinLessFloorLimit, Value(default.pinLessFloorLimit))
-        register(SignHashExProp.CryptoExKey, Value(default.hexCrExKey))
-        register(SignHashExProp.RequireTerminalCertSig, Value(default.requireTerminalCertSignature))
-        register(SignHashExProp.RequireTerminalTxSig, Value(default.requireTerminalTxSignature))
-        register(SignHashExProp.CheckPin3, Value(default.checkPIN3onCard))
-        register(Denomination.WriteOnPersonalize, Value(default.writeOnPersonalization))
-        register(Denomination.Denomination, Value(default.denomination))
-        register(Token.ItsToken, Value(default.itsToken))
-        register(Token.Symbol, Value(default.symbol))
-        register(Token.ContractAddress, Value(default.contractAddress))
-        register(Token.Decimal, Value(default.decimal))
-        register(ProductMask.Note, Value(default.cardData.product_note))
-        register(ProductMask.Tag, Value(default.cardData.product_tag))
-        register(ProductMask.IdCard, Value(default.cardData.product_id_card))
-        register(ProductMask.IdIssuerCard, Value(default.cardData.product_id_issuer))
-        register(SettingsMask.IsReusable, Value(default.isReusable))
-        register(SettingsMask.NeedActivation, Value(default.useActivation))
-        register(SettingsMask.ForbidPurge, Value(default.forbidPurgeWallet))
-        register(SettingsMask.AllowSelectBlockchain, Value(default.allowSelectBlockchain))
-        register(SettingsMask.UseBlock, Value(default.useBlock))
-        register(SettingsMask.OneApdu, Value(default.oneApdu))
-        register(SettingsMask.UseCvc, Value(default.useCVC))
-        register(SettingsMask.AllowSwapPin, Value(default.allowSwapPIN))
-        register(SettingsMask.AllowSwapPin2, Value(default.allowSwapPIN2))
-        register(SettingsMask.ForbidDefaultPin, Value(default.forbidDefaultPIN))
-        register(SettingsMask.SmartSecurityDelay, Value(default.smartSecurityDelay))
-        register(SettingsMask.ProtectIssuerDataAgainstReplay, Value(default.protectIssuerDataAgainstReplay))
-        register(SettingsMask.SkipSecurityDelayIfValidated, Value(default.skipSecurityDelayIfValidatedByIssuer))
-        register(SettingsMask.SkipPin2CvcIfValidated, Value(default.skipCheckPIN2andCVCIfValidatedByIssuer))
-        register(SettingsMask.SkipSecurityDelayOnLinkedTerminal, Value(default.skipSecurityDelayIfValidatedByLinkedTerminal))
-        register(SettingsMask.RestrictOverwriteExtraIssuerData, Value(default.restrictOverwriteIssuerDataEx))
-        register(SettingsMaskProtocolEnc.AllowUnencrypted, Value(default.protocolAllowUnencrypted))
-        register(SettingsMaskProtocolEnc.AllowStaticEncryption, Value(default.protocolAllowStaticEncryption))
-        register(SettingsMaskNdef.UseNdef, Value(default.useNDEF))
-        register(SettingsMaskNdef.DynamicNdef, Value(default.useDynamicNDEF))
-        register(SettingsMaskNdef.DisablePrecomputedNdef, Value(default.disablePrecomputedNDEF))
-        register(SettingsMaskNdef.Aar, Value(default.aar, Helper.aarList()))
-        register(SettingsMaskNdef.AarCustom, Value(default.aarCustom))
-        register(SettingsMaskNdef.Uri, Value(default.uri))
-        register(Pins.Pin, Value(default.PIN))
-        register(Pins.Pin2, Value(default.PIN2))
-        register(Pins.Pin3, Value(default.PIN3))
-        register(Pins.Cvc, Value(default.CVC))
-        register(Pins.PauseBeforePin2, Value(default.pauseBeforePIN2, Helper.pauseBeforePin()))
-    }
-}
-
-class Value(
-        private var value: Any? = null,
-        val list: List? = mutableListOf()
-) {
-    fun get(): Any? = value
-    fun set(newValue: Any?) {
-        value = newValue
-    }
-}
-
-internal class Helper {
-    companion object {
-        fun listOfCurves(): List {
-            return EllipticCurve.values().map { KeyValue(it.name, it.curve) }
-        }
-
-        fun listOfBlockchain(): List {
-            return mutableListOf(
-                    KeyValue("--- CUSTOM ---", ""),
-                    KeyValue("BTC", "BTC"),
-                    KeyValue("BTC/test", "BTC/test"),
-                    KeyValue("ETH", "ETH"),
-                    KeyValue("ETH/test", "ETH/test"),
-                    KeyValue("BCH", "BCH"),
-                    KeyValue("BCH/test", "BCH/test"),
-                    KeyValue("LTC", "LTC"),
-                    KeyValue("XLM", "XLM"),
-                    KeyValue("XLM/test", "XLM/test"),
-                    KeyValue("RSK", "RSK"),
-                    KeyValue("XPR", "XPR"),
-                    KeyValue("CARDANO", "CARDANO"),
-                    KeyValue("BNB", "BNB"),
-                    KeyValue("XTZ", "XTZ"),
-                    KeyValue("DUC", "DUC")
-            )
-        }
-
-        fun aarList(): List {
-            return mutableListOf(
-                    KeyValue("--- CUSTOM ---", ""),
-                    KeyValue("Release APP", "com.tangem.wallet"),
-                    KeyValue("Debug APP", "com.tangem.wallet.debug"),
-                    KeyValue("None", "")
-            )
-        }
-
-        fun pauseBeforePin(): List {
-            return mutableListOf(
-                    KeyValue("immediately", 0L),
-                    KeyValue("2 seconds", 2000L),
-                    KeyValue("5 seconds", 5000L),
-                    KeyValue("15 seconds", 15000L),
-                    KeyValue("30 seconds", 30000L),
-                    KeyValue("1 minute", 60000L),
-                    KeyValue("2 minute", 120000L)
-            )
-        }
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
deleted file mode 100644
index a1c710527b..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter
-
-import com.tangem.commands.*
-import com.tangem.commands.personalization.entities.CardConfig
-import com.tangem.commands.personalization.entities.NdefRecord
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter
-import java.util.*
-
-class PersonalizationConfigToCardConfig : Converter {
-
-    override fun convert(from: PersonalizationConfig): CardConfig {
-        val signingMethodMaskBuilder = SigningMethodMaskBuilder()
-        if (from.SigningMethod0) {
-            signingMethodMaskBuilder.add(SigningMethod.SignHash)
-        }
-        if (from.SigningMethod1) {
-            signingMethodMaskBuilder.add(SigningMethod.SignRaw)
-        }
-        if (from.SigningMethod2) {
-            signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuer)
-        }
-        if (from.SigningMethod3) {
-            signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuer)
-        }
-        if (from.SigningMethod4) {
-            signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuerWriteIssuerData)
-        }
-        if (from.SigningMethod5) {
-            signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuerWriteIssuerData)
-        }
-        if (from.SigningMethod6) {
-            signingMethodMaskBuilder.add(SigningMethod.SignHash)
-        }
-        val signingMethod = signingMethodMaskBuilder.build()
-
-        val isNote = from.cardData.product_note
-        val isTag = from.cardData.product_tag
-        val isIdCard = from.cardData.product_id_card
-        val isIdIssuer = from.cardData.product_id_issuer
-
-        val productMaskBuilder = ProductMaskBuilder()
-        if (isNote) productMaskBuilder.add(com.tangem.commands.Product.Note)
-        if (isTag) productMaskBuilder.add(com.tangem.commands.Product.Tag)
-        if (isIdCard) productMaskBuilder.add(com.tangem.commands.Product.IdCard)
-        if (isIdIssuer) productMaskBuilder.add(com.tangem.commands.Product.IdIssuer)
-        val productMask = productMaskBuilder.build()
-
-        var tokenSymbol: String? = null
-        var tokenContractAddress: String? = null
-        var tokenDecimal: Int? = null
-        if (from.itsToken) {
-            tokenSymbol = from.symbol
-            tokenContractAddress = from.contractAddress
-            tokenDecimal = from.decimal.toInt()
-        }
-
-        val blockchain = if (from.blockchain.isNotEmpty()) from.blockchain else from.blockchainCustom
-        val cardData = CardData(
-                blockchainName = blockchain,
-                batchId = from.batchId,
-                productMask = productMask,
-                tokenSymbol = tokenSymbol,
-                tokenContractAddress = tokenContractAddress,
-                tokenDecimal = tokenDecimal,
-                issuerName = null,
-                manufactureDateTime = Calendar.getInstance().time,
-                manufacturerSignature = null)
-
-
-        val ndefs = mutableListOf()
-        if (from.uri.isNotEmpty()) {
-            ndefs.add(NdefRecord(NdefRecord.Type.URI, from.uri))
-        }
-        when (from.aar) {
-            "None" -> null
-            "--- CUSTOM ---" -> NdefRecord(NdefRecord.Type.AAR, from.aarCustom)
-            else -> NdefRecord(NdefRecord.Type.AAR, from.aar)
-        }?.let { ndefs.add(it) }
-
-        return CardConfig(
-                "Tangem",
-                "Tangem Test",
-                from.series,
-                from.startNumber,
-                1000,
-                from.PIN,
-                from.PIN2,
-                from.PIN3,
-                from.hexCrExKey,
-                from.CVC,
-                from.pauseBeforePIN2.toInt(),
-                from.smartSecurityDelay,
-                EllipticCurve.byName(from.curveID) ?: EllipticCurve.Secp256k1,
-                signingMethod,
-                from.MaxSignatures.toInt(),
-                from.isReusable,
-                from.allowSwapPIN,
-                from.allowSwapPIN2,
-                from.useActivation,
-                from.useCVC,
-                from.useNDEF,
-                from.useDynamicNDEF,
-                from.oneApdu,
-                from.useBlock,
-                from.allowSelectBlockchain,
-                from.forbidPurgeWallet,
-                from.protocolAllowUnencrypted,
-                from.protocolAllowStaticEncryption,
-                from.protectIssuerDataAgainstReplay,
-                from.forbidDefaultPIN,
-                from.disablePrecomputedNDEF,
-                from.skipSecurityDelayIfValidatedByIssuer,
-                from.skipCheckPIN2andCVCIfValidatedByIssuer,
-                from.skipSecurityDelayIfValidatedByLinkedTerminal,
-                from.restrictOverwriteIssuerDataEx,
-                from.requireTerminalTxSignature,
-                from.requireTerminalCertSignature,
-                from.checkPIN3onCard,
-                from.createWallet,
-                cardData,
-                ndefs
-        )
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt
deleted file mode 100644
index 067d47027c..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.responses.converter
-
-import com.tangem.commands.Card
-import com.tangem.commands.SignResponse
-import com.tangem.commands.personalization.DepersonalizeResponse
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
-import java.lang.reflect.Type
-
-class ConvertersStore : BaseTypedHolder() {
-    init {
-//        register(CompletionResult.Success::class.java, ReadEventConverter())
-        register(SignResponse::class.java, SignResponseConverter())
-        register(Card::class.java, CardConverter())
-        register(DepersonalizeResponse::class.java, DepersonalizeResponseConverter())
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt
deleted file mode 100644
index 64b8edbec5..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.responses.converter
-
-import com.tangem.commands.SignResponse
-import com.tangem.commands.personalization.DepersonalizeResponse
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.impl.TextItem
-import com.tangem.tangemtest.ucase.variants.responses.DepersonalizeId
-import com.tangem.tangemtest.ucase.variants.responses.SignId
-import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
-
-/**
-[REDACTED_AUTHOR]
- */
-class SignResponseConverter : BaseResponseConverter() {
-
-    override fun convert(from: SignResponse): List {
-        return listOf(
-                TextItem(SignId.cid, from.cardId),
-                TextItem(SignId.walletSignedHashes, valueToString(from.walletSignedHashes)),
-                TextItem(SignId.walletRemainingSignatures, valueToString(from.walletRemainingSignatures)),
-                TextItem(SignId.signature, fieldConverter.byteArray(from.signature))
-        )
-    }
-}
-
-class DepersonalizeResponseConverter : BaseResponseConverter() {
-    override fun convert(from: DepersonalizeResponse): List {
-        return listOf(TextItem(DepersonalizeId.isSuccess, stringOf(from.success)))
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/item/TextItem.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/item/TextItem.kt
deleted file mode 100644
index 452b1e47bc..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/item/TextItem.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.responses.item
-
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel
-import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel
-import com.tangem.tangemtest._arch.structure.abstraction.ViewState
-import com.tangem.tangemtest._arch.structure.impl.TypedItem
-
-open class TextHeaderItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) {
-    constructor(id: Id, value: String? = null, viewState: ViewState = ViewState())
-            : this(id, BaseItemViewModel(value, viewState))
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt
deleted file mode 100644
index ec39879032..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.responses.ui.widget
-
-import android.view.ViewGroup
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.impl.BoolItem
-import com.tangem.tangemtest._arch.structure.impl.TextItem
-import com.tangem.tangemtest._arch.widget.ItemWidgetBuilder
-import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
-import com.tangem.tangemtest.ucase.variants.responses.item.TextHeaderItem
-
-/**
-[REDACTED_AUTHOR]
- */
-class ResponseItemBuilder : ItemWidgetBuilder {
-    override fun build(item: BaseItem, parent: ViewGroup): ViewWidget? {
-        return when (item) {
-            is TextHeaderItem -> ResponseHeaderWidget(parent, item)
-            is TextItem -> ResponseTextWidget(parent, item)
-            is BoolItem -> CheckBoxWidget(parent, item)
-            else -> null
-        }
-    }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt
deleted file mode 100644
index 4453eec6e1..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.sign.ui
-
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.managers.SignItemsManager
-import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
-
-/**
-[REDACTED_AUTHOR]
- */
-class SignActionFragment : BaseCardActionFragment() {
-
-    override val itemsManager: ItemsManager by lazy { SignItemsManager() }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/res/drawable/ic_launcher_background.xml b/tangem-demo/src/main/res/drawable/ic_launcher_background.xml
deleted file mode 100644
index 0d025f9bf6..0000000000
--- a/tangem-demo/src/main/res/drawable/ic_launcher_background.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
diff --git a/tangem-demo/src/main/res/layout/view_simple_button.xml b/tangem-demo/src/main/res/layout/view_simple_button.xml
deleted file mode 100644
index c756fbb150..0000000000
--- a/tangem-demo/src/main/res/layout/view_simple_button.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-