From e01a9064072dc7a71277ae7a78f623e9a65cd558 Mon Sep 17 00:00:00 2001 From: Carter Jernigan Date: Tue, 2 Aug 2022 09:29:09 -0400 Subject: [PATCH] [#593] Refactor ZcashNetwork Splits the ZcashNetwork and Lightwalletd server information, making it easier to configure different servers --- CHANGELOG.md | 4 + MIGRATIONS.md | 9 ++ .../sdk/darkside/reorgs/InboundTxTests.kt | 2 +- .../sdk/darkside/reorgs/ReorgSetupTest.kt | 2 +- .../sdk/darkside/reorgs/ReorgSmallTest.kt | 2 +- .../android/sdk/darkside/test/DarksideApi.kt | 15 +-- .../darkside/test/DarksideTestCoordinator.kt | 9 +- .../android/sdk/darkside/test/TestWallet.kt | 57 ++++++-- .../sdk/sample/demoapp/SampleCodeTest.kt | 15 ++- .../z/ecc/android/sdk/demoapp/MainActivity.kt | 10 +- .../demos/getaddress/GetAddressFragment.kt | 2 +- .../demos/getbalance/GetBalanceFragment.kt | 12 +- .../demos/getblock/GetBlockFragment.kt | 2 +- .../getblockrange/GetBlockRangeFragment.kt | 2 +- .../getprivatekey/GetPrivateKeyFragment.kt | 2 +- .../ListTransactionsFragment.kt | 8 +- .../demos/listutxos/ListUtxosFragment.kt | 31 ++++- .../sdk/demoapp/demos/send/SendFragment.kt | 14 +- .../android/sdk/demoapp/util/NetworkExt.kt | 18 ++- .../java/cash/z/ecc/android/sdk/AssetTest.kt | 3 +- .../z/ecc/android/sdk/ext/TestExtensions.kt | 2 +- .../ecc/android/sdk/integration/SanityTest.kt | 22 +-- .../ecc/android/sdk/integration/SmokeTest.kt | 11 -- .../sdk/integration/TestnetIntegrationTest.kt | 15 ++- .../integration/service/ChangeServiceTest.kt | 15 ++- .../z/ecc/android/sdk/jni/BranchIdTest.kt | 2 +- .../z/ecc/android/sdk/jni/TransparentTest.kt | 2 +- .../android/sdk/sample/ShieldFundsSample.kt | 2 +- .../sdk/sample/TransparentRestoreSample.kt | 15 ++- .../android/sdk/tool/CheckpointToolTest.kt | 2 +- .../android/sdk/util/AddressGeneratorUtil.kt | 3 +- .../android/sdk/util/BalancePrinterUtil.kt | 8 +- .../ecc/android/sdk/util/DataDbScannerUtil.kt | 2 +- .../cash/z/ecc/android/sdk/util/TestWallet.kt | 57 ++++++-- .../sdk/util/TransactionCounterUtil.kt | 6 +- .../cash/z/ecc/fixture/CheckpointFixture.kt | 2 +- .../cash/z/ecc/android/sdk/Initializer.kt | 43 +++--- .../cash/z/ecc/android/sdk/SdkSynchronizer.kt | 18 +-- .../cash/z/ecc/android/sdk/Synchronizer.kt | 14 +- .../z/ecc/android/sdk/exception/Exceptions.kt | 2 +- .../ecc/android/sdk/internal/CheckpointExt.kt | 2 +- .../sdk/internal/block/CompactBlockDbStore.kt | 2 +- .../service/LightWalletGrpcService.kt | 125 ++++++------------ .../transaction/PagedTransactionRepository.kt | 2 +- .../cash/z/ecc/android/sdk/jni/RustBackend.kt | 2 +- .../ecc/android/sdk/jni/RustBackendWelding.kt | 2 +- .../z/ecc/android/sdk/model/BlockHeight.kt | 1 - .../android/sdk/model/LightWalletEndpoint.kt | 5 + .../sdk/model/LightWalletEndpointExt.kt | 44 ++++++ .../z/ecc/android/sdk/model/ZcashNetwork.kt | 43 ++++++ .../z/ecc/android/sdk/tool/CheckpointTool.kt | 2 +- .../z/ecc/android/sdk/tool/DerivationTool.kt | 2 +- .../z/ecc/android/sdk/type/ZcashNetwork.kt | 18 --- sdk-lib/src/main/res/values/bools.xml | 4 - sdk-lib/src/main/res/values/strings.xml | 3 - .../ecc/android/sdk/model/BlockHeightTest.kt | 1 - .../sdk/model/LightWalletEndpointTest.kt | 16 +++ 57 files changed, 429 insertions(+), 307 deletions(-) create mode 100644 sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/LightWalletEndpoint.kt create mode 100644 sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/LightWalletEndpointExt.kt create mode 100644 sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/ZcashNetwork.kt delete mode 100644 sdk-lib/src/main/java/cash/z/ecc/android/sdk/type/ZcashNetwork.kt delete mode 100644 sdk-lib/src/main/res/values/bools.xml delete mode 100644 sdk-lib/src/main/res/values/strings.xml create mode 100644 sdk-lib/src/test/java/cash/z/ecc/android/sdk/model/LightWalletEndpointTest.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index acb9e99c..4dc5e382 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change Log ========== +Upcoming +------------------------------------ + - Split `ZcashNetwork` into `ZcashNetwork` and `LightWalletEndpoint` to decouple network and server configuration + Version 1.8.0-beta01 ------------------------------------ - Added `BlockHeight` typesafe object to represent block heights diff --git a/MIGRATIONS.md b/MIGRATIONS.md index d7e64cb7..0bb71321 100644 --- a/MIGRATIONS.md +++ b/MIGRATIONS.md @@ -1,7 +1,16 @@ Troubleshooting Migrations ========== +Upcoming +-------------------------------------- +`ZcashNetwork` is no longer an enum. The prior enum values are now declared as object properties `ZcashNetwork.Mainnet` and `ZcashNetwork.Testnet`. For the most part, this change should have minimal impact. ZcashNetwork was also moved from the package `cash.z.ecc.android.sdk.type` to `cash.z.ecc.android.sdk.model`, which will require a change to your import statements. The server fields have been removed from `ZcashNetwork`, allowing server and network configuration to be done independently. + +`LightWalletEndpoint` is a new object to represent server information. Default values can be obtained from `LightWalletEndpoint.defaultForNetwork(ZcashNetwork)` + +`Synchronizer` no longer allows changing the endpoint after construction. Instead, construct a new `Synchronizer` with the desired endpoint. + Migration to Version 1.8 from 1.7 +-------------------------------------- Various APIs used `Int` to represent network block heights. Those APIs now use a typesafe `BlockHeight` type. BlockHeight is constructed with a factory method `BlockHeight.new(ZcashNetwork, Long)` which uses the network to validate the height is above the network's sapling activation height. `WalletBirthday` has been renamed to `Checkpoint` and removed from the public API. Where clients previously passed in a `WalletBirthday` object, now a `BlockHeight` can be passed in instead. diff --git a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/InboundTxTests.kt b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/InboundTxTests.kt index 02072114..36215e61 100644 --- a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/InboundTxTests.kt +++ b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/InboundTxTests.kt @@ -5,7 +5,7 @@ import cash.z.ecc.android.sdk.darkside.test.DarksideTestCoordinator import cash.z.ecc.android.sdk.darkside.test.ScopedTest import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import org.junit.BeforeClass import org.junit.Test import org.junit.runner.RunWith diff --git a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/ReorgSetupTest.kt b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/ReorgSetupTest.kt index cc72de24..50af386d 100644 --- a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/ReorgSetupTest.kt +++ b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/ReorgSetupTest.kt @@ -4,7 +4,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import cash.z.ecc.android.sdk.darkside.test.DarksideTestCoordinator import cash.z.ecc.android.sdk.darkside.test.ScopedTest import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import org.junit.Before import org.junit.BeforeClass import org.junit.Test diff --git a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/ReorgSmallTest.kt b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/ReorgSmallTest.kt index 00ae411c..9a3b45f9 100644 --- a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/ReorgSmallTest.kt +++ b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/reorgs/ReorgSmallTest.kt @@ -5,7 +5,7 @@ import cash.z.ecc.android.sdk.darkside.test.DarksideTestCoordinator import cash.z.ecc.android.sdk.darkside.test.ScopedTest import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import org.junit.Assert.assertTrue import org.junit.Before import org.junit.BeforeClass diff --git a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/DarksideApi.kt b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/DarksideApi.kt index a3eea926..4f10d494 100644 --- a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/DarksideApi.kt +++ b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/DarksideApi.kt @@ -1,11 +1,12 @@ package cash.z.ecc.android.sdk.darkside.test import android.content.Context -import cash.z.ecc.android.sdk.R import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.Darkside +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.wallet.sdk.rpc.Darkside import cash.z.wallet.sdk.rpc.Darkside.DarksideTransactionsURL import cash.z.wallet.sdk.rpc.DarksideStreamerGrpc @@ -23,17 +24,11 @@ class DarksideApi( constructor( appContext: Context, - host: String, - port: Int = ZcashNetwork.Mainnet.defaultPort, - usePlainText: Boolean = appContext.resources.getBoolean( - R.bool.lightwalletd_allow_very_insecure_connections - ) + lightWalletEndpoint: LightWalletEndpoint ) : this( LightWalletGrpcService.createDefaultChannel( appContext, - host, - port, - usePlainText + lightWalletEndpoint ) ) diff --git a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/DarksideTestCoordinator.kt b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/DarksideTestCoordinator.kt index 2b871eae..92bd4de2 100644 --- a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/DarksideTestCoordinator.kt +++ b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/DarksideTestCoordinator.kt @@ -5,7 +5,9 @@ import cash.z.ecc.android.sdk.SdkSynchronizer import cash.z.ecc.android.sdk.Synchronizer import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.Darkside +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.ZcashNetwork import io.grpc.StatusRuntimeException import kotlinx.coroutines.delay import kotlinx.coroutines.flow.filter @@ -23,10 +25,9 @@ class DarksideTestCoordinator(val wallet: TestWallet) { alias: String = "DarksideTestCoordinator", seedPhrase: String = DEFAULT_SEED_PHRASE, startHeight: BlockHeight = DEFAULT_START_HEIGHT, - host: String = COMPUTER_LOCALHOST, network: ZcashNetwork = ZcashNetwork.Mainnet, - port: Int = network.defaultPort - ) : this(TestWallet(seedPhrase, alias, network, host, startHeight = startHeight, port = port)) + endpoint: LightWalletEndpoint = LightWalletEndpoint.Darkside + ) : this(TestWallet(seedPhrase, alias, network, endpoint, startHeight = startHeight)) private val targetHeight = BlockHeight.new(wallet.network, 663250) private val context = InstrumentationRegistry.getInstrumentation().context diff --git a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/TestWallet.kt b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/TestWallet.kt index 9b859a1a..f7835308 100644 --- a/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/TestWallet.kt +++ b/darkside-test-lib/src/androidTest/java/cash/z/ecc/android/sdk/darkside/test/TestWallet.kt @@ -11,10 +11,12 @@ import cash.z.ecc.android.sdk.internal.Twig import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight +import cash.z.ecc.android.sdk.model.Darkside +import cash.z.ecc.android.sdk.model.LightWalletEndpoint import cash.z.ecc.android.sdk.model.WalletBalance import cash.z.ecc.android.sdk.model.Zatoshi +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.delay @@ -36,9 +38,8 @@ class TestWallet( val seedPhrase: String, val alias: String = "TestWallet", val network: ZcashNetwork = ZcashNetwork.Testnet, - val host: String = network.defaultHost, - startHeight: BlockHeight? = null, - val port: Int = network.defaultPort + val endpoint: LightWalletEndpoint = LightWalletEndpoint.Darkside, + startHeight: BlockHeight? = null ) { constructor( backup: Backups, @@ -66,7 +67,7 @@ class TestWallet( runBlocking { DerivationTool.deriveTransparentSecretKey(seed, network = network) } val initializer = runBlocking { Initializer.new(context) { config -> - runBlocking { config.importWallet(seed, startHeight, network, host, alias = alias) } + runBlocking { config.importWallet(seed, startHeight, network, endpoint, alias = alias) } } } val synchronizer: SdkSynchronizer = runBlocking { Synchronizer.new(initializer) } as SdkSynchronizer @@ -79,7 +80,6 @@ class TestWallet( runBlocking { DerivationTool.deriveTransparentAddress(seed, network = network) } val birthdayHeight get() = synchronizer.latestBirthdayHeight val networkName get() = synchronizer.network.networkName - val connectionInfo get() = service.connectionInfo.toString() suspend fun transparentBalance(): WalletBalance { synchronizer.refreshUtxos(transparentAddress, synchronizer.latestBirthdayHeight) @@ -166,11 +166,46 @@ class TestWallet( enum class Backups(val seedPhrase: String, val testnetBirthday: BlockHeight, val mainnetBirthday: BlockHeight) { // TODO: get the proper birthday values for these wallets - DEFAULT("column rhythm acoustic gym cost fit keen maze fence seed mail medal shrimp tell relief clip cannon foster soldier shallow refuse lunar parrot banana", BlockHeight.new(ZcashNetwork.Testnet, 1_355_928), BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000)), - SAMPLE_WALLET("input frown warm senior anxiety abuse yard prefer churn reject people glimpse govern glory crumble swallow verb laptop switch trophy inform friend permit purpose", BlockHeight.new(ZcashNetwork.Testnet, 1_330_190), BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000)), - DEV_WALLET("still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread", BlockHeight.new(ZcashNetwork.Testnet, 1_000_000), BlockHeight.new(ZcashNetwork.Mainnet, 991645)), - ALICE("quantum whisper lion route fury lunar pelican image job client hundred sauce chimney barely life cliff spirit admit weekend message recipe trumpet impact kitten", BlockHeight.new(ZcashNetwork.Testnet, 1_330_190), BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000)), - BOB("canvas wine sugar acquire garment spy tongue odor hole cage year habit bullet make label human unit option top calm neutral try vocal arena", BlockHeight.new(ZcashNetwork.Testnet, 1_330_190), BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000)), + DEFAULT( + "column rhythm acoustic gym cost fit keen maze fence seed mail medal shrimp tell relief clip cannon foster soldier shallow refuse lunar parrot banana", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_355_928 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000) + ), + SAMPLE_WALLET( + "input frown warm senior anxiety abuse yard prefer churn reject people glimpse govern glory crumble swallow verb laptop switch trophy inform friend permit purpose", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_330_190 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000) + ), + DEV_WALLET( + "still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_000_000 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 991645) + ), + ALICE( + "quantum whisper lion route fury lunar pelican image job client hundred sauce chimney barely life cliff spirit admit weekend message recipe trumpet impact kitten", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_330_190 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000) + ), + BOB( + "canvas wine sugar acquire garment spy tongue odor hole cage year habit bullet make label human unit option top calm neutral try vocal arena", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_330_190 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000) + ), ; } } diff --git a/demo-app/src/androidTest/java/cash/z/wallet/sdk/sample/demoapp/SampleCodeTest.kt b/demo-app/src/androidTest/java/cash/z/wallet/sdk/sample/demoapp/SampleCodeTest.kt index 55a2e5eb..60ae52f3 100644 --- a/demo-app/src/androidTest/java/cash/z/wallet/sdk/sample/demoapp/SampleCodeTest.kt +++ b/demo-app/src/androidTest/java/cash/z/wallet/sdk/sample/demoapp/SampleCodeTest.kt @@ -11,8 +11,10 @@ import cash.z.ecc.android.sdk.internal.Twig import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.Mainnet +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.flow.collect import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals @@ -87,15 +89,18 @@ class SampleCodeTest { // /////////////////////////////////////////////////// // Query latest block height @Test fun getLatestBlockHeightTest() { - val lightwalletService = LightWalletGrpcService(context, lightwalletdHost) + val lightwalletService = LightWalletGrpcService.new(context, lightwalletdHost) log("Latest Block: ${lightwalletService.getLatestBlockHeight()}") } // /////////////////////////////////////////////////// // Download compact block range @Test fun getBlockRange() { - val blockRange = BlockHeight.new(ZcashNetwork.Mainnet, 500_000)..BlockHeight.new(ZcashNetwork.Mainnet, 500_009) - val lightwalletService = LightWalletGrpcService(context, lightwalletdHost) + val blockRange = BlockHeight.new(ZcashNetwork.Mainnet, 500_000)..BlockHeight.new( + ZcashNetwork.Mainnet, + 500_009 + ) + val lightwalletService = LightWalletGrpcService.new(context, lightwalletdHost) val blocks = lightwalletService.getBlockRange(blockRange) assertEquals(blockRange.endInclusive.value - blockRange.start.value, blocks.count()) @@ -151,7 +156,7 @@ class SampleCodeTest { companion object { private val seed = "Insert seed for testing".toByteArray() - private val lightwalletdHost: String = ZcashNetwork.Mainnet.defaultHost + private val lightwalletdHost = LightWalletEndpoint.Mainnet private val context = InstrumentationRegistry.getInstrumentation().targetContext private val synchronizer: Synchronizer = run { diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/MainActivity.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/MainActivity.kt index 61e6bc83..cfae5f12 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/MainActivity.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/MainActivity.kt @@ -20,7 +20,9 @@ import androidx.viewbinding.ViewBinding import cash.z.ecc.android.sdk.demoapp.util.fromResources import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.internal.service.LightWalletService -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.ZcashNetwork +import cash.z.ecc.android.sdk.model.defaultForNetwork import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.navigation.NavigationView @@ -108,7 +110,11 @@ class MainActivity : if (lightwalletService != null) { lightwalletService?.shutdown() } - lightwalletService = LightWalletGrpcService(applicationContext, ZcashNetwork.fromResources(applicationContext)) + val network = ZcashNetwork.fromResources(applicationContext) + lightwalletService = LightWalletGrpcService.new( + applicationContext, + LightWalletEndpoint.defaultForNetwork(network) + ) } private fun onFabClicked(view: View) { diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getaddress/GetAddressFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getaddress/GetAddressFragment.kt index 6f45b4bc..df754ca8 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getaddress/GetAddressFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getaddress/GetAddressFragment.kt @@ -9,9 +9,9 @@ import cash.z.ecc.android.sdk.demoapp.BaseDemoFragment import cash.z.ecc.android.sdk.demoapp.databinding.FragmentGetAddressBinding import cash.z.ecc.android.sdk.demoapp.ext.requireApplicationContext import cash.z.ecc.android.sdk.demoapp.util.fromResources +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool import cash.z.ecc.android.sdk.type.UnifiedViewingKey -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getbalance/GetBalanceFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getbalance/GetBalanceFragment.kt index 8cb1b0de..c2879267 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getbalance/GetBalanceFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getbalance/GetBalanceFragment.kt @@ -14,9 +14,11 @@ import cash.z.ecc.android.sdk.demoapp.ext.requireApplicationContext import cash.z.ecc.android.sdk.demoapp.util.fromResources import cash.z.ecc.android.sdk.ext.collectWith import cash.z.ecc.android.sdk.ext.convertZatoshiToZecString +import cash.z.ecc.android.sdk.model.LightWalletEndpoint import cash.z.ecc.android.sdk.model.WalletBalance +import cash.z.ecc.android.sdk.model.ZcashNetwork +import cash.z.ecc.android.sdk.model.defaultForNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.runBlocking @@ -50,8 +52,12 @@ class GetBalanceFragment : BaseDemoFragment() { // using the ViewingKey to initialize runBlocking { Initializer.new(requireApplicationContext(), null) { - it.setNetwork(ZcashNetwork.fromResources(requireApplicationContext())) - it.newWallet(viewingKey, network = ZcashNetwork.fromResources(requireApplicationContext())) + val network = ZcashNetwork.fromResources(requireApplicationContext()) + it.newWallet( + viewingKey, + network = network, + lightWalletEndpoint = LightWalletEndpoint.defaultForNetwork(network) + ) } }.let { initializer -> synchronizer = Synchronizer.newBlocking(initializer) diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getblock/GetBlockFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getblock/GetBlockFragment.kt index 43485b67..161a1869 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getblock/GetBlockFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getblock/GetBlockFragment.kt @@ -14,7 +14,7 @@ import cash.z.ecc.android.sdk.demoapp.util.toRelativeTime import cash.z.ecc.android.sdk.demoapp.util.withCommas import cash.z.ecc.android.sdk.ext.toHex import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import kotlin.math.min /** diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getblockrange/GetBlockRangeFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getblockrange/GetBlockRangeFragment.kt index 5e3dd1eb..f1d0c489 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getblockrange/GetBlockRangeFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getblockrange/GetBlockRangeFragment.kt @@ -13,7 +13,7 @@ import cash.z.ecc.android.sdk.demoapp.util.mainActivity import cash.z.ecc.android.sdk.demoapp.util.toRelativeTime import cash.z.ecc.android.sdk.demoapp.util.withCommas import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import kotlin.math.max /** diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getprivatekey/GetPrivateKeyFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getprivatekey/GetPrivateKeyFragment.kt index ac863fe5..6e07a3c0 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getprivatekey/GetPrivateKeyFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getprivatekey/GetPrivateKeyFragment.kt @@ -9,8 +9,8 @@ import cash.z.ecc.android.sdk.demoapp.BaseDemoFragment import cash.z.ecc.android.sdk.demoapp.databinding.FragmentGetPrivateKeyBinding import cash.z.ecc.android.sdk.demoapp.ext.requireApplicationContext import cash.z.ecc.android.sdk.demoapp.util.fromResources +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.launch /** diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/listtransactions/ListTransactionsFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/listtransactions/ListTransactionsFragment.kt index ea01b25c..f8e8a5ed 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/listtransactions/ListTransactionsFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/listtransactions/ListTransactionsFragment.kt @@ -17,8 +17,10 @@ import cash.z.ecc.android.sdk.demoapp.ext.requireApplicationContext import cash.z.ecc.android.sdk.demoapp.util.fromResources import cash.z.ecc.android.sdk.ext.collectWith import cash.z.ecc.android.sdk.internal.twig +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.ZcashNetwork +import cash.z.ecc.android.sdk.model.defaultForNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.runBlocking /** @@ -51,11 +53,13 @@ class ListTransactionsFragment : BaseDemoFragment() { // have the seed stored seed = Mnemonics.MnemonicCode(sharedViewModel.seedPhrase.value).toSeed() initializer = runBlocking { + val network = ZcashNetwork.fromResources(requireApplicationContext()) Initializer.new(requireApplicationContext()) { - runBlocking { it.newWallet(seed, network = ZcashNetwork.fromResources(requireApplicationContext())) } + runBlocking { + it.newWallet( + seed, + network = network, + lightWalletEndpoint = LightWalletEndpoint.defaultForNetwork(network) + ) + } it.alias = "Demo_Utxos" } } @@ -96,12 +105,19 @@ class ListUtxosFragment : BaseDemoFragment() { val network = ZcashNetwork.fromResources(requireApplicationContext()) binding.textStatus.requestFocus() val addressToUse = binding.inputAddress.text.toString() - val startToUse = max(binding.inputRangeStart.text.toString().toLongOrNull() ?: network.saplingActivationHeight.value, network.saplingActivationHeight.value) + val startToUse = max( + binding.inputRangeStart.text.toString().toLongOrNull() + ?: network.saplingActivationHeight.value, + network.saplingActivationHeight.value + ) val endToUse = binding.inputRangeEnd.text.toString().toLongOrNull() ?: getUxtoEndHeight(requireApplicationContext()).value var allStart = now twig("loading transactions in range $startToUse..$endToUse") - val txids = lightwalletService?.getTAddressTransactions(addressToUse, BlockHeight.new(network, startToUse)..BlockHeight.new(network, endToUse)) + val txids = lightwalletService?.getTAddressTransactions( + addressToUse, + BlockHeight.new(network, startToUse)..BlockHeight.new(network, endToUse) + ) var delta = now - allStart updateStatus("found ${txids?.size} transactions in ${delta}ms.", false) @@ -163,7 +179,12 @@ class ListUtxosFragment : BaseDemoFragment() { resetInBackground() val seed = Mnemonics.MnemonicCode(sharedViewModel.seedPhrase.value).toSeed() viewLifecycleOwner.lifecycleScope.launchWhenStarted { - binding.inputAddress.setText(DerivationTool.deriveTransparentAddress(seed, ZcashNetwork.fromResources(requireApplicationContext()))) + binding.inputAddress.setText( + DerivationTool.deriveTransparentAddress( + seed, + ZcashNetwork.fromResources(requireApplicationContext()) + ) + ) } } diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/send/SendFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/send/SendFragment.kt index 1a7ddcf0..620166c7 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/send/SendFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/send/SendFragment.kt @@ -29,9 +29,11 @@ import cash.z.ecc.android.sdk.ext.convertZecToZatoshi import cash.z.ecc.android.sdk.ext.toZecString import cash.z.ecc.android.sdk.internal.Twig import cash.z.ecc.android.sdk.internal.twig +import cash.z.ecc.android.sdk.model.LightWalletEndpoint import cash.z.ecc.android.sdk.model.WalletBalance +import cash.z.ecc.android.sdk.model.ZcashNetwork +import cash.z.ecc.android.sdk.model.defaultForNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.runBlocking /** @@ -66,8 +68,14 @@ class SendFragment : BaseDemoFragment() { runBlocking { Initializer.new(requireApplicationContext()) { - runBlocking { it.newWallet(seed, network = ZcashNetwork.fromResources(requireApplicationContext())) } - it.setNetwork(ZcashNetwork.fromResources(requireApplicationContext())) + val network = ZcashNetwork.fromResources(requireApplicationContext()) + runBlocking { + it.newWallet( + seed, + network = network, + lightWalletEndpoint = LightWalletEndpoint.defaultForNetwork(network) + ) + } } }.let { initializer -> synchronizer = Synchronizer.newBlocking(initializer) diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/util/NetworkExt.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/util/NetworkExt.kt index 9c8bc764..40185573 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/util/NetworkExt.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/util/NetworkExt.kt @@ -4,10 +4,16 @@ package cash.z.ecc.android.sdk.demoapp.util import android.content.Context import cash.z.ecc.android.sdk.demoapp.R -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork +import java.util.* -fun ZcashNetwork.Companion.fromResources(context: Context) = ZcashNetwork.valueOf( - context.getString( - R.string.network_name - ) -) +fun ZcashNetwork.Companion.fromResources(context: Context): ZcashNetwork { + val networkNameFromResources = context.getString(R.string.network_name).lowercase(Locale.ROOT) + return if (networkNameFromResources == Testnet.networkName) { + ZcashNetwork.Testnet + } else if (networkNameFromResources.lowercase(Locale.ROOT) == Mainnet.networkName) { + ZcashNetwork.Mainnet + } else { + throw IllegalArgumentException("Unknown network name: $networkNameFromResources") + } +} diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/AssetTest.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/AssetTest.kt index d830167a..342e1e97 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/AssetTest.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/AssetTest.kt @@ -3,8 +3,8 @@ package cash.z.ecc.android.sdk import android.content.Context import androidx.test.core.app.ApplicationProvider import androidx.test.filters.SmallTest +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.CheckpointTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.runBlocking import org.json.JSONObject import org.junit.Assert.assertEquals @@ -77,6 +77,7 @@ class AssetTest { val expectedNetworkName = when (network) { ZcashNetwork.Mainnet -> "main" ZcashNetwork.Testnet -> "test" + else -> IllegalArgumentException("Unsupported network $network") } assertEquals("File: ${it.filename}", expectedNetworkName, jsonObject.getString("network")) diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/ext/TestExtensions.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/ext/TestExtensions.kt index 11a93d5d..3692532e 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/ext/TestExtensions.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/ext/TestExtensions.kt @@ -1,7 +1,7 @@ package cash.z.ecc.android.sdk.ext import cash.z.ecc.android.sdk.Initializer -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.util.SimpleMnemonics import kotlinx.coroutines.runBlocking import okhttp3.OkHttpClient diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/SanityTest.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/SanityTest.kt index dd8ba2f7..699b7e0b 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/SanityTest.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/SanityTest.kt @@ -4,11 +4,10 @@ import cash.z.ecc.android.sdk.annotation.MaintainedTest import cash.z.ecc.android.sdk.annotation.TestPurpose import cash.z.ecc.android.sdk.ext.BlockExplorer import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.util.TestWallet import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith @@ -31,13 +30,6 @@ class SanityTest( val networkName = wallet.networkName val name = "$networkName wallet" - @Test - fun testNotPlaintext() { - val message = - "is using plaintext. This will cause problems for the test. Ensure that the `lightwalletd_allow_very_insecure_connections` resource value is false" - assertFalse("$name $message", wallet.service.connectionInfo.usePlaintext) - } - @Test fun testFilePaths() { assertEquals( @@ -80,24 +72,14 @@ class SanityTest( ) } - @Test - fun testServerConnection() { - assertEquals( - "$name has an invalid server connection", - "$networkName.lightwalletd.com:9067?usePlaintext=false", - wallet.connectionInfo - ) - } - @Test fun testLatestHeight() = runBlocking { if (wallet.networkName == "mainnet") { val expectedHeight = BlockExplorer.fetchLatestHeight() // fetch height directly because the synchronizer hasn't started, yet val downloaderHeight = wallet.service.getLatestBlockHeight() - val info = wallet.connectionInfo assertTrue( - "$info\n ${wallet.networkName} Lightwalletd is too far behind. Downloader height $downloaderHeight is more than 10 blocks behind block explorer height $expectedHeight", + "${wallet.endpoint} ${wallet.networkName} Lightwalletd is too far behind. Downloader height $downloaderHeight is more than 10 blocks behind block explorer height $expectedHeight", expectedHeight - 10 < downloaderHeight.value ) } diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/SmokeTest.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/SmokeTest.kt index 43f00871..6b80d7c6 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/SmokeTest.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/SmokeTest.kt @@ -4,7 +4,6 @@ import androidx.test.filters.LargeTest import androidx.test.filters.MediumTest import cash.z.ecc.android.sdk.annotation.MaintainedTest import cash.z.ecc.android.sdk.annotation.TestPurpose -import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.util.TestWallet import kotlinx.coroutines.runBlocking import org.junit.Assert @@ -19,16 +18,6 @@ import org.junit.Test @MediumTest class SmokeTest { - @Test - fun testNotPlaintext() { - val service = - wallet.synchronizer.processor.downloader.lightWalletService as LightWalletGrpcService - Assert.assertFalse( - "Wallet is using plaintext. This will cause problems for the test. Ensure that the `lightwalletd_allow_very_insecure_connections` resource value is false", - service.connectionInfo.usePlaintext - ) - } - @Test fun testFilePaths() { Assert.assertEquals("Invalid DataDB file", "/data/user/0/cash.z.ecc.android.sdk.test/databases/TestWallet_testnet_Data.db", wallet.initializer.rustBackend.pathDataDb) diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/TestnetIntegrationTest.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/TestnetIntegrationTest.kt index 69efd50a..f4f56f43 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/TestnetIntegrationTest.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/TestnetIntegrationTest.kt @@ -1,4 +1,4 @@ -package cash.z.wallet.sdk.integration +package cash.z.ecc.android.sdk.integration import androidx.test.filters.LargeTest import androidx.test.platform.app.InstrumentationRegistry @@ -13,11 +13,12 @@ import cash.z.ecc.android.sdk.internal.Twig import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight +import cash.z.ecc.android.sdk.model.LightWalletEndpoint import cash.z.ecc.android.sdk.model.Zatoshi +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.test.ScopedTest import cash.z.ecc.android.sdk.tool.CheckpointTool import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.delay import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterNotNull @@ -39,9 +40,9 @@ class TestnetIntegrationTest : ScopedTest() { @Test @Ignore("This test is broken") fun testLatestBlockTest() { - val service = LightWalletGrpcService( + val service = LightWalletGrpcService.new( context, - host + lightWalletEndpoint ) val height = service.getLatestBlockHeight() assertTrue(height > saplingActivation) @@ -118,7 +119,7 @@ class TestnetIntegrationTest : ScopedTest() { companion object { init { Twig.plant(TroubleshootingTwig()) } - const val host = "lightwalletd.testnet.z.cash" + val lightWalletEndpoint = LightWalletEndpoint("lightwalletd.testnet.z.cash", 9087, true) private const val birthdayHeight = 963150L private const val targetHeight = 663250 private const val seedPhrase = "still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread" @@ -129,8 +130,8 @@ class TestnetIntegrationTest : ScopedTest() { private val context = InstrumentationRegistry.getInstrumentation().context private val initializer = runBlocking { Initializer.new(context) { config -> - config.setNetwork(ZcashNetwork.Testnet, host) - runBlocking { config.importWallet(seed, BlockHeight.new(ZcashNetwork.Testnet, birthdayHeight), ZcashNetwork.Testnet) } + config.setNetwork(ZcashNetwork.Testnet, lightWalletEndpoint) + runBlocking { config.importWallet(seed, BlockHeight.new(ZcashNetwork.Testnet, birthdayHeight), ZcashNetwork.Testnet, lightWalletEndpoint) } } } private lateinit var synchronizer: Synchronizer diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/service/ChangeServiceTest.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/service/ChangeServiceTest.kt index 0c34285c..96dccb03 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/service/ChangeServiceTest.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/integration/service/ChangeServiceTest.kt @@ -12,8 +12,11 @@ import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.internal.service.LightWalletService import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.Mainnet +import cash.z.ecc.android.sdk.model.Testnet +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.test.ScopedTest -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -35,13 +38,15 @@ import org.mockito.Spy class ChangeServiceTest : ScopedTest() { val network = ZcashNetwork.Mainnet + val lightWalletEndpoint = LightWalletEndpoint.Mainnet + private val eccEndpoint = LightWalletEndpoint("lightwalletd.electriccoin.co", 9087, true) @Mock lateinit var mockBlockStore: CompactBlockStore var mockCloseable: AutoCloseable? = null @Spy - val service = LightWalletGrpcService(context, network) + val service = LightWalletGrpcService.new(context, lightWalletEndpoint) lateinit var downloader: CompactBlockDownloader lateinit var otherService: LightWalletService @@ -50,7 +55,7 @@ class ChangeServiceTest : ScopedTest() { fun setup() { initMocks() downloader = CompactBlockDownloader(service, mockBlockStore) - otherService = LightWalletGrpcService(context, "lightwalletd.electriccoin.co") + otherService = LightWalletGrpcService.new(context, eccEndpoint) } @After @@ -106,7 +111,7 @@ class ChangeServiceTest : ScopedTest() { @Test fun testSwitchToInvalidServer() = runBlocking { var caughtException: Throwable? = null - downloader.changeService(LightWalletGrpcService(context, "invalid.lightwalletd")) { + downloader.changeService(LightWalletGrpcService.new(context, LightWalletEndpoint("invalid.lightwalletd", 9087, true))) { caughtException = it } assertNotNull("Using an invalid host should generate an exception.", caughtException) @@ -119,7 +124,7 @@ class ChangeServiceTest : ScopedTest() { @Test fun testSwitchToTestnetFails() = runBlocking { var caughtException: Throwable? = null - downloader.changeService(LightWalletGrpcService(context, ZcashNetwork.Testnet)) { + downloader.changeService(LightWalletGrpcService.new(context, LightWalletEndpoint.Testnet)) { caughtException = it } assertNotNull("Using an invalid host should generate an exception.", caughtException) diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/jni/BranchIdTest.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/jni/BranchIdTest.kt index e25fe063..4d04677d 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/jni/BranchIdTest.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/jni/BranchIdTest.kt @@ -3,7 +3,7 @@ package cash.z.ecc.android.sdk.jni import cash.z.ecc.android.sdk.annotation.MaintainedTest import cash.z.ecc.android.sdk.annotation.TestPurpose import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Test diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/jni/TransparentTest.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/jni/TransparentTest.kt index 901a8821..5111223d 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/jni/TransparentTest.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/jni/TransparentTest.kt @@ -7,8 +7,8 @@ import cash.z.ecc.android.sdk.annotation.MaintainedTest import cash.z.ecc.android.sdk.annotation.TestPurpose import cash.z.ecc.android.sdk.internal.TroubleshootingTwig import cash.z.ecc.android.sdk.internal.Twig +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.BeforeClass diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/sample/ShieldFundsSample.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/sample/ShieldFundsSample.kt index a2fc4364..b876496d 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/sample/ShieldFundsSample.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/sample/ShieldFundsSample.kt @@ -2,7 +2,7 @@ package cash.z.ecc.android.sdk.sample import cash.z.ecc.android.sdk.internal.Twig import cash.z.ecc.android.sdk.model.Zatoshi -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.util.TestWallet import kotlinx.coroutines.runBlocking import org.junit.Assert diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/sample/TransparentRestoreSample.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/sample/TransparentRestoreSample.kt index be73aaff..35daef88 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/sample/TransparentRestoreSample.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/sample/TransparentRestoreSample.kt @@ -5,8 +5,7 @@ import cash.z.ecc.android.sdk.ext.ZcashSdk import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight import cash.z.ecc.android.sdk.model.Zatoshi -import cash.z.ecc.android.sdk.type.ZcashNetwork -import cash.z.ecc.android.sdk.type.ZcashNetwork.Testnet +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.util.TestWallet import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking @@ -90,7 +89,7 @@ class TransparentRestoreSample { val wallet0 = TestWallet( TestWallet.Backups.SAMPLE_WALLET.seedPhrase, "tmpabc", - Testnet, + ZcashNetwork.Testnet, startHeight = BlockHeight.new( ZcashNetwork.Testnet, 1330190 @@ -117,7 +116,15 @@ class TransparentRestoreSample { */ // @Test fun hasFunds() = runBlocking { - val walletSandbox = TestWallet(TestWallet.Backups.SAMPLE_WALLET.seedPhrase, "WalletC", Testnet, startHeight = BlockHeight.new(ZcashNetwork.Testnet, 1330190)) + val walletSandbox = TestWallet( + TestWallet.Backups.SAMPLE_WALLET.seedPhrase, + "WalletC", + ZcashNetwork.Testnet, + startHeight = BlockHeight.new( + ZcashNetwork.Testnet, + 1330190 + ) + ) // val job = walletA.walletScope.launch { // twig("Syncing WalletA") // walletA.sync() diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/tool/CheckpointToolTest.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/tool/CheckpointToolTest.kt index ce965d10..8446d13c 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/tool/CheckpointToolTest.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/tool/CheckpointToolTest.kt @@ -4,8 +4,8 @@ import android.content.Context import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.CheckpointTool.IS_FALLBACK_ON_FAILURE -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Test diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/AddressGeneratorUtil.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/AddressGeneratorUtil.kt index b282085b..faba2d7c 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/AddressGeneratorUtil.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/AddressGeneratorUtil.kt @@ -1,10 +1,9 @@ package cash.z.ecc.android.sdk.util import androidx.test.platform.app.InstrumentationRegistry +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/BalancePrinterUtil.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/BalancePrinterUtil.kt index 5daf0a65..782bdc38 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/BalancePrinterUtil.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/BalancePrinterUtil.kt @@ -9,8 +9,10 @@ import cash.z.ecc.android.sdk.internal.ext.deleteSuspend import cash.z.ecc.android.sdk.internal.model.Checkpoint import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.ZcashNetwork +import cash.z.ecc.android.sdk.model.defaultForNetwork import cash.z.ecc.android.sdk.tool.CheckpointTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map @@ -82,8 +84,8 @@ class BalancePrinterUtil { }.collect { seed -> // TODO: clear the dataDb but leave the cacheDb val initializer = Initializer.new(context) { config -> - runBlocking { config.importWallet(seed, birthdayHeight, network) } - config.setNetwork(network) + val endpoint = LightWalletEndpoint.defaultForNetwork(network) + runBlocking { config.importWallet(seed, birthdayHeight, network, endpoint) } config.alias = alias } /* diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/DataDbScannerUtil.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/DataDbScannerUtil.kt index 3e8e50fb..94603bc5 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/DataDbScannerUtil.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/DataDbScannerUtil.kt @@ -7,7 +7,7 @@ import cash.z.ecc.android.sdk.Synchronizer import cash.z.ecc.android.sdk.internal.TroubleshootingTwig import cash.z.ecc.android.sdk.internal.Twig import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/TestWallet.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/TestWallet.kt index 8ab22d67..e296dfce 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/TestWallet.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/TestWallet.kt @@ -11,10 +11,12 @@ import cash.z.ecc.android.sdk.internal.Twig import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.Testnet import cash.z.ecc.android.sdk.model.WalletBalance import cash.z.ecc.android.sdk.model.Zatoshi +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.delay @@ -36,9 +38,8 @@ class TestWallet( val seedPhrase: String, val alias: String = "TestWallet", val network: ZcashNetwork = ZcashNetwork.Testnet, - val host: String = network.defaultHost, - startHeight: BlockHeight? = null, - val port: Int = network.defaultPort + val endpoint: LightWalletEndpoint = LightWalletEndpoint.Testnet, + startHeight: BlockHeight? = null ) { constructor( backup: Backups, @@ -66,7 +67,7 @@ class TestWallet( runBlocking { DerivationTool.deriveTransparentSecretKey(seed, network = network) } val initializer = runBlocking { Initializer.new(context) { config -> - runBlocking { config.importWallet(seed, startHeight, network, host, alias = alias) } + runBlocking { config.importWallet(seed, startHeight, network, endpoint, alias = alias) } } } val synchronizer: SdkSynchronizer = Synchronizer.newBlocking(initializer) as SdkSynchronizer @@ -79,7 +80,6 @@ class TestWallet( runBlocking { DerivationTool.deriveTransparentAddress(seed, network = network) } val birthdayHeight get() = synchronizer.latestBirthdayHeight val networkName get() = synchronizer.network.networkName - val connectionInfo get() = service.connectionInfo.toString() suspend fun transparentBalance(): WalletBalance { synchronizer.refreshUtxos(transparentAddress, synchronizer.latestBirthdayHeight) @@ -166,11 +166,46 @@ class TestWallet( enum class Backups(val seedPhrase: String, val testnetBirthday: BlockHeight, val mainnetBirthday: BlockHeight) { // TODO: get the proper birthday values for these wallets - DEFAULT("column rhythm acoustic gym cost fit keen maze fence seed mail medal shrimp tell relief clip cannon foster soldier shallow refuse lunar parrot banana", BlockHeight.new(ZcashNetwork.Testnet, 1_355_928), BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000)), - SAMPLE_WALLET("input frown warm senior anxiety abuse yard prefer churn reject people glimpse govern glory crumble swallow verb laptop switch trophy inform friend permit purpose", BlockHeight.new(ZcashNetwork.Testnet, 1_330_190), BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000)), - DEV_WALLET("still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread", BlockHeight.new(ZcashNetwork.Testnet, 1_000_000), BlockHeight.new(ZcashNetwork.Mainnet, 991645)), - ALICE("quantum whisper lion route fury lunar pelican image job client hundred sauce chimney barely life cliff spirit admit weekend message recipe trumpet impact kitten", BlockHeight.new(ZcashNetwork.Testnet, 1_330_190), BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000)), - BOB("canvas wine sugar acquire garment spy tongue odor hole cage year habit bullet make label human unit option top calm neutral try vocal arena", BlockHeight.new(ZcashNetwork.Testnet, 1_330_190), BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000)), + DEFAULT( + "column rhythm acoustic gym cost fit keen maze fence seed mail medal shrimp tell relief clip cannon foster soldier shallow refuse lunar parrot banana", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_355_928 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000) + ), + SAMPLE_WALLET( + "input frown warm senior anxiety abuse yard prefer churn reject people glimpse govern glory crumble swallow verb laptop switch trophy inform friend permit purpose", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_330_190 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000) + ), + DEV_WALLET( + "still champion voice habit trend flight survey between bitter process artefact blind carbon truly provide dizzy crush flush breeze blouse charge solid fish spread", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_000_000 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 991645) + ), + ALICE( + "quantum whisper lion route fury lunar pelican image job client hundred sauce chimney barely life cliff spirit admit weekend message recipe trumpet impact kitten", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_330_190 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000) + ), + BOB( + "canvas wine sugar acquire garment spy tongue odor hole cage year habit bullet make label human unit option top calm neutral try vocal arena", + BlockHeight.new( + ZcashNetwork.Testnet, + 1_330_190 + ), + BlockHeight.new(ZcashNetwork.Mainnet, 1_000_000) + ), ; } } diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/TransactionCounterUtil.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/TransactionCounterUtil.kt index eb2bc804..5c9607d3 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/TransactionCounterUtil.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/android/sdk/util/TransactionCounterUtil.kt @@ -6,7 +6,9 @@ import cash.z.ecc.android.sdk.internal.Twig import cash.z.ecc.android.sdk.internal.service.LightWalletGrpcService import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.Mainnet +import cash.z.ecc.android.sdk.model.ZcashNetwork import org.junit.Ignore import org.junit.Test @@ -14,7 +16,7 @@ class TransactionCounterUtil { private val network = ZcashNetwork.Mainnet private val context = InstrumentationRegistry.getInstrumentation().context - private val service = LightWalletGrpcService(context, network) + private val service = LightWalletGrpcService.new(context, LightWalletEndpoint.Mainnet) init { Twig.plant(TroubleshootingTwig()) diff --git a/sdk-lib/src/androidTest/java/cash/z/ecc/fixture/CheckpointFixture.kt b/sdk-lib/src/androidTest/java/cash/z/ecc/fixture/CheckpointFixture.kt index 9fd44f7c..a7781fc5 100644 --- a/sdk-lib/src/androidTest/java/cash/z/ecc/fixture/CheckpointFixture.kt +++ b/sdk-lib/src/androidTest/java/cash/z/ecc/fixture/CheckpointFixture.kt @@ -8,7 +8,7 @@ import cash.z.ecc.android.sdk.internal.KEY_VERSION import cash.z.ecc.android.sdk.internal.VERSION_1 import cash.z.ecc.android.sdk.internal.model.Checkpoint import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import org.json.JSONObject object CheckpointFixture { diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/Initializer.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/Initializer.kt index a8445e40..b3b4882d 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/Initializer.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/Initializer.kt @@ -10,10 +10,11 @@ import cash.z.ecc.android.sdk.internal.model.Checkpoint import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.jni.RustBackend import cash.z.ecc.android.sdk.model.BlockHeight +import cash.z.ecc.android.sdk.model.LightWalletEndpoint +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.CheckpointTool import cash.z.ecc.android.sdk.tool.DerivationTool import cash.z.ecc.android.sdk.type.UnifiedViewingKey -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import java.io.File @@ -21,13 +22,13 @@ import java.io.File /** * Simplified Initializer focused on starting from a ViewingKey. */ +@Suppress("LongParameterList") class Initializer private constructor( val context: Context, internal val rustBackend: RustBackend, val network: ZcashNetwork, val alias: String, - val host: String, - val port: Int, + val lightWalletEndpoint: LightWalletEndpoint, val viewingKeys: List, val overwriteVks: Boolean, internal val checkpoint: Checkpoint @@ -45,10 +46,7 @@ class Initializer private constructor( lateinit var network: ZcashNetwork private set - lateinit var host: String - private set - - var port: Int = ZcashNetwork.Mainnet.defaultPort + lateinit var lightWalletEndpoint: LightWalletEndpoint private set /** @@ -160,12 +158,10 @@ class Initializer private constructor( */ fun setNetwork( network: ZcashNetwork, - host: String = network.defaultHost, - port: Int = network.defaultPort + lightWalletEndpoint: LightWalletEndpoint ): Config = apply { this.network = network - this.host = host - this.port = port + this.lightWalletEndpoint = lightWalletEndpoint } /** @@ -175,16 +171,14 @@ class Initializer private constructor( seed: ByteArray, birthday: BlockHeight?, network: ZcashNetwork, - host: String = network.defaultHost, - port: Int = network.defaultPort, + lightWalletEndpoint: LightWalletEndpoint, alias: String = ZcashSdk.DEFAULT_ALIAS ): Config = importWallet( DerivationTool.deriveUnifiedViewingKeys(seed, network = network)[0], birthday, network, - host, - port, + lightWalletEndpoint, alias ) @@ -195,12 +189,11 @@ class Initializer private constructor( viewingKey: UnifiedViewingKey, birthday: BlockHeight?, network: ZcashNetwork, - host: String = network.defaultHost, - port: Int = network.defaultPort, + lightWalletEndpoint: LightWalletEndpoint, alias: String = ZcashSdk.DEFAULT_ALIAS ): Config = apply { setViewingKeys(viewingKey) - setNetwork(network, host, port) + setNetwork(network, lightWalletEndpoint) importedWalletBirthday(birthday) this.alias = alias } @@ -211,14 +204,12 @@ class Initializer private constructor( suspend fun newWallet( seed: ByteArray, network: ZcashNetwork, - host: String = network.defaultHost, - port: Int = network.defaultPort, + lightWalletEndpoint: LightWalletEndpoint, alias: String = ZcashSdk.DEFAULT_ALIAS ): Config = newWallet( DerivationTool.deriveUnifiedViewingKeys(seed, network)[0], network, - host, - port, + lightWalletEndpoint, alias ) @@ -228,12 +219,11 @@ class Initializer private constructor( fun newWallet( viewingKey: UnifiedViewingKey, network: ZcashNetwork, - host: String = network.defaultHost, - port: Int = network.defaultPort, + lightWalletEndpoint: LightWalletEndpoint, alias: String = ZcashSdk.DEFAULT_ALIAS ): Config = apply { setViewingKeys(viewingKey) - setNetwork(network, host, port) + setNetwork(network, lightWalletEndpoint) newWalletBirthday() this.alias = alias } @@ -352,8 +342,7 @@ class Initializer private constructor( rustBackend, config.network, config.alias, - config.host, - config.port, + config.lightWalletEndpoint, config.viewingKeys, config.overwriteVks, loadedCheckpoint diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/SdkSynchronizer.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/SdkSynchronizer.kt index 259bdacc..b7b635f4 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/SdkSynchronizer.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/SdkSynchronizer.kt @@ -50,12 +50,12 @@ import cash.z.ecc.android.sdk.internal.twigTask import cash.z.ecc.android.sdk.model.BlockHeight import cash.z.ecc.android.sdk.model.WalletBalance import cash.z.ecc.android.sdk.model.Zatoshi +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool import cash.z.ecc.android.sdk.type.AddressType import cash.z.ecc.android.sdk.type.AddressType.Shielded import cash.z.ecc.android.sdk.type.AddressType.Transparent import cash.z.ecc.android.sdk.type.ConsensusMatchType -import cash.z.ecc.android.sdk.type.ZcashNetwork import cash.z.wallet.sdk.rpc.Service import io.grpc.ManagedChannel import kotlinx.coroutines.CoroutineExceptionHandler @@ -308,20 +308,6 @@ class SdkSynchronizer internal constructor( */ override suspend fun getServerInfo(): Service.LightdInfo = processor.downloader.getServerInfo() - /** - * Changes the server that is being used to download compact blocks. This will throw an - * exception if it detects that the server change is invalid e.g. switching to testnet from - * mainnet. - */ - override suspend fun changeServer(host: String, port: Int, errorHandler: (Throwable) -> Unit) { - val info = - (processor.downloader.lightWalletService as LightWalletGrpcService).connectionInfo - processor.downloader.changeService( - LightWalletGrpcService(info.appContext, host, port), - errorHandler - ) - } - override suspend fun getNearestRewindHeight(height: BlockHeight): BlockHeight = processor.getNearestRewindHeight(height) @@ -800,7 +786,7 @@ object DefaultSynchronizerFactory { CompactBlockDbStore.new(initializer.context, initializer.network, initializer.rustBackend.pathCacheDb) fun defaultService(initializer: Initializer): LightWalletService = - LightWalletGrpcService(initializer.context, initializer.host, initializer.port) + LightWalletGrpcService.new(initializer.context, initializer.lightWalletEndpoint) fun defaultEncoder( initializer: Initializer, diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/Synchronizer.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/Synchronizer.kt index c231d16c..218b180f 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/Synchronizer.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/Synchronizer.kt @@ -7,9 +7,9 @@ import cash.z.ecc.android.sdk.ext.ZcashSdk import cash.z.ecc.android.sdk.model.BlockHeight import cash.z.ecc.android.sdk.model.WalletBalance import cash.z.ecc.android.sdk.model.Zatoshi +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.type.AddressType import cash.z.ecc.android.sdk.type.ConsensusMatchType -import cash.z.ecc.android.sdk.type.ZcashNetwork import cash.z.wallet.sdk.rpc.Service import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -284,18 +284,6 @@ interface Synchronizer { */ suspend fun getServerInfo(): Service.LightdInfo - /** - * Gracefully change the server that the Synchronizer is currently using. In some cases, this - * will require waiting until current network activity is complete. Ideally, this would protect - * against accidentally switching between testnet and mainnet, by comparing the service info of - * the existing server with that of the new one. - */ - suspend fun changeServer( - host: String, - port: Int = network.defaultPort, - errorHandler: (Throwable) -> Unit = { throw it } - ) - /** * Download all UTXOs for the given address and store any new ones in the database. * diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/exception/Exceptions.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/exception/Exceptions.kt index fe98d3b2..d40fe7cb 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/exception/Exceptions.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/exception/Exceptions.kt @@ -2,7 +2,7 @@ package cash.z.ecc.android.sdk.exception import cash.z.ecc.android.sdk.internal.model.Checkpoint import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.wallet.sdk.rpc.Service import io.grpc.Status import io.grpc.Status.Code.UNAVAILABLE diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/CheckpointExt.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/CheckpointExt.kt index 8f12da8d..c526e0e3 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/CheckpointExt.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/CheckpointExt.kt @@ -2,7 +2,7 @@ package cash.z.ecc.android.sdk.internal import cash.z.ecc.android.sdk.internal.model.Checkpoint import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import org.json.JSONObject // Version is not returned from the server, so version 1 is implied. A version is declared here diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/block/CompactBlockDbStore.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/block/CompactBlockDbStore.kt index 4c5d7560..061b75e4 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/block/CompactBlockDbStore.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/block/CompactBlockDbStore.kt @@ -8,7 +8,7 @@ import cash.z.ecc.android.sdk.internal.SdkDispatchers import cash.z.ecc.android.sdk.internal.SdkExecutors import cash.z.ecc.android.sdk.internal.db.CompactBlockDb import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.wallet.sdk.rpc.CompactFormats import kotlinx.coroutines.withContext diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/service/LightWalletGrpcService.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/service/LightWalletGrpcService.kt index 8241e412..914c32ba 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/service/LightWalletGrpcService.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/service/LightWalletGrpcService.kt @@ -1,12 +1,10 @@ package cash.z.ecc.android.sdk.internal.service import android.content.Context -import cash.z.ecc.android.sdk.R import cash.z.ecc.android.sdk.annotation.OpenForTesting -import cash.z.ecc.android.sdk.exception.LightWalletException import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.LightWalletEndpoint import cash.z.wallet.sdk.rpc.CompactFormats import cash.z.wallet.sdk.rpc.CompactTxStreamerGrpc import cash.z.wallet.sdk.rpc.Service @@ -31,39 +29,14 @@ import kotlin.time.Duration.Companion.seconds */ @OpenForTesting class LightWalletGrpcService private constructor( + context: Context, + private val lightWalletEndpoint: LightWalletEndpoint, var channel: ManagedChannel, private val singleRequestTimeout: Duration = 10.seconds, private val streamingRequestTimeout: Duration = 90.seconds ) : LightWalletService { - lateinit var connectionInfo: ConnectionInfo - - constructor( - appContext: Context, - network: ZcashNetwork, - usePlaintext: Boolean = - appContext.resources.getBoolean(R.bool.lightwalletd_allow_very_insecure_connections) - ) : this(appContext, network.defaultHost, network.defaultPort, usePlaintext) - - /** - * Construct an instance that corresponds to the given host and port. - * - * @param appContext the application context used to check whether TLS is required by this build - * flavor. - * @param host the host of the server to use. - * @param port the port of the server to use. - * @param usePlaintext whether to use TLS or plaintext for requests. Plaintext is dangerous so - * it requires jumping through a few more hoops. - */ - constructor( - appContext: Context, - host: String, - port: Int = ZcashNetwork.Mainnet.defaultPort, - usePlaintext: Boolean = - appContext.resources.getBoolean(R.bool.lightwalletd_allow_very_insecure_connections) - ) : this(createDefaultChannel(appContext, host, port, usePlaintext)) { - connectionInfo = ConnectionInfo(appContext.applicationContext, host, port, usePlaintext) - } + private val applicationContext = context.applicationContext /* LightWalletService implementation */ @@ -141,22 +114,14 @@ class LightWalletGrpcService private constructor( } override fun reconnect() { - twig( - "closing existing channel and then reconnecting to ${connectionInfo.host}:" + - "${connectionInfo.port}?usePlaintext=${connectionInfo.usePlaintext}" - ) + twig("closing existing channel and then reconnecting") channel.shutdown() - channel = createDefaultChannel( - connectionInfo.appContext, - connectionInfo.host, - connectionInfo.port, - connectionInfo.usePlaintext - ) + channel = createDefaultChannel(applicationContext, lightWalletEndpoint) } // test code - var stateCount = 0 - var state: ConnectivityState? = null + internal var stateCount = 0 + internal var state: ConnectivityState? = null private fun requireChannel(): ManagedChannel { state = channel.getState(false).let { new -> if (state == new) stateCount++ else stateCount = 0 @@ -172,37 +137,13 @@ class LightWalletGrpcService private constructor( return channel } - // - // Utilities - // - - private fun Channel.createStub(timeoutSec: Duration = 60.seconds) = CompactTxStreamerGrpc - .newBlockingStub(this) - .withDeadlineAfter(timeoutSec.inWholeSeconds, TimeUnit.SECONDS) - - /** - * This function effectively parses streaming responses. Each call to next(), on the iterators - * returned from grpc, triggers a network call. - */ - private fun Iterator.toList(): List = - mutableListOf().apply { - while (hasNext()) { - this@apply += next() - } - } - - inner class ConnectionInfo( - val appContext: Context, - val host: String, - val port: Int, - val usePlaintext: Boolean - ) { - override fun toString(): String { - return "$host:$port?usePlaintext=$usePlaintext" - } - } - companion object { + fun new(context: Context, lightWalletEndpoint: LightWalletEndpoint): LightWalletGrpcService { + val channel = createDefaultChannel(context, lightWalletEndpoint) + + return LightWalletGrpcService(context, lightWalletEndpoint, channel) + } + /** * Convenience function for creating the default channel to be used for all connections. It * is important that this channel can handle transitioning from WiFi to Cellular connections @@ -210,24 +151,23 @@ class LightWalletGrpcService private constructor( */ fun createDefaultChannel( appContext: Context, - host: String, - port: Int, - usePlaintext: Boolean + lightWalletEndpoint: LightWalletEndpoint ): ManagedChannel { - twig("Creating channel that will connect to $host:$port?usePlaintext=$usePlaintext") + twig( + "Creating channel that will connect to " + + "${lightWalletEndpoint.host}:${lightWalletEndpoint.port}" + + "/?usePlaintext=${!lightWalletEndpoint.isSecure}" + ) return AndroidChannelBuilder - .forAddress(host, port) + .forAddress(lightWalletEndpoint.host, lightWalletEndpoint.port) .context(appContext) .enableFullStreamDecompression() .apply { - if (usePlaintext) { - if (!appContext.resources.getBoolean( - R.bool.lightwalletd_allow_very_insecure_connections - ) - ) throw LightWalletException.InsecureConnection - usePlaintext() - } else { + if (lightWalletEndpoint.isSecure) { useTransportSecurity() + } else { + twig("WARNING: Using insecure channel") + usePlaintext() } } .build() @@ -235,6 +175,10 @@ class LightWalletGrpcService private constructor( } } +private fun Channel.createStub(timeoutSec: Duration = 60.seconds) = CompactTxStreamerGrpc + .newBlockingStub(this) + .withDeadlineAfter(timeoutSec.inWholeSeconds, TimeUnit.SECONDS) + private fun BlockHeight.toBlockHeight(): Service.BlockID = Service.BlockID.newBuilder().setHeight(value).build() @@ -243,3 +187,14 @@ private fun ClosedRange.toBlockRange(): Service.BlockRange = .setStart(start.toBlockHeight()) .setEnd(endInclusive.toBlockHeight()) .build() + +/** + * This function effectively parses streaming responses. Each call to next(), on the iterators + * returned from grpc, triggers a network call. + */ +private fun Iterator.toList(): List = + mutableListOf().apply { + while (hasNext()) { + this@apply += next() + } + } diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/transaction/PagedTransactionRepository.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/transaction/PagedTransactionRepository.kt index 4948e231..9d845f82 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/transaction/PagedTransactionRepository.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/transaction/PagedTransactionRepository.kt @@ -16,8 +16,8 @@ import cash.z.ecc.android.sdk.internal.model.Checkpoint import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.jni.RustBackend import cash.z.ecc.android.sdk.model.BlockHeight +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.type.UnifiedViewingKey -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow import kotlinx.coroutines.withContext diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/jni/RustBackend.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/jni/RustBackend.kt index 81950000..1515d579 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/jni/RustBackend.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/jni/RustBackend.kt @@ -9,9 +9,9 @@ import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight import cash.z.ecc.android.sdk.model.WalletBalance import cash.z.ecc.android.sdk.model.Zatoshi +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.tool.DerivationTool import cash.z.ecc.android.sdk.type.UnifiedViewingKey -import cash.z.ecc.android.sdk.type.ZcashNetwork import kotlinx.coroutines.withContext import java.io.File diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/jni/RustBackendWelding.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/jni/RustBackendWelding.kt index 1613116f..6b6bffe5 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/jni/RustBackendWelding.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/jni/RustBackendWelding.kt @@ -4,8 +4,8 @@ import cash.z.ecc.android.sdk.internal.model.Checkpoint import cash.z.ecc.android.sdk.model.BlockHeight import cash.z.ecc.android.sdk.model.WalletBalance import cash.z.ecc.android.sdk.model.Zatoshi +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.type.UnifiedViewingKey -import cash.z.ecc.android.sdk.type.ZcashNetwork /** * Contract defining the exposed capabilities of the Rust backend. diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/BlockHeight.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/BlockHeight.kt index a1fb57e3..d9bb5418 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/BlockHeight.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/BlockHeight.kt @@ -2,7 +2,6 @@ package cash.z.ecc.android.sdk.model import android.content.Context import cash.z.ecc.android.sdk.tool.CheckpointTool -import cash.z.ecc.android.sdk.type.ZcashNetwork /** * Represents a block height, which is a UInt32. SDK clients use this class to represent the "birthday" of a wallet. diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/LightWalletEndpoint.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/LightWalletEndpoint.kt new file mode 100644 index 00000000..076d2b24 --- /dev/null +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/LightWalletEndpoint.kt @@ -0,0 +1,5 @@ +package cash.z.ecc.android.sdk.model + +data class LightWalletEndpoint(val host: String, val port: Int, val isSecure: Boolean) { + companion object +} diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/LightWalletEndpointExt.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/LightWalletEndpointExt.kt new file mode 100644 index 00000000..e0081c74 --- /dev/null +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/LightWalletEndpointExt.kt @@ -0,0 +1,44 @@ +@file:Suppress("ktlint:filename") + +package cash.z.ecc.android.sdk.model + +/* + * This is a set of extension functions currently, because we expect them to change in the future. + */ + +fun LightWalletEndpoint.Companion.defaultForNetwork(zcashNetwork: ZcashNetwork): LightWalletEndpoint { + return when (zcashNetwork.id) { + ZcashNetwork.Mainnet.id -> LightWalletEndpoint.Mainnet + ZcashNetwork.Testnet.id -> LightWalletEndpoint.Testnet + else -> error("Unknown network id: ${zcashNetwork.id}") + } +} + +/** + * This is a special localhost value on the Android emulator, which allows it to contact + * the localhost of the computer running the emulator. + */ +private const val COMPUTER_LOCALHOST = "10.0.2.2" + +private const val DEFAULT_PORT = 9067 + +val LightWalletEndpoint.Companion.Mainnet + get() = LightWalletEndpoint( + "mainnet.lightwalletd.com", + DEFAULT_PORT, + isSecure = true + ) + +val LightWalletEndpoint.Companion.Testnet + get() = LightWalletEndpoint( + "testnet.lightwalletd.com", + DEFAULT_PORT, + isSecure = true + ) + +val LightWalletEndpoint.Companion.Darkside + get() = LightWalletEndpoint( + COMPUTER_LOCALHOST, + DEFAULT_PORT, + isSecure = false + ) diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/ZcashNetwork.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/ZcashNetwork.kt new file mode 100644 index 00000000..2844a6a8 --- /dev/null +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/model/ZcashNetwork.kt @@ -0,0 +1,43 @@ +package cash.z.ecc.android.sdk.model + +/** + * The Zcash network. Should be one of [ZcashNetwork.Testnet] or [ZcashNetwork.Mainnet]. + * + * The constructor for the network is public to allow for certain test cases to use a custom "darkside" network. + */ +data class ZcashNetwork( + val id: Int, + val networkName: String, + val saplingActivationHeight: BlockHeight, + val orchardActivationHeight: BlockHeight +) { + + @Suppress("MagicNumber") + companion object { + const val ID_TESTNET = 0 + const val ID_MAINNET = 1 + + // You may notice there are extra checkpoints bundled in the SDK that match the + // sapling/orchard activation heights. + + val Testnet = ZcashNetwork( + ID_TESTNET, + "testnet", + saplingActivationHeight = BlockHeight(280_000), + orchardActivationHeight = BlockHeight(1_842_420) + ) + + val Mainnet = ZcashNetwork( + ID_MAINNET, + "mainnet", + saplingActivationHeight = BlockHeight(419_200), + orchardActivationHeight = BlockHeight(1_687_104) + ) + + fun from(id: Int) = when (id) { + 0 -> Testnet + 1 -> Mainnet + else -> throw IllegalArgumentException("Unknown network id: $id") + } + } +} diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/CheckpointTool.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/CheckpointTool.kt index 01120ef9..dc568719 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/CheckpointTool.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/CheckpointTool.kt @@ -7,7 +7,7 @@ import cash.z.ecc.android.sdk.internal.from import cash.z.ecc.android.sdk.internal.model.Checkpoint import cash.z.ecc.android.sdk.internal.twig import cash.z.ecc.android.sdk.model.BlockHeight -import cash.z.ecc.android.sdk.type.ZcashNetwork +import cash.z.ecc.android.sdk.model.ZcashNetwork import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.BufferedReader diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/DerivationTool.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/DerivationTool.kt index 9ab1b981..21596a70 100644 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/DerivationTool.kt +++ b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/DerivationTool.kt @@ -2,8 +2,8 @@ package cash.z.ecc.android.sdk.tool import cash.z.ecc.android.sdk.jni.RustBackend import cash.z.ecc.android.sdk.jni.RustBackendWelding +import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.type.UnifiedViewingKey -import cash.z.ecc.android.sdk.type.ZcashNetwork class DerivationTool { diff --git a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/type/ZcashNetwork.kt b/sdk-lib/src/main/java/cash/z/ecc/android/sdk/type/ZcashNetwork.kt deleted file mode 100644 index f415333a..00000000 --- a/sdk-lib/src/main/java/cash/z/ecc/android/sdk/type/ZcashNetwork.kt +++ /dev/null @@ -1,18 +0,0 @@ -package cash.z.ecc.android.sdk.type - -import cash.z.ecc.android.sdk.model.BlockHeight - -enum class ZcashNetwork( - val id: Int, - val networkName: String, - val saplingActivationHeight: BlockHeight, - val defaultHost: String, - val defaultPort: Int -) { - Testnet(0, "testnet", BlockHeight(280_000), "testnet.lightwalletd.com", 9067), - Mainnet(1, "mainnet", BlockHeight(419_200), "mainnet.lightwalletd.com", 9067); - - companion object { - fun from(id: Int) = values().first { it.id == id } - } -} diff --git a/sdk-lib/src/main/res/values/bools.xml b/sdk-lib/src/main/res/values/bools.xml deleted file mode 100644 index e06af17b..00000000 --- a/sdk-lib/src/main/res/values/bools.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - false - diff --git a/sdk-lib/src/main/res/values/strings.xml b/sdk-lib/src/main/res/values/strings.xml deleted file mode 100644 index 2ecbf2ed..00000000 --- a/sdk-lib/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Library linking is working! - diff --git a/sdk-lib/src/test/java/cash/z/ecc/android/sdk/model/BlockHeightTest.kt b/sdk-lib/src/test/java/cash/z/ecc/android/sdk/model/BlockHeightTest.kt index c36b07f7..4290bceb 100644 --- a/sdk-lib/src/test/java/cash/z/ecc/android/sdk/model/BlockHeightTest.kt +++ b/sdk-lib/src/test/java/cash/z/ecc/android/sdk/model/BlockHeightTest.kt @@ -1,6 +1,5 @@ package cash.z.ecc.android.sdk.model -import cash.z.ecc.android.sdk.type.ZcashNetwork import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith diff --git a/sdk-lib/src/test/java/cash/z/ecc/android/sdk/model/LightWalletEndpointTest.kt b/sdk-lib/src/test/java/cash/z/ecc/android/sdk/model/LightWalletEndpointTest.kt new file mode 100644 index 00000000..022f48e0 --- /dev/null +++ b/sdk-lib/src/test/java/cash/z/ecc/android/sdk/model/LightWalletEndpointTest.kt @@ -0,0 +1,16 @@ +package cash.z.ecc.android.sdk.model + +import org.junit.Test +import kotlin.test.assertTrue + +class LightWalletEndpointTest { + @Test + fun requireSecureMainnet() { + assertTrue(LightWalletEndpoint.Mainnet.isSecure) + } + + @Test + fun requireSecureTestnet() { + assertTrue(LightWalletEndpoint.Testnet.isSecure) + } +}