Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gemwallet.android.data.coordinators.confirm

import com.gemwallet.android.application.confirm.coordinators.BuildConfirmProperties
import com.gemwallet.android.cases.addresses.GetAddressName
import com.gemwallet.android.cases.nodes.GetCurrentBlockExplorer
import com.gemwallet.android.data.repositories.stake.StakeRepository
import com.gemwallet.android.domains.asset.chain
Expand All @@ -19,6 +20,7 @@ import uniffi.gemstone.Explorer
class BuildConfirmPropertiesImpl(
private val stakeRepository: StakeRepository,
private val getCurrentBlockExplorer: GetCurrentBlockExplorer,
private val getAddressName: GetAddressName,
) : BuildConfirmProperties {

override suspend fun invoke(
Expand All @@ -31,7 +33,10 @@ class BuildConfirmPropertiesImpl(
val chainExplorer = Explorer(chain.string)
return mutableListOf<ConfirmProperty?>().apply {
add(ConfirmProperty.Source(assetInfo.walletName))
val destination = ConfirmProperty.Destination.map(request, getValidator(request))
val addressName = request.destination()?.address
?.takeIf { it.isNotEmpty() }
?.let { getAddressName.getAddressName(chain, it) }
val destination = ConfirmProperty.Destination.map(request, getValidator(request), addressName)
add(
when (destination) {
is ConfirmProperty.Destination.Transfer -> ConfirmProperty.Destination.Transfer(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.gemwallet.android.application.confirm.coordinators.ValidateBalance
import com.gemwallet.android.blockchain.operators.LoadPrivateKeyOperator
import com.gemwallet.android.blockchain.services.BroadcastService
import com.gemwallet.android.blockchain.services.SignClientProxy
import com.gemwallet.android.cases.addresses.GetAddressName
import com.gemwallet.android.cases.nodes.GetCurrentBlockExplorer
import com.gemwallet.android.cases.transactions.CreateTransaction
import com.gemwallet.android.data.coordinators.confirm.BuildConfirmPropertiesImpl
Expand Down Expand Up @@ -51,8 +52,10 @@ object ConfirmModule {
fun provideBuildConfirmProperties(
stakeRepository: StakeRepository,
getCurrentBlockExplorer: GetCurrentBlockExplorer,
getAddressName: GetAddressName,
): BuildConfirmProperties = BuildConfirmPropertiesImpl(
stakeRepository,
getCurrentBlockExplorer,
getAddressName,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.gemwallet.android.application.assets.coordinators.PrefetchAssets
import com.gemwallet.android.application.transactions.coordinators.GetTransactionDetails
import com.gemwallet.android.application.transactions.coordinators.GetTransactions
import com.gemwallet.android.application.transactions.coordinators.SyncTransactions
import com.gemwallet.android.cases.addresses.SaveAddressNames
import com.gemwallet.android.cases.nodes.GetCurrentBlockExplorer
import com.gemwallet.android.cases.transactions.SaveTransactions
import com.gemwallet.android.data.coordinators.transaction.GetTransactionDetailsImpl
Expand Down Expand Up @@ -38,13 +39,15 @@ object TransactionModule {
walletPreferencesFactory: WalletPreferencesFactory,
gemDeviceApiClient: GemDeviceApiClient,
saveTransactions: SaveTransactions,
saveAddressNames: SaveAddressNames,
prefetchAssets: PrefetchAssets,
ensureWalletAssets: EnsureWalletAssets,
): SyncTransactions {
return SyncTransactionsImpl(
walletPreferencesFactory = walletPreferencesFactory,
gemDeviceApiClient = gemDeviceApiClient,
saveTransactions = saveTransactions,
saveAddressNames = saveAddressNames,
prefetchAssets = prefetchAssets,
ensureWalletAssets = ensureWalletAssets,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.gemwallet.android.application.wallet.coordinators.ToggleWalletPin
import com.gemwallet.android.application.wallet.coordinators.WalletIdGenerator
import com.gemwallet.android.blockchain.operators.DeleteKeyStoreOperator
import com.gemwallet.android.blockchain.operators.LoadPrivateDataOperator
import com.gemwallet.android.cases.addresses.RenameWalletAddresses
import com.gemwallet.android.cases.device.SyncSubscription
import com.gemwallet.android.data.coordinators.wallet.DeleteWalletImpl
import com.gemwallet.android.data.coordinators.wallet.GetAllWalletsImpl
Expand Down Expand Up @@ -58,8 +59,9 @@ object WalletModule {
@Singleton
fun provideSetWalletName(
walletsRepository: WalletsRepository,
renameWalletAddresses: RenameWalletAddresses,
): SetWalletName {
return SetWalletNameImpl(walletsRepository)
return SetWalletNameImpl(walletsRepository, renameWalletAddresses)
}

@Provides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import com.gemwallet.android.model.Crypto
import com.gemwallet.android.model.TransactionExtended
import com.gemwallet.android.model.format
import com.gemwallet.android.domains.asset.chain
import com.wallet.core.primitives.AddressType
import com.wallet.core.primitives.Asset
import com.wallet.core.primitives.BlockExplorerLink
import com.wallet.core.primitives.Currency
Expand Down Expand Up @@ -189,29 +190,39 @@ class TransactionDetailsAggregateImpl(
TransactionType.StakeUnfreeze,
TransactionType.PerpetualModifyPosition,
TransactionType.StakeWithdraw -> null
TransactionType.TokenApproval -> destinationAddress { address, explorerLink ->
TransactionDetailsValue.Destination.Contract(address, explorerLink)
TransactionType.TokenApproval -> destinationAddress { address, name, explorerLink ->
TransactionDetailsValue.Destination.Contract(address, name, explorerLink)
}
TransactionType.StakeDelegate -> destinationAddress { address, explorerLink ->
TransactionDetailsValue.Destination.Validator(address, explorerLink)
TransactionType.StakeDelegate -> destinationAddress { address, name, explorerLink ->
TransactionDetailsValue.Destination.Validator(address, name, explorerLink)
}
TransactionType.SmartContractCall -> destinationAddress { address, explorerLink ->
TransactionType.SmartContractCall -> destinationAddress { address, name, explorerLink ->
when (data.transaction.getWalletConnectOutputAction()) {
TransferDataOutputAction.Send -> TransactionDetailsValue.Destination.Recipient(address, explorerLink)
TransferDataOutputAction.Send -> TransactionDetailsValue.Destination.Recipient(data = address, name = name, explorerLink = explorerLink)
TransferDataOutputAction.Sign,
null -> TransactionDetailsValue.Destination.Contract(address, explorerLink)
null -> TransactionDetailsValue.Destination.Contract(address, name, explorerLink)
}
}
TransactionType.EarnWithdraw,
TransactionType.EarnDeposit -> destinationAddress { address, explorerLink ->
TransactionDetailsValue.Destination.ProviderAddress(address, explorerLink)
TransactionType.EarnDeposit -> destinationAddress { address, name, explorerLink ->
TransactionDetailsValue.Destination.ProviderAddress(address, name, explorerLink)
}
TransactionType.Swap -> this@TransactionDetailsAggregateImpl.swapProvider?.let { TransactionDetailsValue.Destination.Provider(it) }
TransactionType.Transfer,
TransactionType.TransferNFT -> when (data.transaction.direction) {
TransactionDirection.SelfTransfer,
TransactionDirection.Outgoing -> TransactionDetailsValue.Destination.Recipient(data.transaction.to, recipientExplorerLink)
TransactionDirection.Incoming -> TransactionDetailsValue.Destination.Sender(data.transaction.from, senderExplorerLink)
TransactionDirection.Outgoing -> TransactionDetailsValue.Destination.Recipient(
data = data.transaction.to,
name = data.toAddress?.name,
addressType = data.toAddress?.type,
explorerLink = recipientExplorerLink,
)
TransactionDirection.Incoming -> TransactionDetailsValue.Destination.Sender(
data = data.transaction.from,
name = data.fromAddress?.name,
addressType = data.fromAddress?.type,
explorerLink = senderExplorerLink,
)
}
}

Expand All @@ -237,6 +248,13 @@ class TransactionDetailsAggregateImpl(
TransactionDirection.SelfTransfer -> data.transaction.to
}

private val participantAddressName: String?
get() = when (data.transaction.direction) {
TransactionDirection.Incoming -> data.fromAddress?.name
TransactionDirection.Outgoing,
TransactionDirection.SelfTransfer -> data.toAddress?.name
}

private val participantExplorerLink: BlockExplorerLink?
get() = when (participantAddress) {
data.transaction.from -> senderExplorerLink
Expand All @@ -245,8 +263,8 @@ class TransactionDetailsAggregateImpl(
}

private inline fun destinationAddress(
build: (address: String, explorerLink: BlockExplorerLink?) -> TransactionDetailsValue.Destination,
build: (address: String, name: String?, explorerLink: BlockExplorerLink?) -> TransactionDetailsValue.Destination,
): TransactionDetailsValue.Destination? = participantAddress
.takeIf { it.isNotEmpty() }
?.let { build(it, participantExplorerLink) }
?.let { build(it, participantAddressName, participantExplorerLink) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import com.gemwallet.android.ext.getSwapMetadata
import com.gemwallet.android.model.Crypto
import com.gemwallet.android.model.TransactionExtended
import com.gemwallet.android.model.format
import com.wallet.core.primitives.AddressName
import com.wallet.core.primitives.AddressType
import com.wallet.core.primitives.Asset
import com.wallet.core.primitives.TransactionDirection
import com.wallet.core.primitives.TransactionId
Expand Down Expand Up @@ -49,31 +51,48 @@ class GetTransactionsImpl(

@Stable
class TransactionDataAggregateImpl(
private val data: TransactionExtended
private val data: TransactionExtended,
) : TransactionDataAggregate {

override val id: TransactionId = data.transaction.id

override val asset: Asset = data.asset

private val participantAddressName: AddressName? = when (data.transaction.type) {
TransactionType.StakeDelegate,
TransactionType.StakeUndelegate,
TransactionType.StakeRedelegate,
TransactionType.EarnDeposit,
TransactionType.EarnWithdraw -> data.toAddress
else -> when (data.transaction.direction) {
TransactionDirection.Incoming -> data.fromAddress
TransactionDirection.Outgoing,
TransactionDirection.SelfTransfer -> data.toAddress
}
}

override val addressName: String? = participantAddressName?.name

override val addressType: AddressType? = participantAddressName?.type

override val address: String get() = when (data.transaction.type) {
TransactionType.TransferNFT,
TransactionType.Transfer -> when (data.transaction.direction) {
TransactionType.Transfer,
TransactionType.TokenApproval,
TransactionType.SmartContractCall -> when (data.transaction.direction) {
TransactionDirection.SelfTransfer,
TransactionDirection.Outgoing -> AddressFormatter(data.transaction.to, chain = data.transaction.assetId.chain).value()
TransactionDirection.Incoming -> AddressFormatter(data.transaction.from, chain = data.transaction.assetId.chain).value()
}
TransactionType.Swap,
TransactionType.TokenApproval,
TransactionType.StakeDelegate,
TransactionType.StakeUndelegate,
TransactionType.StakeRedelegate,
TransactionType.StakeWithdraw,
TransactionType.EarnWithdraw,
TransactionType.EarnDeposit,
TransactionType.EarnWithdraw -> AddressFormatter(data.transaction.to, chain = data.transaction.assetId.chain).value()
TransactionType.Swap,
TransactionType.StakeWithdraw,
TransactionType.AssetActivation,
TransactionType.StakeRewards,
TransactionType.SmartContractCall,
TransactionType.PerpetualOpenPosition,
TransactionType.StakeFreeze,
TransactionType.StakeUnfreeze,
Expand Down Expand Up @@ -152,5 +171,4 @@ class TransactionDataAggregateImpl(
decimalPlace = 2,
dynamicPlace = true,
)

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,57 @@ package com.gemwallet.android.data.coordinators.transaction
import com.gemwallet.android.application.assets.coordinators.EnsureWalletAssets
import com.gemwallet.android.application.assets.coordinators.PrefetchAssets
import com.gemwallet.android.application.transactions.coordinators.SyncTransactions
import com.gemwallet.android.cases.addresses.SaveAddressNames
import com.gemwallet.android.cases.transactions.SaveTransactions
import com.gemwallet.android.data.service.store.WalletPreferencesFactory
import com.gemwallet.android.data.services.gemapi.GemDeviceApiClient
import com.gemwallet.android.ext.getAssociatedAssetIds
import com.gemwallet.android.ext.identifier
import com.wallet.core.primitives.Transaction
import com.wallet.core.primitives.TransactionsResponse
import com.wallet.core.primitives.AssetId
import com.wallet.core.primitives.Wallet

class SyncTransactionsImpl(
private val walletPreferencesFactory: WalletPreferencesFactory,
private val gemDeviceApiClient: GemDeviceApiClient,
private val saveTransactions: SaveTransactions,
private val saveAddressNames: SaveAddressNames,
private val prefetchAssets: PrefetchAssets,
private val ensureWalletAssets: EnsureWalletAssets,
) : SyncTransactions {

override suspend fun syncTransactions(wallet: Wallet) {
val preferences = walletPreferencesFactory.create(wallet.id)
val transactions = runCatching {
gemDeviceApiClient.getTransactions(wallet.id, preferences.transactionsTimestamp)?.transactions
val response = runCatching {
gemDeviceApiClient.getTransactions(wallet.id, preferences.transactionsTimestamp)
}.getOrNull() ?: return

syncAssets(wallet, transactions)
saveTransactions.saveTransactions(walletId = wallet.id, transactions)
sync(wallet, response)
preferences.transactionsTimestamp = currentTimestamp()
}

override suspend fun syncTransactions(wallet: Wallet, assetId: AssetId) {
val preferences = walletPreferencesFactory.create(wallet.id)
val assetId = assetId.identifier
val timestamp = preferences.transactionsForAssetTimestamp(assetId)
val transactions = runCatching {
gemDeviceApiClient.getTransactions(wallet.id, assetId, timestamp)?.transactions
val response = runCatching {
gemDeviceApiClient.getTransactions(wallet.id, assetId, timestamp)
}.getOrNull() ?: return

syncAssets(wallet, transactions)
saveTransactions.saveTransactions(walletId = wallet.id, transactions)
sync(wallet, response)
preferences.setTransactionsForAssetTimestamp(assetId, currentTimestamp())
}

private fun currentTimestamp(): Long = System.currentTimeMillis() / 1000

private suspend fun syncAssets(wallet: Wallet, transactions: List<Transaction>) {
val assetIds = transactions
private suspend fun sync(wallet: Wallet, response: TransactionsResponse) {
val assetIds = response.transactions
.flatMap { it.getAssociatedAssetIds() }
.distinct()

prefetchAssets.prefetchAssets(assetIds)
ensureWalletAssets.ensureWalletAssets(wallet, assetIds)

saveTransactions.saveTransactions(walletId = wallet.id, response.transactions)
saveAddressNames.saveAddressNames(response.addressNames)
}

private fun currentTimestamp(): Long = System.currentTimeMillis() / 1000
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package com.gemwallet.android.data.coordinators.wallet

import com.gemwallet.android.application.wallet.coordinators.SetWalletName
import com.gemwallet.android.cases.addresses.RenameWalletAddresses
import com.gemwallet.android.data.repositories.wallets.WalletsRepository
import kotlinx.coroutines.flow.firstOrNull

class SetWalletNameImpl(
private val walletsRepository: WalletsRepository
private val walletsRepository: WalletsRepository,
private val renameWalletAddresses: RenameWalletAddresses,
) : SetWalletName {

override suspend fun setWalletName(walletId: String, name: String) {
val wallet = walletsRepository.getWallet(walletId).firstOrNull() ?: return
walletsRepository.updateWallet(wallet.copy(name = name))
renameWalletAddresses.renameWalletAddresses(walletId, name)
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.gemwallet.android.data.repositories.addresses

import com.gemwallet.android.cases.addresses.GetAddressName
import com.gemwallet.android.cases.addresses.RenameWalletAddresses
import com.gemwallet.android.cases.addresses.SaveAddressNames
import com.gemwallet.android.data.service.store.database.AddressesDao
import com.gemwallet.android.data.service.store.database.entities.toAddressRecords
import com.gemwallet.android.data.service.store.database.entities.toDTO
import com.gemwallet.android.data.service.store.database.entities.toRecord
import com.wallet.core.primitives.AddressName
import com.wallet.core.primitives.Chain
import com.wallet.core.primitives.Wallet

class AddressesRepository(
private val addressesDao: AddressesDao,
) : SaveAddressNames, GetAddressName, RenameWalletAddresses {

override suspend fun saveAddressNames(addressNames: List<AddressName>) {
if (addressNames.isEmpty()) return
addressesDao.insert(addressNames.toRecord())
}

override suspend fun getAddressName(chain: Chain, address: String): AddressName? {
if (address.isEmpty()) return null
return addressesDao.get(chain, address)?.toDTO()
}

override suspend fun renameWalletAddresses(walletId: String, name: String) {
addressesDao.updateName(walletId, name)
}

suspend fun saveWalletAddresses(wallet: Wallet) {
addressesDao.insert(wallet.toAddressRecords())
}
}
Loading