Updated on 2026-08-14

This commit is contained in:
Tangem 2026-04-11 09:38:37 +03:00
parent 547d562d6d
commit d0ef5c70cd
12 changed files with 175 additions and 60 deletions

View file

@ -18,11 +18,11 @@ data class TokenReceiveConfig(
@Serializable
data class ReceiveAddressModel(
val nameService: NameService,
val displayType: DisplayType,
val value: String,
) {
enum class NameService {
Default, Legacy, Ens
enum class DisplayType {
Default, Legacy, Ens, Dynamic,
}
}

View file

@ -27,6 +27,8 @@ dependencies {
implementation(projects.libs.crypto)
implementation(projects.domain.account.status)
implementation(projects.domain.dynamicAddresses)
implementation(projects.domain.dynamicAddresses.models)
implementation(projects.domain.models)
implementation(projects.domain.legacy)
implementation(projects.domain.walletManager)

View file

@ -1,5 +1,9 @@
package com.tangem.domain.transaction.usecase
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
import com.tangem.domain.models.Asset
import com.tangem.domain.models.ReceiveAddressModel
import com.tangem.domain.models.TokenReceiveConfig
@ -12,10 +16,15 @@ import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.tokens.GetViewedTokenReceiveWarningUseCase
import com.tangem.domain.transaction.R
import com.tangem.lib.crypto.BlockchainUtils
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.firstOrNull
class ReceiveAddressesFactory(
private val getEnsNameUseCase: GetEnsNameUseCase,
private val getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase,
private val getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase,
private val dynamicAddressesRepository: DynamicAddressesRepository,
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
) {
suspend fun create(
@ -32,27 +41,14 @@ class ReceiveAddressesFactory(
address = addresses.defaultAddress.value,
)
val receiveAddresses = buildList {
ensName?.let { ens ->
add(
ReceiveAddressModel(
nameService = ReceiveAddressModel.NameService.Ens,
value = ens,
),
)
}
addresses.availableAddresses.map { address ->
add(
ReceiveAddressModel(
nameService = when (address.type) {
NetworkAddress.Address.Type.Primary -> ReceiveAddressModel.NameService.Default
NetworkAddress.Address.Type.Secondary -> ReceiveAddressModel.NameService.Legacy
},
value = address.value,
),
)
}
val dynamicAddress = getDynamicAddressIfEnabled(userWalletId, cryptoCurrency)
val receiveAddresses = if (dynamicAddress != null) {
buildDynamicAddressList(ensName, dynamicAddress)
} else {
buildStandardAddressList(ensName, addresses)
}
return TokenReceiveConfig(
shouldShowWarning = cryptoCurrency.name !in getViewedTokenReceiveWarningUseCase(),
cryptoCurrency = cryptoCurrency,
@ -64,6 +60,52 @@ class ReceiveAddressesFactory(
)
}
private suspend fun getDynamicAddressIfEnabled(
userWalletId: UserWalletId,
cryptoCurrency: CryptoCurrency,
): String? {
if (!dynamicAddressesFeatureToggles.isDynamicAddressesEnabled) return null
if (cryptoCurrency !is CryptoCurrency.Coin) return null
val status = dynamicAddressesRepository.getStatus(userWalletId, cryptoCurrency.network).firstOrNull()
if (status != DynamicAddressesStatus.ENABLED) return null
return getDynamicReceiveAddressUseCase(userWalletId, cryptoCurrency.network)
.onLeft { TangemLogger.e("Failed to get dynamic receive address: ${it.message}") }
.getOrNull()
}
private fun buildDynamicAddressList(ensName: String?, dynamicAddress: String): List<ReceiveAddressModel> =
buildList {
ensName?.let { ens ->
add(ReceiveAddressModel(displayType = ReceiveAddressModel.DisplayType.Ens, value = ens))
}
add(
ReceiveAddressModel(
displayType = ReceiveAddressModel.DisplayType.Dynamic,
value = dynamicAddress,
),
)
}
private fun buildStandardAddressList(ensName: String?, addresses: NetworkAddress): List<ReceiveAddressModel> =
buildList {
ensName?.let { ens ->
add(ReceiveAddressModel(displayType = ReceiveAddressModel.DisplayType.Ens, value = ens))
}
addresses.availableAddresses.map { address ->
add(
ReceiveAddressModel(
displayType = when (address.type) {
NetworkAddress.Address.Type.Primary -> ReceiveAddressModel.DisplayType.Default
NetworkAddress.Address.Type.Secondary -> ReceiveAddressModel.DisplayType.Legacy
},
value = address.value,
),
)
}
}
suspend fun createForNft(
userWalletId: UserWalletId,
addresses: NetworkAddress,
@ -82,7 +124,7 @@ class ReceiveAddressesFactory(
ensName?.let { ens ->
add(
ReceiveAddressModel(
nameService = ReceiveAddressModel.NameService.Ens,
displayType = ReceiveAddressModel.DisplayType.Ens,
value = ens,
),
)
@ -90,9 +132,9 @@ class ReceiveAddressesFactory(
addresses.availableAddresses.map { address ->
add(
ReceiveAddressModel(
nameService = when (address.type) {
NetworkAddress.Address.Type.Primary -> ReceiveAddressModel.NameService.Default
NetworkAddress.Address.Type.Secondary -> ReceiveAddressModel.NameService.Legacy
displayType = when (address.type) {
NetworkAddress.Address.Type.Primary -> ReceiveAddressModel.DisplayType.Default
NetworkAddress.Address.Type.Secondary -> ReceiveAddressModel.DisplayType.Legacy
},
value = address.value,
),