Skip to content

Commit

Permalink
Merge pull request #1018 from radixdlt/revert-1010-feature/all-metadata
Browse files Browse the repository at this point in the history
Revert "Show all metadata and mark the locked ones with lock icon"
  • Loading branch information
micbakos-rdx committed Jun 28, 2024
2 parents f72bf3d + 4e64a3a commit 0bc8f09
Show file tree
Hide file tree
Showing 40 changed files with 729 additions and 1,155 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.babylon.wallet.android.data.gateway.extensions

import com.babylon.wallet.android.data.gateway.apis.StateApi
import com.babylon.wallet.android.data.gateway.generated.models.EntityMetadataItem
import com.babylon.wallet.android.data.gateway.generated.models.FungibleResourcesCollection
import com.babylon.wallet.android.data.gateway.generated.models.FungibleResourcesCollectionItem
import com.babylon.wallet.android.data.gateway.generated.models.LedgerState
Expand All @@ -16,7 +15,6 @@ import com.babylon.wallet.android.data.gateway.generated.models.StateEntityDetai
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityDetailsResponseItem
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityFungiblesPageRequest
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityFungiblesPageRequestOptIns
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityMetadataPageRequest
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityNonFungibleIdsPageRequest
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityNonFungiblesPageRequest
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityNonFungiblesPageRequestOptIns
Expand Down Expand Up @@ -388,28 +386,3 @@ suspend fun StateApi.paginateNonFungibles(
onPage(response)
}
}

suspend fun StateApi.getAllMetadata(
resourceAddress: ResourceAddress,
stateVersion: Long,
initialCursor: String
): List<EntityMetadataItem> {
val items = mutableListOf<EntityMetadataItem>()

var cursor: String? = initialCursor
while (cursor != null) {
val page = entityMetadataPage(
stateEntityMetadataPageRequest = StateEntityMetadataPageRequest(
address = resourceAddress.string,
cursor = initialCursor,
atLedgerState = LedgerStateSelector(
stateVersion = stateVersion
)
)
).toResult().getOrThrow()
cursor = page.nextCursor
items.addAll(page.items)
}

return items
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import com.babylon.wallet.android.data.gateway.generated.models.MetadataPublicKe
import com.babylon.wallet.android.data.gateway.generated.models.MetadataStringArrayValue
import com.babylon.wallet.android.data.gateway.generated.models.MetadataStringValue
import com.babylon.wallet.android.data.gateway.generated.models.MetadataTypedValue
import com.babylon.wallet.android.data.gateway.generated.models.MetadataU32ArrayValue
import com.babylon.wallet.android.data.gateway.generated.models.MetadataU32Value
import com.babylon.wallet.android.data.gateway.generated.models.MetadataU64ArrayValue
import com.babylon.wallet.android.data.gateway.generated.models.MetadataU64Value
Expand Down Expand Up @@ -63,7 +62,7 @@ object MetadataTypedValueSerializer : JsonContentPolymorphicSerializer<MetadataT
MetadataValueType.StringArray -> MetadataStringArrayValue.serializer()
MetadataValueType.BoolArray -> MetadataBoolArrayValue.serializer()
MetadataValueType.U8Array -> MetadataU8ArrayValue.serializer()
MetadataValueType.U32Array -> MetadataU32ArrayValue.serializer()
MetadataValueType.U32Array -> MetadataU32Value.serializer()
MetadataValueType.U64Array -> MetadataU64ArrayValue.serializer()
MetadataValueType.I32Array -> MetadataI32ArrayValue.serializer()
MetadataValueType.I64Array -> MetadataI64ArrayValue.serializer()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.babylon.wallet.android.data.repository.cache.database
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.babylon.wallet.android.data.gateway.extensions.toMetadata
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityDetailsResponseItem
import com.radixdlt.sargon.AccountAddress
import com.radixdlt.sargon.extensions.init
Expand All @@ -26,10 +27,7 @@ data class DAppEntity(
companion object {
fun from(item: StateEntityDetailsResponseItem, syncedAt: Instant) = DAppEntity(
definitionAddress = AccountAddress.init(item.address),
metadata = MetadataColumn.from(
explicitMetadata = item.explicitMetadata,
implicitMetadata = item.metadata
),
metadata = item.explicitMetadata?.toMetadata()?.let { MetadataColumn(it) },
synced = syncedAt
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ data class NFTEntity(
metadata = toMetadata().takeIf {
it.isNotEmpty()
}?.let {
MetadataColumn(metadata = it, implicitState = MetadataColumn.ImplicitMetadataState.Complete)
MetadataColumn(it)
},
synced = synced
)
Expand All @@ -49,7 +49,7 @@ data class NFTEntity(
metadata = metadata.takeIf {
it.isNotEmpty()
}?.let {
MetadataColumn(metadata = it, implicitState = MetadataColumn.ImplicitMetadataState.Complete)
MetadataColumn(it)
},
synced = synced
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.room.ForeignKey
import androidx.room.Index
import androidx.room.PrimaryKey
import com.babylon.wallet.android.data.gateway.extensions.PoolsResponse
import com.babylon.wallet.android.data.gateway.extensions.toMetadata
import com.babylon.wallet.android.data.gateway.generated.models.StateEntityDetailsResponseItem
import com.babylon.wallet.android.data.repository.cache.database.PoolResourceJoin.Companion.asPoolResourceJoin
import com.babylon.wallet.android.data.repository.cache.database.ResourceEntity.Companion.asEntity
Expand Down Expand Up @@ -59,14 +60,11 @@ data class PoolEntity(
}

fun StateEntityDetailsResponseItem.asPoolEntity(): PoolEntity? {
val metadataColumn = MetadataColumn.from(
explicitMetadata = explicitMetadata,
implicitMetadata = metadata
)
val poolUnitResourceAddress = metadataColumn.metadata.poolUnit() ?: return null
val metadata = this.metadata.toMetadata()
val poolUnitResourceAddress = metadata.poolUnit() ?: return null
return PoolEntity(
address = PoolAddress.init(address),
metadata = metadataColumn,
metadata = MetadataColumn(metadata),
resourceAddress = poolUnitResourceAddress
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ package com.babylon.wallet.android.data.repository.cache.database

import androidx.room.ProvidedTypeConverter
import androidx.room.TypeConverter
import com.babylon.wallet.android.data.gateway.extensions.toMetadata
import com.babylon.wallet.android.data.gateway.generated.models.EntityMetadataCollection
import com.babylon.wallet.android.data.repository.cache.database.MetadataColumn.ImplicitMetadataState
import com.radixdlt.sargon.AccountAddress
import com.radixdlt.sargon.Decimal192
import com.radixdlt.sargon.NonFungibleLocalId
Expand All @@ -15,7 +12,6 @@ import com.radixdlt.sargon.VaultAddress
import com.radixdlt.sargon.extensions.init
import com.radixdlt.sargon.extensions.string
import com.radixdlt.sargon.extensions.toDecimal192OrNull
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
Expand All @@ -28,75 +24,7 @@ import java.time.Instant
data class BehavioursColumn(val behaviours: Set<AssetBehaviour>)

@Serializable
data class MetadataColumn(
/**
* A union of explicit and **currently known** implicit metadata
* As a client we don't need to expose the difference between explicit
* and implicit metadata.
*/
val metadata: List<Metadata>,

/**
* The state of the next page of the implicit metadata. See [ImplicitMetadataState]
*/
@SerialName("implicit_state")
val implicitState: ImplicitMetadataState
) {

val nextCursor: String?
get() = (implicitState as? ImplicitMetadataState.Incomplete)?.nextCursor

@Serializable
sealed interface ImplicitMetadataState {
/**
* When we have no information yet regarding the existence of implicit metadata
* An example is when we query account information. In this request we receive
* resource data but with no information about implicit metadata. In order to make
* sure we received all metadata available we need to fetch details of this specific
* resource
*/
@Serializable
@SerialName("unknown")
data object Unknown : ImplicitMetadataState

/**
* We have received an answer from a details request and we know that the [MetadataColumn.metadata]
* are complete.
*/
@Serializable
@SerialName("complete")
data object Complete : ImplicitMetadataState

/**
* We have received an answer from a details request and we know that the [MetadataColumn.metadata]
* are incomplete. We need to query [nextCursor] to receive more.
*/
@Serializable
@SerialName("incomplete")
data class Incomplete(
@SerialName("next_cursor")
val nextCursor: String
) : ImplicitMetadataState
}

companion object {
fun from(
explicitMetadata: EntityMetadataCollection?,
implicitMetadata: EntityMetadataCollection
): MetadataColumn {
val explicit = explicitMetadata?.toMetadata().orEmpty().toSet()
val implicit = implicitMetadata.toMetadata().toSet()

val all = explicit union implicit
return MetadataColumn(
metadata = all.toList(),
implicitState = implicitMetadata.nextCursor?.let {
ImplicitMetadataState.Incomplete(nextCursor = it)
} ?: ImplicitMetadataState.Complete
)
}
}
}
data class MetadataColumn(val metadata: List<Metadata>)

@Suppress("TooManyFunctions")
@ProvidedTypeConverter
Expand All @@ -109,23 +37,23 @@ class StateDatabaseConverters {
// Behaviours
@TypeConverter
fun stringToBehaviours(string: String?): BehavioursColumn? {
return string?.let { json.decodeFromString(string) }
return string?.let { BehavioursColumn(behaviours = json.decodeFromString(string)) }
}

@TypeConverter
fun behavioursToString(column: BehavioursColumn?): String? {
return column?.let { json.encodeToString(it) }
return column?.let { json.encodeToString(it.behaviours) }
}

// Metadata
@TypeConverter
fun stringToMetadata(string: String?): MetadataColumn? {
return string?.let { json.decodeFromString(string) }
return string?.let { MetadataColumn(metadata = json.decodeFromString(string)) }
}

@TypeConverter
fun metadataToString(column: MetadataColumn?): String? {
return column?.let { json.encodeToString(it) }
return column?.let { json.encodeToString(it.metadata) }
}

// Decimal192
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ import com.radixdlt.sargon.extensions.init
import com.radixdlt.sargon.extensions.string
import com.radixdlt.sargon.extensions.toDecimal192
import rdx.works.core.domain.resources.Divisibility
import rdx.works.core.domain.resources.ExplicitMetadataKey
import rdx.works.core.domain.resources.Resource
import rdx.works.core.domain.resources.metadata.Metadata
import rdx.works.core.domain.resources.metadata.MetadataType
import rdx.works.core.domain.resources.metadata.poolAddress
import rdx.works.core.domain.resources.metadata.validatorAddress
import java.time.Instant
Expand All @@ -47,14 +50,17 @@ data class ResourceEntity(
val synced: Instant
) {

val isDetailsAvailable: Boolean
get() = when (type) {
ResourceEntityType.FUNGIBLE -> supply != null && divisibility != null && behaviours != null
ResourceEntityType.NON_FUNGIBLE -> supply != null && behaviours != null
}

@Suppress("CyclomaticComplexMethod")
fun toResource(amount: Decimal192?): Resource {
val validatorAndPoolMetadata = listOf(
validatorAddress?.let {
Metadata.Primitive(ExplicitMetadataKey.VALIDATOR.key, it.string, MetadataType.Address)
},
poolAddress?.let {
Metadata.Primitive(ExplicitMetadataKey.POOL.key, it.string, MetadataType.Address)
}
).mapNotNull { it }

return when (type) {
ResourceEntityType.FUNGIBLE -> {
Resource.FungibleResource(
Expand All @@ -63,7 +69,7 @@ data class ResourceEntity(
assetBehaviours = behaviours?.behaviours?.toSet(),
currentSupply = supply,
divisibility = divisibility,
metadata = metadata?.metadata.orEmpty()
metadata = metadata?.metadata.orEmpty() + validatorAndPoolMetadata
)
}

Expand All @@ -74,7 +80,7 @@ data class ResourceEntity(
assetBehaviours = behaviours?.behaviours?.toSet(),
items = emptyList(),
currentSupply = supply?.string?.toIntOrNull(),
metadata = metadata?.metadata.orEmpty()
metadata = metadata?.metadata.orEmpty() + validatorAndPoolMetadata
)
}
}
Expand All @@ -91,8 +97,9 @@ data class ResourceEntity(
validatorAddress = metadata.validatorAddress(),
poolAddress = metadata.poolAddress(),
metadata = metadata
.filterNot { it.key in setOf(ExplicitMetadataKey.POOL.key, ExplicitMetadataKey.VALIDATOR.key) }
.takeIf { it.isNotEmpty() }
?.let { MetadataColumn(it, MetadataColumn.ImplicitMetadataState.Unknown) },
?.let { MetadataColumn(it) },
synced = synced
)

Expand All @@ -105,8 +112,9 @@ data class ResourceEntity(
validatorAddress = metadata.validatorAddress(),
poolAddress = metadata.poolAddress(),
metadata = metadata
.filterNot { it.key in setOf(ExplicitMetadataKey.POOL.key, ExplicitMetadataKey.VALIDATOR.key) }
.takeIf { it.isNotEmpty() }
?.let { MetadataColumn(it, MetadataColumn.ImplicitMetadataState.Unknown) },
?.let { MetadataColumn(it) },
synced = synced
)
}
Expand All @@ -118,8 +126,7 @@ data class ResourceEntity(
details: StateEntityDetailsResponseItemDetails? = null
): ResourceEntity = from(
address = ResourceAddress.init(resourceAddress),
explicitMetadata = explicitMetadata,
implicitMetadata = null,
metadataCollection = explicitMetadata,
details = details,
type = ResourceEntityType.FUNGIBLE,
synced = synced
Expand All @@ -132,8 +139,7 @@ data class ResourceEntity(
details: StateEntityDetailsResponseItemDetails? = null
): ResourceEntity = from(
address = ResourceAddress.init(resourceAddress),
explicitMetadata = explicitMetadata,
implicitMetadata = null,
metadataCollection = explicitMetadata,
details = details,
type = ResourceEntityType.NON_FUNGIBLE,
synced = synced
Expand All @@ -150,44 +156,33 @@ data class ResourceEntity(
}
return from(
address = ResourceAddress.init(address),
explicitMetadata = explicitMetadata,
implicitMetadata = metadata,
metadataCollection = metadata,
details = details,
type = type,
synced = synced
)
}

@Suppress("LongParameterList")
private fun from(
address: ResourceAddress,
explicitMetadata: EntityMetadataCollection?,
implicitMetadata: EntityMetadataCollection?,
metadataCollection: EntityMetadataCollection?,
details: StateEntityDetailsResponseItemDetails?,
type: ResourceEntityType,
synced: Instant
): ResourceEntity {
val metadataColumn = if (implicitMetadata != null) {
MetadataColumn.from(
explicitMetadata = explicitMetadata,
implicitMetadata = implicitMetadata
)
} else {
MetadataColumn(
metadata = explicitMetadata?.toMetadata().orEmpty(),
implicitState = MetadataColumn.ImplicitMetadataState.Unknown
)
}.takeIf { it.metadata.isNotEmpty() }

val metadata = metadataCollection?.toMetadata().orEmpty()
return ResourceEntity(
address = address,
type = type,
divisibility = details?.divisibility(),
behaviours = details?.let { BehavioursColumn(it.extractBehaviours()) },
supply = details?.totalSupply(),
validatorAddress = metadataColumn?.metadata?.validatorAddress(),
poolAddress = metadataColumn?.metadata?.poolAddress(),
metadata = metadataColumn,
validatorAddress = metadata.validatorAddress(),
poolAddress = metadata.poolAddress(),
metadata = metadata
.filterNot { it.key in setOf(ExplicitMetadataKey.VALIDATOR.key, ExplicitMetadataKey.POOL.key) }
.takeIf { it.isNotEmpty() }
?.let { MetadataColumn(it) },
synced = synced
)
}
Expand Down
Loading

0 comments on commit 0bc8f09

Please sign in to comment.