Updated on 2026-08-14

This commit is contained in:
Tangem 2024-11-29 10:59:52 +03:00
parent 334eb75395
commit c67fd1801c
11 changed files with 62 additions and 21 deletions

View file

@ -7,6 +7,7 @@ import com.tangem.common.authentication.storage.AuthenticatedStorage
import com.tangem.common.json.TangemSdkAdapter
import com.tangem.common.services.secure.SecureStorage
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.domain.models.scan.serialization.*
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.sdk.storage.AndroidSecureStorage
import com.tangem.sdk.storage.createEncryptedSharedPreferences
@ -19,7 +20,6 @@ import com.tangem.tap.domain.userWalletList.repository.implementation.BiometricU
import com.tangem.tap.domain.userWalletList.repository.implementation.DefaultSelectedUserWalletRepository
import com.tangem.tap.domain.userWalletList.repository.implementation.DefaultUserWalletsPublicInformationRepository
import com.tangem.tap.domain.userWalletList.repository.implementation.DefaultUserWalletsSensitiveInformationRepository
import com.tangem.tap.domain.userWalletList.utils.json.*
import com.tangem.tap.tangemSdkManager
import com.tangem.utils.Provider
import com.tangem.utils.coroutines.CoroutineDispatcherProvider

View file

@ -1 +0,0 @@
package com.tangem.tap.domain.userWalletList.utils

View file

@ -325,6 +325,7 @@ sealed class AppRoute(val path: String) : Route {
) : AppRoute(path = "/swap_crypto/${userWalletId.stringValue}")
// Onboarding V2
@Serializable
data class Onboarding(
val scanResponse: ScanResponse,
val startFromBackup: Boolean,

View file

@ -1,21 +1,27 @@
package com.tangem.domain.models.scan
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.common.card.WalletData
import com.tangem.common.extensions.ByteArrayKey
import com.tangem.domain.models.scan.serialization.ScanResponseAsStringSerializer
import com.tangem.operations.backup.PrimaryCard
import com.tangem.operations.derivation.ExtendedPublicKeysMap
import kotlinx.serialization.Serializable
// TODO: Move to :domain:card:models
/**
[REDACTED_AUTHOR]
*/
@Serializable(with = ScanResponseAsStringSerializer::class)
@JsonClass(generateAdapter = true)
data class ScanResponse(
val card: CardDTO,
val productType: ProductType,
val walletData: WalletData?,
val secondTwinPublicKey: String? = null,
val derivedKeys: Map<KeyWalletPublicKey, ExtendedPublicKeysMap> = mapOf(),
val primaryCard: PrimaryCard? = null,
@Json(name = "card") val card: CardDTO,
@Json(name = "productType") val productType: ProductType,
@Json(name = "walletData") val walletData: WalletData?,
@Json(name = "secondTwinPublicKey") val secondTwinPublicKey: String? = null,
@Json(name = "derivedKeys") val derivedKeys: Map<KeyWalletPublicKey, ExtendedPublicKeysMap> = mapOf(),
@Json(name = "primaryCard") val primaryCard: PrimaryCard? = null,
)
typealias KeyWalletPublicKey = ByteArrayKey

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain.userWalletList.utils.json
package com.tangem.domain.models.scan.serialization
import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonAdapter
@ -7,7 +7,7 @@ import com.squareup.moshi.JsonWriter
import com.squareup.moshi.ToJson
import com.tangem.common.extensions.ByteArrayKey
internal class ByteArrayKeyAdapter {
class ByteArrayKeyAdapter {
@ToJson
fun toJson(writer: JsonWriter, src: ByteArrayKey, byteArrayAdapter: JsonAdapter<ByteArray>) {
byteArrayAdapter.toJson(writer, src.bytes)

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain.userWalletList.utils.json
package com.tangem.domain.models.scan.serialization
import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonAdapter
@ -7,7 +7,7 @@ import com.squareup.moshi.JsonWriter
import com.squareup.moshi.ToJson
import com.tangem.domain.models.scan.CardDTO
internal class CardBackupStatusAdapter {
class CardBackupStatusAdapter {
@ToJson
fun toJson(writer: JsonWriter, src: CardDTO.BackupStatus?, mapAdapter: JsonAdapter<Map<String, String>>) {
val jsonMap = mutableMapOf<String, String>()

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain.userWalletList.utils.json
package com.tangem.domain.models.scan.serialization
import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
@ -6,7 +6,6 @@ import com.tangem.common.extensions.guard
import com.tangem.common.json.MoshiJsonConverter
import com.tangem.crypto.hdWallet.DerivationNode
import com.tangem.crypto.hdWallet.DerivationPath
import timber.log.Timber
class DerivationPathAdapterWithMigration {
@ToJson
@ -26,7 +25,6 @@ class DerivationPathAdapterWithMigration {
private fun fromLegacyScheme(jsonMap: Map<String, Any>): DerivationPath {
val rawPath = jsonMap["rawPath"] as String
val nodeIndexes = (jsonMap["nodes"] as? List<Number>).guard {
Timber.e("Unable to convert derivation path nodes from JSON")
return DerivationPath(rawPath)
}
val nodes = nodeIndexes.map { DerivationNode.fromIndex(it.toLong()) }

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain.userWalletList.utils.json
package com.tangem.domain.models.scan.serialization
import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonAdapter
@ -11,7 +11,7 @@ import com.tangem.crypto.hdWallet.DerivationPath
import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey
import com.tangem.operations.derivation.ExtendedPublicKeysMap
internal class ExtendedPublicKeysMapAdapter {
class ExtendedPublicKeysMapAdapter {
@ToJson
fun toJson(
writer: JsonWriter,

View file

@ -0,0 +1,37 @@
package com.tangem.domain.models.scan.serialization
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.tangem.common.json.TangemSdkAdapter
import com.tangem.domain.models.scan.ScanResponse
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
internal object ScanResponseAsStringSerializer : KSerializer<ScanResponse> {
private val moshi = Moshi.Builder()
.add(WalletDerivedKeysMapAdapter())
.add(ScanResponseDerivedKeysMapAdapter())
.add(ByteArrayKeyAdapter())
.add(ExtendedPublicKeysMapAdapter())
.add(CardBackupStatusAdapter())
.add(DerivationPathAdapterWithMigration())
.add(TangemSdkAdapter.DateAdapter())
.add(TangemSdkAdapter.DerivationNodeAdapter())
.add(TangemSdkAdapter.FirmwareVersionAdapter()) // For PrimaryCard model
.add(KotlinJsonAdapterFactory())
.build()
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ScanResponse", PrimitiveKind.STRING)
override fun deserialize(decoder: Decoder): ScanResponse {
return moshi.adapter(ScanResponse::class.java).fromJson(decoder.decodeString())!!
}
override fun serialize(encoder: Encoder, value: ScanResponse) {
encoder.encodeString(moshi.adapter(ScanResponse::class.java).toJson(value)!!)
}
}

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain.userWalletList.utils.json
package com.tangem.domain.models.scan.serialization
import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonAdapter
@ -8,7 +8,7 @@ import com.squareup.moshi.ToJson
import com.tangem.common.extensions.ByteArrayKey
import com.tangem.operations.derivation.ExtendedPublicKeysMap
internal class ScanResponseDerivedKeysMapAdapter {
class ScanResponseDerivedKeysMapAdapter {
@ToJson
fun toJson(
writer: JsonWriter,

View file

@ -1,4 +1,4 @@
package com.tangem.tap.domain.userWalletList.utils.json
package com.tangem.domain.models.scan.serialization
import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonAdapter
@ -10,7 +10,7 @@ import com.tangem.common.extensions.toHexString
import com.tangem.crypto.hdWallet.DerivationPath
import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey
internal class WalletDerivedKeysMapAdapter {
class WalletDerivedKeysMapAdapter {
@ToJson
fun toJson(
writer: JsonWriter,