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

47 lines
1.7 KiB
Kotlin

package cash.z.ecc.android.sdk.internal.model.ext
import cash.z.ecc.android.sdk.internal.model.Checkpoint
import cash.z.ecc.android.sdk.model.BlockHeight
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
// to structure the parsing to be version-aware in the future.
internal val Checkpoint.Companion.VERSION_1
get() = 1
internal val Checkpoint.Companion.KEY_VERSION
get() = "version"
internal val Checkpoint.Companion.KEY_HEIGHT
get() = "height"
internal val Checkpoint.Companion.KEY_HASH
get() = "hash"
internal val Checkpoint.Companion.KEY_EPOCH_SECONDS
get() = "time"
internal val Checkpoint.Companion.KEY_TREE
get() = "saplingTree"
internal fun Checkpoint.Companion.from(zcashNetwork: ZcashNetwork, jsonString: String) =
from(zcashNetwork, JSONObject(jsonString))
private fun Checkpoint.Companion.from(
zcashNetwork: ZcashNetwork,
jsonObject: JSONObject
): Checkpoint {
when (val version = jsonObject.optInt(Checkpoint.KEY_VERSION, Checkpoint.VERSION_1)) {
Checkpoint.VERSION_1 -> {
val height = run {
val heightLong = jsonObject.getLong(Checkpoint.KEY_HEIGHT)
BlockHeight.new(zcashNetwork, heightLong)
}
val hash = jsonObject.getString(Checkpoint.KEY_HASH)
val epochSeconds = jsonObject.getLong(Checkpoint.KEY_EPOCH_SECONDS)
val tree = jsonObject.getString(Checkpoint.KEY_TREE)
return Checkpoint(height, hash, epochSeconds, tree)
}
else -> {
throw IllegalArgumentException("Unsupported version $version")
}
}
}