Updated on 2026-08-14

This commit is contained in:
Tangem 2026-04-13 19:48:06 +03:00
parent 27e9400b2a
commit b38ebb3995
16 changed files with 196 additions and 71 deletions

View file

@ -49,7 +49,12 @@ internal class DefaultDynamicAddressesRepository(
}
updateTokenDynamicAddressesFlag(userWalletId, network, enabled = true)
runSuspendCatching { accountsCRUDRepository.syncTokens(userWalletId) }
.onFailure { TangemLogger.e("Failed to sync tokens after DA enable for $userWalletId", it) }
.onFailure { throwable ->
TangemLogger.e(
messageString = "Failed to sync tokens after dynamic addresses enable for $userWalletId",
throwable = throwable,
)
}
}
}
@ -61,7 +66,12 @@ internal class DefaultDynamicAddressesRepository(
}
updateTokenDynamicAddressesFlag(userWalletId, network, enabled = false)
runSuspendCatching { accountsCRUDRepository.syncTokens(userWalletId) }
.onFailure { TangemLogger.e("Failed to sync tokens after DA disable for $userWalletId", it) }
.onFailure { throwable ->
TangemLogger.e(
messageString = "Failed to sync tokens after dynamic addresses disable for $userWalletId",
throwable = throwable,
)
}
}
}
@ -140,7 +150,7 @@ internal class DefaultDynamicAddressesRepository(
}
private suspend fun isXpubAvailable(userWalletId: UserWalletId, network: Network): Boolean {
// Check if WalletManager is already in XPUB mode (DA was previously enabled on this device)
// Check if WalletManager is already in XPUB mode (dynamic addresses was previously enabled on this device)
return walletManagersFacade.getDynamicAddressesReceiveAddress(userWalletId, network) != null
}

View file

@ -0,0 +1,42 @@
package com.tangem.data.dynamicaddresses
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.firstOrNull
import javax.inject.Inject
import javax.inject.Singleton
/**
* Provides XPUB strings for networks that need dynamic addresses restore (ENABLED_REQUIRES_SETUP).
* Uses only already-derived keys no card scan triggered.
*/
@Singleton
class DynamicAddressesInitializer @Inject constructor(
private val dynamicAddressesRepository: DynamicAddressesRepository,
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
private val getDerivedXpubUseCase: GetDerivedXpubUseCase,
) {
suspend fun getXpubs(userWalletId: UserWalletId, networks: Set<Network>): Map<Network, String> {
if (!dynamicAddressesFeatureToggles.isDynamicAddressesEnabled) return emptyMap()
val result = mutableMapOf<Network, String>()
for (network in networks) {
val status = dynamicAddressesRepository.getStatus(userWalletId, network).firstOrNull()
if (status != DynamicAddressesStatus.ENABLED_REQUIRES_SETUP) continue
val xpub = getDerivedXpubUseCase(userWalletId, network)
if (xpub != null) {
result[network] = xpub
} else {
TangemLogger.w("Dynamic addresses enabled but XPUB not available for ${network.id}")
}
}
return result
}
}