diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/entity/NetworkStatusDM.kt b/core/datasource/src/main/java/com/tangem/datasource/local/network/entity/NetworkStatusDM.kt
index 35314337e9..280c5f4040 100644
--- a/core/datasource/src/main/java/com/tangem/datasource/local/network/entity/NetworkStatusDM.kt
+++ b/core/datasource/src/main/java/com/tangem/datasource/local/network/entity/NetworkStatusDM.kt
@@ -4,7 +4,7 @@ import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.datasource.local.network.entity.NetworkStatusDM.NoAccount
import com.tangem.datasource.local.network.entity.NetworkStatusDM.Verified
-import com.tangem.domain.models.network.Network
+import dev.onenowy.moshipolymorphicadapter.PolymorphicAdapterType
import dev.onenowy.moshipolymorphicadapter.annotations.NameLabel
import java.math.BigDecimal
@@ -13,10 +13,11 @@ import java.math.BigDecimal
*
* @see [com.tangem.domain.tokens.model.NetworkStatus]
*/
+@JsonClass(generateAdapter = true, generator = PolymorphicAdapterType.NAME_POLYMORPHIC_ADAPTER)
sealed interface NetworkStatusDM {
/** Network id */
- val networkId: Network.ID
+ val networkId: ID
/** Derivation path */
val derivationPath: DerivationPath
@@ -38,7 +39,7 @@ sealed interface NetworkStatusDM {
*/
@NameLabel("amounts")
data class Verified(
- @Json(name = "network_id") override val networkId: Network.ID,
+ @Json(name = "network_id") override val networkId: ID,
@Json(name = "derivation_path") override val derivationPath: DerivationPath,
@Json(name = "selected_address") override val selectedAddress: String,
@Json(name = "available_addresses") override val availableAddresses: Set
,
@@ -57,7 +58,7 @@ sealed interface NetworkStatusDM {
*/
@NameLabel("amount_to_create_account")
data class NoAccount(
- @Json(name = "network_id") override val networkId: Network.ID,
+ @Json(name = "network_id") override val networkId: ID,
@Json(name = "derivation_path") override val derivationPath: DerivationPath,
@Json(name = "selected_address") override val selectedAddress: String,
@Json(name = "available_addresses") override val availableAddresses: Set,
@@ -65,6 +66,11 @@ sealed interface NetworkStatusDM {
@Json(name = "error_message") val errorMessage: String,
) : NetworkStatusDM
+ @JsonClass(generateAdapter = true)
+ data class ID(
+ @Json(name = "value") val value: String,
+ )
+
@JsonClass(generateAdapter = true)
data class DerivationPath(
@Json(name = "value") val value: String,
diff --git a/core/datasource/src/test/kotlin/com/tangem/datasource/local/network/entity/NetworkStatusDMSerializationTest.kt b/core/datasource/src/test/kotlin/com/tangem/datasource/local/network/entity/NetworkStatusDMSerializationTest.kt
new file mode 100644
index 0000000000..a8bae9462e
--- /dev/null
+++ b/core/datasource/src/test/kotlin/com/tangem/datasource/local/network/entity/NetworkStatusDMSerializationTest.kt
@@ -0,0 +1,195 @@
+package com.tangem.datasource.local.network.entity
+
+import com.google.common.truth.Truth
+import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapter
+import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
+import com.tangem.datasource.api.common.adapter.BigDecimalAdapter
+import dev.onenowy.moshipolymorphicadapter.NamePolymorphicAdapterFactory
+import org.junit.Test
+import java.math.BigDecimal
+
+/**
+[REDACTED_AUTHOR]
+ */
+class NetworkStatusDMSerializationTest {
+
+ private val moshi = Moshi.Builder()
+ .add(
+ NamePolymorphicAdapterFactory.of(NetworkStatusDM::class.java)
+ .withSubtype(NetworkStatusDM.Verified::class.java, "amounts")
+ .withSubtype(NetworkStatusDM.NoAccount::class.java, "amount_to_create_account"),
+ )
+ .add(BigDecimalAdapter())
+ .addLast(KotlinJsonAdapterFactory())
+ .build()
+
+ @OptIn(ExperimentalStdlibApi::class)
+ private val adapter = moshi.adapter()
+
+ @Test
+ fun `deserialize JSON to Verified`() {
+ // Arrange
+ val json = """
+ {
+ "network_id": { "value": "ETH" },
+ "derivation_path": {
+ "value": "m/44'/60'/0'/0/0",
+ "type": "card"
+ },
+ "selected_address": "0x123456",
+ "available_addresses": [
+ { "value": "0x123456", "type": "primary" },
+ { "value": "0xabcdef", "type": "secondary" }
+ ],
+ "amounts": { "ETH": "1.2345" }
+ }
+ """.trimIndent()
+
+ // Act
+ val result = adapter.fromJson(json)
+
+ // Assert
+ val expected = NetworkStatusDM.Verified(
+ networkId = NetworkStatusDM.ID("ETH"),
+ derivationPath = NetworkStatusDM.DerivationPath(
+ value = "m/44'/60'/0'/0/0",
+ type = NetworkStatusDM.DerivationPath.Type.CARD,
+ ),
+ selectedAddress = "0x123456",
+ availableAddresses = setOf(
+ NetworkStatusDM.Address("0x123456", NetworkStatusDM.Address.Type.Primary),
+ NetworkStatusDM.Address("0xabcdef", NetworkStatusDM.Address.Type.Secondary),
+ ),
+ amounts = mapOf("ETH" to BigDecimal("1.2345")),
+ )
+
+ Truth.assertThat(result).isEqualTo(expected)
+ }
+
+ @Test
+ fun `serialize Verified to JSON`() {
+ // Arrange
+ val model = NetworkStatusDM.Verified(
+ networkId = NetworkStatusDM.ID("ETH"),
+ derivationPath = NetworkStatusDM.DerivationPath(
+ value = "m/44'/60'/0'/0/0",
+ type = NetworkStatusDM.DerivationPath.Type.CARD,
+ ),
+ selectedAddress = "0x123456",
+ availableAddresses = setOf(
+ NetworkStatusDM.Address("0x123456", NetworkStatusDM.Address.Type.Primary),
+ NetworkStatusDM.Address("0xabcdef", NetworkStatusDM.Address.Type.Secondary),
+ ),
+ amounts = mapOf("ETH" to BigDecimal("1.2345")),
+ )
+
+ // Act
+ val actual = adapter.toJson(model)
+
+ // Assert
+ val expected = """
+ {
+ "network_id": { "value": "ETH" },
+ "derivation_path": {
+ "value": "m/44'/60'/0'/0/0",
+ "type": "card"
+ },
+ "selected_address": "0x123456",
+ "available_addresses": [
+ { "value": "0x123456", "type": "primary" },
+ { "value": "0xabcdef", "type": "secondary" }
+ ],
+ "amounts": { "ETH": "1.2345" }
+ }
+ """.stripJsonWhitespace()
+
+ Truth.assertThat(actual).isEqualTo(expected)
+ }
+
+ @Test
+ fun `deserialize JSON to NoAccount`() {
+ // Arrange
+ val json = """
+ {
+ "network_id": { "value": "ETH" },
+ "derivation_path": {
+ "value": "m/44'/60'/0'/0/0",
+ "type": "card"
+ },
+ "selected_address": "0x123456",
+ "available_addresses": [
+ { "value": "0x123456", "type": "primary" },
+ { "value": "0xabcdef", "type": "secondary" }
+ ],
+ "amount_to_create_account": "0.05",
+ "error_message": "Account not found"
+ }
+ """.trimIndent()
+
+ // Act
+ val result = adapter.fromJson(json)
+
+ // Assert
+ val expected = NetworkStatusDM.NoAccount(
+ networkId = NetworkStatusDM.ID("ETH"),
+ derivationPath = NetworkStatusDM.DerivationPath(
+ value = "m/44'/60'/0'/0/0",
+ type = NetworkStatusDM.DerivationPath.Type.CARD,
+ ),
+ selectedAddress = "0x123456",
+ availableAddresses = setOf(
+ NetworkStatusDM.Address("0x123456", NetworkStatusDM.Address.Type.Primary),
+ NetworkStatusDM.Address("0xabcdef", NetworkStatusDM.Address.Type.Secondary),
+ ),
+ amountToCreateAccount = BigDecimal("0.05"),
+ errorMessage = "Account not found",
+ )
+
+ Truth.assertThat(result).isEqualTo(expected)
+ }
+
+ @Test
+ fun `serialize NoAccount to JSON`() {
+ // Arrange
+ val model = NetworkStatusDM.NoAccount(
+ networkId = NetworkStatusDM.ID("ETH"),
+ derivationPath = NetworkStatusDM.DerivationPath(
+ value = "m/44'/60'/0'/0/0",
+ type = NetworkStatusDM.DerivationPath.Type.CARD,
+ ),
+ selectedAddress = "0x123456",
+ availableAddresses = setOf(
+ NetworkStatusDM.Address("0x123456", NetworkStatusDM.Address.Type.Primary),
+ NetworkStatusDM.Address("0xabcdef", NetworkStatusDM.Address.Type.Secondary),
+ ),
+ amountToCreateAccount = BigDecimal("0.05"),
+ errorMessage = "error",
+ )
+
+ // Act
+ val actual = adapter.toJson(model)
+
+ // Assert
+ val expected = """
+ {
+ "network_id": { "value": "ETH" },
+ "derivation_path": {
+ "value": "m/44'/60'/0'/0/0",
+ "type": "card"
+ },
+ "selected_address": "0x123456",
+ "available_addresses": [
+ { "value": "0x123456", "type": "primary" },
+ { "value": "0xabcdef", "type": "secondary" }
+ ],
+ "amount_to_create_account": "0.05",
+ "error_message": "error"
+ }
+ """.stripJsonWhitespace()
+
+ Truth.assertThat(actual).isEqualTo(expected)
+ }
+
+ private fun String.stripJsonWhitespace(): String = replace(regex = "\\s".toRegex(), replacement = "")
+}
\ No newline at end of file
diff --git a/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverter.kt b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverter.kt
index 2e2d2e966c..c07eae848e 100644
--- a/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverter.kt
+++ b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverter.kt
@@ -17,7 +17,7 @@ internal object NetworkStatusDataModelConverter : Converter