zcash-android-wallet-sdk/backend-lib/src/main/java/cash/z/ecc/android/sdk/internal/model/JniBlockMeta.kt

51 lines
1.9 KiB
Kotlin

package cash.z.ecc.android.sdk.internal.model
import androidx.annotation.Keep
import co.electriccoin.lightwallet.client.model.CompactBlockUnsafe
/**
* Serves as cross layer (Kotlin, Rust) communication class.
*
* @param height the block's height - although it's type Long, it needs to be in UInt range
* @param hash the block's hash (ID of the block)
* @param time the block's time. Unix epoch time when the block was mined.
* @param saplingOutputsCount the sapling outputs count - although its type is Long, it needs to be in UInt range
* @param orchardOutputsCount the orchard outputs count - although its type is Long, it needs to be in UInt range
*/
@Keep
class JniBlockMeta(
val height: Long,
val hash: ByteArray,
val time: Long,
val saplingOutputsCount: Long,
val orchardOutputsCount: Long
) {
init {
// We require some of the parameters below to be in the range of unsigned integer, because of the Rust layer
// implementation.
require(UINT_RANGE.contains(height)) {
"Height $height is outside of allowed range $UINT_RANGE"
}
require(UINT_RANGE.contains(saplingOutputsCount)) {
"SaplingOutputsCount $saplingOutputsCount is outside of allowed range $UINT_RANGE"
}
require(UINT_RANGE.contains(orchardOutputsCount)) {
"SaplingOutputsCount $orchardOutputsCount is outside of allowed range $UINT_RANGE"
}
}
companion object {
private val UINT_RANGE = 0.toLong()..UInt.MAX_VALUE.toLong()
fun new(block: CompactBlockUnsafe): JniBlockMeta {
return JniBlockMeta(
height = block.height,
hash = block.hash,
time = block.time.toLong(),
saplingOutputsCount = block.saplingOutputsCount.toLong(),
orchardOutputsCount = block.orchardOutputsCount.toLong()
)
}
}
}