Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-15 11:22:40 +03:00
commit c2cd7e6b4c
675 changed files with 9577 additions and 4375 deletions

View file

@ -2,10 +2,7 @@
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>MultilineLambdaItParameter:DefaultWalletManagersFacade.kt$DefaultWalletManagersFacade${ Token( name = it.name, symbol = it.symbol, contractAddress = it.contractAddress, decimals = it.decimals, id = it.id, ) }</ID>
<ID>MultilineLambdaItParameter:UpdateWalletManagerResultFactory.kt$UpdateWalletManagerResultFactory${ createCurrencyTransaction( txHistoryItemConverter = txHistoryItemConverter, data = it, ) }</ID>
<ID>NamedArguments:DefaultWalletManagersFacade.kt$DefaultWalletManagersFacade$getAndUpdateWalletManager(userWallet, blockchain, derivationPath, extraTokens)</ID>
<ID>UnnecessaryLet:DefaultWalletManagersFacade.kt$DefaultWalletManagersFacade$let(txHistoryStateConverter::convert)</ID>
<ID>UnsafeCallOnNullableType:WalletManagerFactory.kt$blockchain.getTestnetVersion()!!</ID>
<ID>UnsafeCallOnNullableType:WalletManagerFactory.kt$scanResponse.secondTwinPublicKey!!</ID>
</CurrentIssues>

View file

@ -85,7 +85,12 @@ internal class DefaultWalletManagersFacade @Inject constructor(
val blockchain = network.toBlockchain()
val derivationPath = network.derivationPath.value
return getAndUpdateWalletManager(userWallet, blockchain, derivationPath, extraTokens)
return getAndUpdateWalletManager(
userWallet = userWallet,
blockchain = blockchain,
derivationPath = derivationPath,
extraTokens = extraTokens,
)
}
override suspend fun remove(userWalletId: UserWalletId, networks: Set<Network>) {
@ -123,18 +128,18 @@ internal class DefaultWalletManagersFacade @Inject constructor(
if (tokenInfos.isEmpty()) return
tokenInfos
.groupBy { it.network }
.groupBy(TokenInfo::network)
.forEach { (network, tokenInfoList) ->
removeTokens(
userWalletId = userWalletId,
network = network,
networkTokens = tokenInfoList.map {
networkTokens = tokenInfoList.map { tokenInfo ->
Token(
name = it.name,
symbol = it.symbol,
contractAddress = it.contractAddress,
decimals = it.decimals,
id = it.id,
name = tokenInfo.name,
symbol = tokenInfo.symbol,
contractAddress = tokenInfo.contractAddress,
decimals = tokenInfo.decimals,
id = tokenInfo.id,
)
},
)
@ -215,24 +220,24 @@ internal class DefaultWalletManagersFacade @Inject constructor(
"Unable to get a wallet manager for blockchain: ${currency.network}"
}
return walletManager
.getTransactionHistoryState(
address = walletManager.wallet.address,
filterType = when (currency) {
is CryptoCurrency.Coin -> TransactionHistoryRequest.FilterType.Coin
is CryptoCurrency.Token -> {
val blockchainToken = Token(
name = currency.name,
symbol = currency.symbol,
contractAddress = currency.contractAddress,
decimals = currency.decimals,
id = currency.id.rawCurrencyId?.value,
)
TransactionHistoryRequest.FilterType.Contract(blockchainToken)
}
},
)
.let(txHistoryStateConverter::convert)
val transactionHistoryState = walletManager.getTransactionHistoryState(
address = walletManager.wallet.address,
filterType = when (currency) {
is CryptoCurrency.Coin -> TransactionHistoryRequest.FilterType.Coin
is CryptoCurrency.Token -> {
val blockchainToken = Token(
name = currency.name,
symbol = currency.symbol,
contractAddress = currency.contractAddress,
decimals = currency.decimals,
id = currency.id.rawCurrencyId?.value,
)
TransactionHistoryRequest.FilterType.Contract(blockchainToken)
}
},
)
return txHistoryStateConverter.convert(transactionHistoryState)
}
override suspend fun getTxHistoryItems(
@ -366,7 +371,7 @@ internal class DefaultWalletManagersFacade @Inject constructor(
blockchain: Blockchain,
derivationPath: String?,
): WalletManager? {
getWmInitializationMutex(blockchain, derivationPath).withLock {
getWmInitializationMutex(userWalletId, blockchain, derivationPath).withLock {
val userWallet = getUserWallet(userWalletId)
var walletManager = walletManagersStore.getSyncOrNull(
@ -738,15 +743,24 @@ internal class DefaultWalletManagersFacade @Inject constructor(
return initializableAccountWalletManger.accountInitializationState == InitializableAccount.State.INITIALIZED
}
private fun getWmInitializationMutex(blockchain: Blockchain, derivationPath: String?): Mutex {
val key = createMutexMapKey(blockchain, derivationPath)
private fun getWmInitializationMutex(
userWalletId: UserWalletId,
blockchain: Blockchain,
derivationPath: String?,
): Mutex {
val key = createMutexMapKey(userWalletId, blockchain, derivationPath)
return wmInitializationMutexes.computeIfAbsent(key) {
Mutex()
}
}
private fun createMutexMapKey(blockchain: Blockchain, derivationPath: String?): String {
return blockchain.toNetworkId() + "|" + derivationPath
private fun createMutexMapKey(userWalletId: UserWalletId, blockchain: Blockchain, derivationPath: String?): String {
return listOf(
userWalletId.stringValue,
blockchain.toNetworkId(),
derivationPath,
)
.joinToString(separator = "|")
}
private fun updateWalletManagerTokensIfNeeded(walletManager: WalletManager, tokens: Set<CryptoCurrency.Token>) {