diff --git a/server/app/com/xsn/explorer/models/TransactionDetails.scala b/server/app/com/xsn/explorer/models/TransactionDetails.scala new file mode 100644 index 0000000..0fa1242 --- /dev/null +++ b/server/app/com/xsn/explorer/models/TransactionDetails.scala @@ -0,0 +1,43 @@ +package com.xsn.explorer.models + +import play.api.libs.json.{Json, Writes} + +case class TransactionDetails( + id: TransactionId, + size: Int, + blockhash: Blockhash, + time: Long, + blocktime: Long, + confirmations: Int, + input: Option[TransactionValue], + output: List[TransactionValue]) { + + lazy val fee: BigDecimal = { + val vin = input.map(_.value).getOrElse(BigDecimal(0)) + val vout = output.map(_.value).sum + (vin - vout) max 0 + } +} + +object TransactionDetails { + + def from(tx: Transaction, previous: Transaction): TransactionDetails = { + val input = tx.vin.flatMap { vin => + val voutMaybe = previous.vout.find(_.n == vin.voutIndex) + + voutMaybe.flatMap(TransactionValue.from) + } + + TransactionDetails + .from(tx) + .copy(input = input) + } + + def from(tx: Transaction): TransactionDetails = { + val output = tx.vout.flatMap(TransactionValue.from) + + TransactionDetails(tx.id, tx.size, tx.blockhash, tx.time, tx.blocktime, tx.confirmations, None, output) + } + + implicit val writes: Writes[TransactionDetails] = Json.writes[TransactionDetails] +} diff --git a/server/app/com/xsn/explorer/models/TransactionValue.scala b/server/app/com/xsn/explorer/models/TransactionValue.scala new file mode 100644 index 0000000..7495505 --- /dev/null +++ b/server/app/com/xsn/explorer/models/TransactionValue.scala @@ -0,0 +1,19 @@ +package com.xsn.explorer.models + +import play.api.libs.json.{Json, Writes} + +case class TransactionValue(address: Address, value: BigDecimal) + +object TransactionValue { + + def from(vout: TransactionVOUT): Option[TransactionValue] = { + val value = vout.value + val addressMaybe = vout.address + + addressMaybe.map { address => + TransactionValue(address, value) + } + } + + implicit val writes: Writes[TransactionValue] = Json.writes[TransactionValue] +}