Updated on 2026-08-14

This commit is contained in:
Tangem 2022-12-12 14:38:58 +03:00
commit ce76ab4791
3 changed files with 52 additions and 27 deletions

View file

@ -1,8 +1,10 @@
package com.tangem.tap.domain.model.builders
import com.tangem.blockchain.blockchains.polkadot.ExistentialDepositProvider
import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchain.common.Token
import com.tangem.blockchain.common.WalletManager
import com.tangem.tap.domain.model.UserWallet
import com.tangem.domain.common.util.UserWalletId
import com.tangem.tap.domain.model.WalletDataModel
import com.tangem.tap.domain.model.WalletStoreModel
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
@ -17,29 +19,27 @@ interface WalletStoreBuilder {
fun walletManager(walletManager: WalletManager?): WalletStoreBuilder
}
interface WalletMangerWalletStoreBuilder : WalletStoreBuilder {
fun blockchainNetwork(blockchainNetwork: BlockchainNetwork?): WalletStoreBuilder
}
interface WalletMangerWalletStoreBuilder : WalletStoreBuilder
companion object {
operator fun invoke(
userWallet: UserWallet,
userWalletId: UserWalletId,
blockchainNetwork: BlockchainNetwork,
): BlockchainNetworkWalletStoreBuilder {
return BlockchainNetworkWalletStoreBuilderImpl(userWallet, blockchainNetwork)
return BlockchainNetworkWalletStoreBuilderImpl(userWalletId, blockchainNetwork)
}
operator fun invoke(
userWallet: UserWallet,
userWalletId: UserWalletId,
walletManager: WalletManager,
): WalletMangerWalletStoreBuilder {
return WalletMangerWalletStoreBuilderImpl(userWallet, walletManager)
return WalletMangerWalletStoreBuilderImpl(userWalletId, walletManager)
}
}
}
private class BlockchainNetworkWalletStoreBuilderImpl(
private val userWallet: UserWallet,
private val userWalletId: UserWalletId,
private val blockchainNetwork: BlockchainNetwork,
) : WalletStoreBuilder.BlockchainNetworkWalletStoreBuilder {
private var walletManager: WalletManager? = null
@ -53,7 +53,7 @@ private class BlockchainNetworkWalletStoreBuilderImpl(
val tokensWalletsData = blockchainNetwork.getTokensWalletsData(walletManager)
return WalletStoreModel(
userWalletId = userWallet.walletId,
userWalletId = userWalletId,
blockchainNetwork = blockchainNetwork,
walletManager = walletManager,
walletsData = (listOf(blockchainWalletData) + tokensWalletsData),
@ -63,25 +63,20 @@ private class BlockchainNetworkWalletStoreBuilderImpl(
}
private class WalletMangerWalletStoreBuilderImpl(
private val userWallet: UserWallet,
private val userWalletId: UserWalletId,
private val walletManager: WalletManager,
) : WalletStoreBuilder.WalletMangerWalletStoreBuilder {
private var blockchainNetwork: BlockchainNetwork? = null
override fun blockchainNetwork(blockchainNetwork: BlockchainNetwork?) = this.apply {
this.blockchainNetwork = blockchainNetwork
}
override fun build(): WalletStoreModel {
val blockchainNetwork = this.blockchainNetwork ?: BlockchainNetwork.fromWalletManager(walletManager)
val blockchainWalletData = blockchainNetwork.getBlockchainWalletData(walletManager)
val tokensWalletsData = blockchainNetwork.getTokensWalletsData(walletManager)
val wallet = walletManager.wallet
val blockchainWalletData = wallet.blockchain.toBlockchainWalletData(walletManager)
val tokenWalletsData = wallet.getTokens().firstOrNull()?.toTokenWalletData(walletManager)
return WalletStoreModel(
userWalletId = userWallet.walletId,
blockchainNetwork = blockchainNetwork,
userWalletId = userWalletId,
blockchainNetwork = BlockchainNetwork.fromWalletManager(walletManager),
walletManager = walletManager,
walletsData = (listOf(blockchainWalletData) + tokensWalletsData),
walletsData = (listOf(blockchainWalletData) + listOfNotNull(tokenWalletsData)),
walletRent = null,
)
}
@ -117,6 +112,35 @@ private fun BlockchainNetwork.getTokensWalletsData(walletManager: WalletManager?
}
}
private fun Blockchain.toBlockchainWalletData(walletManager: WalletManager): WalletDataModel {
val wallet = walletManager.wallet
return WalletDataModel(
currency = Currency.Blockchain(
blockchain = this,
derivationPath = wallet.publicKey.derivationPath?.rawPath,
),
status = WalletDataModel.Loading,
walletAddresses = wallet.createAddressesData(),
existentialDeposit = getExistentialDeposit(walletManager),
fiatRate = null,
)
}
private fun Token.toTokenWalletData(walletManager: WalletManager): WalletDataModel {
val wallet = walletManager.wallet
return WalletDataModel(
currency = Currency.Token(
token = this,
blockchain = wallet.blockchain,
derivationPath = wallet.publicKey.derivationPath?.rawPath,
),
status = WalletDataModel.Loading,
walletAddresses = wallet.createAddressesData(),
existentialDeposit = getExistentialDeposit(walletManager),
fiatRate = null,
)
}
private fun getExistentialDeposit(walletManager: WalletManager?): BigDecimal? {
return (walletManager as? ExistentialDepositProvider)?.getExistentialDeposit()
}

View file

@ -187,8 +187,8 @@ internal class DefaultWalletCurrenciesManager(
.flatMap { walletManager ->
walletStoresRepository.storeOrUpdate(
userWalletId = userWalletId,
walletStore = WalletStoreBuilder(userWallet, walletManager)
.blockchainNetwork(blockchainNetwork)
walletStore = WalletStoreBuilder(userWalletId, blockchainNetwork)
.walletManager(walletManager)
.build(),
)
}

View file

@ -122,7 +122,7 @@ internal class DefaultWalletStoresManager(
{ walletManager ->
walletStoresRepository.storeOrUpdate(
userWalletId = userWalletId,
walletStore = WalletStoreBuilder(userWallet, blockchainNetwork)
walletStore = WalletStoreBuilder(userWalletId, blockchainNetwork)
.walletManager(walletManager)
.build(),
)
@ -158,9 +158,10 @@ internal class DefaultWalletStoresManager(
refresh = refresh,
)
.flatMap { walletManager ->
val userWalletId = userWallet.walletId
walletStoresRepository.storeOrUpdate(
userWalletId = userWallet.walletId,
walletStore = WalletStoreBuilder(userWallet, walletManager)
userWalletId = userWalletId,
walletStore = WalletStoreBuilder(userWalletId, walletManager)
.build(),
)
}