Updated on 2026-08-14

This commit is contained in:
Tangem 2026-04-06 21:14:08 +03:00
parent 182aa24095
commit 94a9b132a2
23 changed files with 458 additions and 60 deletions

View file

@ -1,9 +0,0 @@
package com.tangem.domain.dynamicaddresses.model
import java.math.BigDecimal
data class ConsolidationInfo(
val fee: BigDecimal,
val inputCount: Int,
val canCoverFee: Boolean,
)

View file

@ -1,16 +1,16 @@
package com.tangem.domain.dynamicaddresses
import arrow.core.Either
import com.tangem.domain.dynamicaddresses.model.ConsolidationInfo
import com.tangem.blockchain.common.TransactionData
import com.tangem.domain.dynamicaddresses.repository.ConsolidationRepository
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId
class GetConsolidationInfoUseCase(
class CreateConsolidationTransactionUseCase(
private val consolidationRepository: ConsolidationRepository,
) {
suspend operator fun invoke(userWalletId: UserWalletId, network: Network): Either<Throwable, ConsolidationInfo> {
return consolidationRepository.getConsolidationInfo(userWalletId, network)
suspend operator fun invoke(userWalletId: UserWalletId, network: Network): Either<Throwable, TransactionData> {
return consolidationRepository.createConsolidationTransaction(userWalletId, network)
}
}

View file

@ -1,33 +1,27 @@
package com.tangem.domain.dynamicaddresses
import arrow.core.Either
import arrow.core.getOrElse
import arrow.core.raise.either
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.dynamicaddresses.model.ConsolidationInfo
import com.tangem.domain.dynamicaddresses.repository.ConsolidationRepository
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
class DisableDynamicAddressesUseCase(
private val dynamicAddressesRepository: DynamicAddressesRepository,
private val consolidationRepository: ConsolidationRepository,
) {
/**
* Returns [ConsolidationInfo] when consolidation is required before disabling,
* or null when DA can be disabled immediately (no non-base balances).
* Returns true when consolidation is required before disabling (non-base balances exist),
* or false when DA was disabled immediately.
*/
suspend operator fun invoke(userWalletId: UserWalletId, network: Network): Either<Throwable, ConsolidationInfo?> =
either {
suspend operator fun invoke(userWalletId: UserWalletId, network: Network): Either<Throwable, Boolean> =
Either.catch {
val hasNonBaseBalances = dynamicAddressesRepository.hasNonBaseBalances(userWalletId, network)
if (!hasNonBaseBalances) {
dynamicAddressesRepository.disable(userWalletId, network)
return@either null
return@catch false
}
consolidationRepository.getConsolidationInfo(userWalletId, network)
.getOrElse { raise(it) }
true
}
}

View file

@ -1,21 +1,14 @@
package com.tangem.domain.dynamicaddresses.repository
import arrow.core.Either
import com.tangem.blockchain.common.TransactionSigner
import com.tangem.domain.dynamicaddresses.model.ConsolidationInfo
import com.tangem.blockchain.common.TransactionData
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId
interface ConsolidationRepository {
suspend fun getConsolidationInfo(
suspend fun createConsolidationTransaction(
userWalletId: UserWalletId,
network: Network,
): Either<Throwable, ConsolidationInfo>
suspend fun sendConsolidationTransaction(
userWalletId: UserWalletId,
network: Network,
signer: TransactionSigner,
): Either<Throwable, String>
): Either<Throwable, TransactionData>
}