From 17174cbde8aa46c3b29e9b6638f8fd246fa16448 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 19 Apr 2020 21:09:45 +0300 Subject: [PATCH 01/48] Updated on 2026-08-14 --- .../bitcoin/BitcoinTransactionBuilder.kt | 3 ++- .../bitcoin/BitcoinWalletManager.kt | 7 +++--- .../bitcoin/network/BitcoinNetworkManager.kt | 4 --- .../bitcoin/network/BlockchainInfoProvider.kt | 7 +++--- .../bitcoin/network/BlockcypherProvider.kt | 25 ++++++++++--------- .../common/extensions/BigDecimal.kt | 7 ++++++ 6 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 blockchain/src/main/java/com/tangem/blockchain/common/extensions/BigDecimal.kt diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt index 664c45fa0d..769b5fd2de 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt @@ -2,6 +2,7 @@ package com.tangem.blockchain.bitcoin import com.tangem.blockchain.common.TransactionData import com.tangem.blockchain.common.extensions.Result +import com.tangem.blockchain.common.extensions.isZero import org.bitcoinj.core.* import org.bitcoinj.crypto.TransactionSignature import org.bitcoinj.script.Script @@ -81,7 +82,7 @@ internal fun TransactionData.toBitcoinJTransaction(networkParameters: NetworkPar 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, diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt index 72a18f08fc..a5079d804c 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt @@ -3,7 +3,6 @@ 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 @@ -27,7 +26,7 @@ class BitcoinWalletManager( private val networkManager = BitcoinNetworkManager(isTestNet) init { - wallet.balances[AmountType.Coin] = Amount(null, blockchain) + wallet.balances[AmountType.Coin] = Amount(null, blockchain, address) } override suspend fun update() { @@ -80,9 +79,11 @@ class BitcoinWalletManager( when (val result = networkManager.getFee()) { is Result.Failure -> return result is Result.Success -> { + val feeValue = BigDecimal.ONE.movePointLeft(blockchain.decimals.toInt()) + amount.value = amount.value!! - feeValue val sizeResult = transactionBuilder.getEstimateSize( TransactionData(amount, - Amount(1.toBigDecimal().divide(SATOSHI_IN_BTC), blockchain), + Amount(feeValue, blockchain), address, destination), walletPublicKey ) diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt index 55b686591e..03914a56cf 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt @@ -85,10 +85,6 @@ class BitcoinNetworkManager(private val isTestNet: Boolean) : BitcoinProvider { } } } - - companion object { - val SATOSHI_IN_BTC = 100000000.toBigDecimal() - } } data class BitcoinAddressResponse( diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt index 7b2882ec57..2ae4f3b03d 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt @@ -1,9 +1,9 @@ package com.tangem.blockchain.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.Blockchain import com.tangem.blockchain.common.extensions.Result import com.tangem.blockchain.common.extensions.SimpleResult import com.tangem.blockchain.common.extensions.retryIO @@ -16,6 +16,7 @@ class BlockchainInfoProvider( private val blockchainApi: BlockchainInfoApi, private val estimatefeeApi: EstimatefeeApi ) : BitcoinProvider { + val decimals = Blockchain.Bitcoin.decimals.toInt() override suspend fun getInfo(address: String): Result { return try { @@ -29,7 +30,7 @@ class BlockchainInfoProvider( val bitcoinUnspents = unspents.unspentOutputs.map { UnspentTransaction( - it.amount!!.toBigDecimal().divide(SATOSHI_IN_BTC), + 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/bitcoin/network/BlockcypherProvider.kt index 94c9e3dd17..709804cc40 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockcypherProvider.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockcypherProvider.kt @@ -1,11 +1,11 @@ package com.tangem.blockchain.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.Blockchain import com.tangem.blockchain.common.extensions.Result import com.tangem.blockchain.common.extensions.SimpleResult import com.tangem.blockchain.common.extensions.retryIO @@ -14,6 +14,7 @@ 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.toInt() private val network = if (isTestNet) { BlockcypherNetwork.Test.network @@ -26,14 +27,14 @@ class BlockcypherProvider(private val api: BlockcypherApi, isTestNet: Boolean) : val addressData: BlockcypherResponse = retryIO { api.getAddressData(blockchain, network, address) } val unspents = addressData.txrefs?.map { UnspentTransaction( - it.amount!!.toBigDecimal().divide(SATOSHI_IN_BTC), + 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/common/extensions/BigDecimal.kt b/blockchain/src/main/java/com/tangem/blockchain/common/extensions/BigDecimal.kt new file mode 100644 index 0000000000..8014cd4174 --- /dev/null +++ b/blockchain/src/main/java/com/tangem/blockchain/common/extensions/BigDecimal.kt @@ -0,0 +1,7 @@ +package com.tangem.blockchain.common.extensions + +import java.math.BigDecimal + +fun BigDecimal.isZero() : Boolean { + return this.compareTo(BigDecimal.ZERO) == 0 +} \ No newline at end of file From 19f7fc1e271ca8a446c7873ce8c230d263ea5777 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 20 Apr 2020 20:24:38 +0300 Subject: [PATCH 02/48] Updated on 2026-08-14 --- .../com/tangem/blockchain_demo/BlockchainDemoActivity.kt | 6 +++--- .../tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt | 2 +- .../main/java/com/tangem}/common/extensions/BigDecimal.kt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename {blockchain/src/main/java/com/tangem/blockchain => tangem-core/src/main/java/com/tangem}/common/extensions/BigDecimal.kt (70%) 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..de300d429a 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 @@ -78,13 +78,13 @@ class BlockchainDemoActivity : AppCompatActivity() { walletManager.update() withContext(Dispatchers.Main) { binding.tvBalance.text = - "${walletManager.wallet.balances[AmountType.Coin]?.value + "${walletManager.wallet.balances[AmountType.Coin]?.value?.toPlainString() ?: "error"} ${walletManager.blockchain.currency}" val token = walletManager.wallet.balances[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 = diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt index 769b5fd2de..fc3f1b41db 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt @@ -2,7 +2,7 @@ package com.tangem.blockchain.bitcoin import com.tangem.blockchain.common.TransactionData import com.tangem.blockchain.common.extensions.Result -import com.tangem.blockchain.common.extensions.isZero +import com.tangem.common.extensions.isZero import org.bitcoinj.core.* import org.bitcoinj.crypto.TransactionSignature import org.bitcoinj.script.Script diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/BigDecimal.kt b/tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt similarity index 70% rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/BigDecimal.kt rename to tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt index 8014cd4174..6d23ffee09 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/BigDecimal.kt +++ b/tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt @@ -1,4 +1,4 @@ -package com.tangem.blockchain.common.extensions +package com.tangem.common.extensions import java.math.BigDecimal From a50a6a5bbcac3f92d197196225d71ded62bf3c42 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 20 Apr 2020 20:27:26 +0300 Subject: [PATCH 03/48] Updated on 2026-08-14 --- .../com/tangem/blockchain/cardano/CardanoAddress.kt | 4 ++-- .../blockchain/cardano/CardanoWalletManager.kt | 3 ++- .../cardano/network/adalite/AdaliteApi.kt | 4 ++-- .../cardano/network/adalite/AdaliteProvider.kt | 13 +++++++++---- .../cardano/network/adalite/AdaliteResponse.kt | 2 +- .../blockchain/common/network/RetrofitBuilder.kt | 2 +- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt index 3aecd18ff1..eac4edb59e 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt @@ -68,8 +68,8 @@ class CardanoAddressFactory { .end() .build()) - val hexAddress = addressBaos.toByteArray() - return hexAddress.encodeBase58() + val addressBytes = addressBaos.toByteArray() + return addressBytes.encodeBase58() } fun extendPublicKey(publicKey: ByteArray): ByteArray { diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt index 86b5f25a51..6060986275 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt @@ -9,6 +9,7 @@ import com.tangem.blockchain.common.extensions.SimpleResult import com.tangem.blockchain.common.extensions.encodeBase64NoWrap import com.tangem.blockchain.wallets.CurrencyWallet import com.tangem.common.CompletionResult +import java.math.RoundingMode class CardanoWalletManager( private val cardId: String, @@ -61,7 +62,7 @@ class CardanoWalletManager( val size = transactionBuilder.getEstimateSize( TransactionData(amount, null, address, destination), walletPublicKey ) - val fee = (a + b * size).toBigDecimal() + val fee = (a + b * size).toBigDecimal().setScale(blockchain.decimals.toInt(), RoundingMode.UP) return Result.Success(listOf(Amount(blockchain.currency, fee, address, blockchain.decimals))) } } \ 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 index e394d424f6..ab74257edb 100644 --- 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 @@ -12,9 +12,9 @@ interface AdaliteApi { @Headers("Content-Type: application/json") @POST("/api/bulk/addresses/utxo") - suspend fun getUnspents(@Body address: String): AdaliteUnspents + suspend fun getUnspents(@Body addresses: List): AdaliteUnspents @Headers("Content-Type: application/json") @POST("/api/v2/txs/signed") - suspend fun sendTransaction(@Body adaliteBody: AdaliteSendBody): ResponseBody // List? + 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/cardano/network/adalite/AdaliteProvider.kt index ec05798ced..b0c242af79 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteProvider.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteProvider.kt @@ -1,11 +1,13 @@ package com.tangem.blockchain.cardano.network.adalite +import com.squareup.moshi.Json 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.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/cardano/network/adalite/AdaliteResponse.kt index 4bc1f86894..d1561ef760 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteResponse.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteResponse.kt @@ -5,7 +5,7 @@ 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/common/network/RetrofitBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt index afcffa0bfb..dec399633b 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt @@ -49,7 +49,7 @@ 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 = "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" \ No newline at end of file From c7543bb3ec2eb81afce4ac54c1e2e4f32d5a4c94 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 20 Apr 2020 20:43:16 +0300 Subject: [PATCH 04/48] Updated on 2026-08-14 --- .../tangem/blockchain/binance/BinanceWalletManager.kt | 4 ---- .../tangem/blockchain/bitcoin/BitcoinWalletManager.kt | 4 ---- .../blockchain/ethereum/EthereumWalletManager.kt | 11 ----------- .../com/tangem/blockchain/xrp/XrpWalletManager.kt | 5 ----- dependencies.gradle | 2 +- 5 files changed, 1 insertion(+), 25 deletions(-) diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt index 5c131c16e0..1ecbc6a3a6 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt @@ -23,10 +23,6 @@ class BinanceWalletManager( 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) { diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt index a5079d804c..c026ccd4f9 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt @@ -25,10 +25,6 @@ class BitcoinWalletManager( private val transactionBuilder = BitcoinTransactionBuilder(isTestNet) private val networkManager = BitcoinNetworkManager(isTestNet) - init { - wallet.balances[AmountType.Coin] = Amount(null, blockchain, address) - } - override suspend fun update() { val response = networkManager.getInfo(address) when (response) { diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt index 3999bdf7a3..f10284959d 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt @@ -37,17 +37,6 @@ class EthereumWalletManager( 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) { diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt index cf6c8206a8..bb2379feb6 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt @@ -22,11 +22,6 @@ class XrpWalletManager( 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) - } - override suspend fun update() { val result = networkManager.getInfo(address) when (result) { 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', ] From 81785a6b44f55bf907724542d418c088b0384a32 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 20 Apr 2020 21:00:26 +0300 Subject: [PATCH 05/48] Updated on 2026-08-14 --- .../java/com/tangem/blockchain_demo/BlockchainDemoActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 de300d429a..ce5a7efb8d 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 @@ -89,7 +89,7 @@ class BlockchainDemoActivity : AppCompatActivity() { } else { binding.etSumToSend.text = Editable.Factory.getInstance().newEditable( - walletManager.wallet.balances[AmountType.Coin]?.value.toString() + walletManager.wallet.balances[AmountType.Coin]?.value?.toPlainString() ) } binding.btnCheckFee.isEnabled = true From 452a4f05a202f766428e4d9637822e53503257cf Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 20 Apr 2020 21:20:38 +0300 Subject: [PATCH 06/48] Updated on 2026-08-14 --- .../blockchain/ethereum/network/EthereumNetworkManager.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt index b7318ba032..25fa28df4f 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.coroutineScope import org.kethereum.ETH_IN_WEI import java.math.BigDecimal import java.math.BigInteger +import java.math.RoundingMode class EthereumNetworkManager { @@ -70,8 +71,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(), From 9daf982e41ef787cefa7de0cc177ff950d2d5c31 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 21 Apr 2020 08:36:10 +0300 Subject: [PATCH 07/48] Updated on 2026-08-14 --- .../src/main/java/com/tangem/CardSession.kt | 2 +- .../src/main/java/com/tangem/TangemSdk.kt | 29 +- .../.circleci/config.yml | 23 + tangem-sdk-android-config/README.md | 426 +++++++++++++----- .../tangem_sdk_new/extensions/TangemSdk.kt | 49 +- 5 files changed, 392 insertions(+), 137 deletions(-) create mode 100755 tangem-sdk-android-config/.circleci/config.yml diff --git a/tangem-core/src/main/java/com/tangem/CardSession.kt b/tangem-core/src/main/java/com/tangem/CardSession.kt index 450c056997..c82023bcfa 100644 --- a/tangem-core/src/main/java/com/tangem/CardSession.kt +++ b/tangem-core/src/main/java/com/tangem/CardSession.kt @@ -20,7 +20,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. */ diff --git a/tangem-core/src/main/java/com/tangem/TangemSdk.kt b/tangem-core/src/main/java/com/tangem/TangemSdk.kt index 145efc088e..ef29487aae 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) } diff --git a/tangem-sdk-android-config/.circleci/config.yml b/tangem-sdk-android-config/.circleci/config.yml new file mode 100755 index 0000000000..a4cf65b34c --- /dev/null +++ b/tangem-sdk-android-config/.circleci/config.yml @@ -0,0 +1,23 @@ +version: 2.1 + +orbs: + android: circleci/android@0.2.0 + +jobs: + build: + executor: android/android + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + steps: + - checkout + - run: + name: Build + command: ./gradlew build + - run: + name: Run Tests + command: ./gradlew test + - store_test_results: # for display in Test Summary: https://circleci.com/docs/2.0/collect-test-data/ + path: tangem-core/build/test-results/ + + diff --git a/tangem-sdk-android-config/README.md b/tangem-sdk-android-config/README.md index 5447c511bb..62a3856024 100644 --- a/tangem-sdk-android-config/README.md +++ b/tangem-sdk-android-config/README.md @@ -1,5 +1,6 @@ -![Release](https://jitpack.io/v/Tangem/tangem-sdk-android.svg) +[![Release](https://jitpack.io/v/Tangem/tangem-sdk-android.svg)](https://jitpack.io/#tangem/tangem-sdk-android) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![CircleCI](https://circleci.com/gh/Tangem/tangem-sdk-android.svg?style=shield)](https://circleci.com/gh/Tangem/tangem-sdk-android) # Welcome to Tangem The Tangem card is a self-custodial hardware wallet for blockchain assets. The main functions of Tangem cards are to securely create and store a private key from a blockchain wallet and sign blockchain transactions. The Tangem card does not allow users to import/export, backup/restore private keys, thereby guaranteeing that the wallet is unique and unclonable. @@ -12,10 +13,19 @@ The Tangem card is a self-custodial hardware wallet for blockchain assets. The m - [Card interaction](#card-interaction) - [Scan card](#scan-card) - [Sign](#sign) + - [Read Issuer Data](#read-issuer-data) + - [Read Issuer Extra Data](#read-issuer-extra-data) + - [Write Issuer Data](#write-issuer-data) + - [Write Issuer Extra Data](#write-issuer-extra-data) + - [Write User Data](#write-user-data) + - [Read User Data](#read-user-data) + - [Create Wallet](#create-wallet) + - [Purge Wallet](#purge-wallet) + - [Depersonalize](#depersonalize) + - [Personalize](#personalize) - [Customization](#customization) - [UI](#ui) - - [Tasks](#tasks) - - [Localization](#localization) + - [Custom Tasks](#custom-tasks) ## Getting Started @@ -41,8 +51,8 @@ And add Tangem library to the dependencies (in an app or module build.gradle fil ```gradle dependencies { - implementation "com.github.tangem.tangem-sdk-android:tangem-core:$latestVersionOfCore" - implementation "com.github.tangem.tangem-sdk-android:tangem-sdk:$latestVersionOfSdk" + implementation "com.github.tangem.tangem-sdk-android:tangem-core:$latestVersion" + implementation "com.github.tangem.tangem-sdk-android:tangem-sdk:$latestVersion" } ``` Tangem Core is a JVM library (without Android dependencies) that provides core functionality of interacting with Tangem cards. @@ -75,155 +85,351 @@ Tangem Sdk is an Android library that implements NFC interaction between Android Tangem SDK is a self-sufficient solution that implements a card abstraction model, methods of interaction with the card and interactions with the user via UI. ### Initialization -To get started, you need to create an instance of the `CardManager` class. It provides the simple way of interacting with the card. -Our default implementation of `CardManager` requires `NfcReader` and `DefaultCardManagerDelegate`. +To get started, you need to create an instance of the `TangemSdk` class. It provides the simple way of interacting with the card. +Our default implementation of `TangemSdk` comes with `NfcReader` and `DefaultSessionViewDelegate` and can be initialized with a static method +TangemSdk.init(activity: Activity). ```kotlin -private val nfcManager = NfcManager() -private val cardManagerDelegate: DefaultCardManagerDelegate = DefaultCardManagerDelegate(nfcManager.reader) -private val cardManager = CardManager(nfcManager.reader, cardManagerDelegate) +val tangemSdk: TangemSdk = TangemSdk.init(activity) ``` -NfcManager requires a reference to activity in order to use Android API for interacting with NFC. DefaultCardManagerDelegate requires a reference to activity in order to render views. +TangemSdk requires a reference to activity in order to use Android API for interacting with NFC. DefaultSessionViewDelegate requires a reference to activity in order to render views. -```kotlin -nfcManager.setCurrentActivity(this) -cardManagerDelegate.activity = this -``` +Default implementation of `TangemSdk` allows you to start using SDK in your application without any additional setup. -```kotlin -lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) -``` +You can also provide your implementations of `CardReader` and `SessionViewDelegate`. +You can read more about this in [Customization](#customization). -Default implementation of `NfcManager`, `CardReader` and `CardManagerDelegate` allows you to start using CardManager in your application without any additional setup. +### Card interaction -You can also provide your implementations of `CardReader` and `CardManagerDelegate`. -You can read more about this in [Customization](#сustomization). - -### Tasks +Tangem SDK provides a number of commands and tasks that can be run from a `TangemSdk` class. #### Scan card -To start using any card, you first need to read it using the `scanCard()` method. This method launches an NFC session, and once it’s connected with the card, it obtains the card data. Optionally, if the card contains a wallet (private and public key pair), it proves that the wallet owns a private key that corresponds to a public one. +To start using any card, you first need to read it using the `scanCard()` method. This method launches an NFC session, and once it’s connected with the card, it obtains the card data. If the card contains a wallet (private and public key pair), it proves that the wallet owns a private key that corresponds to a public one. Example: ```kotlin -cardManager.scanCard { taskEvent -> - when (taskEvent) { - is TaskEvent.Event -> { - when (taskEvent.data) { - is ScanEvent.OnReadEvent -> { - // Handle returned card data - cardId = (taskEvent.data as ScanEvent.OnReadEvent).card.cardId - // Switch to UI thread to show results in UI - runOnUiThread {} - } - is ScanEvent.OnVerifyEvent -> { - //Handle card verification - val isGenuine = (taskEvent.data as ScanEvent.OnVerifyEvent).isGenuine + tangemSdk.scanCard { result -> + when (result) { + is CompletionResult.Success -> { + // Handle returned card data + val card = result.data + cardId = card.cardId + // Switch to UI thread to show results in UI + runOnUiThread { + tv_card_cid?.text = cardId + } + } + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } } } - } - is TaskEvent.Completion -> { - if (taskEvent.error != null) { - if (taskEvent.error is TaskError.UserCancelledError) { - // Handle case when user cancelled manually - } - // Handle other errors - } - // Handle completion - } - } -} - ``` Communication with the card is an asynchronous operation. In order to get a result for the method, you need to subscribe to the task callback. In order to render the callback results on UI, you need to switch to the main thread. -Every task can invoke callback several times with different events: +Every `CardSessionRunnable` (`Command` or custom tasks) can invoke callback once with either success or error: -`Completion(val error: TaskError? = null)` – this event is triggered only once when task is completely finished. It means that it's the final callback. If error is not nil, then something went wrong during the operation. +`CompletionResult` – this is the sealed class for the results of `CardSessionRunnable`. -`Event(val data: T)` – this event is triggered when one of operations inside the task is completed. - -**Possible events of the Scan card task:** - -`OnReadEvent(val result: Card)` – this event is triggered after the card has been successfully read. In addition, the obtained card object is contained inside the enum. At this stage, the authenticity of the card is ***NOT*** verified. - -`OnVerifyEvent(val isGenuine: Boolean)` – this event is triggered when the card’s authenticity has been verified. If the card is authentic, isGenuine will be set to true, otherwise, it will be set to false. +`Success(val data: T)` is triggered after successful operation and contains a `CommandResponse`. +`Failure(val error: SessionError)` is triggered on error. #### Sign This method allows you to sign one or multiple hashes. Simultaneous signing of array of hashes in a single SIGN command is required to support Bitcoin-type multi-input blockchains (UTXO). The SIGN command will return a corresponding array of signatures. ```kotlin -cardManager.sign( - hashes = arrayOf(hash1, hash2), - cardId = card.cardId) { taskEvent -> - when (taskEvent) { - is TaskEvent.Event -> { - // Handle sign response data - val signResponse = taskEvent.data - } - is TaskEvent.Completion -> { - if (taskEvent.error != null) { - if (taskEvent.error is TaskError.UserCancelledError) { - // Handle case when user cancelled manually + tangemSdk.sign( + hashes = arrayOf(hash1, hash2), + cardId) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> { + val signResponse = result.data } - // Handle other errors } - // Handle completion } - } -} ``` +#### Read Issuer Data +An example of usage (description is available at documentation for `TangemSdk.readIssuerData` method and corresponding command class): + +```kotlin + tangemSdk.readIssuerData(cardId) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> { + val issuerData = result.data.issuerData + val issuerDataSignature = result.data.issuerDataSignature + } + } + } +``` + +#### Read Issuer Extra Data +An example of usage (description is available at documentation for `TangemSdk.readIssuerExtraData` method and corresponding command class): + +```kotlin + tangemSdk.readIssuerExtraData(cardId) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> { + val issuerData = result.data.issuerData + val issuerDataSignature = result.data.issuerDataSignature + } + } + } +``` + +#### Write Issuer Data +An example of usage (description is available at documentation for `TangemSdk.writeIssuerData` method and corresponding command class): + +```kotlin + tangemSdk.writeIssuerData(cardId, issuerData, issuerDataSignature, issuerDataCounter) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> { + val writeIssuerDataResult = result.data + } + } + } +``` + +#### Write Issuer Extra Data +An example of usage (description is available at documentation for `TangemSdk.writeIssuerExtraData` method and corresponding command class): + +```kotlin + tangemSdk.writeIssuerExtraData(cardId, + issuerData, startingSignature, finalizingSignature, issuerDataCounter + ) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> runOnUiThread { + val writeIssuerDataResult = result.data + } + } + } +``` + +#### Write User Data +An example of usage (description is available at documentation for `TangemSdk.writeUserData` method and corresponding command class): + +```kotlin + tangemSdk.writeUserData( + cardId, userData, userProtectedData, userCounter, userProtectedCounter + ) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> runOnUiThread { + val writeUserDataResult = result.data + } + } + } +``` + +#### Read User Data +An example of usage (description is available at documentation for `TangemSdk.readUserData` method and corresponding command class): + +```kotlin + tangemSdk.readUserData(cardId) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> runOnUiThread { + val readUserDataResult = result.data + } + } + } +``` + +#### Create Wallet +An example of usage (description is available at documentation for `TangemSdk.createWallet` method and corresponding command class): + +```kotlin + tangemSdk.createWallet(cardId) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> runOnUiThread { + val createWalletResult = result.data + } + } + } +``` + +#### Purge Wallet +An example of usage (description is available at documentation for `TangemSdk.purgeWallet` method and corresponding command class): + +```kotlin + tangemSdk.purgeWallet(cardId) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> runOnUiThread { + val purgeWalletResult = result.data + } + } + } +``` + +#### Depersonalize +An example of usage (description is available at documentation for `TangemSdk.depersonalize` method and corresponding command class): + +```kotlin + tangemSdk.depersonalize(cardId) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> runOnUiThread { + val depersonalizeResult = result.data + } + } + } +``` + +#### Personalize +An example of usage (description is available at documentation for `TangemSdk.personalize` method and corresponding command class): + +```kotlin + tangemSdk.personalize(config, issuer, manufacturer, acquirer) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> runOnUiThread { + val card = result.data + } + } + } +``` + + ## Customization ### UI -If the interaction with user is required, the SDK performs the entire cycle of this interaction. In order to change the appearance or behavior of the user UI, you can provide you own implementation of the `CardManagerDelegate` inteface. After this, initialize the `CardManager` class with your delegate class. +If the interaction with user is required, the SDK performs the entire cycle of this interaction. In order to change the appearance or behavior of the user UI, you can provide you own implementation of the `SessionViewDelegate` inteface. After this, initialize the `TangemSdk` class with your delegate class. ```kolin -val myCardManagerDelegate = MyCardManagerDelegate() -val cardManager = CardManager(cardManagerDelegate = myCardManagerDelegate) +val tangemSdk = TangemSdk.customInit(this, viewDelegate = MySessionViewDelegate()) ``` -> If you pass null instead of `cardManagerDelegate`, the SDK won’t be able to process errors that require user intervention and return them to `.failure(let error)`. +### Custom Tasks +`TangemSdk` specific methods run particular commands and tasks. If you want to trigger card commands in a different order, or implement additional + business logic, you have several options. + +One option is to start a session, get an instance of `CardSession`, and use it to perform commands. +To do this, you need to call `tangemSdk.startSession()` method and get a `CardSession` instance in a callback. -### Tasks -`CardManager` only covers general tasks. If you want to trigger card commands in a certain order, you need to create your own task. - -To do this, you need to create a subclass of the `Task` class, and override the `onRun(..)` method. - -Then call the `runTask(..)` method of the `CardManager` class with you task. +> For example, if you want to read the card and immediately sign a transaction with it, you can achieve it this way. ```kotlin -val task = YourTask() -cardManager.runTask(task) { taskEvent -> - // Handle your events -} -``` -> For example, you want to read the card and immediately sign a transaction on it. In such a case, you need to inherit from the `Task` class and override the `onRun(..)` method, in which you implement the required behavior. - -It’s possible to run just one command without the need to create a separate task by using the `runCommand(..)` method. -> For example, if you need to read the card details, but don’t need to check the authenticity. -```kotlin -// Create command -val readCommand = ReadCardCommand() -// Run command with the callback -cardManager.runCommand(readCommand) { taskEvent -> - when (taskEvent) { - is TaskEvent.Event -> { - // Handle returned card data - val card: Card = taskEvent.data - } - is TaskEvent.Completion -> { - if (taskEvent.error != null) { - if (taskEvent.error is TaskError.UserCancelledError) { - // Handle case when user cancelled manually + tangemSdk.startSession { session, error -> + if (error == null) { + session.startWithRunnable( + SignCommand(createSampleHashes())) {result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + is CompletionResult.Success -> { + val signResponse = result.data + } + } + } + } + } +``` + +Another option is to put all logic in a in `CardSessionRunnable` class and launch it using `tangemSdk.startSessionWithRunnable()` method. +In Tangem SDK we use this approach for our `ScanTask`. + +> For example, you want to read the card and immediately sign a transaction with it. With subclassing `CardSessionRunnable` you can achieve it this way. + +```kotlin +class OneTapSignTask(private val hashesToSign: Array) : CardSessionRunnable { + + override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { + + val card = session.environment.card + + if (card == null) { + callback(CompletionResult.Failure(SessionError.MissingPreflightRead())) + + } else if (card.cardData?.productMask?.contains(Product.Tag) != false) { + callback(CompletionResult.Success(card)) + + } else if (card.status != CardStatus.Loaded) { + callback(CompletionResult.Success(card)) + + } else if (card.curve == null || card.walletPublicKey == null) { + callback(CompletionResult.Failure(SessionError.CardError())) + + } else { + val signCommand = SignCommand(hashesToSign) + + signCommand.run(session) { result -> + when (result) { + is CompletionResult.Success -> callback(CompletionResult.Success(result.data)) + is CompletionResult.Failure -> callback(CompletionResult.Failure(result.error)) } - // Handle other errors } - // Handle completion } } } diff --git a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/extensions/TangemSdk.kt b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/extensions/TangemSdk.kt index f69b7c96cf..050f81c61c 100644 --- a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/extensions/TangemSdk.kt +++ b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/extensions/TangemSdk.kt @@ -1,21 +1,48 @@ package com.tangem.tangem_sdk_new.extensions import androidx.fragment.app.FragmentActivity +import com.tangem.CardReader +import com.tangem.Config +import com.tangem.SessionViewDelegate import com.tangem.TangemSdk import com.tangem.tangem_sdk_new.DefaultSessionViewDelegate import com.tangem.tangem_sdk_new.NfcLifecycleObserver import com.tangem.tangem_sdk_new.TerminalKeysStorage import com.tangem.tangem_sdk_new.nfc.NfcManager -fun TangemSdk.Companion.init(activity: FragmentActivity): TangemSdk { - val nfcManager = NfcManager().apply { - this.setCurrentActivity(activity) - activity.lifecycle.addObserver(NfcLifecycleObserver(this)) - } - val viewDelegate = DefaultSessionViewDelegate(nfcManager.reader).apply { - this.activity = activity - } - return TangemSdk(nfcManager.reader, viewDelegate).apply { - this.setTerminalKeysService(TerminalKeysStorage(activity.application)) - } +fun TangemSdk.Companion.init(activity: FragmentActivity, config: Config = Config()): TangemSdk { + val nfcManager = TangemSdk.initNfcManager(activity) + + val viewDelegate = DefaultSessionViewDelegate(nfcManager.reader) + viewDelegate.activity = activity + + val tangemSdk = TangemSdk(nfcManager.reader, viewDelegate, config) + tangemSdk.setTerminalKeysService(TerminalKeysStorage(activity.application)) + + return tangemSdk +} + +fun TangemSdk.Companion.customInit( + activity: FragmentActivity, + viewDelegate: SessionViewDelegate? = null, cardReader: CardReader? = null, + config: Config = Config() +): TangemSdk { + val nfcManager = TangemSdk.initNfcManager(activity) + + val tangemSdk = TangemSdk( + cardReader ?: nfcManager.reader, + viewDelegate ?: DefaultSessionViewDelegate(nfcManager.reader) + .apply { this.activity = activity }, + config + ) + tangemSdk.setTerminalKeysService(TerminalKeysStorage(activity.application)) + + return tangemSdk +} + +fun TangemSdk.Companion.initNfcManager(activity: FragmentActivity): NfcManager { + val nfcManager = NfcManager() + nfcManager.setCurrentActivity(activity) + activity.lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) + return nfcManager } \ No newline at end of file From f75483df0c9b169f430741226ce2461cb45a597d Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 21 Apr 2020 10:55:26 +0300 Subject: [PATCH 08/48] Updated on 2026-08-14 --- .../java/com/tangem/ui/fragment/id/IdFragment.kt | 3 +++ .../tangem/ui/fragment/id/IssueNewIdFragment.kt | 7 ++++++- .../tangem/ui/fragment/id/ValidateIdFragment.kt | 9 +++++++++ .../com/tangem/ui/fragment/id/WriteIdFragment.kt | 3 +++ .../java/com/tangem/wallet/ethID/EthIdEngine.java | 14 ++++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) 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..61e4e7524a 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 { 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..119d692321 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 } @@ -123,6 +125,9 @@ class IssueNewIdFragment : BaseFragment(), NavigationResultListener { 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/EthIdEngine.java b/app/src/main/java/com/tangem/wallet/ethID/EthIdEngine.java index 3c9e6c0017..c681805f2a 100644 --- a/app/src/main/java/com/tangem/wallet/ethID/EthIdEngine.java +++ b/app/src/main/java/com/tangem/wallet/ethID/EthIdEngine.java @@ -277,6 +277,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 +312,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 +336,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; } @@ -434,9 +442,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 +456,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); From b8b58b553fa9b4a3b3d60608f9f13a1069ef7022 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 21 Apr 2020 13:13:21 +0300 Subject: [PATCH 09/48] Updated on 2026-08-14 --- tangem-sdk-android-config/README.md | 72 ++++++++++--------- .../tangem_sdk_new/extensions/TangemSdk.kt | 5 +- 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/tangem-sdk-android-config/README.md b/tangem-sdk-android-config/README.md index 62a3856024..734e4835a1 100644 --- a/tangem-sdk-android-config/README.md +++ b/tangem-sdk-android-config/README.md @@ -13,18 +13,23 @@ The Tangem card is a self-custodial hardware wallet for blockchain assets. The m - [Card interaction](#card-interaction) - [Scan card](#scan-card) - [Sign](#sign) - - [Read Issuer Data](#read-issuer-data) - - [Read Issuer Extra Data](#read-issuer-extra-data) - - [Write Issuer Data](#write-issuer-data) - - [Write Issuer Extra Data](#write-issuer-extra-data) - - [Write User Data](#write-user-data) - - [Read User Data](#read-user-data) - - [Create Wallet](#create-wallet) - - [Purge Wallet](#purge-wallet) - - [Depersonalize](#depersonalize) - - [Personalize](#personalize) + - [Issuer Data](#issuer-data) + - [Read Issuer Data](#read-issuer-data) + - [Read Issuer Extra Data](#read-issuer-extra-data) + - [Write Issuer Data](#write-issuer-data) + - [Write Issuer Extra Data](#write-issuer-extra-data) + - [User Data](#user-data) + - [Write User Data](#write-user-data) + - [Read User Data](#read-user-data) + - [Wallet](#wallet) + - [Create Wallet](#create-wallet) + - [Purge Wallet](#purge-wallet) + - [Personalization](#personalization) + - [Depersonalize](#depersonalize) + - [Personalize](#personalize) - [Customization](#customization) - [UI](#ui) + - [Reader](#reader) - [Custom Tasks](#custom-tasks) @@ -86,20 +91,16 @@ Tangem SDK is a self-sufficient solution that implements a card abstraction mode ### Initialization To get started, you need to create an instance of the `TangemSdk` class. It provides the simple way of interacting with the card. -Our default implementation of `TangemSdk` comes with `NfcReader` and `DefaultSessionViewDelegate` and can be initialized with a static method -TangemSdk.init(activity: Activity). +Our default implementation of `TangemSdk` can be initialized with a static method TangemSdk.init(activity: Activity). ```kotlin val tangemSdk: TangemSdk = TangemSdk.init(activity) ``` -TangemSdk requires a reference to activity in order to use Android API for interacting with NFC. DefaultSessionViewDelegate requires a reference to activity in order to render views. - +TangemSdk requires a reference to activity in order to use Android API for interacting with NFC and to render views. Default implementation of `TangemSdk` allows you to start using SDK in your application without any additional setup. - -You can also provide your implementations of `CardReader` and `SessionViewDelegate`. -You can read more about this in [Customization](#customization). +(You can read about additional options in [Customization](#customization)). ### Card interaction @@ -162,7 +163,9 @@ This method allows you to sign one or multiple hashes. Simultaneous signing of a } ``` -#### Read Issuer Data +#### Issuer Data + +##### Read Issuer Data An example of usage (description is available at documentation for `TangemSdk.readIssuerData` method and corresponding command class): ```kotlin @@ -182,7 +185,7 @@ An example of usage (description is available at documentation for `TangemSdk.re } ``` -#### Read Issuer Extra Data +##### Read Issuer Extra Data An example of usage (description is available at documentation for `TangemSdk.readIssuerExtraData` method and corresponding command class): ```kotlin @@ -202,7 +205,7 @@ An example of usage (description is available at documentation for `TangemSdk.re } ``` -#### Write Issuer Data +##### Write Issuer Data An example of usage (description is available at documentation for `TangemSdk.writeIssuerData` method and corresponding command class): ```kotlin @@ -221,7 +224,7 @@ An example of usage (description is available at documentation for `TangemSdk.wr } ``` -#### Write Issuer Extra Data +##### Write Issuer Extra Data An example of usage (description is available at documentation for `TangemSdk.writeIssuerExtraData` method and corresponding command class): ```kotlin @@ -241,8 +244,8 @@ An example of usage (description is available at documentation for `TangemSdk.wr } } ``` - -#### Write User Data +#### User Data +##### Write User Data An example of usage (description is available at documentation for `TangemSdk.writeUserData` method and corresponding command class): ```kotlin @@ -263,7 +266,7 @@ An example of usage (description is available at documentation for `TangemSdk.wr } ``` -#### Read User Data +##### Read User Data An example of usage (description is available at documentation for `TangemSdk.readUserData` method and corresponding command class): ```kotlin @@ -281,8 +284,8 @@ An example of usage (description is available at documentation for `TangemSdk.re } } ``` - -#### Create Wallet +#### Wallet +##### Create Wallet An example of usage (description is available at documentation for `TangemSdk.createWallet` method and corresponding command class): ```kotlin @@ -301,7 +304,7 @@ An example of usage (description is available at documentation for `TangemSdk.cr } ``` -#### Purge Wallet +##### Purge Wallet An example of usage (description is available at documentation for `TangemSdk.purgeWallet` method and corresponding command class): ```kotlin @@ -320,7 +323,8 @@ An example of usage (description is available at documentation for `TangemSdk.pu } ``` -#### Depersonalize +#### Personalization +##### Depersonalize An example of usage (description is available at documentation for `TangemSdk.depersonalize` method and corresponding command class): ```kotlin @@ -339,7 +343,7 @@ An example of usage (description is available at documentation for `TangemSdk.de } ``` -#### Personalize +##### Personalize An example of usage (description is available at documentation for `TangemSdk.personalize` method and corresponding command class): ```kotlin @@ -361,12 +365,16 @@ An example of usage (description is available at documentation for `TangemSdk.pe ## Customization ### UI -If the interaction with user is required, the SDK performs the entire cycle of this interaction. In order to change the appearance or behavior of the user UI, you can provide you own implementation of the `SessionViewDelegate` inteface. After this, initialize the `TangemSdk` class with your delegate class. +If the interaction with user is required, the SDK performs the entire cycle of this interaction. In order to change the appearance or behavior of the user UI, you can provide you own implementation of the `SessionViewDelegate` interface. After this, initialize the `TangemSdk` class with your delegate class. ```kolin -val tangemSdk = TangemSdk.customInit(this, viewDelegate = MySessionViewDelegate()) +val tangemSdk = TangemSdk.customInit(this, MySessionViewDelegate()) ``` +### Reader + +TangemSdk uses Android NFC capabilities to communicate with TangemCards. If there is a need to use other means of communication or other platforms, it is possible to implement this functionality by implementing `CardReader` interface and using it instead of the default `NfcReader`. + ### Custom Tasks `TangemSdk` specific methods run particular commands and tasks. If you want to trigger card commands in a different order, or implement additional business logic, you have several options. @@ -400,7 +408,7 @@ To do this, you need to call `tangemSdk.startSession()` method and get a `CardSe Another option is to put all logic in a in `CardSessionRunnable` class and launch it using `tangemSdk.startSessionWithRunnable()` method. In Tangem SDK we use this approach for our `ScanTask`. -> For example, you want to read the card and immediately sign a transaction with it. With subclassing `CardSessionRunnable` you can achieve it this way. +> For example, if you want to read the card and immediately sign a transaction with it, with subclassing `CardSessionRunnable` you can achieve it this way. ```kotlin class OneTapSignTask(private val hashesToSign: Array) : CardSessionRunnable { diff --git a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/extensions/TangemSdk.kt b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/extensions/TangemSdk.kt index 050f81c61c..e9a6ab555c 100644 --- a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/extensions/TangemSdk.kt +++ b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/extensions/TangemSdk.kt @@ -1,7 +1,6 @@ package com.tangem.tangem_sdk_new.extensions import androidx.fragment.app.FragmentActivity -import com.tangem.CardReader import com.tangem.Config import com.tangem.SessionViewDelegate import com.tangem.TangemSdk @@ -24,13 +23,13 @@ fun TangemSdk.Companion.init(activity: FragmentActivity, config: Config = Config fun TangemSdk.Companion.customInit( activity: FragmentActivity, - viewDelegate: SessionViewDelegate? = null, cardReader: CardReader? = null, + viewDelegate: SessionViewDelegate? = null, config: Config = Config() ): TangemSdk { val nfcManager = TangemSdk.initNfcManager(activity) val tangemSdk = TangemSdk( - cardReader ?: nfcManager.reader, + nfcManager.reader, viewDelegate ?: DefaultSessionViewDelegate(nfcManager.reader) .apply { this.activity = activity }, config From 11aa8ac293727a18f65988b3d42bf0b50ed37b5f Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 22 Apr 2020 10:08:09 +0000 Subject: [PATCH 10/48] Updated on 2026-08-14 --- tangem-sdk-android-config/README.md | 104 +++++++++++++--------------- 1 file changed, 48 insertions(+), 56 deletions(-) diff --git a/tangem-sdk-android-config/README.md b/tangem-sdk-android-config/README.md index 734e4835a1..5acf8ff48f 100644 --- a/tangem-sdk-android-config/README.md +++ b/tangem-sdk-android-config/README.md @@ -13,6 +13,9 @@ The Tangem card is a self-custodial hardware wallet for blockchain assets. The m - [Card interaction](#card-interaction) - [Scan card](#scan-card) - [Sign](#sign) + - [Wallet](#wallet) + - [Create Wallet](#create-wallet) + - [Purge Wallet](#purge-wallet) - [Issuer Data](#issuer-data) - [Read Issuer Data](#read-issuer-data) - [Read Issuer Extra Data](#read-issuer-extra-data) @@ -21,9 +24,6 @@ The Tangem card is a self-custodial hardware wallet for blockchain assets. The m - [User Data](#user-data) - [Write User Data](#write-user-data) - [Read User Data](#read-user-data) - - [Wallet](#wallet) - - [Create Wallet](#create-wallet) - - [Purge Wallet](#purge-wallet) - [Personalization](#personalization) - [Depersonalize](#depersonalize) - [Personalize](#personalize) @@ -40,9 +40,9 @@ Android with minimal SDK version of 21 and a device with NFC support ### Installation -1) Add Tangem library to the project: +1. Add Tangem library to the project: -Add to a project build.gradle file: +Add to a project `build.gradle` file: ```gradle allprojects { @@ -52,7 +52,7 @@ allprojects { } ``` -And add Tangem library to the dependencies (in an app or module build.gradle file): +And add Tangem library to the dependencies (in an app or module `build.gradle` file): ```gradle dependencies { @@ -60,10 +60,10 @@ dependencies { implementation "com.github.tangem.tangem-sdk-android:tangem-sdk:$latestVersion" } ``` -Tangem Core is a JVM library (without Android dependencies) that provides core functionality of interacting with Tangem cards. -Tangem Sdk is an Android library that implements NFC interaction between Android devices and Tangem cards and graphical interface for this interaction. +`tangem-core` is a JVM library (without Android dependencies) that provides core functionality of interacting with Tangem cards. +`tangem-sdk` is an Android library that implements NFC interaction between Android devices and Tangem cards and graphical interface for this interaction. -2) Add res file ‘tech_filter’ with the following: +2. Save the file (you can name it anything you wish) with the following tech-list filters in the `/res/xml` ```xml @@ -75,24 +75,21 @@ Tangem Sdk is an Android library that implements NFC interaction between Android ``` -3) Add to Manifest: +3. Add to `AndroidManifest.xml`: ```xml - + + android:name=“android.nfc.action.TECH_DISCOVERED” + android:resource=“@xml/tech_filter” /> ``` ## Usage - Tangem SDK is a self-sufficient solution that implements a card abstraction model, methods of interaction with the card and interactions with the user via UI. ### Initialization To get started, you need to create an instance of the `TangemSdk` class. It provides the simple way of interacting with the card. -Our default implementation of `TangemSdk` can be initialized with a static method TangemSdk.init(activity: Activity). - ```kotlin val tangemSdk: TangemSdk = TangemSdk.init(activity) @@ -103,39 +100,34 @@ Default implementation of `TangemSdk` allows you to start using SDK in your appl (You can read about additional options in [Customization](#customization)). ### Card interaction - -Tangem SDK provides a number of commands and tasks that can be run from a `TangemSdk` class. - #### Scan card -To start using any card, you first need to read it using the `scanCard()` method. This method launches an NFC session, and once it’s connected with the card, it obtains the card data. If the card contains a wallet (private and public key pair), it proves that the wallet owns a private key that corresponds to a public one. +To obtain data from the card use `scanCard()` method. This method launches an NFC session, and once it’s connected with the card, it obtains the card data. If the card contains a wallet (private and public key pair), it proves that the wallet owns a private key that corresponds to a public one. Example: - ```kotlin - tangemSdk.scanCard { result -> - when (result) { - is CompletionResult.Success -> { - // Handle returned card data - val card = result.data - cardId = card.cardId - // Switch to UI thread to show results in UI - runOnUiThread { - tv_card_cid?.text = cardId - } - } - is CompletionResult.Failure -> { - if (result.error is SessionError.UserCancelledError) { - // Handle case when user cancelled manually - } - // Handle other errors - } - } +tangemSdk.scanCard { result -> + when (result) { + is CompletionResult.Success -> { + // Handle returned card data + val card = result.data + cardId = card.cardId + // Switch to UI thread to show results in UI + runOnUiThread { + tv_card_cid?.text = cardId } + } + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors + } + } +} + ``` -Communication with the card is an asynchronous operation. In order to get a result for the method, you need to subscribe to the task callback. In order to render the callback results on UI, you need to switch to the main thread. - -Every `CardSessionRunnable` (`Command` or custom tasks) can invoke callback once with either success or error: +Communication with the card is an asynchronous operation. In order to get a result for the method, you need to implement the callback function. In order to render the callback results on UI, you need to switch to the main thread. `CompletionResult` – this is the sealed class for the results of `CardSessionRunnable`. @@ -146,21 +138,21 @@ Every `CardSessionRunnable` (`Command` or custom tasks) can invoke callback once This method allows you to sign one or multiple hashes. Simultaneous signing of array of hashes in a single SIGN command is required to support Bitcoin-type multi-input blockchains (UTXO). The SIGN command will return a corresponding array of signatures. ```kotlin - tangemSdk.sign( - hashes = arrayOf(hash1, hash2), - cardId) { result -> - when (result) { - is CompletionResult.Failure -> { - if (result.error is SessionError.UserCancelledError) { - // Handle case when user cancelled manually - } - // Handle other errors - } - is CompletionResult.Success -> { - val signResponse = result.data - } - } +tangemSdk.sign( + hashes = arrayOf(hash1, hash2), + cardId) { result -> + when (result) { + is CompletionResult.Failure -> { + if (result.error is SessionError.UserCancelledError) { + // Handle case when user cancelled manually + } + // Handle other errors } + is CompletionResult.Success -> { + val signResponse = result.data + } + } +} ``` #### Issuer Data From 063ae63a94b68dc903e233839ae6ed1c3653025e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 22 Apr 2020 19:01:11 +0300 Subject: [PATCH 11/48] Updated on 2026-08-14 --- .../blockchain_demo/BlockchainDemoActivity.kt | 30 +- .../blockchain/binance/BinanceAddress.kt | 37 -- .../message/BinanceDexTransactionMessage.java | 4 - .../blockchains/binance/BinanceAddress.kt | 45 ++ .../binance/BinanceTransactionBuilder.kt | 35 +- .../binance/BinanceWalletManager.kt | 32 +- .../binance/client/BinanceDexApi.java | 28 +- .../client/BinanceDexApiAsyncRestClient.java | 28 +- .../binance/client/BinanceDexApiCallback.java | 2 +- .../client/BinanceDexApiCallbackAdapter.java | 4 +- .../client/BinanceDexApiClientFactory.java | 6 +- .../client/BinanceDexApiClientGenerator.java | 2 +- .../binance/client/BinanceDexApiError.java | 2 +- .../client/BinanceDexApiException.java | 2 +- .../client/BinanceDexApiRestClient.java | 60 +- .../binance/client/BinanceDexConstants.java | 2 +- .../binance/client/BinanceDexEnvironment.java | 2 +- .../binance/client/Wallet.java | 12 +- .../binance/client/domain/Account.java | 4 +- .../client/domain/AccountSequence.java | 4 +- .../binance/client/domain/Balance.java | 4 +- .../binance/client/domain/Candlestick.java | 4 +- .../client/domain/CandlestickInterval.java | 2 +- .../binance/client/domain/Infos.java | 4 +- .../binance/client/domain/Market.java | 4 +- .../binance/client/domain/NodeInfo.java | 4 +- .../binance/client/domain/Order.java | 4 +- .../binance/client/domain/OrderBook.java | 4 +- .../binance/client/domain/OrderBookEntry.java | 4 +- .../domain/OrderBookEntryDeserializer.java | 2 +- .../domain/OrderBookEntrySerializer.java | 2 +- .../binance/client/domain/OrderList.java | 4 +- .../binance/client/domain/OrderSide.java | 2 +- .../binance/client/domain/OrderStatus.java | 2 +- .../binance/client/domain/OrderType.java | 2 +- .../binance/client/domain/Peer.java | 4 +- .../binance/client/domain/SyncInfo.java | 4 +- .../client/domain/TickerStatistics.java | 4 +- .../binance/client/domain/Time.java | 4 +- .../binance/client/domain/TimeInForce.java | 2 +- .../binance/client/domain/Token.java | 4 +- .../binance/client/domain/Trade.java | 4 +- .../binance/client/domain/TradePage.java | 4 +- .../client/domain/TradeStatistics.java | 2 +- .../binance/client/domain/Transaction.java | 4 +- .../client/domain/TransactionMetadata.java | 2 +- .../client/domain/TransactionPage.java | 4 +- .../client/domain/TransactionType.java | 2 +- .../binance/client/domain/ValidatorInfo.java | 4 +- .../binance/client/domain/Validators.java | 4 +- .../client/domain/broadcast/CancelOrder.java | 4 +- .../client/domain/broadcast/NewOrder.java | 10 +- .../client/domain/broadcast/TokenFreeze.java | 4 +- .../domain/broadcast/TokenUnfreeze.java | 4 +- .../domain/broadcast/TransactionOption.java | 4 +- .../client/domain/broadcast/Transfer.java | 4 +- .../domain/request/ClosedOrdersRequest.java | 8 +- .../domain/request/OpenOrdersRequest.java | 4 +- .../client/domain/request/TradesRequest.java | 6 +- .../domain/request/TransactionsRequest.java | 8 +- .../encoding/AddressFormatException.java | 2 +- .../binance/client/encoding/Bech32.java | 2 +- .../binance/client/encoding/Crypto.java | 2 +- .../binance/client/encoding/EncodeUtils.java | 2 +- .../message/BinanceDexTransactionMessage.java | 4 + .../encoding/message/CancelOrderMessage.java | 4 +- .../client/encoding/message/InputOutput.java | 4 +- .../client/encoding/message/MessageType.java | 4 +- .../encoding/message/NewOrderMessage.java | 8 +- .../client/encoding/message/SignData.java | 2 +- .../client/encoding/message/Token.java | 4 +- .../encoding/message/TokenFreezeMessage.java | 4 +- .../message/TokenUnfreezeMessage.java | 4 +- .../message/TransactionRequestAssembler.java | 64 +- .../TransactionRequestAssemblerExtSign.java | 40 +- .../encoding/message/TransferMessage.java | 4 +- .../BinanceDexApiAsyncRestClientImpl.java | 34 +- .../impl/BinanceDexApiRestClientImpl.java | 51 +- .../binance/network/BinanceApi.kt | 3 +- .../binance/network/BinanceNetworkManager.kt | 24 +- .../binance/network/BinanceResponse.kt | 2 +- .../binance/proto/CancelOrder.java | 82 +-- .../binance/proto/CancelOrderOrBuilder.java | 2 +- .../binance/proto/NewOrder.java | 82 +-- .../binance/proto/NewOrderOrBuilder.java | 2 +- .../{ => blockchains}/binance/proto/Send.java | 570 +++++++++--------- .../binance/proto/SendOrBuilder.java | 18 +- .../binance/proto/StdSignature.java | 162 ++--- .../binance/proto/StdSignatureOrBuilder.java | 2 +- .../binance/proto/StdTx.java | 82 +-- .../binance/proto/StdTxOrBuilder.java | 2 +- .../binance/proto/TokenFreeze.java | 82 +-- .../binance/proto/TokenFreezeOrBuilder.java | 2 +- .../binance/proto/TokenUnfreeze.java | 82 +-- .../binance/proto/TokenUnfreezeOrBuilder.java | 2 +- .../binance/proto/Transaction.java | 2 +- .../bitcoin/BitcoinAddress.kt | 22 +- .../bitcoin/BitcoinTransactionBuilder.kt | 16 +- .../bitcoin/BitcoinWalletManager.kt | 51 +- .../bitcoin/network/BitcoinNetworkManager.kt | 24 +- .../bitcoin/network/BitcoinProvider.kt | 6 +- .../bitcoin/network/BlockchainInfoProvider.kt | 16 +- .../bitcoin/network/BlockcypherProvider.kt | 20 +- .../bitcoin/network/api/BlockchainInfoApi.kt | 6 +- .../bitcoin/network/api/BlockcypherApi.kt | 8 +- .../bitcoin/network/api/EstimateFeeApi.kt | 2 +- .../response/BlockchainInfoResponse.kt | 2 +- .../network/response/BlockcypherResponse.kt | 2 +- .../blockchains/cardano/CardanoAddress.kt | 121 ++++ .../cardano/CardanoTransactionBuilder.kt | 19 +- .../cardano/CardanoWalletManager.kt | 43 +- .../cardano/crypto/Blake2b.java | 18 +- .../cardano/network/CardanoNetworkManager.kt | 18 +- .../cardano/network/adalite/AdaliteApi.kt | 9 +- .../network/adalite/AdaliteProvider.kt | 14 +- .../network/adalite/AdaliteResponse.kt | 2 +- .../ethereum/EthereumAddress.kt | 17 +- .../ethereum/EthereumWalletManager.kt | 59 +- .../network/EthereumNetworkManager.kt | 12 +- .../ethereum/network/InfuraApi.kt | 2 +- .../ethereum/network/InfuraProvider.kt | 2 +- .../ethereum/network/InfuraResponse.kt | 2 +- .../blockchains/stellar/StellarAddress.kt | 19 + .../stellar/StellarNetworkManager.kt | 14 +- .../stellar/StellarTransactionBuilder.kt | 11 +- .../stellar/StellarWalletManager.kt | 39 +- .../blockchain/blockchains/xrp/XrpAddress.kt | 35 ++ .../xrp/XrpTransactionBuilder.kt | 11 +- .../{ => blockchains}/xrp/XrpWalletManager.kt | 43 +- .../xrp/network/XrpNetworkManager.kt | 16 +- .../xrp/network/rippled/RippledApi.kt | 2 +- .../xrp/network/rippled/RippledProvider.kt | 14 +- .../xrp/network/rippled/RippledResponse.kt | 2 +- .../xrp/override/XrpBase58.java | 2 +- .../xrp/override/XrpPayment.java | 2 +- .../xrp/override/XrpSignedTransaction.java | 2 +- .../blockchain/cardano/CardanoAddress.kt | 105 ---- .../blockchain/common/AddressService.kt | 6 + .../com/tangem/blockchain/common/Amount.kt | 24 + .../tangem/blockchain/common/Blockchain.kt | 123 ++-- .../blockchain/common/TransactionData.kt | 19 + .../com/tangem/blockchain/common/Wallet.kt | 99 +-- .../tangem/blockchain/common/WalletManager.kt | 46 +- .../blockchain/common/WalletManagerFactory.kt | 93 +-- .../{common => }/extensions/Amount.kt | 7 +- .../{common => }/extensions/BitInteger.kt | 2 +- .../{common => }/extensions/ByteArray.kt | 2 +- .../{common => }/extensions/Coroutines.kt | 2 +- .../{common => }/extensions/String.kt | 2 +- .../{common => }/network/RetrofitBuilder.kt | 2 +- .../blockchain/stellar/StellarAddress.kt | 24 - .../blockchain/wallets/CurrencyWallet.kt | 66 -- .../com/tangem/blockchain/xrp/XrpAddress.kt | 38 -- .../binance/BinanceAddressTest.kt | 9 +- .../bitcoin/BitcoinAddressTest.kt | 9 +- .../ethereum/EthereumAddressTest.kt | 8 +- .../stellar/StellarAddressTest.kt | 9 +- .../{ => blockchains}/xrp/XrpAddressTest.kt | 11 +- .../common/WalletManagerFactoryTest.kt | 12 +- 159 files changed, 1740 insertions(+), 1642 deletions(-) delete mode 100644 blockchain/src/main/java/com/tangem/blockchain/binance/BinanceAddress.kt delete mode 100644 blockchain/src/main/java/com/tangem/blockchain/binance/client/encoding/message/BinanceDexTransactionMessage.java create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddress.kt rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/BinanceTransactionBuilder.kt (61%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/BinanceWalletManager.kt (62%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApi.java (71%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApiAsyncRestClient.java (55%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApiCallback.java (91%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApiCallbackAdapter.java (90%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApiClientFactory.java (75%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApiClientGenerator.java (97%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApiError.java (93%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApiException.java (92%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexApiRestClient.java (51%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexConstants.java (89%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/BinanceDexEnvironment.java (93%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/Wallet.java (92%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Account.java (92%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/AccountSequence.java (80%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Balance.java (89%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Candlestick.java (94%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/CandlestickInterval.java (95%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Infos.java (90%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Market.java (92%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/NodeInfo.java (93%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Order.java (97%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/OrderBook.java (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/OrderBookEntry.java (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/OrderBookEntryDeserializer.java (92%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/OrderBookEntrySerializer.java (90%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/OrderList.java (85%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/OrderSide.java (89%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/OrderStatus.java (65%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/OrderType.java (89%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Peer.java (95%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/SyncInfo.java (93%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/TickerStatistics.java (97%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Time.java (87%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/TimeInForce.java (89%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Token.java (92%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Trade.java (96%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/TradePage.java (85%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/TradeStatistics.java (68%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Transaction.java (96%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/TransactionMetadata.java (93%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/TransactionPage.java (85%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/TransactionType.java (74%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/ValidatorInfo.java (89%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/Validators.java (87%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/broadcast/CancelOrder.java (83%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/broadcast/NewOrder.java (81%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/broadcast/TokenFreeze.java (81%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/broadcast/TokenUnfreeze.java (81%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/broadcast/TransactionOption.java (89%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/broadcast/Transfer.java (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/request/ClosedOrdersRequest.java (87%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/request/OpenOrdersRequest.java (89%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/request/TradesRequest.java (92%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/domain/request/TransactionsRequest.java (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/AddressFormatException.java (98%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/Bech32.java (99%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/Crypto.java (98%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/EncodeUtils.java (96%) create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/client/encoding/message/BinanceDexTransactionMessage.java rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/CancelOrderMessage.java (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/InputOutput.java (85%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/MessageType.java (80%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/NewOrderMessage.java (94%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/SignData.java (96%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/Token.java (85%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/TokenFreezeMessage.java (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/TokenUnfreezeMessage.java (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/TransactionRequestAssembler.java (77%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/TransactionRequestAssemblerExtSign.java (74%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/encoding/message/TransferMessage.java (87%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/impl/BinanceDexApiAsyncRestClientImpl.java (76%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/client/impl/BinanceDexApiRestClientImpl.java (76%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/network/BinanceApi.kt (63%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/network/BinanceNetworkManager.kt (80%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/network/BinanceResponse.kt (87%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/CancelOrder.java (82%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/CancelOrderOrBuilder.java (95%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/NewOrder.java (87%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/NewOrderOrBuilder.java (97%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/Send.java (75%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/SendOrBuilder.java (61%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/StdSignature.java (77%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/StdSignatureOrBuilder.java (95%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/StdTx.java (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/StdTxOrBuilder.java (97%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/TokenFreeze.java (80%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/TokenFreezeOrBuilder.java (93%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/TokenUnfreeze.java (80%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/TokenUnfreezeOrBuilder.java (94%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/binance/proto/Transaction.java (99%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/BitcoinAddress.kt (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/BitcoinTransactionBuilder.kt (90%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/BitcoinWalletManager.kt (66%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/BitcoinNetworkManager.kt (78%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/BitcoinProvider.kt (57%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/BlockchainInfoProvider.kt (85%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/BlockcypherProvider.kt (80%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/api/BlockchainInfoApi.kt (64%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/api/BlockcypherApi.kt (80%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/api/EstimateFeeApi.kt (85%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/response/BlockchainInfoResponse.kt (94%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/bitcoin/network/response/BlockcypherResponse.kt (95%) create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddress.kt rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/cardano/CardanoTransactionBuilder.kt (91%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/cardano/CardanoWalletManager.kt (57%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/cardano/crypto/Blake2b.java (98%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/cardano/network/CardanoNetworkManager.kt (77%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/cardano/network/adalite/AdaliteApi.kt (62%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/cardano/network/adalite/AdaliteProvider.kt (79%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/cardano/network/adalite/AdaliteResponse.kt (94%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/ethereum/EthereumAddress.kt (53%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/ethereum/EthereumWalletManager.kt (66%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/ethereum/network/EthereumNetworkManager.kt (91%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/ethereum/network/InfuraApi.kt (93%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/ethereum/network/InfuraProvider.kt (97%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/ethereum/network/InfuraResponse.kt (90%) create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddress.kt rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/stellar/StellarNetworkManager.kt (90%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/stellar/StellarTransactionBuilder.kt (88%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/stellar/StellarWalletManager.kt (60%) create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddress.kt rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/XrpTransactionBuilder.kt (86%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/XrpWalletManager.kt (60%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/network/XrpNetworkManager.kt (84%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/network/rippled/RippledApi.kt (94%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/network/rippled/RippledProvider.kt (90%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/network/rippled/RippledResponse.kt (97%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/override/XrpBase58.java (98%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/override/XrpPayment.java (85%) rename blockchain/src/main/java/com/tangem/blockchain/{ => blockchains}/xrp/override/XrpSignedTransaction.java (97%) delete mode 100644 blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt create mode 100644 blockchain/src/main/java/com/tangem/blockchain/common/AddressService.kt create mode 100644 blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt create mode 100644 blockchain/src/main/java/com/tangem/blockchain/common/TransactionData.kt rename blockchain/src/main/java/com/tangem/blockchain/{common => }/extensions/Amount.kt (55%) rename blockchain/src/main/java/com/tangem/blockchain/{common => }/extensions/BitInteger.kt (83%) rename blockchain/src/main/java/com/tangem/blockchain/{common => }/extensions/ByteArray.kt (83%) rename blockchain/src/main/java/com/tangem/blockchain/{common => }/extensions/Coroutines.kt (97%) rename blockchain/src/main/java/com/tangem/blockchain/{common => }/extensions/String.kt (83%) rename blockchain/src/main/java/com/tangem/blockchain/{common => }/network/RetrofitBuilder.kt (97%) delete mode 100644 blockchain/src/main/java/com/tangem/blockchain/stellar/StellarAddress.kt delete mode 100644 blockchain/src/main/java/com/tangem/blockchain/wallets/CurrencyWallet.kt delete mode 100644 blockchain/src/main/java/com/tangem/blockchain/xrp/XrpAddress.kt rename blockchain/src/test/java/com/tangem/blockchain/{ => blockchains}/binance/BinanceAddressTest.kt (72%) rename blockchain/src/test/java/com/tangem/blockchain/{ => blockchains}/bitcoin/BitcoinAddressTest.kt (71%) rename blockchain/src/test/java/com/tangem/blockchain/{ => blockchains}/ethereum/EthereumAddressTest.kt (72%) rename blockchain/src/test/java/com/tangem/blockchain/{ => blockchains}/stellar/StellarAddressTest.kt (71%) rename blockchain/src/test/java/com/tangem/blockchain/{ => blockchains}/xrp/XrpAddressTest.kt (74%) 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 ce5a7efb8d..bc9a9e7b61 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,9 +78,9 @@ class BlockchainDemoActivity : AppCompatActivity() { walletManager.update() withContext(Dispatchers.Main) { binding.tvBalance.text = - "${walletManager.wallet.balances[AmountType.Coin]?.value?.toPlainString() - ?: "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.value?.toPlainString() + " " + token.currencySymbol binding.etSumToSend.text = Editable.Factory.getInstance().newEditable( @@ -89,7 +89,7 @@ class BlockchainDemoActivity : AppCompatActivity() { } else { binding.etSumToSend.text = Editable.Factory.getInstance().newEditable( - walletManager.wallet.balances[AmountType.Coin]?.value?.toPlainString() + 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,17 +154,17 @@ 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]!! } 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!!, + walletManager.wallet.amounts[AmountType.Coin]!!.copy(value = fee), + walletManager.wallet.amounts[AmountType.Coin]!!.address!!, binding.etReceiverAddress.text.toString() ) } 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/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/blockchains/binance/BinanceAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddress.kt new file mode 100644 index 0000000000..f531bf5519 --- /dev/null +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddress.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/binance/BinanceTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt similarity index 61% rename from blockchain/src/main/java/com/tangem/blockchain/binance/BinanceTransactionBuilder.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt index d9f770f25e..9de779d162 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceTransactionBuilder.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt @@ -1,12 +1,11 @@ -package com.tangem.blockchain.binance +package com.tangem.blockchain.blockchains.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.blockchains.binance.client.BinanceDexApiRestClient +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.common.extensions.calculateSha256 @@ -15,17 +14,17 @@ 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 - ) - +class BinanceTransactionBuilder( + publicKey: ByteArray, private val client: BinanceDexApiRestClient, isTestNet: Boolean = false +) { var accountNumber: Long? = null var sequence: Long? = null - var transactionAssembler: TransactionRequestAssemblerExtSign? = null - var transferMessage: TransferMessage? = 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): ByteArray { val transfer = Transfer() @@ -33,7 +32,7 @@ class BinanceTransactionBuilder(publicKey: ByteArray, isTestNet: Boolean) { transfer.fromAddress = transactionData.sourceAddress transfer.toAddress = transactionData.destinationAddress transfer.amount = transactionData.amount.value!! - .setScale(Blockchain.Binance.decimals.toInt()).toPlainString() + .setScale(Blockchain.Binance.decimals()).toPlainString() val options = TransactionOption.DEFAULT_INSTANCE diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt similarity index 62% rename from blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt index 1ecbc6a3a6..956c22f537 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/binance/BinanceWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt @@ -1,30 +1,24 @@ -package com.tangem.blockchain.binance +package com.tangem.blockchain.blockchains.binance import android.util.Log -import com.tangem.blockchain.binance.network.BinanceInfoResponse -import com.tangem.blockchain.binance.network.BinanceNetworkManager +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.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 class BinanceWalletManager( - private val cardId: String, - walletPublicKey: ByteArray, - override var wallet: CurrencyWallet, - isTestNet: Boolean = false -) : WalletManager, - TransactionSender, - FeeProvider { + cardId: String, + wallet: Wallet, + private val transactionBuilder: BinanceTransactionBuilder, + private val networkManager: BinanceNetworkManager +) : WalletManager(cardId, wallet), TransactionSender { - 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) + 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) @@ -33,7 +27,7 @@ class BinanceWalletManager( private fun updateWallet(response: BinanceInfoResponse) { Log.d(this::class.java.simpleName, "Balance is ${response.balance}") - wallet.balances[AmountType.Coin]?.value = response.balance + wallet.amounts[AmountType.Coin]?.value = response.balance transactionBuilder.accountNumber = response.accountNumber transactionBuilder.sequence = response.sequence 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 80% 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..f843695726 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,19 +1,19 @@ -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.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) { +class BinanceNetworkManager(isTestNet: Boolean = false) { val api = createRetrofitInstance(if (!isTestNet) API_BINANCE else API_BINANCE_TESTNET) .create(BinanceApi::class.java) val client = BinanceDexApiClientFactory.newInstance().newRestClient( @@ -57,7 +57,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/BitcoinAddress.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/BitcoinAddress.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/BitcoinAddress.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 90%
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 fc3f1b41db..24f072b218 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,7 @@
-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
@@ -10,7 +10,9 @@ import org.bitcoinj.script.ScriptBuilder
 import java.math.BigDecimal
 import java.math.BigInteger
 
-class BitcoinTransactionBuilder(private val testNet: Boolean) {
+class BitcoinTransactionBuilder(
+        private val walletPublicKey: ByteArray, private val testNet: Boolean = false
+) {
 
     private lateinit var transaction: Transaction
     private var networkParameters: NetworkParameters? = null
@@ -44,9 +46,9 @@ class BitcoinTransactionBuilder(private val testNet: Boolean) {
                 ?: 0.toBigDecimal()))
     }
 
-    fun buildToSend(signedTransaction: ByteArray, publicKey: ByteArray): ByteArray {
+    fun buildToSend(signedTransaction: ByteArray): ByteArray {
         for (index in transaction.inputs.indices) {
-            transaction.inputs[index].scriptSig = createScript(index, signedTransaction, publicKey)
+            transaction.inputs[index].scriptSig = createScript(index, signedTransaction, walletPublicKey)
         }
         return transaction.bitcoinSerialize()
     }
@@ -59,13 +61,13 @@ class BitcoinTransactionBuilder(private val testNet: Boolean) {
         return ScriptBuilder.createInputScript(signature, ECKey.fromPublicOnly(publicKey))
     }
 
-    fun getEstimateSize(transactionData: TransactionData, walletPublicKey: ByteArray): Result {
+    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 }, walletPublicKey)
+                val finalTransaction = buildToSend(ByteArray(64 * hashes.size) { 1 })
                 return Result.Success(finalTransaction.size)
             }
         }
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
similarity index 66%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
index c026ccd4f9..0812b70c17 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
@@ -1,32 +1,26 @@
-package com.tangem.blockchain.bitcoin
+package com.tangem.blockchain.blockchains.bitcoin
 
 import android.util.Log
-import com.tangem.blockchain.bitcoin.network.BitcoinAddressResponse
-import com.tangem.blockchain.bitcoin.network.BitcoinNetworkManager
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinAddressResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinNetworkManager
 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 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 {
+        cardId: String,
+        wallet: Wallet,
+        private val transactionBuilder: BitcoinTransactionBuilder,
+        private val networkManager: BitcoinNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
 
-    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)
+    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)
@@ -35,18 +29,12 @@ class BitcoinWalletManager(
 
     private fun updateWallet(response: BitcoinAddressResponse) {
         Log.d(this::class.java.simpleName, "Balance is ${response.balance}")
-        wallet.balances[AmountType.Coin]?.value = response.balance
+        wallet.amounts[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))
-            }
+            if (wallet.transactions.isEmpty()) wallet.addIncomingTransaction()
         } else {
-            wallet.pendingTransactions.clear()
+            wallet.transactions.clear()
         }
     }
 
@@ -62,7 +50,7 @@ class BitcoinWalletManager(
             is Result.Success -> {
                 when (val signerResponse = signer.sign(buildTransactionResult.data.toTypedArray(), cardId)) {
                     is CompletionResult.Success -> {
-                        val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature, walletPublicKey)
+                        val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature)
                         return networkManager.sendTransaction(transactionToSend.toHexString())
                     }
                     is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
@@ -75,13 +63,10 @@ class BitcoinWalletManager(
         when (val result = networkManager.getFee()) {
             is Result.Failure -> return result
             is Result.Success -> {
-                val feeValue = BigDecimal.ONE.movePointLeft(blockchain.decimals.toInt())
+                val feeValue = BigDecimal.ONE.movePointLeft(blockchain.decimals())
                 amount.value = amount.value!! - feeValue
                 val sizeResult = transactionBuilder.getEstimateSize(
-                        TransactionData(amount,
-                                Amount(feeValue, blockchain),
-                                address, destination),
-                        walletPublicKey
+                        TransactionData(amount, Amount(amount, feeValue), wallet.address, destination)
                 )
                 when (sizeResult) {
                     is Result.Failure -> return sizeResult
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 78%
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 03914a56cf..5810ede23f 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.UnspentTransaction
+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)
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 85%
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 2ae4f3b03d..b26b05debc 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.api.BlockchainInfoApi
-import com.tangem.blockchain.bitcoin.network.api.EstimatefeeApi
+import com.tangem.blockchain.blockchains.bitcoin.UnspentTransaction
+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.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
+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,7 +16,7 @@ class BlockchainInfoProvider(
         private val blockchainApi: BlockchainInfoApi,
         private val estimatefeeApi: EstimatefeeApi
 ) : BitcoinProvider {
-    val decimals = Blockchain.Bitcoin.decimals.toInt()
+    val decimals = Blockchain.Bitcoin.decimals()
 
     override suspend fun getInfo(address: String): Result {
         return try {
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 80%
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 709804cc40..17da8cced0 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,20 +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.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.blockchains.bitcoin.UnspentTransaction
+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.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
+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.toInt()
+    private val decimals = Blockchain.Bitcoin.decimals()
 
     private val network = if (isTestNet) {
         BlockcypherNetwork.Test.network
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/cardano/CardanoAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddress.kt
new file mode 100644
index 0000000000..ec72bc4b69
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddress.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 57%
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 6060986275..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,31 +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)
@@ -34,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
     }
 
@@ -49,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)
@@ -60,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().setScale(blockchain.decimals.toInt(), RoundingMode.UP)
-        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/cardano/network/adalite/AdaliteApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt
similarity index 62%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt
index ab74257edb..523a2caab7 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt
@@ -1,10 +1,9 @@
-package com.tangem.blockchain.cardano.network.api
+package com.tangem.blockchain.blockchains.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 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.*
-import shadow.okhttp3.ResponseBody
 
 interface AdaliteApi {
     @GET("/api/addresses/summary/{address}")
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 79%
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 b0c242af79..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,12 +1,12 @@
-package com.tangem.blockchain.cardano.network.adalite
+package com.tangem.blockchain.blockchains.cardano.network.adalite
 
 import com.squareup.moshi.Json
-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.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
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 94%
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 d1561ef760..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,4 +1,4 @@
-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
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddress.kt
similarity index 53%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddress.kt
index a301ee7e1c..5eadfafd20 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddress.kt
@@ -1,21 +1,16 @@
-package com.tangem.blockchain.ethereum
+package com.tangem.blockchain.blockchains.ethereum
 
+import com.tangem.blockchain.common.AddressService
 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 EthereumAddressService : AddressService {
+    override fun makeAddress(walletPublicKey: ByteArray): String =
+            PublicKey(walletPublicKey.sliceArray(1..64)).toAddress().hex
 
-class EthereumAddressValidator {
-    companion object {
-        fun validate(address: String): Boolean = Address(address).isValid()
-    }
+    override fun validate(address: String): Boolean = Address(address).isValid()
 }
 
 enum class Chain(val id: Int) {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt
similarity index 66%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt
index f10284959d..2fbc658fe3 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt
@@ -1,13 +1,11 @@
-package com.tangem.blockchain.ethereum
+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.EthereumResponse
 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.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
 import com.tangem.common.CompletionResult
 import com.tangem.common.extensions.toHexString
 import org.kethereum.DEFAULT_GAS_LIMIT
@@ -21,24 +19,19 @@ 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 {
+        cardId: String,
+        wallet: Wallet,
+        private val transactionBuilder: EthereumTransactionBuilder,
+        private val networkManager: EthereumNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
+
+    private val blockchain = wallet.blockchain
 
-    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
 
     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)
@@ -46,18 +39,14 @@ class EthereumWalletManager(
     }
 
     private fun updateWallet(data: EthereumResponse) {
-        wallet.balances[AmountType.Coin]?.value = data.balance
-        wallet.balances[AmountType.Token]?.value = data.tokenBalance
+        wallet.amounts[AmountType.Coin]?.value = data.balance
+        wallet.amounts[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))
+            wallet.transactions.forEach { it.status = TransactionStatus.Confirmed }
+        } else if (wallet.transactions.isEmpty()) {
+            wallet.addIncomingTransaction()
         }
     }
 
@@ -67,11 +56,11 @@ class EthereumWalletManager(
     }
 
     override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
-        val transactionToSign = builder.buildToSign(transactionData, txCount.toBigInteger())
+        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 = builder.buildToSend(signerResponse.data.signature, transactionToSign, walletPublicKey)
+                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)
@@ -84,14 +73,14 @@ class EthereumWalletManager(
             is Result.Success -> {
                 val feeValues: List = result.data
                 return Result.Success(
-                        feeValues.map { Amount(blockchain.currency, it, address, blockchain.decimals) })
+                        feeValues.map { feeValue -> Amount(amount, feeValue) })
             }
             is Result.Failure -> return result
         }
     }
 }
 
-private class EthereumTransactionBuilder(private val chain: Chain) {
+class EthereumTransactionBuilder(private val walletPublicKey: ByteArray, private val chain: Chain) {
 
     fun buildToSign(transactionData: TransactionData, nonce: BigInteger?): TransactionToSign? {
 
@@ -114,7 +103,7 @@ private class EthereumTransactionBuilder(private val chain: Chain) {
         return TransactionToSign(transaction, listOf(hash))
     }
 
-    fun buildToSend(signature: ByteArray, transactionToSign: TransactionToSign, walletPublicKey: ByteArray): ByteArray {
+    fun buildToSend(signature: ByteArray, transactionToSign: TransactionToSign): ByteArray {
         val r = BigInteger(1, signature.copyOfRange(0, 32))
         val s = BigInteger(1, signature.copyOfRange(32, 64))
 
@@ -128,7 +117,7 @@ private class EthereumTransactionBuilder(private val chain: Chain) {
     }
 }
 
-private class TransactionToSign(val transaction: Transaction, val hashes: List)
+class TransactionToSign(val transaction: Transaction, val hashes: List)
 
 enum class GasLimit(val value: Long) {
     Default(21000),
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 91%
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 25fa28df4f..77ab787568 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,11 +1,11 @@
-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.createRetrofitInstance
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.async
 import kotlinx.coroutines.coroutineScope
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/InfuraApi.kt
similarity index 93%
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/InfuraApi.kt
index df84fae5ad..ec6845b1d0 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/InfuraApi.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
 
 import com.squareup.moshi.JsonClass
 import retrofit2.http.Body
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/InfuraProvider.kt
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/InfuraProvider.kt
index 2a04de5825..ec29d6ec6c 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/InfuraProvider.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
 
 class InfuraProvider(private val api: InfuraApi) {
     suspend fun getBalance(address: String) = api.postToInfura(createInfuraBody(InfuraMethod.GET_BALANCE, address))
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/InfuraResponse.kt
similarity index 90%
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/InfuraResponse.kt
index 6e193290b5..7f8c2c088e 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/InfuraResponse.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
 
 import com.squareup.moshi.Json
 import com.squareup.moshi.JsonClass
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddress.kt
new file mode 100644
index 0000000000..4728c0cda6
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddress.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/XrpAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddress.kt
new file mode 100644
index 0000000000..9c0b49c23a
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddress.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 60%
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 bb2379feb6..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,29 +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()
+    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)
@@ -32,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 eac4edb59e..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 addressBytes = addressBaos.toByteArray()
-            return addressBytes.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/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..ad6faa8d6e
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt
@@ -0,0 +1,24 @@
+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)
+}
\ 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..f2be55b6f0 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,91 @@
 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 com.tangem.blockchain.blockchains.binance.BinanceAddressService
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinAddressService
+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
 
 import java.math.BigDecimal
 
 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"),
+    Ethereum("ETH", "ETH", "Ethereum"),
+    Rootstock("", "", ""),
+    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
+        Bitcoin, BitcoinTestnet, Ethereum, Rootstock, Binance, BinanceTestnet -> BigDecimal.ROUND_DOWN
         Cardano -> BigDecimal.ROUND_UP
         else -> BigDecimal.ROUND_HALF_UP
     }
 
-    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 decimals(): Int = when (this) {
+        Bitcoin, BitcoinTestnet, Binance, BinanceTestnet -> 8
+        Cardano, XRP -> 6
+        Ethereum, Rootstock -> 18
+        Stellar -> 7
+        Unknown -> 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 pendingTransactionsTimeout(): Int = when (this) {
+        else -> 0
+    }
+
+    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)
+        Ethereum -> EthereumAddressService()
+        Rootstock -> throw Exception("unsupported blockchain")
+        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"
+        Cardano -> "https://cardanoexplorer.com/address/$address"
+        Ethereum -> if (token == null) {
+            "https://etherscan.io/address/"
+        } else {
+            "https://etherscan.io/token/${token.contractAddress}?a=$address"
         }
+        Rootstock -> {
+            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/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..6f03468733 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,68 @@ 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))
+
+        exploreUrl = blockchain.getExploreUrl(address, token)
+        shareUrl = blockchain.getShareUri(address)
+    }
+
+    fun setAmount(amount: Amount) {
+        amounts[amount.type] = amount
+    }
+
+    fun setCoinValue(value: BigDecimal) {
+        val amount = Amount(value, blockchain, address)
+        setAmount(amount)
+    }
+
+    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
+    }
+
+//    fun validateTransaction(amount: Amount, fee: Amount?): EnumSet {
+//        TODO("not implemented")
+//    }
 }
 
-data class TransactionData(
-        val amount: Amount,
-        val fee: Amount?,
-        val sourceAddress: String,
-        val destinationAddress: String,
-        var status: TransactionStatus = TransactionStatus.Unconfirmed,
-        var date: Calendar? = null
-)
-
 enum class AmountType { Coin, Token, Reserve }
 
-enum class TransactionStatus { Confirmed, Unconfirmed }
-
-enum class ValidationError { WrongAmount, WrongFee, WrongTotal }
-
 interface TransactionValidator {
-    fun validateTransaction(amount: Amount, fee: Amount?): EnumSet
+    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..e0a28e9678 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
@@ -1,14 +1,25 @@
 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.cardano.CardanoTransactionBuilder
+import com.tangem.blockchain.blockchains.cardano.CardanoWalletManager
+import com.tangem.blockchain.blockchains.cardano.network.CardanoNetworkManager
+import com.tangem.blockchain.blockchains.ethereum.Chain
+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
 
 object WalletManagerFactory {
@@ -18,69 +29,72 @@ 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
+                        card.cardId, wallet,
+                        BitcoinTransactionBuilder(walletPublicKey),
+                        BitcoinNetworkManager()
                 )
             }
             Blockchain.BitcoinTestnet -> {
                 return BitcoinWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet,
-                        isTestNet = true
+                        card.cardId, wallet,
+                        BitcoinTransactionBuilder(walletPublicKey, true),
+                        BitcoinNetworkManager(true)
                 )
             }
             Blockchain.Ethereum -> {
                 val chain = Chain.Mainnet
                 return EthereumWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet,
-                        chain = chain
+                        cardId, wallet,
+                        EthereumTransactionBuilder(walletPublicKey, chain),
+                        EthereumNetworkManager()
                 )
             }
             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 -> {
+                val networkManager = BinanceNetworkManager()
                 return BinanceWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet
+                        cardId, wallet,
+                        BinanceTransactionBuilder(walletPublicKey, networkManager.client),
+                        networkManager
                 )
             }
             Blockchain.BinanceTestnet -> {
+                val networkManager = BinanceNetworkManager(true)
                 return BinanceWalletManager(
-                        cardId = card.cardId,
-                        walletPublicKey = walletPublicKey,
-                        wallet = wallet,
-                        isTestNet = true
+                        cardId, wallet,
+                        BinanceTransactionBuilder(walletPublicKey, networkManager.client, true),
+                        networkManager
                 )
             }
             else -> return null
@@ -91,13 +105,12 @@ 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
+        val decimals: Int
 )
\ 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 97%
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 dec399633b..a3ecaaac41 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
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/ethereum/EthereumAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressTest.kt
similarity index 72%
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..d445d379f7 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,21 @@ import org.junit.Test
 
 internal class EthereumAddressTest {
 
+    private val addressService = EthereumAddressService()
+
     @Test
     fun makeAddressFromCorrectPublicKey() {
         val walletPublicKey = "04BAEC8CD3BA50FDFE1E8CF2B04B58E17041245341CD1F1C6B3A496B48956DB4C896A6848BCF8FCFC33B88341507DD25E5F4609386C68086C74CF472B86E5C3820".hexToBytes()
         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()
     }
 }
\ 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..9c15645ed2 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,12 @@ 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.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

From 894e601444dc586c713521281254a0b6735483d6 Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Thu, 23 Apr 2020 11:47:09 +0300
Subject: [PATCH 12/48] Updated on 2026-08-14

---
 ...anceAddress.kt => BinanceAddressService.kt} |  0
 .../binance/BinanceTransactionBuilder.kt       | 18 ++++++++++++------
 .../binance/BinanceWalletManager.kt            | 18 +++++++++++-------
 .../binance/network/BinanceNetworkManager.kt   | 15 ++++++++++-----
 ...coinAddress.kt => BitcoinAddressService.kt} |  0
 .../bitcoin/BitcoinWalletManager.kt            |  2 +-
 ...danoAddress.kt => CardanoAddressService.kt} |  0
 ...eumAddress.kt => EthereumAddressService.kt} |  0
 .../ethereum/network/EthereumNetworkManager.kt |  3 +--
 ...llarAddress.kt => StellarAddressService.kt} |  0
 .../{XrpAddress.kt => XrpAddressService.kt}    |  0
 .../com/tangem/blockchain/common/Amount.kt     |  4 +++-
 .../java/com/tangem/blockchain/common/Token.kt |  7 +++++++
 .../com/tangem/blockchain/common/Wallet.kt     |  9 ---------
 .../blockchain/common/WalletManagerFactory.kt  | 18 +++++-------------
 15 files changed, 50 insertions(+), 44 deletions(-)
 rename blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/{BinanceAddress.kt => BinanceAddressService.kt} (100%)
 rename blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/{BitcoinAddress.kt => BitcoinAddressService.kt} (100%)
 rename blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/{CardanoAddress.kt => CardanoAddressService.kt} (100%)
 rename blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/{EthereumAddress.kt => EthereumAddressService.kt} (100%)
 rename blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/{StellarAddress.kt => StellarAddressService.kt} (100%)
 rename blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/{XrpAddress.kt => XrpAddressService.kt} (100%)
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/common/Token.kt

diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddressService.kt
similarity index 100%
rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddressService.kt
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
index 9de779d162..49c7c20368 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt
@@ -1,6 +1,5 @@
 package com.tangem.blockchain.blockchains.binance
 
-import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiRestClient
 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
@@ -8,6 +7,8 @@ import com.tangem.blockchain.blockchains.binance.client.encoding.message.Transac
 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
@@ -15,7 +16,7 @@ import org.bitcoinj.core.Utils
 import java.math.BigInteger
 
 class BinanceTransactionBuilder(
-        publicKey: ByteArray, private val client: BinanceDexApiRestClient, isTestNet: Boolean = false
+        publicKey: ByteArray, isTestNet: Boolean = false
 ) {
     var accountNumber: Long? = null
     var sequence: Long? = null
@@ -26,7 +27,12 @@ class BinanceTransactionBuilder(
     private var transactionAssembler: TransactionRequestAssemblerExtSign? = null
     private var transferMessage: TransferMessage? = null
 
-    fun buildToSign(transactionData: TransactionData): ByteArray {
+    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
@@ -36,12 +42,12 @@ class BinanceTransactionBuilder(
 
         val options = TransactionOption.DEFAULT_INSTANCE
 
-        val accountData = BinanceAccountData(chainId, accountNumber!!, sequence!!)
+        val accountData = BinanceAccountData(chainId, accountNumber, sequence)
 
-        transactionAssembler = client.prepareTransfer(transfer, accountData, prefixedPubKey, options, true)
+        transactionAssembler = TransactionRequestAssemblerExtSign(accountData, prefixedPubKey, options)
         transferMessage = transactionAssembler!!.createTransferMessage(transfer)
 
-        return transactionAssembler!!.prepareForSign(transferMessage).calculateSha256()
+        return Result.Success(transactionAssembler!!.prepareForSign(transferMessage).calculateSha256())
     }
 
     fun buildToSend(signature: ByteArray): ByteArray {
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
index 956c22f537..e8d2b759eb 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt
@@ -39,14 +39,18 @@ class BinanceWalletManager(
     }
 
     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)
+        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)
+                }
             }
-            is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
         }
     }
 
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt
index f843695726..92532a3ceb 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt
@@ -1,6 +1,7 @@
 package com.tangem.blockchain.blockchains.binance.network
 
 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
@@ -14,11 +15,15 @@ import okhttp3.RequestBody
 import java.math.BigDecimal
 
 class BinanceNetworkManager(isTestNet: Boolean = false) {
-    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
-    )
+    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 {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt
similarity index 100%
rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt
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
index 0812b70c17..8d38566e23 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
@@ -89,6 +89,6 @@ class BitcoinWalletManager(
     private fun BigDecimal.calculateFee(transactionSize: BigDecimal): BigDecimal {
         val bytesInKb = BigDecimal(1024)
         return this.divide(bytesInKb).multiply(transactionSize)
-                .setScale(8, blockchain.roundingMode())
+                .setScale(8, BigDecimal.ROUND_DOWN)
     }
 }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt
similarity index 100%
rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt
similarity index 100%
rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
index 77ab787568..257dd29787 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
@@ -1,6 +1,5 @@
 package com.tangem.blockchain.blockchains.ethereum.network
 
-import com.tangem.blockchain.common.Blockchain
 import com.tangem.blockchain.extensions.Result
 import com.tangem.blockchain.extensions.SimpleResult
 import com.tangem.blockchain.extensions.retryIO
@@ -87,7 +86,7 @@ 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()
     }
 
 }
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt
similarity index 100%
rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt
similarity index 100%
rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt
index ad6faa8d6e..bf30907a9e 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt
@@ -21,4 +21,6 @@ data class Amount(
 
     constructor(amount: Amount, value: BigDecimal) :
             this(amount.currencySymbol, value, amount.address, amount.decimals, amount.type)
-}
\ No newline at end of file
+}
+
+enum class AmountType { Coin, Token, Reserve }
\ No newline at end of file
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/Wallet.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
index 6f03468733..9273763196 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
@@ -58,13 +58,4 @@ class Wallet(
         return amounts[amountType]?.value ?: BigDecimal.ZERO
     }
 
-//    fun validateTransaction(amount: Amount, fee: Amount?): EnumSet {
-//        TODO("not implemented")
-//    }
-}
-
-enum class AmountType { Coin, Token, Reserve }
-
-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/WalletManagerFactory.kt b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
index e0a28e9678..b5bf3032f2 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
@@ -82,19 +82,17 @@ object WalletManagerFactory {
                 )
             }
             Blockchain.Binance -> {
-                val networkManager = BinanceNetworkManager()
                 return BinanceWalletManager(
                         cardId, wallet,
-                        BinanceTransactionBuilder(walletPublicKey, networkManager.client),
-                        networkManager
+                        BinanceTransactionBuilder(walletPublicKey),
+                        BinanceNetworkManager()
                 )
             }
             Blockchain.BinanceTestnet -> {
-                val networkManager = BinanceNetworkManager(true)
                 return BinanceWalletManager(
                         cardId, wallet,
-                        BinanceTransactionBuilder(walletPublicKey, networkManager.client, true),
-                        networkManager
+                        BinanceTransactionBuilder(walletPublicKey, true),
+                        BinanceNetworkManager(true)
                 )
             }
             else -> return null
@@ -107,10 +105,4 @@ object WalletManagerFactory {
         val decimals = card.cardData?.tokenDecimal ?: return null
         return Token(symbol, contractAddress, decimals)
     }
-}
-
-data class Token(
-        val symbol: String,
-        val contractAddress: String,
-        val decimals: Int
-)
\ No newline at end of file
+}
\ No newline at end of file

From 0131e08b689d201ede287db0c0ceba55d3891b5b Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Thu, 23 Apr 2020 13:20:46 +0300
Subject: [PATCH 13/48] Updated on 2026-08-14

---
 settings.gradle                               |   2 +-
 .../_arch/widget/ItemWidgetBuilder.kt         |  12 --
 .../_arch/widget/impl/StubWidget.kt           |  15 --
 .../tangem/tangemtest/ucase/variants/Ids.kt   |  11 --
 .../ui/DepersonalizeActionFragment.kt         |  13 --
 .../ucase/variants/responses/item/TextItem.kt |  12 --
 .../ui/widget/ResponseItemBuilder.kt          |  23 ---
 .../variants/sign/ui/SignActionFragment.kt    |  13 --
 .../res/drawable/ic_launcher_background.xml   | 170 ------------------
 .../res/mipmap-anydpi-v26/ic_launcher.xml     |   5 -
 .../mipmap-anydpi-v26/ic_launcher_round.xml   |   5 -
 .../src/main/res/mipmap-hdpi/ic_launcher.png  | Bin 2963 -> 0 bytes
 .../res/mipmap-hdpi/ic_launcher_round.png     | Bin 4905 -> 0 bytes
 .../src/main/res/mipmap-mdpi/ic_launcher.png  | Bin 2060 -> 0 bytes
 .../res/mipmap-mdpi/ic_launcher_round.png     | Bin 2783 -> 0 bytes
 .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4490 -> 0 bytes
 .../res/mipmap-xhdpi/ic_launcher_round.png    | Bin 6895 -> 0 bytes
 .../main/res/mipmap-xxhdpi/ic_launcher.png    | Bin 6387 -> 0 bytes
 .../res/mipmap-xxhdpi/ic_launcher_round.png   | Bin 10413 -> 0 bytes
 .../main/res/mipmap-xxxhdpi/ic_launcher.png   | Bin 9128 -> 0 bytes
 .../res/mipmap-xxxhdpi/ic_launcher_round.png  | Bin 15132 -> 0 bytes
 {tangem-demo => tangem-devkit}/.gitignore     |   0
 {tangem-demo => tangem-devkit}/build.gradle   |   2 +-
 .../proguard-rules.pro                        |   0
 .../src/main/AndroidManifest.xml              |   8 +-
 .../src/main/ic_launcher-playstore.png        | Bin 0 -> 14393 bytes
 .../java/com/tangem/devkit}/AppTangemDemo.kt  |   8 +-
 .../com/tangem/devkit}/Old_MainActivity.kt    |   2 +-
 .../tangem/devkit}/TestUserDataActivity.kt    |   2 +-
 .../tangem/devkit}/_arch/SingleLiveEvent.kt   |   2 +-
 .../devkit}/_arch/structure/HelpAbstracts.kt  |   2 +-
 .../com/tangem/devkit}/_arch/structure/Ids.kt |   2 +-
 .../tangem/devkit}/_arch/structure/Logger.kt  |   2 +-
 .../_arch/structure/abstraction/Extension.kt  |   4 +-
 .../_arch/structure/abstraction/Item.kt       |   4 +-
 .../_arch/structure/abstraction/ItemGroup.kt  |   6 +-
 .../structure/abstraction/ItemViewModel.kt    |   8 +-
 .../structure/abstraction/ModelConverter.kt   |   2 +-
 .../_arch/structure/abstraction/Plugin.kt     |   2 +-
 .../devkit}/_arch/structure/impl/Items.kt     |   6 +-
 .../devkit/_arch/widget/ItemWidgetBuilder.kt  |  12 ++
 .../devkit}/_arch/widget/WidgetBuilder.kt     |  14 +-
 .../_arch/widget/abstraction/ViewWidget.kt    |  12 +-
 .../_arch/widget/impl/LinearGroupWidget.kt    |   8 +-
 .../devkit/_arch/widget/impl/StubWidget.kt    |  15 ++
 .../com/tangem/devkit}/_main/MainActivity.kt  |   4 +-
 .../com/tangem/devkit}/_main/MainViewModel.kt |   2 +-
 .../_main/entryPoint/ActionListFragment.kt    |  16 +-
 .../devkit}/_main/entryPoint/RvActions.kt     |  10 +-
 .../tangem/devkit}/commons/Abstractions.kt    |   2 +-
 .../devkit}/commons/DialogController.kt       |   2 +-
 .../tangem/devkit}/commons/GlobalFunctions.kt |   2 +-
 .../java/com/tangem/devkit}/commons/Logger.kt |   2 +-
 .../devkit}/commons/view/MultiActionView.kt   |   8 +-
 .../devkit}/extensions/AndroidComponents.kt   |   2 +-
 .../tangem/devkit}/extensions/CardConfig.kt   |   2 +-
 .../com/tangem/devkit}/extensions/List.kt     |   2 +-
 .../devkit}/extensions/view/Transitions.kt    |   2 +-
 .../com/tangem/devkit}/ucase/NavigationOp.kt  |   4 +-
 .../devkit}/ucase/domain/actions/Action.kt    |  16 +-
 .../domain/actions/DepersonalizeAction.kt     |  12 +-
 .../ucase/domain/actions/PersonalizeAction.kt |  30 ++--
 .../ucase/domain/actions/ScanAction.kt        |   8 +-
 .../ucase/domain/actions/SignAction.kt        |  12 +-
 .../domain/paramsManager/ItemsManager.kt      |  12 +-
 .../managers/BaseItemsManager.kt              |  24 +--
 .../managers/PersonalizationItemsManager.kt   |  12 +-
 .../paramsManager/managers/SimpleManagers.kt  |  14 +-
 .../afterAction/AfterActionModifiers.kt       |   6 +-
 .../triggers/afterAction/AfterScanModifier.kt |  16 +-
 .../ParamChangeConsequence.kt                 |  14 +-
 .../domain/responses/ResponseJsonConverter.kt |   4 +-
 .../com/tangem/devkit}/ucase/resources/Ids.kt |   4 +-
 .../ucase/resources/MainResourceHolder.kt     |  20 +--
 .../devkit}/ucase/resources/ResourseTypes.kt  |   2 +-
 .../resources/initializers/ActionResources.kt |  12 +-
 .../initializers/PersonalizationResources.kt  |  12 +-
 .../initializers/ResponseResources.kt         |  16 +-
 .../resources/initializers/TlvResources.kt    |  10 +-
 .../com/tangem/devkit}/ucase/tunnel/Errors.kt |   4 +-
 .../tangem/devkit}/ucase/tunnel/ViewScreen.kt |   4 +-
 .../devkit}/ucase/ui/ActionViewModel.kt       |  22 +--
 .../ucase/ui/BaseCardActionFragment.kt        |  18 +-
 .../tangem/devkit}/ucase/ui/BaseFragment.kt   |   6 +-
 .../ucase/ui/widgets/ParameterWidget.kt       |  18 +-
 .../com/tangem/devkit/ucase/variants/Ids.kt   |  11 ++
 .../ui/DepersonalizeActionFragment.kt         |  13 ++
 .../devkit}/ucase/variants/personalize/Ids.kt |   4 +-
 .../personalize/PersonalizationConfigStore.kt |  10 +-
 .../personalize/converter/DefaultValues.kt    |  10 +-
 .../personalize/converter/ItemTypes.kt        |   6 +-
 .../PersonalizationConfigConverter.kt         |  14 +-
 .../PersonalizationConfigToCardConfig.kt      |   4 +-
 .../dto/DefaultPersonalizationParams.kt       |   4 +-
 .../variants/personalize/dto/Manufacturer.kt  |   2 +-
 .../personalize/dto/PersonalizationConfig.kt  |   2 +-
 .../personalize/ui/PersonalizationFragment.kt |  48 ++---
 .../presets/PersonalizationPresetManager.kt   |  12 +-
 .../ui/presets/PersonalizationPresetView.kt   |   6 +-
 .../personalize/ui/presets/PresetRv.kt        |   7 +-
 .../personalize/ui/widgets/BaseAppWidget.kt   |  14 +-
 .../ui/widgets/DescriptionWidget.kt           |  10 +-
 .../personalize/ui/widgets/EditTextWidget.kt  |   6 +-
 .../personalize/ui/widgets/NumberWidget.kt    |   8 +-
 .../ui/widgets/PersonalizationItemBuilder.kt  |  10 +-
 .../personalize/ui/widgets/SpinnerWidget.kt   |  10 +-
 .../personalize/ui/widgets/SwitchWidget.kt    |   6 +-
 .../ui/widgets/TextHeaderWidget.kt            |   6 +-
 .../devkit}/ucase/variants/responses/Ids.kt   |   4 +-
 .../variants/responses/ResponseViewModel.kt   |  12 +-
 .../converter/BaseResponseConverter.kt        |  10 +-
 .../responses/converter/CardConverter.kt      |  22 +--
 .../responses/converter/ConvertersStore.kt    |   2 +-
 .../responses/converter/SimpleConverters.kt   |  10 +-
 .../ucase/variants/responses/item/TextItem.kt |  12 ++
 .../variants/responses/ui/ResponseFragment.kt |  18 +-
 .../responses/ui/widget/CheckBoxWidget.kt     |   6 +-
 .../ui/widget/ResponseItemBuilder.kt          |  23 +++
 .../responses/ui/widget/ResponseTextWidget.kt |   8 +-
 .../responses/ui/widget/ResponseWidget.kt     |   8 +-
 .../variants/scan/ui/ScanActionFragment.kt    |  12 +-
 .../variants/sign/ui/SignActionFragment.kt    |  13 ++
 .../src/main/res/anim/fade_in.xml             |   0
 .../src/main/res/anim/fade_out.xml            |   0
 .../src/main/res/anim/slide_in_left.xml       |   0
 .../src/main/res/anim/slide_in_right.xml      |   0
 .../src/main/res/anim/slide_out_left.xml      |   0
 .../src/main/res/anim/slide_out_right.xml     |   0
 .../res/color/menu_switch_color_thumb.xml     |   0
 .../res/color/menu_switch_color_track.xml     |   0
 .../res/color/mtrl_fab_bg_color_selector.xml  |   0
 .../mtrl_fab_icon_text_color_selector.xml     |   0
 .../drawable-v24/ic_launcher_foreground.xml   |   0
 .../res/drawable/ic_launcher_background.xml   |  74 ++++++++
 .../main/res/drawable/ic_share_white_18dp.xml |   0
 .../src/main/res/layout/a_main.xml            |   0
 .../res/layout/activity_test_user_data.xml    |   0
 .../dlg_personalization_preset_load.xml       |   0
 .../dlg_personalization_preset_save.xml       |   0
 .../main/res/layout/fg_base_action_layout.xml |   0
 .../src/main/res/layout/fg_card_response.xml  |   0
 .../src/main/res/layout/fg_entry_point.xml    |   0
 .../src/main/res/layout/m_divider_h.xml       |   0
 .../src/main/res/layout/m_divider_v.xml       |   0
 .../src/main/res/layout/menu_item_switch.xml  |   0
 .../src/main/res/layout/old_activity_main.xml |   0
 .../main/res/layout/v_content_container.xml   |   0
 .../main/res/layout/v_item_list_container.xml |   0
 .../src/main/res/layout/vh_actions.xml        |   0
 .../layout/vh_personalization_preset_name.xml |   0
 .../main/res/layout/vh_sp_dropdown_item.xml   |   0
 .../src/main/res/layout/vh_sp_item.xml        |   0
 .../main/res/layout/view_simple_button.xml    |   0
 .../res/layout/w_action_response_json.xml     |   0
 .../main/res/layout/w_card_incoming_param.xml |   0
 .../src/main/res/layout/w_empty.xml           |   0
 .../main/res/layout/w_field_description.xml   |   0
 .../layout/w_personalize_item_edit_text.xml   |   0
 .../res/layout/w_personalize_item_header.xml  |   0
 .../res/layout/w_personalize_item_number.xml  |   0
 .../res/layout/w_personalize_item_spinner.xml |   0
 .../res/layout/w_personalize_item_switch.xml  |   0
 .../layout/w_personalize_widgets_together.xml |   0
 .../main/res/layout/w_personilize_block.xml   |   0
 .../src/main/res/layout/w_response_item.xml   |   0
 .../res/layout/w_response_item_checkbox.xml   |   0
 .../res/layout/w_response_item_header.xml     |   0
 .../src/main/res/menu/menu_activity_main.xml  |   0
 .../main/res/menu/menu_fg_peronalization.xml  |   0
 .../src/main/res/menu/menu_fg_response.xml    |   0
 .../res/mipmap-anydpi-v26/ic_launcher.xml     |   5 +
 .../mipmap-anydpi-v26/ic_launcher_round.xml   |   5 +
 .../src/main/res/mipmap-hdpi/ic_launcher.png  | Bin 0 -> 1425 bytes
 .../mipmap-hdpi/ic_launcher_foreground.png    | Bin 0 -> 1728 bytes
 .../res/mipmap-hdpi/ic_launcher_round.png     | Bin 0 -> 3249 bytes
 .../src/main/res/mipmap-mdpi/ic_launcher.png  | Bin 0 -> 988 bytes
 .../mipmap-mdpi/ic_launcher_foreground.png    | Bin 0 -> 1101 bytes
 .../res/mipmap-mdpi/ic_launcher_round.png     | Bin 0 -> 2059 bytes
 .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1953 bytes
 .../mipmap-xhdpi/ic_launcher_foreground.png   | Bin 0 -> 2465 bytes
 .../res/mipmap-xhdpi/ic_launcher_round.png    | Bin 0 -> 4553 bytes
 .../main/res/mipmap-xxhdpi/ic_launcher.png    | Bin 0 -> 3061 bytes
 .../mipmap-xxhdpi/ic_launcher_foreground.png  | Bin 0 -> 4276 bytes
 .../res/mipmap-xxhdpi/ic_launcher_round.png   | Bin 0 -> 7425 bytes
 .../main/res/mipmap-xxxhdpi/ic_launcher.png   | Bin 0 -> 4348 bytes
 .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 6231 bytes
 .../res/mipmap-xxxhdpi/ic_launcher_round.png  | Bin 0 -> 10769 bytes
 .../src/main/res/navigation/navigation.xml    |  28 +--
 .../src/main/res/values/colors.xml            |   0
 .../src/main/res/values/dimens.xml            |   0
 .../main/res/values/dimens_item_widget.xml    |   0
 .../res/values/ic_launcher_background.xml     |   4 +
 .../src/main/res/values/strings.xml           |   2 +-
 .../src/main/res/values/strings_action.xml    |   0
 .../res/values/strings_personalization.xml    |   0
 .../src/main/res/values/strings_response.xml  |   0
 .../src/main/res/values/strings_scan.xml      |   0
 .../src/main/res/values/strings_tlv.xml       |   0
 .../src/main/res/values/styles.xml            |   0
 .../src/main/res/values/theme_debug.xml       |   0
 .../src/main/res/xml/nfc_tech_filter.xml      |   0
 201 files changed, 600 insertions(+), 693 deletions(-)
 delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt
 delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt
 delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt
 delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
 delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/item/TextItem.kt
 delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt
 delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt
 delete mode 100644 tangem-demo/src/main/res/drawable/ic_launcher_background.xml
 delete mode 100644 tangem-demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
 delete mode 100644 tangem-demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
 delete mode 100644 tangem-demo/src/main/res/mipmap-hdpi/ic_launcher.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-hdpi/ic_launcher_round.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-mdpi/ic_launcher.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-mdpi/ic_launcher_round.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-xhdpi/ic_launcher.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-xhdpi/ic_launcher_round.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-xxhdpi/ic_launcher.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png
 delete mode 100644 tangem-demo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
 rename {tangem-demo => tangem-devkit}/.gitignore (100%)
 rename {tangem-demo => tangem-devkit}/build.gradle (97%)
 rename {tangem-demo => tangem-devkit}/proguard-rules.pro (100%)
 rename {tangem-demo => tangem-devkit}/src/main/AndroidManifest.xml (91%)
 create mode 100644 tangem-devkit/src/main/ic_launcher-playstore.png
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/AppTangemDemo.kt (79%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/Old_MainActivity.kt (99%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/TestUserDataActivity.kt (99%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/SingleLiveEvent.kt (96%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/HelpAbstracts.kt (86%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/Ids.kt (82%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/Logger.kt (94%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/abstraction/Extension.kt (81%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/abstraction/Item.kt (87%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/abstraction/ItemGroup.kt (89%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/abstraction/ItemViewModel.kt (93%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/abstraction/ModelConverter.kt (86%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/abstraction/Plugin.kt (75%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/structure/impl/Items.kt (89%)
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/ItemWidgetBuilder.kt
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/widget/WidgetBuilder.kt (65%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/widget/abstraction/ViewWidget.kt (87%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_arch/widget/impl/LinearGroupWidget.kt (53%)
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/impl/StubWidget.kt
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_main/MainActivity.kt (97%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_main/MainViewModel.kt (95%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_main/entryPoint/ActionListFragment.kt (84%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/_main/entryPoint/RvActions.kt (89%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/commons/Abstractions.kt (87%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/commons/DialogController.kt (98%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/commons/GlobalFunctions.kt (83%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/commons/Logger.kt (77%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/commons/view/MultiActionView.kt (90%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/extensions/AndroidComponents.kt (92%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/extensions/CardConfig.kt (99%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/extensions/List.kt (90%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/extensions/view/Transitions.kt (87%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/NavigationOp.kt (85%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/actions/Action.kt (72%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/actions/DepersonalizeAction.kt (67%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/actions/PersonalizeAction.kt (66%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/actions/ScanAction.kt (50%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/actions/SignAction.kt (71%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/paramsManager/ItemsManager.kt (73%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/paramsManager/managers/BaseItemsManager.kt (72%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt (64%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/paramsManager/managers/SimpleManagers.kt (53%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt (66%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt (72%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt (78%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/domain/responses/ResponseJsonConverter.kt (97%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/resources/Ids.kt (75%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/resources/MainResourceHolder.kt (68%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/resources/ResourseTypes.kt (85%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/resources/initializers/ActionResources.kt (88%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/resources/initializers/PersonalizationResources.kt (97%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/resources/initializers/ResponseResources.kt (92%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/resources/initializers/TlvResources.kt (61%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/tunnel/Errors.kt (65%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/tunnel/ViewScreen.kt (81%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/ui/ActionViewModel.kt (89%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/ui/BaseCardActionFragment.kt (92%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/ui/BaseFragment.kt (88%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/ui/widgets/ParameterWidget.kt (89%)
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/Ids.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/Ids.kt (94%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/PersonalizationConfigStore.kt (85%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/converter/DefaultValues.kt (95%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/converter/ItemTypes.kt (96%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt (96%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt (97%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt (89%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/dto/Manufacturer.kt (98%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/dto/PersonalizationConfig.kt (98%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/PersonalizationFragment.kt (82%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/presets/PersonalizationPresetManager.kt (75%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/presets/PersonalizationPresetView.kt (55%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/presets/PresetRv.kt (89%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt (62%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt (78%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/widgets/EditTextWidget.kt (90%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/widgets/NumberWidget.kt (89%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt (63%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt (91%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/widgets/SwitchWidget.kt (86%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/personalize/ui/widgets/TextHeaderWidget.kt (70%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/Ids.kt (89%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/ResponseViewModel.kt (80%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/converter/BaseResponseConverter.kt (68%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/converter/CardConverter.kt (86%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/converter/ConvertersStore.kt (90%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/converter/SimpleConverters.kt (74%)
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/item/TextItem.kt
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/ui/ResponseFragment.kt (81%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/ui/widget/CheckBoxWidget.kt (81%)
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/ui/widget/ResponseTextWidget.kt (80%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/responses/ui/widget/ResponseWidget.kt (80%)
 rename {tangem-demo/src/main/java/com/tangem/tangemtest => tangem-devkit/src/main/java/com/tangem/devkit}/ucase/variants/scan/ui/ScanActionFragment.kt (81%)
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/sign/ui/SignActionFragment.kt
 rename {tangem-demo => tangem-devkit}/src/main/res/anim/fade_in.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/anim/fade_out.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/anim/slide_in_left.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/anim/slide_in_right.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/anim/slide_out_left.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/anim/slide_out_right.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/color/menu_switch_color_thumb.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/color/menu_switch_color_track.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/color/mtrl_fab_bg_color_selector.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/color/mtrl_fab_icon_text_color_selector.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%)
 create mode 100644 tangem-devkit/src/main/res/drawable/ic_launcher_background.xml
 rename {tangem-demo => tangem-devkit}/src/main/res/drawable/ic_share_white_18dp.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/a_main.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/activity_test_user_data.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/dlg_personalization_preset_load.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/dlg_personalization_preset_save.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/fg_base_action_layout.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/fg_card_response.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/fg_entry_point.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/m_divider_h.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/m_divider_v.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/menu_item_switch.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/old_activity_main.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/v_content_container.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/v_item_list_container.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/vh_actions.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/vh_personalization_preset_name.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/vh_sp_dropdown_item.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/vh_sp_item.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/view_simple_button.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_action_response_json.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_card_incoming_param.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_empty.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_field_description.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_personalize_item_edit_text.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_personalize_item_header.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_personalize_item_number.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_personalize_item_spinner.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_personalize_item_switch.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_personalize_widgets_together.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_personilize_block.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_response_item.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_response_item_checkbox.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/layout/w_response_item_header.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/menu/menu_activity_main.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/menu/menu_fg_peronalization.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/menu/menu_fg_response.xml (100%)
 create mode 100644 tangem-devkit/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
 create mode 100644 tangem-devkit/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
 create mode 100644 tangem-devkit/src/main/res/mipmap-hdpi/ic_launcher.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-hdpi/ic_launcher_round.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-mdpi/ic_launcher.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-mdpi/ic_launcher_round.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher_round.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xxhdpi/ic_launcher.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xxxhdpi/ic_launcher.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
 create mode 100644 tangem-devkit/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
 rename {tangem-demo => tangem-devkit}/src/main/res/navigation/navigation.xml (80%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/colors.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/dimens.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/dimens_item_widget.xml (100%)
 create mode 100644 tangem-devkit/src/main/res/values/ic_launcher_background.xml
 rename {tangem-demo => tangem-devkit}/src/main/res/values/strings.xml (96%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/strings_action.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/strings_personalization.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/strings_response.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/strings_scan.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/strings_tlv.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/styles.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/values/theme_debug.xml (100%)
 rename {tangem-demo => tangem-devkit}/src/main/res/xml/nfc_tech_filter.xml (100%)

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-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/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/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/mipmap-anydpi-v26/ic_launcher.xml b/tangem-demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index eca70cfe52..0000000000
--- a/tangem-demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-    
-    
-
\ No newline at end of file
diff --git a/tangem-demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/tangem-demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index eca70cfe52..0000000000
--- a/tangem-demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-    
-    
-
\ No newline at end of file
diff --git a/tangem-demo/src/main/res/mipmap-hdpi/ic_launcher.png b/tangem-demo/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 898f3ed59ac9f3248734a00e5902736c9367d455..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2963
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
JPDHLkV1g@XpTGbB

diff --git a/tangem-demo/src/main/res/mipmap-hdpi/ic_launcher_round.png b/tangem-demo/src/main/res/mipmap-hdpi/ic_launcher_round.png
deleted file mode 100644
index dffca3601eba7bf5f409bdd520820e2eb5122c75..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4905
zcmV+^6V~jBP)sCJ+Khgs=qzz9*aFfTF@MBLc!81jy1$_D*`qMnYCeSOOSS
zh~l6kD7e75FgOnvP=_arGNJ+k0uBt2?%a3It*Y+o?&`L?*#fV=?@xECZq+^KuXD~l
z_tdQ>JOSF%q}x5h@>Id>gloHZ!fr_@%N)Qad*
zI}<}@Poh`#X29>b50CkB%{yWf?z(t0rQf48W{j1a($$IrZ9{N{@#9Wqx}%DM^fL-m
z`X#_s9{BwX>^};}KMtudHpmMyRCq34!+|XCtnqeli6}6}7JiE;H+GAtDViHuQ~X9`
zP0^{y>Ov~ufreT-w7!yx_c;QOV>|0UxJK{lqSx`7cx`b!OLV*;Ez4q9Y_XdB$PKk4
z+Aq(kmz%WbOV3IpYsa0#_Vd?)>*2Lc
zn)
zvVw}USbx|rlL2LMl<$^rb@TnK-;J83fd3GKh6#=C5WlXv83lKz{0$(8x1g-%;q}$b
z1=&8M<_eQZO4eJk#nshu9TsZZ11Z~hVkpt8oA4831ZP3Fj3C~EG*%gSnciYD-cpkI
zj{J=o1Bg-kJrjfz${Js8D?vh>vJwR{=4)c@ZtTqt#tHRR<9b9ew~kVG6oc8(lNE=Pu>)F6HIf=`kIH3oJBkSO2;+SnG--LDU5kx
zC0($63w`LN)znoR#GhW@M5n&8!EGBnj_usF!G5qm>{qhQ`sdB#K+CoQF7f-se
z?#7!W#vF7jw48A-)Ulxz@0b)?7iKWQI+fE6Ud#Le4H#?
z*wIeM>mtaY-X;WO^yfR4Adp*W)N+A4Yv~TqOy)a5g8AjAEfJ4acRWELKhbNNKrc!(
z&!ze1YQkhsw=A3()t7B^pu2=1)CJq>k}s1bv-{fV>=i+J^=8Lh=Pn_L(@77X+QqLi
zSM!u0YfVL$I)-o^+D$g^8iKevTQlfM$k
z8A}@MLX0cd>SIdp0%mtcJaTy&g94$WW9QB?a!}a+T)Rd$eDM!(fgHCnNCsx!svv{S
z@9-MjC~sfoKOK+dN>{)_sV(mjhof{qxwvX-7Df1DQTI(g)o
z>s6XRhgIhE&g6I!q!Sxz>EW}#SnudH5WeBSekYPp`9~Vp)1-G^r@B46=-SWs(Z;X8
z02evPKG%G)Nf*Dpl|HNSeWdw0`U#|(mpohWGktDRF;Bo`A2K9T}=|{(p(X*E>(aYDag2maC6ay^+
zk7K(%-yfyPJKv6-`qy{#2oNV$%o|*T^A7!TivIn?ahqEKj{ka&
z1#*R?@}3aHxtTmO=~U-w(|Xu(B2EmI8B50EvnOk9*GGbcJZK_}E{D#X@`(&j@%hg`
zvgc+#V--FuV!3MbUy#-AgE($~;1gULUsw`94gkTgN-nwH+_TiyxD=9t>#{5GHSR=+VC|3HUj>p$m
zF=5TOh#WCVpZxG0Mfs)VLU~bclwVS}a)Tud>)$I3M@i?-ZEb;CNQ$OT?W!i>WPgI2K-%bDAV3iV{YFpxIA_D~#F;z7mA_2ToA0
zz;J#$$gz?H{f~tykIYwsN^&ofDHEcc3HtMs_ksmo_H~%=S!trXzdzzq@XJ@P(yd>A
zNh?17fF3z>nk9kWDu3|gPt>$~7yTPdOfi9U)o%B9hiOkpO1&hgnGv)+?=lcH(3zlF
z)1$73Anp4*+{T@4Fog)rOQR%n2^~~bNRNp!ZBKCK-@noL+ER9Y8^~8Se*UT3c%b7TLtsqf14?X2rJH|pTWGz8-n&h;14Ov
z#z`fWWiO*ed){^1em`8ly%A*0PxH#fdX?ndqyYz250dgaflgvo+
zJV{-K7`Kl9diHm3hJcly
zengd6QU#LyA&GQLke(wb%#d-6v?HDD3F1f!>{yWg5#|xN?9J0WD7v
z;l~T-X%q||!6msgyeyyoVe>kdc~D4&(TwHYfu@{&z(qUzHQHR6u}wE)#*5x&(o-7O
zw@7jXJiKu=?N?bq2i6qRnT;Fhz}ixmnKagt?l)w-)BzP^3@k~*Wp97@gTqNpbZPR
zy$S@S*a*rO5riY0Ud8DORwP?Adna(v!QOi8<4{14v_(t!#gLwrT(JX4+=L_$A%|pc
zXmt?{(xut$cSLlVo(30Y+4jMCjtGY2uwS_m`dG?inGHD{f(#luthNkXB!$a+a>Yn-
zK~O4(yi`tCXd{2}Q7v*n=1Z+W<4npgXvmO$@_f~4uO9n2kmNBzD-1S*B*<|l$eA1@
z#7YnNRI?n@&u)dVc}PLoFRSt;=(FF*KZU}pY9KTJIT}LH;AkK9+f+gq?~2G
z5#)j#B*jLMG&xp+>KqBOk%JavBS>X$J^3kS)@II(S5WsDjsv%=Is#fvo%C=}VJ79C
zu4XlR`eZez2+jdtZkwl~W8jW?O+mCNa{m8IZH0?IgmNQbXlLF4NHs~k~IN5KqX9?a!NuC1W)
zYsz_4m;p2B(rNZ|bq7KTK$6gs(A^{fuF@Y|C$u<+
zeYYY3Gn!;AyU4%y;QbOj@OvR}OAX~1e60jYkYi7fGch)Tw9J(lK@#LJf(#;pbZHir
zB&II7NTQ;~GF=lByQEr3##lyCO%LAbWBIf<~=H3(^R#^&aTfo7d6DH>o+Z>qt5T4kD_BN0|i~wM{;)
zQDk{ivKxY=^BgNdF34d7nZyJ+lfx0Dp`+JSH331CES`Ogv=4}5y2Zs^=PLgRUr*8)xq~v8}M$U
zLOie%h{Y~;4ui@DJqJtzG0(xF97ij3CmS@3983s@mls%CJveFs=+cwd>4yDCfvm&e
z!5#1cb>BZeo;3I6^_Foju7YH-rfKy08n55>!E;8!9e--mI{HXM9UTG5-bio}4&^qi
zE~isoTuo;*ZeZWBo`Vxk8!8zvL!O6k1VIoUEds_IbStzRBxm^3Gm}w=_OY=YZzMUw
zCMRKGc;U#1X^+ec$Xs%Pdmk&k3F4CX?~8#O4uI@BY`Kmq!J0Uv+5@a9tSpblLOV))hr-m%u%E*xX4>hBnb`e#B{kyo18?4;4dFUw7M^53Rybu
z824~aV-c4}JY7hR>xV*sAg3fy6mLS7LnaNbD2_RfLpjc^aO!{=GM5BGo|C6yB@D9o
z>0^ok{idSKZKI>_xtZixNop4pgLk193Gf?Ao}Iaq1y@!>f+5tPYW8ZSJw77VrMS#<
zkU%RzE|Nf;cya`#HnR*FQxeQ`<~;c>Y2!DH$r^KWEyp=Wij2g!i9-MbcG4!}i^_bU5@kB8)I8_7rlg4C4#@0J#r1#qtCFoLQJrO9E%
zt`s&x4TB&q*Dj{y&(q&hhKJ${y!SHMP)2fle^N(DLRef11H>ps$3G)mFl*0{%0f#}
zK?dh~_$b?`;>l7qyL_2N&lj^qc}_^Fh@jk*X2^mq@ZAj7%2fh^%)qQAA
zZ3@z-Q#;=6kf<1C_wHkrQ^se@o}KxQJaxedR`bDn4a5ufwojD_f5pWfSc3vWaa8IF
z!+Z?HAa-6lxNq{aCuDPGysez_-`RL=-eMvHI(P2D`bHVO)$w1e0^WP&R`mBpOFQKR>_w07I2s
zIwmM1dOoD+-D@HOzvDhQc0abkw){E0*){N5cul3$g6n-PcZs4>q4bV;KlnN~%kbn}!V8maBKN?~PDN77Zj6xT>KxccMrJYVYoo)adu8>W%
zmv*U9KCo@D{=sCEstjFGl{%?R9Bd_S;`C@G{FNG~X;+5Z0h*dJ1r|5g4wB8=?S#Zy
zt3sAsXM@aL)nWAyCYz08&uXYp$}38nkeVvA0^C`|ts22ve2Y2>mf~J~_Til&y|FUz
z%#l)O^+i>bDr7NsoiC}@GN^5^{=sAkPSF?VF#7ysBZm@DnF?;le_~|Un-B}Itc2u|IlX``0V1M3jKlcCTY73+_+5_^1
zO|_7<%PEyPhbqxCEnFv#uom}FdO$lY%`OKi#h<5Co8ZPBFZA{I!|wAx!c?aisEfxs
z?T$*AUTc9D8_Hpt%L37MoudCVml+QIa-Q{X>F$I{4t=051yd2KXJy7g2ho;dPy9%m
z&|3%hK)bgG?)N=_y3^l5BAU(HpEX16sc+%jjdr-wd5e*w`^js6LDPj(u<}q7%axih
zoQB@MKIp*y%l0*noe!-3>L8Nvz`X|#;P=}%;m-Yg;Pd%Hg6jXkc0~S4=WWP7_Qlvb
zG1>9)E0=~O9SWcSdXd@th$;|?3QV+Z@1bR;tdb%M2ko%(GTA+u#e@F7$5Mb+;mB`4
z!xVgv{Jp95%Y!hpT7-)jrQ~&IJFY@h`L?H{0L^~?0CJaZ
z{tZjr)sT1m=#VQw^-Fg;S$l@ofMbuY0uykS+-JWJI=h~`ci}FY$50ATJ+%wA
zO77DqVS>075^y6_kJfo$5r(}BH#(lkaYNw(n&Hbh&XQd-lYhgIk-UdHhZ4HzOR6cX9O(7$kLq}D}u9EB;
z-dhHFDZZ<8Lc2GP(}(AKLrJ-Oau&a1s?6Nk^&FO
z6KSRZhEqx_SQs6S0+Eca!Fb^G1gONmI
zC+HbyhfVOuc?OI&h7uoNn}=`c_>iW5NO1q-GUX8K1^!Zxzl
z4XfveR)GIBSo>}=cI+IH9~|U>#(X~teA-&84{aZTo0BMk;yjBqEL^gX=_9kDnP=}a
z`+sm4^17nldnZj&U`51GznG$gf}Fz|OlbvM2~cNtN6bbO;LjW>4doDpXIHr_#-WEK
zTp3oTSyarnG|L?64R(Lh#u7IM@+CF;0?j-dAKR%u-gp$bMThf`Y=V%QniZFqb4;b%
z+^sU^c~$y+58W}2ds$fqbXadxS)oD}YcBF8+Kmro`dqK7bh9_jZo>N(2|7ZqH?6u%
zs@LZQps|*E)s_+u&N{X0R(-hsYauy#KI0bVpUP;&tcc8vw<4D;UKP1mLj0?AU!cHb
ztdAKWi}A~qZL?OzGg+1b@q^keUNsrViJ`HuE@E!RO5*b9*&nDxR@U?Q6pMIaj1kMY
qJl2nQa+aK&iDQb84*TpHAJ>1BQ$$nT?9A!_0000+Hy9+Dw
zQlg?UKB$_cZ8RBMYcyI%jkQf{#wz1Xr!PxQ>w~B~cKP~!=iIw{_rdOp7tZhwZ1+g(AXy-HL10DFmbXNx@L~
z3H0wQYEpsnp{iIyzhEeKgc((i$;}oAoqHl}Yb`&gx~}ISy|wl#
zwdwQ;nvEgzkAnwYj%g}=Nide26RJwsNTUEE)Q2P-5}7cQ3Z84R%7rdvN4sQKhOlPcRnSrOp+WGP}nNJgfkDx!pMkypKGe90p51ezT#4MxAxQ
zN3CC+fuRy0nP8u@+)%h}@FHZ>vWFTTCD?*bPf|6Oz4#LAYDsH*sO<_
z+8Vve2|wE19JrkK!TNc*tzkb>2=OxIfDS8-yiLEA$m0k(kQf0ZJlj+Q&+pg*@-o6x
zTdEi#&vL>m?`;jX+>v0bbWnM`S<~tiA>-z6^m&Xo6y=iH&}dMDp40vqOvn?CbR0P3
z0YX_`z8klIalWefMaf}lN@-MvK>)C@OTMQsvEFV1j6zbmglN3)tDNw{&IYft@#yp|U;GYg&z^)Rt7d@u#0Bpe
zimnOEmq&Tef~aWH7SjqERa#-iBMX%jZKUfNcy71bp|`IOKD_d0nA~D<-XkQV*jewl
zx|K$GjP@M*^t)>e04FWS7-Uwy|!6q{ICob5gfvYaErq&g;Btk^VqnotOu
zSN-|V;a*P<^rDbv9KD!YExR|ex)jop)as*$VeKa$K-3I_~rZ#$8n0D;V;;rwan!I2{&
zEnl34toAlI^wpPe
zlye)Ao4ycY%W~JdLaI0e(MHvF%G1SkH=uyAXf{=!ABS!n#lZ@o8CZ4XFmw8#1n{&R
zVs(YP+3GCIkwRjs%TCiYQa(?iP=b^m$jib}=-N*{ggXx&44S-zukU>W+LOO#ZOZ!~
zOnukpUM6x&FsRNVXIChVTfbhB(rD_SHz|4}839cXjAmbiVtspfigR#uEFjIMj@si>Ore+Oei$<1cCarcfF2@0*j682U1A9rp;
zlE=d6(}XYz#@Cd03QHCwxdi0=G&$N_{=Yy1XfbK~!v(L-Fa7gxu<_$VaOSVq1CpmY
z8$Ujb&-~r%UfZSfpfHyQ7GTlb5>~#R>JqSaSxPVhD7~ea?b-3_j}BnQxCvh0zmvuF
zfymQ6C7Oj$o(rpg(e8EsF8b6fI~#$e4S@tKotNPf@Ro97lv&dmNB}MOzKDHx{Td^7
z^e>kK&H&X>w(nxk__|+v<^;uhpfq|w0oCgN2n*&Uy98ur#zdLa9sUH2!{g=78$;%}
z1L1P#zaX{-%}ARM>G(3`OF*1abzPV`HC~?1g-^B_&(OXN<=~`T0!1J)ouwb`hnx4h
z9=m{>-*my^gYQ9FLp5Z*znzJYxJcY)*bL{8bEG_x3mc;?*yV2q=Kg#a+Xvy`pEue
zJ2#<55|A&7Ku(lOR2IUxb#E82l~|riL@t>>J=|1!XP{(Gfq7D*RSSuh3Wmux1H9O5
zbzVzIvg#nSb+dS_bpfB9xub!%!Jvc0T8>$5O?a$?#5xXzQ6&nfaS6~B@Yl=oyt`5J
zUi|^Lo>^h?bXpN!k$b{#I*o}Gg+L0KqjiNap+>{bdB$Wh1B{gdNt&z
zkU*wl;*p0Tp96`fH`Pew34JvBLf)EFl)AaU3W$CXzIJ5}*_hmnyplOlgkJ%5dN1-^
zfYFOQ7f|g*o(nK@@|F3Nh4!=hOBWWfJjm^}QhYrdl{|g|c5+Shdb>Od$s<#GvjwI%
znqg*ZJ*3tdIBXmlNOJbhCP>{}#ZfQ82y=FCgS0Is7aB~A{A+vOWk<4kG8-CsBA>N)
z2Ro)Vo9)zRim|LCBI$`F-!JxDQG~E+nVNaMkGbGoHB3M|cbfqm?Jyjr6ln%D
z61dqAY5B-YX2WN|HS&_#uo&dO1ZLdVcx6-*l>@yGiUd^twKIQ
z1myy3dN1;B0z4enBibGcLp_=&v^1A84wc`CetouQG9=$!N7f##SDg2(;-$
z`!;UT3E!5cpgGLm)#4Fpf{Qj}^JF&E4%N%lmmNV4&oVB`hy6ytSLkp=a!l^3{cMD2
zTZ1ifMFW4}K)*?$c>mDR24g)rEZIEGUiM-d`ALieTX6^VNp)73C?Y9z`9d?=c(?d1
zs~_K-`cOc>&%IHK9z-;#Xp`TMv(d*wB}E%mPIu_y`4;N)(a6iqDI;Sfv%{G`Tq?Y?
z`XY5qua{3ZRrAk6vM-O$&0Shch^Vh+#oUI{16*NgkrFgmFX!!x!YeN2Yr^QVW|_o)XG(ZcBN)a|R?)
zB#;P8w$4loZCthCwyD)Kv~>DA|AHfFa+EnB3aXYkonv5irz&0+e_1c`|f
ziIC%^3DMCrgrvlo!j#n640IkHIfLEfbrQs9Mtu8!_VBgvQKZl*M~Z$T%?|zlVT_2;
lV%Z2*hu);6rydA(}wUDXPCF_W1vnaRBK
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

diff --git a/tangem-demo/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/tangem-demo/src/main/res/mipmap-xhdpi/ic_launcher_round.png
deleted file mode 100644
index 14ed0af35023e4f1901cf03487b6c524257b8483..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6895
zcmVBruHaWfboaZ^`J@5OTb59uN+UwfO
z>5DKPj6xxy*f-15A^38Hcw8gS)fY>m7X^~)>WdY`i-Y7Ev5tB;lGU`#+aci!MOUUM
zD}qsF_F|N>IHn{!fdYTV_wX|;<46$x9(d2I{>ArDOEMG+AD^=P{ywF-GrY99`C;pd
zTVmI*ebJ{Z?*lK5{2OnL{2bsnz#klb&V^vTF8LL3idsEt+KcA+ISDVmw89n=b3!uh}YH8Am2dcyFwO
zP>3sYL|70%XiHU}0Zo+(MxFf$fG{c^GK8Lk0nm!?MOUlH=$7@wQ=P+?afrb30+O<`
ziTG*r2zL#G;JREn?w(KwKTW>kAG@~nvD;BDbNA6Sw3X7nOleNtO`EFE_iw7?Nk@V%
z2nn}DI|Z-=FUSS{e!iMKGH%z#^FftGb+nGAxybACovek#YjQ#vb&d*p+t1kJZ`xQz
z;u|ZlH|p$>-hl#GilOt>$n{u0Xl)T;>j-tlI@@Z?Wzp-=)#G34?74swCQ~ERfdKmc
zFhPnTvx5a7>%ShCv+=IbEiP%zhTLzjnoMn+{p#7s56cR+1Ip9!b!Tb
z`Sm7~BP+1z^;S0iG7&)FAn@&x7D5ZD8A|Rn^8#NH904lXb|d*p^Im_M3cx}s7!4)T
z9gHH`t8+}w++;htxjC@gx{~KPlVjj*{S_ks3$9(+#6u-Jl&IAP3pu!CJwK#M5t6c_
z>9wdD74a&~(E(Zk#1U@ZTtm|Z&dTxVSzAiRZr?zO5>r03qKN!s*CrAGLWn8vUzShH
zLj>)tEVfOD(e%jX+M_)bim*#E5_p?Gy16VcdB?_AS3UnYnfh>x4oMP&MNjS{^B>++6>|-QpN0X@X6L&Y0v_nr&QpJ?Nedk76e$t+1QRS1iuh%{F%%f!H-mR|<
zQLG8Eng=h6w*&uot15mDdp?pMw_z>mzOGmllD0RJTU#1Lm&egEdG8hyS)~+JzIUCL
zOasw+)T%|5zrIFI%imD16;(cBT?v`6d!z2=P1Pi}_cC
zaY){_eM2i&Osq}6Oy>Y2JfPjfx74>{k`N|n!sM^n$$Li~8z=DouS%NFPq=6oaadk$
z0*u&FPkPm9z)j6IfM-M)d8(pgV+4M-S4t-d{CpIET*U$q-ZNqpnS{w$epknMM*J)<
zPm6>bel7I#uL*$fN%fSIg0yd#CHM7kuV;h_C^iY@0i^Gty9+J2aLrPcO&e_I4V!m|%QLzX;!0D_phPA9;f
z54Vuq!_U%`L{EsIT^4|j0x3HRvX(Vc4%<2x@Oh2+Dn;)>o2t)Xj~&>w&Vc`00uyVP
z+rjjLt~xt1(^VjmUESy@cLz5nC)L@%fx;yxhQ-ro#ptR%A^-9B0u$XgK)sha_CY+|f}c==vHJ
zIsE14R^;ECC&mE-m5-zZK
z+8{Cl>U!wJC$s|y>+%=$e8oRsp!aOoBrJ@MF;SPkbU$$FNuOD87#(v%q_;vE<)g{{
z)}HI>svC+uv;Os$twg|H_&AuO>#CKsTo>rM<9BT$m9M@;K7t9+k|;62$@KkG-xKZ2
zhe^_oMi>opdhOmo+KXR&YGro*f{q}Ep3j$aj{uxYnw$E)-`r`v*$LKBT)@uM9ye4J
z-Q#1bNUOU9;6>Q;!8^3)TN3u@@%O2>^UtqNkTbvkW<`=Kz-yfT?N{=`iBIXo`W%cP
zOF@78`!8CjaFJ~gEr7rbg{*#HA!~+a`8W%{Bz>w?4Y=;y{O2FrCCt!4
zuy^g+qyHvTAKvPoK+M_<8JLnR5|X`g3r*75jg0vjI+5}2Tc>@aBLzSo8U5@X@4sm^
z5-ujt+fn`dMM}KeB4Jx*2>uVv&wPi8j_zvT3~}C%Z`$&>zV&72aX)=W3XlNt!|X?Q
zQm^Au32^rJ-)S6xb54f}0OiA!vY*2j%^E_@&@x*=87F{e-s!CjZ|nOe1f`XR>1IGiFlvUuJSK*t=o+=Yf5Tc5TadL2IQF()
zEi;A4K7Fc758(rGN!uFr7=1be_I@-cIEM1amN~NnsQVQ
zGnAj7{i)NE&jag-b#>GhG`pj=Hqeb+VmN|mT#uW%u2aZ9WP0=nqgD1a!xX1#>7~!l<@*A
zoYvP%oqLK3P?~FShX9z1Sqj6ovlDNLrBCj+nMZO-0B}XA0IJ;6%pJ)C?Fk@Zmdxqz
ztUAO8CbdHVQ=%<(ai;xq23`ZNh1c{dOsDraC(;Gp_x{_&8?%}28UgCOUzsT>BkT#_$;_WV*qs7k
zaPyN$mvj4DM~Poi24V76Q+NQ14?o+kc?17edH8v_RvLR<5W!E8Nw&XzRMg*N-BY$S
zuzP*nCBWq5k(6tj0?eD4;4Tw{lUUiyM?|NRtpotF6fZvOQYu;~fC>eGYcU+!A^_gI
z>|g&+Jh5H^5!z*f#wXumUx4XTZuC;;xMdO!D9;DmFW!WFarO)uTvuikAf~*Cy!Q2%
z?KVMgd~=fYTB|S$Fu1;)-b?J?fAZ6hBmmb%3fCA#XxAj1GG?%S0g^}b05|kYcetUL
z-fe4Y`Q-Vtqy|P!>5)U^_~}z_aa-{kcrCnU&C4&rJ`sE|B!wvbkd_OtElu>j6jNVj3Vxd?2fw$+FBYCS|S$=CYSc<5Xi_2*;
z&gOy)`=+1ggA3j5q=$gF`8aHR>b`OQ}eQ6h8^930&
zTfz6uT#6in{r9oABIe_L$ArY#I_=r^EJ;?q_OB~WfagCwZZ1HRKmdgU5x6DEkfO}<
zfwzyo4LP-t+{?-ekO2Z@S_?o$$g;aAA0l1(9&md-
z<=AWj7QQA=_Jw~#d#mJ4?b#K9JJqf<0gnCn1538001ANs_@tzj2-yZ49YM<%;c8eY
z$FZH)D*9o-^{baHqyo6OF>A<%3Ni|8q&>{r+d^jT-r}%~5L31_lEnvhk3OrL;pn_Wlg^IkA4rJe+-a^UwY7R5qH&49$;zI8q6
zuFa?QWFa#_X%0VCHo0|kEkwel#20?HhOE_Boonzd$ROVHrqv>s49lswR{|TU1x4L9
zYWUdAHK)eyY$D^fHyXs|f^6qRnrJT@3q;P}(?aHg7lc1M1q}7Ow>ObxkL;#qWh{6p
zNoJ@q2lV_2;LW5yv5(xor2$M!4PBBnq0SsoCnSIMQwPW-xK9!YXN?9Ewl1gu%s7*t+Bg35~wxOdVL
z_!J6maK$|`wmvrlW(J|R4Qp6SZiZ11h`rAlpa;f+xk}ztOG1=6^mika+17v_cwJcm
znb@*{glqHQ_Z$<{mdK^Ro{!{5S13qeX|4t2CTLg$Yx3A^XhS&(#Cr%31fKxLk>AE+jwroWIAJqGD8O53ik6ycRr{+uucnefYQ1B=j?lwCZCL0Z!rfHSi)rM
z13-u*5X=u3)NR;&OIH(34)$~;+?LI^bTx53U>L*(G1V#y+YdHhk;R@Ll=i?+OkCd-
z%3*SEKUbcW_h90>pZQtm|g{tib$
zTp&#%&A4L)t+45A(Dt7dVJl9s;bIyEC|u)|eC+Xd1+WujnF-*8d}{%+%uSDM1z{$R
z&7_>g#s<0G`%Nz|CMXD((fWe2kIJa1h~|
z1dux=-=+ZA>r1lqv|jhme3Ej-a^{v(vpkqY`fO7a6BRX#kuLv&l7`Q~y7ROYB*UHn
z+5!+@oj?G`=>;nRoTL}fw?`M#BtWKv2$vOLIJmo103=_5DFBm)B`<7DKe~FO@{*5NG})#;LV$p
z^ny_Ujoc~u*wc9ddR8e}^0QYE$@Iz9$PLF)hny$v0ZvsH#-G7`E%D3)bN6Cny)?Oo
z+qSv+;8rB2z(RmV8v@wL?N9-lEd{Wj+o1w%wGhA#`MdzbHr2Go)TqJbTt%3<(;lIm
zAUDzU378K1rVR-b78b-Utqt;cXu%;L^r5#m;S(UOxMfca@Vp&7^2Kf$-2R72FCZ2X
z4Uz3AJnS1&!MHIBQ6xl$8R)*9=6bq&fnGYy#$XFui~gt_LO97NkaamPlJi
zG}q~I`=rPHvkwCoH&ISlZaVxMHavs*`M}$I$W4lzSC%}s2RCQw@i<@HvgZtV*b$z$
z1usHku}*8?kXySDgM-1OS3
zUTf%8r$G=$z>}u%up?*XVrolC&vhjv5k$Ci$41h-vY7O&P;e-=MkR~*S`E2p?^e2R
z2iI-Qp)^O8l4dnAv4*)FoLKDvZ9bYE?D@AANMDDx52qZkTzGY)>9HjOKPle;xH&j=
z@eBOKOmjv`Hyzps*NFnc=^TJ|TSRUrK%GPVdOzN?a*|%a6f$NpF_~t|=CiIQ=k0*a
z_gF9s&CV^f?WRfhqJP7Z2i@Zm5rN+@gx^9pm|1YoJ~}B;5wdmmL}=@&iPu5z8@0Jc
zAb{iaf=vM&M7XvE5Rxy|@!k$I=PsOZhtM{&ZTGnpnJdqF)xt#!N9$N6F
zgblJ1XdAJum&oim79o@gW2kW(w3Y;Pl=9zrpi`&
z!mJaI$>Fh;R0Qh?H=tA~fP;NIicACUUhq}tw&EHtE`c(si%&^rOkR(5#=6rsU|XEx(9YvlOxt7`7r?j;Y@Ha
zPS9~Uq=Rp`VM6r6xi!r4g~#X|fyA-jV9L%Fxb&&yzc@|W8V$kHtq`T!J->k$fwT9f
zIY8D*dwEf&fqFE>)T?2)4Pu@N7f&9Xf6RBr>&*6g&&!c~>&O}H
zr#}qk$lyMl5QDrSl9VKmNn_^Ee2iK3e)M7{i32${3oSk1TC7gGkDd~w?cAO{}c+|2tHX7
zU#BJGcQlcR%3^u|EI#sS6Kjh|H*En;OH2Zj6;&!Hp+#ASkepSggI6tnD`?^Do&Mky
z_(gS3!Fy7-66*lojXxVy`EzxYFjw%47oscmr^CW}fN#x@ih)QBU|84q*gJzJCZ~13
zcV=bGip38P%u7EKDP8$aq&)5O$o!1&t}Dv=F{)U027y0E7G!>hpM_^Fehd{2TmRyarwi
zugRJiU+!L#tDSf;g80yf8j!fq&|tdLATY2y^~;e|A@Du?49j3d&XV1QyT&!b+bIYy
pii9&6o*bz{@b60mWOsVP{|BB8eXZ|AYE1wD002ovPDHLkV1li`I!yoo

diff --git a/tangem-demo/src/main/res/mipmap-xxhdpi/ic_launcher.png b/tangem-demo/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index b0907cac3bfd8fbfdc46e1108247f0a1055387ec..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6387
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

diff --git a/tangem-demo/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/tangem-demo/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
deleted file mode 100644
index d8ae03154975f397f8ed1b84f2d4bf9783ecfa26..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 10413
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
XdJ+W}DiIkV00000NkvXXu0mjfKBlg6

diff --git a/tangem-demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/tangem-demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 2c18de9e66108411737e910f5c1972476f03ddbf..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9128
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
I20H400LcNok^lez

diff --git a/tangem-demo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/tangem-demo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
deleted file mode 100644
index beed3cdd2c32af5114a7dc70b9ef5b698eb8797e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 15132
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

diff --git a/tangem-demo/.gitignore b/tangem-devkit/.gitignore
similarity index 100%
rename from tangem-demo/.gitignore
rename to tangem-devkit/.gitignore
diff --git a/tangem-demo/build.gradle b/tangem-devkit/build.gradle
similarity index 97%
rename from tangem-demo/build.gradle
rename to tangem-devkit/build.gradle
index fd56546bed..e692140432 100644
--- a/tangem-demo/build.gradle
+++ b/tangem-devkit/build.gradle
@@ -6,7 +6,7 @@ android {
     buildToolsVersion "29.0.3"
 
     defaultConfig {
-        applicationId "com.tangem.tangemtest"
+        applicationId "com.tangem.devkit"
         minSdkVersion 21
         targetSdkVersion 29
         versionCode 1
diff --git a/tangem-demo/proguard-rules.pro b/tangem-devkit/proguard-rules.pro
similarity index 100%
rename from tangem-demo/proguard-rules.pro
rename to tangem-devkit/proguard-rules.pro
diff --git a/tangem-demo/src/main/AndroidManifest.xml b/tangem-devkit/src/main/AndroidManifest.xml
similarity index 91%
rename from tangem-demo/src/main/AndroidManifest.xml
rename to tangem-devkit/src/main/AndroidManifest.xml
index cf184dcfe2..e0749468f0 100644
--- a/tangem-demo/src/main/AndroidManifest.xml
+++ b/tangem-devkit/src/main/AndroidManifest.xml
@@ -1,6 +1,6 @@
 
 
+    package="com.tangem.devkit">
 
     
 
-        
+        
             
                 
                 
@@ -48,7 +48,7 @@
                 android:resource="@xml/nfc_tech_filter" />
         
 
-      
+      
         
           
           
diff --git a/tangem-devkit/src/main/ic_launcher-playstore.png b/tangem-devkit/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e5af9f8f6193aa9ddfbfa06c4a00ab3c06f605e
GIT binary patch
literal 14393
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
IOE(_>4+!d&v;Y7A

literal 0
HcmV?d00001

diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt b/tangem-devkit/src/main/java/com/tangem/devkit/AppTangemDemo.kt
similarity index 79%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/AppTangemDemo.kt
index ab604ee506..60ee3d4564 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/AppTangemDemo.kt
@@ -1,11 +1,11 @@
-package com.tangem.tangemtest
+package com.tangem.devkit
 
 import android.app.Application
 import android.content.Context
 import android.content.SharedPreferences
-import com.tangem.tangemtest._arch.structure.ILog
-import com.tangem.tangemtest._arch.structure.ItemLogger
-import com.tangem.tangemtest.commons.TangemLogger
+import com.tangem.devkit._arch.structure.ILog
+import com.tangem.devkit._arch.structure.ItemLogger
+import com.tangem.devkit.commons.TangemLogger
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt b/tangem-devkit/src/main/java/com/tangem/devkit/Old_MainActivity.kt
similarity index 99%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/Old_MainActivity.kt
index 40998ca19b..ffccc70603 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/Old_MainActivity.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest
+package com.tangem.devkit
 
 import android.content.Intent
 import android.os.Bundle
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/TestUserDataActivity.kt b/tangem-devkit/src/main/java/com/tangem/devkit/TestUserDataActivity.kt
similarity index 99%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/TestUserDataActivity.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/TestUserDataActivity.kt
index 7f3ba0639d..c6124d542f 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/TestUserDataActivity.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/TestUserDataActivity.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest
+package com.tangem.devkit
 
 import android.os.Bundle
 import android.view.View
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/SingleLiveEvent.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/SingleLiveEvent.kt
similarity index 96%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/SingleLiveEvent.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/SingleLiveEvent.kt
index 943023a1c1..1e6ed8667e 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/SingleLiveEvent.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/SingleLiveEvent.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._arch
+package com.tangem.devkit._arch
 
 import android.util.Log
 import androidx.annotation.MainThread
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/HelpAbstracts.kt
similarity index 86%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/HelpAbstracts.kt
index 309309c947..018e074061 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/HelpAbstracts.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._arch.structure
+package com.tangem.devkit._arch.structure
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/Ids.kt
similarity index 82%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/Ids.kt
index 5e517808f2..e3fcb31dbf 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/Ids.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._arch.structure
+package com.tangem.devkit._arch.structure
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Logger.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/Logger.kt
similarity index 94%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Logger.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/Logger.kt
index e71fc33cb6..5ba36bbbaa 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Logger.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/Logger.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._arch.structure
+package com.tangem.devkit._arch.structure
 
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Logger
 import ru.dev.gbixahue.eu4d.lib.android.global.log.TagLogger
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Extension.kt
similarity index 81%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Extension.kt
index 2aa3fb6af5..41a4aab5ae 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Extension.kt
@@ -1,6 +1,6 @@
-package com.tangem.tangemtest._arch.structure.abstraction
+package com.tangem.devkit._arch.structure.abstraction
 
-import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.devkit._arch.structure.Id
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Item.kt
similarity index 87%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Item.kt
index 7800192199..d1fae9c535 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Item.kt
@@ -1,6 +1,6 @@
-package com.tangem.tangemtest._arch.structure.abstraction
+package com.tangem.devkit._arch.structure.abstraction
 
-import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.devkit._arch.structure.Id
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ItemGroup.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ItemGroup.kt
index 20a8def0e6..1d38ba6f6d 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ItemGroup.kt
@@ -1,7 +1,7 @@
-package com.tangem.tangemtest._arch.structure.abstraction
+package com.tangem.devkit._arch.structure.abstraction
 
-import com.tangem.tangemtest._arch.structure.ILog
-import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.devkit._arch.structure.ILog
+import com.tangem.devkit._arch.structure.Id
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ItemViewModel.kt
similarity index 93%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ItemViewModel.kt
index fc106588e6..eead6c8e3d 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ItemViewModel.kt
@@ -1,8 +1,8 @@
-package com.tangem.tangemtest._arch.structure.abstraction
+package com.tangem.devkit._arch.structure.abstraction
 
-import com.tangem.tangemtest._arch.structure.ILog
-import com.tangem.tangemtest._arch.structure.Payload
-import com.tangem.tangemtest._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.ILog
+import com.tangem.devkit._arch.structure.Payload
+import com.tangem.devkit._arch.structure.PayloadHolder
 
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ModelConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
similarity index 86%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ModelConverter.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
index 09823a8495..d6b1cdb38c 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ModelConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._arch.structure.abstraction
+package com.tangem.devkit._arch.structure.abstraction
 
 import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Plugin.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Plugin.kt
similarity index 75%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Plugin.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Plugin.kt
index 71bdc779c7..aaa6254d7c 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Plugin.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/Plugin.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._arch.structure.abstraction
+package com.tangem.devkit._arch.structure.abstraction
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/impl/Items.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/impl/Items.kt
index d4e4dde775..80145d31e4 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/impl/Items.kt
@@ -1,7 +1,7 @@
-package com.tangem.tangemtest._arch.structure.impl
+package com.tangem.devkit._arch.structure.impl
 
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.*
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.abstraction.*
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/ItemWidgetBuilder.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/ItemWidgetBuilder.kt
new file mode 100644
index 0000000000..4659c0ac49
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/ItemWidgetBuilder.kt
@@ -0,0 +1,12 @@
+package com.tangem.devkit._arch.widget
+
+import android.view.ViewGroup
+import com.tangem.devkit._arch.structure.abstraction.BaseItem
+import com.tangem.devkit._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/WidgetBuilder.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/WidgetBuilder.kt
similarity index 65%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/WidgetBuilder.kt
index 3d9a3493a5..cb39aa9072 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/WidgetBuilder.kt
@@ -1,12 +1,12 @@
-package com.tangem.tangemtest._arch.widget
+package com.tangem.devkit._arch.widget
 
 import android.view.ViewGroup
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup
-import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
-import com.tangem.tangemtest._arch.widget.impl.LinearGroupWidget
-import com.tangem.tangemtest._arch.widget.impl.StubWidget
+import com.tangem.devkit._arch.structure.abstraction.BaseItem
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.ItemGroup
+import com.tangem.devkit._arch.widget.abstraction.ViewWidget
+import com.tangem.devkit._arch.widget.impl.LinearGroupWidget
+import com.tangem.devkit._arch.widget.impl.StubWidget
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/abstraction/ViewWidget.kt
similarity index 87%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/abstraction/ViewWidget.kt
index 9b6c5f9d2c..752d178400 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/abstraction/ViewWidget.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._arch.widget.abstraction
+package com.tangem.devkit._arch.widget.abstraction
 
 import android.graphics.drawable.ColorDrawable
 import android.graphics.drawable.Drawable
@@ -6,11 +6,11 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.annotation.ColorRes
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.StringId
-import com.tangem.tangemtest._arch.structure.StringResId
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.ViewState
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.StringId
+import com.tangem.devkit._arch.structure.StringResId
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.ViewState
 import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom
 import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/impl/LinearGroupWidget.kt
similarity index 53%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/impl/LinearGroupWidget.kt
index 97c8d36a35..54948387de 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/impl/LinearGroupWidget.kt
@@ -1,9 +1,9 @@
-package com.tangem.tangemtest._arch.widget.impl
+package com.tangem.devkit._arch.widget.impl
 
 import android.view.ViewGroup
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup
-import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.abstraction.ItemGroup
+import com.tangem.devkit._arch.widget.abstraction.BaseViewWidget
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/impl/StubWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/impl/StubWidget.kt
new file mode 100644
index 0000000000..0edc41b3be
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/widget/impl/StubWidget.kt
@@ -0,0 +1,15 @@
+package com.tangem.devkit._arch.widget.impl
+
+import android.view.ViewGroup
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.abstraction.BaseItem
+import com.tangem.devkit._arch.structure.abstraction.BaseItemViewModel
+import com.tangem.devkit._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/_main/MainActivity.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_main/MainActivity.kt
similarity index 97%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_main/MainActivity.kt
index c47ac39601..dbfd82105f 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_main/MainActivity.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._main
+package com.tangem.devkit._main
 
 import android.content.res.Resources
 import android.os.Bundle
@@ -12,7 +12,7 @@ import androidx.navigation.fragment.NavHostFragment
 import androidx.navigation.ui.AppBarConfiguration
 import androidx.navigation.ui.navigateUp
 import androidx.navigation.ui.setupWithNavController
-import com.tangem.tangemtest.R
+import com.tangem.devkit.R
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_main/MainViewModel.kt
similarity index 95%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_main/MainViewModel.kt
index 3900d86530..6766c6d77f 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_main/MainViewModel.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._main
+package com.tangem.devkit._main
 
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/ActionListFragment.kt
similarity index 84%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/ActionListFragment.kt
index 4e10211223..78af64f574 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/ActionListFragment.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest._main.entryPoint
+package com.tangem.devkit._main.entryPoint
 
 import android.os.Bundle
 import android.view.View
@@ -7,13 +7,13 @@ import androidx.lifecycle.Observer
 import androidx.recyclerview.widget.DividerItemDecoration
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._main.MainViewModel
-import com.tangem.tangemtest.extensions.view.beginDelayedTransition
-import com.tangem.tangemtest.ucase.getDefaultNavigationOptions
-import com.tangem.tangemtest.ucase.resources.ActionType
-import com.tangem.tangemtest.ucase.resources.MainResourceHolder
-import com.tangem.tangemtest.ucase.ui.BaseFragment
+import com.tangem.devkit.R
+import com.tangem.devkit._main.MainViewModel
+import com.tangem.devkit.extensions.view.beginDelayedTransition
+import com.tangem.devkit.ucase.getDefaultNavigationOptions
+import com.tangem.devkit.ucase.resources.ActionType
+import com.tangem.devkit.ucase.resources.MainResourceHolder
+import com.tangem.devkit.ucase.ui.BaseFragment
 import kotlinx.android.synthetic.main.fg_entry_point.*
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/RvActions.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/RvActions.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/RvActions.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/RvActions.kt
index 5433027e92..01162d2eee 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/RvActions.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/RvActions.kt
@@ -1,14 +1,14 @@
-package com.tangem.tangemtest._main.entryPoint
+package com.tangem.devkit._main.entryPoint
 
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
 import androidx.annotation.StringRes
 import androidx.recyclerview.widget.RecyclerView
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest.ucase.resources.ActionRes
-import com.tangem.tangemtest.ucase.resources.ActionType
-import com.tangem.tangemtest.ucase.resources.MainResourceHolder
+import com.tangem.devkit.R
+import com.tangem.devkit.ucase.resources.ActionRes
+import com.tangem.devkit.ucase.resources.ActionType
+import com.tangem.devkit.ucase.resources.MainResourceHolder
 import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
 import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseAdapter
 import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseVH
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt b/tangem-devkit/src/main/java/com/tangem/devkit/commons/Abstractions.kt
similarity index 87%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/commons/Abstractions.kt
index 6c3b1abc26..3a1776e7c6 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/commons/Abstractions.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.commons
+package com.tangem.devkit.commons
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/DialogController.kt b/tangem-devkit/src/main/java/com/tangem/devkit/commons/DialogController.kt
similarity index 98%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/commons/DialogController.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/commons/DialogController.kt
index de7db7ae3e..5d4c924409 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/DialogController.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/commons/DialogController.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.commons
+package com.tangem.devkit.commons
 
 import android.app.Activity
 import android.app.Dialog
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt b/tangem-devkit/src/main/java/com/tangem/devkit/commons/GlobalFunctions.kt
similarity index 83%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/commons/GlobalFunctions.kt
index 59ae0da2b9..0f80ba2e83 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/commons/GlobalFunctions.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.commons
+package com.tangem.devkit.commons
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Logger.kt b/tangem-devkit/src/main/java/com/tangem/devkit/commons/Logger.kt
similarity index 77%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/commons/Logger.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/commons/Logger.kt
index 795c23c726..94e709455a 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Logger.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/commons/Logger.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.commons
+package com.tangem.devkit.commons
 
 import ru.dev.gbixahue.eu4d.lib.android.global.log.TagLogger
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/view/MultiActionView.kt b/tangem-devkit/src/main/java/com/tangem/devkit/commons/view/MultiActionView.kt
similarity index 90%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/commons/view/MultiActionView.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/commons/view/MultiActionView.kt
index ce21b9fae6..4e134e0336 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/view/MultiActionView.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/commons/view/MultiActionView.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.commons.view
+package com.tangem.devkit.commons.view
 
 import android.widget.TextView
 import androidx.annotation.StringRes
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.StringId
-import com.tangem.tangemtest._arch.structure.abstraction.SafeValueChanged
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.StringId
+import com.tangem.devkit._arch.structure.abstraction.SafeValueChanged
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt
similarity index 92%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt
index 3a9205574c..032e162d53 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.extensions
+package com.tangem.devkit.extensions
 
 import android.content.Intent
 import androidx.activity.ComponentActivity
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/CardConfig.kt
similarity index 99%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/extensions/CardConfig.kt
index ab8c84334b..fb3fefaeed 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/CardConfig.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.extensions
+package com.tangem.devkit.extensions
 
 import android.app.Application
 import android.content.Context
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/List.kt b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/List.kt
similarity index 90%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/extensions/List.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/extensions/List.kt
index d637d6f89a..f40be815b4 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/List.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/List.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.extensions
+package com.tangem.devkit.extensions
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/view/Transitions.kt b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/view/Transitions.kt
similarity index 87%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/extensions/view/Transitions.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/extensions/view/Transitions.kt
index d58f12aa97..1a6762eca0 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/view/Transitions.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/view/Transitions.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.extensions.view
+package com.tangem.devkit.extensions.view
 
 import android.view.ViewGroup
 import androidx.transition.AutoTransition
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/NavigationOp.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/NavigationOp.kt
similarity index 85%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/NavigationOp.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/NavigationOp.kt
index fa588f2b68..c006bf6aa4 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/NavigationOp.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/NavigationOp.kt
@@ -1,8 +1,8 @@
-package com.tangem.tangemtest.ucase
+package com.tangem.devkit.ucase
 
 import androidx.navigation.NavOptions
 import androidx.navigation.navOptions
-import com.tangem.tangemtest.R
+import com.tangem.devkit.R
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/Action.kt
similarity index 72%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/Action.kt
index e8358b8071..f0c92ad43e 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/Action.kt
@@ -1,14 +1,14 @@
-package com.tangem.tangemtest.ucase.domain.actions
+package com.tangem.devkit.ucase.domain.actions
 
 import com.tangem.TangemSdk
 import com.tangem.common.CompletionResult
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.Payload
-import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction.AfterActionModification
-import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.Payload
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction.AfterActionModification
+import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/DepersonalizeAction.kt
similarity index 67%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/DepersonalizeAction.kt
index 5dd9d80fc1..d938eb85ad 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/DepersonalizeAction.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.domain.actions
+package com.tangem.devkit.ucase.domain.actions
 
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.findItem
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.variants.TlvId
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PersonalizeAction.kt
similarity index 66%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PersonalizeAction.kt
index 457b4baac3..b289159d6c 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PersonalizeAction.kt
@@ -1,19 +1,19 @@
-package com.tangem.tangemtest.ucase.domain.actions
+package com.tangem.devkit.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 com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit._arch.structure.impl.EditTextItem
+import com.tangem.devkit._arch.structure.impl.NumberItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
+import com.tangem.devkit.ucase.tunnel.ActionView
+import com.tangem.devkit.ucase.tunnel.ItemError
+import com.tangem.devkit.ucase.variants.personalize.CardNumber
+import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter
+import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigToCardConfig
+import com.tangem.devkit.ucase.variants.personalize.dto.DefaultPersonalizationParams
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/ScanAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ScanAction.kt
similarity index 50%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/ScanAction.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ScanAction.kt
index 213fea8b63..5e4e42aa08 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/ScanAction.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ScanAction.kt
@@ -1,8 +1,8 @@
-package com.tangem.tangemtest.ucase.domain.actions
+package com.tangem.devkit.ucase.domain.actions
 
-import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction.AfterScanModifier
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction.AfterScanModifier
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/SignAction.kt
similarity index 71%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/SignAction.kt
index f44f36d1ee..a1cf64ae35 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/SignAction.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.domain.actions
+package com.tangem.devkit.ucase.domain.actions
 
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.findItem
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.variants.TlvId
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/ItemsManager.kt
similarity index 73%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/ItemsManager.kt
index 20d2ed3eb8..35022b0af4 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/ItemsManager.kt
@@ -1,12 +1,12 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager
+package com.tangem.devkit.ucase.domain.paramsManager
 
 import com.tangem.TangemSdk
 import com.tangem.common.CompletionResult
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.Payload
-import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.Payload
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
 
 typealias ActionResponse = CompletionResult<*>
 typealias AffectedList = List
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/BaseItemsManager.kt
similarity index 72%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/BaseItemsManager.kt
index a3308d623d..7fcba9d02c 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/BaseItemsManager.kt
@@ -1,18 +1,18 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
+package com.tangem.devkit.ucase.domain.paramsManager.managers
 
 import androidx.lifecycle.LifecycleObserver
 import com.tangem.TangemSdk
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.Payload
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.findItem
-import com.tangem.tangemtest._arch.structure.abstraction.iterate
-import com.tangem.tangemtest.ucase.domain.actions.Action
-import com.tangem.tangemtest.ucase.domain.actions.AttrForAction
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.domain.paramsManager.AffectedItemsCallback
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.Payload
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit._arch.structure.abstraction.iterate
+import com.tangem.devkit.ucase.domain.actions.Action
+import com.tangem.devkit.ucase.domain.actions.AttrForAction
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.domain.paramsManager.AffectedItemsCallback
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
similarity index 64%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
index 4a9c0b0572..a8125f2a51 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
@@ -1,13 +1,13 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
+package com.tangem.devkit.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
+import com.tangem.devkit.commons.Store
+import com.tangem.devkit.ucase.domain.actions.PersonalizeAction
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
similarity index 53%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
index c892b6761b..97e1a9f2db 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
@@ -1,11 +1,11 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
+package com.tangem.devkit.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
+import com.tangem.devkit._arch.structure.impl.EditTextItem
+import com.tangem.devkit.ucase.domain.actions.DepersonalizeAction
+import com.tangem.devkit.ucase.domain.actions.ScanAction
+import com.tangem.devkit.ucase.domain.actions.SignAction
+import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.SignScanConsequence
+import com.tangem.devkit.ucase.variants.TlvId
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt
similarity index 66%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt
index 48ab757ff0..74940b79d1 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt
@@ -1,8 +1,8 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction
+package com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction
 
 import com.tangem.common.CompletionResult
-import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.Item
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt
similarity index 72%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt
index f63694fcc7..219f6a72c9 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt
@@ -1,15 +1,15 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction
+package com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction
 
 import com.tangem.commands.Card
 import com.tangem.commands.CardStatus
 import com.tangem.common.CompletionResult
-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.tunnel.CardError
-import com.tangem.tangemtest.ucase.variants.TlvId
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
+import com.tangem.devkit.ucase.tunnel.ActionView
+import com.tangem.devkit.ucase.tunnel.CardError
+import com.tangem.devkit.ucase.variants.TlvId
 
 import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
similarity index 78%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
index bb771e86f6..5a455a3989 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
@@ -1,16 +1,16 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence
+package com.tangem.devkit.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 com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
+import com.tangem.devkit.ucase.tunnel.ActionView
+import com.tangem.devkit.ucase.variants.TlvId
 import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/responses/ResponseJsonConverter.kt
similarity index 97%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/responses/ResponseJsonConverter.kt
index 5533c3682d..06ca8702e5 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/responses/ResponseJsonConverter.kt
@@ -1,9 +1,9 @@
-package com.tangem.tangemtest.ucase.domain.responses
+package com.tangem.devkit.ucase.domain.responses
 
 import com.google.gson.*
 import com.tangem.commands.*
 import com.tangem.common.extensions.toHexString
-import com.tangem.tangemtest.extensions.print
+import com.tangem.devkit.extensions.print
 import java.lang.reflect.Type
 import java.text.DateFormat
 import java.util.*
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/Ids.kt
similarity index 75%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/Ids.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/Ids.kt
index e686f0f8c3..1daedb6326 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/Ids.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/Ids.kt
@@ -1,6 +1,6 @@
-package com.tangem.tangemtest.ucase.resources
+package com.tangem.devkit.ucase.resources
 
-import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.devkit._arch.structure.Id
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/MainResourceHolder.kt
similarity index 68%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/MainResourceHolder.kt
index 86c7454365..e62d993f69 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/MainResourceHolder.kt
@@ -1,14 +1,14 @@
-package com.tangem.tangemtest.ucase.resources
+package com.tangem.devkit.ucase.resources
 
-import com.tangem.tangemtest.AppTangemDemo
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.StringId
-import com.tangem.tangemtest._arch.structure.StringResId
-import com.tangem.tangemtest.ucase.resources.initializers.ActionResources
-import com.tangem.tangemtest.ucase.resources.initializers.PersonalizationResources
-import com.tangem.tangemtest.ucase.resources.initializers.ResponseResources
-import com.tangem.tangemtest.ucase.resources.initializers.TlvResources
+import com.tangem.devkit.AppTangemDemo
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.StringId
+import com.tangem.devkit._arch.structure.StringResId
+import com.tangem.devkit.ucase.resources.initializers.ActionResources
+import com.tangem.devkit.ucase.resources.initializers.PersonalizationResources
+import com.tangem.devkit.ucase.resources.initializers.ResponseResources
+import com.tangem.devkit.ucase.resources.initializers.TlvResources
 import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/ResourseTypes.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/ResourseTypes.kt
similarity index 85%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/ResourseTypes.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/ResourseTypes.kt
index 72fad2464a..8ba64f087d 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/ResourseTypes.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/ResourseTypes.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.resources
+package com.tangem.devkit.ucase.resources
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ActionResources.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ActionResources.kt
similarity index 88%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ActionResources.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ActionResources.kt
index 053710adf7..2d7adcea1c 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ActionResources.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ActionResources.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.resources.initializers
+package com.tangem.devkit.ucase.resources.initializers
 
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest.ucase.resources.ActionRes
-import com.tangem.tangemtest.ucase.resources.ActionType
-import com.tangem.tangemtest.ucase.resources.ResourceHolder
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit.ucase.resources.ActionRes
+import com.tangem.devkit.ucase.resources.ActionType
+import com.tangem.devkit.ucase.resources.ResourceHolder
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
similarity index 97%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
index a45bc55ed4..f92eee7e95 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.resources.initializers
+package com.tangem.devkit.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 com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit.ucase.resources.ResourceHolder
+import com.tangem.devkit.ucase.resources.Resources
+import com.tangem.devkit.ucase.variants.personalize.*
 import ru.dev.gbixahue.eu4d.lib.kotlin.common.TypedHolder
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ResponseResources.kt
similarity index 92%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ResponseResources.kt
index a199a04a26..37a044c9fa 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ResponseResources.kt
@@ -1,12 +1,12 @@
-package com.tangem.tangemtest.ucase.resources.initializers
+package com.tangem.devkit.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.responses.CardDataId
-import com.tangem.tangemtest.ucase.variants.responses.CardId
-import com.tangem.tangemtest.ucase.variants.responses.DepersonalizeId
-import com.tangem.tangemtest.ucase.variants.responses.SignId
+import com.tangem.devkit.R
+import com.tangem.devkit.ucase.resources.MainResourceHolder
+import com.tangem.devkit.ucase.resources.Resources
+import com.tangem.devkit.ucase.variants.responses.CardDataId
+import com.tangem.devkit.ucase.variants.responses.CardId
+import com.tangem.devkit.ucase.variants.responses.DepersonalizeId
+import com.tangem.devkit.ucase.variants.responses.SignId
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/TlvResources.kt
similarity index 61%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/TlvResources.kt
index 4de4ab008f..a1b64dd45d 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/TlvResources.kt
@@ -1,9 +1,9 @@
-package com.tangem.tangemtest.ucase.resources.initializers
+package com.tangem.devkit.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
+import com.tangem.devkit.R
+import com.tangem.devkit.ucase.resources.MainResourceHolder
+import com.tangem.devkit.ucase.resources.Resources
+import com.tangem.devkit.ucase.variants.TlvId
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/tunnel/Errors.kt
similarity index 65%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/tunnel/Errors.kt
index 8ae2a5370a..72cbde4699 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/tunnel/Errors.kt
@@ -1,6 +1,6 @@
-package com.tangem.tangemtest.ucase.tunnel
+package com.tangem.devkit.ucase.tunnel
 
-import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.devkit._arch.structure.Id
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/tunnel/ViewScreen.kt
similarity index 81%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/tunnel/ViewScreen.kt
index 53ab0b4883..64aa754c6b 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/tunnel/ViewScreen.kt
@@ -1,7 +1,7 @@
-package com.tangem.tangemtest.ucase.tunnel
+package com.tangem.devkit.ucase.tunnel
 
 import com.google.android.material.snackbar.Snackbar
-import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.devkit._arch.structure.Id
 
 interface SnackbarHolder {
     fun showSnackbar(message: String, length: Int = Snackbar.LENGTH_SHORT)
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
index 80e1840a9d..7774441903 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.ui
+package com.tangem.devkit.ucase.ui
 
 import android.view.View
 import androidx.annotation.UiThread
@@ -9,16 +9,16 @@ import com.tangem.TangemSdk
 import com.tangem.commands.Card
 import com.tangem.commands.CommandResponse
 import com.tangem.common.CompletionResult
-import com.tangem.tangemtest._arch.SingleLiveEvent
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.Payload
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.iterate
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.responses.ResponseJsonConverter
-import com.tangem.tangemtest.ucase.resources.ActionType
-import com.tangem.tangemtest.ucase.tunnel.ViewScreen
-import com.tangem.tangemtest.ucase.variants.personalize.converter.ItemTypes
+import com.tangem.devkit._arch.SingleLiveEvent
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.Payload
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.iterate
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.responses.ResponseJsonConverter
+import com.tangem.devkit.ucase.resources.ActionType
+import com.tangem.devkit.ucase.tunnel.ViewScreen
+import com.tangem.devkit.ucase.variants.personalize.converter.ItemTypes
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseCardActionFragment.kt
similarity index 92%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseCardActionFragment.kt
index 32c0746431..97bb78f808 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseCardActionFragment.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.ui
+package com.tangem.devkit.ucase.ui
 
 import android.os.Bundle
 import android.view.LayoutInflater
@@ -13,15 +13,15 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
 import com.tangem.TangemSdk
 import com.tangem.commands.Card
 import com.tangem.commands.CommandResponse
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._main.MainViewModel
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
+import com.tangem.devkit.ucase.tunnel.ActionView
+import com.tangem.devkit.ucase.tunnel.CardError
+import com.tangem.devkit.ucase.ui.widgets.ParameterWidget
 import com.tangem.tangem_sdk_new.extensions.init
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._main.MainViewModel
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
-import com.tangem.tangemtest.ucase.tunnel.ActionView
-import com.tangem.tangemtest.ucase.tunnel.CardError
-import com.tangem.tangemtest.ucase.ui.widgets.ParameterWidget
 import ru.dev.gbixahue.eu4d.lib.android._android.views.enable
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseFragment.kt
similarity index 88%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseFragment.kt
index 29dfeec6be..e3b6f16cad 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseFragment.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.ui
+package com.tangem.devkit.ucase.ui
 
 import android.os.Bundle
 import android.view.LayoutInflater
@@ -8,8 +8,8 @@ import androidx.fragment.app.Fragment
 import androidx.navigation.NavOptions
 import androidx.navigation.fragment.NavHostFragment.findNavController
 import com.google.android.material.snackbar.Snackbar
-import com.tangem.tangemtest.ucase.getDefaultNavigationOptions
-import com.tangem.tangemtest.ucase.tunnel.SnackbarHolder
+import com.tangem.devkit.ucase.getDefaultNavigationOptions
+import com.tangem.devkit.ucase.tunnel.SnackbarHolder
 import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/widgets/ParameterWidget.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/widgets/ParameterWidget.kt
index ab01e1a692..1187a6d9db 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/widgets/ParameterWidget.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.ui.widgets
+package com.tangem.devkit.ucase.ui.widgets
 
 import android.text.Editable
 import android.text.TextWatcher
@@ -8,14 +8,14 @@ import android.widget.Button
 import android.widget.TextView
 import com.google.android.material.textfield.TextInputEditText
 import com.google.android.material.textfield.TextInputLayout
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.impl.EditTextItem
-import com.tangem.tangemtest.extensions.view.beginDelayedTransition
-import com.tangem.tangemtest.ucase.resources.ActionType
-import com.tangem.tangemtest.ucase.resources.MainResourceHolder
-import com.tangem.tangemtest.ucase.resources.Resources
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.impl.EditTextItem
+import com.tangem.devkit.extensions.view.beginDelayedTransition
+import com.tangem.devkit.ucase.resources.ActionType
+import com.tangem.devkit.ucase.resources.MainResourceHolder
+import com.tangem.devkit.ucase.resources.Resources
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/Ids.kt
new file mode 100644
index 0000000000..e372276e8a
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/Ids.kt
@@ -0,0 +1,11 @@
+package com.tangem.devkit.ucase.variants
+
+import com.tangem.devkit._arch.structure.Id
+
+/**
+[REDACTED_AUTHOR]
+ */
+enum class TlvId : Id {
+    CardId,
+    TransactionOutHash,
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
new file mode 100644
index 0000000000..802ba1e807
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
@@ -0,0 +1,13 @@
+package com.tangem.devkit.ucase.variants.depersonalize.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.DepersonalizeItemsManager
+import com.tangem.devkit.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/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
similarity index 94%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
index 6305b68975..2e10c89ab8 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
@@ -1,6 +1,6 @@
-package com.tangem.tangemtest.ucase.variants.personalize
+package com.tangem.devkit.ucase.variants.personalize
 
-import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.devkit._arch.structure.Id
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/PersonalizationConfigStore.kt
similarity index 85%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/PersonalizationConfigStore.kt
index 9c774a8071..a0c9435a4f 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/PersonalizationConfigStore.kt
@@ -1,13 +1,13 @@
-package com.tangem.tangemtest.ucase.variants.personalize
+package com.tangem.devkit.ucase.variants.personalize
 
 import android.content.Context
 import android.content.SharedPreferences
 import androidx.core.content.edit
 import com.google.gson.Gson
-import com.tangem.tangemtest.AppTangemDemo
-import com.tangem.tangemtest.commons.KeyedStore
-import com.tangem.tangemtest.commons.Store
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
+import com.tangem.devkit.AppTangemDemo
+import com.tangem.devkit.commons.KeyedStore
+import com.tangem.devkit.commons.Store
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
 
 class PersonalizationConfigStore(context: Context) : Store, KeyedStore {
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
similarity index 95%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
index 2f406d98c3..bb3edb89e9 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter
+package com.tangem.devkit.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 com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.abstraction.KeyValue
+import com.tangem.devkit.ucase.variants.personalize.*
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
 import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
similarity index 96%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
index b1013de610..209036fc03 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
@@ -1,7 +1,7 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter
+package com.tangem.devkit.ucase.variants.personalize.converter
 
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest.ucase.variants.personalize.*
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit.ucase.variants.personalize.*
 
 class ItemTypes {
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
similarity index 96%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
index 3d7fb1e3d1..c2c6810da3 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
@@ -1,11 +1,11 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter
+package com.tangem.devkit.ucase.variants.personalize.converter
 
-import com.tangem.tangemtest._arch.structure.Additional
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.*
-import com.tangem.tangemtest._arch.structure.impl.*
-import com.tangem.tangemtest.ucase.variants.personalize.*
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
+import com.tangem.devkit._arch.structure.Additional
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.abstraction.*
+import com.tangem.devkit._arch.structure.impl.*
+import com.tangem.devkit.ucase.variants.personalize.*
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
similarity index 97%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
index a1c710527b..e71acdacd5 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
@@ -1,9 +1,9 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter
+package com.tangem.devkit.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 com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
 import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter
 import java.util.*
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
index ace112c0af..afa1d5f114 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.dto
+package com.tangem.devkit.ucase.variants.personalize.dto
 
 import com.tangem.KeyPair
 import com.tangem.commands.personalization.entities.Acquirer
@@ -41,7 +41,7 @@ interface DefaultPersonalizationParams {
         }
 
         fun manufacturer(): Manufacturer {
-            val keys = Manufacturer(com.tangem.tangemtest.ucase.variants.personalize.dto.Manufacturer.Mode.Developer)
+            val keys = Manufacturer(com.tangem.devkit.ucase.variants.personalize.dto.Manufacturer.Mode.Developer)
             return Manufacturer(
                     name = "Tangem",
                     keyPair = KeyPair(keys.publicKey, keys.privateKey)
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/Manufacturer.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/Manufacturer.kt
similarity index 98%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/Manufacturer.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/Manufacturer.kt
index 8a366eeb26..eccc075888 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/Manufacturer.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/Manufacturer.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.dto
+package com.tangem.devkit.ucase.variants.personalize.dto
 
 class Manufacturer(private val mode: Mode) {
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
similarity index 98%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
index ebb7daea63..836eac58bb 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.dto
+package com.tangem.devkit.ucase.variants.personalize.dto
 
 import com.tangem.commands.EllipticCurve
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt
similarity index 82%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt
index cab78e4834..9fbc9d8b01 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui
+package com.tangem.devkit.ucase.variants.personalize.ui
 
 import android.content.DialogInterface
 import android.os.Bundle
@@ -15,29 +15,29 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import androidx.transition.Fade
 import com.tangem.commands.Card
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.StringId
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.SafeValueChanged
-import com.tangem.tangemtest._arch.widget.WidgetBuilder
-import com.tangem.tangemtest.commons.DialogController
-import com.tangem.tangemtest.commons.view.MultiActionView
-import com.tangem.tangemtest.commons.view.ViewAction
-import com.tangem.tangemtest.extensions.view.beginDelayedTransition
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
-import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizationItemsManager
-import com.tangem.tangemtest.ucase.resources.ActionType
-import com.tangem.tangemtest.ucase.tunnel.ActionView
-import com.tangem.tangemtest.ucase.tunnel.ItemError
-import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
-import com.tangem.tangemtest.ucase.variants.personalize.PersonalizationConfigStore
-import com.tangem.tangemtest.ucase.variants.personalize.ui.presets.PersonalizationPresetManager
-import com.tangem.tangemtest.ucase.variants.personalize.ui.presets.PersonalizationPresetView
-import com.tangem.tangemtest.ucase.variants.personalize.ui.presets.RvPresetNamesAdapter
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.PersonalizationItemBuilder
-import com.tangem.tangemtest.ucase.variants.responses.ui.ResponseFragment
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.StringId
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.SafeValueChanged
+import com.tangem.devkit._arch.widget.WidgetBuilder
+import com.tangem.devkit.commons.DialogController
+import com.tangem.devkit.commons.view.MultiActionView
+import com.tangem.devkit.commons.view.ViewAction
+import com.tangem.devkit.extensions.view.beginDelayedTransition
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
+import com.tangem.devkit.ucase.domain.paramsManager.managers.PersonalizationItemsManager
+import com.tangem.devkit.ucase.resources.ActionType
+import com.tangem.devkit.ucase.tunnel.ActionView
+import com.tangem.devkit.ucase.tunnel.ItemError
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+import com.tangem.devkit.ucase.variants.personalize.PersonalizationConfigStore
+import com.tangem.devkit.ucase.variants.personalize.ui.presets.PersonalizationPresetManager
+import com.tangem.devkit.ucase.variants.personalize.ui.presets.PersonalizationPresetView
+import com.tangem.devkit.ucase.variants.personalize.ui.presets.RvPresetNamesAdapter
+import com.tangem.devkit.ucase.variants.personalize.ui.widgets.PersonalizationItemBuilder
+import com.tangem.devkit.ucase.variants.responses.ui.ResponseFragment
 import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 import ru.dev.gbixahue.eu4d.lib.android.global.threading.post
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PersonalizationPresetManager.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PersonalizationPresetManager.kt
similarity index 75%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PersonalizationPresetManager.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PersonalizationPresetManager.kt
index ff63bca036..c1fd8e43a6 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PersonalizationPresetManager.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PersonalizationPresetManager.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.presets
+package com.tangem.devkit.ucase.variants.personalize.ui.presets
 
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.variants.personalize.PersonalizationConfigStore
-import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
+import com.tangem.devkit.R
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.variants.personalize.PersonalizationConfigStore
+import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
 
 class PersonalizationPresetManager(
         private val itemsManager: ItemsManager,
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PersonalizationPresetView.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PersonalizationPresetView.kt
similarity index 55%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PersonalizationPresetView.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PersonalizationPresetView.kt
index d4988973dc..be3fb55716 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PersonalizationPresetView.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PersonalizationPresetView.kt
@@ -1,7 +1,7 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.presets
+package com.tangem.devkit.ucase.variants.personalize.ui.presets
 
-import com.tangem.tangemtest._arch.structure.abstraction.SafeValueChanged
-import com.tangem.tangemtest.ucase.tunnel.SnackbarHolder
+import com.tangem.devkit._arch.structure.abstraction.SafeValueChanged
+import com.tangem.devkit.ucase.tunnel.SnackbarHolder
 
 interface PersonalizationPresetView : SnackbarHolder {
     fun showSavePresetDialog(onOk: SafeValueChanged)
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PresetRv.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PresetRv.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PresetRv.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PresetRv.kt
index ff00dcf179..b32f84a29b 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/presets/PresetRv.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/presets/PresetRv.kt
@@ -1,11 +1,10 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.presets
+package com.tangem.devkit.ucase.variants.personalize.ui.presets
 
 import android.view.View
 import android.view.ViewGroup
-import android.widget.Button
 import android.widget.TextView
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.abstraction.SafeValueChanged
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.abstraction.SafeValueChanged
 import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
 import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseAdapter
 import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvVH
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt
similarity index 62%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt
index 5900b5da37..8b79b64bc9 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt
@@ -1,12 +1,12 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+package com.tangem.devkit.ucase.variants.personalize.ui.widgets
 
 import android.view.ViewGroup
-import com.tangem.tangemtest._arch.structure.StringId
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget
-import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
-import com.tangem.tangemtest.ucase.resources.MainResourceHolder
-import com.tangem.tangemtest.ucase.resources.Resources
+import com.tangem.devkit._arch.structure.StringId
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.widget.abstraction.BaseViewWidget
+import com.tangem.devkit._arch.widget.abstraction.ViewWidget
+import com.tangem.devkit.ucase.resources.MainResourceHolder
+import com.tangem.devkit.ucase.resources.Resources
 import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt
similarity index 78%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt
index a8fe8af66c..4867a63afe 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt
@@ -1,11 +1,11 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+package com.tangem.devkit.ucase.variants.personalize.ui.widgets
 
 import android.view.ViewGroup
 import android.widget.TextView
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.ViewState
-import com.tangem.tangemtest.extensions.view.beginDelayedTransition
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.ViewState
+import com.tangem.devkit.extensions.view.beginDelayedTransition
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/EditTextWidget.kt
similarity index 90%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/EditTextWidget.kt
index df0951947d..2fce4d4f11 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/EditTextWidget.kt
@@ -1,12 +1,12 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+package com.tangem.devkit.ucase.variants.personalize.ui.widgets
 
 import android.text.Editable
 import android.text.TextWatcher
 import android.view.ViewGroup
 import com.google.android.material.textfield.TextInputEditText
 import com.google.android.material.textfield.TextInputLayout
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.impl.EditTextItem
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.impl.EditTextItem
 import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/NumberWidget.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/NumberWidget.kt
index 61cab1f430..2fef1e296f 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/NumberWidget.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+package com.tangem.devkit.ucase.variants.personalize.ui.widgets
 
 import android.text.Editable
 import android.text.InputFilter
@@ -6,9 +6,9 @@ import android.text.TextWatcher
 import android.view.ViewGroup
 import com.google.android.material.textfield.TextInputEditText
 import com.google.android.material.textfield.TextInputLayout
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.impl.NumberItem
-import com.tangem.tangemtest.ucase.variants.personalize.CardNumber
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.impl.NumberItem
+import com.tangem.devkit.ucase.variants.personalize.CardNumber
 import ru.dev.gbixahue.eu4d.lib.android._android.views.addInputFilter
 import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt
similarity index 63%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt
index f18839f056..09c134bc2d 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+package com.tangem.devkit.ucase.variants.personalize.ui.widgets
 
 import android.view.ViewGroup
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.impl.*
-import com.tangem.tangemtest._arch.widget.ItemWidgetBuilder
-import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
+import com.tangem.devkit._arch.structure.abstraction.BaseItem
+import com.tangem.devkit._arch.structure.impl.*
+import com.tangem.devkit._arch.widget.ItemWidgetBuilder
+import com.tangem.devkit._arch.widget.abstraction.ViewWidget
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt
similarity index 91%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt
index c1c9a5a3f8..e42afb0571 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+package com.tangem.devkit.ucase.variants.personalize.ui.widgets
 
 import android.view.View
 import android.view.ViewGroup
@@ -6,10 +6,10 @@ import android.widget.AdapterView
 import android.widget.BaseAdapter
 import android.widget.Spinner
 import android.widget.TextView
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.abstraction.KeyValue
-import com.tangem.tangemtest._arch.structure.abstraction.ListViewModel
-import com.tangem.tangemtest._arch.structure.impl.SpinnerItem
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.abstraction.KeyValue
+import com.tangem.devkit._arch.structure.abstraction.ListViewModel
+import com.tangem.devkit._arch.structure.impl.SpinnerItem
 import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/SwitchWidget.kt
similarity index 86%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/SwitchWidget.kt
index ffa0b6879b..0b9c534056 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/SwitchWidget.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+package com.tangem.devkit.ucase.variants.personalize.ui.widgets
 
 import android.view.ViewGroup
 import android.widget.CompoundButton
 import androidx.appcompat.widget.SwitchCompat
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.impl.BoolItem
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.impl.BoolItem
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/TextHeaderWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/TextHeaderWidget.kt
similarity index 70%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/TextHeaderWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/TextHeaderWidget.kt
index ab52a1981b..0892061a0a 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/TextHeaderWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/widgets/TextHeaderWidget.kt
@@ -1,9 +1,9 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+package com.tangem.devkit.ucase.variants.personalize.ui.widgets
 
 import android.view.ViewGroup
 import android.widget.TextView
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.impl.TextItem
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.impl.TextItem
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/Ids.kt
similarity index 89%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/Ids.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/Ids.kt
index 2e84215136..8e00cef963 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/Ids.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/Ids.kt
@@ -1,6 +1,6 @@
-package com.tangem.tangemtest.ucase.variants.responses
+package com.tangem.devkit.ucase.variants.responses
 
-import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.devkit._arch.structure.Id
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ResponseViewModel.kt
similarity index 80%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ResponseViewModel.kt
index 488b8f014b..0da3fbceb4 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ResponseViewModel.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.responses
+package com.tangem.devkit.ucase.variants.responses
 
 import android.view.View
 import androidx.lifecycle.ViewModel
@@ -6,11 +6,11 @@ import com.tangem.commands.Card
 import com.tangem.commands.CommandResponse
 import com.tangem.commands.SignResponse
 import com.tangem.commands.personalization.DepersonalizeResponse
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems
-import com.tangem.tangemtest._arch.structure.abstraction.iterate
-import com.tangem.tangemtest.ucase.variants.responses.converter.ConvertersStore
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.ModelToItems
+import com.tangem.devkit._arch.structure.abstraction.iterate
+import com.tangem.devkit.ucase.variants.responses.converter.ConvertersStore
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/BaseResponseConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/BaseResponseConverter.kt
similarity index 68%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/BaseResponseConverter.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/BaseResponseConverter.kt
index b685392de9..c1eded3858 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/BaseResponseConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/BaseResponseConverter.kt
@@ -1,9 +1,9 @@
-package com.tangem.tangemtest.ucase.variants.responses.converter
+package com.tangem.devkit.ucase.variants.responses.converter
 
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.*
-import com.tangem.tangemtest.ucase.domain.responses.ResponseFieldConverter
-import com.tangem.tangemtest.ucase.variants.responses.item.TextHeaderItem
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.abstraction.*
+import com.tangem.devkit.ucase.domain.responses.ResponseFieldConverter
+import com.tangem.devkit.ucase.variants.responses.item.TextHeaderItem
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
 /**
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/CardConverter.kt
similarity index 86%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/CardConverter.kt
index 6b3ad13430..44e2a5d571 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/CardConverter.kt
@@ -1,16 +1,16 @@
-package com.tangem.tangemtest.ucase.variants.responses.converter
+package com.tangem.devkit.ucase.variants.responses.converter
 
 import com.tangem.commands.*
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.StringId
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup
-import com.tangem.tangemtest._arch.structure.abstraction.iterate
-import com.tangem.tangemtest._arch.structure.impl.BoolItem
-import com.tangem.tangemtest._arch.structure.impl.TextItem
-import com.tangem.tangemtest.ucase.variants.responses.CardDataId
-import com.tangem.tangemtest.ucase.variants.responses.CardId
-import com.tangem.tangemtest.ucase.variants.responses.item.TextHeaderItem
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.StringId
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.abstraction.ItemGroup
+import com.tangem.devkit._arch.structure.abstraction.iterate
+import com.tangem.devkit._arch.structure.impl.BoolItem
+import com.tangem.devkit._arch.structure.impl.TextItem
+import com.tangem.devkit.ucase.variants.responses.CardDataId
+import com.tangem.devkit.ucase.variants.responses.CardId
+import com.tangem.devkit.ucase.variants.responses.item.TextHeaderItem
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/ConvertersStore.kt
similarity index 90%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/ConvertersStore.kt
index 067d47027c..85b9f38442 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/ConvertersStore.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.responses.converter
+package com.tangem.devkit.ucase.variants.responses.converter
 
 import com.tangem.commands.Card
 import com.tangem.commands.SignResponse
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/SimpleConverters.kt
similarity index 74%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/SimpleConverters.kt
index 64b8edbec5..980c10f01d 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/SimpleConverters.kt
@@ -1,11 +1,11 @@
-package com.tangem.tangemtest.ucase.variants.responses.converter
+package com.tangem.devkit.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 com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit._arch.structure.impl.TextItem
+import com.tangem.devkit.ucase.variants.responses.DepersonalizeId
+import com.tangem.devkit.ucase.variants.responses.SignId
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
 /**
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/item/TextItem.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/item/TextItem.kt
new file mode 100644
index 0000000000..bb677f0dec
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/item/TextItem.kt
@@ -0,0 +1,12 @@
+package com.tangem.devkit.ucase.variants.responses.item
+
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.abstraction.BaseItemViewModel
+import com.tangem.devkit._arch.structure.abstraction.ItemViewModel
+import com.tangem.devkit._arch.structure.abstraction.ViewState
+import com.tangem.devkit._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/ResponseFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/ResponseFragment.kt
similarity index 81%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/ResponseFragment.kt
index 07676a18f2..0dcb15e807 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/ResponseFragment.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.responses.ui
+package com.tangem.devkit.ucase.variants.responses.ui
 
 import android.os.Bundle
 import android.view.*
@@ -8,14 +8,14 @@ import androidx.core.os.bundleOf
 import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.Observer
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.widget.WidgetBuilder
-import com.tangem.tangemtest._main.MainViewModel
-import com.tangem.tangemtest.extensions.shareText
-import com.tangem.tangemtest.ucase.domain.responses.ResponseJsonConverter
-import com.tangem.tangemtest.ucase.ui.BaseFragment
-import com.tangem.tangemtest.ucase.variants.responses.ResponseViewModel
-import com.tangem.tangemtest.ucase.variants.responses.ui.widget.ResponseItemBuilder
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.widget.WidgetBuilder
+import com.tangem.devkit._main.MainViewModel
+import com.tangem.devkit.extensions.shareText
+import com.tangem.devkit.ucase.domain.responses.ResponseJsonConverter
+import com.tangem.devkit.ucase.ui.BaseFragment
+import com.tangem.devkit.ucase.variants.responses.ResponseViewModel
+import com.tangem.devkit.ucase.variants.responses.ui.widget.ResponseItemBuilder
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/CheckBoxWidget.kt
similarity index 81%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/CheckBoxWidget.kt
index 65dd1a5831..bafc6e7500 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/CheckBoxWidget.kt
@@ -1,9 +1,9 @@
-package com.tangem.tangemtest.ucase.variants.responses.ui.widget
+package com.tangem.devkit.ucase.variants.responses.ui.widget
 
 import android.view.ViewGroup
 import com.google.android.material.checkbox.MaterialCheckBox
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.impl.BoolItem
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.impl.BoolItem
 import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom
 
 /**
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt
new file mode 100644
index 0000000000..172cca0c83
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt
@@ -0,0 +1,23 @@
+package com.tangem.devkit.ucase.variants.responses.ui.widget
+
+import android.view.ViewGroup
+import com.tangem.devkit._arch.structure.abstraction.BaseItem
+import com.tangem.devkit._arch.structure.impl.BoolItem
+import com.tangem.devkit._arch.structure.impl.TextItem
+import com.tangem.devkit._arch.widget.ItemWidgetBuilder
+import com.tangem.devkit._arch.widget.abstraction.ViewWidget
+import com.tangem.devkit.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/responses/ui/widget/ResponseTextWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseTextWidget.kt
similarity index 80%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseTextWidget.kt
index a221c03124..8ef678b37c 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseTextWidget.kt
@@ -1,10 +1,10 @@
-package com.tangem.tangemtest.ucase.variants.responses.ui.widget
+package com.tangem.devkit.ucase.variants.responses.ui.widget
 
 import android.view.ViewGroup
 import android.widget.TextView
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.impl.TextItem
-import com.tangem.tangemtest.ucase.variants.responses.item.TextHeaderItem
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.impl.TextItem
+import com.tangem.devkit.ucase.variants.responses.item.TextHeaderItem
 
 /**
 [REDACTED_AUTHOR]
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseWidget.kt
similarity index 80%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseWidget.kt
index f6554124cf..9931b63df4 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ui/widget/ResponseWidget.kt
@@ -1,12 +1,12 @@
-package com.tangem.tangemtest.ucase.variants.responses.ui.widget
+package com.tangem.devkit.ucase.variants.responses.ui.widget
 
 import android.content.ClipData
 import android.content.ClipboardManager
 import android.content.Context
 import android.view.ViewGroup
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget
+import com.tangem.devkit.R
+import com.tangem.devkit._arch.structure.abstraction.Item
+import com.tangem.devkit.ucase.variants.personalize.ui.widgets.DescriptionWidget
 import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom
 import ru.dev.gbixahue.eu4d.lib.android._android.views.toast
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/scan/ui/ScanActionFragment.kt
similarity index 81%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt
rename to tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/scan/ui/ScanActionFragment.kt
index a125e30adf..f5dc1bcf94 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/scan/ui/ScanActionFragment.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.scan.ui
+package com.tangem.devkit.ucase.variants.scan.ui
 
 import android.os.Bundle
 import android.util.TypedValue
@@ -7,11 +7,11 @@ import android.view.View
 import android.widget.FrameLayout
 import android.widget.TextView
 import com.tangem.commands.Card
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager
-import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
-import com.tangem.tangemtest.ucase.variants.responses.ui.ResponseFragment
+import com.tangem.devkit.R
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.ScanItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+import com.tangem.devkit.ucase.variants.responses.ui.ResponseFragment
 import ru.dev.gbixahue.eu4d.lib.android._android.views.dpToPx
 
 /**
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/sign/ui/SignActionFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/sign/ui/SignActionFragment.kt
new file mode 100644
index 0000000000..760d09e39d
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/sign/ui/SignActionFragment.kt
@@ -0,0 +1,13 @@
+package com.tangem.devkit.ucase.variants.sign.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.SignItemsManager
+import com.tangem.devkit.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/anim/fade_in.xml b/tangem-devkit/src/main/res/anim/fade_in.xml
similarity index 100%
rename from tangem-demo/src/main/res/anim/fade_in.xml
rename to tangem-devkit/src/main/res/anim/fade_in.xml
diff --git a/tangem-demo/src/main/res/anim/fade_out.xml b/tangem-devkit/src/main/res/anim/fade_out.xml
similarity index 100%
rename from tangem-demo/src/main/res/anim/fade_out.xml
rename to tangem-devkit/src/main/res/anim/fade_out.xml
diff --git a/tangem-demo/src/main/res/anim/slide_in_left.xml b/tangem-devkit/src/main/res/anim/slide_in_left.xml
similarity index 100%
rename from tangem-demo/src/main/res/anim/slide_in_left.xml
rename to tangem-devkit/src/main/res/anim/slide_in_left.xml
diff --git a/tangem-demo/src/main/res/anim/slide_in_right.xml b/tangem-devkit/src/main/res/anim/slide_in_right.xml
similarity index 100%
rename from tangem-demo/src/main/res/anim/slide_in_right.xml
rename to tangem-devkit/src/main/res/anim/slide_in_right.xml
diff --git a/tangem-demo/src/main/res/anim/slide_out_left.xml b/tangem-devkit/src/main/res/anim/slide_out_left.xml
similarity index 100%
rename from tangem-demo/src/main/res/anim/slide_out_left.xml
rename to tangem-devkit/src/main/res/anim/slide_out_left.xml
diff --git a/tangem-demo/src/main/res/anim/slide_out_right.xml b/tangem-devkit/src/main/res/anim/slide_out_right.xml
similarity index 100%
rename from tangem-demo/src/main/res/anim/slide_out_right.xml
rename to tangem-devkit/src/main/res/anim/slide_out_right.xml
diff --git a/tangem-demo/src/main/res/color/menu_switch_color_thumb.xml b/tangem-devkit/src/main/res/color/menu_switch_color_thumb.xml
similarity index 100%
rename from tangem-demo/src/main/res/color/menu_switch_color_thumb.xml
rename to tangem-devkit/src/main/res/color/menu_switch_color_thumb.xml
diff --git a/tangem-demo/src/main/res/color/menu_switch_color_track.xml b/tangem-devkit/src/main/res/color/menu_switch_color_track.xml
similarity index 100%
rename from tangem-demo/src/main/res/color/menu_switch_color_track.xml
rename to tangem-devkit/src/main/res/color/menu_switch_color_track.xml
diff --git a/tangem-demo/src/main/res/color/mtrl_fab_bg_color_selector.xml b/tangem-devkit/src/main/res/color/mtrl_fab_bg_color_selector.xml
similarity index 100%
rename from tangem-demo/src/main/res/color/mtrl_fab_bg_color_selector.xml
rename to tangem-devkit/src/main/res/color/mtrl_fab_bg_color_selector.xml
diff --git a/tangem-demo/src/main/res/color/mtrl_fab_icon_text_color_selector.xml b/tangem-devkit/src/main/res/color/mtrl_fab_icon_text_color_selector.xml
similarity index 100%
rename from tangem-demo/src/main/res/color/mtrl_fab_icon_text_color_selector.xml
rename to tangem-devkit/src/main/res/color/mtrl_fab_icon_text_color_selector.xml
diff --git a/tangem-demo/src/main/res/drawable-v24/ic_launcher_foreground.xml b/tangem-devkit/src/main/res/drawable-v24/ic_launcher_foreground.xml
similarity index 100%
rename from tangem-demo/src/main/res/drawable-v24/ic_launcher_foreground.xml
rename to tangem-devkit/src/main/res/drawable-v24/ic_launcher_foreground.xml
diff --git a/tangem-devkit/src/main/res/drawable/ic_launcher_background.xml b/tangem-devkit/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000000..ca3826a46c
--- /dev/null
+++ b/tangem-devkit/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
diff --git a/tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml b/tangem-devkit/src/main/res/drawable/ic_share_white_18dp.xml
similarity index 100%
rename from tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml
rename to tangem-devkit/src/main/res/drawable/ic_share_white_18dp.xml
diff --git a/tangem-demo/src/main/res/layout/a_main.xml b/tangem-devkit/src/main/res/layout/a_main.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/a_main.xml
rename to tangem-devkit/src/main/res/layout/a_main.xml
diff --git a/tangem-demo/src/main/res/layout/activity_test_user_data.xml b/tangem-devkit/src/main/res/layout/activity_test_user_data.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/activity_test_user_data.xml
rename to tangem-devkit/src/main/res/layout/activity_test_user_data.xml
diff --git a/tangem-demo/src/main/res/layout/dlg_personalization_preset_load.xml b/tangem-devkit/src/main/res/layout/dlg_personalization_preset_load.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/dlg_personalization_preset_load.xml
rename to tangem-devkit/src/main/res/layout/dlg_personalization_preset_load.xml
diff --git a/tangem-demo/src/main/res/layout/dlg_personalization_preset_save.xml b/tangem-devkit/src/main/res/layout/dlg_personalization_preset_save.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/dlg_personalization_preset_save.xml
rename to tangem-devkit/src/main/res/layout/dlg_personalization_preset_save.xml
diff --git a/tangem-demo/src/main/res/layout/fg_base_action_layout.xml b/tangem-devkit/src/main/res/layout/fg_base_action_layout.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/fg_base_action_layout.xml
rename to tangem-devkit/src/main/res/layout/fg_base_action_layout.xml
diff --git a/tangem-demo/src/main/res/layout/fg_card_response.xml b/tangem-devkit/src/main/res/layout/fg_card_response.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/fg_card_response.xml
rename to tangem-devkit/src/main/res/layout/fg_card_response.xml
diff --git a/tangem-demo/src/main/res/layout/fg_entry_point.xml b/tangem-devkit/src/main/res/layout/fg_entry_point.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/fg_entry_point.xml
rename to tangem-devkit/src/main/res/layout/fg_entry_point.xml
diff --git a/tangem-demo/src/main/res/layout/m_divider_h.xml b/tangem-devkit/src/main/res/layout/m_divider_h.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/m_divider_h.xml
rename to tangem-devkit/src/main/res/layout/m_divider_h.xml
diff --git a/tangem-demo/src/main/res/layout/m_divider_v.xml b/tangem-devkit/src/main/res/layout/m_divider_v.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/m_divider_v.xml
rename to tangem-devkit/src/main/res/layout/m_divider_v.xml
diff --git a/tangem-demo/src/main/res/layout/menu_item_switch.xml b/tangem-devkit/src/main/res/layout/menu_item_switch.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/menu_item_switch.xml
rename to tangem-devkit/src/main/res/layout/menu_item_switch.xml
diff --git a/tangem-demo/src/main/res/layout/old_activity_main.xml b/tangem-devkit/src/main/res/layout/old_activity_main.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/old_activity_main.xml
rename to tangem-devkit/src/main/res/layout/old_activity_main.xml
diff --git a/tangem-demo/src/main/res/layout/v_content_container.xml b/tangem-devkit/src/main/res/layout/v_content_container.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/v_content_container.xml
rename to tangem-devkit/src/main/res/layout/v_content_container.xml
diff --git a/tangem-demo/src/main/res/layout/v_item_list_container.xml b/tangem-devkit/src/main/res/layout/v_item_list_container.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/v_item_list_container.xml
rename to tangem-devkit/src/main/res/layout/v_item_list_container.xml
diff --git a/tangem-demo/src/main/res/layout/vh_actions.xml b/tangem-devkit/src/main/res/layout/vh_actions.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/vh_actions.xml
rename to tangem-devkit/src/main/res/layout/vh_actions.xml
diff --git a/tangem-demo/src/main/res/layout/vh_personalization_preset_name.xml b/tangem-devkit/src/main/res/layout/vh_personalization_preset_name.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/vh_personalization_preset_name.xml
rename to tangem-devkit/src/main/res/layout/vh_personalization_preset_name.xml
diff --git a/tangem-demo/src/main/res/layout/vh_sp_dropdown_item.xml b/tangem-devkit/src/main/res/layout/vh_sp_dropdown_item.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/vh_sp_dropdown_item.xml
rename to tangem-devkit/src/main/res/layout/vh_sp_dropdown_item.xml
diff --git a/tangem-demo/src/main/res/layout/vh_sp_item.xml b/tangem-devkit/src/main/res/layout/vh_sp_item.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/vh_sp_item.xml
rename to tangem-devkit/src/main/res/layout/vh_sp_item.xml
diff --git a/tangem-demo/src/main/res/layout/view_simple_button.xml b/tangem-devkit/src/main/res/layout/view_simple_button.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/view_simple_button.xml
rename to tangem-devkit/src/main/res/layout/view_simple_button.xml
diff --git a/tangem-demo/src/main/res/layout/w_action_response_json.xml b/tangem-devkit/src/main/res/layout/w_action_response_json.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_action_response_json.xml
rename to tangem-devkit/src/main/res/layout/w_action_response_json.xml
diff --git a/tangem-demo/src/main/res/layout/w_card_incoming_param.xml b/tangem-devkit/src/main/res/layout/w_card_incoming_param.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_card_incoming_param.xml
rename to tangem-devkit/src/main/res/layout/w_card_incoming_param.xml
diff --git a/tangem-demo/src/main/res/layout/w_empty.xml b/tangem-devkit/src/main/res/layout/w_empty.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_empty.xml
rename to tangem-devkit/src/main/res/layout/w_empty.xml
diff --git a/tangem-demo/src/main/res/layout/w_field_description.xml b/tangem-devkit/src/main/res/layout/w_field_description.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_field_description.xml
rename to tangem-devkit/src/main/res/layout/w_field_description.xml
diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_edit_text.xml b/tangem-devkit/src/main/res/layout/w_personalize_item_edit_text.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_personalize_item_edit_text.xml
rename to tangem-devkit/src/main/res/layout/w_personalize_item_edit_text.xml
diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_header.xml b/tangem-devkit/src/main/res/layout/w_personalize_item_header.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_personalize_item_header.xml
rename to tangem-devkit/src/main/res/layout/w_personalize_item_header.xml
diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_number.xml b/tangem-devkit/src/main/res/layout/w_personalize_item_number.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_personalize_item_number.xml
rename to tangem-devkit/src/main/res/layout/w_personalize_item_number.xml
diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_spinner.xml b/tangem-devkit/src/main/res/layout/w_personalize_item_spinner.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_personalize_item_spinner.xml
rename to tangem-devkit/src/main/res/layout/w_personalize_item_spinner.xml
diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_switch.xml b/tangem-devkit/src/main/res/layout/w_personalize_item_switch.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_personalize_item_switch.xml
rename to tangem-devkit/src/main/res/layout/w_personalize_item_switch.xml
diff --git a/tangem-demo/src/main/res/layout/w_personalize_widgets_together.xml b/tangem-devkit/src/main/res/layout/w_personalize_widgets_together.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_personalize_widgets_together.xml
rename to tangem-devkit/src/main/res/layout/w_personalize_widgets_together.xml
diff --git a/tangem-demo/src/main/res/layout/w_personilize_block.xml b/tangem-devkit/src/main/res/layout/w_personilize_block.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_personilize_block.xml
rename to tangem-devkit/src/main/res/layout/w_personilize_block.xml
diff --git a/tangem-demo/src/main/res/layout/w_response_item.xml b/tangem-devkit/src/main/res/layout/w_response_item.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_response_item.xml
rename to tangem-devkit/src/main/res/layout/w_response_item.xml
diff --git a/tangem-demo/src/main/res/layout/w_response_item_checkbox.xml b/tangem-devkit/src/main/res/layout/w_response_item_checkbox.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_response_item_checkbox.xml
rename to tangem-devkit/src/main/res/layout/w_response_item_checkbox.xml
diff --git a/tangem-demo/src/main/res/layout/w_response_item_header.xml b/tangem-devkit/src/main/res/layout/w_response_item_header.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/w_response_item_header.xml
rename to tangem-devkit/src/main/res/layout/w_response_item_header.xml
diff --git a/tangem-demo/src/main/res/menu/menu_activity_main.xml b/tangem-devkit/src/main/res/menu/menu_activity_main.xml
similarity index 100%
rename from tangem-demo/src/main/res/menu/menu_activity_main.xml
rename to tangem-devkit/src/main/res/menu/menu_activity_main.xml
diff --git a/tangem-demo/src/main/res/menu/menu_fg_peronalization.xml b/tangem-devkit/src/main/res/menu/menu_fg_peronalization.xml
similarity index 100%
rename from tangem-demo/src/main/res/menu/menu_fg_peronalization.xml
rename to tangem-devkit/src/main/res/menu/menu_fg_peronalization.xml
diff --git a/tangem-demo/src/main/res/menu/menu_fg_response.xml b/tangem-devkit/src/main/res/menu/menu_fg_response.xml
similarity index 100%
rename from tangem-demo/src/main/res/menu/menu_fg_response.xml
rename to tangem-devkit/src/main/res/menu/menu_fg_response.xml
diff --git a/tangem-devkit/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/tangem-devkit/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000000..036d09bc5f
--- /dev/null
+++ b/tangem-devkit/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+    
+    
+
\ No newline at end of file
diff --git a/tangem-devkit/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/tangem-devkit/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000000..036d09bc5f
--- /dev/null
+++ b/tangem-devkit/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+    
+    
+
\ No newline at end of file
diff --git a/tangem-devkit/src/main/res/mipmap-hdpi/ic_launcher.png b/tangem-devkit/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab0b9f8707741d422fb41b3212b71d6fd5fd27de
GIT binary patch
literal 1425
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

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-hdpi/ic_launcher_round.png b/tangem-devkit/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000000000000000000000000000000..334c1411a6aea8869cfca41dcc6ea1d2db86f5af
GIT binary patch
literal 3249
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

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-mdpi/ic_launcher.png b/tangem-devkit/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e66da64b2c3b5e7e0dd9e71027d5c907af39d18
GIT binary patch
literal 988
zcmV<210(#2P)st9KD>wg{*ti~utoL6`QAM+lWdGq~VX6F58CLlmc
zB2EBgq(IJ+oyGWNCK0{J)B8DCkgh{WcS(0RiM1W#&6`j2lwT*Q_xARTZnt}br#v3i
z%+rYw`#-u|t|qDoswf)SY_=A%cIjAv{lT)ewRMvKOso>+cFNt9bCIWQJA0Yr%RDkN
za_gYi!vKLSpP!!(bvm7!9soD*H_tqH0Bk)yJ@SKIy#kDmj)oC{Rg3^#U0sUP0*LY-
zXlrYGbglpv%LWz~7qPJ5pVroX^8tAK{v+g(kMYn?B|J-FZCx+`HTd$?YdnZh_^ohx
zB%BWC#R9k_013eVL7Ybbp=7{cMeqVxS^0^%xgX~uw~NCxT31(xva&KXHa22)brt31
z<-&baQxoW`iRI;GQ2c`a{(iKyw9uTt0JU0;p`jskc6JKoi;9X+Sy{>FJCK~5jPdbt
z6c!c=#!^#L(ca#U!NEZ^H#Z9^C@26u6H28L+1c6X?d=7{G$<)4!SL`f;^X5nJ3Gq<
zASES*g}H+H($Z2SCMKe|xELCZ1_pxxDwPUZSy?cdOb81LLu_m;CMPGM)9FxAQ30dT
zC_r-yCDPK;P+eV(^z?M}_4Ns6*nMkjE4H_{k&}}n7`0lh$j!}#R;xu`UY^i>s;a86
zzP^r(j0}DN)6>%!7#P6P(h_!db}%+JCfu`}o+0#kX3}oA3*Cg}Q&UsW>-EAvw7a{D
znVA`W02-|hb)UbW{(#v1_px!We(c=FS
z`vQ;IL>WcFH~h1hH-?r`~EYis8ojsCxzyR<}%5bNe{M@L7bF96}tpu4;Kw!`7D
zuu5V%;2>{oRkuNl|NG1%t+@kz9Wh;_mDE>)VD-R2c%}WeJu5j4c?&wt8JR3DE>1y<
zZ=Km}wr*~2{vmoB%P&&C3Spv;x_F5fQQGDIhdeq9t=aAklO|7Qh1q+lkx;SoiY*2C&HlNzdk@eIiNRvy6
zD=Bel>kL`J8WA(CbFc4Ps^9Te&@N6lo)r1H_JeW%|2gqH@6RbdUt1t=1GE?wH2iRO
zXf|k34)6=A1isi@mG=HQF`-jr-4eo+P$N_2Dg)Uv;1Lfx%*C=ul47jhxI6igY0?t
zer8|ih7Il8l74FPE!uIUaf8Q?8oQl)_H<3&@gzoRdicAU8(LdgSFT@w{o;)q8qCbh
zMMXu6ilwEc)6RAD_3>HS*j#xZ9v*(yYVqR5mo8sk{Cm}%XU~@XtE;b%my(i7$;t8Q
z>+dhk%g*+;vbNs8>h85`Z5uqkeE;qp6*bGm)YLOJc5X^)YUkOs$*Wgu&zw7VYD){t
z%603mS&F`W`}WcI->T~B?z3jkF70(tP`G*XX4JET2OHlRo13eYJN~e-C{h9UU#0<{FWfw(MtRZtmGT584dYU;iDtf7&#$lc!H#
zp6+}lBk1jw4wDvNUtiD6%#}CZmRZ``UajRx%nFeX2@CV8th5Y%R4-aqTdV8o>1kwP
zk--(L?3Y_3die0+U3X8N>N@xK-Md$rCieF6r;S@uQ&L`BKYG-4v)Q3{4mXY-ZB8gF+dsc;Lsu79;qJR>634wypFVB1UQDd5zy5jE~L)}$Z@0~f*6Z!tl8=vjKpuRXiKQC{|
z?%mN<)zx1;{u+J%>2tcpPQ^ij{oME92n7L=_=+VzbX&5--^TjZb#Lu;h+w(5@2_{A
zUSR}Rw1tiQv_-4_KRT*?_q^BJpyR=Q|Bn4K+wOY4eZ{{c`FiHl!}mS^ik{k$5+83NTz^=jR^QiG
zd)ZjHo+I(tl@)mcTZJy>1*|UJ|8!%u{hSTInP3?V$sW|~$iN^_{f{x_;PRGFwt`L|
NIZszVmvv4FO#nz<^sfK_

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-mdpi/ic_launcher_round.png b/tangem-devkit/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d2270c85da8d75570811c869d82ee631c4bdc85
GIT binary patch
literal 2059
zcmV+m2=w=fP)+PaV~rvk_4Sty|>
z$Baf}vB6-dL($-UD+%4xck~;z;caKVbs}VXvsn&7P*+eoQ2;^87T)Iy=|GuiX$(gK
zS4jTN?|()RwPv7=dcEEtN2skCp<2=@tqE=og`>ca5$?Z5(B%Sf0;DtaUocD=)EA%2
zX$(taI|BR;1g;kb*V_TwqHtXX?pk!eW5guHj;Qd6H0ylUjE(|t=7Kuuxv#J9nB64A
zXn@MHIC#l_`v=rJSYBJhAX%fgxAzo6Pz;NNxOh<6Q35Y2B`GdeLCmgL_$@ldL9z={
z{`uE@eX#L5J3CVZ5(+s4T=>jymuB94k%s*e0W-Y39V%Yl-+*4HA3y@fH|TUaXl-r%
zRm5g9&ZGbNNegy>+w?!f*6?i(Cop^NJka&&%ojJ2AXm~qd-m*mt9e57dt_ZMELd(BxB#u7wCG9_BmA6zvtKL3W_Sk(Ff25w
zXodUv`T3IuSwUjd)zuXu%s#v;1bBio;97u3j~;CrUy8OrxXIhK+N;mQby
ziZWscMj@TGY|SufG@1foEhtP0LaWuz#73P`2(v~2!y3GJp@GK6MnKZg)z!_ONwnHV
zG<7@0Z_K7TXl`zXj*d>&hh~tT>9^+Q7HDZ{G4<1Ev^Hxe#7ccTOG`_=P039POXy#l
zxck^F6CxraASfsZRhW(xppb{rdF~85s#_X=#v}n#$a5C+$
z$&w{-`SN9Q16aO%In>nDKt@IegocJfQ&W?iqK`5()YsQ%P<9r}3q^N#cgb)F+_-TA
zU8f5cEm{Q0$;sg7=Lb11fD#3
z!mLBqkXf}dYz++!Wr+E8C@m@~a(ngaRh?V{t5&UIp!e+A!)EW~$&<_#&YnFBIXO8%
z=|3SM0X#fB7+BN~8#Zi!%*;#(2nYbRT5UH0a&ugJ4^jVQ6M@^eZ-0h~;)PrSG|Tbv
z@o?b40eJlQG2Fd-7vkdLVDH|&uz&x4wpj1oy9b939b)YtJb1u>l4Zzc$i>pr)7iqN
zzT|qtA<*95uEG9OO#~_`DyHMCwa6tvGu(%wGZX1MYdJ(`p`Xr1KXU>&5v@2OUM2!K
zBQu9XAY8c}tH-Yg$!wIweaS=iqcYrQfuF^`bLaV5O=RW-(30LJ0=c=lUt&Dh$Rc1P
z6DK6?8?tXvaWTyEU0_!x771X;*B(50aJq>=Oiaw=moHz+TEzNyfB=T!han*$9%4N=
z4i{AE`#^v`F?y9F<_TgU=Yp{{{e2)n<74E?M9i)XJ1->^ckbL#O7*w3a>9uOsFE;J
z?S-YwPM(QhmlDU1ANR#v&~B@ka~1)beJbYA)jN`slD^{!*hMU--7sqw+A61=NPuCg
zt*uod){h2k1*CO=b;>pZXw8kBL4Y=7h|!4U4qUi!f!xPsz_wD_o-JIs@C!82{gG@b
z-w*+|rNrn{=i}ou)#ApUGx`84$K90H*-qMyP5m1nAkO}ugwf*pkif|E`Sa%$_8zM^
zntc)H3tTKqUa
zKR=#gE}75#P}kbgqP+yDpc4u3uxZ4N7MwqSK8Y~dJX(}O6Yh7(M4w*2em#q7d%Omm
zOcxdwvqRa)ol%1%=Th#F1k~zk_&sK~#ePSQrkGBtId}t2AjbM^!a|s2zqR4(flM{+
z=FOXzxFwiL&E3gdWYqLl`$=v?W8(fg4>5d2Scdd_8!tG^RPsa25k35P#^@*_0&u3Qsi~7>ojX`6*k-s7E7)&np
ziMzYIZ(3T~?y9OPRbyjg8_l4!G3VA9a7ix-sSRaSbd@$N;Z>xAbdgS3ao!Qu;Dd}u
znSwHV-MV!@VmbZ?7K7R72IW+<;I^*;6HpTg-9LT$v<}^`oZ3)Z>Vti~xQ_9pGcGR9
zDgT)uGLtwET6l9jJv|rr`}_Y87#J8pLih9?{l?o&;eA}+`ky^4S%e~mTCE<-*NJ2u
p`v1d+Tqg4GT)BU{QXfb7`Ts3@Qh%HAtYrWI002ovPDHLkV1oF7(H8&!

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher.png b/tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..e141514ce0900247eefc44a82cf73cbd47043392
GIT binary patch
literal 1953
zcmZvddpr~R8^^z!%N8*i(Jc2-ZYB5IG3Bz&YMsa>GoyZlWhpU3mbsMNB1~f^KSe5;
z>fnT|QtDJfDUvm{QJIcgKN}9mdHr6$KhEp*`@CMy^Sqvap68$E^M20l-{+^Mf>Hqh
zsNr$m2i7a~?|>_>=TDpzX8>SF@!np6jQ7(uu|%yH-QM4PRI~05-wu1@VC;7+mez;~
zEXuNe^6!U)771Kp!I53yaIR^%6Jj?|Fj;EpJ2f1r$Z`%fOVaO+@ivM!Duh8chLn^a
zJ~Jlyy4+baaldlO6C#U4LwA5bypBNcXAmvE$2WDzWB8kKvIBL3KwyJ%j~j2BbB;f|ifr)(5Q_)S3q%k;vnV-^Yyc;A}(isZ*y^LnOy=x`|~Y
zcK!?X&CSgjy+vDXCiMFnf5h9Pv~S4hM&~ZPSd9R_Xw1^`GK^H?s=afPVko7J4i4VV
z#poJ=3J7E2%fQjl&`=Ggxf1ADT3SMEU`c?ova&D1-`{i3A6Ec1b9F_Ih3>Qjb$&%?
zIl9XPD6&8Z2C#)xk6pTACDHHYp5x0`w1!b_FD(|rqjuTblP|yk?O4kAIz@C7v%QSCr*^o
z*J$DG`p;(_Y##3-7cWQsIWhV&(6i#1GBzk^^R=P4TiMx)!)PT1GqM^05+KCeH89$}s*FSR4+%I=(+50+F1Ytg&em1dqp?
z8F5NWHIJV>$ar`^t1zn3RBl}N)WsB2&wAW8$)wT2_NsP@pwFb
z%q#r>^$`eme%3?XKwn>HpHWRCWM+C&QZ@_>40N6vH5-`rLuDc^6#{*8Dhl`$-nXhD|rMbcQDSuGpf10gWvDWvoIy&6w1IDbqT*uj2
zz4FRR7@N&bAFcB%o}=`C`0zrl`Q}aWln7>iRgL_;;u=#9O_29r%;
zR}aiCA`E^K1L^d%k%!0D{QP|4z2s@sM;)~uTj8^3=SWwgY9`8NWHM**#Kc^x(xT5(
zMFFw4wsyq|E}5Eo9%j*}5c2lTn!LhN8v6=2uv-9)p>(?z_yP`{H3Vfw585tSq
z!2SC*4Dxrv{^MHh$M3vzr)-Z)x{SX9L{)Gew~p`g)ABgp%C1swe(*yygCT1~kUqK2
zBjTKYKEE8LZy!<3u{BR9?#j7UP-pphV)6RfGIL8&7{#7XN
z^E=ILmTMV(!B4x)K*5Z}s=KI9W}ByGU3O>b)^ea2@1_R5+0N*%))&Vg=el)`UmYU7%N_i+)^y#}I7IIRb5sbrD!
z#I0@eX|;1A)ZoBG@?>Al$C)RN6;ze^l5x`cRJ%f<=p}0%jpbjeL^Xw4fcz%zN5h!a
z%&H}^r}SHk9lz)HW+tn+WjCpx+uGX7yLN3`H7k66ZmybU3Lllp80p3(yPTYy&iu&M
z@9aW02CV2gOGQm>O-)T*ZYkf1-p!75p)_AOg40sJ5!`$_&pJ3KFVAo2?b{&R!OXGl
z%*^(NhM0obz>weZD;xuN#$}%!eLRn_ttixzHnRt6AU6AIhq)kzMnps?nNgQ;wfnRA
zk@%WRm+pCBFc`0*hll+T9G!^E=3fd$1JLbZ-MS24@y!E`!hh99HD_>Es-Q<~76dR4
zFM7YpgBz8aIBj!D+eLz8)H3KMgD#(wP=rFEii=9|RuAlse&hqaFm5WG7`3C|WYMn5
j^&iuzOY-`!W}|yNn=G?o?rx|=ur9pMKJQz*sabyk+W&X9

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ae5df33196d29811ad0ca587455120bd96e3cc3
GIT binary patch
literal 2465
zcmb7G2~d+s7EXu)3WzQvhY;8;6_h(FAh#|WL@oh^ELSoz3J4ehIYS_5jVR$z5RKfP
z$bb;eppXzoLx$prCP;z^2tg1Mh(HcP2<)%U?9SFy?e0`{zkc=J>w4W^b-(Z3IOXN4
zwsqH55D28^cH)>XuyVdkWko>V_^a7G2(%@_?by-N$?xVzV{*O|L8-A727f_HZxSMM
z6sHy{&*Wu^E04Qh=~h0AM6?*8qIkMyXC8D{X{}y+3NySg7yw5`69Mlv3Y)9UWxR5-@vwZCFmZvfpZsfv;}x_~
zn2;8*XqdVpXAB&4Nji?Z0OB*smcfwd
zPi<%WkRWXoPOY~(g{lZP4ZSK-P~lemD(M1VX_7DYjTrK@in%
z;;T#NYlOnDCcp_G0&Hnv`UbvM>I;t>oS4()26k5s45Z+|tx1^1&fxTO;%eWR7x+m{JRaEWNlBsgltoR=)E(!OQmJ?MX2x7zsK&`>3#SHcLM>
zB6UM9X&PbJ3p&nHTB6w7sBhoB3v?J7toCEI#*8#ZmX(#!(!8DJm**B1ys`|^S1O0>
zyIa_yD%z-ih^B7DFatK-cdrn<58|IOegM_bMOQ2tmvrl*O-Dnw4idF83WA9;@F$Y}`GewYj%7O^a*GjH;50FZM&@
z`(QMol74a}=aURlVxM#|ur>N0FLz{J_c65@ziH%EN`Q8YloDn0B(2_#MV40BRt;9d0
zj}^W-3(0Y5C@(JuQ|l1
zRvKb53(VX3jm*UrZa&*I3P_?eNDw^0n;Tock}o+j9VPEs+Yywz_}HJf7(MbVv9@}p
zN`P-B4mX8s=}!20I~K)sTy?}J%SCLqsmV4NJx9l{^#0nqOwjakbNAZoSZ;T&TBgVV
zENYQB1V9BQExKNHHPTnv&
zPwFSY!l-gyCKP~@#)w@ht{71Ac(@Jm*muA9Fl;Pkri{r(Nwrpsa#usKqPLTli_<0O
zfpmttx}bAo-BH0_H0Z|)LX(ROJqV}bIc-sFbLyd099c4kp>-QzeiBe*7k@FbU9Irc
zvrmk+Mwc3P&bN*!*G0;)_mE!1S@ndD6H!xnTD~(l}P~7$YE)F2B0>a@B>l9uPCdy`QCT972cR
zJxMdbH8Gsp35iQRM&Wn8K4v|^MZQAf2?FS(ao+u4y!P(8bEftldNvn>V=I!?Yv1gb
zIELU?CbA69XVpoC$q>6cY6P)8k)x~&#*^JU46`+q-S3)1Ed>m4BJUaLPC5U&d&3gl
z4mhm4K!aqZaK}4i>XvJEpgcz7FuR
zYnZtQvZKJg(>CQ<#
zXgqy2qt{$kWs3tpfmj-YG*DkEo|x;F*XFT5l+Aztyk<7cbv&+jjD5ksfj{V~NBto|*J4Jwd*B$^?L!ScybQQ(FnUdt-B}fC
z;INhR+J-qH|HNNWo}1Xz8p)a-WFBzBl){`!LU(UQByw1?PK%7gRf9S*_LPmuoH3OO6#QwtH@v#l-0wJ0XoE*x8o;2B>x$!hJlx
zF^z_=CJAg6REd8Jc;?Rnz9eh2)*4LS%1y#@C7!xa=t1Tkv!En{f^9A#AtBXa?}QaY
z?K(UP#
zs+|Z%Q`3)96VcUjc)vxz_QRM_SNLhY6VyYK4-|gw9RP^GG!YtKF8n`~!av=#xD|*8
bGr*OF!IgJ@xakbEULd#QUdQVGj=J(s3M!f0

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/tangem-devkit/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7d5201273bca0157ed375fc0127b59e32762c7f
GIT binary patch
literal 4553
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

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-xxhdpi/ic_launcher.png b/tangem-devkit/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..645b3d79dc0df0b5cc9ecb5e2f03f63235964c8a
GIT binary patch
literal 3061
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
a4nG4po6IrKea52z`Z9rA8rEF96Z3CR2Z7B1

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/tangem-devkit/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..03e74f693a9dd3ebd352965b5c1570a50c9ddb3f
GIT binary patch
literal 4276
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
XMY9jbym~+uDrIBoaH8-y{O7*|H}2%C

literal 0
HcmV?d00001

diff --git a/tangem-devkit/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/tangem-devkit/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9b1c8f1a666e0fa14c7ee1abd059e1c5a3529a0
GIT binary patch
literal 10769
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
 
@@ -61,79 +61,79 @@
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
diff --git a/tangem-demo/src/main/res/values/colors.xml b/tangem-devkit/src/main/res/values/colors.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/colors.xml
rename to tangem-devkit/src/main/res/values/colors.xml
diff --git a/tangem-demo/src/main/res/values/dimens.xml b/tangem-devkit/src/main/res/values/dimens.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/dimens.xml
rename to tangem-devkit/src/main/res/values/dimens.xml
diff --git a/tangem-demo/src/main/res/values/dimens_item_widget.xml b/tangem-devkit/src/main/res/values/dimens_item_widget.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/dimens_item_widget.xml
rename to tangem-devkit/src/main/res/values/dimens_item_widget.xml
diff --git a/tangem-devkit/src/main/res/values/ic_launcher_background.xml b/tangem-devkit/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000000..c5d5899fdf
--- /dev/null
+++ b/tangem-devkit/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+    #FFFFFF
+
\ No newline at end of file
diff --git a/tangem-demo/src/main/res/values/strings.xml b/tangem-devkit/src/main/res/values/strings.xml
similarity index 96%
rename from tangem-demo/src/main/res/values/strings.xml
rename to tangem-devkit/src/main/res/values/strings.xml
index 38c96cca46..07540ce2b6 100644
--- a/tangem-demo/src/main/res/values/strings.xml
+++ b/tangem-devkit/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
 
-    Tangem Development Kit
+    Tangem DevKit
 
     Description
 
diff --git a/tangem-demo/src/main/res/values/strings_action.xml b/tangem-devkit/src/main/res/values/strings_action.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/strings_action.xml
rename to tangem-devkit/src/main/res/values/strings_action.xml
diff --git a/tangem-demo/src/main/res/values/strings_personalization.xml b/tangem-devkit/src/main/res/values/strings_personalization.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/strings_personalization.xml
rename to tangem-devkit/src/main/res/values/strings_personalization.xml
diff --git a/tangem-demo/src/main/res/values/strings_response.xml b/tangem-devkit/src/main/res/values/strings_response.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/strings_response.xml
rename to tangem-devkit/src/main/res/values/strings_response.xml
diff --git a/tangem-demo/src/main/res/values/strings_scan.xml b/tangem-devkit/src/main/res/values/strings_scan.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/strings_scan.xml
rename to tangem-devkit/src/main/res/values/strings_scan.xml
diff --git a/tangem-demo/src/main/res/values/strings_tlv.xml b/tangem-devkit/src/main/res/values/strings_tlv.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/strings_tlv.xml
rename to tangem-devkit/src/main/res/values/strings_tlv.xml
diff --git a/tangem-demo/src/main/res/values/styles.xml b/tangem-devkit/src/main/res/values/styles.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/styles.xml
rename to tangem-devkit/src/main/res/values/styles.xml
diff --git a/tangem-demo/src/main/res/values/theme_debug.xml b/tangem-devkit/src/main/res/values/theme_debug.xml
similarity index 100%
rename from tangem-demo/src/main/res/values/theme_debug.xml
rename to tangem-devkit/src/main/res/values/theme_debug.xml
diff --git a/tangem-demo/src/main/res/xml/nfc_tech_filter.xml b/tangem-devkit/src/main/res/xml/nfc_tech_filter.xml
similarity index 100%
rename from tangem-demo/src/main/res/xml/nfc_tech_filter.xml
rename to tangem-devkit/src/main/res/xml/nfc_tech_filter.xml

From 19e6c34aa787702122098456239c453489f089f6 Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Thu, 23 Apr 2020 14:28:54 +0300
Subject: [PATCH 14/48] Updated on 2026-08-14

---
 .../src/main/java/com/tangem/CardSession.kt   |  6 +++++
 .../src/main/java/com/tangem/Config.kt        | 14 +++++++++---
 .../java/com/tangem/SessionEnvironment.kt     |  5 ++++-
 .../src/main/java/com/tangem/SessionError.kt  |  7 ++++++
 .../src/main/java/com/tangem/TangemSdk.kt     |  3 ++-
 .../java/com/tangem/common/extensions/Card.kt | 22 +++++++++++++++++++
 .../tangem/devkit/ucase/ui/ActionViewModel.kt |  3 +++
 7 files changed, 55 insertions(+), 5 deletions(-)
 create mode 100644 tangem-core/src/main/java/com/tangem/common/extensions/Card.kt

diff --git a/tangem-core/src/main/java/com/tangem/CardSession.kt b/tangem-core/src/main/java/com/tangem/CardSession.kt
index 450c056997..03b8330350 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
@@ -136,6 +137,11 @@ class CardSession(
                         callback(CompletionResult.Failure(SessionError.WrongCard()))
                         return@run
                     }
+                    if (!environment.allowedCards.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..ac6301c808 100644
--- a/tangem-core/src/main/java/com/tangem/Config.kt
+++ b/tangem-core/src/main/java/com/tangem/Config.kt
@@ -1,5 +1,8 @@
 package com.tangem
 
+import com.tangem.common.extensions.CardType
+import java.util.*
+
 class Config(
         /**
         * Enables or disables Linked Terminal feature.
@@ -18,16 +21,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,
+
+        /**
+         * Type of cards that are allowed to be interacted with in TangemSdk.
+         */
+        var allowedCards: EnumSet = EnumSet.allOf(CardType::class.java)
 )
\ 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..d1a052b155 100644
--- a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
+++ b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
@@ -2,8 +2,10 @@ package com.tangem
 
 import com.tangem.commands.Card
 import com.tangem.commands.EllipticCurve
+import com.tangem.common.extensions.CardType
 import com.tangem.common.extensions.calculateSha256
 import com.tangem.crypto.CryptoUtils.generatePublicKey
+import java.util.*
 
 
 /**
@@ -20,7 +22,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 allowedCards: EnumSet
 ) {
 
     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..27d1d79fc4 100644
--- a/tangem-core/src/main/java/com/tangem/TangemSdk.kt
+++ b/tangem-core/src/main/java/com/tangem/TangemSdk.kt
@@ -367,7 +367,8 @@ class TangemSdk(
     private fun buildEnvironment(): SessionEnvironment {
         val terminalKeys = if (config.linkedTerminal) terminalKeysService?.getKeys() else null
         return SessionEnvironment(
-                terminalKeys = terminalKeys
+                terminalKeys = terminalKeys,
+                allowedCards = config.allowedCards
         )
     }
 
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-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
index 7774441903..fdd0f1ea2f 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
@@ -9,6 +9,7 @@ import com.tangem.TangemSdk
 import com.tangem.commands.Card
 import com.tangem.commands.CommandResponse
 import com.tangem.common.CompletionResult
+import com.tangem.common.extensions.CardType
 import com.tangem.devkit._arch.SingleLiveEvent
 import com.tangem.devkit._arch.structure.Id
 import com.tangem.devkit._arch.structure.Payload
@@ -20,6 +21,7 @@ import com.tangem.devkit.ucase.resources.ActionType
 import com.tangem.devkit.ucase.tunnel.ViewScreen
 import com.tangem.devkit.ucase.variants.personalize.converter.ItemTypes
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
+import java.util.*
 
 /**
 [REDACTED_AUTHOR]
@@ -43,6 +45,7 @@ class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
 
     fun setCardManager(tangemSdk: TangemSdk) {
         this.tangemSdk = tangemSdk
+        this.tangemSdk.config.allowedCards = EnumSet.of(CardType.Sdk)
     }
 
     @Deprecated("Events must be send directly from the Widget")

From 6fa128da8f950fe551ac94e5cdc22c370f87a088 Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Thu, 23 Apr 2020 14:36:17 +0300
Subject: [PATCH 15/48] Updated on 2026-08-14

---
 app/src/main/res/values/strings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ce8a2776e1..3081823d17 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…

From 3f83609c2cfbd2d7d58fefdf28905e271d4c52b9 Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Thu, 23 Apr 2020 15:05:02 +0300
Subject: [PATCH 16/48] Updated on 2026-08-14

---
 tangem-core/src/main/java/com/tangem/CardFilter.kt | 14 ++++++++++++++
 .../src/main/java/com/tangem/CardSession.kt        |  3 ++-
 tangem-core/src/main/java/com/tangem/Config.kt     |  7 ++-----
 .../src/main/java/com/tangem/SessionEnvironment.kt |  4 +---
 tangem-core/src/main/java/com/tangem/TangemSdk.kt  |  2 +-
 .../com/tangem/devkit/ucase/ui/ActionViewModel.kt  |  2 +-
 6 files changed, 21 insertions(+), 11 deletions(-)
 create mode 100644 tangem-core/src/main/java/com/tangem/CardFilter.kt

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 03b8330350..f37fa310af 100644
--- a/tangem-core/src/main/java/com/tangem/CardSession.kt
+++ b/tangem-core/src/main/java/com/tangem/CardSession.kt
@@ -137,7 +137,8 @@ class CardSession(
                         callback(CompletionResult.Failure(SessionError.WrongCard()))
                         return@run
                     }
-                    if (!environment.allowedCards.contains(result.data.getType())) {
+                    val allowedCardTypes = environment.cardFilter.allowedCardTypes
+                    if (!allowedCardTypes.contains(result.data.getType())) {
                         stopWithError(SessionError.WrongCardType())
                         callback(CompletionResult.Failure(SessionError.WrongCardType()))
                         return@run
diff --git a/tangem-core/src/main/java/com/tangem/Config.kt b/tangem-core/src/main/java/com/tangem/Config.kt
index ac6301c808..20c5c849bd 100644
--- a/tangem-core/src/main/java/com/tangem/Config.kt
+++ b/tangem-core/src/main/java/com/tangem/Config.kt
@@ -1,8 +1,5 @@
 package com.tangem
 
-import com.tangem.common.extensions.CardType
-import java.util.*
-
 class Config(
         /**
         * Enables or disables Linked Terminal feature.
@@ -35,7 +32,7 @@ class Config(
         var encryptionMode: EncryptionMode = EncryptionMode.NONE,
 
         /**
-         * Type of cards that are allowed to be interacted with in TangemSdk.
+         * Filter that can be used to limit cards that can be interacted with in TangemSdk.
          */
-        var allowedCards: EnumSet = EnumSet.allOf(CardType::class.java)
+        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 d1a052b155..6400e98e39 100644
--- a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
+++ b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
@@ -2,10 +2,8 @@ package com.tangem
 
 import com.tangem.commands.Card
 import com.tangem.commands.EllipticCurve
-import com.tangem.common.extensions.CardType
 import com.tangem.common.extensions.calculateSha256
 import com.tangem.crypto.CryptoUtils.generatePublicKey
-import java.util.*
 
 
 /**
@@ -23,7 +21,7 @@ data class SessionEnvironment(
         var encryptionMode: EncryptionMode = EncryptionMode.NONE,
         var encryptionKey: ByteArray? = null,
         val cvc: ByteArray? = null,
-        var allowedCards: EnumSet
+        var cardFilter: CardFilter
 ) {
 
     fun setPin1(pin1: String) {
diff --git a/tangem-core/src/main/java/com/tangem/TangemSdk.kt b/tangem-core/src/main/java/com/tangem/TangemSdk.kt
index 27d1d79fc4..c00126d09f 100644
--- a/tangem-core/src/main/java/com/tangem/TangemSdk.kt
+++ b/tangem-core/src/main/java/com/tangem/TangemSdk.kt
@@ -368,7 +368,7 @@ class TangemSdk(
         val terminalKeys = if (config.linkedTerminal) terminalKeysService?.getKeys() else null
         return SessionEnvironment(
                 terminalKeys = terminalKeys,
-                allowedCards = config.allowedCards
+                cardFilter = config.cardFilter
         )
     }
 
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
index fdd0f1ea2f..3c04d86d59 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt
@@ -45,7 +45,7 @@ class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
 
     fun setCardManager(tangemSdk: TangemSdk) {
         this.tangemSdk = tangemSdk
-        this.tangemSdk.config.allowedCards = EnumSet.of(CardType.Sdk)
+        this.tangemSdk.config.cardFilter.allowedCardTypes = EnumSet.of(CardType.Sdk)
     }
 
     @Deprecated("Events must be send directly from the Widget")

From fcac61eb69ef9b95e3f023908ab1d19f07a067bd Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Thu, 23 Apr 2020 18:39:29 +0300
Subject: [PATCH 17/48] Updated on 2026-08-14

---
 .../paramsManager/managers/SimpleManagers.kt  |  5 +--
 .../ParamChangeConsequence.kt                 | 34 +++++--------------
 2 files changed, 11 insertions(+), 28 deletions(-)

diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
index 97e1a9f2db..a2a7ab9e8b 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
@@ -4,7 +4,7 @@ import com.tangem.devkit._arch.structure.impl.EditTextItem
 import com.tangem.devkit.ucase.domain.actions.DepersonalizeAction
 import com.tangem.devkit.ucase.domain.actions.ScanAction
 import com.tangem.devkit.ucase.domain.actions.SignAction
-import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.SignScanConsequence
+import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.CardIdConsequence
 import com.tangem.devkit.ucase.variants.TlvId
 
 /**
@@ -15,6 +15,7 @@ class ScanItemsManager : BaseItemsManager(ScanAction())
 class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) {
 
     init {
+        setItemChangeConsequences(CardIdConsequence())
         setItems(listOf(EditTextItem(TlvId.CardId, null)))
     }
 }
@@ -22,7 +23,7 @@ class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) {
 class SignItemsManager : BaseItemsManager(SignAction()) {
 
     init {
-        setItemChangeConsequences(SignScanConsequence())
+        setItemChangeConsequences(CardIdConsequence())
         setItems(listOf(
                 EditTextItem(TlvId.CardId, null),
                 EditTextItem(TlvId.TransactionOutHash, "Data used for hashing")
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
index 5a455a3989..6da18ea8b7 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
@@ -1,13 +1,7 @@
 package com.tangem.devkit.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.devkit._arch.structure.PayloadHolder
 import com.tangem.devkit._arch.structure.abstraction.Item
-import com.tangem.devkit._arch.structure.abstraction.findItem
 import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
 import com.tangem.devkit.ucase.tunnel.ActionView
 import com.tangem.devkit.ucase.variants.TlvId
@@ -20,29 +14,17 @@ import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI
  * of the incoming parameter
  */
 interface ItemsChangeConsequence {
-    fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List?
+    fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List
 }
 
-class SignScanConsequence : ItemsChangeConsequence {
+class CardIdConsequence : ItemsChangeConsequence {
 
-    override fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List? {
-        if (changedItem.id != TlvId.CardId) return null
+    override fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List {
+        val affectedList = mutableListOf()
+        if (changedItem.id != TlvId.CardId) return affectedList
 
-        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()
+        val cidDataIsNull = changedItem.getData() == null
+        postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.enableActionFab(!cidDataIsNull) }
+        return affectedList
     }
 }
\ No newline at end of file

From 1c0dfe48cd1009c90af758992bba9833b902ff88 Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Tue, 28 Apr 2020 14:30:34 +0300
Subject: [PATCH 18/48] Updated on 2026-08-14

---
 .../bitcoin/BitcoinTransactionBuilder.kt      |  48 ++--
 .../bitcoin/BitcoinWalletManager.kt           |  23 +-
 .../bitcoin/network/BitcoinNetworkManager.kt  |   4 +-
 .../bitcoin/network/BlockchainInfoProvider.kt |   4 +-
 .../bitcoin/network/BlockcypherProvider.kt    |   4 +-
 .../bitcoincash/BitcoinCashAddressService.kt  |  23 ++
 .../bitcoincash/BitcoinCashNetworkManager.kt  |  33 +++
 .../bitcoincash/BitcoinCashTransaction.java   | 110 +++++++++
 .../BitcoinCashTransactionBuilder.kt          |  82 +++++++
 .../bitcoincash/BitcoinCashWalletManager.kt   |  28 +++
 .../BitcoinCashAddressDecodedParts.java       |  37 +++
 .../cashaddr/BitcoinCashAddressType.java      |  23 ++
 .../cashaddr/BitcoinCashBase32.java           |  74 ++++++
 .../BitcoinCashBitArrayConverter.java         |  60 +++++
 .../bitcoincash/cashaddr/CashAddr.java        | 225 ++++++++++++++++++
 .../tangem/blockchain/common/Blockchain.kt    |   7 +-
 .../blockchain/common/WalletManagerFactory.kt |  11 +
 .../blockchain/network/RetrofitBuilder.kt     |   9 +-
 .../network/blockchair/BlockchairApi.kt       |  36 +++
 .../network/blockchair/BlockchairProvider.kt  |  96 ++++++++
 .../network/blockchair/BlockchairResponse.kt  |  75 ++++++
 .../bitcoincash/BitcoinCashAddressTest.kt     |  27 +++
 .../common/WalletManagerFactoryTest.kt        |  12 +
 23 files changed, 1004 insertions(+), 47 deletions(-)
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressService.kt
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashNetworkManager.kt
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransaction.java
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransactionBuilder.kt
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashWalletManager.kt
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressDecodedParts.java
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressType.java
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBase32.java
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBitArrayConverter.java
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/CashAddr.java
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairApi.kt
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairProvider.kt
 create mode 100644 blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairResponse.kt
 create mode 100644 blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressTest.kt

diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
index 24f072b218..ef0cbe5500 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
@@ -10,20 +10,20 @@ import org.bitcoinj.script.ScriptBuilder
 import java.math.BigDecimal
 import java.math.BigInteger
 
-class BitcoinTransactionBuilder(
+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)
@@ -40,27 +40,13 @@ class BitcoinTransactionBuilder(
         return Result.Success(hashesForSign)
     }
 
-    private fun calculateChange(transactionData: TransactionData): 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): ByteArray {
+    open fun buildToSend(signedTransaction: ByteArray): ByteArray {
         for (index in transaction.inputs.indices) {
             transaction.inputs[index].scriptSig = createScript(index, signedTransaction, walletPublicKey)
         }
         return transaction.bitcoinSerialize()
     }
 
-    private 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): Result {
         val buildTransactionResult = buildToSign(transactionData)
         when (buildTransactionResult) {
@@ -72,14 +58,28 @@ class BitcoinTransactionBuilder(
             }
         }
     }
+
+    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()))
+    }
+
+    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))
+    }
 }
 
 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()),
@@ -93,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
index 8d38566e23..0670f32ad4 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
@@ -2,7 +2,7 @@ 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.BitcoinNetworkManager
+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
@@ -10,14 +10,14 @@ import com.tangem.common.CompletionResult
 import com.tangem.common.extensions.toHexString
 import java.math.BigDecimal
 
-class BitcoinWalletManager(
+open class BitcoinWalletManager(
         cardId: String,
         wallet: Wallet,
         private val transactionBuilder: BitcoinTransactionBuilder,
-        private val networkManager: BitcoinNetworkManager
+        private val networkManager: BitcoinProvider
 ) : WalletManager(cardId, wallet), TransactionSender {
 
-    private val blockchain = wallet.blockchain
+    protected val blockchain = wallet.blockchain
 
     override suspend fun update() {
         val response = networkManager.getInfo(wallet.address)
@@ -30,7 +30,7 @@ class BitcoinWalletManager(
     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.unspentTransactions
+        transactionBuilder.unspentOutputs = response.unspentOutputs
         if (response.hasUnconfirmed) {
             if (wallet.transactions.isEmpty()) wallet.addIncomingTransaction()
         } else {
@@ -44,8 +44,7 @@ class BitcoinWalletManager(
     }
 
     override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
-        val buildTransactionResult = transactionBuilder.buildToSign(transactionData)
-        when (buildTransactionResult) {
+        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)) {
@@ -60,8 +59,8 @@ class BitcoinWalletManager(
     }
 
     override suspend fun getFee(amount: Amount, destination: String): Result> {
-        when (val result = networkManager.getFee()) {
-            is Result.Failure -> return 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
@@ -72,9 +71,9 @@ class BitcoinWalletManager(
                     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)
+                        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),
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
index 5810ede23f..8483883d82 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
@@ -1,6 +1,6 @@
 package com.tangem.blockchain.blockchains.bitcoin.network
 
-import com.tangem.blockchain.blockchains.bitcoin.UnspentTransaction
+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
@@ -90,7 +90,7 @@ class BitcoinNetworkManager(private val isTestNet: Boolean = false) : BitcoinPro
 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/blockchains/bitcoin/network/BlockchainInfoProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
index b26b05debc..cb9dc12e6a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
@@ -1,6 +1,6 @@
 package com.tangem.blockchain.blockchains.bitcoin.network
 
-import com.tangem.blockchain.blockchains.bitcoin.UnspentTransaction
+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
@@ -29,7 +29,7 @@ class BlockchainInfoProvider(
                 val unconfirmedTransactions = addressData.transactions?.find { it.blockHeight == 0L } != null
 
                 val bitcoinUnspents = unspents.unspentOutputs.map {
-                    UnspentTransaction(
+                    BitcoinUnspentOutput(
                             it.amount!!.toBigDecimal().movePointLeft(decimals),
                             it.outputIndex!!.toLong(),
                             it.hash!!.hexToBytes(),
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
index 17da8cced0..58b6bec6a4 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
@@ -1,6 +1,6 @@
 package com.tangem.blockchain.blockchains.bitcoin.network
 
-import com.tangem.blockchain.blockchains.bitcoin.UnspentTransaction
+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
@@ -26,7 +26,7 @@ class BlockcypherProvider(private val api: BlockcypherApi, isTestNet: Boolean) :
         try {
             val addressData: BlockcypherResponse = retryIO { api.getAddressData(blockchain, network, address) }
             val unspents = addressData.txrefs?.map {
-                UnspentTransaction(
+                BitcoinUnspentOutput(
                         it.amount!!.toBigDecimal().movePointLeft(decimals),
                         it.outputIndex!!.toLong(),
                         it.hash!!.hexToBytes(),
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/common/Blockchain.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
index f2be55b6f0..34920ecaca 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
@@ -2,6 +2,7 @@ package com.tangem.blockchain.common
 
 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
@@ -17,6 +18,7 @@ enum class Blockchain(
     Unknown("", "", ""),
     Bitcoin("BTC", "BTC", "Bitcoin"),
     BitcoinTestnet("BTC/test", "BTCt", "Bitcoin Testnet"),
+    BitcoinCash("BCH", "BCH", "Bitcoin Cash"),
     Ethereum("ETH", "ETH", "Ethereum"),
     Rootstock("", "", ""),
     Cardano("CARDANO", "ADA", "Cardano"),
@@ -32,7 +34,7 @@ enum class Blockchain(
     }
 
     fun decimals(): Int = when (this) {
-        Bitcoin, BitcoinTestnet, Binance, BinanceTestnet -> 8
+        Bitcoin, BitcoinTestnet, BitcoinCash, Binance, BinanceTestnet -> 8
         Cardano, XRP -> 6
         Ethereum, Rootstock -> 18
         Stellar -> 7
@@ -51,6 +53,7 @@ enum class Blockchain(
         Unknown -> throw Exception("unsupported blockchain")
         Bitcoin -> BitcoinAddressService()
         BitcoinTestnet -> BitcoinAddressService(true)
+        BitcoinCash -> BitcoinCashAddressService()
         Ethereum -> EthereumAddressService()
         Rootstock -> throw Exception("unsupported blockchain")
         Cardano -> CardanoAddressService()
@@ -70,6 +73,8 @@ enum class Blockchain(
     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/"
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 b5bf3032f2..b0a50afe28 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
@@ -6,6 +6,9 @@ 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
@@ -21,6 +24,7 @@ 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 {
 
@@ -50,6 +54,13 @@ object WalletManagerFactory {
                         BitcoinNetworkManager(true)
                 )
             }
+            Blockchain.BitcoinCash -> {
+                return BitcoinCashWalletManager(
+                        card.cardId, wallet,
+                        BitcoinCashTransactionBuilder(walletPublicKey.toCompressedPublicKey()),
+                        BitcoinCashNetworkManager()
+                )
+            }
             Blockchain.Ethereum -> {
                 val chain = Chain.Mainnet
                 return EthereumWalletManager(
diff --git a/blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
index a3ecaaac41..bdd4eca666 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
@@ -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://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"
\ 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/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/common/WalletManagerFactoryTest.kt b/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
index 9c15645ed2..ff9edbcdd1 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
@@ -4,6 +4,7 @@ import com.google.common.truth.Truth
 import com.tangem.SessionEnvironment
 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
@@ -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

From c29f42113c4bd9d5a23dc158841716c676e47be4 Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Tue, 28 Apr 2020 15:05:43 +0300
Subject: [PATCH 19/48] Updated on 2026-08-14

---
 tangem-core/src/main/java/com/tangem/SessionEnvironment.kt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
index 6400e98e39..c1c9a296b2 100644
--- a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
+++ b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
@@ -21,7 +21,7 @@ data class SessionEnvironment(
         var encryptionMode: EncryptionMode = EncryptionMode.NONE,
         var encryptionKey: ByteArray? = null,
         val cvc: ByteArray? = null,
-        var cardFilter: CardFilter
+        var cardFilter: CardFilter = CardFilter()
 ) {
 
     fun setPin1(pin1: String) {

From 7b4b9e4ff7dc57ce9bc83ca467ed690911819659 Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Tue, 28 Apr 2020 19:31:04 +0300
Subject: [PATCH 20/48] Updated on 2026-08-14

---
 .../initializers/PersonalizationResources.kt       |  6 ------
 .../devkit/ucase/variants/personalize/Ids.kt       |  5 -----
 .../personalize/converter/DefaultValues.kt         |  4 +---
 .../variants/personalize/converter/ItemTypes.kt    |  4 ++--
 .../converter/PersonalizationConfigConverter.kt    | 14 +-------------
 .../converter/PersonalizationConfigToCardConfig.kt |  2 +-
 .../personalize/dto/PersonalizationConfig.kt       | 13 +++----------
 7 files changed, 8 insertions(+), 40 deletions(-)

diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
index f92eee7e95..d5a9eb0601 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
@@ -17,7 +17,6 @@ class PersonalizationResources() {
         initCommon(holder)
         initSigningMethod(holder)
         initSignHashExProp(holder)
-        initDenomination(holder)
         initToken(holder)
         initProductMask(holder)
         initSettingsMask(holder)
@@ -72,11 +71,6 @@ class PersonalizationResources() {
         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))
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
index 2e10c89ab8..fd186e61f2 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
@@ -54,11 +54,6 @@ enum class SignHashExProp : PersonalizationId {
     CheckPin3,
 }
 
-enum class Denomination : PersonalizationId {
-    WriteOnPersonalize,
-    Denomination,
-}
-
 enum class Token : PersonalizationId {
     ItsToken,
     Symbol,
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
index bb3edb89e9..8c558ab19f 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
@@ -34,8 +34,6 @@ class ConfigValuesHolder : BaseTypedHolder() {
         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))
@@ -49,7 +47,7 @@ class ConfigValuesHolder : BaseTypedHolder() {
         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.OneApdu, Value(default.useOneCommandAtTime))
         register(SettingsMask.UseCvc, Value(default.useCVC))
         register(SettingsMask.AllowSwapPin, Value(default.allowSwapPIN))
         register(SettingsMask.AllowSwapPin2, Value(default.allowSwapPIN2))
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
index 209036fc03..c257887476 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
@@ -17,7 +17,7 @@ class ItemTypes {
             Common.CreateWallet, SigningMethod.SignTx, SigningMethod.SignTxRaw, SigningMethod.SignValidatedTx,
             SigningMethod.SignValidatedTxRaw, SigningMethod.SignValidatedTxIssuer,
             SigningMethod.SignValidatedTxRawIssuer, SigningMethod.SignExternal, SignHashExProp.RequireTerminalCertSig,
-            SignHashExProp.RequireTerminalTxSig, SignHashExProp.CheckPin3, Denomination.WriteOnPersonalize, Token.ItsToken,
+            SignHashExProp.RequireTerminalTxSig, SignHashExProp.CheckPin3, Token.ItsToken,
             ProductMask.Note, ProductMask.Tag, ProductMask.IdCard, ProductMask.IdIssuerCard, SettingsMask.IsReusable, SettingsMask.NeedActivation,
             SettingsMask.ForbidPurge, SettingsMask.AllowSelectBlockchain, SettingsMask.UseBlock, SettingsMask.OneApdu,
             SettingsMask.UseCvc, SettingsMask.AllowSwapPin, SettingsMask.AllowSwapPin2, SettingsMask.ForbidDefaultPin,
@@ -34,7 +34,7 @@ class ItemTypes {
     )
 
     val numberList = mutableListOf(
-            CardNumber.Number, Common.MaxSignatures, SignHashExProp.PinLessFloorLimit, Denomination.Denomination, Token.Decimal
+            CardNumber.Number, Common.MaxSignatures, SignHashExProp.PinLessFloorLimit, Token.Decimal
     )
 
     val hiddenList = mutableListOf(
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
index c2c6810da3..47bc3f2e6a 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
@@ -70,8 +70,6 @@ class ItemsToPersonalizationConfig : ItemsToModel {
         export.requireTerminalCertSignature = getTyped(SignHashExProp.RequireTerminalCertSig)
         export.requireTerminalTxSignature = getTyped(SignHashExProp.RequireTerminalTxSig)
         export.checkPIN3onCard = getTyped(SignHashExProp.CheckPin3)
-        export.writeOnPersonalization = getTyped(Denomination.WriteOnPersonalize)
-        export.denomination = getTyped(Denomination.Denomination)
         export.itsToken = getTyped(Token.ItsToken)
         export.symbol = getTyped(Token.Symbol)
         export.contractAddress = getTyped(Token.ContractAddress)
@@ -85,7 +83,7 @@ class ItemsToPersonalizationConfig : ItemsToModel {
         export.forbidPurgeWallet = getTyped(SettingsMask.ForbidPurge)
         export.allowSelectBlockchain = getTyped(SettingsMask.AllowSelectBlockchain)
         export.useBlock = getTyped(SettingsMask.UseBlock)
-        export.oneApdu = getTyped(SettingsMask.OneApdu)
+        export.useOneCommandAtTime = getTyped(SettingsMask.OneApdu)
         export.useCVC = getTyped(SettingsMask.UseCvc)
         export.allowSwapPIN = getTyped(SettingsMask.AllowSwapPin)
         export.allowSwapPIN2 = getTyped(SettingsMask.AllowSwapPin2)
@@ -139,7 +137,6 @@ class PersonalizationConfigToItems : ModelToItems {
         blocList.add(common())
         blocList.add(signingMethod())
         blocList.add(signHashExProperties())
-        blocList.add(denomination())
         blocList.add(token())
         blocList.add(productMask())
         blocList.add(settingsMask())
@@ -203,15 +200,6 @@ class PersonalizationConfigToItems : ModelToItems {
         return block
     }
 
-    private fun denomination(): ItemGroup {
-        val block = createGroup(BlockId.Denomination)
-        mutableListOf(
-                Denomination.WriteOnPersonalize,
-                Denomination.Denomination
-        ).forEach { createItem(block, it) }
-        return block
-    }
-
     private fun token(): ItemGroup {
         val block = createGroup(BlockId.Token)
         mutableListOf(
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
index e71acdacd5..719b6bea7a 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
@@ -101,7 +101,7 @@ class PersonalizationConfigToCardConfig : Converter
Date: Tue, 28 Apr 2020 22:24:55 +0300
Subject: [PATCH 21/48] Updated on 2026-08-14

---
 .../structure/abstraction/ModelConverter.kt   |   5 +
 .../personalize/converter/DefaultValues.kt    |  10 +-
 .../PersonalizationConfigConverter.kt         |  10 +-
 .../PersonalizationConfigToCardConfig.kt      |  47 ++---
 .../converter/PersonalizationJsonConverter.kt | 189 ++++++++++++++++++
 .../personalize/dto/PersonalizationConfig.kt  |  85 ++++++--
 .../personalize/dto/PersonalizationJson.kt    |  52 +++++
 7 files changed, 339 insertions(+), 59 deletions(-)
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt

diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
index d6b1cdb38c..30c69cd6b2 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
@@ -9,6 +9,11 @@ interface DefaultConverter {
     fun convert(from: A, default: B): B
 }
 
+interface TwoWayConverter {
+    fun aToB(from: A): B
+    fun bToA(from: B): A
+}
+
 interface ItemsToModel : DefaultConverter, M>
 interface ModelToItems : Converter>
 
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
index 8c558ab19f..51747d4156 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt
@@ -16,9 +16,9 @@ class ConfigValuesHolder : BaseTypedHolder() {
     fun init(default: PersonalizationConfig) {
         register(CardNumber.Series, Value(default.series))
         register(CardNumber.Number, Value(default.startNumber))
-        register(CardNumber.BatchId, Value(default.batchId))
+        register(CardNumber.BatchId, Value(default.cardData.batch))
         register(Common.Curve, Value(default.curveID, Helper.listOfCurves()))
-        register(Common.Blockchain, Value(default.blockchain, Helper.listOfBlockchain()))
+        register(Common.Blockchain, Value(default.cardData.blockchain, Helper.listOfBlockchain()))
         register(Common.BlockchainCustom, Value(default.blockchainCustom))
         register(Common.MaxSignatures, Value(default.MaxSignatures))
         register(Common.CreateWallet, Value(default.createWallet))
@@ -35,9 +35,9 @@ class ConfigValuesHolder : BaseTypedHolder() {
         register(SignHashExProp.RequireTerminalTxSig, Value(default.requireTerminalTxSignature))
         register(SignHashExProp.CheckPin3, Value(default.checkPIN3onCard))
         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(Token.Symbol, Value(default.cardData.token_symbol))
+        register(Token.ContractAddress, Value(default.cardData.token_contract_address))
+        register(Token.Decimal, Value(default.cardData.token_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))
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
index 47bc3f2e6a..a2f8b5de05 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
@@ -52,9 +52,9 @@ class ItemsToPersonalizationConfig : ItemsToModel {
         val export = PersonalizationConfig()
         export.series = getTyped(CardNumber.Series)
         export.startNumber = getTyped(CardNumber.Number)
-        export.batchId = getTyped(CardNumber.BatchId)
+        export.cardData.batch = getTyped(CardNumber.BatchId)
         export.curveID = getTyped(Common.Curve)
-        export.blockchain = getTyped(Common.Blockchain)
+        export.cardData.blockchain = getTyped(Common.Blockchain)
         export.blockchainCustom = getTyped(Common.BlockchainCustom)
         export.MaxSignatures = getTyped(Common.MaxSignatures)
         export.createWallet = getTyped(Common.CreateWallet)
@@ -71,9 +71,9 @@ class ItemsToPersonalizationConfig : ItemsToModel {
         export.requireTerminalTxSignature = getTyped(SignHashExProp.RequireTerminalTxSig)
         export.checkPIN3onCard = getTyped(SignHashExProp.CheckPin3)
         export.itsToken = getTyped(Token.ItsToken)
-        export.symbol = getTyped(Token.Symbol)
-        export.contractAddress = getTyped(Token.ContractAddress)
-        export.decimal = getTyped(Token.Decimal)
+        export.cardData.token_symbol = getTyped(Token.Symbol)
+        export.cardData.token_contract_address = getTyped(Token.ContractAddress)
+        export.cardData.token_decimal = getTyped(Token.Decimal)
         export.cardData = export.cardData.apply { this.product_note = getTyped(ProductMask.Note) }
         export.cardData = export.cardData.apply { this.product_tag = getTyped(ProductMask.Tag) }
         export.cardData = export.cardData.apply { this.product_id_card = getTyped(ProductMask.IdCard) }
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
index 719b6bea7a..1c202d0265 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
@@ -1,6 +1,9 @@
 package com.tangem.devkit.ucase.variants.personalize.converter
 
-import com.tangem.commands.*
+import com.tangem.commands.CardData
+import com.tangem.commands.EllipticCurve
+import com.tangem.commands.Product
+import com.tangem.commands.ProductMaskBuilder
 import com.tangem.commands.personalization.entities.CardConfig
 import com.tangem.commands.personalization.entities.NdefRecord
 import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
@@ -10,29 +13,7 @@ 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 signingMethod = PersonalizationConfig.makeSigningMask(from)
 
         val isNote = from.cardData.product_note
         val isTag = from.cardData.product_tag
@@ -40,25 +21,25 @@ class PersonalizationConfigToCardConfig : Converter {
+
+    override fun aToB(from: PersonalizationJson): PersonalizationConfig = JsonToConfig().convert(from)
+
+    override fun bToA(from: PersonalizationConfig): PersonalizationJson = ConfigToJson().convert(from)
+}
+
+internal class JsonToConfig : Converter {
+    override fun convert(from: PersonalizationJson): PersonalizationConfig {
+        val config = PersonalizationConfig.default()
+        config.apply {
+            // Card number
+            series = from.series
+            startNumber = from.startNumber
+
+            // Common
+            curveID = EllipticCurve.byName(from.curveID)?.curve ?: ""
+            blockchainCustom = ""
+            MaxSignatures = from.MaxSignatures
+            createWallet = from.createWallet != 0L
+
+            // Sign hash external properties
+            pinLessFloorLimit = 100000L
+            hexCrExKey = from.hexCrExKey
+            requireTerminalTxSignature = from.requireTerminalTxSignature
+            requireTerminalCertSignature = from.requireTerminalCertSignature
+            checkPIN3onCard = from.checkPIN3onCard
+
+            // Product mask
+            cardData = from.cardData
+
+            // Settings mask
+            isReusable = from.isReusable
+            useActivation = from.useActivation
+            forbidPurgeWallet = from.forbidPurgeWallet
+            allowSelectBlockchain = from.allowSelectBlockchain
+            useBlock = from.useBlock
+            useOneCommandAtTime = from.useOneCommandAtTime
+            useCVC = from.useCVC
+            allowSwapPIN = from.allowSwapPIN
+            allowSwapPIN2 = from.allowSwapPIN2
+            forbidDefaultPIN = from.forbidDefaultPIN
+            smartSecurityDelay = from.smartSecurityDelay
+            protectIssuerDataAgainstReplay = from.protectIssuerDataAgainstReplay
+            skipSecurityDelayIfValidatedByIssuer = from.skipSecurityDelayIfValidatedByIssuer
+            skipCheckPIN2andCVCIfValidatedByIssuer = from.skipCheckPIN2andCVCIfValidatedByIssuer
+            skipSecurityDelayIfValidatedByLinkedTerminal = from.skipSecurityDelayIfValidatedByLinkedTerminal
+            restrictOverwriteIssuerDataEx = from.restrictOverwriteIssuerDataEx
+
+            // Settings mask - protocol encryption
+            protocolAllowUnencrypted = from.protocolAllowUnencrypted
+            protocolAllowStaticEncryption = from.protocolAllowStaticEncryption
+
+            // Settings mask
+            useNDEF = from.useNDEF
+            useDynamicNDEF = from.useDynamicNDEF
+            disablePrecomputedNDEF = from.disablePrecomputedNDEF
+
+            // Pins
+            PIN = from.PIN
+            PIN2 = from.PIN2
+            PIN3 = from.PIN3
+            CVC = from.CVC
+            pauseBeforePIN2 = from.pauseBeforePIN2
+
+            count = from.count
+            issuerName = from.issuerName
+            issuerData = from.issuerData
+//            numberFormat = from.numberFormat
+        }
+
+        fillToken(config, from.cardData)
+        fillSigningMethod(config, from.SigningMethod)
+        fillNdef(config, from.ndef)
+
+        return config
+    }
+
+    private fun fillToken(config: PersonalizationConfig, cardData: CardData) {
+        config.itsToken = cardData.token_contract_address.isNotEmpty() || cardData.token_symbol.isNotEmpty()
+        config.cardData.token_contract_address = cardData.token_contract_address
+        config.cardData.token_symbol = cardData.token_symbol
+        config.cardData.token_decimal = cardData.token_decimal
+    }
+
+    private fun fillSigningMethod(config: PersonalizationConfig, signingMethod: Long) {
+        val mask = SigningMethodMask(signingMethod.toInt())
+        if (mask.contains(SigningMethod.SignHash)) config.SigningMethod0 = true
+        if (mask.contains(SigningMethod.SignRaw)) config.SigningMethod1 = true
+        if (mask.contains(SigningMethod.SignHashValidateByIssuer)) config.SigningMethod2 = true
+        if (mask.contains(SigningMethod.SignRawValidateByIssuer)) config.SigningMethod3 = true
+        if (mask.contains(SigningMethod.SignHashValidateByIssuerWriteIssuerData)) config.SigningMethod4 = true
+        if (mask.contains(SigningMethod.SignRawValidateByIssuerWriteIssuerData)) config.SigningMethod5 = true
+    }
+
+    private fun fillNdef(config: PersonalizationConfig, ndef: MutableList) {
+        ndef.forEach { record ->
+            when (record.type) {
+                NdefRecord.Type.URI -> config.uri = record.value
+                NdefRecord.Type.AAR -> config.aar = record.value
+                NdefRecord.Type.TEXT -> {
+                }
+            }
+        }
+    }
+}
+
+internal class ConfigToJson : Converter {
+    override fun convert(from: PersonalizationConfig): PersonalizationJson {
+        val jsonDto = PersonalizationJson()
+        jsonDto.apply {
+            releaseVersion = false
+            issuerName = from.issuerName
+            series = from.series
+            startNumber = from.startNumber
+            count = from.count
+            PIN = from.PIN
+            PIN2 = from.PIN2
+            PIN3 = from.PIN3
+            hexCrExKey = from.hexCrExKey
+            CVC = from.CVC
+            pauseBeforePIN2 = from.pauseBeforePIN2
+            smartSecurityDelay = from.smartSecurityDelay
+            curveID = from.curveID
+            MaxSignatures = from.MaxSignatures
+            isReusable = from.isReusable
+            allowSwapPIN = from.allowSwapPIN
+            allowSwapPIN2 = from.allowSwapPIN2
+            useActivation = from.useActivation
+            useCVC = from.useCVC
+            useNDEF = from.useNDEF
+            useDynamicNDEF = from.useDynamicNDEF
+            useOneCommandAtTime = from.useOneCommandAtTime
+            useBlock = from.useBlock
+            allowSelectBlockchain = from.allowSelectBlockchain
+            forbidPurgeWallet = from.forbidPurgeWallet
+            protocolAllowUnencrypted = from.protocolAllowUnencrypted
+            protocolAllowStaticEncryption = from.protocolAllowStaticEncryption
+            protectIssuerDataAgainstReplay = from.protectIssuerDataAgainstReplay
+            forbidDefaultPIN = from.forbidDefaultPIN
+            disablePrecomputedNDEF = from.disablePrecomputedNDEF
+            skipSecurityDelayIfValidatedByIssuer = from.skipSecurityDelayIfValidatedByIssuer
+            skipCheckPIN2andCVCIfValidatedByIssuer = from.skipCheckPIN2andCVCIfValidatedByIssuer
+            skipSecurityDelayIfValidatedByLinkedTerminal = from.skipSecurityDelayIfValidatedByLinkedTerminal
+            restrictOverwriteIssuerDataEx = from.restrictOverwriteIssuerDataEx
+            requireTerminalTxSignature = from.requireTerminalTxSignature
+            requireTerminalCertSignature = from.requireTerminalCertSignature
+            checkPIN3onCard = from.checkPIN3onCard
+            createWallet = if (from.createWallet) 1 else 0
+            issuerData = from.issuerData
+            cardData = from.cardData
+//            numberFormat = from.numberFormat
+        }
+
+        fillSigningMethod(jsonDto, from)
+        fillNdef(jsonDto, from)
+        return jsonDto
+    }
+
+    private fun fillSigningMethod(jsonDto: PersonalizationJson, from: PersonalizationConfig) {
+        jsonDto.SigningMethod = PersonalizationConfig.makeSigningMask(from).rawValue.toLong()
+    }
+
+    private fun fillNdef(jsonDto: PersonalizationJson, from: PersonalizationConfig) {
+        fun add(value: String, type: NdefRecord.Type) {
+            if (value.isNotEmpty()) jsonDto.ndef.add(NdefRecord(type, value))
+        }
+
+        if (from.aarCustom.isNotEmpty()) add(from.aarCustom, NdefRecord.Type.AAR)
+        else add(from.aar, NdefRecord.Type.AAR)
+
+        add(from.uri, NdefRecord.Type.URI)
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
index 67a46c81e8..fbf4739e5c 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
@@ -1,7 +1,9 @@
 package com.tangem.devkit.ucase.variants.personalize.dto
 
 import com.tangem.commands.EllipticCurve
-import com.tangem.commands.personalization.entities.NdefRecord
+import com.tangem.commands.SigningMethod
+import com.tangem.commands.SigningMethodMask
+import com.tangem.commands.SigningMethodMaskBuilder
 
 /**
 [REDACTED_AUTHOR]
@@ -11,11 +13,9 @@ class PersonalizationConfig {
     // Card number
     var series = ""
     var startNumber: Long = 0
-    var batchId = ""
 
     // Common
     var curveID = ""
-    var blockchain = ""
     var blockchainCustom = ""
     var MaxSignatures: Long = 0
     var createWallet = false
@@ -38,10 +38,8 @@ class PersonalizationConfig {
 
     // Token
     var itsToken = false
-    var symbol = ""
-    var contractAddress = ""
-    var decimal: Long = 0
 
+    // Product mask
     var cardData = CardData()
 
     // Settings mask
@@ -66,6 +64,7 @@ class PersonalizationConfig {
     var protocolAllowUnencrypted = false
     var protocolAllowStaticEncryption = false
 
+    // Settings mask
     var useNDEF = false
     var useDynamicNDEF = false
     var disablePrecomputedNDEF = false
@@ -80,17 +79,24 @@ class PersonalizationConfig {
     var CVC = ""
     var pauseBeforePIN2: Long = 0
 
+//    Fields from JSON
+//    var releaseVersion = true - don't use in personalization
+//    var count = 1050          - don't use in personalization
+//    var numberFormat = ""     - don't use in personalization
+    var count: Long = 0
+    var issuerName = ""
+    var issuerData = null
+
     companion object {
+
         fun default(): PersonalizationConfig {
             return PersonalizationConfig().apply {
                 // Card number
                 series = "BB"
                 startNumber = 300000000000L
-                batchId = "ffff"
 
                 // Common
                 curveID = EllipticCurve.Secp256k1.curve
-                blockchain = "ETH"
                 blockchainCustom = ""
                 MaxSignatures = 999999L
                 createWallet = true
@@ -113,11 +119,8 @@ class PersonalizationConfig {
 
                 // Token
                 itsToken = false
-                symbol = ""
-                contractAddress = ""
-                decimal = 0L
 
-                cardData = CardData()
+                cardData = CardData.default()
 
                 // Settings mask
                 isReusable = true
@@ -154,17 +157,67 @@ class PersonalizationConfig {
                 PIN3 = ""
                 CVC = "000"
                 pauseBeforePIN2 = 5000L
+
+                count = 1050
+                issuerName = "TANGEM"
+                issuerData = null
             }
         }
+
+        fun makeSigningMask(from: PersonalizationConfig): SigningMethodMask {
+            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)
+            }
+            return signingMethodMaskBuilder.build()
+        }
     }
 }
 
 class CardData {
-    var date = "2020-02-17"
-    var batch = "FF87"
-    var blockchain = "IROHA"
-    var product_note = true
+    var date = ""
+    var batch = ""
+    var blockchain = ""
+    var token_symbol = ""
+    var token_contract_address = ""
+    var token_decimal: Int = 0
+    var product_note = false
     var product_tag = false
     var product_id_card = false
     var product_id_issuer = false
+
+    companion object {
+        fun default(): CardData {
+            return CardData().apply {
+                date = "2020-02-17"
+                batch = "FFFF"
+                blockchain = "ETH"
+                token_symbol = ""
+                token_contract_address = ""
+                token_decimal = 0
+                product_note = true
+                product_tag = false
+                product_id_card = false
+                product_id_issuer = false
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt
new file mode 100644
index 0000000000..c19ddc4515
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt
@@ -0,0 +1,52 @@
+package com.tangem.devkit.ucase.variants.personalize.dto
+
+import com.tangem.commands.personalization.entities.NdefRecord
+
+class PersonalizationJson {
+
+    var releaseVersion = false
+    var issuerName = ""
+    var series = ""
+    var startNumber = 0L
+    var count = 0L
+    var PIN = ""
+    var PIN2 = ""
+    var PIN3 = ""
+    var hexCrExKey = ""
+    var CVC = ""
+    var pauseBeforePIN2 = 0L
+    var smartSecurityDelay = false
+    var curveID = ""
+    var SigningMethod = 0L
+    var MaxSignatures = 0L
+    var isReusable = false
+    var allowSwapPIN = false
+    var allowSwapPIN2 = false
+    var useActivation = false
+    var useCVC = false
+    var useNDEF = false
+    var useDynamicNDEF = false
+    var useOneCommandAtTime = false
+    var useBlock = false
+    var allowSelectBlockchain = false
+    var forbidPurgeWallet = false
+    var protocolAllowUnencrypted = false
+    var protocolAllowStaticEncryption = false
+    var protectIssuerDataAgainstReplay = false
+    var forbidDefaultPIN = false
+    var disablePrecomputedNDEF = false
+    var skipSecurityDelayIfValidatedByIssuer = false
+    var skipCheckPIN2andCVCIfValidatedByIssuer = false
+    var skipSecurityDelayIfValidatedByLinkedTerminal = false
+    var restrictOverwriteIssuerDataEx = false
+    var requireTerminalTxSignature = false
+    var requireTerminalCertSignature = false
+    var checkPIN3onCard = false
+    var createWallet = 0L
+    var issuerData = null
+
+    var ndef = mutableListOf()
+    var cardData = CardData()
+
+    var numberFormat = ""
+}
\ No newline at end of file

From 675b1c418ec3904dea56bae33bbbbda404795240 Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Tue, 28 Apr 2020 22:33:28 +0300
Subject: [PATCH 22/48] Updated on 2026-08-14

---
 .../converter/PersonalizationConfigToCardConfig.kt            | 2 +-
 .../personalize/converter/PersonalizationJsonConverter.kt     | 4 ++--
 .../ucase/variants/personalize/dto/PersonalizationConfig.kt   | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
index 1c202d0265..f69b90978d 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
@@ -13,7 +13,7 @@ import java.util.*
 class PersonalizationConfigToCardConfig : Converter {
 
     override fun convert(from: PersonalizationConfig): CardConfig {
-        val signingMethod = PersonalizationConfig.makeSigningMask(from)
+        val signingMethod = PersonalizationConfig.makeSigningMethodMask(from)
 
         val isNote = from.cardData.product_note
         val isTag = from.cardData.product_tag
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt
index 6267a56699..1326011b73 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt
@@ -35,7 +35,7 @@ internal class JsonToConfig : Converter
Date: Wed, 29 Apr 2020 10:20:17 +0300
Subject: [PATCH 23/48] Updated on 2026-08-14

---
 .../commands/ReadIssuerExtraDataCommand.kt    |  2 +-
 .../tangem/commands/WriteUserDataCommand.kt   |  2 +-
 .../_main/entryPoint/ActionListFragment.kt    | 18 ++---
 .../domain/actions/CreateWalletAction.kt      | 23 ++++++
 .../ucase/domain/actions/PurgeWalletAction.kt | 23 ++++++
 .../domain/actions/ReadIssuerDataAction.kt    | 23 ++++++
 .../actions/ReadIssuerExtraDataAction.kt      | 23 ++++++
 .../domain/actions/ReadUserDataAction.kt      | 23 ++++++
 .../domain/actions/WriteIssuerDataAction.kt   | 37 +++++++++
 .../actions/WriteIssuerExtraDataAction.kt     | 45 +++++++++++
 .../domain/actions/WriteUserDataAction.kt     | 31 ++++++++
 .../paramsManager/managers/SimpleManagers.kt  | 78 ++++++++++++++++++-
 .../initializers/ResponseResources.kt         | 54 ++++++++++++-
 .../resources/initializers/TlvResources.kt    |  4 +
 .../devkit/ucase/ui/BaseCardActionFragment.kt |  2 +-
 .../com/tangem/devkit/ucase/variants/Ids.kt   |  4 +
 .../ui/CreateWalletActionFragment.kt          | 10 +++
 .../issuerdata/ui/ReadIssuerDataFragment.kt   | 10 +++
 .../ui/ReadIssuerExtraDataFragment.kt         | 10 +++
 .../issuerdata/ui/WriteIssuerDataFragment.kt  | 10 +++
 .../ui/WriteIssuerExtraDataFragment.kt        | 10 +++
 .../dto/DefaultPersonalizationParams.kt       | 16 ++--
 .../ui/PurgeWalletActionFragment.kt           | 10 +++
 .../devkit/ucase/variants/responses/Ids.kt    | 34 ++++++++
 .../variants/responses/ResponseViewModel.kt   | 12 ++-
 .../responses/converter/ConvertersStore.kt    | 10 ++-
 .../responses/converter/SimpleConverters.kt   | 75 +++++++++++++++++-
 .../userdata/ui/ReadUserDataFragment.kt       | 10 +++
 .../userdata/ui/WriteUserDataFragment.kt      | 10 +++
 .../src/main/res/navigation/navigation.xml    | 32 ++++----
 tangem-devkit/src/main/res/values/strings.xml | 15 +++-
 .../src/main/res/values/strings_action.xml    | 33 ++++----
 .../src/main/res/values/strings_response.xml  | 23 ++++++
 .../src/main/res/values/strings_tlv.xml       |  8 ++
 34 files changed, 661 insertions(+), 69 deletions(-)
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/CreateWalletAction.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PurgeWalletAction.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadIssuerDataAction.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadIssuerExtraDataAction.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadUserDataAction.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteIssuerDataAction.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteIssuerExtraDataAction.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteUserDataAction.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/createwallet/ui/CreateWalletActionFragment.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/ReadIssuerDataFragment.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/ReadIssuerExtraDataFragment.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/WriteIssuerDataFragment.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/WriteIssuerExtraDataFragment.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/purgewallet/ui/PurgeWalletActionFragment.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/userdata/ui/ReadUserDataFragment.kt
 create mode 100644 tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/userdata/ui/WriteUserDataFragment.kt

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-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/ActionListFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/ActionListFragment.kt
index 78af64f574..5a1008d717 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/ActionListFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_main/entryPoint/ActionListFragment.kt
@@ -63,15 +63,15 @@ class ActionListFragment : BaseFragment() {
                 ActionType.Scan,
                 ActionType.Sign,
                 ActionType.Personalize,
-                ActionType.Depersonalize
-//                ActionType.CreateWallet,
-//                ActionType.PurgeWallet,
-//                ActionType.ReadIssuerData,
-//                ActionType.WriteIssuerData,
-//                ActionType.ReadIssuerExData,
-//                ActionType.WriteIssuerExData,
-//                ActionType.ReadUserData,
-//                ActionType.WriteUserData
+                ActionType.Depersonalize,
+                ActionType.CreateWallet,
+                ActionType.PurgeWallet,
+                ActionType.ReadIssuerData,
+                ActionType.WriteIssuerData,
+                ActionType.ReadIssuerExData,
+                ActionType.WriteIssuerExData,
+                ActionType.ReadUserData,
+                ActionType.WriteUserData
         )
     }
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/CreateWalletAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/CreateWalletAction.kt
new file mode 100644
index 0000000000..0e02ca670f
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/CreateWalletAction.kt
@@ -0,0 +1,23 @@
+package com.tangem.devkit.ucase.domain.actions
+
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
+
+class CreateWalletAction : BaseAction() {
+    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
+        val item = attrs.itemList.findItem(TlvId.CardId) ?: return
+        val cardId = item.viewModel.data as? String ?: return
+
+        attrs.tangemSdk.createWallet(cardId) { handleResult(payload, it, null, attrs, callback) }
+    }
+
+    override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? {
+        return when (id) {
+            TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) }
+            else -> null
+        }
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PurgeWalletAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PurgeWalletAction.kt
new file mode 100644
index 0000000000..4c2efe395e
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PurgeWalletAction.kt
@@ -0,0 +1,23 @@
+package com.tangem.devkit.ucase.domain.actions
+
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
+
+class PurgeWalletAction : BaseAction() {
+    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
+        val item = attrs.itemList.findItem(TlvId.CardId) ?: return
+        val cardId = item.viewModel.data as? String ?: return
+
+        attrs.tangemSdk.purgeWallet(cardId) { handleResult(payload, it, null, attrs, callback) }
+    }
+
+    override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? {
+        return when (id) {
+            TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) }
+            else -> null
+        }
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadIssuerDataAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadIssuerDataAction.kt
new file mode 100644
index 0000000000..580e43d4f2
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadIssuerDataAction.kt
@@ -0,0 +1,23 @@
+package com.tangem.devkit.ucase.domain.actions
+
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
+
+class ReadIssuerDataAction : BaseAction() {
+    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
+        val item = attrs.itemList.findItem(TlvId.CardId) ?: return
+        val cardId = item.viewModel.data as? String ?: return
+
+        attrs.tangemSdk.readIssuerData(cardId) { handleResult(payload, it, null, attrs, callback) }
+    }
+
+    override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? {
+        return when (id) {
+            TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) }
+            else -> null
+        }
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadIssuerExtraDataAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadIssuerExtraDataAction.kt
new file mode 100644
index 0000000000..4483a0bd78
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadIssuerExtraDataAction.kt
@@ -0,0 +1,23 @@
+package com.tangem.devkit.ucase.domain.actions
+
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
+
+class ReadIssuerExtraDataAction : BaseAction() {
+    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
+        val item = attrs.itemList.findItem(TlvId.CardId) ?: return
+        val cardId = item.viewModel.data as? String ?: return
+
+        attrs.tangemSdk.readIssuerExtraData(cardId) { handleResult(payload, it, null, attrs, callback) }
+    }
+
+    override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? {
+        return when (id) {
+            TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) }
+            else -> null
+        }
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadUserDataAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadUserDataAction.kt
new file mode 100644
index 0000000000..6014c60757
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/ReadUserDataAction.kt
@@ -0,0 +1,23 @@
+package com.tangem.devkit.ucase.domain.actions
+
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
+
+class ReadUserDataAction : BaseAction() {
+    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
+        val item = attrs.itemList.findItem(TlvId.CardId) ?: return
+        val cardId = item.viewModel.data as? String ?: return
+
+        attrs.tangemSdk.readUserData(cardId) { handleResult(payload, it, null, attrs, callback) }
+    }
+
+    override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? {
+        return when (id) {
+            TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) }
+            else -> null
+        }
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteIssuerDataAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteIssuerDataAction.kt
new file mode 100644
index 0000000000..c93f5edfc1
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteIssuerDataAction.kt
@@ -0,0 +1,37 @@
+package com.tangem.devkit.ucase.domain.actions
+
+import com.tangem.common.extensions.hexToBytes
+import com.tangem.common.extensions.toByteArray
+import com.tangem.crypto.sign
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
+import com.tangem.devkit.ucase.variants.personalize.dto.DefaultPersonalizationParams
+import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
+
+class WriteIssuerDataAction : BaseAction() {
+    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
+        val cardId = attrs.itemList.findItem(TlvId.CardId)?.viewModel?.data ?: return
+        val counter = (attrs.itemList.findItem(TlvId.Counter)?.viewModel?.data as? Int) ?: 1
+
+        val issuerDataItem = attrs.itemList.findItem(TlvId.IssuerData) ?: return
+        val issuerData = (issuerDataItem.getData() as? String)?.toByteArray() ?: return
+
+        val signedIssuerData = (
+                stringOf(cardId).hexToBytes() + issuerData + counter.toByteArray(4))
+                .sign(DefaultPersonalizationParams.issuer().dataKeyPair.privateKey)
+
+        attrs.tangemSdk.writeIssuerData(stringOf(cardId), issuerData, signedIssuerData, counter) {
+            handleResult(payload, it, null, attrs, callback)
+        }
+    }
+
+    override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? {
+        return when (id) {
+            TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) }
+            else -> null
+        }
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteIssuerExtraDataAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteIssuerExtraDataAction.kt
new file mode 100644
index 0000000000..17c5052f9f
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteIssuerExtraDataAction.kt
@@ -0,0 +1,45 @@
+package com.tangem.devkit.ucase.domain.actions
+
+import com.tangem.commands.WriteIssuerExtraDataCommand
+import com.tangem.common.extensions.hexToBytes
+import com.tangem.common.extensions.toByteArray
+import com.tangem.crypto.CryptoUtils
+import com.tangem.crypto.sign
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
+import com.tangem.devkit.ucase.variants.personalize.dto.DefaultPersonalizationParams
+import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
+
+class WriteIssuerExtraDataAction : BaseAction() {
+    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
+        val cardId = attrs.itemList.findItem(TlvId.CardId)?.viewModel?.data ?: return
+        val counter = (attrs.itemList.findItem(TlvId.Counter)?.viewModel?.data as? String)?.toInt() ?: 1
+
+        val issuerData = CryptoUtils.generateRandomBytes(WriteIssuerExtraDataCommand.SINGLE_WRITE_SIZE * 5)
+
+
+        val startingSignature = (
+                stringOf(cardId).hexToBytes() + counter.toByteArray(4) + issuerData.size.toByteArray(2))
+                .sign(DefaultPersonalizationParams.issuer().dataKeyPair.privateKey)
+
+        val finalizingSignature = (
+                stringOf(cardId).hexToBytes() + issuerData + counter.toByteArray(4))
+                .sign(DefaultPersonalizationParams.issuer().dataKeyPair.privateKey)
+
+        attrs.tangemSdk.writeIssuerExtraData(
+                stringOf(cardId), issuerData, startingSignature, finalizingSignature, counter
+        ) {
+            handleResult(payload, it, null, attrs, callback)
+        }
+    }
+
+    override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? {
+        return when (id) {
+            TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) }
+            else -> null
+        }
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteUserDataAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteUserDataAction.kt
new file mode 100644
index 0000000000..d7d6da6107
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/WriteUserDataAction.kt
@@ -0,0 +1,31 @@
+package com.tangem.devkit.ucase.domain.actions
+
+import com.tangem.devkit._arch.structure.Id
+import com.tangem.devkit._arch.structure.PayloadHolder
+import com.tangem.devkit._arch.structure.abstraction.findItem
+import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
+import com.tangem.devkit.ucase.variants.TlvId
+import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
+
+class WriteUserDataAction : BaseAction() {
+    override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
+        val userData = (attrs.itemList.findItem(TlvId.UserData)?.getData() as? String)?.toByteArray()
+                ?: return
+        val protectedUserData = (attrs.itemList.findItem(TlvId.ProtectedUserData)?.getData() as? String)?.toByteArray()
+                ?: return
+        val cardId = attrs.itemList.findItem(TlvId.CardId)?.viewModel?.data ?: return
+        val counter = (attrs.itemList.findItem(TlvId.Counter)?.viewModel?.data as? Int) ?: 1
+
+        attrs.tangemSdk.writeUserData(stringOf(cardId), userData, protectedUserData, counter, counter) {
+            handleResult(payload, it, null, attrs, callback)
+        }
+    }
+
+    override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? {
+        return when (id) {
+            TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) }
+            TlvId.Counter -> { callback -> ReadUserDataAction().executeMainAction(payload, attrs, callback) }
+            else -> null
+        }
+    }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
index a2a7ab9e8b..a5085dccb2 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt
@@ -1,9 +1,7 @@
 package com.tangem.devkit.ucase.domain.paramsManager.managers
 
 import com.tangem.devkit._arch.structure.impl.EditTextItem
-import com.tangem.devkit.ucase.domain.actions.DepersonalizeAction
-import com.tangem.devkit.ucase.domain.actions.ScanAction
-import com.tangem.devkit.ucase.domain.actions.SignAction
+import com.tangem.devkit.ucase.domain.actions.*
 import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.CardIdConsequence
 import com.tangem.devkit.ucase.variants.TlvId
 
@@ -29,4 +27,78 @@ class SignItemsManager : BaseItemsManager(SignAction()) {
                 EditTextItem(TlvId.TransactionOutHash, "Data used for hashing")
         ))
     }
+}
+
+class CreateWalletItemsManager : BaseItemsManager(CreateWalletAction()) {
+
+    init {
+        setItemChangeConsequences(CardIdConsequence())
+        setItems(listOf(EditTextItem(TlvId.CardId, null)))
+    }
+}
+
+class PurgeWalletItemsManager : BaseItemsManager(PurgeWalletAction()) {
+
+    init {
+        setItemChangeConsequences(CardIdConsequence())
+        setItems(listOf(EditTextItem(TlvId.CardId, null)))
+    }
+}
+
+class ReadIssuerDataItemsManager : BaseItemsManager(ReadIssuerDataAction()) {
+
+    init {
+        setItemChangeConsequences(CardIdConsequence())
+        setItems(listOf(EditTextItem(TlvId.CardId, null)))
+    }
+}
+
+class WriteIssuerDataItemsManager : BaseItemsManager(WriteIssuerDataAction()) {
+    init {
+        setItemChangeConsequences(CardIdConsequence())
+        setItems(listOf(
+                EditTextItem(TlvId.CardId, null),
+                EditTextItem(TlvId.IssuerData, "Data to be written on a card as issuer data"),
+                EditTextItem(TlvId.Counter, "1")
+        ))
+    }
+}
+
+class ReadIssuerExtraDataItemsManager : BaseItemsManager(ReadIssuerExtraDataAction()) {
+
+    init {
+        setItemChangeConsequences(CardIdConsequence())
+        setItems(listOf(EditTextItem(TlvId.CardId, null)))
+    }
+}
+
+class WriteIssuerExtraDataItemsManager : BaseItemsManager(WriteIssuerExtraDataAction()) {
+    init {
+        setItemChangeConsequences(CardIdConsequence())
+        setItems(listOf(
+                EditTextItem(TlvId.CardId, null),
+                EditTextItem(TlvId.Counter, "1")
+        ))
+    }
+}
+
+class ReadUserDataItemsManager : BaseItemsManager(ReadUserDataAction()) {
+
+    init {
+        setItemChangeConsequences(CardIdConsequence())
+        setItems(listOf(EditTextItem(TlvId.CardId, null)))
+    }
+}
+
+class WriteUserDataItemsManager : BaseItemsManager(WriteUserDataAction()) {
+    init {
+        setItemChangeConsequences(CardIdConsequence())
+        setItems(listOf(
+                EditTextItem(TlvId.CardId, null),
+                EditTextItem(TlvId.Counter, "1"),
+                EditTextItem(TlvId.UserData, "User data to be written on a card"),
+                EditTextItem(TlvId.ProtectedUserData, "Protected user data to be written on a card")
+
+        ))
+    }
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ResponseResources.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ResponseResources.kt
index 37a044c9fa..792a4ee0cb 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ResponseResources.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/ResponseResources.kt
@@ -3,10 +3,7 @@ package com.tangem.devkit.ucase.resources.initializers
 import com.tangem.devkit.R
 import com.tangem.devkit.ucase.resources.MainResourceHolder
 import com.tangem.devkit.ucase.resources.Resources
-import com.tangem.devkit.ucase.variants.responses.CardDataId
-import com.tangem.devkit.ucase.variants.responses.CardId
-import com.tangem.devkit.ucase.variants.responses.DepersonalizeId
-import com.tangem.devkit.ucase.variants.responses.SignId
+import com.tangem.devkit.ucase.variants.responses.*
 
 /**
 [REDACTED_AUTHOR]
@@ -17,6 +14,13 @@ class ResponseResources {
         initCardData(holder)
         initSignResponse(holder)
         initDepersonalizeResponse(holder)
+        initCreateWalletResponse(holder)
+        initPurgeWalletResponse(holder)
+        initReadIssuerDataResponse(holder)
+        initWriteIssuerDataResponse(holder)
+        initReadIssuerExtraDataResponse(holder)
+        initReadUserDataResponse(holder)
+        initWriteUserDataResponse(holder)
     }
 
     private fun initCard(holder: MainResourceHolder) {
@@ -65,4 +69,46 @@ class ResponseResources {
     private fun initDepersonalizeResponse(holder: MainResourceHolder) {
         holder.register(DepersonalizeId.isSuccess, Resources(R.string.response_depersonalize_is_success, R.string.info_response_depersonalize_is_success))
     }
+
+    private fun initCreateWalletResponse(holder: MainResourceHolder) {
+        holder.register(CreateWalletId.cid, Resources(R.string.response_card_cid, R.string.info_response_card_cid))
+        holder.register(CreateWalletId.cardStatus, Resources(R.string.response_card_status, R.string.info_response_card_status))
+        holder.register(CreateWalletId.walletPublicKey, Resources(R.string.response_card_wallet_public_key, R.string.info_response_card_wallet_public_key))
+    }
+
+    private fun initPurgeWalletResponse(holder: MainResourceHolder) {
+        holder.register(PurgeWalletId.cid, Resources(R.string.response_card_cid, R.string.info_response_card_cid))
+        holder.register(PurgeWalletId.cardStatus, Resources(R.string.response_card_status, R.string.info_response_card_status))
+    }
+
+    private fun initReadIssuerDataResponse(holder: MainResourceHolder) {
+        holder.register(ReadIssuerDataId.cid, Resources(R.string.response_card_cid, R.string.info_response_card_cid))
+        holder.register(ReadIssuerDataId.issuerData, Resources(R.string.response_issuer_data, R.string.info_response_issuer_data))
+        holder.register(ReadIssuerDataId.issuerDataSignature, Resources(R.string.response_issuer_data_signature, R.string.info_response_issuer_data_signature))
+        holder.register(ReadIssuerDataId.issuerDataCounter, Resources(R.string.response_issuer_data_counter, R.string.info_response_issuer_data_counter))
+    }
+
+    private fun initWriteIssuerDataResponse(holder: MainResourceHolder) {
+        holder.register(ReadIssuerDataId.cid, Resources(R.string.response_card_cid, R.string.info_response_card_cid))
+    }
+
+    private fun initReadIssuerExtraDataResponse(holder: MainResourceHolder) {
+        holder.register(ReadIssuerExtraDataId.cid, Resources(R.string.response_card_cid, R.string.info_response_card_cid))
+        holder.register(ReadIssuerExtraDataId.size, Resources(R.string.response_issuer_data_size, R.string.info_response_issuer_data_size))
+        holder.register(ReadIssuerExtraDataId.issuerData, Resources(R.string.response_issuer_data, R.string.info_response_issuer_data))
+        holder.register(ReadIssuerExtraDataId.issuerDataSignature, Resources(R.string.response_issuer_data_signature, R.string.info_response_issuer_data_signature))
+        holder.register(ReadIssuerExtraDataId.issuerDataCounter, Resources(R.string.response_issuer_data_counter, R.string.info_response_issuer_data_counter))
+    }
+
+    private fun initReadUserDataResponse(holder: MainResourceHolder) {
+        holder.register(ReadUserDataId.cid, Resources(R.string.response_card_cid, R.string.info_response_card_cid))
+        holder.register(ReadUserDataId.userData, Resources(R.string.response_user_data, R.string.info_response_user_data))
+        holder.register(ReadUserDataId.userProtectedData, Resources(R.string.response_user_protected_data, R.string.info_response_user_protected_data))
+        holder.register(ReadUserDataId.userCounter, Resources(R.string.response_user_data_counter, R.string.info_response_user_data_counter))
+        holder.register(ReadUserDataId.userProtectedCounter, Resources(R.string.response_user_data_protected_counter, R.string.info_response_user_data_protected_counter))
+    }
+
+    private fun initWriteUserDataResponse(holder: MainResourceHolder) {
+        holder.register(ReadIssuerDataId.cid, Resources(R.string.response_card_cid, R.string.info_response_card_cid))
+    }
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/TlvResources.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/TlvResources.kt
index a1b64dd45d..32bb68d840 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/TlvResources.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/TlvResources.kt
@@ -16,5 +16,9 @@ class TlvResources {
     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))
+        holder.register(TlvId.Counter, Resources(R.string.tlv_counter, R.string.info_tlv_counter))
+        holder.register(TlvId.IssuerData, Resources(R.string.tlv_issuer_data, R.string.info_tlv_issuer_data))
+        holder.register(TlvId.UserData, Resources(R.string.tlv_issuer_data, R.string.info_tlv_user_data))
+        holder.register(TlvId.ProtectedUserData, Resources(R.string.tlv_user_protected_data, R.string.info_tlv_protected_user_data))
     }
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseCardActionFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseCardActionFragment.kt
index 97bb78f808..36cf46321e 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseCardActionFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/BaseCardActionFragment.kt
@@ -140,7 +140,7 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView {
         })
     }
 
-    private fun inflateParamView(where: ViewGroup): ViewGroup {
+    protected fun inflateParamView(where: ViewGroup): ViewGroup {
         val inflater = LayoutInflater.from(where.context)
         val view = inflater.inflate(R.layout.w_card_incoming_param, where, false)
         where.plusAssign(view)
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/Ids.kt
index e372276e8a..2200b40724 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/Ids.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/Ids.kt
@@ -8,4 +8,8 @@ import com.tangem.devkit._arch.structure.Id
 enum class TlvId : Id {
     CardId,
     TransactionOutHash,
+    IssuerData,
+    Counter,
+    UserData,
+    ProtectedUserData
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/createwallet/ui/CreateWalletActionFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/createwallet/ui/CreateWalletActionFragment.kt
new file mode 100644
index 0000000000..605f9dd649
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/createwallet/ui/CreateWalletActionFragment.kt
@@ -0,0 +1,10 @@
+package com.tangem.devkit.ucase.variants.createwallet.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.CreateWalletItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+
+class CreateWalletActionFragment : BaseCardActionFragment() {
+
+    override val itemsManager: ItemsManager by lazy { CreateWalletItemsManager() }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/ReadIssuerDataFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/ReadIssuerDataFragment.kt
new file mode 100644
index 0000000000..6d3ac9be86
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/ReadIssuerDataFragment.kt
@@ -0,0 +1,10 @@
+package com.tangem.devkit.ucase.variants.issuerdata.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.ReadIssuerDataItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+
+class ReadIssuerDataFragment : BaseCardActionFragment() {
+
+    override val itemsManager: ItemsManager by lazy { ReadIssuerDataItemsManager() }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/ReadIssuerExtraDataFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/ReadIssuerExtraDataFragment.kt
new file mode 100644
index 0000000000..74024ca176
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/ReadIssuerExtraDataFragment.kt
@@ -0,0 +1,10 @@
+package com.tangem.devkit.ucase.variants.issuerdata.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.ReadIssuerExtraDataItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+
+class ReadIssuerExtraDataFragment : BaseCardActionFragment() {
+
+    override val itemsManager: ItemsManager by lazy { ReadIssuerExtraDataItemsManager() }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/WriteIssuerDataFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/WriteIssuerDataFragment.kt
new file mode 100644
index 0000000000..88e956818c
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/WriteIssuerDataFragment.kt
@@ -0,0 +1,10 @@
+package com.tangem.devkit.ucase.variants.issuerdata.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.WriteIssuerDataItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+
+class WriteIssuerDataFragment : BaseCardActionFragment() {
+
+    override val itemsManager: ItemsManager by lazy { WriteIssuerDataItemsManager() }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/WriteIssuerExtraDataFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/WriteIssuerExtraDataFragment.kt
new file mode 100644
index 0000000000..a90fce5e7a
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/issuerdata/ui/WriteIssuerExtraDataFragment.kt
@@ -0,0 +1,10 @@
+package com.tangem.devkit.ucase.variants.issuerdata.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.WriteIssuerExtraDataItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+
+class WriteIssuerExtraDataFragment : BaseCardActionFragment() {
+
+    override val itemsManager: ItemsManager by lazy { WriteIssuerExtraDataItemsManager() }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
index afa1d5f114..aa68fb4215 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
@@ -4,6 +4,7 @@ import com.tangem.KeyPair
 import com.tangem.commands.personalization.entities.Acquirer
 import com.tangem.commands.personalization.entities.Issuer
 import com.tangem.commands.personalization.entities.Manufacturer
+import com.tangem.common.extensions.hexToBytes
 
 /**
 [REDACTED_AUTHOR]
@@ -18,12 +19,14 @@ interface DefaultPersonalizationParams {
                     name = name,
                     id = name + "\u0000",
                     dataKeyPair = KeyPair(
-                            "".toByteArray(),
-                            "11121314151617184771ED81F2BACF57479E4735EB1405083927372D40DA9E92".toByteArray()
+                            ("045f16bd1d2eafe463e62a335a09e6b2bbcbd04452526885cb679fc4d27af1bd22f553c7deefb54fd3d4f" +
+                                    "361d14e6dc3f11b7d4ea183250a60720ebdf9e110cd26").hexToBytes(),
+                            "11121314151617184771ED81F2BACF57479E4735EB1405083927372D40DA9E92".hexToBytes()
                     ),
                     transactionKeyPair = KeyPair(
-                            "".toByteArray(),
-                            "11121314151617184771ED81F2BACF57479E4735EB1405081918171615141312".toByteArray()
+                            ("0484c5192e9bfa6c528a344f442137a92b89ea835bfef1d04cb4362eb906b508c5889846cfea71ba6dc7b" +
+                                    "3120c2208df9c46127d3d85cb5cfbd1479e97133a39d8").hexToBytes(),
+                            "11121314151617184771ED81F2BACF57479E4735EB1405081918171615141312".hexToBytes()
                     )
             )
         }
@@ -34,8 +37,9 @@ interface DefaultPersonalizationParams {
                     name = name,
                     id = name + "\u0000",
                     keyPair = KeyPair(
-                            "".toByteArray(),
-                            "21222324252627284771ED81F2BACF57479E4735EB1405083927372D40DA9E92".toByteArray()
+                            ("0456ad1a82b22bcb40c38fd08939f87e6b80e40dec5b3bdb351c55fcd709e47f9fb2ed00c2304d3a9" +
+                                    "86f79c5ae0ac3c84e88da46dc8f513b7542c716af8c9a2daf").hexToBytes(),
+                            "21222324252627284771ED81F2BACF57479E4735EB1405083927372D40DA9E92".hexToBytes()
                     )
             )
         }
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/purgewallet/ui/PurgeWalletActionFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/purgewallet/ui/PurgeWalletActionFragment.kt
new file mode 100644
index 0000000000..c3b8736e21
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/purgewallet/ui/PurgeWalletActionFragment.kt
@@ -0,0 +1,10 @@
+package com.tangem.devkit.ucase.variants.purgewallet.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.PurgeWalletItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+
+class PurgeWalletActionFragment : BaseCardActionFragment() {
+
+    override val itemsManager: ItemsManager by lazy { PurgeWalletItemsManager() }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/Ids.kt
index 8e00cef963..a383624f76 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/Ids.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/Ids.kt
@@ -53,4 +53,38 @@ enum class SignId : ResponseId {
 
 enum class DepersonalizeId: ResponseId {
     isSuccess
+}
+
+enum class CreateWalletId : ResponseId {
+    cid,
+    cardStatus,
+    walletPublicKey,
+}
+
+enum class PurgeWalletId : ResponseId {
+    cid,
+    cardStatus
+}
+
+enum class ReadIssuerDataId : ResponseId {
+    cid,
+    issuerData,
+    issuerDataSignature,
+    issuerDataCounter
+}
+
+enum class ReadIssuerExtraDataId : ResponseId {
+    cid,
+    size,
+    issuerData,
+    issuerDataSignature,
+    issuerDataCounter
+}
+
+enum class ReadUserDataId : ResponseId {
+    cid,
+    userData,
+    userProtectedData,
+    userCounter,
+    userProtectedCounter
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ResponseViewModel.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ResponseViewModel.kt
index 0da3fbceb4..1d94acaf21 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ResponseViewModel.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/ResponseViewModel.kt
@@ -2,9 +2,7 @@ package com.tangem.devkit.ucase.variants.responses
 
 import android.view.View
 import androidx.lifecycle.ViewModel
-import com.tangem.commands.Card
-import com.tangem.commands.CommandResponse
-import com.tangem.commands.SignResponse
+import com.tangem.commands.*
 import com.tangem.commands.personalization.DepersonalizeResponse
 import com.tangem.devkit.R
 import com.tangem.devkit._arch.structure.abstraction.Item
@@ -44,6 +42,14 @@ class ResponseViewModel : ViewModel() {
             is Card -> R.string.fg_name_response_personalization
             is SignResponse -> R.string.fg_name_response_sign
             is DepersonalizeResponse -> R.string.fg_name_response_depersonalization
+            is CreateWalletResponse -> R.string.fg_name_response_create_wallet
+            is PurgeWalletResponse -> R.string.fg_name_response_purge_wallet
+            is ReadIssuerDataResponse -> R.string.fg_name_response_read_issuer_data
+            is WriteIssuerDataResponse -> R.string.fg_name_response_write_issuer_data
+            is ReadIssuerExtraDataResponse -> R.string.fg_name_response_read_issuer_extra_data
+            is ReadUserDataResponse -> R.string.fg_name_response_read_user_data
+            is WriteUserDataResponse -> R.string.fg_name_response_write_user_data
+
             else -> R.string.unknown
         }
     }
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/ConvertersStore.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/ConvertersStore.kt
index 85b9f38442..8953ba2935 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/ConvertersStore.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/ConvertersStore.kt
@@ -1,7 +1,6 @@
 package com.tangem.devkit.ucase.variants.responses.converter
 
-import com.tangem.commands.Card
-import com.tangem.commands.SignResponse
+import com.tangem.commands.*
 import com.tangem.commands.personalization.DepersonalizeResponse
 import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
 import java.lang.reflect.Type
@@ -12,5 +11,12 @@ class ConvertersStore : BaseTypedHolder() {
         register(SignResponse::class.java, SignResponseConverter())
         register(Card::class.java, CardConverter())
         register(DepersonalizeResponse::class.java, DepersonalizeResponseConverter())
+        register(CreateWalletResponse::class.java, CreateWalletResponseConverter())
+        register(PurgeWalletResponse::class.java, PurgeWalletResponseConverter())
+        register(ReadIssuerDataResponse::class.java, ReadIssuerDataResponseConverter())
+        register(ReadIssuerExtraDataResponse::class.java, ReadIssuerExtraDataResponseConverter())
+        register(WriteIssuerDataResponse::class.java, WriteIssuerDataResponseConverter())
+        register(ReadUserDataResponse::class.java, ReadUserDataResponseConverter())
+        register(WriteUserDataResponse::class.java, WriteUserDataResponseConverter())
     }
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/SimpleConverters.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/SimpleConverters.kt
index 980c10f01d..e68c77e083 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/SimpleConverters.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/responses/converter/SimpleConverters.kt
@@ -1,11 +1,10 @@
 package com.tangem.devkit.ucase.variants.responses.converter
 
-import com.tangem.commands.SignResponse
+import com.tangem.commands.*
 import com.tangem.commands.personalization.DepersonalizeResponse
 import com.tangem.devkit._arch.structure.abstraction.Item
 import com.tangem.devkit._arch.structure.impl.TextItem
-import com.tangem.devkit.ucase.variants.responses.DepersonalizeId
-import com.tangem.devkit.ucase.variants.responses.SignId
+import com.tangem.devkit.ucase.variants.responses.*
 import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
 
 /**
@@ -27,4 +26,74 @@ class DepersonalizeResponseConverter : BaseResponseConverter {
         return listOf(TextItem(DepersonalizeId.isSuccess, stringOf(from.success)))
     }
+}
+
+class CreateWalletResponseConverter : BaseResponseConverter() {
+    override fun convert(from: CreateWalletResponse): List {
+        return listOf(
+                TextItem(CreateWalletId.cid, from.cardId),
+                TextItem(CreateWalletId.cardStatus, valueToString(from.status)),
+                TextItem(CreateWalletId.walletPublicKey, fieldConverter.byteArray(from.walletPublicKey))
+        )
+    }
+}
+
+class PurgeWalletResponseConverter : BaseResponseConverter() {
+    override fun convert(from: PurgeWalletResponse): List {
+        return listOf(
+                TextItem(CreateWalletId.cid, from.cardId),
+                TextItem(CreateWalletId.cardStatus, valueToString(from.status))
+        )
+    }
+}
+
+class ReadIssuerDataResponseConverter : BaseResponseConverter() {
+    override fun convert(from: ReadIssuerDataResponse): List {
+        return listOf(
+                TextItem(ReadIssuerDataId.cid, from.cardId),
+                TextItem(ReadIssuerDataId.issuerData, fieldConverter.byteArray(from.issuerData)),
+                TextItem(ReadIssuerDataId.issuerDataSignature, fieldConverter.byteArray(from.issuerDataSignature)),
+                TextItem(ReadIssuerDataId.issuerDataCounter, valueToString(from.issuerDataCounter))
+        )
+    }
+}
+
+class ReadIssuerExtraDataResponseConverter : BaseResponseConverter() {
+    override fun convert(from: ReadIssuerExtraDataResponse): List {
+        return listOf(
+                TextItem(ReadIssuerExtraDataId.cid, from.cardId),
+                TextItem(ReadIssuerExtraDataId.size, valueToString(from.size)),
+                TextItem(ReadIssuerExtraDataId.issuerData, fieldConverter.byteArray(from.issuerData)),
+                TextItem(ReadIssuerExtraDataId.issuerDataSignature, fieldConverter.byteArray(from.issuerDataSignature)),
+                TextItem(ReadIssuerExtraDataId.issuerDataCounter, valueToString(from.issuerDataCounter))
+        )
+    }
+}
+
+class WriteIssuerDataResponseConverter : BaseResponseConverter() {
+    override fun convert(from: WriteIssuerDataResponse): List {
+        return listOf(
+                TextItem(CardId.cardId, from.cardId)
+        )
+    }
+}
+
+class ReadUserDataResponseConverter : BaseResponseConverter() {
+    override fun convert(from: ReadUserDataResponse): List {
+        return listOf(
+                TextItem(ReadUserDataId.cid, from.cardId),
+                TextItem(ReadUserDataId.userData, fieldConverter.byteArray(from.userData)),
+                TextItem(ReadUserDataId.userProtectedData, fieldConverter.byteArray(from.userProtectedData)),
+                TextItem(ReadUserDataId.userCounter, valueToString(from.userCounter)),
+                TextItem(ReadUserDataId.userProtectedCounter, valueToString(from.userProtectedCounter))
+        )
+    }
+}
+
+class WriteUserDataResponseConverter : BaseResponseConverter() {
+    override fun convert(from: WriteUserDataResponse): List {
+        return listOf(
+                TextItem(CardId.cardId, from.cardId)
+        )
+    }
 }
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/userdata/ui/ReadUserDataFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/userdata/ui/ReadUserDataFragment.kt
new file mode 100644
index 0000000000..670931d810
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/userdata/ui/ReadUserDataFragment.kt
@@ -0,0 +1,10 @@
+package com.tangem.devkit.ucase.variants.userdata.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.ReadUserDataItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+
+class ReadUserDataFragment : BaseCardActionFragment() {
+
+    override val itemsManager: ItemsManager by lazy { ReadUserDataItemsManager() }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/userdata/ui/WriteUserDataFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/userdata/ui/WriteUserDataFragment.kt
new file mode 100644
index 0000000000..ad0a829f38
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/userdata/ui/WriteUserDataFragment.kt
@@ -0,0 +1,10 @@
+package com.tangem.devkit.ucase.variants.userdata.ui
+
+import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
+import com.tangem.devkit.ucase.domain.paramsManager.managers.WriteUserDataItemsManager
+import com.tangem.devkit.ucase.ui.BaseCardActionFragment
+
+class WriteUserDataFragment : BaseCardActionFragment() {
+
+    override val itemsManager: ItemsManager by lazy { WriteUserDataItemsManager() }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/res/navigation/navigation.xml b/tangem-devkit/src/main/res/navigation/navigation.xml
index a6cd6c3ff8..a08466aff6 100644
--- a/tangem-devkit/src/main/res/navigation/navigation.xml
+++ b/tangem-devkit/src/main/res/navigation/navigation.xml
@@ -85,51 +85,51 @@
 
     
+        tools:layout="@layout/fg_base_action_layout" />
 
     
+        tools:layout="@layout/fg_base_action_layout" />
 
     
+        tools:layout="@layout/fg_base_action_layout" />
 
     
+        tools:layout="@layout/fg_base_action_layout" />
 
     
+        tools:layout="@layout/fg_base_action_layout" />
 
     
+        tools:layout="@layout/fg_base_action_layout" />
 
     
+        tools:layout="@layout/fg_base_action_layout" />
 
     
+        tools:layout="@layout/fg_base_action_layout" />
 
     Nothing to load
 
     @string/app_name
-    Read response
-    Sign response
-    Personalization response
-    Depersonalization response
+    Read Response
+    Sign Response
+    Personalization Response
+    Depersonalization Response
+    Create Wallet Response
+    Purge Wallet Response
+    Read Issuer Data Response
+    Write Issuer Data Response
+    Read Issuer Extra Data Response
+    Read User Data Response
+    Write User Data Response
 
 
     Docs
diff --git a/tangem-devkit/src/main/res/values/strings_action.xml b/tangem-devkit/src/main/res/values/strings_action.xml
index ed962e51fb..32a9d00725 100644
--- a/tangem-devkit/src/main/res/values/strings_action.xml
+++ b/tangem-devkit/src/main/res/values/strings_action.xml
@@ -5,27 +5,28 @@
     Sign
     Personalize
     Depersonalize
-    Create wallet
-    Purge wallet
-    Read issuer data
-    Write issuer data
-    Read issuer extra data
-    Write issuer extra data
-    Read user data
-    Write user data
+    Create Wallet
+    Purge Wallet
+    Read Issuer Data
+    Write Issuer Data
+    Read Issuer Extra Data
+    Write Issuer Extra Data
+    Read User Data
+    Write User DataThis command returns all data about the card and the wallet, including unique card number (CID) that has to be submitted while calling all other commands
     Depending on Signing_Method parameter defined during personalization, this command signs data using Wallet_PrivateKey
     Personalization is an initialization procedure, required before start using a card. During this procedure all card setting are performed. During this procedure all data exchange are encrypted because it\'s usually done at the third-party factory.
     This command reset card to initial state - erase all data, writed during previous personalization and previous usage.
         \nCommand available on SDK cards only
-    SomeDescription
-    SomeDescription
-    SomeDescription
-    SomeDescription
-    SomeDescription
-    SomeDescription
-    SomeDescription
-    SomeDescription
+    If the card has an ‘Empty’ state, this command will create a new wallet, changing a state to ‘Loaded’.
+    This command deletes all wallet data. If ‘IsReusable‘ flag was enabled during personalization, the card changes state to ‘Empty’ and a new wallet can be created by Create Wallet Command.
+    This command returns 512-byte Issuer Data field and its issuer’s signature.
+    This command writes 512-byte Issuer Data field and its issuer’s signature to the card.
+    This command retrieves Issuer Extra Data field and its issuer’s signature.
+    This command writes Issuer Extra Data field and its issuer’s signature to the card.
+    This command returns User Data and User Protected Data (up to 512-byte each) and two counters: User Counter and User Protected Counter.
+     This command writes to the card any of User Data, User Protected Data, User Counter and User Protected Counter fields.
+
 
 
\ No newline at end of file
diff --git a/tangem-devkit/src/main/res/values/strings_response.xml b/tangem-devkit/src/main/res/values/strings_response.xml
index 489e0a7bd5..2fcd8010e4 100644
--- a/tangem-devkit/src/main/res/values/strings_response.xml
+++ b/tangem-devkit/src/main/res/values/strings_response.xml
@@ -155,4 +155,27 @@
 
     Is success
 
+
+    
+    Size of Issuer Data
+    Issuer Data
+    Issuer Data Signature
+    Issuer Data Counter
+
+    A size of issuer extra data written on a card.
+    Data defined by the issuer.
+    Issuer data, signed by the issuer with issuer data private key.
+    An optional counter that protects issuer data against replay attack.
+
+    
+    User Data
+    Protected User Data
+    User Data Counter
+    Protected User Data Counter
+
+    Data defined by user\'s App
+    Data defined by user’s App (confirmed by PIN2)
+    Counter initialized by user’s App and increased on every signing of new transaction
+    Counter initialized by user’s App (confirmed by PIN2) and increased on every signing of new transaction
+
 
\ No newline at end of file
diff --git a/tangem-devkit/src/main/res/values/strings_tlv.xml b/tangem-devkit/src/main/res/values/strings_tlv.xml
index fe18360367..034648d928 100644
--- a/tangem-devkit/src/main/res/values/strings_tlv.xml
+++ b/tangem-devkit/src/main/res/values/strings_tlv.xml
@@ -3,8 +3,16 @@
 
     Card Id (CID)
     Hash to sign
+    Issuer Data
+    User Data
+    Protected User Data
+    CounterUnique Tangem card ID number
     Hashed transaction you want to be signed 
+    Issuer Data to be written by this command
+    User Data to be written by this command
+    Protected User Data to be written by this command
+    Counter that protects this type of data against replay attack.
 
 
\ No newline at end of file

From 7fb63a6a715706473e2e3c3ab173afc77a139aee Mon Sep 17 00:00:00 2001
From: Tangem 
Date: Wed, 29 Apr 2020 12:04:40 +0300
Subject: [PATCH 24/48] Updated on 2026-08-14

---
 .../personalization/entities/CardConfig.kt    |  1 +
 .../devkit/extensions/AndroidComponents.kt    | 10 ++++
 .../managers/PersonalizationItemsManager.kt   | 25 ++++++++
 .../personalize/ui/PersonalizationFragment.kt | 57 ++++++++++++++-----
 .../responses/ui/widget/ResponseWidget.kt     | 10 +---
 .../res/layout/fg_personalization_footer.xml  | 46 +++++++++++++++
 .../main/res/layout/view_simple_button.xml    | 20 -------
 7 files changed, 128 insertions(+), 41 deletions(-)
 create mode 100644 tangem-devkit/src/main/res/layout/fg_personalization_footer.xml
 delete mode 100644 tangem-devkit/src/main/res/layout/view_simple_button.xml

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-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt
index 032e162d53..c24ff4494c 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt
@@ -1,5 +1,8 @@
 package com.tangem.devkit.extensions
 
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
 import android.content.Intent
 import androidx.activity.ComponentActivity
 import androidx.fragment.app.Fragment
@@ -7,6 +10,13 @@ import androidx.fragment.app.Fragment
 /**
 [REDACTED_AUTHOR]
  */
+fun Context.copyToClipboard(value: Any, label: String = "") {
+    val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager ?: return
+
+    val clip: ClipData = ClipData.newPlainText(label, value.toString())
+    clipboard.setPrimaryClip(clip)
+}
+
 fun Fragment.shareText(text: String) {
     requireActivity().shareText(text)
 }
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
index a8125f2a51..8de004804e 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
@@ -2,12 +2,16 @@ package com.tangem.devkit.ucase.domain.paramsManager.managers
 
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.OnLifecycleEvent
+import com.google.gson.Gson
 import com.tangem.TangemSdk
 import com.tangem.devkit.commons.Store
 import com.tangem.devkit.ucase.domain.actions.PersonalizeAction
 import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
 import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter
+import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationJsonConverter
 import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationJson
+import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 
 /**
 [REDACTED_AUTHOR]
@@ -27,6 +31,27 @@ class PersonalizationItemsManager(
         action.executeMainAction(this, getAttrsForAction(tangemSdk), callback)
     }
 
+    fun importJsonConfig(jsonString: String) {
+        if (jsonString.isEmpty()) return
+
+        val jsonDto = try {
+            Gson().fromJson(jsonString, PersonalizationJson::class.java)
+        } catch (ex: Exception) {
+            Log.e(this, "Can't convert imported string to Json object. Error: $ex")
+            return
+        }
+
+        val config = PersonalizationJsonConverter().aToB(jsonDto)
+        setItems(converter.convert(config))
+    }
+
+    fun exportJsonConfig(): String {
+        val config = converter.convert(itemList, PersonalizationConfig.default())
+        val jsonDto = PersonalizationJsonConverter().bToA(config)
+        val jsonString = Gson().toJson(jsonDto)
+        return jsonString
+    }
+
     @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
     fun onDestroy() {
         val config = converter.convert(itemList, PersonalizationConfig.default())
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt
index 9fbc9d8b01..45033f5484 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt
@@ -24,6 +24,7 @@ import com.tangem.devkit._arch.widget.WidgetBuilder
 import com.tangem.devkit.commons.DialogController
 import com.tangem.devkit.commons.view.MultiActionView
 import com.tangem.devkit.commons.view.ViewAction
+import com.tangem.devkit.extensions.copyToClipboard
 import com.tangem.devkit.extensions.view.beginDelayedTransition
 import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
 import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
@@ -38,6 +39,7 @@ import com.tangem.devkit.ucase.variants.personalize.ui.presets.PersonalizationPr
 import com.tangem.devkit.ucase.variants.personalize.ui.presets.RvPresetNamesAdapter
 import com.tangem.devkit.ucase.variants.personalize.ui.widgets.PersonalizationItemBuilder
 import com.tangem.devkit.ucase.variants.responses.ui.ResponseFragment
+import ru.dev.gbixahue.eu4d.lib.android._android.views.afterTextChanged
 import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
 import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
 import ru.dev.gbixahue.eu4d.lib.android.global.threading.post
@@ -50,7 +52,12 @@ import ru.dev.gbixahue.eu4d.lib.android.global.threading.postWork
  */
 class PersonalizationFragment : BaseCardActionFragment(), PersonalizationPresetView {
 
-    override val itemsManager: ItemsManager by lazy { PersonalizationItemsManager(PersonalizationConfigStore(requireContext())) }
+    private lateinit var personalizationItemsManager: PersonalizationItemsManager
+
+    override val itemsManager: ItemsManager by lazy {
+        personalizationItemsManager = PersonalizationItemsManager(PersonalizationConfigStore(requireContext()))
+        personalizationItemsManager
+    }
 
     override fun getLayoutId(): Int = R.layout.fg_base_action_layout
 
@@ -106,20 +113,44 @@ class PersonalizationFragment : BaseCardActionFragment(), PersonalizationPresetV
     override fun widgetsWasCreated() {
         super.widgetsWasCreated()
 
-        val btnContainer = contentContainer.inflate(R.layout.view_simple_button)
-        val btn = btnContainer.findViewById