Updated on 2026-08-14

This commit is contained in:
Tangem 2024-08-13 17:05:35 +03:00
parent 42f276c56f
commit ca7088e2f5
14 changed files with 87 additions and 58 deletions

View file

@ -35,7 +35,7 @@ internal class LockUserWalletsTimer(
val wasApplicationStopped = settingsRepository.wasApplicationStopped()
val shouldOpenWelcomeScreenOnResume = settingsRepository.shouldOpenWelcomeScreenOnResume()
Timber.d(
Timber.i(
"""
Owner resumed
|- Was stopped: $wasApplicationStopped
@ -55,7 +55,7 @@ internal class LockUserWalletsTimer(
}
override fun onStop(owner: LifecycleOwner) {
Timber.d("Owner stopped")
Timber.i("Owner stopped")
owner.lifecycleScope.launch {
settingsRepository.setWasApplicationStopped(value = true)
@ -63,13 +63,13 @@ internal class LockUserWalletsTimer(
}
override fun onDestroy(owner: LifecycleOwner) {
Timber.d("Owner destroyed")
Timber.i("Owner destroyed")
stop()
}
fun restart() {
if (delayJob == null) return
Timber.d(
Timber.i(
"""
Timer restart
|- Duration millis: ${duration.inWholeMilliseconds}
@ -80,7 +80,7 @@ internal class LockUserWalletsTimer(
private fun start(log: Boolean = true) {
if (log) {
Timber.d(
Timber.i(
"""
Timer start
|- Duration millis: ${duration.inWholeMilliseconds}
@ -92,7 +92,7 @@ internal class LockUserWalletsTimer(
private fun stop(log: Boolean = true) {
if (log) {
Timber.d(
Timber.i(
"""
Timer stop
|- Was started: ${delayJob?.isActive ?: false}
@ -114,7 +114,7 @@ internal class LockUserWalletsTimer(
val currentTime = System.currentTimeMillis()
val wasApplicationStopped = settingsRepository.wasApplicationStopped()
Timber.d(
Timber.i(
"""
Finished
|- App is stopped: $wasApplicationStopped

View file

@ -12,12 +12,12 @@ fun FragmentManager.showFragmentAllowingStateLoss(name: String, fragmentProvider
val currentFragmentName = getBackStackEntryAt(backStackEntryCount - 1).name
if (name == currentFragmentName) {
Timber.d("Fragment $name is already at the top of the stack")
Timber.i("Fragment $name is already at the top of the stack")
return
}
}
Timber.d("Showing $name route")
Timber.i("Showing $name route")
val isPoppedBack = popBackStackImmediate(name, 0)
@ -30,9 +30,9 @@ fun FragmentManager.showFragmentAllowingStateLoss(name: String, fragmentProvider
fragment.showFragment(fragmentManager = this, name)
}
Timber.d("Route $name is shown")
Timber.i("Route $name is shown")
} else {
Timber.d("Route $name is found in backstack and shown")
Timber.i("Route $name is found in backstack and shown")
}
}

View file

@ -1,19 +1,15 @@
package com.tangem.tap.common.redux
import com.tangem.domain.common.LogConfig
import org.rekotlin.Middleware
import timber.log.Timber
/**
[REDACTED_AUTHOR]
*/
val logMiddleware: Middleware<AppState> = { dispatch, appState ->
val logMiddleware: Middleware<AppState> = { _, _ ->
{ nextDispatch ->
{ action ->
if (LogConfig.storeAction) {
Timber.d("Dispatch action: $action")
// printOnboardingWalletState()
}
Timber.i("Dispatch action: $action")
nextDispatch(action)
}
}

View file

@ -165,10 +165,10 @@ internal class GeneralUserWalletsListManager(
}
if (possibleManager == implementation.value) {
Timber.e("Switch to same manager ${possibleManager::class.simpleName}")
Timber.e("Switch to the same manager ${possibleManager::class.simpleName}")
}
Timber.d("Switch to ${possibleManager::class.simpleName}")
Timber.i("Switch to ${possibleManager::class.simpleName}")
val previousManager = implementation.value
implementation.value = copySelectedUserWallet(

View file

@ -62,7 +62,7 @@ internal class DefaultLegacyWalletConnectRepository(
application = application,
metaData = appMetaData,
) { error ->
Timber.d("Error while initializing client: $error")
Timber.e("Error while initializing client: $error")
scope.launch {
_events.emit(
WalletConnectEvents.SessionApprovalError(
@ -73,7 +73,7 @@ internal class DefaultLegacyWalletConnectRepository(
}
Web3Wallet.initialize(Wallet.Params.Init(core = CoreClient)) { error ->
Timber.d("Error while initializing Web3Wallet: $error")
Timber.e("Error while initializing Web3Wallet: $error")
scope.launch {
_events.emit(
WalletConnectEvents.SessionApprovalError(
@ -94,11 +94,11 @@ internal class DefaultLegacyWalletConnectRepository(
verifyContext: Wallet.Model.VerifyContext,
) {
// Triggered when wallet receives the session proposal sent by a Dapp
Timber.d("sessionProposal: $sessionProposal")
Timber.i("sessionProposal: $sessionProposal")
this@DefaultLegacyWalletConnectRepository.sessionProposal = sessionProposal
if (sessionProposal.name in unsupportedDApps) {
Timber.w("Unsupported DApp")
Timber.i("Unsupported DApp")
scope.launch {
_events.emit(
WalletConnectEvents.SessionApprovalError(
@ -115,7 +115,7 @@ internal class DefaultLegacyWalletConnectRepository(
)
if (missingNetworks.isNotEmpty()) {
Timber.w("Not added blockchains: $missingNetworks")
Timber.i("Not added blockchains: $missingNetworks")
scope.launch {
_events.emit(
WalletConnectEvents.SessionApprovalError(
@ -150,12 +150,12 @@ internal class DefaultLegacyWalletConnectRepository(
verifyContext: Wallet.Model.VerifyContext,
) {
// Triggered when a Dapp sends SessionRequest to sign a transaction or a message
Timber.d("sessionRequest: $sessionRequest")
Timber.i("sessionRequest: $sessionRequest")
val request = wcRequestDeserializer.deserialize(
method = sessionRequest.request.method,
params = sessionRequest.request.params,
)
Timber.d("sessionRequestParsed: $request")
Timber.i("sessionRequestParsed: $request")
when (request) {
is WcRequest.AddChain -> {
@ -193,7 +193,7 @@ internal class DefaultLegacyWalletConnectRepository(
verifyContext: Wallet.Model.VerifyContext,
) {
// Triggered when Dapp / Requester makes an authorization request
Timber.d("onAuthRequest: $authRequest")
Timber.i("onAuthRequest: $authRequest")
}
override fun onSessionDelete(sessionDelete: Wallet.Model.SessionDelete) {
@ -204,12 +204,12 @@ internal class DefaultLegacyWalletConnectRepository(
updateSessionsInternal().join()
}
}
Timber.d("onSessionDelete: $sessionDelete")
Timber.i("onSessionDelete: $sessionDelete")
}
override fun onSessionSettleResponse(settleSessionResponse: Wallet.Model.SettledSessionResponse) {
// Triggered when wallet receives the session settlement response from Dapp
Timber.d("onSessionSettleResponse: $settleSessionResponse")
Timber.i("onSessionSettleResponse: $settleSessionResponse")
if (settleSessionResponse is Wallet.Model.SettledSessionResponse.Result) {
scope.launch {
_events.emit(
@ -225,19 +225,19 @@ internal class DefaultLegacyWalletConnectRepository(
override fun onSessionUpdateResponse(sessionUpdateResponse: Wallet.Model.SessionUpdateResponse) {
// Triggered when wallet receives the session update response from Dapp
Timber.d("onSessionUpdateResponse: $sessionUpdateResponse")
Timber.i("onSessionUpdateResponse: $sessionUpdateResponse")
updateSessionsInternal()
}
override fun onConnectionStateChange(state: Wallet.Model.ConnectionState) {
// Triggered whenever the connection state is changed
Timber.d("onConnectionStateChange: $state")
Timber.i("onConnectionStateChange: $state")
if (state.isAvailable) updateSessionsInternal()
}
override fun onError(error: Wallet.Model.Error) {
// Triggered whenever there is an issue inside the SDK
Timber.d("onError: $error")
Timber.i("onError: $error")
}
}
}
@ -299,12 +299,12 @@ internal class DefaultLegacyWalletConnectRepository(
},
)
Timber.d("Session approval is prepared for sending: $sessionApproval")
Timber.i("Session approval is prepared for sending: $sessionApproval")
Web3Wallet.approveSession(
params = sessionApproval,
onSuccess = {
Timber.d("Approved successfully: $it")
Timber.i("Approved successfully: $it")
analyticsHandler.send(
WalletConnect.NewSessionEstablished(
dAppName = sessionProposal.name,
@ -313,7 +313,7 @@ internal class DefaultLegacyWalletConnectRepository(
)
},
onError = {
Timber.d("Error while approving: $it")
Timber.e("Error while approving: $it")
scope.launch {
_events.emit(
WalletConnectEvents.SessionApprovalError(
@ -370,10 +370,10 @@ internal class DefaultLegacyWalletConnectRepository(
),
),
onSuccess = { response ->
Timber.d("Session request responded successfully: $response")
Timber.i("Session request responded successfully: $response")
},
onError = { error ->
Timber.d(error.throwable, "Error while responging session request")
Timber.e(error.throwable, "Error while responging session request")
WalletConnect.RequestHandledParams(
dAppName = session?.name ?: "",
@ -427,10 +427,10 @@ internal class DefaultLegacyWalletConnectRepository(
reason = "",
),
onSuccess = {
Timber.d("Rejected successfully: $it")
Timber.i("Rejected successfully: $it")
},
onError = {
Timber.d("Error while rejecting: $it")
Timber.e("Error while rejecting: $it")
},
)
}
@ -447,10 +447,10 @@ internal class DefaultLegacyWalletConnectRepository(
),
)
updateSessionsInternal()
Timber.d("Disconnected successfully: $it")
Timber.i("Disconnected successfully: $it")
},
onError = {
Timber.d("Error while disconnecting: $it")
Timber.e("Error while disconnecting: $it")
},
)
}
@ -483,7 +483,7 @@ internal class DefaultLegacyWalletConnectRepository(
url = it.metaData?.url,
)
}
Timber.d("Available sessions: $availableSessions")
Timber.i("Available sessions: $availableSessions")
currentSessions = availableSessions
_activeSessions.emit(availableSessions)
}

View file

@ -35,7 +35,7 @@ class WalletConnectInteractor(
val blockchainHelper: WcBlockchainHelper,
) {
var isWalletConnectReadyForDeepLinks = false
private var isWalletConnectReadyForDeepLinks = false
private val getSelectedWalletUseCase by lazy(LazyThreadSafetyMode.NONE) {
GetSelectedWalletUseCase(userWalletsListManager)
@ -82,7 +82,7 @@ class WalletConnectInteractor(
private suspend fun initWithWallet(userWallet: UserWallet) {
if (userWallet.isMultiCurrency) {
Timber.d("WalletConnect: initialize and setup networks for ${userWallet.walletId}")
Timber.i("WalletConnect: initialize and setup networks for ${userWallet.walletId}")
startListeningWc(userWallet.walletId.stringValue, getCardId(userWallet))
subscribeOnCurrenciesUpdates(userWallet)
}
@ -143,9 +143,9 @@ class WalletConnectInteractor(
private suspend fun subscribeToEvents() {
events
.onEach { wcEvent ->
Timber.i("WalletConnect: event: $wcEvent")
when (wcEvent) {
is WalletConnectEvents.SessionProposal -> {
Timber.d("WC session proposal event received")
val unsupportedNetworks = wcEvent.requiredChainIds
.filter { blockchainHelper.chainIdToNetworkIdOrNull(it) == null }
if (unsupportedNetworks.isNotEmpty()) {
@ -230,6 +230,7 @@ class WalletConnectInteractor(
}
fun approveSessionProposal(accounts: List<Account>) {
Timber.i("Approve session proposal: $accounts")
val userNamespaces: Map<NetworkNamespace, List<Account>> = accounts
.groupBy { account ->
blockchainHelper.getNamespaceFromFullChainIdOrNull(account.chainId)
@ -241,14 +242,17 @@ class WalletConnectInteractor(
}
fun rejectSessionProposal() {
Timber.i("Reject session proposal")
walletConnectRepository.reject()
}
fun disconnectSession(topic: String) {
Timber.i("Disconnect session: $topic")
walletConnectRepository.disconnect(topic)
}
fun cancelRequest(topic: String, id: Long) {
Timber.i("Cancel request: $topic, $id")
walletConnectRepository.cancelRequest(topic, id)
}

View file

@ -7,6 +7,7 @@ import com.tangem.tap.routing.configurator.AppRouterConfig
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import kotlin.reflect.KClass
internal class ProxyAppRouter(
@ -31,30 +32,35 @@ internal class ProxyAppRouter(
override fun push(route: AppRoute, onComplete: (isSuccess: Boolean) -> Unit) {
routerScope.launch(dispatchers.mainImmediate) {
Timber.i("Push route: $route")
innerRouter.push(route, onComplete)
}
}
override fun replaceAll(vararg routes: AppRoute, onComplete: (isSuccess: Boolean) -> Unit) {
routerScope.launch(dispatchers.mainImmediate) {
Timber.i("Replace all routes with $routes")
innerRouter.replaceAll(*routes, onComplete = onComplete)
}
}
override fun pop(onComplete: (isSuccess: Boolean) -> Unit) {
routerScope.launch(dispatchers.mainImmediate) {
Timber.i("Pop route")
innerRouter.pop(onComplete)
}
}
override fun popTo(route: AppRoute, onComplete: (isSuccess: Boolean) -> Unit) {
routerScope.launch(dispatchers.mainImmediate) {
Timber.i("Pop to route: $route")
innerRouter.popTo(route, onComplete)
}
}
override fun popTo(routeClass: KClass<out AppRoute>, onComplete: (isSuccess: Boolean) -> Unit) {
routerScope.launch(dispatchers.mainImmediate) {
Timber.i("Pop to route class: $routeClass")
innerRouter.popTo(routeClass, onComplete)
}
}

View file

@ -18,7 +18,7 @@ internal class DefaultDeepLinksRegistry : DeepLinksRegistry {
val received = intent.data ?: return false
var hasMatch = false
Timber.d(
Timber.i(
"""
Received deep link intent
|- Received URI: $received
@ -33,7 +33,7 @@ internal class DefaultDeepLinksRegistry : DeepLinksRegistry {
val params = getParams(expected, received)
Timber.d(
Timber.i(
"""
Matched deep link
|- Expected URI: $expected
@ -45,7 +45,7 @@ internal class DefaultDeepLinksRegistry : DeepLinksRegistry {
}
if (!hasMatch) {
Timber.d(
Timber.i(
"""
No match found for deep link
|- Received URI: $received

View file

@ -67,7 +67,7 @@ suspend inline fun <T> safeApiCall(
): T = recover(
block = { call(ApiResponseRaise(raise = this)) },
recover = {
Timber.w(it, "Unable to perform safe API call")
Timber.e(it, "Unable to perform safe API call")
onError(it)
},
)

View file

@ -268,6 +268,17 @@ internal class SwapInteractorImpl @Inject constructor(
amountToSwap: String,
selectedFee: FeeType,
): Map<SwapProvider, SwapState> {
Timber.i(
"""
Find the best quote
|- fromToken: $fromToken
|- toToken: $toToken
|- providers: $providers
|- amountToSwap: $amountToSwap
|- selectedFee: $selectedFee
""".trimIndent(),
)
return providers.map { provider ->
val amountDecimal = toBigDecimalOrNull(amountToSwap)
if (amountDecimal == null || amountDecimal.signum() == 0) {
@ -311,7 +322,7 @@ internal class SwapInteractorImpl @Inject constructor(
amount: SwapAmount,
isBalanceWithoutFeeEnough: Boolean,
): Pair<SwapProvider, SwapState> {
val quotes = repository.findBestQuote(
val maybeQuotes = repository.findBestQuote(
fromContractAddress = fromToken.currency.getContractAddress(),
fromNetwork = fromToken.currency.network.backendId,
toContractAddress = toToken.currency.getContractAddress(),
@ -324,7 +335,7 @@ internal class SwapInteractorImpl @Inject constructor(
)
val fromTokenAddress = getTokenAddress(fromToken.currency)
val isAllowedToSpend = quotes.fold(
val isAllowedToSpend = maybeQuotes.fold(
ifRight = { quotes ->
quotes.allowanceContract?.let {
isAllowedToSpend(networkId, fromToken.currency, amount, it)
@ -352,7 +363,7 @@ internal class SwapInteractorImpl @Inject constructor(
} else {
provider to getQuotesState(
provider = provider,
quoteDataModel = quotes,
quoteDataModel = maybeQuotes,
amount = amount,
fromToken = fromToken,
toToken = toToken,
@ -573,6 +584,19 @@ internal class SwapInteractorImpl @Inject constructor(
includeFeeInAmount: IncludeFeeInAmount,
fee: TxFee,
): SwapTransactionState {
Timber.i(
"""
Swap
|- swapProvider: $swapProvider
|- swapData: $swapData
|- currencyToSend: $currencyToSend
|- currencyToGet: $currencyToGet
|- amountToSwap: $amountToSwap
|- includeFeeInAmount: $includeFeeInAmount
|- fee: $fee
""".trimIndent(),
)
val cardId = getSelectedWallet()?.scanResponse?.card?.cardId ?: return SwapTransactionState.UnknownError
if (isDemoCardUseCase(cardId)) return SwapTransactionState.DemoMode

View file

@ -208,7 +208,7 @@ internal class SwapViewModel @Inject constructor(
)
}
}.onFailure {
Timber.tag(loggingTag).e(it)
Timber.e(it)
applyInitialTokenChoice(
state = TokensDataStateExpress.EMPTY,
@ -1212,7 +1212,6 @@ internal class SwapViewModel @Inject constructor(
}
private companion object {
const val loggingTag = "SwapViewModel"
const val INITIAL_AMOUNT = ""
const val UPDATE_DELAY = 10000L
const val DEBOUNCE_AMOUNT_DELAY = 1000L

View file

@ -35,7 +35,7 @@ internal class WalletsUpdateActionResolver @Inject constructor(
getUpdateContentAction(currentState, wallets, selectedWallet)
}
Timber.d("Resolved action: $action")
Timber.i("Resolved action: $action")
return action
}

View file

@ -74,7 +74,7 @@ internal class DefaultBlockchainSDKFactory(
return@launch
}
Timber.d("Update BlockchainSDKConfig")
Timber.i("Update BlockchainSDKConfig")
configStore.store(
value = BlockchainSDKConfigConverter.convert(value = config),
@ -91,7 +91,7 @@ internal class DefaultBlockchainSDKFactory(
return@launch
}
Timber.d("Update BlockchainProviderTypes")
Timber.i("Update BlockchainProviderTypes")
blockchainProviderTypesStore.store(
value = BlockchainProviderTypesConverter.convert(response),

View file

@ -27,7 +27,7 @@ internal class WalletManagerFactoryCreator @Inject constructor(
) {
fun create(config: BlockchainSdkConfig, blockchainProviderTypes: BlockchainProviderTypes): WalletManagerFactory {
Timber.d("Create WalletManagerFactory")
Timber.i("Create WalletManagerFactory")
return WalletManagerFactory(
config = config,