Skip to content

Commit 8f34a23

Browse files
committed
[ETCM-110] Make decoding parameterless requests uniform
1 parent b1b7f60 commit 8f34a23

File tree

6 files changed

+57
-89
lines changed

6 files changed

+57
-89
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ project/plugins/project/
55
.ensime
66
.ensime_cache/
77
.bloop
8+
out/
89

910
# IDE folders
1011
.idea/
@@ -20,4 +21,4 @@ metals.sbt
2021
.evm-runner_history
2122

2223
# Nix
23-
result
24+
result

src/main/scala/io/iohk/ethereum/jsonrpc/DebugJsonMethodsImplicits.scala

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package io.iohk.ethereum.jsonrpc
22

3-
import io.iohk.ethereum.jsonrpc.DebugService.{ ListPeersInfoRequest, ListPeersInfoResponse }
4-
import org.json4s.JsonAST.{ JArray, JString, JValue }
3+
import io.iohk.ethereum.jsonrpc.DebugService.{ListPeersInfoRequest, ListPeersInfoResponse}
4+
import io.iohk.ethereum.jsonrpc.JsonRpcController.{Codec, JsonEncoder}
5+
import io.iohk.ethereum.jsonrpc.JsonRpcController.JsonDecoder.NoParamsDecoder
6+
import org.json4s.JsonAST.{JArray, JString, JValue}
57

68
object DebugJsonMethodsImplicits extends JsonMethodsImplicits {
79

810
implicit val debug_listPeersInfo: Codec[ListPeersInfoRequest, ListPeersInfoResponse] =
9-
new Codec[ListPeersInfoRequest, ListPeersInfoResponse] {
10-
def decodeJson(params: Option[JArray]): Either[JsonRpcError, ListPeersInfoRequest] =
11-
Right(ListPeersInfoRequest())
12-
11+
new NoParamsDecoder(ListPeersInfoRequest()) with JsonEncoder[ListPeersInfoResponse] {
1312
def encodeJson(t: ListPeersInfoResponse): JValue =
1413
JArray(t.peers.map(a => JString(a.toString)))
1514
}

src/main/scala/io/iohk/ethereum/jsonrpc/EthJsonMethodsImplicits.scala

Lines changed: 15 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package io.iohk.ethereum.jsonrpc
22

33
import akka.util.ByteString
44
import io.iohk.ethereum.jsonrpc.EthService._
5-
import io.iohk.ethereum.jsonrpc.JsonRpcController.{JsonDecoder, JsonEncoder}
5+
import io.iohk.ethereum.jsonrpc.JsonRpcController.JsonDecoder.NoParamsDecoder
6+
import io.iohk.ethereum.jsonrpc.JsonRpcController.{Codec, JsonDecoder, JsonEncoder}
67
import io.iohk.ethereum.jsonrpc.JsonRpcErrors.InvalidParams
78
import io.iohk.ethereum.jsonrpc.PersonalService.{SendTransactionRequest, SendTransactionResponse, SignRequest}
89
import org.json4s.{Extraction, JsonAST}
@@ -12,28 +13,17 @@ import org.json4s.JsonDSL._
1213
// scalastyle:off number.of.methods
1314
object EthJsonMethodsImplicits extends JsonMethodsImplicits {
1415

15-
implicit val eth_protocolVersion = new JsonDecoder[ProtocolVersionRequest] with JsonEncoder[ProtocolVersionResponse] {
16-
def decodeJson(params: Option[JArray]): Either[JsonRpcError, ProtocolVersionRequest] = Right(
17-
ProtocolVersionRequest()
18-
)
19-
16+
implicit val eth_protocolVersion = new NoParamsDecoder(ProtocolVersionRequest())
17+
with JsonEncoder[ProtocolVersionResponse] {
2018
def encodeJson(t: ProtocolVersionResponse): JValue = t.value
2119
}
2220

23-
implicit val eth_chainId = new JsonDecoder[ChainIdRequest] with JsonEncoder[ChainIdResponse] {
24-
def decodeJson(params: Option[JArray]) = params match {
25-
case None | Some(JArray(Nil)) => Right(ChainIdRequest())
26-
case other => Left(InvalidParams("eth_chainId method does not take params"))
27-
}
28-
21+
implicit val eth_chainId = new NoParamsDecoder(ChainIdRequest()) with JsonEncoder[ChainIdResponse] {
2922
def encodeJson(t: ChainIdResponse) = encodeAsHex(t.value)
3023
}
3124

32-
implicit val eth_blockNumber = new JsonDecoder[BestBlockNumberRequest] with JsonEncoder[BestBlockNumberResponse] {
33-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, BestBlockNumberRequest] = Right(
34-
BestBlockNumberRequest()
35-
)
36-
25+
implicit val eth_blockNumber = new NoParamsDecoder(BestBlockNumberRequest())
26+
with JsonEncoder[BestBlockNumberResponse] {
3727
override def encodeJson(t: BestBlockNumberResponse): JValue = Extraction.decompose(t.bestBlockNumber)
3828
}
3929

@@ -53,50 +43,25 @@ object EthJsonMethodsImplicits extends JsonMethodsImplicits {
5343
override def encodeJson(t: SubmitHashRateResponse): JValue = JBool(t.success)
5444
}
5545

56-
implicit val eth_gasPrice = new JsonDecoder[GetGasPriceRequest] with JsonEncoder[GetGasPriceResponse] {
57-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, GetGasPriceRequest] = params match {
58-
case None | Some(JArray(Nil)) => Right(GetGasPriceRequest())
59-
case Some(_) => Left(InvalidParams())
60-
}
61-
46+
implicit val eth_gasPrice = new NoParamsDecoder(GetGasPriceRequest()) with JsonEncoder[GetGasPriceResponse] {
6247
override def encodeJson(t: GetGasPriceResponse): JValue = encodeAsHex(t.price)
6348
}
6449

65-
implicit val eth_mining = new JsonDecoder[GetMiningRequest] with JsonEncoder[GetMiningResponse] {
66-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, GetMiningRequest] = params match {
67-
case None | Some(JArray(Nil)) => Right(GetMiningRequest())
68-
case Some(_) => Left(InvalidParams())
69-
}
70-
50+
implicit val eth_mining = new NoParamsDecoder(GetMiningRequest()) with JsonEncoder[GetMiningResponse] {
7151
override def encodeJson(t: GetMiningResponse): JValue = JBool(t.isMining)
7252
}
7353

74-
implicit val eth_hashrate = new JsonDecoder[GetHashRateRequest] with JsonEncoder[GetHashRateResponse] {
75-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, GetHashRateRequest] = params match {
76-
case None | Some(JArray(Nil)) => Right(GetHashRateRequest())
77-
case Some(_) => Left(InvalidParams())
78-
}
79-
54+
implicit val eth_hashrate = new NoParamsDecoder(GetHashRateRequest()) with JsonEncoder[GetHashRateResponse] {
8055
override def encodeJson(t: GetHashRateResponse): JsonAST.JValue = encodeAsHex(t.hashRate)
8156
}
8257

83-
implicit val eth_coinbase = new JsonDecoder[GetCoinbaseRequest] with JsonEncoder[GetCoinbaseResponse] {
84-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, GetCoinbaseRequest] = params match {
85-
case None | Some(JArray(Nil)) => Right(GetCoinbaseRequest())
86-
case Some(_) => Left(InvalidParams())
87-
}
88-
58+
implicit val eth_coinbase = new NoParamsDecoder(GetCoinbaseRequest()) with JsonEncoder[GetCoinbaseResponse] {
8959
override def encodeJson(t: GetCoinbaseResponse): JsonAST.JValue = {
9060
encodeAsHex(t.address.bytes)
9161
}
9262
}
9363

94-
implicit val eth_getWork = new JsonDecoder[GetWorkRequest] with JsonEncoder[GetWorkResponse] {
95-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, GetWorkRequest] = params match {
96-
case None | Some(JArray(Nil)) => Right(GetWorkRequest())
97-
case Some(_) => Left(InvalidParams())
98-
}
99-
64+
implicit val eth_getWork = new NoParamsDecoder(GetWorkRequest()) with JsonEncoder[GetWorkResponse] {
10065
override def encodeJson(t: GetWorkResponse): JsonAST.JValue = {
10166
val powHeaderHash = encodeAsHex(t.powHeaderHash)
10267
val dagSeed = encodeAsHex(t.dagSeed)
@@ -267,9 +232,7 @@ object EthJsonMethodsImplicits extends JsonMethodsImplicits {
267232
}
268233
}
269234

270-
implicit val eth_syncing = new JsonDecoder[SyncingRequest] with JsonEncoder[SyncingResponse] {
271-
def decodeJson(params: Option[JArray]): Either[JsonRpcError, SyncingRequest] = Right(SyncingRequest())
272-
235+
implicit val eth_syncing = new NoParamsDecoder(SyncingRequest()) with JsonEncoder[SyncingResponse] {
273236
def encodeJson(t: SyncingResponse): JValue = t.syncStatus match {
274237
case Some(syncStatus) => Extraction.decompose(syncStatus)
275238
case None => false
@@ -445,15 +408,9 @@ object EthJsonMethodsImplicits extends JsonMethodsImplicits {
445408
}
446409
}
447410

448-
implicit val eth_newBlockFilter = new JsonDecoder[NewBlockFilterRequest] {
449-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, NewBlockFilterRequest] =
450-
Right(NewBlockFilterRequest())
451-
}
411+
implicit val eth_newBlockFilter = new NoParamsDecoder(NewBlockFilterRequest()) {}
452412

453-
implicit val eth_newPendingTransactionFilter = new JsonDecoder[NewPendingTransactionFilterRequest] {
454-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, NewPendingTransactionFilterRequest] =
455-
Right(NewPendingTransactionFilterRequest())
456-
}
413+
implicit val eth_newPendingTransactionFilter = new NoParamsDecoder(NewPendingTransactionFilterRequest()) {}
457414

458415
implicit val eth_uninstallFilter = new JsonDecoder[UninstallFilterRequest] with JsonEncoder[UninstallFilterResponse] {
459416
def decodeJson(params: Option[JArray]): Either[JsonRpcError, UninstallFilterRequest] =

src/main/scala/io/iohk/ethereum/jsonrpc/JsonMethodsImplicits.scala

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import akka.util.ByteString
66
import io.iohk.ethereum.crypto.ECDSASignature
77
import io.iohk.ethereum.domain.Address
88
import io.iohk.ethereum.jsonrpc.EthService.BlockParam
9-
import io.iohk.ethereum.jsonrpc.JsonRpcController.{JsonDecoder, JsonEncoder}
9+
import io.iohk.ethereum.jsonrpc.JsonRpcController.JsonDecoder.NoParamsDecoder
10+
import io.iohk.ethereum.jsonrpc.JsonRpcController.{Codec, JsonDecoder, JsonEncoder}
1011
import io.iohk.ethereum.jsonrpc.JsonRpcErrors.InvalidParams
1112
import io.iohk.ethereum.jsonrpc.JsonSerializers.{
1213
AddressJsonSerializer,
@@ -27,8 +28,6 @@ import scala.util.Try
2728

2829
trait JsonMethodsImplicits {
2930

30-
trait Codec[Req, Res] extends JsonDecoder[Req] with JsonEncoder[Res]
31-
3231
implicit val formats: Formats = DefaultFormats.preservingEmptyValues + OptionNoneToJNullSerializer +
3332
QuantitiesSerializer + UnformattedDataJsonSerializer + AddressJsonSerializer
3433

@@ -165,25 +164,20 @@ object JsonMethodsImplicits extends JsonMethodsImplicits {
165164
override def encodeJson(t: Sha3Response): JValue = encodeAsHex(t.data)
166165
}
167166

168-
implicit val web3_clientVersion = new JsonDecoder[ClientVersionRequest] with JsonEncoder[ClientVersionResponse] {
169-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, ClientVersionRequest] = Right(
170-
ClientVersionRequest()
171-
)
167+
implicit val web3_clientVersion = new NoParamsDecoder(ClientVersionRequest())
168+
with JsonEncoder[ClientVersionResponse] {
172169
override def encodeJson(t: ClientVersionResponse): JValue = t.value
173170
}
174171

175-
implicit val net_version = new JsonDecoder[VersionRequest] with JsonEncoder[VersionResponse] {
176-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, VersionRequest] = Right(VersionRequest())
172+
implicit val net_version = new NoParamsDecoder(VersionRequest()) with JsonEncoder[VersionResponse] {
177173
override def encodeJson(t: VersionResponse): JValue = t.value
178174
}
179175

180-
implicit val net_listening = new JsonDecoder[ListeningRequest] with JsonEncoder[ListeningResponse] {
181-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, ListeningRequest] = Right(ListeningRequest())
176+
implicit val net_listening = new NoParamsDecoder(ListeningRequest()) with JsonEncoder[ListeningResponse] {
182177
override def encodeJson(t: ListeningResponse): JValue = t.value
183178
}
184179

185-
implicit val net_peerCount = new JsonDecoder[PeerCountRequest] with JsonEncoder[PeerCountResponse] {
186-
override def decodeJson(params: Option[JArray]): Either[JsonRpcError, PeerCountRequest] = Right(PeerCountRequest())
180+
implicit val net_peerCount = new NoParamsDecoder(PeerCountRequest()) with JsonEncoder[PeerCountResponse] {
187181
override def encodeJson(t: PeerCountResponse): JValue = encodeAsHex(t.value)
188182
}
189183

@@ -213,10 +207,8 @@ object JsonMethodsImplicits extends JsonMethodsImplicits {
213207
JString(t.address.toString)
214208
}
215209

216-
implicit val personal_listAccounts = new JsonDecoder[ListAccountsRequest] with JsonEncoder[ListAccountsResponse] {
217-
def decodeJson(params: Option[JArray]): Either[JsonRpcError, ListAccountsRequest] =
218-
Right(ListAccountsRequest())
219-
210+
implicit val personal_listAccounts = new NoParamsDecoder(ListAccountsRequest())
211+
with JsonEncoder[ListAccountsResponse] {
220212
def encodeJson(t: ListAccountsResponse): JValue =
221213
JArray(t.addresses.map(a => JString(a.toString)))
222214
}

src/main/scala/io/iohk/ethereum/jsonrpc/JsonRpcController.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import org.json4s.JsonAST.{JArray, JValue}
1010
import org.json4s.JsonDSL._
1111
import com.typesafe.config.{Config => TypesafeConfig}
1212
import io.iohk.ethereum.jsonrpc.DebugService.{ListPeersInfoRequest, ListPeersInfoResponse}
13+
import io.iohk.ethereum.jsonrpc.JsonRpcErrors.InvalidParams
1314
import io.iohk.ethereum.jsonrpc.QAService.{GetPendingTransactionsRequest, GetPendingTransactionsResponse}
1415
import io.iohk.ethereum.jsonrpc.TestService._
1516
import io.iohk.ethereum.jsonrpc.server.http.JsonRpcHttpServer.JsonRpcHttpServerConfig
1617
import io.iohk.ethereum.jsonrpc.server.ipc.JsonRpcIpcServer.JsonRpcIpcServerConfig
18+
1719
import scala.concurrent.Future
1820
import scala.concurrent.ExecutionContext.Implicits.global
1921
import scala.concurrent.duration.FiniteDuration
@@ -23,11 +25,32 @@ object JsonRpcController {
2325
trait JsonDecoder[T] {
2426
def decodeJson(params: Option[JArray]): Either[JsonRpcError, T]
2527
}
28+
object JsonDecoder {
29+
abstract class NoParamsDecoder[T](request: => T) extends JsonDecoder[T] {
30+
def decodeJson(params: Option[JArray]): Either[JsonRpcError, T] =
31+
params match {
32+
case None | Some(JArray(Nil)) => Right(request)
33+
case _ => Left(InvalidParams(s"No parameters expected"))
34+
}
35+
}
36+
}
2637

2738
trait JsonEncoder[T] {
2839
def encodeJson(t: T): JValue
2940
}
3041

42+
trait Codec[Req, Res] extends JsonDecoder[Req] with JsonEncoder[Res]
43+
object Codec {
44+
import scala.language.implicitConversions
45+
46+
implicit def decoderWithEncoderIntoCodec[Req, Res](
47+
decEnc: JsonDecoder[Req] with JsonEncoder[Res]
48+
): Codec[Req, Res] = new Codec[Req, Res] {
49+
def decodeJson(params: Option[JArray]) = decEnc.decodeJson(params)
50+
def encodeJson(t: Res) = decEnc.encodeJson(t)
51+
}
52+
}
53+
3154
trait JsonRpcConfig {
3255
def apis: Seq[String]
3356
def accountTransactionsMaxBlocks: Int

src/main/scala/io/iohk/ethereum/jsonrpc/QAJsonMethodsImplicits.scala

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.iohk.ethereum.jsonrpc
22

3+
import io.iohk.ethereum.jsonrpc.JsonRpcController.JsonDecoder.NoParamsDecoder
4+
import io.iohk.ethereum.jsonrpc.JsonRpcController.{Codec, JsonEncoder}
35
import io.iohk.ethereum.jsonrpc.JsonRpcErrors.InvalidParams
46
import io.iohk.ethereum.jsonrpc.QAService.{
57
GetPendingTransactionsRequest,
@@ -36,13 +38,7 @@ object QAJsonMethodsImplicits extends JsonMethodsImplicits {
3638
}
3739

3840
implicit val qa_getPendingTransactions: Codec[GetPendingTransactionsRequest, GetPendingTransactionsResponse] =
39-
new Codec[GetPendingTransactionsRequest, GetPendingTransactionsResponse] {
40-
def decodeJson(params: Option[JArray]): Either[JsonRpcError, GetPendingTransactionsRequest] =
41-
params match {
42-
case Some(JArray(Nil)) | None => Right(GetPendingTransactionsRequest())
43-
case _ => Left(InvalidParams())
44-
}
45-
41+
new NoParamsDecoder(GetPendingTransactionsRequest()) with JsonEncoder[GetPendingTransactionsResponse] {
4642
def encodeJson(t: GetPendingTransactionsResponse): JValue =
4743
JArray(t.pendingTransactions.toList.map { pendingTx: PendingTransaction =>
4844
encodeAsHex(pendingTx.stx.tx.hash)

0 commit comments

Comments
 (0)