zcash-android-wallet-sdk/sdk-lib/src/main/java/cash/z/ecc/android/sdk/tool/DerivationTool.kt

91 lines
3.3 KiB
Kotlin

package cash.z.ecc.android.sdk.tool
import cash.z.ecc.android.sdk.internal.Derivation
import cash.z.ecc.android.sdk.internal.SuspendingLazy
import cash.z.ecc.android.sdk.internal.TypesafeDerivationToolImpl
import cash.z.ecc.android.sdk.internal.jni.RustDerivationTool
import cash.z.ecc.android.sdk.model.Account
import cash.z.ecc.android.sdk.model.UnifiedFullViewingKey
import cash.z.ecc.android.sdk.model.UnifiedSpendingKey
import cash.z.ecc.android.sdk.model.ZcashNetwork
interface DerivationTool {
/**
* Given a seed and a number of accounts, return the associated Unified Full Viewing Keys.
*
* @param seed the seed from which to derive viewing keys.
* @param numberOfAccounts the number of accounts to use. Multiple accounts are not fully
* supported so the default value of 1 is recommended.
*
* @return the UFVKs derived from the seed, encoded as Strings.
*/
suspend fun deriveUnifiedFullViewingKeys(
seed: ByteArray,
network: ZcashNetwork,
numberOfAccounts: Int
): List<UnifiedFullViewingKey>
/**
* Given a unified spending key, return the associated unified full viewing key.
*
* @param usk the key from which to derive the viewing key.
*
* @return a unified full viewing key.
*/
suspend fun deriveUnifiedFullViewingKey(
usk: UnifiedSpendingKey,
network: ZcashNetwork
): UnifiedFullViewingKey
/**
* Derives and returns a unified spending key from the given seed for the given account ID.
*
* Returns the newly created [ZIP 316] account identifier, along with the binary encoding
* of the [`UnifiedSpendingKey`] for the newly created account. The caller should store
* the returned spending key in a secure fashion.
*
* @param seed the seed from which to derive spending keys.
* @param account the account to derive.
*
* @return the unified spending key for the account.
*/
suspend fun deriveUnifiedSpendingKey(
seed: ByteArray,
network: ZcashNetwork,
account: Account
): UnifiedSpendingKey
/**
* Given a seed and account index, return the associated Unified Address.
*
* @param seed the seed from which to derive the address.
* @param account the index of the account to use for deriving the address.
*
* @return the address that corresponds to the seed and account index.
*/
suspend fun deriveUnifiedAddress(seed: ByteArray, network: ZcashNetwork, account: Account): String
/**
* Given a Unified Full Viewing Key string, return the associated Unified Address.
*
* @param viewingKey the viewing key to use for deriving the address. The viewing key is tied to
* a specific account so no account index is required.
*
* @return the address that corresponds to the viewing key.
*/
suspend fun deriveUnifiedAddress(
viewingKey: String,
network: ZcashNetwork
): String
companion object {
const val DEFAULT_NUMBER_OF_ACCOUNTS = Derivation.DEFAULT_NUMBER_OF_ACCOUNTS
private val instance = SuspendingLazy<Unit, DerivationTool> {
TypesafeDerivationToolImpl(RustDerivationTool.new())
}
suspend fun getInstance() = instance.getInstance(Unit)
}
}