Updated on 2026-08-14

This commit is contained in:
Tangem 2026-03-20 21:54:46 +04:00
parent 8b75e37e30
commit a9bca131c3
386 changed files with 1369 additions and 1347 deletions

View file

@ -63,7 +63,6 @@ dependencies {
implementation(deps.kotlin.coroutines)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
// endregion
// region Test

View file

@ -7,9 +7,9 @@ import com.tangem.domain.account.fetcher.SingleAccountListFetcher
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
@ -30,7 +30,7 @@ internal class DefaultMultiAccountListFetcher @Inject constructor(
when (params) {
is MultiAccountListFetcher.Params.Set -> {
if (params.ids.isEmpty()) {
Timber.d("No wallet ids provided to fetch accounts.")
TangemLogger.d("No wallet ids provided to fetch accounts.")
return@either
}
@ -52,7 +52,7 @@ internal class DefaultMultiAccountListFetcher @Inject constructor(
"Failed to fetch accounts for wallets:\n${errors.entries.joinToString(separator = "\n")}",
)
Timber.e(exception)
TangemLogger.e("Error", exception)
raise(exception)
}

View file

@ -16,7 +16,7 @@ import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResp
import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO
import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse
import com.tangem.domain.models.wallet.UserWalletId
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
import javax.inject.Singleton
@ -60,7 +60,7 @@ internal class FetchWalletAccountsErrorHandler @Inject constructor(
): FetchResult {
val isResponseUpToDate = error.isNetworkError(code = Code.NOT_MODIFIED)
if (isResponseUpToDate) {
Timber.e("ETag is up to date, no need to update accounts for wallet: $userWalletId")
TangemLogger.e("ETag is up to date, no need to update accounts for wallet: $userWalletId")
val response = requireNotNull(savedAccountsResponse) {
"Saved accounts response is null for wallet: $userWalletId"
}

View file

@ -32,10 +32,10 @@ import com.tangem.domain.models.account.AccountName
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.extensions.replaceBy
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import timber.log.Timber
/**
[REDACTED_AUTHOR]
@ -174,7 +174,7 @@ internal class DefaultAccountsCRUDRepository(
val response = getAccountsResponseSync(userWalletId = userWalletId)
if (response == null) {
Timber.e("Can't sync tokens. No accounts response found for wallet: $userWalletId")
TangemLogger.e("Can't sync tokens. No accounts response found for wallet: $userWalletId")
return
}

View file

@ -20,12 +20,12 @@ import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse
import com.tangem.datasource.local.accounts.AccountTokenMigrationStore
import com.tangem.datasource.utils.getSyncOrNull
import com.tangem.domain.account.tokens.MainAccountTokensMigration
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.domain.models.account.DerivationIndex
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.lib.crypto.derivation.AccountNodeRecognizer
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.launch
import timber.log.Timber
/**
* Implementation of [MainAccountTokensMigration] for migrating tokens associated with a main account.
@ -49,7 +49,7 @@ internal class DefaultMainAccountTokensMigration(
val response = store.getSyncOrNull()
ensureNotNull(response) {
val exception = IllegalStateException("No cached accounts response found")
Timber.e(exception)
TangemLogger.e("Error", exception)
exception
}
val mainAccount = findAccount(response = response, derivationIndex = DerivationIndex.Main)
@ -57,7 +57,7 @@ internal class DefaultMainAccountTokensMigration(
.filterNot { accountDTO -> accountDTO.derivationIndex.toDerivationIndex().isMain }
if (customAccounts.isEmpty()) {
Timber.i("There is only the Main account. Nothing to migrate")
TangemLogger.i("There is only the Main account. Nothing to migrate")
return@either response
}
@ -66,7 +66,7 @@ internal class DefaultMainAccountTokensMigration(
.filter { it.key.value in customAccountIndexes }
if (unassignedTokens.isEmpty()) {
Timber.i("No unassigned tokens found for migration")
TangemLogger.i("No unassigned tokens found for migration")
return@either response
}
@ -103,7 +103,7 @@ internal class DefaultMainAccountTokensMigration(
derivationIndex: DerivationIndex,
): Either<Throwable, Unit> = either {
if (derivationIndex == DerivationIndex.Main) {
Timber.i("Migration skipped: derivation index is Main")
TangemLogger.i("Migration skipped: derivation index is Main")
return@either
}
@ -113,7 +113,7 @@ internal class DefaultMainAccountTokensMigration(
ensureNotNull(response) {
val exception = IllegalStateException("No cached accounts response found")
Timber.e(exception)
TangemLogger.e("Error", exception)
exception
}
@ -123,7 +123,7 @@ internal class DefaultMainAccountTokensMigration(
val unassignedTokens = mainAccount.findUnassignedTokens(derivationIndex)
if (unassignedTokens.isNullOrEmpty()) {
Timber.i("No unassigned tokens found for migration")
TangemLogger.i("No unassigned tokens found for migration")
return@either
}
@ -158,7 +158,7 @@ internal class DefaultMainAccountTokensMigration(
return ensureNotNull(account) {
val exception = IllegalStateException("No account found with derivation index: $derivationIndex")
Timber.e(exception)
TangemLogger.e("Error", exception)
exception
}
}
@ -198,13 +198,13 @@ internal class DefaultMainAccountTokensMigration(
return filter { savedToken ->
val blockchain = Blockchain.fromNetworkId(networkId = savedToken.networkId)
if (blockchain == null) {
Timber.e("Token has unknown networkId: $savedToken")
TangemLogger.e("Token has unknown networkId: $savedToken")
return@filter false
}
val derivationPathValue = savedToken.derivationPath
if (derivationPathValue == null) {
Timber.e("Token has no derivation path: $savedToken")
TangemLogger.e("Token has no derivation path: $savedToken")
return@filter false
}
@ -212,7 +212,7 @@ internal class DefaultMainAccountTokensMigration(
val accountNodeValue = accountNodeRecognizer.recognize(derivationPathValue)
if (accountNodeValue == null) {
Timber.e("Token has unrecognized derivation path: $savedToken")
TangemLogger.e("Token has unrecognized derivation path: $savedToken")
return@filter false
}
@ -230,7 +230,7 @@ internal class DefaultMainAccountTokensMigration(
eTagsStore.clear(userWalletId = userWalletId, key = ETagsStore.Key.WalletAccounts)
}
val exception = IllegalStateException("Failed to push updated tokens after migration")
Timber.e(exception)
TangemLogger.e("Error", exception)
raise(exception)
},
)

View file

@ -18,6 +18,7 @@ dependencies {
/** Project - Analytics */
implementation(projects.core.analytics.models)
implementation(projects.core.utils)
/** Project - Data */
implementation(projects.core.datasource)
@ -32,5 +33,4 @@ dependencies {
/** Other */
implementation(deps.kotlin.coroutines)
implementation(deps.timber)
}

View file

@ -33,5 +33,4 @@ dependencies {
/** Other */
implementation(deps.jodatime)
implementation(deps.kotlin.coroutines)
implementation(deps.timber)
}

View file

@ -25,10 +25,10 @@ internal class FlipListener(private val action: () -> Unit) : SensorEventListene
isScreenDown = true
lastTriggerTime = currentTime
// TODO add module logging
// Timber.tag("onSensorChanged").d("screen down")
// Logger.withTag("onSensorChanged").d("screen down")
} else if (zAxisValue >= zAxisThreshold) {
if (isScreenDown && currentTime - lastTriggerTime <= throttleTimeMs) {
// Timber.tag("onSensorChanged").d("screen up!")
// Logger.withTag("onSensorChanged").d("screen up!")
lastTriggerTime = currentTime
action.invoke()
}

View file

@ -45,7 +45,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.jodatime)
implementation(deps.kotlin.coroutines)
implementation(deps.timber)
/* Test */
testImplementation(projects.common.test)

View file

@ -4,8 +4,8 @@ import arrow.core.raise.Raise
import arrow.core.raise.recover
import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.common.response.ApiResponseError
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withTimeoutOrNull
import timber.log.Timber
import kotlin.time.Duration
/**
@ -67,7 +67,7 @@ suspend inline fun <T> safeApiCall(
): T = recover(
block = { call(ApiResponseRaise(raise = this)) },
recover = { error ->
Timber.e(error, "Unable to perform safe API call")
TangemLogger.e("Unable to perform safe API call", error)
onError(error)
},
)

View file

@ -2,13 +2,13 @@ package com.tangem.data.common.cache
import com.tangem.datasource.local.cache.CacheKeysStore
import com.tangem.datasource.local.cache.model.CacheKey
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import org.joda.time.Duration
import org.joda.time.LocalDateTime
import timber.log.Timber
import java.util.concurrent.ConcurrentHashMap
internal class DefaultCacheRegistry(
@ -26,17 +26,17 @@ internal class DefaultCacheRegistry(
}
override suspend fun invalidate(key: String) {
Timber.d("Invalidate the cache key: $key")
TangemLogger.d("Invalidate the cache key: $key")
withContext(NonCancellable) { cacheKeysStore.remove(key) }
}
override suspend fun invalidate(keys: Collection<String>) {
Timber.d("Invalidate cache keys: $keys")
TangemLogger.d("Invalidate cache keys: $keys")
withContext(NonCancellable) { cacheKeysStore.remove(keys) }
}
override suspend fun invalidateAll() {
Timber.d("Invalidate all cache keys")
TangemLogger.d("Invalidate all cache keys")
withContext(NonCancellable) { cacheKeysStore.clear() }
}
@ -58,7 +58,7 @@ internal class DefaultCacheRegistry(
}
try {
Timber.d("Invoke the action associated with the cache key: $key")
TangemLogger.d("Invoke the action associated with the cache key: $key")
cacheKeysStore.store(
key = CacheKey(
@ -70,7 +70,7 @@ internal class DefaultCacheRegistry(
block()
} catch (e: Throwable) {
Timber.e(e, "The action related to the cache key has failed: $key")
TangemLogger.e("The action related to the cache key has failed: $key", e)
invalidate(key)

View file

@ -6,7 +6,7 @@ import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.utils.getSyncOrNull
import com.tangem.datasource.local.preferences.utils.store
import com.tangem.domain.models.wallet.UserWalletId
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
/**
* Default implementation of the [ETagsStore] interface for managing ETag values
@ -25,7 +25,7 @@ internal class DefaultETagsStore(
override suspend fun store(userWalletId: UserWalletId, key: ETagsStore.Key, value: String) {
if (value.isBlank()) {
Timber.e("ETag value is blank, not storing it. userWalletId: $userWalletId, key: $key")
TangemLogger.e("ETag value is blank, not storing it. userWalletId: $userWalletId, key: $key")
return
}

View file

@ -11,7 +11,7 @@ import com.tangem.domain.models.account.DerivationIndex
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWallet
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import com.tangem.blockchain.common.Token as SdkToken
// FIXME: Make internal
@ -52,7 +52,7 @@ class CryptoCurrencyFactory(
accountIndex: DerivationIndex? = null,
): CryptoCurrency.Token? {
if (blockchain == Blockchain.Unknown) {
Timber.e("Unable to map the SDK token to the domain token with Unknown blockchain")
TangemLogger.e("Unable to map the SDK token to the domain token with Unknown blockchain")
return null
}
@ -93,7 +93,7 @@ class CryptoCurrencyFactory(
accountIndex = accountIndex,
)
} else {
Timber.e("Unable to get blockchain from chainId == $chainId")
TangemLogger.e("Unable to get blockchain from chainId == $chainId")
null
}
}
@ -105,7 +105,7 @@ class CryptoCurrencyFactory(
accountIndex: DerivationIndex? = null,
): CryptoCurrency.Coin? {
if (blockchain == Blockchain.Unknown) {
Timber.e("Unable to map the SDK token to the domain token with Unknown blockchain")
TangemLogger.e("Unable to map the SDK token to the domain token with Unknown blockchain")
return null
}

View file

@ -11,7 +11,7 @@ import com.tangem.domain.models.account.DerivationIndex
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWallet
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
import com.tangem.blockchain.common.Token as SdkToken
@ -46,7 +46,7 @@ class ResponseCryptoCurrenciesFactory @Inject constructor(
): CryptoCurrency? {
var blockchain = Blockchain.fromNetworkId(responseToken.networkId)
if (blockchain == null || blockchain == Blockchain.Unknown) {
Timber.e("Unable to find a blockchain with the network ID: ${responseToken.networkId}")
TangemLogger.e("Unable to find a blockchain with the network ID: ${responseToken.networkId}")
return null
}
@ -71,7 +71,7 @@ class ResponseCryptoCurrenciesFactory @Inject constructor(
): CryptoCurrency? {
var blockchain = Blockchain.fromNetworkId(responseToken.networkId)
if (blockchain == null || blockchain == Blockchain.Unknown) {
Timber.e("Unable to find a blockchain with the network ID: ${responseToken.networkId}")
TangemLogger.e("Unable to find a blockchain with the network ID: ${responseToken.networkId}")
return null
}

View file

@ -8,7 +8,7 @@ import com.tangem.domain.models.account.AccountId
import com.tangem.domain.models.account.DerivationIndex
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.lib.crypto.derivation.AccountNodeRecognizer
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
/**
* Enriches the [UserTokensResponse] with accountId values for tokens
@ -61,20 +61,20 @@ object UserTokensResponseAccountIdEnricher {
.groupBy { savedToken ->
val derivationPathValue = savedToken.derivationPath
if (derivationPathValue == null) {
Timber.e("Token $savedToken has no derivation path")
TangemLogger.e("Token $savedToken has no derivation path")
return@groupBy null
}
val blockchain = Blockchain.fromNetworkId(networkId = savedToken.networkId)
if (blockchain == null) {
Timber.e("Token $savedToken has unknown networkId")
TangemLogger.e("Token $savedToken has unknown networkId")
return@groupBy null
}
val accountNodeRecognizer = AccountNodeRecognizer(blockchain)
val accountIndex = accountNodeRecognizer.recognize(derivationPathValue)
if (accountIndex == null) {
Timber.e("Token $savedToken has unrecognized derivation path")
TangemLogger.e("Token $savedToken has unrecognized derivation path")
return@groupBy null
}
@ -89,7 +89,7 @@ object UserTokensResponseAccountIdEnricher {
if (accountIndex == null) return@mapKeys null
val derivationIndex = DerivationIndex.invoke(value = accountIndex.toInt()).getOrElse {
Timber.e("Failed to parse derivation index from account index: $accountIndex")
TangemLogger.e("Failed to parse derivation index from account index: $accountIndex")
return@mapKeys null
}

View file

@ -12,10 +12,10 @@ import com.tangem.domain.common.wallets.getSyncOrNull
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import com.tangem.utils.retryer.Retryer
import com.tangem.utils.retryer.RetryerPool
import kotlinx.coroutines.withContext
import timber.log.Timber
@Suppress("LongParameterList")
class UserTokensSaver(
@ -36,7 +36,7 @@ class UserTokensSaver(
val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId)
if (userWallet == null) {
Timber.e("UserWallet with id $userWalletId not found. Cannot push tokens.")
TangemLogger.e("UserWallet with id $userWalletId not found. Cannot push tokens.")
onFailSend()
return@withContext
}
@ -116,7 +116,7 @@ class UserTokensSaver(
userWalletId = userWalletId,
response = response,
onFailSend = {
Timber.e(
TangemLogger.e(
"Retryer: Failed to push updated tokens on attempt ${iteration + 1} for $userWalletId",
)

View file

@ -13,7 +13,7 @@ import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.wallets.derivations.DerivationStyleProvider
import com.tangem.domain.wallets.derivations.derivationStyleProvider
import com.tangem.lib.crypto.derivation.toMutable
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
/**
@ -154,11 +154,11 @@ class NetworkFactory @Inject constructor(
private fun Blockchain.isBlockchainSupported(): Boolean {
if (this == Blockchain.Unknown) {
Timber.w("Unable to convert Unknown blockchain to the domain network model")
TangemLogger.w("Unable to convert Unknown blockchain to the domain network model")
return false
}
if (this in excludedBlockchains) {
Timber.w("Unable to convert excluded blockchain to the domain network model")
TangemLogger.w("Unable to convert excluded blockchain to the domain network model")
return false
}

View file

@ -15,11 +15,11 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.api.tangemTech.models.QuotesResponse
import com.tangem.domain.core.utils.eitherOn
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import org.joda.time.DateTime
import timber.log.Timber
import java.util.concurrent.ConcurrentHashMap
import kotlin.time.Duration.Companion.seconds
@ -194,7 +194,7 @@ internal class DefaultQuotesFetcher(
return this
}
Timber.d("Some quotes are missing from the server response: $skippedIds")
TangemLogger.d("Some quotes are missing from the server response: $skippedIds")
val emptyQuotes = skippedIds.associateWith { QuotesResponse.Quote.EMPTY }

View file

@ -1,10 +1,10 @@
package com.tangem.data.common.utils
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.yield
import timber.log.Timber
import kotlin.coroutines.cancellation.CancellationException
@Suppress("UnconditionalJumpStatementInLoop", "MagicNumber")
@ -19,7 +19,7 @@ suspend fun <T> retryOnError(priority: Boolean = false, startRetryDelay: Int = 5
currentCoroutineContext().ensureActive()
}
Timber.e(e, "Error occurred during retryOnError block")
TangemLogger.e("Error occurred during retryOnError block", e)
if (priority && priorityCounter > 0) {
--priorityCounter

View file

@ -37,7 +37,6 @@ dependencies {
// region Other libraries
implementation(deps.androidx.datastore)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
implementation(tangemDeps.blockchain)
// endregion

View file

@ -30,7 +30,6 @@ dependencies {
/** Other */
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
/** DI */
implementation(deps.hilt.android)

View file

@ -12,7 +12,7 @@ import com.tangem.domain.express.models.ExpressProviderType
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.extensions.filterIf
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultExpressRepository(
private val tangemExpressApi: TangemExpressApi,
@ -36,7 +36,7 @@ internal class DefaultExpressRepository(
.filterIf(filterProviderTypes.isNotEmpty()) { it.type in filterProviderTypes }
},
onError = { error ->
Timber.w(error, "Unable to fetch express providers")
TangemLogger.w("Unable to fetch express providers", error)
throw error
},
)

View file

@ -22,11 +22,11 @@ import com.tangem.domain.express.models.ExpressAsset
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.update
import timber.log.Timber
import javax.inject.Inject
typealias InitializationStatusFlow = MutableStateFlow<Lce<Throwable, List<ExpressAsset>>>
@ -85,7 +85,7 @@ internal class DefaultExpressServiceFetcher @Inject constructor(
if (expressAssetsStore.getSyncOrNull(userWallet.walletId) == null) {
initializationStatus.update { e.lceError() }
}
Timber.e(e, "Unable to fetch assets for: ${userWallet.walletId.stringValue}")
TangemLogger.e("Unable to fetch assets for: ${userWallet.walletId.stringValue}", e)
throw e
}
}

View file

@ -25,7 +25,6 @@ dependencies {
// endregion
// Other libraries
implementation(deps.timber)
// endregion
// region Core modules

View file

@ -14,10 +14,10 @@ import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase
import com.tangem.utils.logging.TangemLogger
import com.tangem.utils.version.AppVersionProvider
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
import timber.log.Timber
import java.io.File
/**
@ -102,7 +102,7 @@ internal class DefaultFeedbackRepository(
override fun getBlockchainErrorInfo(userWalletId: UserWalletId): BlockchainErrorInfo? {
return blockchainsErrors.value[userWalletId].also {
if (it == null) Timber.e("Blockchain error info is null for $userWalletId")
if (it == null) TangemLogger.e("Blockchain error info is null for $userWalletId")
}
}

View file

@ -51,7 +51,6 @@ dependencies {
/** Other */
implementation(deps.moshi.kotlin)
implementation(deps.timber)
ksp(deps.moshi.kotlin.codegen)
kaptForObfuscatingVariants(deps.retrofit.response.type.keeper)
}

View file

@ -22,7 +22,7 @@ import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.wallets.derivations.derivationStyleProvider
import com.tangem.lib.crypto.BlockchainUtils
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class ManagedCryptoCurrencyFactory(
private val networkFactory: NetworkFactory,
@ -223,7 +223,7 @@ internal class ManagedCryptoCurrencyFactory(
blockchain.canHandleTokens() -> {
val formattedContractAddress = blockchain.reformatContractAddress(contractAddress)
if (formattedContractAddress == null) {
Timber.w("Couldn't reformat $contractAddress")
TangemLogger.w("Couldn't reformat $contractAddress")
return null
}
SourceNetwork.Default(

View file

@ -45,7 +45,6 @@ dependencies {
implementation(deps.jodatime)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
implementation(tangemDeps.blockchain)
ksp(deps.moshi.kotlin.codegen)
kaptForObfuscatingVariants(deps.retrofit.response.type.keeper)

View file

@ -45,7 +45,6 @@ dependencies {
// region Other libraries
implementation(deps.androidx.datastore)
implementation(deps.moshi)
implementation(deps.timber)
// endregion
// region Tests

View file

@ -3,7 +3,7 @@ package com.tangem.data.networks.converters
import com.tangem.datasource.local.network.entity.NetworkStatusDM
import com.tangem.domain.models.network.NetworkAddress
import com.tangem.utils.converter.TwoWayConverter
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
/**
* Converter from [NetworkAddressConverter.Value] to [NetworkAddress] and vice versa
@ -58,7 +58,7 @@ internal object NetworkAddressConverter : TwoWayConverter<NetworkAddressConverte
}
if (address.value.isBlank()) {
Timber.w("Address value is blank")
TangemLogger.w("Address value is blank")
}
return NetworkAddress.Address(value = address.value, type = type)

View file

@ -11,8 +11,8 @@ import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
@ -63,8 +63,8 @@ internal class CommonNetworkStatusFetcher @Inject constructor(
networksStatusesStore.storeStatus(userWalletId = userWalletId, status = status)
}
.onLeft {
Timber.e("Failed to fetch network status for $userWalletId [${network.rawId}]: $it")
.onLeft { throwable ->
TangemLogger.e("Failed to fetch network status for $userWalletId [${network.rawId}]", throwable)
networksStatusesStore.setSourceAsOnlyCache(userWalletId = userWalletId, network = network)
}
}

View file

@ -10,11 +10,11 @@ import com.tangem.domain.core.flow.FlowProducerTools
import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.*
import timber.log.Timber
/**
* Default implementation of [MultiNetworkStatusProducer]
@ -43,7 +43,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
val userWallet = userWalletsListRepository.getSyncOrNull(params.userWalletId)
if (userWallet == null) {
Timber.e("Unable to get UserWallet with provided ID: ${params.userWalletId}")
TangemLogger.e("Unable to get UserWallet with provided ID: ${params.userWalletId}")
return@mapNotNull null
}

View file

@ -1,9 +1,9 @@
package com.tangem.data.networks.repository
import com.tangem.domain.common.tokens.CardCryptoCurrencyFactory
import com.tangem.data.networks.store.NetworksStatusesStore
import com.tangem.data.networks.store.storeStatus
import com.tangem.data.networks.utils.NetworkStatusFactory
import com.tangem.domain.common.tokens.CardCryptoCurrencyFactory
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.network.CryptoCurrencyAddress
import com.tangem.domain.models.network.Network
@ -11,8 +11,8 @@ import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.networks.repository.NetworksRepository
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withContext
import timber.log.Timber
/**
* Default implementation of [NetworksRepository]
@ -36,8 +36,8 @@ internal class DefaultNetworksRepository(
val currencies = runCatching {
cardCryptoCurrencyFactory.create(userWalletId = userWalletId, network = network)
}
.getOrElse {
Timber.e(it, "Unable to create wallet currencies")
.getOrElse { error ->
TangemLogger.e("Unable to create wallet currencies", error)
return@withContext
}
@ -50,8 +50,8 @@ internal class DefaultNetworksRepository(
network: Network,
): List<CryptoCurrencyAddress> {
return runCatching { cardCryptoCurrencyFactory.create(userWalletId = userWalletId, network = network) }
.getOrElse {
Timber.e(it, "Unable to create wallet currencies")
.getOrElse { error ->
TangemLogger.e("Unable to create wallet currencies", error)
return emptyList()
}
.map { currency ->
@ -67,8 +67,8 @@ internal class DefaultNetworksRepository(
network: Network.RawID,
): List<CryptoCurrencyAddress> {
return runCatching { cardCryptoCurrencyFactory.createByRawId(userWalletId = userWalletId, network = network) }
.getOrElse {
Timber.e(it, "Unable to create wallet currencies")
.getOrElse { error ->
TangemLogger.e("Unable to create wallet currencies", error)
return emptyList()
}
.map { currency ->

View file

@ -7,15 +7,17 @@ import com.tangem.data.networks.converters.SimpleNetworkStatusConverter
import com.tangem.data.networks.models.SimpleNetworkStatus
import com.tangem.datasource.local.datastore.RuntimeSharedStore
import com.tangem.datasource.local.network.entity.NetworkStatusDM
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.domain.models.StatusSource
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.extensions.addOrReplace
import kotlinx.coroutines.*
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import timber.log.Timber
import kotlinx.coroutines.launch
import java.io.File
internal typealias WalletIdWithSimpleStatus = Map<String, Set<SimpleNetworkStatus>>
@ -45,7 +47,7 @@ internal class DefaultNetworksStatusesStore(
oldFile.delete()
}
} catch (e: Exception) {
Timber.e(e, "Error while deleting old networks statuses datastore file")
TangemLogger.e("Error while deleting old networks statuses datastore file", e)
}
val cachedStatuses = persistenceDataStore.data.firstOrNull() ?: return@launch
@ -89,7 +91,7 @@ internal class DefaultNetworksStatusesStore(
ifNotFound: (Network.ID) -> SimpleNetworkStatus?,
) {
if (networks.isEmpty()) {
Timber.d("Nothing to update: networks are empty")
TangemLogger.d("Nothing to update: networks are empty")
return
}

View file

@ -5,7 +5,7 @@ import com.tangem.domain.models.StatusSource
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.models.wallet.UserWalletId
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
/**
* Store actual network [status] by [userWalletId].
@ -41,14 +41,14 @@ internal suspend fun NetworksStatusesStore.storeStatus(userWalletId: UserWalletI
internal suspend fun NetworksStatusesStore.storeSuccess(userWalletId: UserWalletId, status: NetworkStatus) {
if (status.value is NetworkStatus.Unreachable) {
val message = "Use storeError method to save unreachable status"
Timber.d(message)
TangemLogger.d(message)
error(message)
}
if (status.value.source != StatusSource.ACTUAL) {
val message = "Method storeActual can be called only with StatusSource.ACTUAL"
Timber.d(message)
TangemLogger.d(message)
error(message)
}

View file

@ -8,10 +8,10 @@ import com.tangem.domain.networks.utils.NetworksCleaner
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runSuspendCatching
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.withContext
import timber.log.Timber
/**
* Default implementation of [NetworksCleaner].
@ -30,7 +30,7 @@ internal class DefaultNetworksCleaner(
override suspend fun invoke(userWalletId: UserWalletId, currencies: List<CryptoCurrency>) {
if (currencies.isEmpty()) {
Timber.d("No currencies to clear for wallet: $userWalletId")
TangemLogger.d("No currencies to clear for wallet: $userWalletId")
return
}
@ -49,7 +49,7 @@ internal class DefaultNetworksCleaner(
runSuspendCatching {
networksStatusesStore.clear(userWalletId = userWalletId, networks = networks)
}
.onFailure { Timber.e(it, "Failed to clear network statuses for wallet: $userWalletId") }
.onFailure { TangemLogger.e("Failed to clear network statuses for wallet: $userWalletId", it) }
}
}
@ -63,7 +63,7 @@ internal class DefaultNetworksCleaner(
walletManagersFacade.remove(userWalletId = userWalletId, networks = networks)
}
.onFailure {
Timber.e(it, "Failed to remove networks from Blockchain SDK for wallet: $userWalletId")
TangemLogger.e("Failed to remove networks from Blockchain SDK for wallet: $userWalletId", it)
}
}
@ -72,7 +72,7 @@ internal class DefaultNetworksCleaner(
walletManagersFacade.removeTokens(userWalletId = userWalletId, tokens = tokens)
}
.onFailure {
Timber.e(it, "Failed to remove tokens from Blockchain SDK for wallet: $userWalletId")
TangemLogger.e("Failed to remove tokens from Blockchain SDK for wallet: $userWalletId", it)
}
}
}

View file

@ -9,7 +9,7 @@ import com.tangem.domain.models.network.NetworkAddress
import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.models.network.TxInfo
import com.tangem.domain.models.yield.supply.YieldSupplyStatus
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
/** Factory for creating [NetworkStatus] */
object NetworkStatusFactory {
@ -104,7 +104,7 @@ object NetworkStatusFactory {
}
if (amount == null) {
Timber.w("Unable to find amount for cryptocurrency: $currency")
TangemLogger.w("Unable to find amount for cryptocurrency: $currency")
currency.id to NetworkStatus.Amount.NotFound
} else {
currency.id to NetworkStatus.Amount.Loaded(amount.value)
@ -129,7 +129,7 @@ object NetworkStatusFactory {
}
if (amount == null) {
Timber.w("Unable to find amount for cryptocurrency: $currency")
TangemLogger.w("Unable to find amount for cryptocurrency: $currency")
currency.id to null
} else {
currency.id to amount.yieldSupplyStatus
@ -191,7 +191,7 @@ object NetworkStatusFactory {
}
if (address.value.isBlank()) {
Timber.w("Address value is blank")
TangemLogger.w("Address value is blank")
}
return NetworkAddress.Address(address.value, type)

View file

@ -39,7 +39,6 @@ dependencies {
// region Other libraries
implementation(deps.androidx.datastore)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
// endregion
// region Tests

View file

@ -28,9 +28,9 @@ import com.tangem.pagination.exception.EndOfPaginationException
import com.tangem.pagination.fetcher.BatchFetcher
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runSuspendCatching
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import timber.log.Timber
/**
* Implementation of [NewsRepository].
@ -72,7 +72,7 @@ internal class DefaultNewsRepository(
response.items
},
onError = { error ->
Timber.e(error, "Failed to get list of news")
TangemLogger.e("Failed to get list of news", error)
throw error
},
)
@ -224,8 +224,7 @@ internal class DefaultNewsRepository(
return withContext(dispatchers.io) {
when (val apiResponse = newsApi.getTrendingNews(limit = limit, language = language)) {
is ApiResponse.Error -> {
Timber.e(
apiResponse.cause,
TangemLogger.e(
"Trending news fetch failed cause: ${
when (val error = apiResponse.cause) {
is ApiResponseError.HttpException -> error.code
@ -234,6 +233,7 @@ internal class DefaultNewsRepository(
is ApiResponseError.UnknownException -> "UnknownException"
}
}",
apiResponse.cause,
)
trendingNewsStore.clear()
trendingNewsStore.store(

View file

@ -45,7 +45,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.arrow.fx)
implementation(deps.jodatime)
implementation(deps.timber)
implementation(deps.androidx.paging.runtime)
implementation(deps.moshi.kotlin)
ksp(deps.moshi.kotlin.codegen)

View file

@ -34,6 +34,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.JobHolder
import com.tangem.utils.coroutines.runSuspendCatching
import com.tangem.utils.coroutines.saveIn
import com.tangem.utils.logging.TangemLogger
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.*
@ -42,7 +43,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
import com.tangem.blockchain.nft.models.NFTAsset as SdkNFTAsset
@ -241,7 +241,7 @@ internal class DefaultNFTRepository @Inject constructor(
// NFTCleaner implementation
override suspend fun invoke(userWalletId: UserWalletId, networks: Set<Network>) {
if (networks.isEmpty()) {
Timber.d("No networks to clear for wallet: $userWalletId")
TangemLogger.d("No networks to clear for wallet: $userWalletId")
return
}
@ -252,7 +252,7 @@ internal class DefaultNFTRepository @Inject constructor(
// nftRuntimeStoreFactory.provide(network = network).clear()
}
.onFailure { throwable ->
Timber.e(throwable, "Failed to clear NFT data for network $network for wallet: $userWalletId")
TangemLogger.e("Failed to clear NFT data for network $network for wallet: $userWalletId", throwable)
}
}
}

View file

@ -47,7 +47,6 @@ dependencies {
implementation(deps.kotlin.immutable.collections)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
ksp(deps.moshi.kotlin.codegen)
kaptForObfuscatingVariants(deps.retrofit.response.type.keeper)
implementation(deps.kotlin.serialization)

View file

@ -22,19 +22,15 @@ import com.tangem.domain.card.common.extensions.canHandleToken
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.common.wallets.getSyncStrict
import com.tangem.domain.common.wallets.loadAndGet
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.onramp.model.HotCryptoCurrency
import com.tangem.domain.onramp.repositories.HotCryptoRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.JobHolder
import com.tangem.utils.coroutines.runCatching
import com.tangem.utils.coroutines.saveIn
import com.tangem.utils.coroutines.*
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.plus
import timber.log.Timber
/**
* Default implementation of [HotCryptoRepository]
@ -123,9 +119,9 @@ internal class DefaultHotCryptoRepository(
return runCatching(dispatchers.io) {
tangemTechApi.getHotCrypto(currencyId = appCurrencyId).getOrThrow()
}
.onSuccess { Timber.d("HotCrypto is successfully updated") }
.onSuccess { TangemLogger.d("HotCrypto is successfully updated") }
.onFailure { throwable ->
Timber.e(throwable, "Unable to fetch hot crypto")
TangemLogger.e("Unable to fetch hot crypto", throwable)
val httpException = throwable as? ApiResponseError.HttpException
analyticsEventHandler.send(

View file

@ -50,6 +50,7 @@ import com.tangem.domain.onramp.repositories.OnrampRepository
import com.tangem.domain.tokens.model.Amount
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
@ -57,7 +58,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import org.joda.time.DateTime
import timber.log.Timber
import java.util.UUID
@Suppress("LongParameterList", "LargeClass", "TooManyFunctions")
@ -221,7 +221,7 @@ internal class DefaultOnrampRepository(
).bind()
},
onError = { error ->
Timber.w(error, "Unable to fetch onramp payment methods")
TangemLogger.w("Unable to fetch onramp payment methods", error)
throw error
},
)
@ -256,7 +256,7 @@ internal class DefaultOnrampRepository(
).bind()
},
onError = { error ->
Timber.w(error, "Unable to fetch onramp pairs")
TangemLogger.w("Unable to fetch onramp pairs", error)
throw error
},
)
@ -273,7 +273,7 @@ internal class DefaultOnrampRepository(
).bind()
},
onError = { error ->
Timber.w(error, "Unable to fetch express providers")
TangemLogger.w("Unable to fetch express providers", error)
throw error
},
)
@ -321,7 +321,7 @@ internal class DefaultOnrampRepository(
).bind()
},
onError = { error ->
Timber.w(error, "Unable to fetch onramp pairs")
TangemLogger.w("Unable to fetch onramp pairs", error)
throw error
},
)
@ -455,7 +455,7 @@ internal class DefaultOnrampRepository(
).bind()
},
onError = { e ->
Timber.e(e)
TangemLogger.e("Error", e)
throw e
},
)
@ -478,7 +478,7 @@ internal class DefaultOnrampRepository(
throw OnrampRedirectError.VerificationFailed
}
} catch (e: Exception) {
Timber.e(e)
TangemLogger.e("Error", e)
throw e
}
}
@ -602,7 +602,7 @@ internal class DefaultOnrampRepository(
countryCode = countryCode,
)
} else {
Timber.w(error, "Unable to fetch onramp quotes for ${provider.id}. $error")
TangemLogger.w("Unable to fetch onramp quotes for ${provider.id}. $error", error)
OnrampQuote.Error(
paymentMethod = paymentMethod,
provider = provider,
@ -612,7 +612,7 @@ internal class DefaultOnrampRepository(
)
}
} else {
Timber.w(error, "Unable to fetch onramp quotes for ${provider.id}. $error")
TangemLogger.w("Unable to fetch onramp quotes for ${provider.id}. $error", error)
null
}

View file

@ -14,7 +14,6 @@ dependencies {
implementation(deps.androidx.datastore)
implementation(deps.jodatime)
implementation(deps.timber)
implementation(deps.hilt.android)
kapt(deps.hilt.kapt)

View file

@ -44,7 +44,6 @@ dependencies {
// region Other libraries
implementation(deps.androidx.datastore)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
// endregion
// region Tests

View file

@ -13,7 +13,7 @@ import com.tangem.domain.core.utils.catchOn
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.quotes.multi.MultiQuoteStatusFetcher
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
import javax.inject.Singleton
@ -37,7 +37,7 @@ internal class DefaultMultiQuoteStatusFetcher @Inject constructor(
override suspend fun invoke(params: MultiQuoteStatusFetcher.Params) = Either.catchOn(dispatchers.default) {
if (params.currenciesIds.isEmpty()) {
Timber.d("No currencies to fetch quotes for")
TangemLogger.d("No currencies to fetch quotes for")
return@catchOn
}
@ -67,7 +67,7 @@ internal class DefaultMultiQuoteStatusFetcher @Inject constructor(
quotesStatusesStore.store(values = updatedResponse.quotes)
}
.onLeft { throwable ->
Timber.e(throwable)
TangemLogger.e("Error", throwable)
quotesStatusesStore.setSourceAsOnlyCache(currenciesIds = params.currenciesIds)
}
@ -77,7 +77,7 @@ internal class DefaultMultiQuoteStatusFetcher @Inject constructor(
if (appCurrencyId.isNullOrBlank()) {
val exception = IllegalStateException("Unable to get AppCurrency for updating quotes")
Timber.e(exception)
TangemLogger.e("Error", exception)
throw exception
}

View file

@ -4,17 +4,17 @@ import androidx.annotation.VisibleForTesting
import arrow.core.left
import com.tangem.data.quotes.store.QuotesStatusesStore
import com.tangem.datasource.appcurrency.AppCurrencyResponseStore
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.domain.core.utils.EitherFlow
import com.tangem.domain.models.quote.QuoteStatus
import com.tangem.domain.quotes.multi.MultiQuoteStatusFetcher
import com.tangem.domain.quotes.multi.MultiQuoteUpdater
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.coroutines.JobHolder
import com.tangem.utils.coroutines.saveIn
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import timber.log.Timber
/**
* Default implementation of [MultiQuoteUpdater] which updates quotes when the app currency changes
@ -36,14 +36,14 @@ internal class DefaultMultiQuoteUpdater(
private val updaterHolder = JobHolder()
override fun subscribe() {
Timber.d("Subscribe on quotes updates")
TangemLogger.d("Subscribe on quotes updates")
getMultiQuoteUpdates()
.launchIn(coroutineScope)
.saveIn(updaterHolder)
}
override fun unsubscribe() {
Timber.e("Unsubscribe from quotes updates")
TangemLogger.i("Unsubscribe from quotes updates")
updaterHolder.cancel()
}
@ -63,10 +63,10 @@ internal class DefaultMultiQuoteUpdater(
appCurrencyId = appCurrency.id,
),
)
.onLeft(Timber::e)
.onLeft { TangemLogger.e("Error", it) }
}
.retryWhen { cause, _ ->
Timber.e("Retry updating quotes: $cause")
TangemLogger.e("Retry updating quotes: $cause")
emit(cause.left())

View file

@ -4,7 +4,7 @@ import com.tangem.data.quotes.store.QuotesStatusesStore
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.quote.QuoteStatus
import com.tangem.domain.quotes.QuotesRepository
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
/**
* Default implementation of [QuotesRepository]
@ -19,7 +19,7 @@ internal class DefaultQuotesRepository(
override suspend fun getMultiQuoteSyncOrNull(currenciesIds: Set<CryptoCurrency.RawID>): Set<QuoteStatus> {
if (currenciesIds.isEmpty()) {
Timber.e("currenciesIds are empty")
TangemLogger.e("currenciesIds are empty")
return emptySet()
}

View file

@ -4,16 +4,16 @@ import androidx.datastore.core.DataStore
import com.tangem.data.quotes.converter.QuoteStatusConverter
import com.tangem.datasource.api.tangemTech.models.QuotesResponse
import com.tangem.datasource.local.datastore.RuntimeSharedStore
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.domain.models.StatusSource
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.quote.QuoteStatus
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.extensions.addOrReplace
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import timber.log.Timber
internal typealias CurrencyIdWithQuote = Map<String, QuotesResponse.Quote>
@ -64,7 +64,7 @@ internal class DefaultQuotesStatusesStore(
ifNotFound: (CryptoCurrency.RawID) -> QuoteStatus?,
) {
if (currenciesIds.isEmpty()) {
Timber.d("Nothing to update: currencies ids are empty")
TangemLogger.d("Nothing to update: currencies ids are empty")
return
}

View file

@ -33,7 +33,6 @@ dependencies {
implementation(deps.kotlin.coroutines)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
ksp(deps.moshi.kotlin.codegen)
kaptForObfuscatingVariants(deps.retrofit.response.type.keeper)
// endregion

View file

@ -14,11 +14,11 @@ import com.tangem.domain.settings.usercountry.models.GB_COUNTRY
import com.tangem.domain.settings.usercountry.models.UserCountry
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runSuspendCatching
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.util.Locale
@Suppress("TooManyFunctions")
@ -145,7 +145,7 @@ internal class DefaultSettingsRepository(
override fun getUserCountryCode(): StateFlow<UserCountry?> = userCountryFlow
override suspend fun fetchUserCountryCode() {
Timber.i("Start fetching user country code")
TangemLogger.i("Start fetching user country code")
// for GB locale avoid request geo and use device default (FCA fixes)
if (Locale.getDefault().country == GB_COUNTRY.code) {
@ -166,7 +166,7 @@ internal class DefaultSettingsRepository(
else -> UserCountry.Other(code = country)
}
Timber.i("User code country is $code")
TangemLogger.i("User code country is $code")
userCountryFlow.value = code
}

View file

@ -55,7 +55,6 @@ dependencies {
implementation(deps.kotlin.immutable.collections)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
implementation(deps.firebase.crashlytics)
ksp(deps.moshi.kotlin.codegen)
kaptForObfuscatingVariants(deps.retrofit.response.type.keeper)

View file

@ -5,11 +5,7 @@ import arrow.core.getOrElse
import arrow.core.raise.Raise
import arrow.core.raise.either
import arrow.core.raise.ensure
import com.tangem.data.staking.converters.ethpool.P2PEthPoolBroadcastResultConverter
import com.tangem.data.staking.converters.ethpool.P2PEthPoolErrorConverter
import com.tangem.data.staking.converters.ethpool.P2PEthPoolStakingAccountConverter
import com.tangem.data.staking.converters.ethpool.P2PEthPoolUnsignedTxConverter
import com.tangem.data.staking.converters.ethpool.P2PEthPoolVaultConverter
import com.tangem.data.staking.converters.ethpool.*
import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.ethpool.P2PEthPoolApi
import com.tangem.datasource.api.ethpool.models.request.P2PEthPoolBroadcastRequest
@ -28,11 +24,11 @@ import com.tangem.domain.staking.model.stakekit.StakingError
import com.tangem.domain.staking.repositories.P2PEthPoolRepository
import com.tangem.domain.staking.toggles.StakingFeatureToggles
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import timber.log.Timber
/**
* P2PEthPool staking repository implementation
@ -71,7 +67,7 @@ internal class DefaultP2PEthPoolRepository(
override suspend fun fetchVaults(network: P2PEthPoolNetwork) {
val vaults = if (stakingFeatureToggles.isEthStakingEnabled) {
getVaults(network).getOrElse { error ->
Timber.e("Error fetching P2PEthPool vaults: $error")
TangemLogger.e("Error fetching P2PEthPool vaults: $error")
emptyList()
}
} else {

View file

@ -47,13 +47,13 @@ import com.tangem.domain.staking.model.stakekit.transaction.StakingTransaction
import com.tangem.domain.staking.repositories.StakeKitRepository
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import timber.log.Timber
@Suppress("LargeClass", "LongParameterList", "TooManyFunctions")
internal class DefaultStakeKitRepository(
@ -91,7 +91,7 @@ internal class DefaultStakeKitRepository(
when (response) {
is ApiResponse.Success -> response.data.data.filter { yield -> yield.isAvailable == true }
is ApiResponse.Error -> {
Timber.e("Error fetching enabled yields: ${response.cause}")
TangemLogger.e("Error fetching enabled yields: ${response.cause}")
emptyList()
}
}
@ -142,7 +142,7 @@ internal class DefaultStakeKitRepository(
network = networkTypeString,
status = actionStatusString,
).getOrThrow().data,
onError = { Timber.e("Error converting staking actions list: $it") },
onError = { TangemLogger.e("Error converting staking actions list: $it") },
)
}
}
@ -348,7 +348,7 @@ internal class DefaultStakeKitRepository(
private suspend fun getEnabledYieldsSync(): List<Yield> {
return YieldConverter.convertListIgnoreErrors(
input = stakingYieldsStore.getSync(),
onError = { Timber.e("Error converting one of the items in enabled yields: $it") },
onError = { TangemLogger.e("Error converting one of the items in enabled yields: $it") },
)
}
@ -356,7 +356,7 @@ internal class DefaultStakeKitRepository(
return stakingYieldsStore.get().map { yields ->
YieldConverter.convertListIgnoreErrors(
input = yields,
onError = { Timber.e("Error converting one of the items in enabled yields: $it") },
onError = { TangemLogger.e("Error converting one of the items in enabled yields: $it") },
)
}
}

View file

@ -1,15 +1,15 @@
package com.tangem.data.staking
import com.tangem.datasource.api.stakekit.StakeKitApi
import com.tangem.datasource.api.stakekit.models.request.*
import com.tangem.datasource.api.stakekit.models.request.SubmitTransactionHashRequestBody
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.PreferencesKeys
import com.tangem.datasource.local.preferences.utils.getObjectListSync
import com.tangem.domain.staking.model.UnsubmittedTransactionMetadata
import com.tangem.domain.staking.repositories.StakeKitTransactionHashRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withContext
import timber.log.Timber
internal class DefaultStakeKitTransactionHashRepository(
private val stakeKitApi: StakeKitApi,
@ -75,7 +75,7 @@ internal class DefaultStakeKitTransactionHashRepository(
append("StakeKit id = ${transaction.transactionId} and\n")
append("transaction hash = ${transaction.transactionHash}")
}
Timber.e(logMessage)
TangemLogger.e(logMessage)
}
}
}

View file

@ -30,11 +30,11 @@ import com.tangem.domain.staking.model.ethpool.P2PEthPoolVault
import com.tangem.domain.staking.multi.MultiStakingBalanceFetcher
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runSuspendCatching
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
/**
@ -66,10 +66,10 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
) : MultiStakingBalanceFetcher {
override suspend fun invoke(params: MultiStakingBalanceFetcher.Params): Either<Throwable, Unit> {
Timber.i("Start fetching staking balances for params:\n$params")
TangemLogger.i("Start fetching staking balances for params:\n$params")
val stakingIds = params.stakingIds.ifEmpty {
Timber.i("Nothing to fetch, empty stakingIds for ${params.userWalletId}")
TangemLogger.i("Nothing to fetch, empty stakingIds for ${params.userWalletId}")
return Unit.right()
}
@ -84,7 +84,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
stakingIntegrationID is StakingIntegrationID.StakeKit
}
Timber.i(
TangemLogger.i(
"""
Staking IDs to fetch:
- StakeKit: ${stakeKitIds.joinToString()}
@ -104,7 +104,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
}
}
.onLeft { throwable ->
Timber.e(throwable, "Unable to fetch staking balances $params")
TangemLogger.e("Unable to fetch staking balances $params", throwable)
if (stakeKitIds.isNotEmpty()) {
stakeKitBalancesStore.storeError(
@ -137,7 +137,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
val vaults = runSuspendCatching { p2pEthPoolVaultsStore.getSync() }.getOrNull().orEmpty()
if (vaults.isEmpty()) {
Timber.w("No P2PEthPool vaults available for $userWalletId, storing empty balances")
TangemLogger.w("No P2PEthPool vaults available for $userWalletId, storing empty balances")
p2PEthPoolBalancesStore.storeEmpty(userWalletId = userWalletId, stakingIds = stakingIds)
return
}
@ -155,7 +155,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
val addresses = stakingIds.map { it.address }.toSet()
val responses = fetchP2PAccountResponses(vaults = vaults, addresses = addresses)
Timber.i("Successfully fetched ${responses.size} P2PEthPool balances for $userWalletId")
TangemLogger.i("Successfully fetched ${responses.size} P2PEthPool balances for $userWalletId")
if (responses.isNotEmpty()) {
p2PEthPoolBalancesStore.storeActual(userWalletId = userWalletId, values = responses)
@ -167,19 +167,22 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
}
if (missingStakingIds.isNotEmpty()) {
Timber.i("Missing responses for ${missingStakingIds.size} staking IDs: $missingStakingIds")
TangemLogger.i(
"Missing responses for ${missingStakingIds.size} staking IDs:" +
" $missingStakingIds",
)
p2PEthPoolBalancesStore.storeError(
userWalletId = userWalletId,
stakingIds = missingStakingIds.toSet(),
)
}
} else {
Timber.i("No P2PEthPool responses received for $userWalletId")
TangemLogger.i("No P2PEthPool responses received for $userWalletId")
p2PEthPoolBalancesStore.storeError(userWalletId = userWalletId, stakingIds = stakingIds)
}
},
onError = { throwable ->
Timber.e(throwable, "Unable to fetch P2PEthPool balances $userWalletId")
TangemLogger.e("Unable to fetch P2PEthPool balances $userWalletId", throwable)
p2PEthPoolBalancesStore.storeError(userWalletId = userWalletId, stakingIds = stakingIds)
@ -207,7 +210,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
is ApiResponse.Success -> {
val data = response.data
if (data.error != null) {
Timber.w(
TangemLogger.w(
"P2PEthPool API returned error for vault ${vault.vaultAddress}, " +
"address $address: ${data.error ?: "error"}",
)
@ -219,17 +222,17 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
}
}
is ApiResponse.Error -> {
Timber.w(
response.cause,
TangemLogger.w(
"Failed to fetch P2PEthPool balance for vault ${vault.vaultAddress}, " +
"address $address",
response.cause,
)
}
}
}.onFailure { error ->
Timber.w(
error,
TangemLogger.w(
"Failed to fetch P2PEthPool balance for vault ${vault.vaultAddress}, address $address",
error,
)
}
}
@ -245,7 +248,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
if (!isSupportedByWallet) {
val exception = IllegalStateException("Wallet $userWalletId is not supported: $maybeUserWallet")
Timber.e(exception)
TangemLogger.e("Error", exception)
ifNotSupported(exception)
}
@ -263,7 +266,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
val availableStakingIds = groupedStakingIds[true].orEmpty()
val unavailableStakingIds = groupedStakingIds[false].orEmpty()
Timber.i(
TangemLogger.i(
"""
Available staking IDs: ${availableStakingIds.joinToString()}
Unavailable staking IDs: ${unavailableStakingIds.joinToString()}
@ -282,7 +285,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
stakingIds: ${stakingIds.joinToString()}
""".trimIndent(),
)
Timber.i(exception)
TangemLogger.i(exception.toString())
throw exception
}
}
@ -293,7 +296,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
if (yieldsIds.isEmpty()) {
val exception = IllegalStateException("No enabled yields for $userWalletId")
Timber.e(exception)
TangemLogger.e("Error", exception)
throw exception
}
@ -320,7 +323,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
.toSet()
}
Timber.i(
TangemLogger.i(
"Successfully fetched staking balances for $userWalletId:\n${yieldBalances.joinToString("\n")}",
)
stakeKitBalancesStore.storeActual(userWalletId = userWalletId, values = yieldBalances)
@ -337,7 +340,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor(
}
},
onError = { throwable ->
Timber.e(throwable, "Unable to fetch staking balances $userWalletId")
TangemLogger.e("Unable to fetch staking balances $userWalletId", throwable)
stakeKitBalancesStore.storeError(userWalletId = userWalletId, stakingIds = stakingIds)

View file

@ -10,13 +10,13 @@ import com.tangem.domain.staking.multi.MultiStakingBalanceSupplier
import com.tangem.domain.staking.single.SingleStakingBalanceProducer
import com.tangem.domain.staking.single.SingleStakingBalanceProducer.Companion.selectStakingBalance
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import timber.log.Timber
/**
* Default implementation of [SingleStakingBalanceProducer]
@ -39,7 +39,7 @@ internal class DefaultSingleStakingBalanceProducer @AssistedInject constructor(
override val fallback: Option<StakingBalance> = StakingBalance.Error(stakingId = params.stakingId).some()
override fun produce(): Flow<StakingBalance> {
Timber.i("Producing staking balance for params:\n$params")
TangemLogger.i("Producing staking balance for params:\n$params")
return multiStakingBalanceSupplier(
params = MultiStakingBalanceProducer.Params(userWalletId = params.userWalletId),

View file

@ -9,10 +9,10 @@ import com.tangem.domain.staking.StakingIdFactory
import com.tangem.domain.staking.utils.StakingCleaner
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runSuspendCatching
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.withContext
import timber.log.Timber
/**
* Default implementation of [StakingCleaner].
@ -32,7 +32,7 @@ internal class DefaultStakingCleaner(
override suspend fun invoke(userWalletId: UserWalletId, currencies: List<CryptoCurrency>) {
if (currencies.isEmpty()) {
Timber.d("No currencies to clear for wallet: $userWalletId")
TangemLogger.d("No currencies to clear for wallet: $userWalletId")
return
}
@ -41,7 +41,7 @@ internal class DefaultStakingCleaner(
}
if (stakingIds.isEmpty()) {
Timber.d("All currencies have no stakingIds to clear for wallet: $userWalletId")
TangemLogger.d("All currencies have no stakingIds to clear for wallet: $userWalletId")
return
}
@ -50,7 +50,7 @@ internal class DefaultStakingCleaner(
override suspend fun invoke(userWalletId: UserWalletId, stakingIds: Set<StakingID>) {
if (stakingIds.isEmpty()) {
Timber.d("No stakingIds to clear for wallet: $userWalletId")
TangemLogger.d("No stakingIds to clear for wallet: $userWalletId")
return
}
@ -66,13 +66,13 @@ internal class DefaultStakingCleaner(
runSuspendCatching {
stakeKitBalancesStore.clear(userWalletId, stakingIds)
}
.onFailure { Timber.e(it, "Failed to clear StakeKit balance statuses for wallet: $userWalletId") }
.onFailure { TangemLogger.e("Failed to clear StakeKit balance statuses for wallet: $userWalletId", it) }
}
private suspend fun clearP2PEthPoolBalancesStore(userWalletId: UserWalletId, stakingIds: Set<StakingID>) {
runSuspendCatching {
p2pEthPoolBalancesStore.clear(userWalletId, stakingIds)
}
.onFailure { Timber.e(it, "Failed to clear P2PEthPool balance statuses for wallet: $userWalletId") }
.onFailure { TangemLogger.e("Failed to clear P2PEthPool balance statuses for wallet: $userWalletId", it) }
}
}

View file

@ -52,7 +52,6 @@ dependencies {
implementation(deps.kotlin.coroutines)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(deps.timber)
/** DI */
implementation(deps.hilt.android)

View file

@ -35,11 +35,11 @@ import com.tangem.domain.swap.models.*
import com.tangem.domain.swap.models.SwapAmountType
import com.tangem.domain.tokens.operations.CryptoCurrencyStatusFactory
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.io.IOException
import java.math.BigDecimal
import java.util.UUID
@ -392,7 +392,7 @@ internal class DefaultSwapRepositoryV2 @Inject constructor(
).getOrThrow()
},
onError = { error ->
Timber.w(error, "Unable to get pairs")
TangemLogger.w("Unable to get pairs", error)
throw error
},
)
@ -438,7 +438,7 @@ internal class DefaultSwapRepositoryV2 @Inject constructor(
return try {
txDetailsMoshiAdapter.fromJson(txDetailsJson)
} catch (e: IOException) {
Timber.e(e, "error parsing txDetailsJson")
TangemLogger.e("error parsing txDetailsJson", e)
null
}
}

View file

@ -72,7 +72,6 @@ dependencies {
implementation(deps.kotlin.coroutines)
implementation(deps.moshi.kotlin)
implementation(deps.retrofit) // For HttpException
implementation(deps.timber)
ksp(deps.moshi.kotlin.codegen)
kaptForObfuscatingVariants(deps.retrofit.response.type.keeper)
// endregion

View file

@ -8,10 +8,10 @@ import com.tangem.datasource.api.tangemTech.models.CoinsResponse
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.withContext
import timber.log.Timber
/**
* Responsible for merging custom tokens into a user's token response.
@ -105,7 +105,7 @@ internal class CustomTokensMerger(
).bind()
},
onError = { error ->
Timber.e(error, "Unable to fetch token:\n$token")
TangemLogger.e("Unable to fetch token:\n$token", error)
null
},
)

View file

@ -45,7 +45,6 @@ dependencies {
kapt(deps.hilt.kapt)
/** Other */
implementation(deps.timber)
/** tests */
testImplementation(projects.common.test)

View file

@ -33,8 +33,8 @@ import com.tangem.domain.transaction.models.EventTransactionTypeDto
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runCatching
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.math.BigDecimal
import java.math.BigInteger
@ -271,7 +271,7 @@ internal class DefaultTransactionRepository(
Result.failure(ex)
}
} else {
Timber.e("${walletManager?.wallet?.blockchain} does not support transaction validation")
TangemLogger.e("${walletManager?.wallet?.blockchain} does not support transaction validation")
Result.success(Unit)
}
}
@ -441,14 +441,14 @@ internal class DefaultTransactionRepository(
val response = tangemTechApi.transactionEvents(body)
response.fold(
onSuccess = {
Timber.d("Successfully sent yield supply transaction hash: $hash")
TangemLogger.d("Successfully sent yield supply transaction hash: $hash")
},
onError = { error ->
Timber.e(error, "Failed to send yield supply transaction hash: $hash")
TangemLogger.e("Failed to send yield supply transaction hash: $hash", error)
},
)
}.onFailure { error ->
Timber.e(error, "Failed to send yield supply transaction hash: $hash")
TangemLogger.e("Failed to send yield supply transaction hash: $hash", error)
}
}
@ -460,7 +460,7 @@ internal class DefaultTransactionRepository(
derivationPath = network.derivationPath.value,
)
val preparer = walletManager as? TransactionPreparer ?: run {
Timber.e("${walletManager?.wallet?.blockchain} does not support TransactionBuilder")
TangemLogger.e("${walletManager?.wallet?.blockchain} does not support TransactionBuilder")
error("Wallet manager does not support TransactionPreparer")
}
return preparer

View file

@ -29,7 +29,6 @@ dependencies {
implementation(deps.kotlin.coroutines)
implementation(deps.androidx.paging.runtime)
implementation(deps.timber)
implementation(deps.jodatime)
implementation(tangemDeps.blockchain)

View file

@ -20,9 +20,9 @@ import com.tangem.domain.txhistory.repository.TxHistoryRepository
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.walletmanager.utils.SdkPageConverter
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext
import timber.log.Timber
class DefaultTxHistoryRepository(
private val cacheRegistry: CacheRegistry,
@ -110,7 +110,7 @@ class DefaultTxHistoryRepository(
)
?.items.orEmpty()
} catch (e: Throwable) {
Timber.e(e, "Unable to load the transaction history for the requested page: ${Page.Initial}")
TangemLogger.e("Unable to load the transaction history for the requested page: ${Page.Initial}", e)
emptyList()
}
}

View file

@ -16,7 +16,7 @@ import com.tangem.pagination.BatchFetchResult
import com.tangem.pagination.BatchListSource
import com.tangem.pagination.toBatchFlow
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class RefactoredTxHistoryRepository(
private val walletManagersFacade: WalletManagersFacade,
@ -96,16 +96,17 @@ internal class RefactoredTxHistoryRepository(
.filterIfTxAlreadyAdded(apiItems = items)
return if (recentItems.isEmpty()) {
Timber.d("Nothing to add to TxHistory")
TangemLogger.d("Nothing to add to TxHistory")
this
} else {
Timber.d(
"Recent transactions were added to TxHistory: %s",
recentItems.joinToString(
prefix = "[",
postfix = "]",
transform = TxInfo::txHash,
),
TangemLogger.d(
"Recent transactions were added to TxHistory: ${
recentItems.joinToString(
prefix = "[",
postfix = "]",
transform = TxInfo::txHash,
)
}",
)
return copy(items = recentItems + items)

View file

@ -11,7 +11,7 @@ import com.tangem.domain.txhistory.models.Page
import com.tangem.domain.txhistory.models.PaginationWrapper
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.walletmanager.utils.SdkPageConverter
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class TxHistoryPagingSource(
private val sourceParams: Params,
@ -44,7 +44,7 @@ internal class TxHistoryPagingSource(
}
LoadResult.Page(wrappedItems.items, prevKey = null, nextKey = nextKey)
} catch (e: Throwable) {
Timber.e(e, "Unable to load the transaction history for the requested page: $pageToLoad")
TangemLogger.e("Unable to load the transaction history for the requested page: $pageToLoad", e)
LoadResult.Error(e)
}
@ -89,16 +89,17 @@ internal class TxHistoryPagingSource(
.filterIfTxAlreadyAdded(apiItems = items)
return if (recentItems.isEmpty()) {
Timber.d("Nothing to add to TxHistory")
TangemLogger.d("Nothing to add to TxHistory")
this
} else {
Timber.d(
"Recent transactions were added to TxHistory: %s",
recentItems.joinToString(
prefix = "[",
postfix = "]",
transform = TxInfo::txHash,
),
TangemLogger.d(
"Recent transactions were added to TxHistory: ${
recentItems.joinToString(
prefix = "[",
postfix = "]",
transform = TxInfo::txHash,
)
}",
)
return copy(items = recentItems + items)

View file

@ -54,7 +54,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.arrow.fx)
implementation(deps.jodatime)
implementation(deps.timber)
implementation(deps.androidx.paging.runtime)
implementation(deps.moshi.kotlin)
ksp(deps.moshi.kotlin.codegen)

View file

@ -11,7 +11,7 @@ import com.tangem.data.pay.util.TangemPayErrorConverter
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.pay.TangemPayCryptoCurrencyFactory
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
private const val TAG = "TangemPay: DefaultTangemPayCryptoCurrencyFactory"
@ -53,7 +53,7 @@ internal class DefaultTangemPayCryptoCurrencyFactory @Inject constructor(
decimals = TOKEN_DECIMALS,
)
}.mapLeft { exception ->
Timber.tag(TAG).e(exception)
TangemLogger.withTag(TAG).e("Error", exception)
errorConverter.convert(exception)
}
}

View file

@ -16,7 +16,7 @@ import com.tangem.domain.visa.error.VisaApiError
import com.tangem.security.DeviceSecurityInfoProvider
import com.tangem.security.isSecurityExposed
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
private const val TAG = "PaymentAccountStatusFetcher"
@ -31,12 +31,14 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor(
override suspend fun invoke(params: PaymentAccountStatusFetcher.Params): Either<Throwable, Unit> =
eitherOn(dispatchers.default) {
Timber.tag(TAG).i("fetch: ${params.userWalletId.stringValue}")
TangemLogger.withTag(TAG).i("fetch: ${params.userWalletId.stringValue}")
if (deviceSecurity.isSecurityExposed()) {
Timber.tag(TAG).i("fetch security info: rooted: ${deviceSecurity.isRooted}")
Timber.tag(TAG).i("fetch security info: xposed: ${deviceSecurity.isXposed}")
Timber.tag(TAG).i("fetch security info: bootloader unlocked: ${deviceSecurity.isBootloaderUnlocked}")
TangemLogger.withTag(TAG).i("fetch security info: rooted: ${deviceSecurity.isRooted}")
TangemLogger.withTag(TAG).i("fetch security info: xposed: ${deviceSecurity.isXposed}")
TangemLogger.withTag(
TAG,
).i("fetch security info: bootloader unlocked: ${deviceSecurity.isBootloaderUnlocked}")
return@eitherOn paymentAccountStatusesStore.store(
userWalletId = params.userWalletId,
@ -47,7 +49,9 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor(
val status = onboardingRepository.hasTangemPayInWallet(userWalletId = params.userWalletId)
.fold(
ifLeft = { error ->
Timber.tag(TAG).e("Failed check wallet ${params.userWalletId}: ${error.javaClass.simpleName}")
TangemLogger.withTag(
TAG,
).e("Failed check wallet ${params.userWalletId}: ${error.javaClass.simpleName}")
when (error) {
is VisaApiError.NotPaeraCustomer -> PaymentAccountStatus.NotCreated
else -> PaymentAccountStatus.Error.Unavailable(source = StatusSource.ACTUAL)
@ -57,7 +61,7 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor(
proceedHasTangemPayResult(userWalletId = params.userWalletId, hasTangemPay = hasTangemPay)
},
)
Timber.tag(TAG).i("invoke status ${params.userWalletId}: $status")
TangemLogger.withTag(TAG).i("invoke status ${params.userWalletId}: $status")
paymentAccountStatusesStore.store(userWalletId = params.userWalletId, status = status)
}
@ -65,7 +69,7 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor(
userWalletId: UserWalletId,
hasTangemPay: Boolean,
): PaymentAccountStatus {
Timber.tag(TAG).i("proceedHasTangemPayResult for $userWalletId hasTangemPay: $hasTangemPay")
TangemLogger.withTag(TAG).i("proceedHasTangemPayResult for $userWalletId hasTangemPay: $hasTangemPay")
return if (hasTangemPay) {
fetchTangemPayAccountStatus(userWalletId = userWalletId)
} else {
@ -98,15 +102,15 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor(
private suspend fun proceedWithoutOrder(userWalletId: UserWalletId): PaymentAccountStatus {
return onboardingRepository.getCustomerInfo(userWalletId).fold(
ifLeft = { error ->
Timber.tag(TAG).e("proceedWithoutOrder $userWalletId error: $error")
TangemLogger.withTag(TAG).e("proceedWithoutOrder $userWalletId error: $error")
error.mapToPaymentAccountStatus()
},
ifRight = { customerInfo ->
Timber.tag(TAG).i("proceedWithoutOrder data customerInfo $userWalletId")
TangemLogger.withTag(TAG).i("proceedWithoutOrder data customerInfo $userWalletId")
val status = customerInfo.mapToPaymentAccountStatus()
if (customerInfo.productInstance == null) {
onboardingRepository.createOrder(userWalletId)
.onLeft { Timber.tag(TAG).e("createOrder failed: $it") }
.onLeft { TangemLogger.withTag(TAG).e("createOrder failed: $it") }
}
status
},
@ -116,11 +120,11 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor(
private suspend fun proceedWithOrderId(userWalletId: UserWalletId, orderId: String): PaymentAccountStatus {
return customerOrderRepository.getOrderData(userWalletId, orderId = orderId).fold(
ifLeft = { error ->
Timber.tag(TAG).e("proceedWithOrderId $userWalletId orderId: $orderId error: $error")
TangemLogger.withTag(TAG).e("proceedWithOrderId $userWalletId orderId: $orderId error: $error")
error.mapToPaymentAccountStatus()
},
ifRight = { orderData ->
Timber.tag(TAG).i("proceedWithOrderId $userWalletId: $orderId status: ${orderData.status}")
TangemLogger.withTag(TAG).i("proceedWithOrderId $userWalletId: $orderId status: ${orderData.status}")
when (orderData.status) {
// Kyc is passed and user waits for order creation -> no need to get customer info
OrderStatus.NEW,

View file

@ -19,18 +19,21 @@ import com.tangem.datasource.api.pay.models.response.FreezeUnfreezeCardResponse
import com.tangem.datasource.api.pay.models.response.OrderResponse.Result.Status
import com.tangem.datasource.local.visa.TangemPayCardFrozenStateStore
import com.tangem.datasource.local.visa.TangemPayStorage
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.pay.model.SetPinResult
import com.tangem.domain.pay.model.TangemPayCardBalance
import com.tangem.domain.pay.model.TangemPayCardDetails
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
import com.tangem.domain.visa.model.TangemPayCardFrozenState
import kotlinx.coroutines.*
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import timber.log.Timber
import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds
@ -296,7 +299,7 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor(
cardFrozenStateStore.store(cardId, finalState)
}
}.onLeft { error ->
Timber.e("error ${error.errorCode}")
TangemLogger.e("error ${error.errorCode}")
// stop retrying after 3 errors
if (retryCount > MAX_POLLING_RETRIES) {
pollingJobs.remove(key = orderId)
@ -305,7 +308,7 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor(
retryCount++
}
} catch (e: Exception) {
Timber.e(e)
TangemLogger.e("Error", e)
storePollingMutex.withLock {
pollingJobs.remove(orderId)
}
@ -338,7 +341,7 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor(
}
private fun <T> catchException(throwable: Throwable): Either<UniversalError, T> {
Timber.tag(TAG).e(throwable)
TangemLogger.withTag(TAG).e("Error", throwable)
return errorConverter.convert(throwable).left()
}

View file

@ -24,13 +24,13 @@ import com.tangem.feature.swap.domain.api.SwapRepository
import com.tangem.feature.swap.domain.models.ExpressDataError
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.extensions.addHexPrefix
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import timber.log.Timber
import java.math.BigDecimal
import java.math.RoundingMode
import java.util.Currency
@ -176,14 +176,14 @@ internal class DefaultTangemPayWithdrawRepository @Inject constructor(
}
}
if (attemptCount >= MAX_POLLING_ATTEMPTS) {
Timber.tag(TAG).e("Polling stopped after $attemptCount unsuccessful attempts")
TangemLogger.withTag(TAG).e("Polling stopped after $attemptCount unsuccessful attempts")
tangemPayStorage.deleteWithdrawOrder(userWalletId = userWallet.walletId, orderId = orderId)
pollingMutex.withLock { pollingJobs.remove(key) }
}
} catch (exception: CancellationException) {
throw exception
} catch (exception: Exception) {
Timber.tag(TAG).e(exception)
TangemLogger.withTag(TAG).e("Error", exception)
tangemPayStorage.deleteWithdrawOrder(userWalletId = userWallet.walletId, orderId = orderId)
pollingMutex.withLock { pollingJobs.remove(key) }
}
@ -240,7 +240,7 @@ internal class DefaultTangemPayWithdrawRepository @Inject constructor(
} catch (exception: CancellationException) {
throw exception
} catch (exception: Exception) {
Timber.tag(TAG).e(exception)
TangemLogger.withTag(TAG).e("Error", exception)
}
}
}

View file

@ -17,10 +17,10 @@ import com.tangem.domain.visa.error.VisaApiError
import com.tangem.domain.visa.model.TangemPayAuthTokens
import com.tangem.domain.visa.model.getAuthHeader
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
@ -69,7 +69,7 @@ internal class TangemPayRequestPerformer @Inject constructor(
}
},
catch = { errorConverter.convert(it).left() },
).onLeft { visaApiError -> Timber.tag(TAG).e(visaApiError.toString()) }
).onLeft { visaApiError -> TangemLogger.withTag(TAG).e(visaApiError.toString()) }
}
suspend fun getCustomerWalletAddress(userWalletId: UserWalletId): String {
@ -129,7 +129,7 @@ internal class TangemPayRequestPerformer @Inject constructor(
idempotencyKey = UUID.randomUUID().toString(),
)
}.mapLeft { error ->
Timber.tag(TAG).e("Can not refresh auth tokens: $error")
TangemLogger.withTag(TAG).e("Can not refresh auth tokens: $error")
if (error is VisaApiError.ServerUnavailable) error else VisaApiError.RefreshTokenExpired
}.onRight { tokens ->
tangemPayStorage.storeAuthTokens(customerWalletAddress = customerWalletAddress, tokens = tokens)

View file

@ -4,15 +4,15 @@ import androidx.datastore.core.DataStore
import com.tangem.data.pay.converter.PaymentAccountStatusDMConverter
import com.tangem.datasource.local.datastore.RuntimeSharedStore
import com.tangem.datasource.local.visa.entity.PaymentAccountStatusDM
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.pay.PaymentAccountStatus
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.launch
import timber.log.Timber
internal typealias WalletIdWithPaymentStatus = Map<String, PaymentAccountStatus>
internal typealias WalletIdWithPaymentStatusDM = Map<String, PaymentAccountStatusDM>
@ -39,7 +39,7 @@ internal class PaymentAccountStatusesStore(
},
)
} catch (e: Exception) {
Timber.e(e, "Error while loading cached payment account statuses")
TangemLogger.e("Error while loading cached payment account statuses", e)
}
}
}

View file

@ -7,9 +7,9 @@ import com.tangem.utils.converter.Converter
import com.tangem.utils.extensions.isPositive
import com.tangem.utils.extensions.isZero
import com.tangem.utils.extensions.orZero
import com.tangem.utils.logging.TangemLogger
import org.joda.time.DateTime
import org.joda.time.DateTimeZone
import timber.log.Timber
import java.util.Currency
internal class TangemPayTxHistoryItemConverter(moshi: Moshi) :
@ -26,7 +26,7 @@ internal class TangemPayTxHistoryItemConverter(moshi: Moshi) :
?: value.fee?.let { convertFee(id = value.id, fee = it) }
?: value.collateral?.let { convertCollateral(id = value.id, collateral = it) }
?: run {
Timber.wtf("unknown type of transaction: $value")
TangemLogger.e("unknown type of transaction: $value")
null
}
}
@ -82,7 +82,7 @@ internal class TangemPayTxHistoryItemConverter(moshi: Moshi) :
collateral: TangemPayTxHistoryResponse.Collateral,
): TangemPayTxHistoryItem.Collateral? {
val date = collateral.postedAt ?: return run {
Timber.e("Collateral transaction postedAt is null: $collateral")
TangemLogger.e("Collateral transaction postedAt is null: $collateral")
return@run null
}
return TangemPayTxHistoryItem.Collateral(

View file

@ -7,10 +7,10 @@ import com.tangem.datasource.api.visa.models.response.VisaTxHistoryResponse
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.visa.model.VisaTxHistoryItem
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.withContext
import timber.log.Timber
internal class VisaTxHistoryPagingSource(
params: Params,
@ -56,7 +56,7 @@ internal class VisaTxHistoryPagingSource(
LoadResult.Page(items, prevOffset, nextOffset)
} catch (e: Throwable) {
Timber.e(e, "Unable to load the transaction history for the requested offset: $offsetToLoad")
TangemLogger.e("Unable to load the transaction history for the requested offset: $offsetToLoad", e)
LoadResult.Error(e)
}
}

View file

@ -9,10 +9,10 @@ import com.reown.walletkit.client.WalletKit
import com.tangem.data.walletconnect.pair.WcPairSdkDelegate
import com.tangem.data.walletconnect.request.DefaultWcRequestService
import com.tangem.data.walletconnect.sessions.DefaultWcSessionsManager
import com.tangem.data.walletconnect.utils.WcSdkObserver
import com.tangem.data.walletconnect.utils.WC_TAG
import com.tangem.data.walletconnect.utils.WcSdkObserver
import com.tangem.domain.walletconnect.usecase.initialize.WcInitializeUseCase
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultWcInitializeUseCase(
private val application: Application,
@ -48,7 +48,7 @@ internal class DefaultWcInitializeUseCase(
application = application,
metaData = appMetaData,
) { error ->
Timber.tag(WC_TAG).e("Error while initializing client: $error")
TangemLogger.withTag(WC_TAG).e("Error while initializing client: $error")
}
WalletKit.initialize(
@ -57,10 +57,10 @@ internal class DefaultWcInitializeUseCase(
val walletDelegate = defineWalletDelegate()
WalletKit.setWalletDelegate(walletDelegate)
wcSdkObservers.forEach { it.onWcSdkInit() }
Timber.tag(WC_TAG).i("onWcSdkInit")
TangemLogger.withTag(WC_TAG).i("onWcSdkInit")
},
onError = { error ->
Timber.tag(WC_TAG).e("Error while initializing Web3Wallet: $error")
TangemLogger.withTag(WC_TAG).e("Error while initializing Web3Wallet: $error")
},
)
}
@ -70,32 +70,32 @@ internal class DefaultWcInitializeUseCase(
get() = super.onSessionAuthenticate
override fun onConnectionStateChange(state: Wallet.Model.ConnectionState) {
Timber.tag(WC_TAG).i("sdk callback onConnectionStateChange isAvailable=${state.isAvailable}")
TangemLogger.withTag(WC_TAG).i("sdk callback onConnectionStateChange isAvailable=${state.isAvailable}")
wcSdkObservers.forEach { it.onConnectionStateChange(state) }
}
override fun onError(error: Wallet.Model.Error) {
Timber.tag(WC_TAG).e(error.throwable, "sdk callback onError")
TangemLogger.withTag(WC_TAG).e("sdk callback onError", error.throwable)
wcSdkObservers.forEach { it.onError(error) }
}
override fun onProposalExpired(proposal: Wallet.Model.ExpiredProposal) {
Timber.tag(WC_TAG).i("sdk callback onProposalExpired $proposal")
TangemLogger.withTag(WC_TAG).i("sdk callback onProposalExpired $proposal")
wcSdkObservers.forEach { it.onProposalExpired(proposal) }
}
override fun onRequestExpired(request: Wallet.Model.ExpiredRequest) {
Timber.tag(WC_TAG).i("sdk callback onRequestExpired $request")
TangemLogger.withTag(WC_TAG).i("sdk callback onRequestExpired $request")
wcSdkObservers.forEach { it.onRequestExpired(request) }
}
override fun onSessionDelete(sessionDelete: Wallet.Model.SessionDelete) {
Timber.tag(WC_TAG).i("sdk callback onSessionDelete $sessionDelete")
TangemLogger.withTag(WC_TAG).i("sdk callback onSessionDelete $sessionDelete")
wcSdkObservers.forEach { it.onSessionDelete(sessionDelete) }
}
override fun onSessionExtend(session: Wallet.Model.Session) {
Timber.tag(WC_TAG).i("sdk callback onSessionExtend $session")
TangemLogger.withTag(WC_TAG).i("sdk callback onSessionExtend $session")
wcSdkObservers.forEach { it.onSessionExtend(session) }
}
@ -103,7 +103,7 @@ internal class DefaultWcInitializeUseCase(
sessionProposal: Wallet.Model.SessionProposal,
verifyContext: Wallet.Model.VerifyContext,
) {
Timber.tag(WC_TAG).i("sdk callback onSessionProposal $sessionProposal")
TangemLogger.withTag(WC_TAG).i("sdk callback onSessionProposal $sessionProposal")
wcSdkObservers.forEach { it.onSessionProposal(sessionProposal, verifyContext) }
}
@ -111,17 +111,17 @@ internal class DefaultWcInitializeUseCase(
sessionRequest: Wallet.Model.SessionRequest,
verifyContext: Wallet.Model.VerifyContext,
) {
Timber.tag(WC_TAG).i("sdk callback onSessionRequest $sessionRequest")
TangemLogger.withTag(WC_TAG).i("sdk callback onSessionRequest $sessionRequest")
wcSdkObservers.forEach { it.onSessionRequest(sessionRequest, verifyContext) }
}
override fun onSessionSettleResponse(settleSessionResponse: Wallet.Model.SettledSessionResponse) {
Timber.tag(WC_TAG).i("sdk callback onSessionSettleResponse $settleSessionResponse")
TangemLogger.withTag(WC_TAG).i("sdk callback onSessionSettleResponse $settleSessionResponse")
wcSdkObservers.forEach { it.onSessionSettleResponse(settleSessionResponse) }
}
override fun onSessionUpdateResponse(sessionUpdateResponse: Wallet.Model.SessionUpdateResponse) {
Timber.tag(WC_TAG).i("sdk callback onSessionUpdateResponse $sessionUpdateResponse")
TangemLogger.withTag(WC_TAG).i("sdk callback onSessionUpdateResponse $sessionUpdateResponse")
wcSdkObservers.forEach { it.onSessionUpdateResponse(sessionUpdateResponse) }
}
}

View file

@ -1,17 +1,17 @@
package com.tangem.data.walletconnect.network.solana
import com.tangem.blockchain.extensions.decodeBase58
import com.tangem.data.walletconnect.utils.WC_TAG
import com.tangem.blockchain.extensions.encodeBase64NoWrap
import com.tangem.data.walletconnect.utils.WC_TAG
import com.tangem.utils.converter.Converter
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
internal class SolanaBlockAidAddressConverter @Inject constructor() : Converter<String, String?> {
override fun convert(value: String): String? {
return value.decodeBase58()?.encodeBase64NoWrap() ?: run {
Timber.tag(WC_TAG).e("Error while converting Solana transaction account address")
TangemLogger.withTag(WC_TAG).e("Error while converting Solana transaction account address")
null
}
}

View file

@ -22,13 +22,13 @@ import com.tangem.domain.walletconnect.usecase.method.SignRequirements
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase
import com.tangem.lib.crypto.BlockchainUtils.SOLANA_TRANSACTION_SIZE_THRESHOLD_BYTES
import com.tangem.utils.logging.TangemLogger
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import okio.ByteString.Companion.decodeBase64
import timber.log.Timber
@Suppress("LongParameterList")
internal class WcSolanaSignTransactionUseCase @AssistedInject constructor(
@ -57,13 +57,13 @@ internal class WcSolanaSignTransactionUseCase @AssistedInject constructor(
val formattedHash = getFormattedHash(hash) // uses for flow sendLargeSolanaTransaction
if (context.session.wallet is UserWallet.Cold && isLargeHash(formattedHash)) {
// workaround for large transactions that cannot be signed directly by card
Timber.w("The transaction hash is too large to be signed directly: ${formattedHash.size} bytes")
TangemLogger.w("The transaction hash is too large to be signed directly: ${formattedHash.size} bytes")
sendLargeSolanaTransactionUseCase(context.session.wallet as UserWallet.Cold, context.network, formattedHash)
.fold(
ifLeft = {
ifLeft = { error ->
analytics.send(SolanaLargeTransactionStatus(SolanaLargeTransactionStatus.Status.Failed))
Timber.e(it.toString())
emit(state.toResult(parseSendError(it).left()))
TangemLogger.e(error.toString())
emit(state.toResult(parseSendError(error).left()))
},
ifRight = {
analytics.send(SolanaLargeTransactionStatus(SolanaLargeTransactionStatus.Status.Success))
@ -115,7 +115,7 @@ internal class WcSolanaSignTransactionUseCase @AssistedInject constructor(
return try {
SolanaTransactionHelper.removeSignaturesPlaceholders(hash)
} catch (e: Exception) {
Timber.e("Failed to format the hash: ${e.message}")
TangemLogger.e("Failed to format the hash: ${e.message}")
hash
}
}

View file

@ -16,6 +16,7 @@ import com.tangem.domain.walletconnect.model.*
import com.tangem.domain.walletconnect.model.sdkcopy.WcAppMetaData
import com.tangem.domain.walletconnect.usecase.pair.WcPairState
import com.tangem.domain.walletconnect.usecase.pair.WcPairUseCase
import com.tangem.utils.logging.TangemLogger
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
@ -24,7 +25,6 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.*
import org.joda.time.DateTime
import org.joda.time.Duration
import timber.log.Timber
import java.net.URI
@Suppress("LongParameterList")
@ -42,7 +42,7 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
@Suppress("LongMethod")
override operator fun invoke(): Flow<WcPairState> {
return flow {
Timber.tag(WC_TAG).i("start pair flow $pairRequest")
TangemLogger.withTag(WC_TAG).i("start pair flow $pairRequest")
analytics.send(
WcAnalyticEvents.NewPairInitiated(
source = pairRequest.source,
@ -52,22 +52,22 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
emit(WcPairState.Loading)
val pairResult = sdkDelegate.pair(pairRequest.uri)
.onLeft {
Timber.tag(WC_TAG).e(it, "Failed to call pair $pairRequest")
.onLeft { error ->
TangemLogger.withTag(WC_TAG).e("Failed to call pair $pairRequest", error)
analytics.send(
WcAnalyticEvents.PairFailed(
errorCode = it.code,
errorMessage = it.message,
errorCode = error.code,
errorMessage = error.message,
),
)
emit(WcPairState.Error(it))
emit(WcPairState.Error(error))
}
.getOrNull() ?: return@flow
val (sdkSessionProposal, sdkVerifyContext) = pairResult
// check unsupported dApps, just local constant for now, finish if unsupported
if (UnsupportedDApps.list.any { sdkSessionProposal.url.contains(it, ignoreCase = true) }) {
Timber.tag(WC_TAG).i("Unsupported DApp ${sdkSessionProposal.name}")
TangemLogger.withTag(WC_TAG).i("Unsupported DApp ${sdkSessionProposal.name}")
val error = WcPairState.Error(WcPairError.UnsupportedDApp(sdkSessionProposal.name))
emit(error)
return@flow
@ -93,7 +93,7 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
emit(proposalState)
// wait first terminal action and continue WC pair flow
Timber.tag(WC_TAG).i("pair wait terminal action ${sdkSessionProposal.name}")
TangemLogger.withTag(WC_TAG).i("pair wait terminal action ${sdkSessionProposal.name}")
val terminalAction = onCallTerminalAction.receiveAsFlow().first()
val sessionForApprove: WcSessionApprove? = when (terminalAction) {
is TerminalAction.Approve -> terminalAction.sessionForApprove
@ -139,30 +139,30 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
),
)
proposalState.dAppSession.dAppMetaData
}.onLeft {
}.onLeft { error ->
analytics.send(
WcAnalyticEvents.DAppConnectionFailed(
errorCode = it.code,
errorMessage = it.message,
errorCode = error.code,
errorMessage = error.message,
),
)
sdkDelegate.rejectSession(sdkSessionProposal.proposerPublicKey)
Timber.tag(WC_TAG).e(it, "Failed to approve session ${sdkSessionProposal.name}")
TangemLogger.withTag(WC_TAG).e("Failed to approve session ${sdkSessionProposal.name}", error)
}
emit(WcPairState.Approving.Result(sessionForApprove, either))
}
.catch {
val pairError: WcPairError = when (it) {
is TimeoutCancellationException -> WcPairError.TimeoutException(it.message.orEmpty())
else -> WcPairError.Unknown(it.message.orEmpty())
.catch { throwable ->
val pairError: WcPairError = when (throwable) {
is TimeoutCancellationException -> WcPairError.TimeoutException(throwable.message.orEmpty())
else -> WcPairError.Unknown(throwable.message.orEmpty())
}
emit(WcPairState.Error(pairError))
}
.onCompletion {
if (it != null) {
Timber.tag(WC_TAG).e(it, "Completed with error $pairRequest")
.onCompletion { throwable ->
if (throwable != null) {
TangemLogger.withTag(WC_TAG).e("Completed with error $pairRequest", throwable)
} else {
Timber.tag(WC_TAG).i("Completed successfully $pairRequest")
TangemLogger.withTag(WC_TAG).i("Completed successfully $pairRequest")
}
}
}
@ -191,7 +191,7 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
)
sdkDelegate.approve(pendingSessionForSave, sessionApprove)
} catch (e: Throwable) {
Timber.tag(WC_TAG).e(e, "Failed to sdk approve session $pairRequest")
TangemLogger.withTag(WC_TAG).e("Failed to sdk approve session $pairRequest", e)
WcPairError.ApprovalFailed(e.message.orEmpty()).left()
}
@ -203,8 +203,8 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
val verificationInfo = when {
verifyContext.validation == Wallet.Model.Validation.INVALID -> CheckDAppResult.UNSAFE
verifyContext.isScam == true -> CheckDAppResult.UNSAFE
else -> blockAidVerifier.verifyDApp(DAppData(sessionProposal.url)).getOrElse {
Timber.tag(WC_TAG).e(it, "Failed to verify DApp ${sessionProposal.name}")
else -> blockAidVerifier.verifyDApp(DAppData(sessionProposal.url)).getOrElse { error ->
TangemLogger.withTag(WC_TAG).e("Failed to verify DApp ${sessionProposal.name}", error)
CheckDAppResult.FAILED_TO_VERIFY
}
}

View file

@ -7,17 +7,17 @@ import com.reown.walletkit.client.Wallet
import com.reown.walletkit.client.WalletKit
import com.tangem.data.walletconnect.utils.WC_TAG
import com.tangem.data.walletconnect.utils.WcSdkObserver
import com.tangem.datasource.local.walletconnect.WalletConnectStore
import com.tangem.data.walletconnect.utils.getDappOriginUrl
import com.tangem.datasource.local.walletconnect.WalletConnectStore
import com.tangem.domain.walletconnect.model.WcPairError
import com.tangem.domain.walletconnect.model.WcPairError.ApprovalFailed
import com.tangem.domain.walletconnect.model.WcPendingApprovalSessionDTO
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.*
import timber.log.Timber
import kotlin.coroutines.resume
import kotlin.time.Duration.Companion.seconds
@ -91,7 +91,7 @@ internal class WcPairSdkDelegate(
}
fun rejectSession(proposerPublicKey: String) {
Timber.tag(WC_TAG).i("reject session proposerPublicKey = $proposerPublicKey")
TangemLogger.withTag(WC_TAG).i("reject session proposerPublicKey = $proposerPublicKey")
WalletKit.rejectSession(
params = Wallet.Params.SessionReject(
proposerPublicKey = proposerPublicKey,

View file

@ -9,10 +9,10 @@ import com.tangem.data.walletconnect.utils.getDappOriginUrl
import com.tangem.domain.walletconnect.WcRequestService
import com.tangem.domain.walletconnect.model.WcMethodName
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.*
import org.joda.time.DateTime
import timber.log.Timber
internal class DefaultWcRequestService(
private val requestConverters: Set<WcRequestToUseCaseConverter>,
@ -35,10 +35,10 @@ internal class DefaultWcRequestService(
sessionRequest = sessionRequest,
),
)
Timber.tag(WC_TAG).i("handle request $sr")
TangemLogger.withTag(WC_TAG).i("handle request $sr")
val name = requestConverters.firstNotNullOfOrNull { it.toWcMethodName(sr) }
?: WcMethodName.Unsupported(sr.request.method)
Timber.tag(WC_TAG).i("handle request name $name")
TangemLogger.withTag(WC_TAG).i("handle request name $name")
if (name is WcMethodName.Unsupported) {
respondService.rejectRequestNonBlock(sr)
if (name.raw.startsWith("wallet_")) return
@ -56,7 +56,7 @@ internal class DefaultWcRequestService(
val noHaveCached = cachedRequest.none { (_, hashParams) -> hash == hashParams }
if (!noHaveCached) {
Timber.tag(WC_TAG).i("filter request $request")
TangemLogger.withTag(WC_TAG).i("filter request $request")
}
return noHaveCached
}

View file

@ -13,7 +13,7 @@ import com.tangem.domain.walletconnect.model.WcMethod
import com.tangem.domain.walletconnect.model.WcRequestError.Companion.code
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
internal class DefaultWcRequestUseCaseFactory @Inject constructor(
@ -32,9 +32,9 @@ internal class DefaultWcRequestUseCaseFactory @Inject constructor(
?: HandleMethodError.UnknownError("Failed to create WcUseCase").left()
val result = useCase.fold(
ifLeft = {
Timber.tag(WC_TAG).e("$it")
it.left()
ifLeft = { methodError ->
TangemLogger.withTag(WC_TAG).e("$methodError")
methodError.left()
},
ifRight = { (it as? T)?.right() ?: HandleMethodError.Unsupported(WcMethod.Unsupported(request)).left() },
)

View file

@ -10,11 +10,11 @@ import com.tangem.common.extensions.toHexString
import com.tangem.data.walletconnect.utils.WC_TAG
import com.tangem.domain.walletconnect.model.WcRequestError
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.suspendCancellableCoroutine
import org.joda.time.Duration
import timber.log.Timber
import kotlin.coroutines.resume
internal class DefaultWcRespondService : WcRespondService {
@ -36,21 +36,21 @@ internal class DefaultWcRespondService : WcRespondService {
result = response,
),
),
onSuccess = {
onSuccess = { requestResponse ->
if (continuation.isCompleted) return@respondSessionRequest
val result = when (val response = it.jsonRpcResponse) {
val result = when (val response = requestResponse.jsonRpcResponse) {
is Wallet.Model.JsonRpcResponse.JsonRpcError -> {
Timber.tag(WC_TAG).e("Failed respond $response for request $request")
TangemLogger.withTag(WC_TAG).e("Failed respond $response for request $request")
WcRequestError.WcRespondError(
code = response.code,
message = response.message,
).left()
}
is Wallet.Model.JsonRpcResponse.JsonRpcResult -> {
Timber.tag(WC_TAG).i("Successful respond $response for request $request")
TangemLogger.withTag(WC_TAG).i("Successful respond $response for request $request")
if (response.result == null) {
Timber.tag(WC_TAG).e(
"Response result is null, but it should be String. Casted to empty",
TangemLogger.withTag(WC_TAG).e(
"Response result is null, but requestResponse should be String. Casted to empty",
)
}
(response.result ?: "").right()
@ -58,16 +58,16 @@ internal class DefaultWcRespondService : WcRespondService {
}
continuation.resume(result)
},
onError = {
onError = { error ->
if (continuation.isCompleted) return@respondSessionRequest
Timber.tag(WC_TAG).e(it.throwable, "Failed respond for request $request")
continuation.resume(WcRequestError.UnknownError(it.throwable).left())
TangemLogger.withTag(WC_TAG).e("Failed respond for request $request", error.throwable)
continuation.resume(WcRequestError.UnknownError(error.throwable).left())
},
)
}
override fun rejectRequestNonBlock(request: WcSdkSessionRequest, message: String) {
Timber.tag(WC_TAG).i("reject request $request")
TangemLogger.withTag(WC_TAG).i("reject request $request")
removeCachedRequest(request)
WalletKit.respondSessionRequest(
params = Wallet.Params.SessionRequestResponse(

View file

@ -23,13 +23,13 @@ import com.tangem.domain.walletconnect.repository.WcSessionsManager
import com.tangem.domain.wallets.usecase.GetWalletsUseCase
import com.tangem.utils.coroutines.AppCoroutineScope
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.joinAll
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
import timber.log.Timber
import kotlin.coroutines.resume
@Suppress("LongParameterList")
@ -91,7 +91,7 @@ internal class DefaultWcSessionsManager(
}
override fun onSessionDelete(sessionDelete: Wallet.Model.SessionDelete) {
Timber.i("onSessionDelete: $sessionDelete")
TangemLogger.i("onSessionDelete: $sessionDelete")
onSessionDelete.trySend(sessionDelete)
}
@ -150,7 +150,7 @@ internal class DefaultWcSessionsManager(
val haveSomeUnknownSdkSessions = unknownSdkSessions.isNotEmpty()
if (haveSomeUnknown) {
Timber.tag(WC_TAG).i("removeUnknownSessions $unknownStoredSessions")
TangemLogger.withTag(WC_TAG).i("removeUnknownSessions $unknownStoredSessions")
store.removeSessions(unknownStoredSessions.toSet())
}
@ -162,7 +162,7 @@ internal class DefaultWcSessionsManager(
val haveEmptyDto = emptyNetworksDto.isNotEmpty()
if (haveEmptyDto) {
Timber.tag(WC_TAG).i("remove sessions without networks $emptyNetworksDto")
TangemLogger.withTag(WC_TAG).i("remove sessions without networks $emptyNetworksDto")
store.removeSessions(emptyNetworksDto)
}
if (haveEmptySessions) {

View file

@ -11,8 +11,8 @@ import com.tangem.domain.walletconnect.model.WcMethod
import com.tangem.domain.walletconnect.model.WcSession
import com.tangem.domain.walletconnect.model.WcSolanaMethod
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.flow
import timber.log.Timber
import javax.inject.Inject
internal class BlockAidVerificationDelegate @Inject constructor(
@ -72,9 +72,9 @@ internal class BlockAidVerificationDelegate @Inject constructor(
params = params,
),
).fold(
ifLeft = {
Timber.e("Failed to verify transaction: ${it.localizedMessage}")
emit(Lce.Error(it))
ifLeft = { throwable ->
TangemLogger.e("Failed to verify transaction: ${throwable.localizedMessage}")
emit(Lce.Error(throwable))
},
ifRight = {
emit(Lce.Content(it))

View file

@ -43,7 +43,6 @@ dependencies {
implementation(projects.libs.blockchainSdk)
implementation(deps.androidx.datastore)
implementation(deps.arrow.core)
implementation(deps.timber)
/** Testing libraries */
testRuntimeOnly(deps.test.junit5.engine)

View file

@ -49,11 +49,11 @@ import com.tangem.domain.walletmanager.model.TokenInfo
import com.tangem.domain.walletmanager.utils.SdkPageConverter
import com.tangem.domain.wallets.extension.hasDerivation
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.math.BigDecimal
import java.util.EnumSet
import java.util.concurrent.ConcurrentHashMap
@ -178,13 +178,13 @@ internal class DefaultWalletManagersFacade @Inject constructor(
if (derivationPath != null &&
!userWallet.hasDerivation(blockchain, derivationPath)
) {
Timber.w("Derivation missed for: $blockchain")
TangemLogger.w("Derivation missed for: $blockchain")
return UpdateWalletManagerResult.MissedDerivation
}
val walletManager = getOrCreateWalletManager(userWalletId, blockchain, derivationPath)
if (walletManager == null || blockchain == Blockchain.Unknown) {
Timber.w("Unable to get a wallet manager for blockchain: $blockchain")
TangemLogger.w("Unable to get a wallet manager for blockchain: $blockchain")
return UpdateWalletManagerResult.Unreachable()
}
@ -285,7 +285,7 @@ internal class DefaultWalletManagersFacade @Inject constructor(
val gaslessFeeAddresses = try {
gaslessTransactionRepository.getGaslessFeeAddresses()
} catch (error: Throwable) {
Timber.e(error, "Failed to load gasless fee addresses; falling back to empty set")
TangemLogger.e("Failed to load gasless fee addresses; falling back to empty set", error)
emptySet()
}
return when (itemsResult) {
@ -311,7 +311,7 @@ internal class DefaultWalletManagersFacade @Inject constructor(
extraTokens: Set<CryptoCurrency.Token>,
): UpdateWalletManagerResult {
if (derivationPath != null && !userWallet.hasDerivation(blockchain, derivationPath)) {
Timber.w("Derivation missed for: $blockchain")
TangemLogger.w("Derivation missed for: $blockchain")
return UpdateWalletManagerResult.MissedDerivation
}
@ -321,7 +321,7 @@ internal class DefaultWalletManagersFacade @Inject constructor(
derivationPath = derivationPath,
)
if (walletManager == null || blockchain == Blockchain.Unknown) {
Timber.w("Unable to create or find a wallet manager for blockchain: $blockchain")
TangemLogger.w("Unable to create or find a wallet manager for blockchain: $blockchain")
return UpdateWalletManagerResult.Unreachable()
}
@ -360,7 +360,7 @@ internal class DefaultWalletManagersFacade @Inject constructor(
amountToCreateAccount = e.amountToCreateAccount,
)
} catch (e: Throwable) {
Timber.w(e, "Unable to update a wallet manager for: ${walletManager.wallet.blockchain}")
TangemLogger.w("Unable to update a wallet manager for: ${walletManager.wallet.blockchain}", e)
resultFactory.getUnreachableResult(walletManager)
}
@ -376,7 +376,7 @@ internal class DefaultWalletManagersFacade @Inject constructor(
amountToCreateAccount = e.amountToCreateAccount,
)
} catch (e: Throwable) {
Timber.w(e, "Unable to update a wallet manager for: ${walletManager.wallet.blockchain}")
TangemLogger.w("Unable to update a wallet manager for: ${walletManager.wallet.blockchain}", e)
resultFactory.getUnreachableResult(walletManager)
}
@ -584,7 +584,7 @@ internal class DefaultWalletManagersFacade @Inject constructor(
val walletManager = getOrCreateWalletManager(userWalletId = userWalletId, network = currency.network)
if (walletManager == null) {
Timber.e("Unable to get a wallet manager for blockchain: ${currency.network.id}")
TangemLogger.e("Unable to get a wallet manager for blockchain: ${currency.network.id}")
return emptyList()
}

View file

@ -8,7 +8,7 @@ import com.tangem.data.walletmanager.utils.SdkAddressToAddressConverter
import com.tangem.data.walletmanager.utils.TransactionDataToTxHistoryItemConverter
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.yield.supply.YieldSupplyStatus
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
/** Factory for creating [UpdateWalletManagerResult] */
@ -68,7 +68,7 @@ internal class UpdateWalletManagerResultFactory {
val amount = amountToCreateAccount ?: blockchain.amountToCreateAccount(walletManager, firstWalletToken)
return if (amount == null) {
Timber.w("Unable to get required amount to create account for: $blockchain")
TangemLogger.w("Unable to get required amount to create account for: $blockchain")
UpdateWalletManagerResult.Unreachable(
selectedAddress = wallet.address,
addresses = getAvailableAddresses(wallet.addresses),
@ -142,7 +142,7 @@ internal class UpdateWalletManagerResultFactory {
val value = amount.value
if (value == null) {
Timber.w("Currency amount must not be null: ${amount.currencySymbol}")
TangemLogger.w("Currency amount must not be null: ${amount.currencySymbol}")
}
return value

View file

@ -7,12 +7,12 @@ import com.tangem.blockchainsdk.BlockchainSDKFactory
import com.tangem.crypto.hdWallet.DerivationPath
import com.tangem.data.walletmanager.extensions.makePublicKey
import com.tangem.data.walletmanager.extensions.makeWalletManagerForApp
import com.tangem.domain.wallets.derivations.DerivationStyleProvider
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.wallets.config.curvesConfig
import com.tangem.domain.wallets.derivations.DerivationStyleProvider
import com.tangem.domain.wallets.derivations.derivationStyleProvider
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class WalletManagerFactory(
private val blockchainSDKFactory: BlockchainSDKFactory,
@ -32,7 +32,7 @@ internal class WalletManagerFactory(
derivationParams = derivationParams,
)
} catch (e: Throwable) {
Timber.w(e, "Failed to create wallet manager for $blockchain")
TangemLogger.w("Failed to create wallet manager for $blockchain", e)
null
}
}
@ -68,7 +68,7 @@ internal class WalletManagerFactory(
)
}
} catch (e: Throwable) {
Timber.w(e, "Failed to create wallet manager for $blockchain")
TangemLogger.w("Failed to create wallet manager for $blockchain", e)
null
}
}

View file

@ -11,7 +11,7 @@ import com.tangem.blockchain.yieldsupply.providers.ethereum.yield.EthereumYieldS
import com.tangem.blockchainsdk.models.UpdateWalletManagerResult.Address
import com.tangem.domain.models.network.TxInfo
import com.tangem.utils.converter.Converter
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
/**
@ -55,7 +55,7 @@ internal class TransactionDataToTxHistoryItemConverter(
val value = amount.value
if (value == null) {
Timber.w("Transaction amount must not be null: ${amount.currencySymbol}")
TangemLogger.w("Transaction amount must not be null: ${amount.currencySymbol}")
}
return when (feePaidCurrency) {

View file

@ -48,7 +48,6 @@ dependencies {
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(deps.retrofit)
implementation(deps.timber)
/** tests */
testImplementation(projects.test.core)

View file

@ -14,8 +14,8 @@ import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.wallets.models.AppsFlyerConversionData
import com.tangem.domain.wallets.repository.WalletsPromoRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withContext
import timber.log.Timber
internal class DefaultWalletsPromoRepository(
private val appPreferencesStore: AppPreferencesStore,
@ -47,7 +47,7 @@ internal class DefaultWalletsPromoRepository(
if (savedBindingData != null) {
bind(refcode = savedBindingData.refcode, campaign = savedBindingData.campaign)
} else {
Timber.i("retryBindRefcodeWithWallets: Binding data isn't required")
TangemLogger.i("retryBindRefcodeWithWallets: Binding data isn't required")
}
}

View file

@ -20,8 +20,8 @@ import com.tangem.domain.wallets.usecase.BackendId
import com.tangem.operations.derivation.ExtendedPublicKeysMap
import com.tangem.sdk.api.TangemSdkManager
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
private typealias DerivedKeys = Map<ByteArrayKey, ExtendedPublicKeysMap>
@ -60,14 +60,14 @@ internal class DefaultColdMapDerivationsRepository @Inject constructor(
networks: List<Network>,
): UserWallet.Cold = withContext(dispatchers.io) {
if (!userWallet.scanResponse.card.settings.isHDWalletAllowed) {
Timber.d("Nothing to derive")
TangemLogger.d("Nothing to derive")
return@withContext userWallet
}
val derivations = MissedDerivationsFinder(userWallet)
.findByNetworks(networks)
.ifEmpty {
Timber.d("Nothing to derive")
TangemLogger.d("Nothing to derive")
return@withContext userWallet
}

View file

@ -16,8 +16,8 @@ import com.tangem.domain.wallets.derivations.HotMapDerivationsRepository
import com.tangem.domain.wallets.usecase.BackendId
import com.tangem.operations.derivation.ExtendedPublicKeysMap
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
internal class DefaultDerivationsRepository @Inject constructor(
@ -29,7 +29,7 @@ internal class DefaultDerivationsRepository @Inject constructor(
override suspend fun derivePublicKeys(userWalletId: UserWalletId, currencies: List<CryptoCurrency>) {
if (currencies.isEmpty()) {
Timber.d("Nothing to derive")
TangemLogger.d("Nothing to derive")
return
}

View file

@ -19,8 +19,8 @@ import com.tangem.domain.wallets.usecase.BackendId
import com.tangem.hot.sdk.model.DeriveWalletRequest
import com.tangem.operations.derivation.ExtendedPublicKeysMap
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
internal class DefaultHotMapDerivationsRepository @Inject constructor(
@ -62,7 +62,7 @@ internal class DefaultHotMapDerivationsRepository @Inject constructor(
val derivations = MissedDerivationsFinder(userWallet)
.findByNetworks(networks)
.ifEmpty {
Timber.d("Nothing to derive")
TangemLogger.d("Nothing to derive")
return@withContext userWallet
}

View file

@ -9,10 +9,10 @@ import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.wallets.hot.HotWalletAccessor
import com.tangem.hot.sdk.model.DataToSign
import com.tangem.operations.sign.SignData
import com.tangem.utils.logging.TangemLogger
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import timber.log.Timber
class TangemHotWalletSigner @AssistedInject constructor(
@Assisted private val userWallet: UserWallet.Hot,
@ -43,12 +43,12 @@ class TangemHotWalletSigner @AssistedInject constructor(
),
),
)
}.getOrElse {
Timber.e(it)
return if (it is TangemSdkError) {
CompletionResult.Failure(it)
}.getOrElse { throwable ->
TangemLogger.e("Error", throwable)
return if (throwable is TangemSdkError) {
CompletionResult.Failure(throwable)
} else {
CompletionResult.Failure(TangemSdkError.ExceptionError(it))
CompletionResult.Failure(TangemSdkError.ExceptionError(throwable))
}
}
@ -76,12 +76,12 @@ class TangemHotWalletSigner @AssistedInject constructor(
)
},
)
}.getOrElse {
Timber.e(it)
return if (it is TangemSdkError) {
CompletionResult.Failure(it)
}.getOrElse { throwable ->
TangemLogger.e("Error", throwable)
return if (throwable is TangemSdkError) {
CompletionResult.Failure(throwable)
} else {
CompletionResult.Failure(TangemSdkError.ExceptionError(it))
CompletionResult.Failure(TangemSdkError.ExceptionError(throwable))
}
}

View file

@ -43,7 +43,6 @@ dependencies {
kapt(deps.hilt.kapt)
/** Other */
implementation(deps.timber)
/** tests */
testImplementation(projects.common.test)

Some files were not shown because too many files have changed in this diff Show more