You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.2 KiB

package com.xsn.explorer.models
import play.api.libs.functional.syntax._
import play.api.libs.json._
/**
* Represents a block coming from the RPC server.
*
* PoS blocks supported.
* Pending to support PoW and TPoS blocks.
*/
case class Block(
hash: Blockhash,
previousBlockhash: Option[Blockhash], // first block doesn't have a previous block
nextBlockhash: Option[Blockhash], // last block doesn't have a next block
merkleRoot: Blockhash,
transactions: List[TransactionId],
confirmations: Confirmations,
size: Size,
height: Height,
version: Int,
time: Long,
medianTime: Long,
nonce: Int,
bits: String,
chainwork: String,
difficulty: BigDecimal,
tposContract: Option[String]) {
/**
* Every block until 75 is PoW.
*/
def isPoW: Boolean = height.int <= 75
/**
* From block 76, we have just PoW or TPoS
*/
def isPoS: Boolean = !isPoW && tposContract.isEmpty
/**
* TPoS blocks need a tposcontract
*/
def isTPoS: Boolean = !isPoW && tposContract.nonEmpty
}
object Block {
implicit val reads: Reads[Block] = {
val builder = (__ \ 'hash).read[Blockhash] and
(__ \ 'previousblockhash).readNullable[Blockhash] and
(__ \ 'nextblockhash).readNullable[Blockhash] and
(__ \ 'merkleroot).read[Blockhash] and
(__ \ 'tx).read[List[TransactionId]] and
(__ \ 'confirmations).read[Confirmations] and
(__ \ 'size).read[Size] and
(__ \ 'height).read[Height] and
(__ \ 'version).read[Int] and
(__ \ 'time).read[Long] and
(__ \ 'mediantime).read[Long] and
(__ \ 'nonce).read[Int] and
(__ \ 'bits).read[String] and
(__ \ 'chainwork).read[String] and
(__ \ 'difficulty).read[BigDecimal] and
(__ \ 'tposcontract).readNullable[String]
builder.apply { (hash, previous, next, root, transactions,
confirmations, size, height, version, time,
medianTime, nonce, bits, chainwork, difficulty, tposContract) =>
Block(
hash, previous, next, root, transactions,
confirmations, size, height, version, time,
medianTime, nonce, bits, chainwork, difficulty, tposContract)
}
}
implicit val writes: Writes[Block] = Json.writes[Block]
}