Updated on 2026-08-14
This commit is contained in:
parent
d9f3a8e456
commit
943baed9b8
3 changed files with 35 additions and 24 deletions
|
|
@ -34,7 +34,8 @@ internal class DefaultDynamicAddressesRepository(
|
|||
val token = response.findToken(network)
|
||||
when {
|
||||
token?.dynamicAddressesEnabled != true -> DynamicAddressesStatus.DISABLED
|
||||
!isXpubAvailable(userWalletId, network) -> DynamicAddressesStatus.ENABLED_REQUIRES_SETUP
|
||||
!walletManagersFacade.isDynamicAddressesEnabled(userWalletId, network) ->
|
||||
DynamicAddressesStatus.ENABLED_REQUIRES_SETUP
|
||||
else -> DynamicAddressesStatus.ENABLED
|
||||
}
|
||||
}
|
||||
|
|
@ -145,11 +146,6 @@ internal class DefaultDynamicAddressesRepository(
|
|||
}
|
||||
}
|
||||
|
||||
private suspend fun isXpubAvailable(userWalletId: UserWalletId, network: Network): Boolean {
|
||||
// Check if WalletManager is already in XPUB mode (dynamic addresses were previously enabled on this device)
|
||||
return walletManagersFacade.getDynamicAddressesReceiveAddress(userWalletId, network) != null
|
||||
}
|
||||
|
||||
private fun GetWalletAccountsResponse.findToken(network: Network): UserTokensResponse.Token? {
|
||||
return accounts
|
||||
.flatMap { it.tokens.orEmpty() }
|
||||
|
|
|
|||
|
|
@ -209,11 +209,14 @@ internal class DefaultWalletManagersFacade @Inject constructor(
|
|||
"Unable to get a wallet manager for blockchain: $blockchain"
|
||||
}
|
||||
|
||||
val address = walletManager
|
||||
.wallet
|
||||
.addresses
|
||||
.find { it.type == addressType }
|
||||
?.value ?: walletManager.wallet.address
|
||||
val isDynamicAddressesEnabled = (walletManager as? DynamicAddressesManager)?.isDynamicAddressesEnabled == true
|
||||
|
||||
val address = if (isDynamicAddressesEnabled) {
|
||||
getDynamicAddressesLastUsedReceiveAddress(userWalletId, network) ?: walletManager.wallet.address
|
||||
} else {
|
||||
walletManager.wallet.addresses.find { it.type == addressType }?.value ?: walletManager.wallet.address
|
||||
}
|
||||
|
||||
return blockchain.getExploreUrl(address, contractAddress)
|
||||
}
|
||||
|
||||
|
|
@ -466,9 +469,12 @@ internal class DefaultWalletManagersFacade @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun isDynamicAddressesEnabled(userWalletId: UserWalletId, network: Network): Boolean {
|
||||
return getEnabledDynamicAddressesManagerOrNull(userWalletId, network) != null
|
||||
}
|
||||
|
||||
override suspend fun getDynamicAddressesReceiveAddress(userWalletId: UserWalletId, network: Network): String? {
|
||||
val walletManager = getOrCreateWalletManager(userWalletId = userWalletId, network = network)
|
||||
val dynamicAddressesManager = walletManager as? DynamicAddressesManager ?: return null
|
||||
val dynamicAddressesManager = getEnabledDynamicAddressesManagerOrNull(userWalletId, network) ?: return null
|
||||
return dynamicAddressesManager.findFirstUnusedReceiveAddress()?.address
|
||||
}
|
||||
|
||||
|
|
@ -476,23 +482,21 @@ internal class DefaultWalletManagersFacade @Inject constructor(
|
|||
userWalletId: UserWalletId,
|
||||
network: Network,
|
||||
): String? {
|
||||
val walletManager = getOrCreateWalletManager(userWalletId = userWalletId, network = network)
|
||||
val dynamicAddressesManager = walletManager as? DynamicAddressesManager ?: return null
|
||||
val dynamicAddressesManager = getEnabledDynamicAddressesManagerOrNull(userWalletId, network) ?: return null
|
||||
return dynamicAddressesManager.usedAddresses
|
||||
.filter { usedAddress ->
|
||||
.mapNotNull { usedAddress ->
|
||||
val nodes = runCatching { DerivationPath(usedAddress.derivationPath).nodes }.getOrNull()
|
||||
?: return@filter false
|
||||
nodes.size >= XPUB_PATH_MIN_NODES && nodes[nodes.size - 2].index == RECEIVE_CHAIN_INDEX
|
||||
?: return@mapNotNull null
|
||||
if (nodes.size < XPUB_PATH_MIN_NODES) return@mapNotNull null
|
||||
if (nodes[nodes.size - 2].index != RECEIVE_CHAIN_INDEX) return@mapNotNull null
|
||||
usedAddress to nodes.last().index
|
||||
}
|
||||
.maxByOrNull { usedAddress ->
|
||||
runCatching { DerivationPath(usedAddress.derivationPath).nodes.last().index }.getOrDefault(0L)
|
||||
}
|
||||
?.address
|
||||
.maxByOrNull { (_, lastIndex) -> lastIndex }
|
||||
?.first?.address
|
||||
}
|
||||
|
||||
override suspend fun hasDynamicAddressesNonBaseBalances(userWalletId: UserWalletId, network: Network): Boolean {
|
||||
val walletManager = getOrCreateWalletManager(userWalletId = userWalletId, network = network)
|
||||
val dynamicAddressesManager = walletManager as? DynamicAddressesManager ?: return false
|
||||
val dynamicAddressesManager = getEnabledDynamicAddressesManagerOrNull(userWalletId, network) ?: return false
|
||||
return dynamicAddressesManager.usedAddresses.any { usedAddress ->
|
||||
val nodes = runCatching { DerivationPath(usedAddress.derivationPath).nodes }.getOrNull()
|
||||
?: return@any false
|
||||
|
|
@ -503,8 +507,17 @@ internal class DefaultWalletManagersFacade @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private suspend fun getEnabledDynamicAddressesManagerOrNull(
|
||||
userWalletId: UserWalletId,
|
||||
network: Network,
|
||||
): DynamicAddressesManager? {
|
||||
val walletManager = getOrCreateWalletManager(userWalletId = userWalletId, network = network)
|
||||
return (walletManager as? DynamicAddressesManager)?.takeIf { it.isDynamicAddressesEnabled }
|
||||
}
|
||||
|
||||
private fun restoreXpubModeIfNeeded(walletManager: WalletManager, xpub: String) {
|
||||
val dynamicAddressesManager = walletManager as? DynamicAddressesManager ?: return
|
||||
if (dynamicAddressesManager.isDynamicAddressesEnabled) return
|
||||
|
||||
try {
|
||||
dynamicAddressesManager.enableDynamicAddresses(xpub)
|
||||
|
|
|
|||
|
|
@ -295,6 +295,8 @@ interface WalletManagersFacade {
|
|||
|
||||
suspend fun disableXpubMode(userWalletId: UserWalletId, network: Network): SimpleResult
|
||||
|
||||
suspend fun isDynamicAddressesEnabled(userWalletId: UserWalletId, network: Network): Boolean
|
||||
|
||||
suspend fun getDynamicAddressesReceiveAddress(userWalletId: UserWalletId, network: Network): String?
|
||||
|
||||
suspend fun getDynamicAddressesLastUsedReceiveAddress(userWalletId: UserWalletId, network: Network): String?
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue