/** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.0.1-SNAPSHOT * User agent: apibuilder app.apibuilder.io/gimbalabs/hilltop-api/0.0.1-SNAPSHOT/play_2_6 */ package io.gimbalabs.hilltop.api.v0 { object Constants { val BaseUrl = "https://hilltop-api.mainnet.dandelion.link" val Namespace = "io.gimbalabs.hilltop.api.v0" val UserAgent = "apibuilder app.apibuilder.io/gimbalabs/hilltop-api/0.0.1-SNAPSHOT/play_2_6" val Version = "0.0.1-SNAPSHOT" val VersionMajor = 0 } class Client( ws: play.api.libs.ws.WSClient, val baseUrl: String = "https://hilltop-api.mainnet.dandelion.link", auth: scala.Option[io.gimbalabs.hilltop.api.v0.Authorization] = None, defaultHeaders: Seq[(String, String)] = Nil ) extends interfaces.Client { import io.gimbalabs.hilltop.api.v0.models.json._ private val logger = play.api.Logger("io.gimbalabs.hilltop.api.v0.Client") logger.info(s"Initializing io.gimbalabs.hilltop.api.v0.Client for url $baseUrl") def activeStakeAmounts: ActiveStakeAmounts = ActiveStakeAmounts def blocks: Blocks = Blocks def delegations: Delegations = Delegations def delegatorsCounts: DelegatorsCounts = DelegatorsCounts def epochs: Epochs = Epochs def healthchecks: Healthchecks = Healthchecks def nativeAssets: NativeAssets = NativeAssets def poolUpdates: PoolUpdates = PoolUpdates def rewards: Rewards = Rewards def sigmas: Sigmas = Sigmas def stakepoolMetadata: StakepoolMetadata = StakepoolMetadata def stakepools: Stakepools = Stakepools def transactions: Transactions = Transactions def walletBalances: WalletBalances = WalletBalances object ActiveStakeAmounts extends ActiveStakeAmounts { override def get( epochNumber: _root_.scala.Option[Int] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.ActiveStakeAmount] = { val queryParameters = Seq( epochNumber.map("epoch_number" -> _.toString) ).flatten _executeRequest( "GET", s"/active_stake_amounts", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.ActiveStakeAmount", r, _.validate[io.gimbalabs.hilltop.api.v0.models.ActiveStakeAmount] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } override def getByPoolBech32Id( poolBech32Id: String, epochNumber: _root_.scala.Option[Int] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.ActiveStakeAmount] = { val queryParameters = Seq( epochNumber.map("epoch_number" -> _.toString) ).flatten _executeRequest( "GET", s"/active_stake_amounts/${play.utils.UriEncoding.encodePathSegment(poolBech32Id, "UTF-8")}", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.ActiveStakeAmount", r, _.validate[io.gimbalabs.hilltop.api.v0.models.ActiveStakeAmount] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } override def getAddressesByPoolBech32Id( poolBech32Id: String, epochNumber: Int, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.AddressStakeAmount]] = { val queryParameters = Seq( Some("epoch_number" -> epochNumber.toString) ).flatten _executeRequest( "GET", s"/active_stake_amounts/${play.utils.UriEncoding.encodePathSegment(poolBech32Id, "UTF-8")}/addresses", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.AddressStakeAmount]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.AddressStakeAmount]] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object Blocks extends Blocks { override def getBlocksInDay( date: _root_.java.time.LocalDate, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.DayBlock] = { val queryParameters = Seq( Some("date" -> date.toString) ).flatten _executeRequest( "GET", s"/blocks/blocks_in_day", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.DayBlock", r, _.validate[io.gimbalabs.hilltop.api.v0.models.DayBlock] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def getByBlockNumber( blockNumber: Long, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Block] = { _executeRequest("GET", s"/blocks/${blockNumber}", requestHeaders = requestHeaders).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.Block", r, _.validate[io.gimbalabs.hilltop.api.v0.models.Block] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } } object Delegations extends Delegations { override def getSafePaymentByStakingAddress( stakingAddress: String, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[String] = { _executeRequest( "GET", s"/delegations/${play.utils.UriEncoding.encodePathSegment(stakingAddress, "UTF-8")}/safe_payment", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson("String", r, _.validate[String]) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def getStakepoolByStakingAddress( stakingAddress: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Delegation] = { _executeRequest( "GET", s"/delegations/${play.utils.UriEncoding.encodePathSegment(stakingAddress, "UTF-8")}/stakepool", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.Delegation", r, _.validate[io.gimbalabs.hilltop.api.v0.models.Delegation] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } } object DelegatorsCounts extends DelegatorsCounts { override def getByPoolBech32Id( poolBech32Id: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.DelegatorsCount] = { _executeRequest( "GET", s"/delegators_counts/${play.utils.UriEncoding.encodePathSegment(poolBech32Id, "UTF-8")}", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.DelegatorsCount", r, _.validate[io.gimbalabs.hilltop.api.v0.models.DelegatorsCount] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object Epochs extends Epochs { override def getCurrent( requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Epoch] = { _executeRequest("GET", s"/epochs/current", requestHeaders = requestHeaders).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.Epoch", r, _.validate[io.gimbalabs.hilltop.api.v0.models.Epoch] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } override def getByEpochNumber( epochNumber: Int, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Epoch] = { _executeRequest("GET", s"/epochs/${epochNumber}", requestHeaders = requestHeaders).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.Epoch", r, _.validate[io.gimbalabs.hilltop.api.v0.models.Epoch] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object Healthchecks extends Healthchecks { override def get( requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Healthcheck] = { _executeRequest("GET", s"/healthchecks", requestHeaders = requestHeaders).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.Healthcheck", r, _.validate[io.gimbalabs.hilltop.api.v0.models.Healthcheck] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object NativeAssets extends NativeAssets { override def getIds( blockNumberFrom: _root_.scala.Option[Long] = None, limit: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAssetId]] = { val queryParameters = Seq( blockNumberFrom.map("block_number_from" -> _.toString), limit.map("limit" -> _.toString) ).flatten _executeRequest( "GET", s"/native_assets/ids", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.NativeAssetId]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAssetId]] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } override def getAssetNamesByPolicyId( policyId: String, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Seq[String]] = { _executeRequest( "GET", s"/native_assets/${play.utils.UriEncoding.encodePathSegment(policyId, "UTF-8")}/asset_names", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson("Seq[String]", r, _.validate[Seq[String]]) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } override def getNfts( blockNumberFrom: Long, blockNumberTo: Long, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.NftDetails]] = { val queryParameters = Seq( Some("block_number_from" -> blockNumberFrom.toString), Some("block_number_to" -> blockNumberTo.toString) ).flatten _executeRequest( "GET", s"/native_assets/nfts", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.NftDetails]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.NftDetails]] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def postNativeAssetsDetails( nativeAssetDetailsRequest: io.gimbalabs.hilltop.api.v0.models.NativeAssetDetailsRequest, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAssetDetails]] = { val payload = play.api.libs.json.Json.toJson(nativeAssetDetailsRequest) _executeRequest( "POST", s"/native_assets/native_assets_details", body = Some(payload), requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.NativeAssetDetails]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAssetDetails]] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } override def getByStakeAddress( stakeAddress: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAsset]] = { _executeRequest( "GET", s"/native_assets/${play.utils.UriEncoding.encodePathSegment(stakeAddress, "UTF-8")}", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.NativeAsset]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAsset]] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object PoolUpdates extends PoolUpdates { override def getRetiring( blockNumberFrom: _root_.scala.Option[Long] = None, limit: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.PoolRetiring]] = { val queryParameters = Seq( blockNumberFrom.map("block_number_from" -> _.toString), limit.map("limit" -> _.toString) ).flatten _executeRequest( "GET", s"/pool_updates/retiring", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.PoolRetiring]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.PoolRetiring]] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def getByPoolId( poolId: String, blockNumberFrom: _root_.scala.Option[Long] = None, limit: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.PoolUpdate]] = { val queryParameters = Seq( blockNumberFrom.map("block_number_from" -> _.toString), limit.map("limit" -> _.toString) ).flatten _executeRequest( "GET", s"/pool_updates/${play.utils.UriEncoding.encodePathSegment(poolId, "UTF-8")}", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.PoolUpdate]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.PoolUpdate]] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def get( blockNumberFrom: _root_.scala.Option[Long] = None, limit: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.PoolUpdate]] = { val queryParameters = Seq( blockNumberFrom.map("block_number_from" -> _.toString), limit.map("limit" -> _.toString) ).flatten _executeRequest("GET", s"/pool_updates", queryParameters = queryParameters, requestHeaders = requestHeaders) .map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.PoolUpdate]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.PoolUpdate]] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } } object Rewards extends Rewards { override def getByStakingAddress( stakingAddress: String, epochFrom: _root_.scala.Option[Int] = None, epochTo: _root_.scala.Option[Int] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.Reward]] = { val queryParameters = Seq( epochFrom.map("epoch_from" -> _.toString), epochTo.map("epoch_to" -> _.toString) ).flatten _executeRequest( "GET", s"/rewards/${play.utils.UriEncoding.encodePathSegment(stakingAddress, "UTF-8")}", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.Reward]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.Reward]] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object Sigmas extends Sigmas { override def getByPoolId( poolId: String, epochNumber: Int, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Sigma] = { val queryParameters = Seq( Some("epoch_number" -> epochNumber.toString) ).flatten _executeRequest( "GET", s"/sigmas/${play.utils.UriEncoding.encodePathSegment(poolId, "UTF-8")}", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.Sigma", r, _.validate[io.gimbalabs.hilltop.api.v0.models.Sigma] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object StakepoolMetadata extends StakepoolMetadata { override def getByPoolIdBech32( poolIdBech32: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.StakepoolMetadata] = { _executeRequest( "GET", s"/stakepool_metadata/${play.utils.UriEncoding.encodePathSegment(poolIdBech32, "UTF-8")}", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.StakepoolMetadata", r, _.validate[io.gimbalabs.hilltop.api.v0.models.StakepoolMetadata] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } } object Stakepools extends Stakepools { override def getVrfVkeyByVrfVkeyHash( vrfVkeyHash: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Stakepool] = { _executeRequest( "GET", s"/stakepools/vrf_vkey/${play.utils.UriEncoding.encodePathSegment(vrfVkeyHash, "UTF-8")}", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.Stakepool", r, _.validate[io.gimbalabs.hilltop.api.v0.models.Stakepool] ) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def getEstablishedEpochByPoolId( poolId: String, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Int] = { _executeRequest( "GET", s"/stakepools/${play.utils.UriEncoding.encodePathSegment(poolId, "UTF-8")}/established_epoch", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson("Int", r, _.validate[Int]) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def getLiveStakeByPoolId( poolId: String, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Long] = { _executeRequest( "GET", s"/stakepools/${play.utils.UriEncoding.encodePathSegment(poolId, "UTF-8")}/live_stake", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson("Long", r, _.validate[Long]) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def getBlocksByPoolId( poolId: String, epoch: _root_.scala.Option[Int] = None, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Int] = { val queryParameters = Seq( epoch.map("epoch" -> _.toString) ).flatten _executeRequest( "GET", s"/stakepools/${play.utils.UriEncoding.encodePathSegment(poolId, "UTF-8")}/blocks", queryParameters = queryParameters, requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson("Int", r, _.validate[Int]) case r if r.status == 404 => throw io.gimbalabs.hilltop.api.v0.errors.GenericErrorResponse(r) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200, 404") } } override def get( requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.Stakepool]] = { _executeRequest("GET", s"/stakepools", requestHeaders = requestHeaders).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.Stakepool]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.Stakepool]] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object Transactions extends Transactions { override def postHistory( transactionHistoryRequest: io.gimbalabs.hilltop.api.v0.models.TransactionHistoryRequest, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.Transaction]] = { val payload = play.api.libs.json.Json.toJson(transactionHistoryRequest) _executeRequest("POST", s"/transactions/history", body = Some(payload), requestHeaders = requestHeaders).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "Seq[io.gimbalabs.hilltop.api.v0.models.Transaction]", r, _.validate[Seq[io.gimbalabs.hilltop.api.v0.models.Transaction]] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } object WalletBalances extends WalletBalances { override def getByStakingAddress( stakingAddress: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.WalletBalance] = { _executeRequest( "GET", s"/wallet_balances/${play.utils.UriEncoding.encodePathSegment(stakingAddress, "UTF-8")}", requestHeaders = requestHeaders ).map { case r if r.status == 200 => _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.WalletBalance", r, _.validate[io.gimbalabs.hilltop.api.v0.models.WalletBalance] ) case r => throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Unsupported response code[${r.status}]. Expected: 200") } } } def _requestHolder(path: String): play.api.libs.ws.WSRequest = { val holder = ws .url(baseUrl + path) .addHttpHeaders( "User-Agent" -> Constants.UserAgent, "X-Apidoc-Version" -> Constants.Version, "X-Apidoc-Version-Major" -> Constants.VersionMajor.toString ) .addHttpHeaders(defaultHeaders: _*) auth.fold(holder) { case Authorization.Basic(username, password) => { holder.withAuth(username, password.getOrElse(""), play.api.libs.ws.WSAuthScheme.BASIC) } } } def _logRequest(method: String, req: play.api.libs.ws.WSRequest): play.api.libs.ws.WSRequest = { val queryComponents = for { (name, values) <- req.queryString value <- values } yield s"$name=$value" val url = s"${req.url}${queryComponents.mkString("?", "&", "")}" auth.fold(logger.info(s"curl -X $method '$url'")) { _ => logger.info(s"curl -X $method -u '[REDACTED]:' '$url'") } req } def _executeRequest( method: String, path: String, queryParameters: Seq[(String, String)] = Nil, requestHeaders: Seq[(String, String)] = Nil, body: Option[play.api.libs.json.JsValue] = None ): scala.concurrent.Future[play.api.libs.ws.WSResponse] = { method.toUpperCase match { case "GET" => { _logRequest( "GET", _requestHolder(path).addHttpHeaders(requestHeaders: _*).addQueryStringParameters(queryParameters: _*) ).get() } case "POST" => { _logRequest( "POST", _requestHolder(path) .addHttpHeaders(_withJsonContentType(requestHeaders): _*) .addQueryStringParameters(queryParameters: _*) ).post(body.getOrElse(play.api.libs.json.Json.obj())) } case "PUT" => { _logRequest( "PUT", _requestHolder(path) .addHttpHeaders(_withJsonContentType(requestHeaders): _*) .addQueryStringParameters(queryParameters: _*) ).put(body.getOrElse(play.api.libs.json.Json.obj())) } case "PATCH" => { _logRequest( "PATCH", _requestHolder(path).addHttpHeaders(requestHeaders: _*).addQueryStringParameters(queryParameters: _*) ).patch(body.getOrElse(play.api.libs.json.Json.obj())) } case "DELETE" => { _logRequest( "DELETE", _requestHolder(path).addHttpHeaders(requestHeaders: _*).addQueryStringParameters(queryParameters: _*) ).delete() } case "HEAD" => { _logRequest( "HEAD", _requestHolder(path).addHttpHeaders(requestHeaders: _*).addQueryStringParameters(queryParameters: _*) ).head() } case "OPTIONS" => { _logRequest( "OPTIONS", _requestHolder(path).addHttpHeaders(requestHeaders: _*).addQueryStringParameters(queryParameters: _*) ).options() } case _ => { _logRequest( method, _requestHolder(path).addHttpHeaders(requestHeaders: _*).addQueryStringParameters(queryParameters: _*) ) sys.error("Unsupported method[%s]".format(method)) } } } /** * Adds a Content-Type: application/json header unless the specified requestHeaders * already contain a Content-Type header */ def _withJsonContentType(headers: Seq[(String, String)]): Seq[(String, String)] = { headers.find { _._1.toUpperCase == "CONTENT-TYPE" } match { case None => headers ++ Seq("Content-Type" -> "application/json; charset=UTF-8") case Some(_) => headers } } } object Client { def parseJson[T]( className: String, r: play.api.libs.ws.WSResponse, f: (play.api.libs.json.JsValue => play.api.libs.json.JsResult[T]) ): T = { f(play.api.libs.json.Json.parse(r.body)) match { case play.api.libs.json.JsSuccess(x, _) => x case play.api.libs.json.JsError(errors) => { throw io.gimbalabs.hilltop.api.v0.errors .FailedRequest(r.status, s"Invalid json for class[" + className + "]: " + errors.mkString(" ")) } } } } sealed trait Authorization extends _root_.scala.Product with _root_.scala.Serializable object Authorization { final case class Basic(username: String, password: Option[String] = None) extends Authorization } package interfaces { trait Client { def baseUrl: String def activeStakeAmounts: io.gimbalabs.hilltop.api.v0.ActiveStakeAmounts def blocks: io.gimbalabs.hilltop.api.v0.Blocks def delegations: io.gimbalabs.hilltop.api.v0.Delegations def delegatorsCounts: io.gimbalabs.hilltop.api.v0.DelegatorsCounts def epochs: io.gimbalabs.hilltop.api.v0.Epochs def healthchecks: io.gimbalabs.hilltop.api.v0.Healthchecks def nativeAssets: io.gimbalabs.hilltop.api.v0.NativeAssets def poolUpdates: io.gimbalabs.hilltop.api.v0.PoolUpdates def rewards: io.gimbalabs.hilltop.api.v0.Rewards def sigmas: io.gimbalabs.hilltop.api.v0.Sigmas def stakepoolMetadata: io.gimbalabs.hilltop.api.v0.StakepoolMetadata def stakepools: io.gimbalabs.hilltop.api.v0.Stakepools def transactions: io.gimbalabs.hilltop.api.v0.Transactions def walletBalances: io.gimbalabs.hilltop.api.v0.WalletBalances } } trait ActiveStakeAmounts { def get( epochNumber: _root_.scala.Option[Int] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.ActiveStakeAmount] def getByPoolBech32Id( poolBech32Id: String, epochNumber: _root_.scala.Option[Int] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.ActiveStakeAmount] def getAddressesByPoolBech32Id( poolBech32Id: String, epochNumber: Int, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.AddressStakeAmount]] } trait Blocks { def getBlocksInDay( date: _root_.java.time.LocalDate, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.DayBlock] /** * @param blockNumber the block number */ def getByBlockNumber( blockNumber: Long, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Block] } trait Delegations { def getSafePaymentByStakingAddress( stakingAddress: String, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[String] def getStakepoolByStakingAddress( stakingAddress: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Delegation] } trait DelegatorsCounts { def getByPoolBech32Id( poolBech32Id: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.DelegatorsCount] } trait Epochs { def getCurrent( requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Epoch] def getByEpochNumber( epochNumber: Int, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Epoch] } trait Healthchecks { def get( requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Healthcheck] } trait NativeAssets { /** * @param blockNumberFrom the block number from when fetching updates, it's the pagination index * @param limit the number of updates to fetch */ def getIds( blockNumberFrom: _root_.scala.Option[Long] = None, limit: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAssetId]] /** * @param policyId the policy id to get the asset name */ def getAssetNamesByPolicyId( policyId: String, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Seq[String]] def getNfts( blockNumberFrom: Long, blockNumberTo: Long, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.NftDetails]] def postNativeAssetsDetails( nativeAssetDetailsRequest: io.gimbalabs.hilltop.api.v0.models.NativeAssetDetailsRequest, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAssetDetails]] def getByStakeAddress( stakeAddress: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.NativeAsset]] } trait PoolUpdates { /** * @param blockNumberFrom the block number from when fetching updates, it's the pagination index * @param limit the number of updates to fetch */ def getRetiring( blockNumberFrom: _root_.scala.Option[Long] = None, limit: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.PoolRetiring]] /** * @param blockNumberFrom the block number from when fetching updates, it's the pagination index * @param limit the number of updates to fetch */ def getByPoolId( poolId: String, blockNumberFrom: _root_.scala.Option[Long] = None, limit: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.PoolUpdate]] /** * @param blockNumberFrom the block number from when fetching updates, it's the pagination index * @param limit the number of updates to fetch */ def get( blockNumberFrom: _root_.scala.Option[Long] = None, limit: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.PoolUpdate]] } trait Rewards { def getByStakingAddress( stakingAddress: String, epochFrom: _root_.scala.Option[Int] = None, epochTo: _root_.scala.Option[Int] = None, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.Reward]] } trait Sigmas { /** * can be either the pool_id (e.g. pool1wcwe923r...) or the pool_hash */ def getByPoolId( poolId: String, epochNumber: Int, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Sigma] } trait StakepoolMetadata { def getByPoolIdBech32( poolIdBech32: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.StakepoolMetadata] } trait Stakepools { /** * find pool details by vrf_vkey * * @param vrfVkeyHash the hash of the vrf_vkey */ def getVrfVkeyByVrfVkeyHash( vrfVkeyHash: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.Stakepool] /** * Epoch at which stake pool was originally registered * * @param poolId id of the pool to query. Both id and bech32 formats are supported */ def getEstablishedEpochByPoolId( poolId: String, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Int] /** * live stake in lovelaces * * @param poolId id of the pool to query. Both id and bech32 formats are supported */ def getLiveStakeByPoolId( poolId: String, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Long] /** * number minted blocks in epoch * * @param poolId id of the pool to query. Both id and bech32 formats are supported * @param epoch epoch in which to query number of produced blocks or current epoch if not * specified */ def getBlocksByPoolId( poolId: String, epoch: _root_.scala.Option[Int] = None, requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Int] def get( requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.Stakepool]] } trait Transactions { def postHistory( transactionHistoryRequest: io.gimbalabs.hilltop.api.v0.models.TransactionHistoryRequest, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[Seq[io.gimbalabs.hilltop.api.v0.models.Transaction]] } trait WalletBalances { def getByStakingAddress( stakingAddress: String, requestHeaders: Seq[(String, String)] = Nil )( implicit ec: scala.concurrent.ExecutionContext ): scala.concurrent.Future[io.gimbalabs.hilltop.api.v0.models.WalletBalance] } package errors { import io.gimbalabs.hilltop.api.v0.models.json._ final case class GenericErrorResponse( response: play.api.libs.ws.WSResponse, message: Option[String] = None ) extends Exception(message.getOrElse(s"${response.status}: ${response.body}")) { lazy val genericError = _root_.io.gimbalabs.hilltop.api.v0.Client.parseJson( "io.gimbalabs.hilltop.api.v0.models.GenericError", response, _.validate[io.gimbalabs.hilltop.api.v0.models.GenericError] ) } final case class FailedRequest(responseCode: Int, message: String, requestUri: Option[_root_.java.net.URI] = None) extends _root_.java.lang.Exception(s"HTTP $responseCode: $message") } }