Skip to content
Closed
Show file tree
Hide file tree
Changes from all 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
3,351 changes: 3,351 additions & 0 deletions app/schemas/one.mixin.android.db.MixinDatabase/71.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion app/src/main/java/one/mixin/android/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ object Constants {
object DataBase {
const val DB_NAME = "mixin.db"
const val MINI_VERSION = 15
const val CURRENT_VERSION = 70
const val CURRENT_VERSION = 71

const val FTS_DB_NAME = "fts.db"
const val PENDING_DB_NAME = "pending.db"
Expand Down
138 changes: 69 additions & 69 deletions app/src/main/java/one/mixin/android/db/MessageDao.kt

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions app/src/main/java/one/mixin/android/db/MixinDatabase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,15 @@ import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_66_67
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_67_68
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_68_69
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_69_70
import one.mixin.android.db.MixinDatabaseMigrations.Companion.MIGRATION_70_71
import one.mixin.android.db.converter.DepositEntryListConverter
import one.mixin.android.db.converter.FiatOrderConverter

import one.mixin.android.db.converter.MembershipConverter
import one.mixin.android.db.converter.MessageStatusConverter
import one.mixin.android.db.converter.OutputStateConverter
import one.mixin.android.db.converter.PriceListConverter
import one.mixin.android.db.converter.RawTransactionStateConverter
import one.mixin.android.db.converter.RawTransactionTypeConverter
import one.mixin.android.db.converter.SafeDepositConverter
import one.mixin.android.db.converter.SafeWithdrawalConverter
Expand Down Expand Up @@ -208,6 +210,7 @@ import kotlin.math.min
SafeDepositConverter::class,
SafeWithdrawalConverter::class,
RawTransactionTypeConverter::class,
RawTransactionStateConverter::class,
OutputStateConverter::class,
TreasuryConverter::class,
PriceListConverter::class,
Expand Down Expand Up @@ -427,6 +430,7 @@ abstract class MixinDatabase : RoomDatabase() {
MIGRATION_67_68,
MIGRATION_68_69,
MIGRATION_69_70,
MIGRATION_70_71,
)
.enableMultiInstanceInvalidation()
.setQueryExecutor(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,14 @@ class MixinDatabaseMigrations private constructor() {
}
}

val MIGRATION_70_71: Migration =
object : Migration(70, 71) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("UPDATE raw_transactions SET state = 'spent' WHERE state = 'signed'")
db.execSQL("UPDATE raw_transactions SET state = 'signed' WHERE state = 'unspent'")
}
}

// If you add a new table, be sure to add a clear method to the DatabaseUtil
}
}
8 changes: 4 additions & 4 deletions app/src/main/java/one/mixin/android/db/RawTransactionDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import one.mixin.android.vo.safe.RawTransaction

@Dao
interface RawTransactionDao : BaseDao<RawTransaction> {
@Query("SELECT * FROM raw_transactions WHERE state = 'unspent' AND (type = 0 OR type = 1) ORDER BY rowid ASC LIMIT 1")
fun findUnspentTransaction(): RawTransaction?
@Query("SELECT * FROM raw_transactions WHERE state = 'signed' AND (type = 0 OR type = 1) ORDER BY rowid ASC LIMIT 1")
fun findSignedTransaction(): RawTransaction?

@Query("SELECT count(1) FROM raw_transactions WHERE state = 'unspent' AND (type = 0 OR type = 1)")
suspend fun countUnspentTransaction(): Int
@Query("SELECT count(1) FROM raw_transactions WHERE state = 'signed' AND (type = 0 OR type = 1)")
suspend fun countSignedTransaction(): Int

@Query("SELECT * FROM raw_transactions WHERE request_id = :requestId")
fun findRawTransaction(requestId: String): RawTransaction?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package one.mixin.android.db.converter

import androidx.room.TypeConverter
import one.mixin.android.vo.safe.RawTransactionState
import java.util.Locale

class RawTransactionStateConverter {
@TypeConverter
fun toRawTransactionState(value: String): RawTransactionState {
return RawTransactionState.valueOf(value.lowercase(Locale.US))
}

@TypeConverter
fun fromRawTransactionState(state: RawTransactionState): String {
return state.name.lowercase(Locale.US)
}
}
16 changes: 8 additions & 8 deletions app/src/main/java/one/mixin/android/job/RestoreTransactionJob.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import one.mixin.android.vo.createConversation
import one.mixin.android.vo.createMessage
import one.mixin.android.vo.generateConversationId
import one.mixin.android.vo.notMessengerUser
import one.mixin.android.vo.safe.OutputState
import one.mixin.android.vo.safe.RawTransactionState
import one.mixin.android.vo.safe.RawTransactionType
import one.mixin.android.vo.safe.SafeSnapshotType
import timber.log.Timber
Expand All @@ -44,7 +44,7 @@ class RestoreTransactionJob : BaseJob(
) {
while (true) {
val transaction =
rawTransactionDao.findUnspentTransaction() ?: return@runBlocking
rawTransactionDao.findSignedTransaction() ?: return@runBlocking

val feeTraceId = uniqueObjectId(transaction.requestId, "FEE")
val feeTransaction = rawTransactionDao.findRawTransaction(feeTraceId, RawTransactionType.FEE.value)
Expand All @@ -55,9 +55,9 @@ class RestoreTransactionJob : BaseJob(
Timber.e("Restore Transaction(${transaction.requestId}): db begin")
appDatabase.runInTransaction {
Timber.e("Restore Transaction(${transaction.requestId}): update raw transaction ${transaction.requestId}")
rawTransactionDao.updateRawTransaction(transaction.requestId, OutputState.signed.name)
rawTransactionDao.updateRawTransaction(transaction.requestId, RawTransactionState.spent.name)
Timber.e("Restore Transaction(${transaction.requestId}): update raw transaction $feeTraceId")
rawTransactionDao.updateRawTransaction(feeTraceId, OutputState.signed.name)
rawTransactionDao.updateRawTransaction(feeTraceId, RawTransactionState.spent.name)
}
Timber.e("Restore Transaction(${transaction.requestId}): db end")
if (feeTransaction == null) {
Expand All @@ -82,9 +82,9 @@ class RestoreTransactionJob : BaseJob(
Timber.e("Restore Transaction(${transaction.requestId}): db begin")
appDatabase.runInTransaction {
Timber.e("Restore Transaction(${transaction.requestId}): update raw transaction ${transaction.requestId}")
rawTransactionDao.updateRawTransaction(transaction.requestId, OutputState.signed.name)
rawTransactionDao.updateRawTransaction(transaction.requestId, RawTransactionState.spent.name)
Timber.e("Restore Transaction(${transaction.requestId}): update raw transaction $feeTraceId")
rawTransactionDao.updateRawTransaction(feeTraceId, OutputState.signed.name)
rawTransactionDao.updateRawTransaction(feeTraceId, RawTransactionState.spent.name)
}
Timber.e("Restore Transaction(${transaction.requestId}): db end")
if (feeTransaction == null && transaction.receiverId.isNotBlank()) {
Expand All @@ -93,8 +93,8 @@ class RestoreTransactionJob : BaseJob(
} else {
Timber.e("Restore Transaction(${transaction.requestId}): Post Transaction Error ${transactionRsp.errorDescription}")
reportException(e = Throwable("Transaction Error ${transactionRsp.errorDescription}"))
rawTransactionDao.updateRawTransaction(transaction.requestId, OutputState.signed.name)
rawTransactionDao.updateRawTransaction(feeTraceId, OutputState.signed.name)
rawTransactionDao.updateRawTransaction(transaction.requestId, RawTransactionState.spent.name)
rawTransactionDao.updateRawTransaction(feeTraceId, RawTransactionState.spent.name)
}
jobManager.addJobInBackground(SyncOutputJob())
} else if (response.errorCode >= 500) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1007,7 +1007,7 @@ class TokenRepository

suspend fun removeUtxo(outputId: String) = outputDao.removeUtxo(outputId)

fun firstUnspentTransaction() = rawTransactionDao.findUnspentTransaction()
fun firstSignedTransaction() = rawTransactionDao.findSignedTransaction()

suspend fun findLastWithdrawalSnapshotByReceiver(formatDestination: String) = safeSnapshotDao.findLastWithdrawalSnapshotByReceiver(formatDestination)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ import one.mixin.android.vo.notMessengerUser
import one.mixin.android.vo.safe.Output
import one.mixin.android.vo.safe.OutputState
import one.mixin.android.vo.safe.RawTransaction
import one.mixin.android.vo.safe.RawTransactionState
import one.mixin.android.vo.safe.RawTransactionType
import one.mixin.android.vo.safe.SafeSnapshot
import one.mixin.android.vo.safe.SafeSnapshotType
Expand Down Expand Up @@ -371,9 +372,9 @@ class BottomSheetViewModel
Timber.e("Kernel Withdrawal($traceId): db insert fee snapshot")
tokenRepository.insertSafeSnapshot(UUID.nameUUIDFromBytes("$senderId:$feeTransactionHash".toByteArray()).toString(), senderId, receiverId, feeTransactionHash, feeTraceId, feeAssetId, feeAmount, "", SafeSnapshotType.snapshot)
Timber.e("Kernel Withdrawal($traceId): db raw transaction")
tokenRepository.insetRawTransaction(RawTransaction(withdrawalData.requestId, signWithdrawalResult.raw, formatDestination(destination, tag), RawTransactionType.WITHDRAWAL, OutputState.unspent, nowInUtc(), withdrawalUtxos.inscriptionHash))
tokenRepository.insetRawTransaction(RawTransaction(withdrawalData.requestId, signWithdrawalResult.raw, formatDestination(destination, tag), RawTransactionType.WITHDRAWAL, RawTransactionState.signed, nowInUtc(), withdrawalUtxos.inscriptionHash))
Timber.e("Kernel Withdrawal($traceId): db insert fee raw transaction")
tokenRepository.insetRawTransaction(RawTransaction(feeData.requestId, signFeeResult.raw, receiverId, RawTransactionType.FEE, OutputState.unspent, nowInUtc(), null))
tokenRepository.insetRawTransaction(RawTransaction(feeData.requestId, signFeeResult.raw, receiverId, RawTransactionType.FEE, RawTransactionState.signed, nowInUtc(), null))
}
Timber.e("Kernel Withdrawal($traceId): db end")
jobManager.addJobInBackground(CheckBalanceJob(arrayListOf(assetIdToAsset(assetId), assetIdToAsset(feeAssetId))))
Expand Down Expand Up @@ -406,7 +407,7 @@ class BottomSheetViewModel
),
)
Timber.e("Kernel Withdrawal($traceId): db update raw transaction")
tokenRepository.insetRawTransaction(RawTransaction(withdrawalData.requestId, signWithdrawalResult.raw, formatDestination(destination, tag), RawTransactionType.WITHDRAWAL, OutputState.unspent, nowInUtc(), withdrawalUtxos.inscriptionHash))
tokenRepository.insetRawTransaction(RawTransaction(withdrawalData.requestId, signWithdrawalResult.raw, formatDestination(destination, tag), RawTransactionType.WITHDRAWAL, RawTransactionState.signed, nowInUtc(), withdrawalUtxos.inscriptionHash))
}
Timber.e("Kernel Withdrawal($traceId): db end")
jobManager.addJobInBackground(CheckBalanceJob(arrayListOf(assetIdToAsset(assetId))))
Expand All @@ -422,12 +423,12 @@ class BottomSheetViewModel
if (transactionRsp.error != null) {
Timber.e("Kernel Withdrawal($traceId): withdrawal error ${transactionRsp.errorDescription}")
reportException(Throwable("Transaction Error ${transactionRsp.errorDescription}"))
tokenRepository.updateRawTransaction(traceId, OutputState.signed.name)
tokenRepository.updateRawTransaction(feeTraceId, OutputState.signed.name)
tokenRepository.updateRawTransaction(traceId, RawTransactionState.spent.name)
tokenRepository.updateRawTransaction(feeTraceId, RawTransactionState.spent.name)
return transactionRsp
} else {
tokenRepository.updateRawTransaction(traceId, OutputState.signed.name)
tokenRepository.updateRawTransaction(feeTraceId, OutputState.signed.name)
tokenRepository.updateRawTransaction(traceId, RawTransactionState.spent.name)
tokenRepository.updateRawTransaction(feeTraceId, RawTransactionState.spent.name)
}
jobManager.addJobInBackground(SyncOutputJob())
Timber.e("Kernel Withdrawal($traceId): withdrawal end")
Expand All @@ -452,7 +453,7 @@ class BottomSheetViewModel

Timber.e("Kernel Address Transaction($trace): begin")
val rawTransaction = tokenRepository.findRawTransaction(trace)
if (rawTransaction?.state == OutputState.unspent) {
if (rawTransaction?.state == RawTransactionState.signed) {
Timber.e("Kernel Address Transaction($trace): sync restore")
return innerTransaction(rawTransaction.rawTransaction, trace, listOf(), utxoWrapper.inscriptionHash)
}
Expand Down Expand Up @@ -501,7 +502,7 @@ class BottomSheetViewModel
Timber.e("Kernel Address Transaction($trace): sign db insert snapshot")
tokenRepository.insertSafeSnapshot(UUID.nameUUIDFromBytes("$senderId:$transactionHash".toByteArray()).toString(), senderId, kernelAddress, transactionHash, trace, assetId, amount, memo, SafeSnapshotType.snapshot, reference = reference)
Timber.e("Kernel Address Transaction($trace): sign db insert raw transaction")
tokenRepository.insetRawTransaction(RawTransaction(transactionResponse.data!!.first().requestId, signResult.raw, "", RawTransactionType.TRANSFER, OutputState.unspent, nowInUtc(), utxoWrapper.inscriptionHash))
tokenRepository.insetRawTransaction(RawTransaction(transactionResponse.data!!.first().requestId, signResult.raw, "", RawTransactionType.TRANSFER, RawTransactionState.signed, nowInUtc(), utxoWrapper.inscriptionHash))
Timber.e("Kernel Address Transaction($trace): sign db mark utxo ${utxoWrapper.ids.joinToString(", ")}")
tokenRepository.updateUtxoToSigned(utxoWrapper.ids)
Timber.e("Kernel Address Transaction: sign end")
Expand Down Expand Up @@ -592,7 +593,7 @@ class BottomSheetViewModel
tokenRepository.insertSafeSnapshot(UUID.nameUUIDFromBytes("${senderIds.first()}:$transactionHash".toByteArray()).toString(), senderIds.first(), opponentId, transactionHash, trace, assetId, amount, memo, SafeSnapshotType.snapshot, reference = reference ?: (if (release == true) null else inscriptionHash))
}
Timber.e("Kernel Transaction($trace): sign db insert raw transaction")
tokenRepository.insetRawTransaction(RawTransaction(transactionResponse.data!!.first().requestId, signResult.raw, receiverIds.joinToString(","), RawTransactionType.TRANSFER, OutputState.unspent, nowInUtc(), if (release == true) null else utxoWrapper.inscriptionHash))
tokenRepository.insetRawTransaction(RawTransaction(transactionResponse.data!!.first().requestId, signResult.raw, receiverIds.joinToString(","), RawTransactionType.TRANSFER, RawTransactionState.signed, nowInUtc(), if (release == true) null else utxoWrapper.inscriptionHash))
Timber.e("Kernel Transaction($trace): sign db mark utxo ${utxoWrapper.ids.joinToString(", ")}")
tokenRepository.updateUtxoToSigned(utxoWrapper.ids)
Timber.e("Kernel Transaction: sign end")
Expand Down Expand Up @@ -622,11 +623,11 @@ class BottomSheetViewModel
if (transactionRsp.error != null) {
Timber.e("Kernel Transaction($traceId): innerTransaction error ${transactionRsp.errorDescription}")
reportException(Throwable("Transaction Error ${transactionRsp.errorDescription}"))
tokenRepository.updateRawTransaction(transactionRsp.data!!.first().requestId, OutputState.signed.name)
tokenRepository.updateRawTransaction(transactionRsp.data!!.first().requestId, RawTransactionState.spent.name)
return transactionRsp
} else {
Timber.e("Kernel Transaction($traceId): innerTransaction update raw transaction")
tokenRepository.updateRawTransaction(transactionRsp.data!!.first().requestId, OutputState.signed.name)
tokenRepository.updateRawTransaction(transactionRsp.data!!.first().requestId, RawTransactionState.spent.name)
}
if (receiverIds.size == 1 && !isConsolidation) {
// Workaround with only the case of a single transfer
Expand Down Expand Up @@ -813,7 +814,7 @@ class BottomSheetViewModel
""
} else {
recipient.uuidMembers.joinToString(",")
}, RawTransactionType.TRANSFER, OutputState.unspent, nowInUtc(), null
}, RawTransactionType.TRANSFER, RawTransactionState.signed, nowInUtc(), null
)
)
Timber.e("Kernel Duplicate Invoice Transaction(${signedTransaction.trace}): sign db mark utxo ${signedTransaction.utxoWrapperIds.joinToString(", ")}")
Expand All @@ -830,7 +831,7 @@ class BottomSheetViewModel
signedResponse.data?.forEach {
tokenRepository.updateRawTransaction(
it.requestId,
OutputState.signed.name
RawTransactionState.spent.name
)
}
Timber.e("Kernel Duplicate Invoice Transaction(${signedTransaction.trace}): sign db end")
Expand Down Expand Up @@ -1029,7 +1030,7 @@ class BottomSheetViewModel
""
} else {
invoice.recipient.uuidMembers.joinToString(",")
}, RawTransactionType.TRANSFER, OutputState.unspent, nowInUtc(), null
}, RawTransactionType.TRANSFER, RawTransactionState.signed, nowInUtc(), null
)
)
Timber.e("Kernel Invoice Transaction(${t.trace}): sign db mark utxo ${t.utxoWrapperIds.joinToString(", ")}")
Expand All @@ -1049,7 +1050,7 @@ class BottomSheetViewModel
appDatabase.runInTransaction {
Timber.e("Kernel Invoice Transaction: sign db begin")
signedResponse.data?.forEach {
tokenRepository.updateRawTransaction(it.requestId, OutputState.signed.name)
tokenRepository.updateRawTransaction(it.requestId, RawTransactionState.spent.name)
}
Timber.e("Kernel Invoice Transaction: sign db end")
}
Expand Down Expand Up @@ -1757,9 +1758,9 @@ class BottomSheetViewModel
}
}

suspend fun firstUnspentTransaction() =
suspend fun firstSignedTransaction() =
withContext(Dispatchers.IO) {
tokenRepository.firstUnspentTransaction()
tokenRepository.firstSignedTransaction()
}

suspend fun getScheme(id: String) = accountRepository.getScheme(id)
Expand Down
Loading