-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathMantisJsonMethodImplicits.scala
49 lines (43 loc) · 2.3 KB
/
MantisJsonMethodImplicits.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package io.iohk.ethereum.jsonrpc
import io.iohk.ethereum.jsonrpc.EthJsonMethodsImplicits.transactionResponseJsonEncoder
import io.iohk.ethereum.jsonrpc.JsonRpcError.InvalidParams
import io.iohk.ethereum.jsonrpc.MantisService.{GetAccountTransactionsRequest, GetAccountTransactionsResponse}
import io.iohk.ethereum.jsonrpc.serialization.JsonEncoder.Ops._
import io.iohk.ethereum.jsonrpc.serialization.{JsonEncoder, JsonMethodCodec, JsonMethodDecoder}
import io.iohk.ethereum.transactions.TransactionHistoryService.ExtendedTransactionData
import org.json4s.JsonAST._
import org.json4s.Merge
import JsonEncoder.OptionToNull._
object MantisJsonMethodImplicits extends JsonMethodsImplicits {
implicit val extendedTransactionDataJsonEncoder: JsonEncoder[ExtendedTransactionData] = extendedTxData => {
val asTxResponse = TransactionResponse(
extendedTxData.stx,
extendedTxData.minedTransactionData.map(_.header),
extendedTxData.minedTransactionData.map(_.transactionIndex)
)
val encodedTxResponse = JsonEncoder.encode(asTxResponse)
val encodedExtension = JObject(
"isOutgoing" -> extendedTxData.isOutgoing.jsonEncoded,
"isPending" -> extendedTxData.isPending.jsonEncoded,
"gasUsed" -> extendedTxData.minedTransactionData.map(_.gasUsed).jsonEncoded,
"timestamp" -> extendedTxData.minedTransactionData.map(_.timestamp).jsonEncoded
)
Merge.merge(encodedTxResponse, encodedExtension)
}
implicit val mantis_getAccountTransactions
: JsonMethodCodec[GetAccountTransactionsRequest, GetAccountTransactionsResponse] =
new JsonMethodDecoder[GetAccountTransactionsRequest] with JsonEncoder[GetAccountTransactionsResponse] {
def decodeJson(params: Option[JArray]): Either[JsonRpcError, GetAccountTransactionsRequest] =
params match {
case Some(JArray(JString(addrJson) :: fromBlockJson :: toBlockJson :: Nil)) =>
for {
addr <- extractAddress(addrJson)
fromBlock <- extractQuantity(fromBlockJson)
toBlock <- extractQuantity(toBlockJson)
} yield GetAccountTransactionsRequest(addr, fromBlock to toBlock)
case _ => Left(InvalidParams())
}
override def encodeJson(t: GetAccountTransactionsResponse): JValue =
JObject("transactions" -> t.transactions.jsonEncoded)
}
}