From 7b600bb5bafb55f41498caa77c45a618ebab9ca0 Mon Sep 17 00:00:00 2001 From: benthecarman Date: Mon, 26 Apr 2021 06:19:14 -0500 Subject: [PATCH] Add get oracle name to explorer client (#2969) --- .../commons/serializers/JsonReaders.scala | 7 +++++ .../explorer/client/SbExplorerClient.scala | 27 +++++++++++++------ .../org/bitcoins/explorer/model/Oracle.scala | 5 ++++ .../explorer/picklers/ExplorerPicklers.scala | 12 +++++---- .../client/SbExplorerClientTest.scala | 9 +++++++ 5 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 oracle-explorer-client/src/main/scala/org/bitcoins/explorer/model/Oracle.scala diff --git a/app-commons/src/main/scala/org/bitcoins/commons/serializers/JsonReaders.scala b/app-commons/src/main/scala/org/bitcoins/commons/serializers/JsonReaders.scala index 6ca8f8bae0..f3c841698a 100644 --- a/app-commons/src/main/scala/org/bitcoins/commons/serializers/JsonReaders.scala +++ b/app-commons/src/main/scala/org/bitcoins/commons/serializers/JsonReaders.scala @@ -302,6 +302,13 @@ object JsonReaders { SerializerUtil.processJsString[ECPublicKey](ECPublicKey.fromHex)(json) } + implicit object SchnorrPublicKeyReads extends Reads[SchnorrPublicKey] { + + override def reads(json: JsValue): JsResult[SchnorrPublicKey] = + SerializerUtil.processJsString[SchnorrPublicKey]( + SchnorrPublicKey.fromHex)(json) + } + implicit object P2PKHAddressReads extends Reads[P2PKHAddress] { override def reads(json: JsValue): JsResult[P2PKHAddress] = diff --git a/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/client/SbExplorerClient.scala b/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/client/SbExplorerClient.scala index c11b04acad..c6e505a7b9 100644 --- a/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/client/SbExplorerClient.scala +++ b/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/client/SbExplorerClient.scala @@ -1,21 +1,17 @@ package org.bitcoins.explorer.client import akka.actor.ActorSystem -import akka.http.scaladsl.model.{ - ContentTypes, - HttpEntity, - HttpMethods, - HttpRequest, - Uri -} +import akka.http.scaladsl.model._ import akka.http.scaladsl.{Http, HttpExt} import akka.util.ByteString import org.bitcoins.core.protocol.tlv.OracleAnnouncementTLV -import org.bitcoins.crypto.Sha256Digest +import org.bitcoins.core.util.FutureUtil +import org.bitcoins.crypto.{SchnorrPublicKey, Sha256Digest} import org.bitcoins.explorer.env.ExplorerEnv import org.bitcoins.explorer.model.{ CreateAnnouncementExplorer, CreateAttestations, + Oracle, SbAnnouncementEvent } import org.bitcoins.explorer.picklers.ExplorerPicklers @@ -117,6 +113,21 @@ case class SbExplorerClient(env: ExplorerEnv)(implicit system: ActorSystem) { responseF.map(_ => ()) } + def getOracleName(pubkey: SchnorrPublicKey): Future[Option[String]] = { + val base = env.baseUri + val uri = Uri(base + s"oracle/${pubkey.hex}") + val httpReq = HttpRequest(uri = uri) + val responseF = sendRequest(httpReq) + responseF.flatMap { response => + val result = response.validate[Oracle] + result match { + case success: JsSuccess[Oracle] => + Future.successful(Some(success.value.oracleName)) + case _: JsError => FutureUtil.none + } + } + } + private def sendRequest(httpReq: HttpRequest): Future[JsValue] = { val responsePayloadF: Future[String] = { diff --git a/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/model/Oracle.scala b/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/model/Oracle.scala new file mode 100644 index 0000000000..b2c64c0b05 --- /dev/null +++ b/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/model/Oracle.scala @@ -0,0 +1,5 @@ +package org.bitcoins.explorer.model + +import org.bitcoins.crypto.SchnorrPublicKey + +case class Oracle(pubkey: SchnorrPublicKey, oracleName: String) diff --git a/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/picklers/ExplorerPicklers.scala b/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/picklers/ExplorerPicklers.scala index 20d76a5705..caa6252f2d 100644 --- a/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/picklers/ExplorerPicklers.scala +++ b/oracle-explorer-client/src/main/scala/org/bitcoins/explorer/picklers/ExplorerPicklers.scala @@ -1,10 +1,12 @@ package org.bitcoins.explorer.picklers -import org.bitcoins.commons.serializers.JsonReaders -import org.bitcoins.explorer.model.SbAnnouncementEvent -import play.api.libs.json.Json +import org.bitcoins.explorer.model._ +import org.bitcoins.commons.serializers.JsonReaders._ +import play.api.libs.json.{Json, Reads} object ExplorerPicklers { - import JsonReaders._ - implicit val explorerEventRW = Json.reads[SbAnnouncementEvent] + + implicit val explorerEventRW: Reads[SbAnnouncementEvent] = + Json.reads[SbAnnouncementEvent] + implicit val oracleRW: Reads[Oracle] = Json.reads[Oracle] } diff --git a/oracle-explorer-client/src/test/scala/org/bitcoins/explorer/client/SbExplorerClientTest.scala b/oracle-explorer-client/src/test/scala/org/bitcoins/explorer/client/SbExplorerClientTest.scala index 9f23a80c1d..f3d8930379 100644 --- a/oracle-explorer-client/src/test/scala/org/bitcoins/explorer/client/SbExplorerClientTest.scala +++ b/oracle-explorer-client/src/test/scala/org/bitcoins/explorer/client/SbExplorerClientTest.scala @@ -48,6 +48,15 @@ class SbExplorerClientTest extends BitcoinSAsyncTest { } } + it must "get an oracle name" in { + val key = announcement.publicKey + for { + name <- explorerClient.getOracleName(key) + } yield { + assert(name.contains("Chris_Stewart_5")) + } + } + it must "return failure from get an event if the event DNE" in { val hash = Sha256Digest.empty recoverToSucceededIf[RuntimeException] {