From ffeb410e4168092616a84e0ec612eca43b301937 Mon Sep 17 00:00:00 2001 From: semyonoskin Date: Fri, 6 May 2022 22:40:09 +0300 Subject: [PATCH 1/5] pool stats ep --- .bsp/sbt.json | 2 +- .../api/v1/endpoints/AmmStatsEndpoints.scala | 9 ++ .../api/v1/routes/AmmStatsRoutes.scala | 6 +- .../markets/api/v1/services/AmmStats.scala | 93 ++++++++++++++++++- 4 files changed, 105 insertions(+), 5 deletions(-) diff --git a/.bsp/sbt.json b/.bsp/sbt.json index 952c87ae..6c4c4f91 100644 --- a/.bsp/sbt.json +++ b/.bsp/sbt.json @@ -1 +1 @@ -{"name":"sbt","version":"1.5.5","bspVersion":"2.0.0-M5","languages":["scala"],"argv":["/Users/oskin/.sdkman/candidates/java/17.0.1-ms/bin/java","-Xms100m","-Xmx100m","-classpath","/Users/oskin/Library/Application Support/JetBrains/IntelliJIdea2021.2/plugins/Scala/launcher/sbt-launch.jar","xsbt.boot.Boot","-bsp","--sbt-launch-jar=/Users/oskin/Library/Application%20Support/JetBrains/IntelliJIdea2021.2/plugins/Scala/launcher/sbt-launch.jar"]} \ No newline at end of file +{"name":"sbt","version":"1.5.5","bspVersion":"2.0.0-M5","languages":["scala"],"argv":["/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home/bin/java","-Xms100m","-Xmx100m","-classpath","/Users/oskin/Library/Application Support/JetBrains/Toolbox/apps/IDEA-C/ch-0/213.6777.52/IntelliJ IDEA CE.app.plugins/Scala/launcher/sbt-launch.jar","xsbt.boot.Boot","-bsp","--sbt-launch-jar=/Users/oskin/Library/Application%20Support/JetBrains/Toolbox/apps/IDEA-C/ch-0/213.6777.52/IntelliJ%20IDEA%20CE.app.plugins/Scala/launcher/sbt-launch.jar"]} \ No newline at end of file diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala index 134a86ca..9cab3811 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala @@ -34,6 +34,15 @@ final class AmmStatsEndpoints { .name("Pool stats") .description("Get statistics on the pool with the given ID") + def getPoolsStats: Endpoint[TimeWindow, HttpError, List[PoolSummary], Any] = + baseEndpoint.get + .in(PathPrefix / "pools" / "stats") + .in(timeWindow) + .out(jsonBody[List[PoolSummary]]) + .tag(Group) + .name("Pools stats") + .description("Get statistics on all pools") + def getPlatformStats: Endpoint[TimeWindow, HttpError, PlatformSummary, Any] = baseEndpoint.get .in(PathPrefix / "platform" / "stats") diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/routes/AmmStatsRoutes.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/routes/AmmStatsRoutes.scala index c107a232..24b5224e 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/routes/AmmStatsRoutes.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/routes/AmmStatsRoutes.scala @@ -21,7 +21,7 @@ final class AmmStatsRoutes[ private val interpreter = Http4sServerInterpreter(opts) def routes: HttpRoutes[F] = - caching.middleware(getPoolLocksR <+> getPlatformStatsR <+> getPoolStatsR <+> getAvgPoolSlippageR <+> getPoolPriceChartR <+> getAmmMarketsR <+> convertToFiatR) + caching.middleware(getPoolLocksR <+> getPlatformStatsR <+> getPoolStatsR <+> getPoolsStatsR <+> getAvgPoolSlippageR <+> getPoolPriceChartR <+> getAmmMarketsR <+> convertToFiatR) def getPoolLocksR: HttpRoutes[F] = interpreter.toRoutes(getPoolLocks) { case (poolId, leastDeadline) => locks.byPool(poolId, leastDeadline).adaptThrowable.value @@ -31,6 +31,10 @@ final class AmmStatsRoutes[ stats.getPoolSummary(poolId, tw).adaptThrowable.orNotFound(s"PoolStats{poolId=$poolId}").value } + def getPoolsStatsR: HttpRoutes[F] = interpreter.toRoutes(getPoolsStats) { tw => + stats.getPoolsSummary(tw).adaptThrowable.value + } + def getPlatformStatsR: HttpRoutes[F] = interpreter.toRoutes(getPlatformStats) { tw => stats.getPlatformSummary(tw).adaptThrowable.value } diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala index 09711dc4..4c10fa00 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala @@ -16,9 +16,14 @@ import org.ergoplatform.dex.markets.repositories.Pools import tofu.doobie.transactor.Txr import mouse.anyf._ import cats.syntax.traverse._ -import org.ergoplatform.dex.markets.db.models.amm.{PoolSnapshot, PoolTrace, PoolVolumeSnapshot} -import org.ergoplatform.dex.domain.{AssetClass, CryptoUnits, MarketId} -import org.ergoplatform.dex.domain.FullAsset +import org.ergoplatform.dex.markets.db.models.amm.{ + PoolFeesSnapshot, + PoolInfo, + PoolSnapshot, + PoolTrace, + PoolVolumeSnapshot +} +import org.ergoplatform.dex.domain.{AssetClass, AssetEquiv, CryptoUnits, FullAsset, MarketId} import org.ergoplatform.dex.markets.modules.AmmStatsMath import org.ergoplatform.ergo.TokenId import org.ergoplatform.ergo.modules.ErgoNetwork @@ -34,6 +39,8 @@ trait AmmStats[F[_]] { def getPoolSummary(poolId: PoolId, window: TimeWindow): F[Option[PoolSummary]] + def getPoolsSummary(window: TimeWindow): F[List[PoolSummary]] + def getAvgPoolSlippage(poolId: PoolId, depth: Int): F[Option[PoolSlippage]] def getPoolPriceChart(poolId: PoolId, window: TimeWindow, resolution: Int): F[List[PricePoint]] @@ -92,6 +99,86 @@ object AmmStats { } yield PlatformSummary(tvl, volume) } + private def calculateTVLsFor(pools: List[PoolSnapshot]): F[List[TotalValueLocked]] = + pools + .traverse { pool => + fiatSolver + .convert(pool.lockedX, UsdUnits) + .flatMap(optX => fiatSolver.convert(pool.lockedY, UsdUnits).map(optY => (pool, optX, optY))) + } + .map { equivOpts => + val equivs = equivOpts.filter { case (_, eqX, eqY) => eqX.isDefined && eqY.isDefined } + equivs.map { case (_, lx, ly) => TotalValueLocked(lx.get.value + ly.get.value, UsdUnits) } + } + + private def convertVolumes(pools: List[PoolSnapshot], volumes: List[PoolVolumeSnapshot], window: TimeWindow) = + pools.map(p => volumes.find(_.poolId == p.id)).traverse { + case Some(vol) => + for { + volX <- fiatSolver.convert(vol.volumeByX, UsdUnits) + volY <- fiatSolver.convert(vol.volumeByY, UsdUnits) + } yield + if (volX.isDefined && volY.isDefined) Volume(volX.get.value + volY.get.value, UsdUnits, window) + else Volume.empty(UsdUnits, window) + case None => Volume.empty(UsdUnits, window).pure[F] + } + + private def convertFees(pools: List[PoolSnapshot], fees: List[PoolFeesSnapshot], window: TimeWindow) = + pools.map(p => fees.find(_.poolId == p.id)).traverse { + case Some(feesSnap) => + for { + feesX <- fiatSolver.convert(feesSnap.feesByX, UsdUnits) + feesY <- fiatSolver.convert(feesSnap.feesByY, UsdUnits) + } yield + if (feesX.isDefined && feesY.isDefined) Fees(feesX.get.value + feesY.get.value, UsdUnits, window) + else Fees.empty(UsdUnits, window) + case None => Fees.empty(UsdUnits, window).pure[F] + } + + def getPoolsSummary(window: TimeWindow): F[List[PoolSummary]] = { + val queryPoolsStats = + for { + snaps <- pools.snapshots + tupled <- snaps.traverse(p => pools.info(p.id).map(opt => (p, opt))) + (allPools, info) = tupled.filter(_._2.isDefined).unzip + volumes <- pools.volumes(window) + fees <- pools.fees(window) + } yield (allPools, info, volumes, fees) + for { + ( + pools: List[PoolSnapshot], + info: List[Option[PoolInfo]], + volumes: List[PoolVolumeSnapshot], + fees: List[PoolFeesSnapshot] + ) <- queryPoolsStats ||> txr.trans + tvls <- calculateTVLsFor(pools) + vols <- convertVolumes(pools, volumes, window) + feeSnaps <- convertFees(pools, fees, window) + fullPoolInfos = (tvls, vols, feeSnaps).zipped.toList zip info zip pools + res <- fullPoolInfos.traverse { case (((tvl, vol, fee), inf), pool) => + ammMath + .feePercentProjection(tvl, fee, inf.get, MillisInYear) + .map(perc => PoolSummary(pool.id, pool.lockedX, pool.lockedY, tvl, vol, fee, perc)) + } + } yield res + } + + // vols <- allPools.map(p => volumes.find(_.poolId == p.id)).foldLeft(List.empty[Volume].pure[F]) { case (acc, a) => + // acc.flatMap( li => + // a match { + // case Some(vol) => + // for { + // volX <- fiatSolver.convert(vol.volumeByX, UsdUnits) + // volY <- fiatSolver.convert(vol.volumeByY, UsdUnits) + // } yield { + // if (volX.isDefined && volY.isDefined) li :+ Volume(volX.get.value + volY.get.value, UsdUnits, window) + // else li + // } + // case None => (li :+ Volume.empty(UsdUnits, window)).pure[F] + // } + // ) + // } + def getPoolSummary(poolId: PoolId, window: TimeWindow): F[Option[PoolSummary]] = { val queryPoolStats = (for { From da7e819e36428d9b787e1861d0393668cabf58b6 Mon Sep 17 00:00:00 2001 From: semyonoskin Date: Mon, 9 May 2022 16:39:31 +0300 Subject: [PATCH 2/5] pools summary ep improved --- .../dex/markets/api/v1/models/amm/types.scala | 6 ++++ .../markets/api/v1/services/AmmStats.scala | 30 ++++++++----------- .../dex/markets/db/models/amm.scala | 2 +- .../dex/markets/db/sql/AnalyticsSql.scala | 20 +++++++++++-- .../dex/markets/repositories/Pools.scala | 15 ++++++++++ 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/models/amm/types.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/models/amm/types.scala index dffbd052..9979050e 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/models/amm/types.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/models/amm/types.scala @@ -3,11 +3,17 @@ package org.ergoplatform.dex.markets.api.v1.models.amm import derevo.circe.{decoder, encoder} import derevo.derive import io.estatico.newtype.macros.newtype +import org.ergoplatform.dex.markets.db.models.amm.{PoolFeesSnapshot, PoolInfo, PoolSnapshot, PoolVolumeSnapshot} import sttp.tapir.Schema import scala.math.BigDecimal.RoundingMode object types { + final case class PoolBundle(pools: List[PoolSnapshot], + infos: List[PoolInfo], + volumes: List[PoolVolumeSnapshot], + fees: List[PoolFeesSnapshot]) + @derive(encoder, decoder) @newtype case class RealPrice(value: BigDecimal) { def setScale(scale: Int): RealPrice = RealPrice(value.setScale(scale, RoundingMode.HALF_UP)) diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala index 4c10fa00..a712909a 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala @@ -1,7 +1,7 @@ package org.ergoplatform.dex.markets.api.v1.services import cats.Monad -import cats.data.OptionT +import cats.data.{NonEmptyList, OptionT} import cats.effect.Clock import mouse.anyf._ import org.ergoplatform.common.models.TimeWindow @@ -138,26 +138,22 @@ object AmmStats { def getPoolsSummary(window: TimeWindow): F[List[PoolSummary]] = { val queryPoolsStats = for { - snaps <- pools.snapshots - tupled <- snaps.traverse(p => pools.info(p.id).map(opt => (p, opt))) - (allPools, info) = tupled.filter(_._2.isDefined).unzip + snaps <- pools.snapshots + infos <- NonEmptyList.fromList(snaps.map(_.id)).fold(List.empty[PoolInfo].pure[D])(ids => pools.infos(ids)) + (allPools, info) = + snaps.filter(ps => infos.exists(_.poolId == ps.id)).map(p => (p, infos.find(_.poolId == p.id).get)).unzip volumes <- pools.volumes(window) fees <- pools.fees(window) - } yield (allPools, info, volumes, fees) + } yield PoolBundle(allPools, info, volumes, fees) for { - ( - pools: List[PoolSnapshot], - info: List[Option[PoolInfo]], - volumes: List[PoolVolumeSnapshot], - fees: List[PoolFeesSnapshot] - ) <- queryPoolsStats ||> txr.trans - tvls <- calculateTVLsFor(pools) - vols <- convertVolumes(pools, volumes, window) - feeSnaps <- convertFees(pools, fees, window) - fullPoolInfos = (tvls, vols, feeSnaps).zipped.toList zip info zip pools - res <- fullPoolInfos.traverse { case (((tvl, vol, fee), inf), pool) => + poolBundle: PoolBundle <- queryPoolsStats ||> txr.trans + tvls <- calculateTVLsFor(poolBundle.pools) + vols <- convertVolumes(poolBundle.pools, poolBundle.volumes, window) + feeSnaps <- convertFees(poolBundle.pools, poolBundle.fees, window) + fullPoolInfos = poolBundle.pools zip poolBundle.infos zip (tvls, vols, feeSnaps).zipped.toList + res <- fullPoolInfos.traverse { case ((pool, inf), (tvl, vol, fee)) => ammMath - .feePercentProjection(tvl, fee, inf.get, MillisInYear) + .feePercentProjection(tvl, fee, inf, MillisInYear) .map(perc => PoolSummary(pool.id, pool.lockedX, pool.lockedY, tvl, vol, fee, perc)) } } yield res diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/models/amm.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/models/amm.scala index 8d09847d..296c292a 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/models/amm.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/models/amm.scala @@ -6,7 +6,7 @@ import org.ergoplatform.ergo.TokenId object amm { - final case class PoolInfo(confirmedAt: Long) + final case class PoolInfo(poolId: PoolId, confirmedAt: Long) final case class AssetInfo( id: TokenId, diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/sql/AnalyticsSql.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/sql/AnalyticsSql.scala index f770f065..4c3b602b 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/sql/AnalyticsSql.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/sql/AnalyticsSql.scala @@ -1,8 +1,9 @@ package org.ergoplatform.dex.markets.db.sql +import cats.data.NonEmptyList import doobie.implicits._ import doobie.util.query.Query0 -import doobie.{Fragment, LogHandler} +import doobie.{Fragment, Fragments, LogHandler} import org.ergoplatform.common.models.TimeWindow import org.ergoplatform.dex.domain.amm.PoolId import org.ergoplatform.dex.markets.db.models.amm._ @@ -12,9 +13,24 @@ final class AnalyticsSql(implicit lg: LogHandler) { def getInfo(id: PoolId): Query0[PoolInfo] = sql""" - |select s.timestamp from swaps s where s.pool_id = $id order by s.timestamp asc limit 1 + |select s.pool_id, s.timestamp from swaps s where s.pool_id = $id order by s.timestamp asc limit 1 """.stripMargin.query + def getInfos(ids: NonEmptyList[PoolId]): Query0[PoolInfo] = { + val q = + sql""" + |select s.pool_id, s.timestamp from swaps s + |left join ( + | select pool_id, max(timestamp) as ts + | from swaps + | group by pool_id + |) as sx on s.pool_id = sx.pool_id and s.timestamp = sx.ts + |where s.timestamp = sx.ts + """.stripMargin + + (q ++ Fragments.in(fr"and s.pool_id", ids)).query + } + def getPoolSnapshot(id: PoolId): Query0[PoolSnapshot] = sql""" |select p.pool_id, p.x_id, p.x_amount, ax.ticker, ax.decimals, p.y_id, p.y_amount, ay.ticker, ay.decimals, 0 diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/repositories/Pools.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/repositories/Pools.scala index fa912b8d..6e448959 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/repositories/Pools.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/repositories/Pools.scala @@ -1,5 +1,6 @@ package org.ergoplatform.dex.markets.repositories +import cats.data.NonEmptyList import cats.tagless.syntax.functorK._ import cats.{FlatMap, Functor} import derevo.derive @@ -24,6 +25,10 @@ trait Pools[F[_]] { */ def info(id: PoolId): F[Option[PoolInfo]] + /** Get general info about pools with given `ids`. + */ + def infos(ids: NonEmptyList[PoolId]): F[List[PoolInfo]] + /** Get snapshots of all pools. */ def snapshots: F[List[PoolSnapshot]] @@ -84,6 +89,9 @@ object Pools { def info(id: PoolId): ConnectionIO[Option[PoolInfo]] = sql.getInfo(id).option + def infos(ids: NonEmptyList[PoolId]): ConnectionIO[List[PoolInfo]] = + sql.getInfos(ids).to[List] + def snapshots: ConnectionIO[List[PoolSnapshot]] = sql.getPoolSnapshots.to[List] @@ -127,6 +135,13 @@ object Pools { _ <- trace"info(poolId=$poolId) -> ${r.size} info entities selected" } yield r + def infos(ids: NonEmptyList[PoolId]): Mid[F, List[PoolInfo]] = + for { + _ <- trace"info(poolId=$ids)" + r <- _ + _ <- trace"info(poolId=$ids) -> ${r.size} info entities selected" + } yield r + def snapshots: Mid[F, List[PoolSnapshot]] = for { _ <- trace"snapshots" From 7561e1fc7d08bcbb0684dcc75db04b1a8e702f8f Mon Sep 17 00:00:00 2001 From: semyonoskin Date: Mon, 9 May 2022 18:34:49 +0300 Subject: [PATCH 3/5] pools summary ep improved --- .../markets/api/v1/services/AmmStats.scala | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala index a712909a..790c9c04 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala @@ -137,26 +137,27 @@ object AmmStats { def getPoolsSummary(window: TimeWindow): F[List[PoolSummary]] = { val queryPoolsStats = - for { - snaps <- pools.snapshots - infos <- NonEmptyList.fromList(snaps.map(_.id)).fold(List.empty[PoolInfo].pure[D])(ids => pools.infos(ids)) + (for { + snaps <- OptionT.liftF(pools.snapshots) + poolIds <- OptionT.fromOption[D](NonEmptyList.fromList(snaps.map(_.id))) + infos <- OptionT.liftF(pools.infos(poolIds)) (allPools, info) = snaps.filter(ps => infos.exists(_.poolId == ps.id)).map(p => (p, infos.find(_.poolId == p.id).get)).unzip - volumes <- pools.volumes(window) - fees <- pools.fees(window) - } yield PoolBundle(allPools, info, volumes, fees) - for { - poolBundle: PoolBundle <- queryPoolsStats ||> txr.trans - tvls <- calculateTVLsFor(poolBundle.pools) - vols <- convertVolumes(poolBundle.pools, poolBundle.volumes, window) - feeSnaps <- convertFees(poolBundle.pools, poolBundle.fees, window) + volumes <- OptionT.liftF(pools.volumes(window)) + fees <- OptionT.liftF(pools.fees(window)) + } yield PoolBundle(allPools, info, volumes, fees)).value + (for { + poolBundle: PoolBundle <- OptionT(queryPoolsStats ||> txr.trans) + tvls <- OptionT.liftF(calculateTVLsFor(poolBundle.pools)) + vols <- OptionT.liftF(convertVolumes(poolBundle.pools, poolBundle.volumes, window)) + feeSnaps <- OptionT.liftF(convertFees(poolBundle.pools, poolBundle.fees, window)) fullPoolInfos = poolBundle.pools zip poolBundle.infos zip (tvls, vols, feeSnaps).zipped.toList - res <- fullPoolInfos.traverse { case ((pool, inf), (tvl, vol, fee)) => + res <- OptionT.liftF(fullPoolInfos.traverse { case ((pool, inf), (tvl, vol, fee)) => ammMath .feePercentProjection(tvl, fee, inf, MillisInYear) .map(perc => PoolSummary(pool.id, pool.lockedX, pool.lockedY, tvl, vol, fee, perc)) - } - } yield res + }) + } yield res).value.map(_.toList.flatten) } // vols <- allPools.map(p => volumes.find(_.poolId == p.id)).foldLeft(List.empty[Volume].pure[F]) { case (acc, a) => From 976ed75b06d2258f62c4a76e00542841673623a7 Mon Sep 17 00:00:00 2001 From: semyonoskin Date: Fri, 13 May 2022 15:36:42 +0300 Subject: [PATCH 4/5] pools summary ep added --- .../markets/api/v1/services/AmmStats.scala | 19 +------------------ .../dex/markets/db/sql/AnalyticsSql.scala | 2 +- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala index 790c9c04..c62bf766 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/services/AmmStats.scala @@ -18,12 +18,11 @@ import mouse.anyf._ import cats.syntax.traverse._ import org.ergoplatform.dex.markets.db.models.amm.{ PoolFeesSnapshot, - PoolInfo, PoolSnapshot, PoolTrace, PoolVolumeSnapshot } -import org.ergoplatform.dex.domain.{AssetClass, AssetEquiv, CryptoUnits, FullAsset, MarketId} +import org.ergoplatform.dex.domain.{AssetClass, CryptoUnits, FullAsset, MarketId} import org.ergoplatform.dex.markets.modules.AmmStatsMath import org.ergoplatform.ergo.TokenId import org.ergoplatform.ergo.modules.ErgoNetwork @@ -160,22 +159,6 @@ object AmmStats { } yield res).value.map(_.toList.flatten) } - // vols <- allPools.map(p => volumes.find(_.poolId == p.id)).foldLeft(List.empty[Volume].pure[F]) { case (acc, a) => - // acc.flatMap( li => - // a match { - // case Some(vol) => - // for { - // volX <- fiatSolver.convert(vol.volumeByX, UsdUnits) - // volY <- fiatSolver.convert(vol.volumeByY, UsdUnits) - // } yield { - // if (volX.isDefined && volY.isDefined) li :+ Volume(volX.get.value + volY.get.value, UsdUnits, window) - // else li - // } - // case None => (li :+ Volume.empty(UsdUnits, window)).pure[F] - // } - // ) - // } - def getPoolSummary(poolId: PoolId, window: TimeWindow): F[Option[PoolSummary]] = { val queryPoolStats = (for { diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/sql/AnalyticsSql.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/sql/AnalyticsSql.scala index 4c3b602b..c5d7dd21 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/sql/AnalyticsSql.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/db/sql/AnalyticsSql.scala @@ -21,7 +21,7 @@ final class AnalyticsSql(implicit lg: LogHandler) { sql""" |select s.pool_id, s.timestamp from swaps s |left join ( - | select pool_id, max(timestamp) as ts + | select pool_id, min(timestamp) as ts | from swaps | group by pool_id |) as sx on s.pool_id = sx.pool_id and s.timestamp = sx.ts From 4138007f34b1eebd80f43623610dfd9b50ed2cef Mon Sep 17 00:00:00 2001 From: semyonoskin Date: Fri, 13 May 2022 15:46:05 +0300 Subject: [PATCH 5/5] refactoring --- .../dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala index 9cab3811..967eecf0 100644 --- a/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala +++ b/modules/markets-api/src/main/scala/org/ergoplatform/dex/markets/api/v1/endpoints/AmmStatsEndpoints.scala @@ -14,7 +14,7 @@ final class AmmStatsEndpoints { val Group = "ammStats" def endpoints: List[Endpoint[_, _, _, _]] = - getPoolLocks :: getPlatformStats :: getPoolStats :: getAvgPoolSlippage :: getPoolPriceChart :: getAmmMarkets :: convertToFiat :: Nil + getPoolLocks :: getPlatformStats :: getPoolStats :: getPoolsStats :: getAvgPoolSlippage :: getPoolPriceChart :: getAmmMarkets :: convertToFiat :: Nil def getPoolLocks: Endpoint[(PoolId, Int), HttpError, List[LiquidityLockInfo], Any] = baseEndpoint.get