secant-android-wallet/sdk-ext-lib/src/main/java/cash/z/ecc/sdk/SynchronizerCompanion.kt

48 lines
1.8 KiB
Kotlin

package cash.z.ecc.sdk
import android.content.Context
import cash.z.ecc.android.bip39.Mnemonics
import cash.z.ecc.android.bip39.toSeed
import cash.z.ecc.android.sdk.Initializer
import cash.z.ecc.android.sdk.Synchronizer
import cash.z.ecc.android.sdk.tool.DerivationTool
import cash.z.ecc.android.sdk.type.UnifiedViewingKey
import cash.z.ecc.sdk.model.PersistableWallet
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
// Synchronizer needs a Companion object
// https://github.com/zcash/zcash-android-wallet-sdk/issues/310
object SynchronizerCompanion {
suspend fun load(context: Context, persistableWallet: PersistableWallet): Synchronizer {
val config = persistableWallet.toConfig()
val initializer = withContext(Dispatchers.IO) { Initializer(context, config) }
return withContext(Dispatchers.IO) { Synchronizer(initializer) }
}
}
private suspend fun PersistableWallet.deriveViewingKey(): UnifiedViewingKey {
// Dispatcher needed because SecureRandom is loaded, which is slow and performs IO
// https://github.com/zcash/kotlin-bip39/issues/13
val bip39Seed = withContext(Dispatchers.IO) {
Mnemonics.MnemonicCode(seedPhrase.joinToString()).toSeed()
}
// Dispatchers needed until an SDK is published with the implementation of
// https://github.com/zcash/zcash-android-wallet-sdk/issues/269
val viewingKey = withContext(Dispatchers.IO) {
DerivationTool.deriveUnifiedViewingKeys(bip39Seed, network)[0]
}
return viewingKey
}
private suspend fun PersistableWallet.toConfig(): Initializer.Config {
val network = network
val vk = deriveViewingKey()
return Initializer.Config {
it.importWallet(vk, birthday?.height, network, network.defaultHost, network.defaultPort)
}
}