From 0ed5731ff47302a2a380e9f2e5ca66288b1a25b3 Mon Sep 17 00:00:00 2001 From: Kevin Gorham Date: Tue, 19 Feb 2019 13:09:01 -0500 Subject: [PATCH] Add address information to notes query and other cleanup --- build.gradle | 9 ++++++--- .../cash/z/wallet/sdk/db/IntegrationTest.kt | 7 +++---- .../cash/z/wallet/sdk/dao/TransactionDao.kt | 2 ++ .../sdk/data/ActiveTransactionManager.kt | 18 ++++++++++++++++-- .../cash/z/wallet/sdk/data/MockSynchronizer.kt | 5 ++--- .../cash/z/wallet/sdk/ext/CurrencyFormatter.kt | 4 ++-- .../java/cash/z/wallet/sdk/secure/Wallet.kt | 18 +++++++++--------- 7 files changed, 40 insertions(+), 23 deletions(-) diff --git a/build.gradle b/build.gradle index 0fada87f..0b558547 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.getkeepsafe.dexcount' group = 'cash.z.android.wallet' -version = '1.6.0' +version = '1.7.3' repositories { google() @@ -51,7 +51,7 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 28 - versionCode = 1_06_00 + versionCode = 1_07_03 versionName = version testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true @@ -74,7 +74,10 @@ android { } } } - + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } kotlinOptions { // Allow the use of Result objects understanding that if the API changes, we'll have to fix it before upgrading our kotlin version freeCompilerArgs = ["-Xallow-result-return-type"] diff --git a/src/androidTest/java/cash/z/wallet/sdk/db/IntegrationTest.kt b/src/androidTest/java/cash/z/wallet/sdk/db/IntegrationTest.kt index 8c20d5ac..d10a1285 100644 --- a/src/androidTest/java/cash/z/wallet/sdk/db/IntegrationTest.kt +++ b/src/androidTest/java/cash/z/wallet/sdk/db/IntegrationTest.kt @@ -52,17 +52,16 @@ class IntegrationTest { wallet = Wallet(converter, context.getDatabasePath(dataDbName).absolutePath, context.cacheDir.absolutePath, arrayOf(0), SampleSeedProvider("dummyseed"), SampleSpendingKeyProvider("dummyseed"), logger) // repository.start(this) - synchronizer = Synchronizer( + synchronizer = SdkSynchronizer( downloader, processor, repository, ActiveTransactionManager(repository, downloader.connection, wallet, logger), wallet, - 1000, - logger + 1000 ).start(this) - for(i in synchronizer.downloader.progress()) { + for(i in synchronizer.progress()) { logger.twig("made progress: $i") } } diff --git a/src/main/java/cash/z/wallet/sdk/dao/TransactionDao.kt b/src/main/java/cash/z/wallet/sdk/dao/TransactionDao.kt index 7c63b8ef..90767691 100644 --- a/src/main/java/cash/z/wallet/sdk/dao/TransactionDao.kt +++ b/src/main/java/cash/z/wallet/sdk/dao/TransactionDao.kt @@ -24,6 +24,7 @@ interface TransactionDao { transactions.raw IS NOT NULL AS isSend, transactions.block IS NOT NULL AS isMined, blocks.time AS timeInSeconds, + sent_notes.address AS address, CASE WHEN transactions.raw IS NOT NULL THEN sent_notes.value ELSE received_notes.value @@ -53,5 +54,6 @@ data class WalletTransaction( val height: Int? = null, val isSend: Boolean = false, val timeInSeconds: Long = 0L, + val address: String? = null, val isMined: Boolean = false ) \ No newline at end of file diff --git a/src/main/java/cash/z/wallet/sdk/data/ActiveTransactionManager.kt b/src/main/java/cash/z/wallet/sdk/data/ActiveTransactionManager.kt index be9adb32..7e4a830a 100644 --- a/src/main/java/cash/z/wallet/sdk/data/ActiveTransactionManager.kt +++ b/src/main/java/cash/z/wallet/sdk/data/ActiveTransactionManager.kt @@ -279,6 +279,8 @@ interface ActiveTransaction { } sealed class TransactionState(val order: Int) { + val timestamp: Long = System.currentTimeMillis() + object Creating : TransactionState(0) /** @param txId row in the database where the raw transaction has been stored, temporarily, by the rust lib */ @@ -286,13 +288,25 @@ sealed class TransactionState(val order: Int) { object SendingToNetwork : TransactionState(20) - class AwaitingConfirmations(val confirmationCount: Int) : TransactionState(30) + class AwaitingConfirmations(val confirmationCount: Int) : TransactionState(30) { + override fun toString(): String { + return "${super.toString()}($confirmationCount)" + } + } object Cancelled : TransactionState(-1) /** @param failedStep the state of this transaction at the time, prior to failure */ - class Failure(val failedStep: TransactionState?, val reason: String = "") : TransactionState(-2) + class Failure(val failedStep: TransactionState?, val reason: String = "") : TransactionState(-2) { + override fun toString(): String { + return "${super.toString()}($failedStep) : $reason" + } + } fun isActive(): Boolean { return order > 0 } + + override fun toString(): String { + return javaClass.simpleName + } } \ No newline at end of file diff --git a/src/main/java/cash/z/wallet/sdk/data/MockSynchronizer.kt b/src/main/java/cash/z/wallet/sdk/data/MockSynchronizer.kt index 9eb7c5e5..43235dad 100644 --- a/src/main/java/cash/z/wallet/sdk/data/MockSynchronizer.kt +++ b/src/main/java/cash/z/wallet/sdk/data/MockSynchronizer.kt @@ -46,10 +46,10 @@ open class MockSynchronizer( private val forge = Forge() - private val balanceChannel = ConflatedBroadcastChannel(0L) + private val balanceChannel = ConflatedBroadcastChannel() private val activeTransactionsChannel = ConflatedBroadcastChannel>(mutableMapOf()) private val transactionsChannel = ConflatedBroadcastChannel>(listOf()) - private val progressChannel = ConflatedBroadcastChannel(0) + private val progressChannel = ConflatedBroadcastChannel() override fun start(parentScope: CoroutineScope): Synchronizer { Twig.sprout("mock") @@ -168,7 +168,6 @@ open class MockSynchronizer( return true } - /* creators */ private inner class Forge { diff --git a/src/main/java/cash/z/wallet/sdk/ext/CurrencyFormatter.kt b/src/main/java/cash/z/wallet/sdk/ext/CurrencyFormatter.kt index 9e37dbbc..a1737258 100644 --- a/src/main/java/cash/z/wallet/sdk/ext/CurrencyFormatter.kt +++ b/src/main/java/cash/z/wallet/sdk/ext/CurrencyFormatter.kt @@ -169,7 +169,7 @@ inline fun BigDecimal?.toUsd(decimals: Int = USD_FORMATTER.maximumFractionDigits */ inline fun BigDecimal?.convertZecToUsd(zecPrice: BigDecimal): BigDecimal { if(this == null) return BigDecimal.ZERO - if(this < BigDecimal.ZERO) throw IllegalArgumentException("Invalid ZEC value: $zecPrice. ZEC is represented by notes and cannot be negative") + if(this < BigDecimal.ZERO) throw IllegalArgumentException("Invalid ZEC value: ${zecPrice.toDouble()}. ZEC is represented by notes and cannot be negative") return this.multiply(zecPrice, MathContext.DECIMAL128) } @@ -180,7 +180,7 @@ inline fun BigDecimal?.convertZecToUsd(zecPrice: BigDecimal): BigDecimal { */ inline fun BigDecimal?.convertUsdToZec(zecPrice: BigDecimal): BigDecimal { if(this == null) return BigDecimal.ZERO - if(this < BigDecimal.ZERO) throw IllegalArgumentException("Invalid USD value: $zecPrice. Converting this would result in negative ZEC and ZEC is represented by notes and cannot be negative") + if(this < BigDecimal.ZERO) throw IllegalArgumentException("Invalid USD value: ${zecPrice.toDouble()}. Converting this would result in negative ZEC and ZEC is represented by notes and cannot be negative") return this.divide(zecPrice, MathContext.DECIMAL128) } diff --git a/src/main/java/cash/z/wallet/sdk/secure/Wallet.kt b/src/main/java/cash/z/wallet/sdk/secure/Wallet.kt index 3950eb50..f7b5254f 100644 --- a/src/main/java/cash/z/wallet/sdk/secure/Wallet.kt +++ b/src/main/java/cash/z/wallet/sdk/secure/Wallet.kt @@ -1,8 +1,6 @@ package cash.z.wallet.sdk.secure -import cash.z.wallet.sdk.data.SilentTwig -import cash.z.wallet.sdk.data.Twig -import cash.z.wallet.sdk.data.twigTask +import cash.z.wallet.sdk.data.* import cash.z.wallet.sdk.exception.WalletException import cash.z.wallet.sdk.ext.masked import cash.z.wallet.sdk.jni.JniConverter @@ -27,9 +25,8 @@ class Wallet( /** indexes of accounts ids. In the reference wallet, we only work with account 0 */ private val accountIds: Array = arrayOf(0), private val seedProvider: ReadOnlyProperty, - spendingKeyProvider: ReadWriteProperty, - logger: Twig = SilentTwig() -) : Twig by logger { + spendingKeyProvider: ReadWriteProperty +) { var spendingKeyStore by spendingKeyProvider init { @@ -44,6 +41,9 @@ class Wallet( fun initialize(firstRunStartHeight: Int = 280000): Int { twig("Initializing wallet for first run") converter.initDataDb(dbDataPath) + //TODO: pass this into the synchronizer and leverage it here + converter.initBlocksTable(dbDataPath, 421720, 1550762014, "015495a30aef9e18b9c774df6a9fcd583748c8bba1a6348e70f59bc9f0c2bc673b000f00000000018054b75173b577dc36f2c80dfc41f83d6716557597f74ec54436df32d4466d57000120f1825067a52ca973b07431199d5866a0d46ef231d08aa2f544665936d5b4520168d782e3d028131f59e9296c75de5a101898c5e53108e45baa223c608d6c3d3d01fb0a8d465b57c15d793c742df9470b116ddf06bd30d42123fdb7becef1fd63640001a86b141bdb55fd5f5b2e880ea4e07caf2bbf1ac7b52a9f504977913068a917270001dd960b6c11b157d1626f0768ec099af9385aea3f31c91111a8c5b899ffb99e6b0192acd61b1853311b0bf166057ca433e231c93ab5988844a09a91c113ebc58e18019fbfd76ad6d98cafa0174391546e7022afe62e870e20e16d57c4c419a5c2bb69") + // securely store the spendingkey by leveraging the utilities provided during construction val seed by seedProvider val accountSpendingKeys = converter.initAccountsTable(dbDataPath, seed, 1) @@ -54,7 +54,7 @@ class Wallet( // TODO: then use that to determine firstRunStartHeight // val firstRunStartHeight = 405410 - return firstRunStartHeight + return 421720 } fun getAddress(accountId: Int = accountIds[0]): String { @@ -79,7 +79,7 @@ class Wallet( suspend fun createRawSendTransaction(value: Long, toAddress: String, memo: String = "", fromAccountId: Int = accountIds[0]): Long = withContext(IO) { var result = -1L - twigTask("creating raw transaction to send $value zatoshi to ${toAddress.masked()}") { + Bush.trunk.twigTask("creating raw transaction to send $value zatoshi to ${toAddress.masked()}") { result = runCatching { ensureParams(paramDestinationDir) twig("params exist at $paramDestinationDir! attempting to send...") @@ -139,7 +139,7 @@ class Wallet( } if (hadError) { try { - twigTask("attempting to download missing params") { + Bush.trunk.twigTask("attempting to download missing params") { fetchParams(destinationDir) } } catch (e: Throwable) {