diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index fad890b2a0..8c1c53b739 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit fad890b2a0b552be60d124949ca0a3a4d672dac1 +Subproject commit 8c1c53b73950698d4acfa4d925b8c14bf6f0da63 diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index 0c0c30de42..51e0adb686 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -94,18 +94,20 @@ class TangemSdkManager(private val cardSdkConfigRepository: CardSdkConfigReposit scanResponse: ScanResponse, mnemonic: String, ): CompletionResult { - return when (val seedResult = DefaultMnemonic(mnemonic, tangemSdk.wordlist).generateSeed()) { - is CompletionResult.Success -> runTaskAsync( - CreateProductWalletTask( - cardTypesResolver = scanResponse.cardTypesResolver, - derivationStyleProvider = scanResponse.derivationStyleProvider, - ), - scanResponse.card.cardId, - Message(resources.getString(R.string.initial_message_create_wallet_body)), - ) - - is CompletionResult.Failure -> CompletionResult.Failure(seedResult.error) + val mnemonic = try { + DefaultMnemonic(mnemonic, tangemSdk.wordlist) + } catch (e: TangemSdkError.MnemonicException) { + return CompletionResult.Failure(e) } + return runTaskAsync( + CreateProductWalletTask( + scanResponse.cardTypesResolver, + derivationStyleProvider = scanResponse.derivationStyleProvider, + mnemonic, + ), + scanResponse.card.cardId, + Message(resources.getString(R.string.initial_message_create_wallet_body)), + ) } private fun sendScanResultsToAnalytics(result: CompletionResult) { diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt index ede3d71091..9b638d235f 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt @@ -11,11 +11,13 @@ import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.map +import com.tangem.crypto.bip39.Mnemonic import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.common.DerivationStyleProvider import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.common.extensions.derivationPath +import com.tangem.domain.common.configs.CardConfig import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.KeyWalletPublicKey import com.tangem.operations.CommandResponse @@ -58,7 +60,7 @@ private data class CreateWalletResponse( class CreateProductWalletTask( private val cardTypesResolver: CardTypesResolver, private val derivationStyleProvider: DerivationStyleProvider, - private val seed: ByteArray? = null, + private val mnemonic: Mnemonic? = null, ) : CardSessionRunnable { override val allowsRequestAccessCodeFromRepository: Boolean = false @@ -78,7 +80,7 @@ class CreateProductWalletTask( cardTypesResolver.isTangemTwins() -> throw UnsupportedOperationException("Use the TwinCardsManager to create a wallet") - else -> CreateWalletTangemWallet(seed, derivationStyleProvider) + else -> CreateWalletTangemWallet(mnemonic, derivationStyleProvider) } commandProcessor.proceed(cardDto, session) { when (it) { @@ -133,8 +135,11 @@ private class CreateWalletTangemNote(private val cardTypesResolver: CardTypesRes } } +/** + * Uses for multiWallet 1st and 2nd + */ private class CreateWalletTangemWallet( - private val seed: ByteArray?, + private val mnemonic: Mnemonic?, private val derivationStyleProvider: DerivationStyleProvider, ) : ProductCommandProcessor { @@ -145,8 +150,9 @@ private class CreateWalletTangemWallet( session: CardSession, callback: (result: CompletionResult) -> Unit, ) { + val config = CardConfig.createConfig(card) val walletsOnCard = card.wallets.map { it.curve }.toSet() - val curves = card.supportedCurves.intersect(CURVES_FOR_WALLETS).subtract(walletsOnCard).toList() + val curves = card.supportedCurves.intersect(config.mandatoryCurves.toSet()).subtract(walletsOnCard).toList() if (curves.isEmpty()) { val createWalletResponses = card.wallets.map { wallet -> @@ -155,8 +161,7 @@ private class CreateWalletTangemWallet( proceedWithCreatedWallets(card, createWalletResponses, session, callback) return } - - CreateWalletsTask(curves, seed).run(session) { result -> + CreateWalletsTask(curves, mnemonic).run(session) { result -> when (result) { is CompletionResult.Success -> { proceedWithCreatedWallets( diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateWalletsTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateWalletsTask.kt index 23f0986e34..2c75d8da36 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateWalletsTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateWalletsTask.kt @@ -5,6 +5,8 @@ import com.tangem.common.card.EllipticCurve import com.tangem.common.core.CardSession import com.tangem.common.core.CardSessionRunnable import com.tangem.common.core.TangemSdkError +import com.tangem.crypto.bip39.Mnemonic +import com.tangem.crypto.hdWallet.masterkey.AnyMasterKeyFactory import com.tangem.operations.CommandResponse import com.tangem.operations.wallet.CreateWalletResponse import com.tangem.operations.wallet.CreateWalletTask @@ -18,7 +20,7 @@ class CreateWalletsResponse( class CreateWalletsTask( private val curves: List, - private val seed: ByteArray? = null, + private val mnemonic: Mnemonic? = null, ) : CardSessionRunnable { private val createdWalletsResponses = mutableListOf() @@ -38,7 +40,10 @@ class CreateWalletsTask( session: CardSession, callback: (result: CompletionResult) -> Unit, ) { - CreateWalletTask(curve, seed).run(session) { result -> + val extendedPrivateKey = mnemonic?.let { + AnyMasterKeyFactory(mnemonic = it, passphrase = "").makeMasterKey(curve) + } + CreateWalletTask(curve, extendedPrivateKey).run(session) { result -> when (result) { is CompletionResult.Success -> { createdWalletsResponses.add(result.data) diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index 6a184f7f8e..d04cb9a62e 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -21,7 +21,7 @@ import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation import com.tangem.domain.common.TwinsHelper -import com.tangem.domain.common.extensions.getPrimaryCurve +import com.tangem.domain.common.configs.CardConfig import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ProductType @@ -209,6 +209,7 @@ private class ScanWalletProcessor( callback: (result: CompletionResult) -> Unit, ) { val productType = ProductType.Wallet + val config = CardConfig.createConfig(card) scope.launch { val scanResponse = ScanResponse( card = card, @@ -216,7 +217,7 @@ private class ScanWalletProcessor( walletData = session.environment.walletData, primaryCard = primaryCard, ) - val derivations = collectDerivations(card, scanResponse.derivationStyleProvider) + val derivations = collectDerivations(card, config, scanResponse.derivationStyleProvider) if (derivations.isEmpty() || !card.settings.isHDWalletAllowed) { callback(CompletionResult.Success(scanResponse)) return@launch @@ -299,13 +300,14 @@ private class ScanWalletProcessor( private suspend fun collectDerivations( card: CardDTO, + config: CardConfig, derivationStyleProvider: DerivationStyleProvider, ): Map> { val blockchains = getBlockchainsToDerive(card, derivationStyleProvider) val derivations = mutableMapOf>() blockchains.forEach { blockchain -> - val curve = blockchain.blockchain.getPrimaryCurve() + val curve = config.primaryCurve(blockchain.blockchain) val wallet = card.wallets.firstOrNull { it.curve == curve } ?: return@forEach if (wallet.chainCode == null) return@forEach diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt deleted file mode 100644 index 22baf587ab..0000000000 --- a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.tangem.tap.domain.tokens - -import com.tangem.blockchain.common.Blockchain -import com.tangem.common.card.FirmwareVersion -import com.tangem.domain.models.scan.CardDTO - -object CurrenciesRepository { - fun getBlockchains(cardFirmware: CardDTO.FirmwareVersion, isTestNet: Boolean = false): List { - val blockchains = if (cardFirmware < FirmwareVersion.MultiWalletAvailable) { - Blockchain.secp256k1Blockchains(isTestNet) - } else { - Blockchain.secp256k1Blockchains(isTestNet) + Blockchain.ed25519OnlyBlockchains(isTestNet) - } - return excludeUnsupportedBlockchains(blockchains) - } - - // Use this list to temporarily exclude a blockchain from the list of tokens. - private fun excludeUnsupportedBlockchains(blockchains: List): List { - return blockchains.toMutableList().apply { - removeAll( - listOf( -// Any blockchain - ), - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt index 40cf0892b5..c5d75bbc2e 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt @@ -7,6 +7,7 @@ import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.flatMap import com.tangem.crypto.hdWallet.DerivationPath +import com.tangem.domain.common.configs.CardConfig import com.tangem.domain.common.extensions.derivationPath import com.tangem.domain.common.extensions.toNetworkId import com.tangem.domain.common.util.derivationStyleProvider @@ -69,10 +70,11 @@ class DefaultCustomTokenInteractor( currencyList: List, onSuccess: suspend (ScanResponse) -> Unit, ) { - val derivationDataList = listOfNotNull( - getDerivations(EllipticCurve.Secp256k1, scanResponse, currencyList), - getDerivations(EllipticCurve.Ed25519, scanResponse, currencyList), - ) + val config = CardConfig.createConfig(scanResponse.card) + val derivationDataList = currencyList.mapNotNull { + val curve = config.primaryCurve(it.blockchain) + curve?.let { getDerivations(curve, scanResponse, currencyList) } + } val derivations = derivationDataList.associate(TokensMiddleware.DerivationData::derivations) if (derivations.isEmpty()) { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt index 940470bc09..f56ef520ca 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt @@ -9,6 +9,7 @@ import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.flatMap import com.tangem.crypto.hdWallet.DerivationPath +import com.tangem.domain.common.configs.CardConfig import com.tangem.domain.common.extensions.derivationPath import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.common.util.supportsHdWallet @@ -134,10 +135,11 @@ internal class DefaultTokensListInteractor( } private suspend fun deriveMissingBlockchains(scanResponse: ScanResponse, currencies: List) { - val derivations = listOfNotNull( - getDerivations(EllipticCurve.Secp256k1, scanResponse, currencies), - getDerivations(EllipticCurve.Ed25519, scanResponse, currencies), - ).associate(transform = TokensMiddleware.DerivationData::derivations) + val config = CardConfig.createConfig(scanResponse.card) + val derivations = currencies.mapNotNull { + val curve = config.primaryCurve(it.blockchain) + curve?.let { getDerivations(curve, scanResponse, currencies) } + }.associate(transform = TokensMiddleware.DerivationData::derivations) if (derivations.isEmpty()) { submitAdd(scanResponse, currencies) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt index dca9ea4875..9aff63b982 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt @@ -13,6 +13,7 @@ import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.domain.DomainWrapped +import com.tangem.domain.common.configs.CardConfig import com.tangem.domain.common.extensions.derivationPath import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.common.util.hasDerivation @@ -119,10 +120,11 @@ object TokensMiddleware { currencyList: List, onSuccess: (ScanResponse) -> Unit, ) { - val derivationDataList = listOfNotNull( - getDerivations(EllipticCurve.Secp256k1, scanResponse, currencyList), - getDerivations(EllipticCurve.Ed25519, scanResponse, currencyList), - ) + val config = CardConfig.createConfig(scanResponse.card) + val derivationDataList = currencyList.mapNotNull { + val curve = config.primaryCurve(it.blockchain) + curve?.let { getDerivations(curve, scanResponse, currencyList) } + } val derivations = derivationDataList.associate { it.derivations } if (derivations.isEmpty()) { onSuccess(scanResponse) diff --git a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt index 87b1dc7948..0966150ad0 100644 --- a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -10,6 +10,7 @@ import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.extensions.toMapKey import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.domain.common.BlockchainNetwork +import com.tangem.domain.common.configs.CardConfig import com.tangem.domain.common.extensions.derivationPath import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.util.derivationStyleProvider @@ -94,10 +95,11 @@ class DerivationManagerImpl( onSuccess: (ScanResponse) -> Unit, onFailure: (Exception) -> Unit, ) { - val derivationDataList = listOfNotNull( - getDerivations(EllipticCurve.Secp256k1, scanResponse, currencyList), - getDerivations(EllipticCurve.Ed25519, scanResponse, currencyList), - ) + val config = CardConfig.createConfig(scanResponse.card) + val derivationDataList = currencyList.mapNotNull { + val curve = config.primaryCurve(it.blockchain) + curve?.let { getDerivations(curve, scanResponse, currencyList) } + } val derivations = derivationDataList.associate { it.derivations } if (derivations.isEmpty()) { onSuccess(scanResponse) diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/configs/CardConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/configs/CardConfig.kt new file mode 100644 index 0000000000..1fd9e07d70 --- /dev/null +++ b/domain/legacy/src/main/java/com/tangem/domain/common/configs/CardConfig.kt @@ -0,0 +1,28 @@ +package com.tangem.domain.common.configs + +import com.tangem.blockchain.common.Blockchain +import com.tangem.common.card.EllipticCurve +import com.tangem.common.card.FirmwareVersion +import com.tangem.domain.models.scan.CardDTO + +sealed interface CardConfig { + + val mandatoryCurves: List + + fun primaryCurve(blockchain: Blockchain): EllipticCurve? + + companion object { + + fun createConfig(cardDTO: CardDTO): CardConfig { + if (cardDTO.firmwareVersion >= FirmwareVersion.Ed25519Slip0010Available) { + return Wallet2CardConfig + } + if (cardDTO.settings.isBackupAllowed && cardDTO.settings.isHDWalletAllowed && + cardDTO.firmwareVersion >= FirmwareVersion.MultiWalletAvailable + ) { + return TangemWalletCardConfig + } + error("This card is not supported by this configs") + } + } +} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/configs/TangemWalletCardConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/configs/TangemWalletCardConfig.kt new file mode 100644 index 0000000000..69c8c36b78 --- /dev/null +++ b/domain/legacy/src/main/java/com/tangem/domain/common/configs/TangemWalletCardConfig.kt @@ -0,0 +1,33 @@ +package com.tangem.domain.common.configs + +import com.tangem.blockchain.common.Blockchain +import com.tangem.common.card.EllipticCurve +import timber.log.Timber + +object TangemWalletCardConfig : CardConfig { + override val mandatoryCurves: List + get() = listOf( + EllipticCurve.Secp256k1, + EllipticCurve.Ed25519, + EllipticCurve.Bip0340, + EllipticCurve.Bls12381G2Aug, + ) + + /** + * Old logic to determine primary curve for blockchain in TangemWallet + */ + override fun primaryCurve(blockchain: Blockchain): EllipticCurve? { + return when { + blockchain.getSupportedCurves().contains(EllipticCurve.Secp256k1) -> { + EllipticCurve.Secp256k1 + } + blockchain.getSupportedCurves().contains(EllipticCurve.Ed25519) -> { + EllipticCurve.Ed25519 + } + else -> { + Timber.e("Unsupported blockchain, curve not found") + null + } + } + } +} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/configs/Wallet2CardConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/configs/Wallet2CardConfig.kt new file mode 100644 index 0000000000..58ecaef77c --- /dev/null +++ b/domain/legacy/src/main/java/com/tangem/domain/common/configs/Wallet2CardConfig.kt @@ -0,0 +1,37 @@ +package com.tangem.domain.common.configs + +import com.tangem.blockchain.common.Blockchain +import com.tangem.common.card.EllipticCurve +import timber.log.Timber + +object Wallet2CardConfig : CardConfig { + override val mandatoryCurves: List + get() = listOf( + EllipticCurve.Secp256k1, + EllipticCurve.Ed25519, + EllipticCurve.Bip0340, + EllipticCurve.Bls12381G2Aug, + EllipticCurve.Ed25519Slip0010, + ) + + /** + * Logic to determine primary curve for blockchain in TangemWallet 2.0 + */ + override fun primaryCurve(blockchain: Blockchain): EllipticCurve? { + return when { + blockchain.getSupportedCurves().contains(EllipticCurve.Secp256k1) -> { + EllipticCurve.Secp256k1 + } + blockchain.getSupportedCurves().contains(EllipticCurve.Ed25519Slip0010) -> { + EllipticCurve.Ed25519Slip0010 + } + blockchain.getSupportedCurves().contains(EllipticCurve.Bls12381G2Aug) -> { + EllipticCurve.Bls12381G2Aug + } + else -> { + Timber.e("Unsupported blockchain, curve not found") + null + } + } + } +} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index 70c16ba9d7..2665166cf8 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -71,6 +71,8 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { "aleph-zero/test" -> Blockchain.AlephZeroTestnet "octaspace" -> Blockchain.OctaSpace "octaspace/test" -> Blockchain.OctaSpaceTestnet + "chia" -> Blockchain.Chia + "chia/test" -> Blockchain.ChiaTestnet else -> null } } @@ -141,6 +143,8 @@ fun Blockchain.toNetworkId(): String { Blockchain.AlephZeroTestnet -> "aleph-zero/test" Blockchain.OctaSpace -> "octaspace" Blockchain.OctaSpaceTestnet -> "octaspace/test" + Blockchain.Chia -> "chia" + Blockchain.ChiaTestnet -> "chia/test" } } @@ -185,6 +189,8 @@ fun Blockchain.toCoinId(): String { Blockchain.Telos, Blockchain.TelosTestnet -> "telos" Blockchain.AlephZero, Blockchain.AlephZeroTestnet -> "aleph-zero" Blockchain.OctaSpace, Blockchain.OctaSpaceTestnet -> "octaspace" + Blockchain.Chia -> "chia" + Blockchain.ChiaTestnet -> "chia/test" } } @@ -204,20 +210,6 @@ fun Blockchain.minimalAmount(): BigDecimal { return 1.toBigDecimal().movePointLeft(decimals()) } -fun Blockchain.getPrimaryCurve(): EllipticCurve? { - return when { - getSupportedCurves().contains(EllipticCurve.Secp256k1) -> { - EllipticCurve.Secp256k1 - } - getSupportedCurves().contains(EllipticCurve.Ed25519) -> { - EllipticCurve.Ed25519 - } - else -> { - null - } - } -} - fun Blockchain.derivationPath(style: DerivationStyle?): DerivationPath? { if (style == null) return null if (!getSupportedCurves().contains(EllipticCurve.Secp256k1) && diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/WalletManagerFactory.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/WalletManagerFactory.kt index 86ce14a4f4..f050be813a 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/WalletManagerFactory.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/WalletManagerFactory.kt @@ -6,6 +6,8 @@ import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toMapKey import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation +import com.tangem.domain.common.configs.CardConfig +import com.tangem.domain.common.configs.Wallet2CardConfig import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse @@ -16,11 +18,16 @@ fun WalletManagerFactory.makeWalletManagerForApp( derivationParams: DerivationParams?, ): WalletManager? { val card = scanResponse.card + val cardConfig = CardConfig.createConfig(card) if (card.isTestCard && blockchain.getTestnetVersion() == null) return null val supportedCurves = blockchain.getSupportedCurves() val wallets = card.wallets.filter { wallet -> supportedCurves.contains(wallet.curve) } - val wallet = selectWallet(wallets) ?: return null + val wallet = selectWallet( + wallets = wallets, + cardConfig = cardConfig, + blockchain = blockchain, + ) ?: return null val environmentBlockchain = if (card.isTestCard) blockchain.getTestnetVersion()!! else blockchain @@ -85,10 +92,19 @@ fun WalletManagerFactory.makePrimaryWalletManager(scanResponse: ScanResponse): W ) } -private fun selectWallet(wallets: List): CardDTO.Wallet? { - return when (wallets.size) { - 0 -> null - 1 -> wallets[0] - else -> wallets.firstOrNull { it.curve == EllipticCurve.Secp256k1 } ?: wallets[0] +private fun selectWallet( + wallets: List, + cardConfig: CardConfig, + blockchain: Blockchain, +): CardDTO.Wallet? { + return if (cardConfig is Wallet2CardConfig) { + val primaryCurve = cardConfig.primaryCurve(blockchain) + wallets.firstOrNull { it.curve == primaryCurve } + } else { + when (wallets.size) { + 0 -> null + 1 -> wallets[0] + else -> wallets.firstOrNull { it.curve == EllipticCurve.Secp256k1 } ?: wallets[0] + } } } \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt b/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt index 65d1cd6ea0..e66ba82f40 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt @@ -10,6 +10,8 @@ import com.tangem.domain.common.TangemCardTypesResolver import com.tangem.domain.common.TangemDerivationStyleProvider import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.TapWorkarounds.isTestCard +import com.tangem.domain.common.configs.CardConfig +import com.tangem.domain.common.configs.Wallet2CardConfig import com.tangem.domain.models.scan.ScanResponse val ScanResponse.cardTypesResolver: CardTypesResolver @@ -35,14 +37,22 @@ fun ScanResponse.hasDerivation(blockchain: Blockchain, rawDerivationPath: String private fun ScanResponse.hasDerivation(blockchain: Blockchain, derivationPath: DerivationPath): Boolean { val isTestnet = card.isTestCard || blockchain.isTestnet() - return when { - Blockchain.secp256k1Blockchains(isTestnet).contains(blockchain) -> { - hasDerivation(EllipticCurve.Secp256k1, derivationPath) + val config = CardConfig.createConfig(card) + return if (config is Wallet2CardConfig) { + // new logic for wallet2 + val primaryCurve = config.primaryCurve(blockchain) + primaryCurve?.let { hasDerivation(it, derivationPath) } ?: false + } else { + // leave logic for legacy wallets + when { + Blockchain.secp256k1Blockchains(isTestnet).contains(blockchain) -> { + hasDerivation(EllipticCurve.Secp256k1, derivationPath) + } + Blockchain.ed25519OnlyBlockchains(isTestnet).contains(blockchain) -> { + hasDerivation(EllipticCurve.Ed25519, derivationPath) + } + else -> false } - Blockchain.ed25519OnlyBlockchains(isTestnet).contains(blockchain) -> { - hasDerivation(EllipticCurve.Ed25519, derivationPath) - } - else -> false } } diff --git a/domain/legacy/src/test/java/com/tangem/domain/features/BlockchainTests.kt b/domain/legacy/src/test/java/com/tangem/domain/features/BlockchainTests.kt index 292d9e5e06..ff7740c1ba 100644 --- a/domain/legacy/src/test/java/com/tangem/domain/features/BlockchainTests.kt +++ b/domain/legacy/src/test/java/com/tangem/domain/features/BlockchainTests.kt @@ -13,7 +13,6 @@ class BlockchainTests { .toMutableList() .apply { remove(Blockchain.Unknown) - remove(Blockchain.Optimism) } .map { it to Blockchain.fromNetworkId(it.toNetworkId()) } .mapNotNull { if (it.second == null) it.first else null } diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/domain/DefaultSeedPhraseInteractor.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/domain/DefaultSeedPhraseInteractor.kt index a8748d1664..92ed7ae69c 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/domain/DefaultSeedPhraseInteractor.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/domain/DefaultSeedPhraseInteractor.kt @@ -112,4 +112,5 @@ private fun MnemonicErrorResult.mapToError(): SeedPhraseError = when (this) { MnemonicErrorResult.NormalizationFailed -> SeedPhraseError.NormalizationFailed MnemonicErrorResult.UnsupportedLanguage -> SeedPhraseError.UnsupportedLanguage is MnemonicErrorResult.InvalidWords -> SeedPhraseError.InvalidWords(this.words) + MnemonicErrorResult.InvalidMnemonic -> SeedPhraseError.InvalidMnemonic } \ No newline at end of file diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/domain/OnboardingModuleError.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/domain/OnboardingModuleError.kt index 60a22f0fec..e36bc935bd 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/domain/OnboardingModuleError.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/domain/OnboardingModuleError.kt @@ -37,4 +37,5 @@ sealed class SeedPhraseError( object NormalizationFailed : SeedPhraseError(subCode = 5) object UnsupportedLanguage : SeedPhraseError(subCode = 6) data class InvalidWords(val words: Set) : SeedPhraseError(subCode = 7) + object InvalidMnemonic : SeedPhraseError(subCode = 8) } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 6f02666fb4..4131a81f9d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs = -Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs = -Xmx4096m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 5ad57c37ed..8a2db82671 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -80,9 +80,9 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-306" +tangemBlockchainSdk = "develop-312" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "develop-283" +tangemCardSdk = "develop-288" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem diff --git a/plugins/configuration/build.gradle.kts b/plugins/configuration/build.gradle.kts index c2ab7a0a54..a8bc7da8a0 100644 --- a/plugins/configuration/build.gradle.kts +++ b/plugins/configuration/build.gradle.kts @@ -9,8 +9,8 @@ repositories { } configure { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } dependencies { diff --git a/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/DetektConfigurations.kt b/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/DetektConfigurations.kt index 7f3919e6d8..44c658db99 100644 --- a/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/DetektConfigurations.kt +++ b/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/DetektConfigurations.kt @@ -47,6 +47,6 @@ private fun Project.configureDetektTask() { } } - jvmTarget = "11" + jvmTarget = "17" } } \ No newline at end of file diff --git a/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/KotlinConfigurations.kt b/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/KotlinConfigurations.kt index 9d10cad98d..d0e39d6777 100644 --- a/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/KotlinConfigurations.kt +++ b/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/KotlinConfigurations.kt @@ -7,7 +7,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile internal fun Project.configureKotlinCompilerOptions() { project.tasks.withType { kotlinOptions { - jvmTarget = "11" + jvmTarget = "17" allWarningsAsErrors = false // this is required to produce a unique META-INF/*.kotlin_module files moduleName = project.path.removePrefix(":").replace(':', '-') diff --git a/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/extension/BaseExtensionConfigurations.kt b/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/extension/BaseExtensionConfigurations.kt index c05a661a44..e148f4849c 100644 --- a/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/extension/BaseExtensionConfigurations.kt +++ b/plugins/configuration/src/main/kotlin/com/tangem/plugin/configuration/configurations/extension/BaseExtensionConfigurations.kt @@ -12,8 +12,8 @@ internal fun BaseExtension.configureCompileSdk() { internal fun BaseExtension.configureCompilerOptions() { compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } }