diff --git a/build.sbt b/build.sbt index 88fd5a9edf..35d89b012d 100644 --- a/build.sbt +++ b/build.sbt @@ -15,6 +15,10 @@ lazy val commonOwaspSettings = Seq( dependencyCheckAssemblyAnalyzerEnabled := Some(false) ) +lazy val `dex-common` = project + .settings(commonOwaspSettings) + .dependsOn(`waves-grpc`) + // Used in unit and integration tests lazy val `dex-test-common` = project.settings(commonOwaspSettings).dependsOn(`waves-integration`) @@ -22,6 +26,7 @@ lazy val dex = project .settings(commonOwaspSettings) .dependsOn( `waves-integration`, + `dex-common` % "compile->compile;test->test", `dex-test-common` % "test->compile" ) @@ -53,14 +58,16 @@ lazy val `waves-ext` = project .settings(commonOwaspSettings) .dependsOn( `waves-grpc`, + `dex-common` % "test->test", `dex-test-common` % "test->compile" ) -lazy val `waves-integration` = project.settings(commonOwaspSettings).dependsOn(`waves-grpc`) +lazy val `waves-integration` = project.settings(commonOwaspSettings).dependsOn(`waves-grpc`, `dex-common` % "compile->compile;test->test") lazy val `waves-integration-it` = project .settings(commonOwaspSettings) .dependsOn( + `dex-common` % "compile->compile;test->test", `waves-integration`, `dex-it-common` ) @@ -84,6 +91,7 @@ lazy val root = (project in file(".")) .settings(name := "dex-root") .settings(commonOwaspSettings) .aggregate( + `dex-common`, dex, `dex-it`, `dex-load`, diff --git a/dex-common/build.sbt b/dex-common/build.sbt new file mode 100644 index 0000000000..3c56dfe17e --- /dev/null +++ b/dex-common/build.sbt @@ -0,0 +1,3 @@ +description := "Shared classes for matcher, waves-integration and liquidity pools project" + +libraryDependencies ++= Dependencies.Module.dexCommon diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAddressState.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAddressState.scala similarity index 60% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAddressState.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAddressState.scala index 45539dad66..eeee65b535 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAddressState.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAddressState.scala @@ -1,6 +1,5 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.actors.address.AddressActor.Reply.GetState import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.order.Order import io.swagger.annotations.ApiModelProperty @@ -21,15 +20,4 @@ object HttpAddressState { implicit val HttpAddressStateFormat: Format[HttpAddressState] = Json.format - def apply(s: GetState): HttpAddressState = new HttpAddressState( - s.balances.regular.xs, - s.balances.reserved.xs, - s.balances.allTradableBalance.xs, - s.balances.unconfirmed.xs, - s.balances.outgoingLeasing.getOrElse(0L), - s.balances.notCreatedTxs map { case (k, v) => (k.toString, v.pessimisticChanges.xs) }, - s.balances.notObservedTxs map { case (k, v) => (k.toString, v.executionTotalVolumeDiff.xs) }, - s.placementQueue.toList - ) - } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetInfo.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetInfo.scala similarity index 68% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetInfo.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetInfo.scala index 035363e263..5f9f3a7aa9 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetInfo.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetInfo.scala @@ -1,6 +1,5 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.actors.OrderBookDirectoryActor.AssetInfo import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Format, Json} @@ -8,5 +7,4 @@ case class HttpAssetInfo(@ApiModelProperty(example = "8") decimals: Int) object HttpAssetInfo { implicit val httpAssetInfoFormat: Format[HttpAssetInfo] = Json.format[HttpAssetInfo] - def fromAssetInfo(ai: AssetInfo): HttpAssetInfo = HttpAssetInfo(ai.decimals) } diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetType.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetType.scala new file mode 100644 index 0000000000..32f04d3c2a --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpAssetType.scala @@ -0,0 +1,18 @@ +package com.wavesplatform.dex.api.http.entities + +import enumeratum.{Enum, EnumEntry, PlayLowercaseJsonEnum} + +sealed trait HttpAssetType extends EnumEntry + +object HttpAssetType extends Enum[HttpAssetType] with PlayLowercaseJsonEnum[HttpAssetType] { + override val values = findValues + + case object Amount extends HttpAssetType + + case object Price extends HttpAssetType + + case object Spending extends HttpAssetType + + case object Receiving extends HttpAssetType + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpError.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpError.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpError.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpError.scala diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpLastTrade.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpLastTrade.scala new file mode 100644 index 0000000000..1ca67ff084 --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpLastTrade.scala @@ -0,0 +1,7 @@ +package com.wavesplatform.dex.api.http.entities + +import com.wavesplatform.dex.domain.order.OrderType + +final case class HttpLastTrade(price: Long, amount: Long, side: OrderType) { + override def toString: String = s"LastTrade(p=$price, a=$amount, $side)" +} diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpLevelAgg.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpLevelAgg.scala new file mode 100644 index 0000000000..0a4cce4f9b --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpLevelAgg.scala @@ -0,0 +1,3 @@ +package com.wavesplatform.dex.api.http.entities + +final case class HttpLevelAgg(amount: Long, price: Long) diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMarketDataWithMeta.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMarketDataWithMeta.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMarketDataWithMeta.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMarketDataWithMeta.scala diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMarketStatus.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMarketStatus.scala new file mode 100644 index 0000000000..fb4ccf5d21 --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMarketStatus.scala @@ -0,0 +1,7 @@ +package com.wavesplatform.dex.api.http.entities + +case class HttpMarketStatus( + lastTrade: Option[HttpLastTrade], + bestBid: Option[HttpLevelAgg], + bestAsk: Option[HttpLevelAgg] +) diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatcherPublicSettings.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatcherPublicSettings.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatcherPublicSettings.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatcherPublicSettings.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatchingRules.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatchingRules.scala similarity index 74% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatchingRules.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatchingRules.scala index 5bfb7ba43f..37c920b08c 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatchingRules.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMatchingRules.scala @@ -1,12 +1,12 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.json +import com.wavesplatform.dex.utils.JsonImplicits import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Format, Json, OFormat} case class HttpMatchingRules(@ApiModelProperty(dataType = "string", example = "0.0001") tickSize: Double) object HttpMatchingRules { - implicit val doubleFormat: Format[Double] = json.stringAsDoubleFormat + implicit val doubleFormat: Format[Double] = JsonImplicits.stringAsDoubleFormat implicit val httpMatchingRulesFormat: OFormat[HttpMatchingRules] = Json.format[HttpMatchingRules] } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMessage.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMessage.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMessage.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpMessage.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBook.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBook.scala similarity index 91% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBook.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBook.scala index f99b371517..ec2eafa1e7 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBook.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBook.scala @@ -12,13 +12,18 @@ import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.model.Denormalization -import com.wavesplatform.dex.model.LevelAgg import com.wavesplatform.dex.tool.LocaleUtils import java.text.DecimalFormat @JsonSerialize(using = classOf[HttpOrderBook.Serializer]) -case class HttpOrderBook(timestamp: Long, pair: AssetPair, bids: Seq[LevelAgg], asks: Seq[LevelAgg], assetPairDecimals: Option[(Int, Int)] = None) +case class HttpOrderBook( + timestamp: Long, + pair: AssetPair, + bids: Seq[HttpLevelAgg], + asks: Seq[HttpLevelAgg], + assetPairDecimals: Option[(Int, Int)] = None +) object HttpOrderBook { @@ -49,7 +54,7 @@ object HttpOrderBook { private def formatValue(value: BigDecimal, decimals: Int): String = new DecimalFormat(s"0.${"0" * decimals}", LocaleUtils.symbols).format(value) - private def denormalizeAndSerializeSide(side: Seq[LevelAgg], amountAssetDecimals: Int, priceAssetDecimals: Int, jg: JsonGenerator): Unit = + private def denormalizeAndSerializeSide(side: Seq[HttpLevelAgg], amountAssetDecimals: Int, priceAssetDecimals: Int, jg: JsonGenerator): Unit = side.foreach { levelAgg => val denormalizedPrice = Denormalization.denormalizePrice(levelAgg.price, amountAssetDecimals, priceAssetDecimals) val denormalizedAmount = Denormalization.denormalizeAmountAndFee(levelAgg.amount, amountAssetDecimals) diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItem.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItem.scala old mode 100755 new mode 100644 similarity index 66% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItem.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItem.scala index 7a766a3eb9..6418662842 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItem.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItem.scala @@ -1,9 +1,7 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.db.OrderDb.orderIdOrdering import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} -import com.wavesplatform.dex.domain.order.{Order, OrderType} -import com.wavesplatform.dex.model.{AcceptedOrderType, OrderInfo, OrderStatus} +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order, OrderType} import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Json, OFormat} @@ -52,24 +50,6 @@ object HttpOrderBookHistoryItem { implicit val httpOrderBookHistoryItemFormat: OFormat[HttpOrderBookHistoryItem] = Json.format - val httpOrderBookHistoryItemOrdering: Ordering[HttpOrderBookHistoryItem] = orderIdOrdering.on(item => (item.id, item.timestamp)) - - def fromOrderInfo(id: Order.Id, info: OrderInfo[OrderStatus]): HttpOrderBookHistoryItem = HttpOrderBookHistoryItem( - id = id, - `type` = info.side, - orderType = info.orderType, - amount = info.amount, - filled = info.status.filledAmount, - price = info.price, - fee = info.matcherFee, - filledFee = info.status.filledFee, - feeAsset = info.feeAsset, - timestamp = info.timestamp, - status = info.status.name, - assetPair = info.assetPair, - avgWeighedPrice = info.avgWeighedPrice, - version = info.orderVersion, - totalExecutedPriceAssets = info.totalExecutedPriceAssets - ) + val httpOrderBookHistoryItemOrdering: Ordering[HttpOrderBookHistoryItem] = Order.orderIdOrdering.on(item => (item.id, item.timestamp)) } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookInfo.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookInfo.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookInfo.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookInfo.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatus.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatus.scala similarity index 78% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatus.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatus.scala index 5ac45a85f5..3eb76c4dd6 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatus.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatus.scala @@ -1,8 +1,6 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor.MarketStatus import com.wavesplatform.dex.domain.order.OrderType -import com.wavesplatform.dex.model.{LastTrade, LevelAgg} import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Json, OFormat} @@ -22,32 +20,32 @@ case class HttpOrderBookStatus( ) { @ApiModelProperty(hidden = true) - val lastTrade: Option[LastTrade] = + val lastTrade: Option[HttpLastTrade] = for { lp <- lastPrice la <- lastAmount ls <- lastSide - } yield LastTrade(lp, la, ls) + } yield HttpLastTrade(lp, la, ls) @ApiModelProperty(hidden = true) - val bestBid: Option[LevelAgg] = + val bestBid: Option[HttpLevelAgg] = for { bba <- bidAmount bbp <- bid - } yield LevelAgg(bba, bbp) + } yield HttpLevelAgg(bba, bbp) @ApiModelProperty(hidden = true) - val bestAsk: Option[LevelAgg] = + val bestAsk: Option[HttpLevelAgg] = for { baa <- askAmount bap <- ask - } yield LevelAgg(baa, bap) + } yield HttpLevelAgg(baa, bap) } object HttpOrderBookStatus { - def fromMarketStatus(ms: MarketStatus): HttpOrderBookStatus = + def fromMarketStatus(ms: HttpMarketStatus): HttpOrderBookStatus = HttpOrderBookStatus( lastPrice = ms.lastTrade.map(_.price), lastAmount = ms.lastTrade.map(_.amount), diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeMode.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeMode.scala similarity index 85% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeMode.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeMode.scala index f828416436..97474bb370 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeMode.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeMode.scala @@ -2,7 +2,6 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.api.http.entities.HttpOrderFeeMode.{FeeModeDynamic, FeeModeFixed, FeeModePercent} import com.wavesplatform.dex.domain.asset.Asset -import com.wavesplatform.dex.settings.{AssetType, OrderFeeSettings} import io.swagger.annotations.{ApiModel, ApiModelProperty} import play.api.libs.json._ @@ -59,7 +58,7 @@ object HttpOrderFeeMode { dataType = "string", allowableValues = "amount, price, spending, receiving", example = "price" - ) `type`: AssetType, + ) `type`: HttpAssetType, @ApiModelProperty( value = "Min fee in percents", dataType = "number", @@ -86,10 +85,4 @@ object HttpOrderFeeMode { private def toJson[T](key: String, x: T)(implicit w: Writes[T]): JsObject = Json.obj(key -> w.writes(x)) - def fromSettings(settings: OrderFeeSettings, matcherAccountFee: Long, allRates: Map[Asset, Double]): HttpOrderFeeMode = settings match { - case x: OrderFeeSettings.DynamicSettings => FeeModeDynamic(x.maxBaseFee + matcherAccountFee, allRates) - case OrderFeeSettings.FixedSettings(assetId, minFee) => FeeModeFixed(assetId, minFee) - case OrderFeeSettings.PercentSettings(assetType, minFee) => FeeModePercent(assetType, minFee) - } - } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderRestrictions.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderRestrictions.scala similarity index 61% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderRestrictions.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderRestrictions.scala index a634fb6469..854767ca26 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderRestrictions.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderRestrictions.scala @@ -1,7 +1,6 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.json -import com.wavesplatform.dex.settings.OrderRestrictionsSettings +import com.wavesplatform.dex.utils.JsonImplicits import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Format, Json, OFormat} @@ -16,17 +15,7 @@ case class HttpOrderRestrictions( object HttpOrderRestrictions { - implicit val doubleFormat: Format[Double] = json.stringAsDoubleFormat + implicit val doubleFormat: Format[Double] = JsonImplicits.stringAsDoubleFormat implicit val httpOrderRestrictionsFormat: OFormat[HttpOrderRestrictions] = Json.format[HttpOrderRestrictions] - def fromSettings(settings: OrderRestrictionsSettings): HttpOrderRestrictions = - HttpOrderRestrictions( - stepAmount = settings.stepAmount, - minAmount = settings.minAmount, - maxAmount = settings.maxAmount, - stepPrice = settings.stepPrice, - minPrice = settings.minPrice, - maxPrice = settings.maxPrice - ) - } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderStatus.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderStatus.scala similarity index 70% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderStatus.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderStatus.scala index fa861191c4..e882b16df5 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderStatus.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpOrderStatus.scala @@ -1,9 +1,7 @@ package com.wavesplatform.dex.api.http.entities -import cats.syntax.option._ import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.meta.getSimpleName -import com.wavesplatform.dex.model.OrderStatus import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Format, Json, Reads, Writes} @@ -30,14 +28,6 @@ object HttpOrderStatus { implicit val httpOrderStatusFormat: Format[HttpOrderStatus] = Json.format - def from(x: OrderStatus): HttpOrderStatus = x match { - case OrderStatus.Accepted => HttpOrderStatus(Status.Accepted) - case OrderStatus.NotFound => HttpOrderStatus(Status.NotFound, message = Some("The limit order is not found")) - case OrderStatus.PartiallyFilled(filledAmount, filledFee) => HttpOrderStatus(Status.PartiallyFilled, filledAmount.some, filledFee.some) - case OrderStatus.Filled(filledAmount, filledFee) => HttpOrderStatus(Status.Filled, filledAmount.some, filledFee.some) - case OrderStatus.Cancelled(filledAmount, filledFee) => HttpOrderStatus(Status.Cancelled, filledAmount.some, filledFee.some) - } - sealed abstract class Status extends Product with Serializable { val name: String = getSimpleName(this) } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancel.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancel.scala similarity index 91% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancel.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancel.scala index 6ace5b7b6d..5b33bbc038 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancel.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancel.scala @@ -1,5 +1,6 @@ package com.wavesplatform.dex.api.http.entities +import com.wavesplatform.dex.utils.JsonImplicits import io.swagger.annotations.{ApiModel, ApiModelProperty} import play.api.libs.json.{Format, Json} @@ -24,7 +25,7 @@ object HttpSuccessfulBatchCancel { implicit val httpSuccessfulBatchCancelFormat: Format[HttpSuccessfulBatchCancel] = { implicit val ef: Format[Either[HttpError, HttpSuccessfulSingleCancel]] = - com.wavesplatform.dex.json.eitherFormat[HttpError, HttpSuccessfulSingleCancel] + JsonImplicits.eitherFormat[HttpError, HttpSuccessfulSingleCancel] Json.format } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulCancel.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulCancel.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulCancel.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulCancel.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulDeleteHistory.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulDeleteHistory.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulDeleteHistory.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulDeleteHistory.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulPlace.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulPlace.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulPlace.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulPlace.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulSingleCancel.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulSingleCancel.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulSingleCancel.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulSingleCancel.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatus.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatus.scala similarity index 52% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatus.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatus.scala index fe96fe7e4d..d8e2db07ba 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatus.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatus.scala @@ -1,19 +1,18 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.app.MatcherStatus -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream +import com.wavesplatform.dex.statuses.{CombinedStreamStatus, MatcherStatus} import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Format, Json} case class HttpSystemStatus( @ApiModelProperty() service: MatcherStatus, - @ApiModelProperty() blockchain: CombinedStream.Status + @ApiModelProperty() blockchain: CombinedStreamStatus ) object HttpSystemStatus { implicit val HttpSystemStatusFormat: Format[HttpSystemStatus] = Json.format - def apply(service: MatcherStatus, blockchain: CombinedStream.Status) = new HttpSystemStatus(service, blockchain) + def apply(service: MatcherStatus, blockchain: CombinedStreamStatus) = new HttpSystemStatus(service, blockchain) } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpTradingMarkets.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpTradingMarkets.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpTradingMarkets.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpTradingMarkets.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0LevelAgg.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0LevelAgg.scala similarity index 73% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0LevelAgg.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0LevelAgg.scala index bcd8662aea..33939e5832 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0LevelAgg.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0LevelAgg.scala @@ -1,6 +1,5 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.model.LevelAgg import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Json, Reads} @@ -8,5 +7,5 @@ case class HttpV0LevelAgg(@ApiModelProperty(example = "83187648950") amount: Lon object HttpV0LevelAgg { implicit val httpV0LevelAggReads: Reads[HttpV0LevelAgg] = Json.reads - def fromLevelAgg(la: LevelAgg): HttpV0LevelAgg = HttpV0LevelAgg(la.amount, la.price) + } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBook.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBook.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBook.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBook.scala index c433f46399..b362394e5d 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBook.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBook.scala @@ -1,12 +1,12 @@ package com.wavesplatform.dex.api.http.entities -import java.nio.charset.StandardCharsets - import akka.http.scaladsl.model.{HttpEntity, HttpResponse} import com.wavesplatform.dex.domain.asset.AssetPair import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Json, Reads} +import java.nio.charset.StandardCharsets + case class HttpV0OrderBook( @ApiModelProperty(value = "Timestamp of the last Order Book update") timestamp: Long, @ApiModelProperty(value = "Corresponding Asset Pair") pair: AssetPair, diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1LevelAgg.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1LevelAgg.scala new file mode 100644 index 0000000000..cc58ca3a77 --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1LevelAgg.scala @@ -0,0 +1,27 @@ +package com.wavesplatform.dex.api.http.entities + +import com.wavesplatform.dex.utils.JsonImplicits +import io.swagger.annotations.ApiModelProperty +import play.api.libs.json.{Format, JsArray, _} + +case class HttpV1LevelAgg( + @ApiModelProperty( + dataType = "string", + example = "831.87648950" + ) amount: Double, + @ApiModelProperty( + dataType = "string", + example = "0.00012079" + ) price: Double +) + +object HttpV1LevelAgg { + + implicit val doubleFormat: Format[Double] = JsonImplicits.stringAsDoubleFormat + + implicit val httpV1LevelAggReads: Reads[HttpV1LevelAgg] = Reads { + case JsArray(value) if value.lengthCompare(2) == 0 => JsSuccess(HttpV1LevelAgg(value(1).as[Double], value(0).as[Double])) + case x => JsError(s"Cannot parse $x as ApiV1LevelAgg") + } + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBook.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBook.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBook.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBook.scala index 6442374395..41853db86f 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBook.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBook.scala @@ -1,11 +1,11 @@ package com.wavesplatform.dex.api.http.entities -import java.nio.charset.StandardCharsets - import akka.http.scaladsl.model.{HttpEntity, HttpResponse} import io.swagger.annotations.ApiModelProperty import play.api.libs.json.{Json, Reads} +import java.nio.charset.StandardCharsets + case class HttpV1OrderBook( @ApiModelProperty(value = "Timestamp of the last Order Book update") timestamp: Long, @ApiModelProperty( diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpWebSocketCloseFilter.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpWebSocketCloseFilter.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpWebSocketCloseFilter.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpWebSocketCloseFilter.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpWebSocketConnections.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpWebSocketConnections.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpWebSocketConnections.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpWebSocketConnections.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/MatcherResponse.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/MatcherResponse.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/MatcherResponse.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/MatcherResponse.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/entities.scala similarity index 81% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/entities.scala index f1c68aa6fe..13748051e0 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/package.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/entities.scala @@ -2,15 +2,14 @@ package com.wavesplatform.dex.api.http import com.wavesplatform.dex.domain.account.PublicKey import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} -import com.wavesplatform.dex.json.{assetDoubleMapFormat, assetMapFormat, assetPairMapFormat} -import com.wavesplatform.dex.queue.ValidatedCommandWithMeta +import com.wavesplatform.dex.utils.JsonImplicits.{assetDoubleMapFormat, assetMapFormat, assetPairMapFormat} import play.api.libs.json.{Format, JsValue, Writes} package object entities { type HttpMatcherPublicKey = PublicKey type HttpRates = Map[Asset, Double] - type HttpOffset = ValidatedCommandWithMeta.Offset + type HttpOffset = Long // as ValidatedCommandWithMeta.Offset type HttpSnapshotOffsets = Map[AssetPair, HttpOffset] type HttpBalance = Map[Asset, Long] diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/protocol/HttpCancelOrder.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/protocol/HttpCancelOrder.scala similarity index 97% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/protocol/HttpCancelOrder.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/protocol/HttpCancelOrder.scala index fdb49b4da7..e824e81790 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/protocol/HttpCancelOrder.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/http/entities/protocol/HttpCancelOrder.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.api.http.protocol +package com.wavesplatform.dex.api.http.entities.protocol import com.google.common.primitives.Longs import com.wavesplatform.dex.domain.account.PublicKey diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/connection/TestWsHandlerActor.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/connection/TestWsHandlerActor.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/connection/TestWsHandlerActor.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/connection/TestWsHandlerActor.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnection.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnection.scala similarity index 99% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnection.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnection.scala index 75a74936ca..c7d5d00b58 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnection.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnection.scala @@ -1,7 +1,6 @@ package com.wavesplatform.dex.api.ws.connection import java.util.concurrent.{ConcurrentLinkedQueue, ThreadLocalRandom} - import akka.Done import akka.actor.{ActorRef, ActorSystem, Status} import akka.http.scaladsl.Http diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnectionOps.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnectionOps.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnectionOps.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/connection/WsConnectionOps.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsAddressFlag.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsAddressFlag.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsAddressFlag.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsAddressFlag.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsAssetInfo.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsAssetInfo.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsAssetInfo.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsAssetInfo.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsBalances.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsBalances.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsBalances.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsBalances.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsFullOrder.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsFullOrder.scala similarity index 55% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsFullOrder.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsFullOrder.scala index df284bbf7a..1e28fe5d74 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsFullOrder.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsFullOrder.scala @@ -4,14 +4,10 @@ import cats.instances.option._ import cats.syntax.apply._ import cats.syntax.option._ import com.wavesplatform.dex.api.ws.doubleAsStringFormat -import com.wavesplatform.dex.api.ws.entities.WsFullOrder.WsExecutionInfo +import WsFullOrder.WsExecutionInfo import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.Asset -import com.wavesplatform.dex.domain.model.Denormalization -import com.wavesplatform.dex.domain.order.{Order, OrderType} -import com.wavesplatform.dex.error.ErrorFormatterContext -import com.wavesplatform.dex.model.Events.{OrderCanceled, OrderExecuted} -import com.wavesplatform.dex.model.{AcceptedOrder, OrderStatus} +import com.wavesplatform.dex.domain.order.{Order, OrderStatusNames, OrderType} import play.api.libs.functional.syntax._ import play.api.libs.json._ @@ -125,76 +121,7 @@ object WsFullOrder { ).some } - case class WsExecutionInfo(amount: Double, fee: Double, price: Double, totalPriceAssets: Double) - - def from(event: OrderCanceled)(implicit efc: ErrorFormatterContext): WsFullOrder = { - val ao = event.acceptedOrder - - val amountAssetDecimals = efc.unsafeAssetDecimals(ao.order.assetPair.amountAsset) - val feeAssetDecimals = efc.unsafeAssetDecimals(ao.order.feeAsset) - val priceAssetDecimals = efc.unsafeAssetDecimals(ao.order.assetPair.priceAsset) - - def denormalizeAmount(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, amountAssetDecimals).toDouble - def denormalizePrice(value: Long): Double = Denormalization.denormalizePrice(value, amountAssetDecimals, priceAssetDecimals).toDouble - def denormalizeFee(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, feeAssetDecimals).toDouble - - val fillingInfo = ao.fillingInfo - WsFullOrder( - id = ao.id, - owner = ao.order.sender.toAddress, - timestamp = ao.order.timestamp, - amountAsset = ao.order.assetPair.amountAsset, - priceAsset = ao.order.assetPair.priceAsset, - side = ao.order.orderType, - isMarket = ao.isMarket, - price = denormalizePrice(ao.order.price), - amount = denormalizeAmount(ao.order.amount), - fee = denormalizeFee(ao.order.matcherFee), - feeAsset = ao.order.feeAsset, - status = OrderStatus.Cancelled.name, - filledAmount = denormalizeAmount(fillingInfo.filledAmount), - filledFee = denormalizeFee(fillingInfo.filledFee), - avgWeighedPrice = denormalizePrice(fillingInfo.avgWeighedPrice), - eventTimestamp = event.timestamp, - executionInfo = none - ) - } - - def from( - ao: AcceptedOrder, - event: OrderExecuted, - denormalizeAmount: Long => Double, - denormalizePrice: Long => Double, - denormalizeFee: Long => Double - )(implicit efc: ErrorFormatterContext): WsFullOrder = { - val fillingInfo = ao.fillingInfo - val executedFee = if (ao.id == event.counter.order.id()) event.counterExecutedFee else event.submittedExecutedFee - - WsFullOrder( - id = ao.id, - owner = ao.order.sender.toAddress, - timestamp = ao.order.timestamp, - amountAsset = ao.order.assetPair.amountAsset, - priceAsset = ao.order.assetPair.priceAsset, - side = ao.order.orderType, - isMarket = ao.isMarket, - price = denormalizePrice(ao.order.price), - amount = denormalizeAmount(ao.order.amount), - fee = denormalizeFee(ao.order.matcherFee), - feeAsset = ao.order.feeAsset, - status = ao.status.name, - filledAmount = denormalizeAmount(fillingInfo.filledAmount), - filledFee = denormalizeFee(fillingInfo.filledFee), - avgWeighedPrice = denormalizePrice(fillingInfo.avgWeighedPrice), - eventTimestamp = event.timestamp, - executionInfo = WsExecutionInfo( - amount = denormalizeAmount(event.executedAmount), - fee = denormalizeFee(executedFee), - price = denormalizePrice(event.executedPrice), - totalPriceAssets = denormalizePrice(ao.fillingInfo.totalExecutedPriceAssets) - ).some - ) - } + final case class WsExecutionInfo(amount: Double, fee: Double, price: Double, totalPriceAssets: Double) private val isMarketFormat: Format[Boolean] = Format( { @@ -212,15 +139,15 @@ object WsFullOrder { private val orderStatusFormat: Format[String] = Format( { - case JsString(s) if s == Status.Filled.toString => JsSuccess(OrderStatus.Filled.name) - case JsString(s) if s == Status.PartiallyFilled.toString => JsSuccess(OrderStatus.PartiallyFilled.name) - case JsString(s) if s == Status.Cancelled.toString => JsSuccess(OrderStatus.Cancelled.name) + case JsString(s) if s == Status.Filled.toString => JsSuccess(OrderStatusNames.FILLED) + case JsString(s) if s == Status.PartiallyFilled.toString => JsSuccess(OrderStatusNames.PARTIALLY_FILLED) + case JsString(s) if s == Status.Cancelled.toString => JsSuccess(OrderStatusNames.CANCELLED) case _ => JsError("Cannot parse order status") }, { - case OrderStatus.Filled.name => JsString(Status.Filled.toString) - case OrderStatus.PartiallyFilled.name => JsString(Status.PartiallyFilled.toString) - case OrderStatus.Cancelled.name => JsString(Status.Cancelled.toString) + case OrderStatusNames.FILLED => JsString(Status.Filled.toString) + case OrderStatusNames.PARTIALLY_FILLED => JsString(Status.PartiallyFilled.toString) + case OrderStatusNames.CANCELLED => JsString(Status.Cancelled.toString) case _ => throw new IllegalArgumentException("Cannot parse order status") } ) diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsLastTrade.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsLastTrade.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsLastTrade.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsLastTrade.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsMatchTransactionInfo.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsMatchTransactionInfo.scala similarity index 50% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsMatchTransactionInfo.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsMatchTransactionInfo.scala index 84dd493cc1..855ec20d8e 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsMatchTransactionInfo.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsMatchTransactionInfo.scala @@ -1,11 +1,7 @@ package com.wavesplatform.dex.api.ws.entities import com.wavesplatform.dex.api.ws._ -import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.bytes.ByteStr -import com.wavesplatform.dex.domain.model.Denormalization.{denormalizeAmountAndFee, denormalizePrice} -import com.wavesplatform.dex.error.ErrorFormatterContext -import com.wavesplatform.dex.model.AcceptedOrder import play.api.libs.functional.syntax._ import play.api.libs.json._ @@ -19,22 +15,6 @@ final case class WsMatchTransactionInfo( object WsMatchTransactionInfo { - def normalized(assetPair: AssetPair, txId: ByteStr, timestamp: Long, price: Long, executedAmountAssets: Long)(implicit - efc: ErrorFormatterContext - ): WsMatchTransactionInfo = { - - val ad = efc.unsafeAssetDecimals(assetPair.amountAsset) - val pd = efc.unsafeAssetDecimals(assetPair.priceAsset) - - WsMatchTransactionInfo( - txId, - timestamp, - price = denormalizePrice(price, ad, pd).toDouble, - executedAmountAssets = denormalizeAmountAndFee(executedAmountAssets, ad).toDouble, - executedPriceAssets = denormalizeAmountAndFee(AcceptedOrder.calcAmountOfPriceAsset(executedAmountAssets, price), pd).toDouble - ) - } - implicit val wsMatchTransactionFormat: Format[WsMatchTransactionInfo] = ( (__ \ "i").format[ByteStr] and // id diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrder.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrder.scala similarity index 72% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrder.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrder.scala index 689ed68406..1f89901afd 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrder.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrder.scala @@ -1,14 +1,10 @@ package com.wavesplatform.dex.api.ws.entities -import cats.syntax.option._ import com.wavesplatform.dex.api.ws.doubleAsStringFormat import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.asset.Asset.Waves -import com.wavesplatform.dex.domain.model.Denormalization -import com.wavesplatform.dex.domain.order.{Order, OrderType} -import com.wavesplatform.dex.error.ErrorFormatterContext -import com.wavesplatform.dex.json._ -import com.wavesplatform.dex.model.{AcceptedOrder, AcceptedOrderType, OrderStatus} +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order, OrderType} +import com.wavesplatform.dex.utils.JsonImplicits._ import play.api.libs.functional.syntax._ import play.api.libs.json._ @@ -33,37 +29,6 @@ case class WsOrder( object WsOrder { - def fromDomain(ao: AcceptedOrder)(implicit efc: ErrorFormatterContext): WsOrder = fromDomain(ao, ao.status) - - def fromDomain(ao: AcceptedOrder, status: OrderStatus)(implicit efc: ErrorFormatterContext): WsOrder = { - - val amountAssetDecimals = efc.unsafeAssetDecimals(ao.order.assetPair.amountAsset) - val feeAssetDecimals = efc.unsafeAssetDecimals(ao.order.feeAsset) - val priceAssetDecimals = efc.unsafeAssetDecimals(ao.order.assetPair.priceAsset) - - def denormalizeAmount(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, amountAssetDecimals).toDouble - def denormalizeFee(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, feeAssetDecimals).toDouble - def denormalizePrice(value: Long): Double = Denormalization.denormalizePrice(value, amountAssetDecimals, priceAssetDecimals).toDouble - - WsOrder( - ao.id, - ao.order.assetPair.amountAsset, - ao.order.assetPair.priceAsset, - ao.feeAsset, - ao.order.orderType, - ao.order.timestamp.some, - ao.isMarket.some, - ao.price.some.map(denormalizePrice), - ao.order.amount.some.map(denormalizeAmount), - ao.order.matcherFee.some.map(denormalizeFee), - status.name.some, - ao.fillingInfo.filledAmount.some.map(denormalizeAmount), - ao.fillingInfo.filledFee.some.map(denormalizeFee), - ao.fillingInfo.avgWeighedPrice.some.map(denormalizePrice), - ao.fillingInfo.totalExecutedPriceAssets.some.map(denormalizePrice) - ) - } - def apply( id: Order.Id, amountAsset: Asset, diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookRestrictions.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookRestrictions.scala new file mode 100644 index 0000000000..7a37e7111b --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookRestrictions.scala @@ -0,0 +1,10 @@ +package com.wavesplatform.dex.api.ws.entities + +final case class WsOrderBookRestrictions( + stepAmount: Double = 0.00000001, + minAmount: Double = 0.00000001, + maxAmount: Double = 1000000000, + stepPrice: Double = 0.00000001, + minPrice: Double = 0.00000001, + maxPrice: Double = 1000000 +) diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookSettings.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookSettings.scala similarity index 69% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookSettings.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookSettings.scala index b5346fe598..5596eb07c1 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookSettings.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsOrderBookSettings.scala @@ -1,11 +1,10 @@ package com.wavesplatform.dex.api.ws.entities import com.wavesplatform.dex.api.ws.doubleAsStringFormat -import com.wavesplatform.dex.settings.OrderRestrictionsSettings import play.api.libs.functional.syntax._ import play.api.libs.json._ -case class WsOrderBookSettings(restrictions: Option[OrderRestrictionsSettings], tickSize: Option[Double]) +case class WsOrderBookSettings(restrictions: Option[WsOrderBookRestrictions], tickSize: Option[Double]) object WsOrderBookSettings { @@ -14,15 +13,15 @@ object WsOrderBookSettings { implicit private val doubleFormat: Format[Double] = doubleAsStringFormat - implicit val orderRestrictionsSettingsFormat: Format[OrderRestrictionsSettings] = Format( + implicit val orderRestrictionsSettingsFormat: Format[WsOrderBookRestrictions] = Format( fjs = Reads { case JsObject(restrictions) if restrictions.keySet == Set(amountField, priceField) => def getRestrictions(restricted: String): (Double, Double, Double) = Reads.Tuple3R[Double, Double, Double].reads(restrictions(restricted)).get val (minAmount, stepAmount, maxAmount) = getRestrictions(amountField) val (minPrice, stepPrice, maxPrice) = getRestrictions(priceField) - JsSuccess(OrderRestrictionsSettings(stepAmount, minAmount, maxAmount, stepPrice, minPrice, maxPrice)) - case x => JsError(JsPath, s"Cannot parse OrderRestrictionsSettings from ${x.getClass.getName}") + JsSuccess(WsOrderBookRestrictions(stepAmount, minAmount, maxAmount, stepPrice, minPrice, maxPrice)) + case x => JsError(JsPath, s"Cannot parse WsOrderBookRestrictions from ${x.getClass.getName}") }, tjs = Writes { ors => Json.obj( @@ -33,7 +32,7 @@ object WsOrderBookSettings { ) implicit val wsOrderBookSettingsFormat: Format[WsOrderBookSettings] = ( - (__ \ "r").formatNullable[OrderRestrictionsSettings] and + (__ \ "r").formatNullable[WsOrderBookRestrictions] and (__ \ "m" \ "t").formatNullable[Double] )( (restrictions, tickSize) => WsOrderBookSettings(restrictions, tickSize), diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsTxsData.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsTxsData.scala similarity index 94% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsTxsData.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsTxsData.scala index 6c9c8f2bd6..5e5898ae85 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsTxsData.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/entities/WsTxsData.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.api.ws.entities import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.domain.transaction.ExchangeTransaction -import com.wavesplatform.dex.json._ +import com.wavesplatform.dex.utils.JsonImplicits._ import play.api.libs.functional.syntax._ import play.api.libs.json._ diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/headers/`X-Error-Code`.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/headers/`X-Error-Code`.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/headers/`X-Error-Code`.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/headers/`X-Error-Code`.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/headers/`X-Error-Message`.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/headers/`X-Error-Message`.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/headers/`X-Error-Message`.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/headers/`X-Error-Message`.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressChanges.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressChanges.scala similarity index 96% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressChanges.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressChanges.scala index fe2225e34b..2824e47f81 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressChanges.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressChanges.scala @@ -4,7 +4,7 @@ import cats.syntax.option._ import com.wavesplatform.dex.api.ws.entities.{WsBalances, WsOrder, WsTxsData} import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.Asset -import com.wavesplatform.dex.json +import com.wavesplatform.dex.utils.JsonImplicits._ import play.api.libs.functional.syntax._ import play.api.libs.json._ @@ -40,7 +40,7 @@ object WsAddressChanges { Option(arg.isDebug).filter(_ == true) ).some - implicit val balancesMapFormat: Format[Map[Asset, WsBalances]] = json.assetMapFormat[WsBalances] + implicit val balancesMapFormat: Format[Map[Asset, WsBalances]] = assetMapFormat[WsBalances] implicit val wsAddressChangesFormat: OFormat[WsAddressChanges] = ( (__ \ "T").format[String] and diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressSubscribe.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressSubscribe.scala similarity index 98% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressSubscribe.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressSubscribe.scala index 004b27072f..8a5bcb66fa 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressSubscribe.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsAddressSubscribe.scala @@ -4,7 +4,7 @@ import java.nio.charset.StandardCharsets import cats.syntax.either._ import cats.syntax.option._ import com.wavesplatform.dex.api.ws.entities.WsAddressFlag -import com.wavesplatform.dex.api.ws.protocol.WsAddressSubscribe._ +import com.wavesplatform.dex.api.ws.protocol.WsAddressSubscribe.{leewayInSeconds, supportedAuthTypes, toMatcherError, JwtPayload} import com.wavesplatform.dex.domain.account.{Address, PrivateKey, PublicKey} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.crypto diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsClientMessage.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsClientMessage.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsClientMessage.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsClientMessage.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsError.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsError.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsError.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsError.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsInitial.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsInitial.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsInitial.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsInitial.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsMessage.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsMessage.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsMessage.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsMessage.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookChanges.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookChanges.scala similarity index 88% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookChanges.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookChanges.scala index b826ff5545..a388784635 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookChanges.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookChanges.scala @@ -2,14 +2,13 @@ package com.wavesplatform.dex.api.ws.protocol import cats.syntax.option._ import com.wavesplatform.dex.api.ws._ -import com.wavesplatform.dex.api.ws.entities.{WsLastTrade, WsOrderBookSettings} +import com.wavesplatform.dex.api.ws.entities.{WsLastTrade, WsOrderBookRestrictions, WsOrderBookSettings} import com.wavesplatform.dex.api.ws.protocol.WsOrderBookChanges.WsSide import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.model.Denormalization._ +import com.wavesplatform.dex.domain.order.OrderType import com.wavesplatform.dex.fp.MayBeEmpty -import com.wavesplatform.dex.json.Implicits.JsPathOps -import com.wavesplatform.dex.model.{LastTrade, LevelAgg} -import com.wavesplatform.dex.settings.OrderRestrictionsSettings +import com.wavesplatform.dex.utils.JsonImplicits._ import play.api.libs.functional.syntax._ import play.api.libs.json._ @@ -29,6 +28,9 @@ case class WsOrderBookChanges( object WsOrderBookChanges { + final case class LTrade(price: Long, amount: Long, side: OrderType) + final case class LevelAggregation(price: Long, amount: Long, side: OrderType) + val tpe = "ob" def wsUnapply(arg: WsOrderBookChanges): Option[(String, AssetPair, Long, Long, WsSide, WsSide, Option[WsLastTrade], Option[WsOrderBookSettings])] = @@ -99,11 +101,11 @@ object WsOrderBookChanges { assetPair: AssetPair, amountDecimals: Int, priceDecimals: Int, - asks: Iterable[LevelAgg], - bids: Iterable[LevelAgg], - lt: Option[LastTrade], + asks: Iterable[LevelAggregation], + bids: Iterable[LevelAggregation], + lt: Option[LTrade], updateId: Long, - restrictions: Option[OrderRestrictionsSettings], + restrictions: Option[WsOrderBookRestrictions], tickSize: Double ): WsOrderBookChanges = WsOrderBookChanges( @@ -115,13 +117,13 @@ object WsOrderBookChanges { settings = WsOrderBookSettings(restrictions, tickSize.some).some ) - def lastTrade(amountDecimals: Int, priceDecimals: Int, x: LastTrade): WsLastTrade = WsLastTrade( + def lastTrade(amountDecimals: Int, priceDecimals: Int, x: LTrade): WsLastTrade = WsLastTrade( price = denormalizePrice(x.price, amountDecimals, priceDecimals).toDouble, amount = denormalizeAmountAndFee(x.amount, amountDecimals).toDouble, side = x.side ) - def side(amountDecimals: Int, priceDecimals: Int, xs: Iterable[LevelAgg], ordering: Ordering[Double]): WsSide = + def side(amountDecimals: Int, priceDecimals: Int, xs: Iterable[LevelAggregation], ordering: Ordering[Double]): WsSide = TreeMap( xs.map { x => denormalizePrice(x.price, amountDecimals, priceDecimals).toDouble -> diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookSubscribe.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookSubscribe.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookSubscribe.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrderBookSubscribe.scala diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrdersUpdate.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrdersUpdate.scala new file mode 100644 index 0000000000..b6f27916e4 --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrdersUpdate.scala @@ -0,0 +1,41 @@ +package com.wavesplatform.dex.api.ws.protocol + +import cats.data.NonEmptyList +import cats.syntax.option._ +import com.wavesplatform.dex.api.ws.entities.WsFullOrder +import play.api.libs.functional.syntax._ +import play.api.libs.json._ + +case class WsOrdersUpdate(orders: NonEmptyList[WsFullOrder], timestamp: Long = System.currentTimeMillis) extends WsServerMessage { + override val tpe: String = WsOrdersUpdate.tpe + + def append(other: WsOrdersUpdate): WsOrdersUpdate = copy( + orders = other.orders ::: orders, + timestamp = other.timestamp + ) + +} + +object WsOrdersUpdate { + + val tpe = "osu" + + def wsUnapply(arg: WsOrdersUpdate): Option[(String, Long, NonEmptyList[WsFullOrder])] = (arg.tpe, arg.timestamp, arg.orders).some + + implicit def nonEmptyListFormat[T: Format]: Format[NonEmptyList[T]] = Format( + Reads.list[T].flatMap { xs => + NonEmptyList.fromList(xs).fold[Reads[NonEmptyList[T]]](Reads.failed("The list is empty"))(Reads.pure(_)) + }, + Writes.list[T].contramap(_.toList) + ) + + implicit val wsOrdersUpdateFormat: Format[WsOrdersUpdate] = ( + (__ \ "T").format[String] and + (__ \ "_").format[Long] and + (__ \ "o").format(nonEmptyListFormat[WsFullOrder]) + )( + (_, ts, orders) => WsOrdersUpdate(orders, ts), + unlift(WsOrdersUpdate.wsUnapply) + ) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsPingOrPong.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsPingOrPong.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsPingOrPong.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsPingOrPong.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdates.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdates.scala similarity index 88% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdates.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdates.scala index 8cabed526f..785d390df2 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdates.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdates.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.api.ws.protocol import cats.syntax.option._ import com.wavesplatform.dex.domain.asset.Asset -import com.wavesplatform.dex.json +import com.wavesplatform.dex.utils.JsonImplicits._ import play.api.libs.functional.syntax._ import play.api.libs.json._ @@ -20,7 +20,7 @@ object WsRatesUpdates { (__ \ "T").format[String] and (__ \ "_").format[Long] and (__ \ "U").format[Long] and - (__ \ "R").format[Map[Asset, Double]](json.assetMapFormat(json.stringAsDoubleFormat)) + (__ \ "R").format[Map[Asset, Double]](assetMapFormat(stringAsDoubleFormat)) )( (_, timestamp, updateId, rates) => WsRatesUpdates(rates, updateId, timestamp), unlift(WsRatesUpdates.wsUnapply) diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdatesSubscribe.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdatesSubscribe.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdatesSubscribe.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsRatesUpdatesSubscribe.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsServerMessage.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsServerMessage.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsServerMessage.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsServerMessage.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsUnsubscribe.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsUnsubscribe.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsUnsubscribe.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsUnsubscribe.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/api/ws/ws.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/api/ws/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/api/ws/ws.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/auth/JwtUtils.scala b/dex-common/src/main/scala/com/wavesplatform/dex/auth/JwtUtils.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/auth/JwtUtils.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/auth/JwtUtils.scala index 1e58c3a62e..c38a188530 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/auth/JwtUtils.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/auth/JwtUtils.scala @@ -1,8 +1,8 @@ package com.wavesplatform.dex.auth -import java.security - import com.wavesplatform.dex.api.ws.protocol.WsAddressSubscribe.JwtPayload + +import java.security import com.wavesplatform.dex.domain.account.{AddressScheme, KeyPair, PublicKey} import com.wavesplatform.dex.domain.bytes.ByteStr import pdi.jwt.{JwtAlgorithm, JwtJson} diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/collections/FifoSet.scala b/dex-common/src/main/scala/com/wavesplatform/dex/collections/FifoSet.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/collections/FifoSet.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/collections/FifoSet.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/collections/Implicits.scala b/dex-common/src/main/scala/com/wavesplatform/dex/collections/Implicits.scala similarity index 80% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/collections/Implicits.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/collections/Implicits.scala index e9e142703f..731317957d 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/collections/Implicits.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/collections/Implicits.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.it.collections +package com.wavesplatform.dex.collections object Implicits { diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/collections/ListOps.scala b/dex-common/src/main/scala/com/wavesplatform/dex/collections/ListOps.scala similarity index 98% rename from waves-integration/src/main/scala/com/wavesplatform/dex/collections/ListOps.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/collections/ListOps.scala index 837e3506c7..0e3c20a095 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/collections/ListOps.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/collections/ListOps.scala @@ -2,7 +2,6 @@ package com.wavesplatform.dex.collections import scala.annotation.tailrec -// TODO DEX-994, tests object ListOps { implicit final class Ops[T](val self: List[T]) extends AnyVal { diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/collections/MapOps.scala b/dex-common/src/main/scala/com/wavesplatform/dex/collections/MapOps.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/collections/MapOps.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/collections/MapOps.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/collections/VectorOps.scala b/dex-common/src/main/scala/com/wavesplatform/dex/collections/VectorOps.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/collections/VectorOps.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/collections/VectorOps.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/Address.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/account/Address.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/Address.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/account/Address.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/AddressOrAlias.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/account/AddressOrAlias.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/AddressOrAlias.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/account/AddressOrAlias.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/AddressScheme.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/account/AddressScheme.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/AddressScheme.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/account/AddressScheme.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/Alias.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/account/Alias.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/Alias.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/account/Alias.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/KeyPair.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/account/KeyPair.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/KeyPair.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/account/KeyPair.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/PrivateKey.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/account/PrivateKey.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/PrivateKey.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/account/PrivateKey.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/PublicKey.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/account/PublicKey.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/PublicKey.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/account/PublicKey.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/account/package.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/account/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/account/package.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/asset/Asset.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/asset/Asset.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/asset/Asset.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/asset/Asset.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/asset/AssetPair.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/asset/AssetPair.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/asset/AssetPair.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/asset/AssetPair.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/ByteStr.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/ByteStr.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/ByteStr.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/ByteStr.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/Base58.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/Base58.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/Base58.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/Base58.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/Base64.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/Base64.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/Base64.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/Base64.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/BaseXXEncDec.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/BaseXXEncDec.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/BaseXXEncDec.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/BaseXXEncDec.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/FastBase58.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/FastBase58.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/FastBase58.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/FastBase58.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/StdBase58.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/StdBase58.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/StdBase58.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/codec/StdBase58.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/deser/EntityParser.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/deser/EntityParser.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/deser/EntityParser.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/deser/EntityParser.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/deser/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/deser/package.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/bytes/deser/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/bytes/deser/package.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/Authorized.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/Authorized.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/Authorized.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/Authorized.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/Proofs.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/Proofs.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/Proofs.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/Proofs.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/Proven.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/Proven.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/Proven.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/Proven.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/Verifier.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/Verifier.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/Verifier.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/Verifier.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/package.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/crypto/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/crypto/package.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/error/ValidationError.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/error/ValidationError.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/error/ValidationError.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/error/ValidationError.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/feature/BlockhainFeature.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/feature/BlockhainFeature.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/feature/BlockhainFeature.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/feature/BlockhainFeature.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/model/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/model/package.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/model/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/model/package.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/model/AcceptedOrderType.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/AcceptedOrderType.scala similarity index 94% rename from dex/src/main/scala/com/wavesplatform/dex/model/AcceptedOrderType.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/order/AcceptedOrderType.scala index 2454b4d18c..1bb12019a8 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/model/AcceptedOrderType.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/AcceptedOrderType.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.model +package com.wavesplatform.dex.domain.order import play.api.libs.json._ diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/Order.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/Order.scala similarity index 99% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/Order.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/order/Order.scala index 2a0d56c655..e959833258 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/Order.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/Order.scala @@ -306,4 +306,6 @@ object Order extends EntityParser[Order] { ep.statefulParse.widen[(Order, ConsumedBytesOffset)] } + val orderIdOrdering: Ordering[(Order.Id, Long)] = Ordering.by { case (id, ts) => (-ts, id) } + } diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderJson.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderJson.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderJson.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderJson.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderOps.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderOps.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderOps.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderOps.scala diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderStatusNames.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderStatusNames.scala new file mode 100644 index 0000000000..10c8e52cc1 --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderStatusNames.scala @@ -0,0 +1,11 @@ +package com.wavesplatform.dex.domain.order + +object OrderStatusNames { + + val ACCEPTED = "Accepted" + val PARTIALLY_FILLED = "PartiallyFilled" + val FILLED = "Filled" + val CANCELLED = "Cancelled" + val NOT_FOUND = "NotFound" + +} diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderType.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderType.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderType.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderType.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderV1.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderV1.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderV1.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderV1.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderV2.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderV2.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderV2.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderV2.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderV3.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderV3.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/order/OrderV3.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/order/OrderV3.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/serialization/ByteAndJsonSerializable.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/serialization/ByteAndJsonSerializable.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/serialization/ByteAndJsonSerializable.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/serialization/ByteAndJsonSerializable.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/state/LeaseBalance.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/state/LeaseBalance.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/state/LeaseBalance.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/state/LeaseBalance.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/state/Portfolio.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/state/Portfolio.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/state/Portfolio.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/state/Portfolio.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/state/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/state/package.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/state/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/state/package.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransaction.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransaction.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransaction.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransaction.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionParser.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionParser.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionParser.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionParser.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionResult.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionResult.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionResult.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionResult.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionV1.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionV1.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionV1.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionV1.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionV2.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionV2.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionV2.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/transaction/ExchangeTransactionV2.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/utils/ScorexLogging.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/utils/ScorexLogging.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/utils/ScorexLogging.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/utils/ScorexLogging.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/utils/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/utils/package.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/utils/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/utils/package.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/domain/validation/Validation.scala b/dex-common/src/main/scala/com/wavesplatform/dex/domain/validation/Validation.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/domain/validation/Validation.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/domain/validation/Validation.scala diff --git a/dex/src/main/scala/com/wavesplatform/dex/error/ErrorFormatterContext.scala b/dex-common/src/main/scala/com/wavesplatform/dex/error/ErrorFormatterContext.scala similarity index 99% rename from dex/src/main/scala/com/wavesplatform/dex/error/ErrorFormatterContext.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/error/ErrorFormatterContext.scala index 5bffa63f52..1f39004b6c 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/error/ErrorFormatterContext.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/error/ErrorFormatterContext.scala @@ -2,6 +2,7 @@ package com.wavesplatform.dex.error import cats.syntax.option._ import com.wavesplatform.dex.domain.asset.Asset + import scala.util.Try @FunctionalInterface diff --git a/dex/src/main/scala/com/wavesplatform/dex/error/Implicits.scala b/dex-common/src/main/scala/com/wavesplatform/dex/error/Implicits.scala similarity index 98% rename from dex/src/main/scala/com/wavesplatform/dex/error/Implicits.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/error/Implicits.scala index dda9140f68..e817b9246e 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/error/Implicits.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/error/Implicits.scala @@ -14,7 +14,7 @@ import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.feature.BlockchainFeature -import com.wavesplatform.dex.settings.formatValue +import com.wavesplatform.dex.utils.FormatUtils.formatValue import play.api.libs.json.{JsObject, JsValue, Json, Writes} import shapeless.ops.hlist.{Mapper, ToList} import shapeless.{HList, Id, Poly1, ProductArgs} diff --git a/dex/src/main/scala/com/wavesplatform/dex/error/MatcherError.scala b/dex-common/src/main/scala/com/wavesplatform/dex/error/MatcherError.scala similarity index 97% rename from dex/src/main/scala/com/wavesplatform/dex/error/MatcherError.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/error/MatcherError.scala index f1562d0a65..1a6cefe83a 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/error/MatcherError.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/error/MatcherError.scala @@ -12,7 +12,6 @@ import com.wavesplatform.dex.domain.order.{Order, OrderType} import com.wavesplatform.dex.error.Class.{common => commonClass, _} import com.wavesplatform.dex.error.Entity.{common => commonEntity, _} import com.wavesplatform.dex.error.Implicits._ -import com.wavesplatform.dex.settings.{DeviationsSettings, OrderRestrictionsSettings} import play.api.libs.json.{JsObject, Json, OWrites} sealed trait HasErrorCode { @@ -456,7 +455,7 @@ final case class AssetScriptException(asset: IssuedAsset, errorName: String, err object AssetScriptException extends MatcherErrorCodeProvider(asset, script, broken, C.BadRequest) -final case class DeviantOrderPrice(orderType: OrderType, orderPrice: Price, deviationSettings: DeviationsSettings) +final case class DeviantOrderPrice(orderType: OrderType, orderPrice: Price, deviationSettings: Deviations) extends MatcherError( DeviantOrderPrice.code, if (orderType == OrderType.BUY) @@ -472,12 +471,12 @@ final case class DeviantOrderPrice(orderType: OrderType, orderPrice: Price, devi object DeviantOrderPrice extends MatcherErrorCodeProvider(order, price, outOfBound, C.BadRequest) { - def apply(ord: Order, deviationSettings: DeviationsSettings)(implicit efc: ErrorFormatterContext): DeviantOrderPrice = + def apply(ord: Order, deviationSettings: Deviations)(implicit efc: ErrorFormatterContext): DeviantOrderPrice = DeviantOrderPrice(ord.orderType, Price(ord.assetPair, ord.price), deviationSettings) } -final case class DeviantOrderMatcherFee(orderType: OrderType, matcherFee: Amount, deviationSettings: DeviationsSettings) +final case class DeviantOrderMatcherFee(orderType: OrderType, matcherFee: Amount, deviationSettings: Deviations) extends MatcherError( DeviantOrderMatcherFee.code, if (orderType == OrderType.BUY) @@ -491,7 +490,7 @@ final case class DeviantOrderMatcherFee(orderType: OrderType, matcherFee: Amount object DeviantOrderMatcherFee extends MatcherErrorCodeProvider(order, fee, outOfBound, C.BadRequest) { - def apply(ord: Order, deviationSettings: DeviationsSettings)(implicit efc: ErrorFormatterContext): DeviantOrderMatcherFee = + def apply(ord: Order, deviationSettings: Deviations)(implicit efc: ErrorFormatterContext): DeviantOrderMatcherFee = DeviantOrderMatcherFee(ord.orderType, Amount(ord.feeAsset, ord.matcherFee), deviationSettings) } @@ -540,21 +539,21 @@ final case class UnsupportedOrderVersion(version: Byte) object UnsupportedOrderVersion extends MatcherErrorCodeProvider(order, version, unsupported, C.BadRequest) -final case class OrderInvalidAmount(orderAmount: Amount, amtSettings: OrderRestrictionsSettings) +final case class OrderInvalidAmount(orderAmount: Amount, amtSettings: OrderRestriction) extends MatcherError( OrderInvalidAmount.code, e"""The order's amount |${"amount" -> orderAmount} |does not meet matcher's requirements: - |max amount = ${"max" -> amtSettings.maxAmount}, - |min amount = ${"min" -> amtSettings.minAmount}, - |step amount = ${"step" -> amtSettings.stepAmount}""", + |max amount = ${"max" -> amtSettings.max}, + |min amount = ${"min" -> amtSettings.min}, + |step amount = ${"step" -> amtSettings.step}""", OrderInvalidAmount.httpCode ) object OrderInvalidAmount extends MatcherErrorCodeProvider(order, amount, denied, C.BadRequest) { - def apply(ord: Order, amtSettings: OrderRestrictionsSettings)(implicit efc: ErrorFormatterContext): OrderInvalidAmount = + def apply(ord: Order, amtSettings: OrderRestriction)(implicit efc: ErrorFormatterContext): OrderInvalidAmount = OrderInvalidAmount(Amount(ord.assetPair.amountAsset, ord.amount), amtSettings) } @@ -568,21 +567,21 @@ final case class PriceLastDecimalsMustBeZero(insignificantDecimals: Int) object PriceLastDecimalsMustBeZero extends MatcherErrorCodeProvider(order, price, unexpected, C.BadRequest) -final case class OrderInvalidPrice(orderPrice: Price, prcSettings: OrderRestrictionsSettings) +final case class OrderInvalidPrice(orderPrice: Price, prcSettings: OrderRestriction) extends MatcherError( OrderInvalidPrice.code, e"""The order's price |${"price" -> orderPrice} |does not meet matcher's requirements: - |max price = ${"max" -> prcSettings.maxPrice}, - |min price = ${"min" -> prcSettings.minPrice}, - |step price = ${"step" -> prcSettings.stepPrice}""", + |max price = ${"max" -> prcSettings.max}, + |min price = ${"min" -> prcSettings.min}, + |step price = ${"step" -> prcSettings.step}""", OrderInvalidPrice.httpCode ) object OrderInvalidPrice extends MatcherErrorCodeProvider(order, price, denied, C.BadRequest) { - def apply(ord: Order, prcSettings: OrderRestrictionsSettings)(implicit efc: ErrorFormatterContext): OrderInvalidPrice = + def apply(ord: Order, prcSettings: OrderRestriction)(implicit efc: ErrorFormatterContext): OrderInvalidPrice = OrderInvalidPrice(Price(ord.assetPair, ord.price), prcSettings) } @@ -777,6 +776,9 @@ final case class InvalidDepth(reason: String) object InvalidDepth extends MatcherErrorCodeProvider(request, depth, commonClass, C.BadRequest) +final case class OrderRestriction(min: Double, max: Double, step: Double) +final case class Deviations(maxPriceProfit: Double, maxPriceLoss: Double, maxFeeDeviation: Double) + sealed abstract class Entity(val code: Int) // noinspection ScalaStyle diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/fp/MapImplicits.scala b/dex-common/src/main/scala/com/wavesplatform/dex/fp/MapImplicits.scala similarity index 98% rename from waves-integration/src/main/scala/com/wavesplatform/dex/fp/MapImplicits.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/fp/MapImplicits.scala index 75927bd4c9..e39223df8a 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/fp/MapImplicits.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/fp/MapImplicits.scala @@ -4,7 +4,6 @@ import cats.Group import cats.instances.map.catsKernelStdMonoidForMap import cats.kernel.Semigroup -// TODO DEX-994 This package object MapImplicits { implicit def group[K, V](implicit vGroup: Group[V]): Group[Map[K, V]] = new Group[Map[K, V]] { diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/fp/MayBeEmpty.scala b/dex-common/src/main/scala/com/wavesplatform/dex/fp/MayBeEmpty.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/fp/MayBeEmpty.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/fp/MayBeEmpty.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/fp/PartialFunctionOps.scala b/dex-common/src/main/scala/com/wavesplatform/dex/fp/PartialFunctionOps.scala similarity index 100% rename from waves-integration/src/main/scala/com/wavesplatform/dex/fp/PartialFunctionOps.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/fp/PartialFunctionOps.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/AsyncEnrichedApi.scala b/dex-common/src/main/scala/com/wavesplatform/dex/it/api/AsyncEnrichedApi.scala similarity index 68% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/AsyncEnrichedApi.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/it/api/AsyncEnrichedApi.scala index b2c988e2cf..86f9c2eb68 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/AsyncEnrichedApi.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/it/api/AsyncEnrichedApi.scala @@ -1,11 +1,10 @@ package com.wavesplatform.dex.it.api -import java.net.InetSocketAddress -import sttp.client3._ import com.typesafe.config.Config -import kamon.trace.Identifier import play.api.libs.json.Reads +import sttp.client3._ +import java.net.InetSocketAddress import scala.concurrent.{ExecutionContext, Future} abstract class AsyncEnrichedApi[ErrorT: Reads](host: => InetSocketAddress)(implicit @@ -15,40 +14,37 @@ abstract class AsyncEnrichedApi[ErrorT: Reads](host: => InetSocketAddress)(impli type R[EntityT] = Future[EnrichedResponse[ErrorT, EntityT]] - def mk[EntityT: Reads](req: Request[Either[String, String], Any]): R[EntityT] = { - val traceId = generateTraceId() + def mk[EntityT: Reads](req: Request[Either[String, String], Any]): R[EntityT] = + //val traceId = generateTraceId() req - .tag("traceId", traceId) - .header("x-trace-id", traceId) + //.tag("traceId", traceId) + //.header("x-trace-id", traceId) .contentType("application/json") .send(httpBackend) .map(EnrichedResponse(_, new EnrichedResponse.AsJson[ErrorT, EntityT])) - } - def mkHocon[EntityT](req: Request[Either[String, String], Any]): R[Config] = { - val traceId = generateTraceId() + def mkHocon[EntityT](req: Request[Either[String, String], Any]): R[Config] = + // val traceId = generateTraceId() req - .tag("traceId", traceId) - .header("x-trace-id", traceId) + //.tag("traceId", traceId) + // .header("x-trace-id", traceId) .send(httpBackend) .map(EnrichedResponse(_, new EnrichedResponse.AsHocon[ErrorT])) - } - def mkIgnore(req: Request[Either[String, String], Any]): R[Unit] = { - val traceId = generateTraceId() + def mkIgnore(req: Request[Either[String, String], Any]): R[Unit] = + //val traceId = generateTraceId() req - .tag("traceId", traceId) - .header("x-trace-id", traceId) + //.tag("traceId", traceId) + // .header("x-trace-id", traceId) .send(httpBackend) .map(EnrichedResponse(_, new EnrichedResponse.Ignore[ErrorT])) - } def apiUri: String = { val savedHost = host s"http://${savedHost.getAddress.getHostAddress}:${savedHost.getPort}" } - private def generateTraceId(): String = - Identifier.Factory.EightBytesIdentifier.generate().string + //private def generateTraceId(): String = + //Identifier.Factory.EightBytesIdentifier.generate().string } diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/EnrichedResponse.scala b/dex-common/src/main/scala/com/wavesplatform/dex/it/api/EnrichedResponse.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/EnrichedResponse.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/it/api/EnrichedResponse.scala index bc94826c09..580c71860c 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/EnrichedResponse.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/it/api/EnrichedResponse.scala @@ -1,10 +1,10 @@ package com.wavesplatform.dex.it.api import cats.implicits.catsSyntaxEitherId -import sttp.client3.Response import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.it.api.EnrichedResponse.As import play.api.libs.json.{Json, Reads} +import sttp.client3.Response case class EnrichedResponse[ErrorT, EntityT](response: Response[Either[String, String]], as: As[ErrorT, EntityT]) { def tryGet: Either[ErrorT, EntityT] = as.tryGet(response) diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/Transformations.scala b/dex-common/src/main/scala/com/wavesplatform/dex/it/api/Transformations.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/Transformations.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/it/api/Transformations.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/cache/CachedData.scala b/dex-common/src/main/scala/com/wavesplatform/dex/it/cache/CachedData.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/cache/CachedData.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/it/cache/CachedData.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/sttp/LoggingSttpBackend.scala b/dex-common/src/main/scala/com/wavesplatform/dex/it/sttp/LoggingSttpBackend.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/sttp/LoggingSttpBackend.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/it/sttp/LoggingSttpBackend.scala index a212ea3c6b..bb829a8a6c 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/sttp/LoggingSttpBackend.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/it/sttp/LoggingSttpBackend.scala @@ -1,10 +1,10 @@ package com.wavesplatform.dex.it.sttp import cats.Applicative -import sttp.monad._ -import sttp.client3._ import com.wavesplatform.dex.domain.utils.ScorexLogging import sttp.capabilities +import sttp.client3._ +import sttp.monad._ class LoggingSttpBackend[R[_]: Applicative, S](delegate: SttpBackend[R, S]) extends SttpBackend[R, S] with ScorexLogging { diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/time/GlobalTimer.scala b/dex-common/src/main/scala/com/wavesplatform/dex/it/time/GlobalTimer.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/time/GlobalTimer.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/it/time/GlobalTimer.scala diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/meta/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/meta/meta.scala similarity index 73% rename from waves-integration/src/main/scala/com/wavesplatform/dex/meta/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/meta/meta.scala index 95c8186f57..7c567325b0 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/meta/package.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/meta/meta.scala @@ -1,5 +1,5 @@ package com.wavesplatform.dex package object meta { - def getSimpleName(x: Any): String = x.getClass.getName.replaceAll(".*?(\\w+)\\$?$", "$1") // TODO DEX-994 + def getSimpleName(x: Any): String = x.getClass.getName.replaceAll(".*?(\\w+)\\$?$", "$1") } diff --git a/dex/src/main/scala/com/wavesplatform/dex/settings/utils/ConfigOps.scala b/dex-common/src/main/scala/com/wavesplatform/dex/settings/ConfigOps.scala similarity index 84% rename from dex/src/main/scala/com/wavesplatform/dex/settings/utils/ConfigOps.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/settings/ConfigOps.scala index 6e4ac3e3a3..9a06dbc47c 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/settings/utils/ConfigOps.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/settings/ConfigOps.scala @@ -1,17 +1,16 @@ -package com.wavesplatform.dex.settings.utils - -import java.util.Properties +package com.wavesplatform.dex.settings import com.typesafe.config.{Config, ConfigObject, ConfigRenderOptions} -import mouse.any._ -import scala.jdk.CollectionConverters.MapHasAsScala +import java.util.Properties +import scala.util.chaining._ +import scala.jdk.CollectionConverters._ object ConfigOps { implicit final class ConfigOps(val config: Config) extends AnyVal { - def toProperties: Properties = new Properties() unsafeTap { properties => + def toProperties: Properties = new Properties() tap { properties => config.entrySet().forEach { entry => properties.setProperty(entry.getKey, config getString entry.getKey) } diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/statuses/CombinedStreamStatus.scala b/dex-common/src/main/scala/com/wavesplatform/dex/statuses/CombinedStreamStatus.scala new file mode 100644 index 0000000000..96edadb3f0 --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/statuses/CombinedStreamStatus.scala @@ -0,0 +1,46 @@ +package com.wavesplatform.dex.statuses + +import com.wavesplatform.dex.meta.getSimpleName +import play.api.libs.json.{Format, JsError, JsNumber, JsObject, JsString, JsSuccess, Reads, Writes} + +sealed abstract class CombinedStreamStatus extends Product with Serializable + +object CombinedStreamStatus { + + sealed trait HasStreams { + def blockchainUpdates: Boolean + def utxEvents: Boolean + + def oneDone: Boolean = blockchainUpdates || utxEvents + override def toString: String = s"${getSimpleName(this)}(b=$blockchainUpdates, u=$utxEvents)" + } + + final case class Starting(blockchainUpdates: Boolean = false, utxEvents: Boolean = false) extends CombinedStreamStatus with HasStreams + + final case class Stopping(blockchainUpdates: Boolean = false, utxEvents: Boolean = false) extends CombinedStreamStatus with HasStreams + + final case class Closing(blockchainUpdates: Boolean = false, utxEvents: Boolean = false) extends CombinedStreamStatus with HasStreams + + final case class Working(height: Int) extends CombinedStreamStatus + + implicit val format: Format[CombinedStreamStatus] = Format( + Reads { json => + (json \ "status").as[String] match { + case "Starting" => JsSuccess(Starting()) + case "Stopping" => JsSuccess(Stopping()) + case "Closing" => JsSuccess(Closing()) + case "Working" => + val height = (json \ "height").as[Int] + JsSuccess(Working(height)) + case x => JsError(s"Can't parse '$x' as CombinedStream.Status") + } + }, + Writes { + case _: Starting => JsObject(Map("status" -> JsString("Starting"))) + case _: Stopping => JsObject(Map("status" -> JsString("Stopping"))) + case _: Closing => JsObject(Map("status" -> JsString("Closing"))) + case x: Working => JsObject(Map("status" -> JsString("Working"), "height" -> JsNumber(x.height))) + } + ) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/app/MatcherStatus.scala b/dex-common/src/main/scala/com/wavesplatform/dex/statuses/MatcherStatus.scala similarity index 94% rename from dex/src/main/scala/com/wavesplatform/dex/app/MatcherStatus.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/statuses/MatcherStatus.scala index e55dafbba8..ee429f08dc 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/app/MatcherStatus.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/statuses/MatcherStatus.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.app +package com.wavesplatform.dex.statuses import com.wavesplatform.dex.meta.getSimpleName import play.api.libs.json.{Format, Reads, Writes} diff --git a/dex/src/main/scala/com/wavesplatform/dex/tool/LocaleUtils.scala b/dex-common/src/main/scala/com/wavesplatform/dex/tool/LocaleUtils.scala similarity index 100% rename from dex/src/main/scala/com/wavesplatform/dex/tool/LocaleUtils.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/tool/LocaleUtils.scala diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/utils/DiffMatcherWithImplicits.scala b/dex-common/src/main/scala/com/wavesplatform/dex/utils/DiffMatcherWithImplicits.scala new file mode 100644 index 0000000000..ff5003eecb --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/utils/DiffMatcherWithImplicits.scala @@ -0,0 +1,21 @@ +package com.wavesplatform.dex.utils + +import com.softwaremill.diffx.scalatest.DiffMatcher +import com.softwaremill.diffx.{Derived, Diff, DiffResultValue, FieldPath, Identical} +import com.wavesplatform.dex.domain.account.PublicKey +import com.wavesplatform.dex.domain.bytes.ByteStr + +trait DiffMatcherWithImplicits extends DiffMatcher with Diffs { + + implicit val derivedByteStrDiff: Derived[Diff[ByteStr]] = Derived(getDiff[ByteStr](_.toString == _.toString)) + implicit val derivedPublicKeyDiff: Derived[Diff[PublicKey]] = Derived(derivedByteStrDiff.contramap[PublicKey](_.arr)) + +} + +object DiffMatcherWithImplicits { + + def getDiff[T](comparison: (T, T) => Boolean): Diff[T] = { (left: T, right: T, _: List[FieldPath]) => + if (comparison(left, right)) Identical(left) else DiffResultValue(left, right) + } + +} diff --git a/dex-test-common/src/main/scala/com/wavesplatform/dex/test/matchers/DiffMatcherWithImplicits.scala b/dex-common/src/main/scala/com/wavesplatform/dex/utils/Diffs.scala similarity index 54% rename from dex-test-common/src/main/scala/com/wavesplatform/dex/test/matchers/DiffMatcherWithImplicits.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/utils/Diffs.scala index 9a49d27a7f..0eecdca8a9 100644 --- a/dex-test-common/src/main/scala/com/wavesplatform/dex/test/matchers/DiffMatcherWithImplicits.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/utils/Diffs.scala @@ -1,32 +1,38 @@ -package com.wavesplatform.dex.test.matchers +package com.wavesplatform.dex.utils -import com.softwaremill.diffx.scalatest.DiffMatcher +import com.google.protobuf.ByteString import com.softwaremill.diffx.{Derived, Diff, DiffResultValue, FieldPath, Identical} -import com.wavesplatform.dex.domain.account.PublicKey +import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.asset.Asset.IssuedAsset -import com.wavesplatform.dex.domain.bytes.ByteStr -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits.getDiff +import com.wavesplatform.dex.domain.bytes.codec.Base58 +import com.wavesplatform.dex.grpc.integration.services.UtxTransaction -trait DiffMatcherWithImplicits extends DiffMatcher { +trait Diffs { - implicit val derivedByteStrDiff: Derived[Diff[ByteStr]] = Derived(getDiff[ByteStr](_.toString == _.toString)) - implicit val derivedPublicKeyDiff: Derived[Diff[PublicKey]] = Derived(derivedByteStrDiff.contramap[PublicKey](_.arr)) + // diffx + val byteStringDiff: Diff[ByteString] = Diff[String].contramap[ByteString](xs => Base58.encode(xs.toByteArray)) + implicit val derivedByteStringDiff: Derived[Diff[ByteString]] = Derived(byteStringDiff) + implicit val derivedUtxTransactionDiff: Derived[Diff[UtxTransaction]] = Derived(byteStringDiff.contramap[UtxTransaction](_.id)) + + implicit val addressDiff: Diff[Address] = Diff[String].contramap[Address](_.stringRepr) + + // TODO Duplicate implicit val issuedAssetDiff: Diff[IssuedAsset] = { (left: IssuedAsset, right: IssuedAsset, _: List[FieldPath]) => if (left.id == right.id) Identical(left) else DiffResultValue(left, right) } + // TODO Duplicate implicit val assetDiff: Diff[Asset] = { (left: Asset, right: Asset, _: List[FieldPath]) => if (left == right) Identical(left) else DiffResultValue(left, right) } + // TODO Duplicate implicit val issuedAssetDerivedDiff: Derived[Diff[IssuedAsset]] = Derived(issuedAssetDiff) - implicit val assetDerivedDiff: Derived[Diff[Asset]] = Derived(assetDiff) -} - -object DiffMatcherWithImplicits { + // TODO Duplicate + implicit val assetDerivedDiff: Derived[Diff[Asset]] = Derived(assetDiff) def getDiff[T](comparison: (T, T) => Boolean): Diff[T] = { (left: T, right: T, _: List[FieldPath]) => if (comparison(left, right)) Identical(left) else DiffResultValue(left, right) diff --git a/dex-common/src/main/scala/com/wavesplatform/dex/utils/FormatUtils.scala b/dex-common/src/main/scala/com/wavesplatform/dex/utils/FormatUtils.scala new file mode 100644 index 0000000000..46012a7a39 --- /dev/null +++ b/dex-common/src/main/scala/com/wavesplatform/dex/utils/FormatUtils.scala @@ -0,0 +1,14 @@ +package com.wavesplatform.dex.utils + +import com.wavesplatform.dex.tool.LocaleUtils + +import java.text.DecimalFormat + +object FormatUtils { + + private val format = new DecimalFormat("#.################", LocaleUtils.symbols) + + /** Formats amount or price */ + def formatValue(value: BigDecimal): String = format.format(value.bigDecimal) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/json/package.scala b/dex-common/src/main/scala/com/wavesplatform/dex/utils/JsonImplicits.scala similarity index 51% rename from dex/src/main/scala/com/wavesplatform/dex/json/package.scala rename to dex-common/src/main/scala/com/wavesplatform/dex/utils/JsonImplicits.scala index a7c7c5aeb8..f57bc1ad60 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/json/package.scala +++ b/dex-common/src/main/scala/com/wavesplatform/dex/utils/JsonImplicits.scala @@ -1,13 +1,30 @@ -package com.wavesplatform.dex +package com.wavesplatform.dex.utils import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.bytes.ByteStr -import com.wavesplatform.dex.settings.formatValue +import com.wavesplatform.dex.domain.order.Order +import com.wavesplatform.dex.fp.MayBeEmpty +import com.wavesplatform.dex.utils.FormatUtils.formatValue +import com.wavesplatform.transactions.{ExchangeTransaction, Transaction} +import play.api.libs.functional.syntax._ import play.api.libs.json._ import scala.reflect.ClassTag +import scala.util.{Failure, Success, Try} -package object json { +object JsonImplicits { + + implicit final class JsPathOps(val self: JsPath) extends AnyVal { + + def formatMayBeEmpty[T](implicit f: Format[T], mayBeEmpty: MayBeEmpty[T]): OFormat[T] = + self + .formatNullable[T] + .inmap[T]( + _.fold(mayBeEmpty.empty)(identity), + Option(_).filterNot(mayBeEmpty.isEmpty) + ) + + } implicit def eitherFormat[L, R](implicit lFormat: Format[L], rFormat: Format[R], ctl: ClassTag[L], ctr: ClassTag[R]): Format[Either[L, R]] = Format( @@ -85,4 +102,59 @@ package object json { def coerce[B](to: A => B, from: B => A): Format[B] = Format(self.map(to), self.contramap(from)) } + implicit val transactionFormat: Format[Transaction] = Format[Transaction]( + Reads { json => + Try(Transaction.fromJson(json.toString)) match { + case Success(x) => JsSuccess(x) + case Failure(e) => JsError(e.getMessage) + } + }, + Writes(tx => Json.parse(tx.toJson)) + ) + + implicit val byteStrFormat: Format[ByteStr] = Format( + Reads { + case JsString(str) => + ByteStr.decodeBase58(str) match { + case Success(x) => JsSuccess(x) + case Failure(e) => JsError(e.getMessage) + } + + case _ => JsError("Can't read ByteStr") + }, + Writes(x => JsString(x.toString)) + ) + + implicit val exchangeTxReads: Reads[ExchangeTransaction] = transactionFormat.map(_.asInstanceOf[ExchangeTransaction]) + + implicit val orderWrites: Writes[Order] = Writes(_.json()) + + implicit val assetPairFormat: Format[AssetPair] = AssetPair.assetPairFormat + + implicit val assetRatesReads: Reads[Map[Asset, Double]] = Reads { json => + json.validate[Map[String, Double]].map { assetRates => + assetRates.map { case (assetStr, rateValue) => AssetPair.extractAsset(assetStr).get -> rateValue } + } + } + + implicit val assetBalancesReads: Reads[Map[Asset, Long]] = Reads.map[Long].map { assetBalances => + assetBalances.map { case (assetStr, balanceValue) => AssetPair.extractAsset(assetStr).get -> balanceValue } + } + + implicit val assetPairOffsetsReads: Reads[Map[AssetPair, Long]] = Reads { json => + json.validate[Map[String, Long]].map { + _.map { + case (assetPairStr, offset) => + val assetPairStrArr = assetPairStr.split("-") + val assetPair = ( + assetPairStrArr match { + case Array(amtAssetStr, prcAssetStr) => AssetPair.createAssetPair(amtAssetStr, prcAssetStr) + case _ => throw new Exception(s"$assetPairStr (incorrect assets count, expected 2 but got ${assetPairStrArr.size})") + } + ).fold(ex => throw new Exception(s"$assetPairStr (${ex.getMessage})"), identity) + assetPair -> offset + } + } + } + } diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/ConnectReq.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/ConnectReq.scala similarity index 80% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/ConnectReq.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/ConnectReq.scala index dfd3119850..299e874f55 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/ConnectReq.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/ConnectReq.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.it.api.node +package com.wavesplatform.dex.it.api import play.api.libs.json.{Format, Json} diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/MultipleVersions.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/MultipleVersions.scala similarity index 86% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/MultipleVersions.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/MultipleVersions.scala index 5bc23dbf23..9e069b4870 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/MultipleVersions.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/MultipleVersions.scala @@ -1,9 +1,7 @@ package com.wavesplatform.dex.it.api import com.typesafe.config.{Config, ConfigFactory} -import com.wavesplatform.dex.it.api.dex.HasDex -import com.wavesplatform.dex.it.api.node.HasWavesNode -import com.wavesplatform.dex.it.docker.{DexContainer, WavesNodeContainer} +import com.wavesplatform.dex.it.containers._ trait MultipleVersions extends HasDex with HasWavesNode { self: BaseContainersKit => diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/RawHttpChecks.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/RawHttpChecks.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/RawHttpChecks.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/RawHttpChecks.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/AsyncEnrichedDexApi.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/dex/AsyncEnrichedDexApi.scala similarity index 99% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/AsyncEnrichedDexApi.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/dex/AsyncEnrichedDexApi.scala index 390b1e1008..cb35f74dee 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/AsyncEnrichedDexApi.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/dex/AsyncEnrichedDexApi.scala @@ -3,7 +3,8 @@ package com.wavesplatform.dex.it.api.dex import com.google.common.primitives.Longs import com.typesafe.config.Config import com.wavesplatform.dex.api.http.entities._ -import com.wavesplatform.dex.api.http.protocol.HttpCancelOrder +import com.wavesplatform.dex.utils.JsonImplicits.{exchangeTxReads, orderWrites} +import com.wavesplatform.dex.api.http.entities.protocol.HttpCancelOrder import com.wavesplatform.dex.domain.account.{Address, KeyPair, PublicKey} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.bytes.ByteStr @@ -11,10 +12,9 @@ import com.wavesplatform.dex.domain.bytes.codec.Base58 import com.wavesplatform.dex.domain.crypto import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.domain.order.Order.Id -import com.wavesplatform.dex.it.api._ -import com.wavesplatform.dex.it.api.responses.dex.MatcherError -import com.wavesplatform.dex.it.json._ import com.wavesplatform.transactions.ExchangeTransaction +import com.wavesplatform.dex.it.api.responses.dex.MatcherError +import com.wavesplatform.dex.it.api.{AsyncEnrichedApi, EnrichedResponse} import play.api.libs.json.{JsObject, Json} import sttp.client3._ import sttp.client3.playJson._ diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/DexApi.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/dex/DexApi.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/DexApi.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/dex/DexApi.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/DexApiSyntax.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/dex/DexApiSyntax.scala similarity index 97% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/DexApiSyntax.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/dex/DexApiSyntax.scala index 4cb445eb61..3adb3d99b6 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/DexApiSyntax.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/dex/DexApiSyntax.scala @@ -1,16 +1,16 @@ package com.wavesplatform.dex.it.api.dex -import cats.Functor import cats.syntax.functor._ -import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status.{Accepted, Cancelled, Filled, PartiallyFilled} +import cats.Functor +import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status._ import com.wavesplatform.dex.api.http.entities._ import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.order.Order -import com.wavesplatform.dex.it.fp.{CanRepeat, RepeatRequestOptions} import com.wavesplatform.transactions.ExchangeTransaction +import com.wavesplatform.dex.it.fp.{CanRepeat, RepeatRequestOptions} -import scala.concurrent.duration.DurationInt +import scala.concurrent.duration._ object DexApiSyntax { diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/AsyncEnrichedNodeApi.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/AsyncEnrichedNodeApi.scala similarity index 97% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/AsyncEnrichedNodeApi.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/AsyncEnrichedNodeApi.scala index f8e860bcb9..b76a9da55e 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/AsyncEnrichedNodeApi.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/AsyncEnrichedNodeApi.scala @@ -4,13 +4,13 @@ import com.wavesplatform.dex.api.http.entities.HttpMessage import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.it.api.responses.node._ -import com.wavesplatform.dex.it.api.{AsyncEnrichedApi, EnrichedResponse} +import com.wavesplatform.dex.it.api.{AsyncEnrichedApi, ConnectReq, EnrichedResponse} import com.wavesplatform.transactions.Transaction import com.wavesplatform.transactions.common.Id import play.api.libs.json._ import sttp.client3._ -import sttp.model._ import sttp.client3.playJson._ +import sttp.model._ import java.net.InetSocketAddress import scala.concurrent.{ExecutionContext, Future} diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApi.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApi.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApi.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApi.scala index 87a186235a..bcfdda240b 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApi.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApi.scala @@ -1,7 +1,5 @@ package com.wavesplatform.dex.it.api.node -import java.net.InetSocketAddress - import cats.tagless.{autoFunctorK, finalAlg} import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.Asset.IssuedAsset @@ -9,6 +7,8 @@ import com.wavesplatform.dex.it.api.responses.node._ import com.wavesplatform.transactions.Transaction import com.wavesplatform.transactions.common.Id +import java.net.InetSocketAddress + @finalAlg @autoFunctorK trait NodeApi[F[_]] { diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApiExtensions.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApiExtensions.scala similarity index 90% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApiExtensions.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApiExtensions.scala index 9a601fc1fa..c26bf92c5f 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApiExtensions.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApiExtensions.scala @@ -1,6 +1,7 @@ package com.wavesplatform.dex.it.api.node import cats.Id +import com.wavesplatform.dex.it.containers.HasWavesNode import com.wavesplatform.transactions.Transaction trait NodeApiExtensions { diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApiSyntax.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApiSyntax.scala similarity index 99% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApiSyntax.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApiSyntax.scala index ed3d2e7a13..3852444d3c 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/NodeApiSyntax.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/NodeApiSyntax.scala @@ -1,7 +1,5 @@ package com.wavesplatform.dex.it.api.node -import java.net.InetSocketAddress - import cats.syntax.flatMap._ import cats.syntax.functor._ import cats.{FlatMap, Functor} @@ -14,6 +12,7 @@ import com.wavesplatform.transactions.Transaction import com.wavesplatform.transactions.common.Id import scala.concurrent.duration.DurationInt +import java.net.InetSocketAddress object NodeApiSyntax { diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/RollbackReq.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/RollbackReq.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/RollbackReq.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/node/RollbackReq.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/dex/MatcherError.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/dex/MatcherError.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/dex/MatcherError.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/dex/MatcherError.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/ActivationStatusResponse.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/ActivationStatusResponse.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/ActivationStatusResponse.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/ActivationStatusResponse.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/AssetBalanceResponse.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/AssetBalanceResponse.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/AssetBalanceResponse.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/AssetBalanceResponse.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/AssetsBalancesResponse.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/AssetsBalancesResponse.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/AssetsBalancesResponse.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/AssetsBalancesResponse.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/ConnectedPeersResponse.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/ConnectedPeersResponse.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/ConnectedPeersResponse.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/ConnectedPeersResponse.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/ErrorResponse.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/ErrorResponse.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/ErrorResponse.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/ErrorResponse.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/HeightResponse.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/HeightResponse.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/HeightResponse.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/HeightResponse.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/NftAsset.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/NftAsset.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/NftAsset.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/NftAsset.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/WavesBalanceResponse.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/WavesBalanceResponse.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/WavesBalanceResponse.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/WavesBalanceResponse.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/package.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/package.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/responses/node/package.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/responses/node/package.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/websockets/HasJwt.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/websockets/HasJwt.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/websockets/HasJwt.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/websockets/HasJwt.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/websockets/HasWebSockets.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/websockets/HasWebSockets.scala similarity index 96% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/websockets/HasWebSockets.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/websockets/HasWebSockets.scala index 9efba99f2f..fc53490223 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/websockets/HasWebSockets.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/websockets/HasWebSockets.scala @@ -13,10 +13,9 @@ import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.error.ErrorFormatterContext import com.wavesplatform.dex.fp.MapImplicits.MapOps -import com.wavesplatform.dex.it.config.PredefinedAssets -import com.wavesplatform.dex.it.docker.DexContainer -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits -import mouse.any._ +import com.wavesplatform.dex.it.containers.DexContainer +import com.wavesplatform.dex.predefined.PredefinedAssets +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.concurrent.Eventually import org.scalatest.matchers.should.Matchers import org.scalatest.{BeforeAndAfterAll, BeforeAndAfterEach, Suite} @@ -24,6 +23,7 @@ import org.scalatest.{BeforeAndAfterAll, BeforeAndAfterEach, Suite} import java.lang import java.util.concurrent.ConcurrentHashMap import scala.concurrent.duration._ +import scala.util.chaining._ trait HasWebSockets extends BeforeAndAfterAll with BeforeAndAfterEach with HasJwt with WsConnectionOps with WsMessageOps { _: Suite with Eventually with Matchers with DiffMatcherWithImplicits with PredefinedAssets => @@ -96,7 +96,7 @@ trait HasWebSockets extends BeforeAndAfterAll with BeforeAndAfterEach with HasJw } protected def mkWsConnection(uri: Uri, keepAlive: Boolean = true): WsConnection = - new WsConnection(uri, keepAlive) unsafeTap { wsc => + new WsConnection(uri, keepAlive) tap { wsc => addConnection(wsc) eventually(wsc.collectMessages[WsInitial] should have size 1) wsc.clearMessages() diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/websockets/WsMessageOps.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/api/websockets/WsMessageOps.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/websockets/WsMessageOps.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/api/websockets/WsMessageOps.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/GenesisConfig.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/GenesisConfig.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/GenesisConfig.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/config/GenesisConfig.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/GenesisConfigGenerator.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/GenesisConfigGenerator.scala similarity index 98% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/GenesisConfigGenerator.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/config/GenesisConfigGenerator.scala index 40c5d21033..a232e52cf6 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/GenesisConfigGenerator.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/GenesisConfigGenerator.scala @@ -6,6 +6,7 @@ import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.crypto import com.wavesplatform.dex.domain.utils.EitherExt2 import com.wavesplatform.dex.it.config.genesis._ +import com.wavesplatform.dex.predefined.PredefinedAccounts import pureconfig.ConfigSource import pureconfig.generic.auto._ diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/Block.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/Block.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/Block.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/Block.scala index dc1a4bda50..eaad128dc1 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/Block.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/Block.scala @@ -1,7 +1,5 @@ package com.wavesplatform.dex.it.config.genesis -import java.io.ByteArrayOutputStream - import com.google.common.primitives.{Bytes, Ints, Longs} import com.wavesplatform.dex.domain.account.{KeyPair, PublicKey} import com.wavesplatform.dex.domain.bytes.ByteStr @@ -10,6 +8,8 @@ import com.wavesplatform.dex.domain.crypto.Authorized import com.wavesplatform.dex.domain.error.ValidationError.GenericError import monix.eval.Coeval +import java.io.ByteArrayOutputStream + /** Simplified version of the Node's block. The only purpose is to supply correct values for the waves.blockchain.custom.genesis settings */ case class Block( timestamp: Long, diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/GenesisSettings.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/GenesisSettings.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/GenesisSettings.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/GenesisSettings.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/GenesisTransaction.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/GenesisTransaction.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/GenesisTransaction.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/GenesisTransaction.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/GenesisTransactionSettings.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/GenesisTransactionSettings.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/GenesisTransactionSettings.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/GenesisTransactionSettings.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/NxtLikeConsensusBlockData.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/NxtLikeConsensusBlockData.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/NxtLikeConsensusBlockData.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/NxtLikeConsensusBlockData.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/SignerData.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/SignerData.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/genesis/SignerData.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/config/genesis/SignerData.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/BaseContainer.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/BaseContainer.scala similarity index 98% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/BaseContainer.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/BaseContainer.scala index f9ceb05dfd..376704c0da 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/BaseContainer.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/BaseContainer.scala @@ -1,8 +1,4 @@ -package com.wavesplatform.dex.it.docker - -import java.net.InetSocketAddress -import java.nio.charset.StandardCharsets -import java.nio.file._ +package com.wavesplatform.dex.it.containers import com.dimafeng.testcontainers.GenericContainer import com.github.dockerjava.api.command.InspectContainerResponse @@ -11,9 +7,12 @@ import com.github.dockerjava.api.model.{ContainerNetwork, ExposedPort, Ports} import com.typesafe.config.Config import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.it.cache.CachedData -import com.wavesplatform.dex.settings.utils.ConfigOps.ConfigOps +import com.wavesplatform.dex.settings.ConfigOps._ import org.testcontainers.images.builder.Transferable +import java.net.InetSocketAddress +import java.nio.charset.StandardCharsets +import java.nio.file._ import scala.jdk.CollectionConverters._ abstract class BaseContainer(protected val baseContainerPath: String, private val underlying: GenericContainer) diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/BaseContainersKit.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/BaseContainersKit.scala similarity index 96% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/BaseContainersKit.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/BaseContainersKit.scala index 48c4c6d0b7..a2dbaa1498 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/BaseContainersKit.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/BaseContainersKit.scala @@ -1,17 +1,14 @@ -package com.wavesplatform.dex.it.api +package com.wavesplatform.dex.it.containers -import cats.implicits.catsStdInstancesForTry -import cats.instances.future._ import com.github.dockerjava.api.command.CreateNetworkCmd import com.github.dockerjava.api.model.Network.Ipam import com.google.common.primitives.Ints.toByteArray import com.google.common.util.concurrent.ThreadFactoryBuilder import com.wavesplatform.dex.domain.utils.ScorexLogging -import com.wavesplatform.dex.it.docker.BaseContainer import com.wavesplatform.dex.it.sttp.LoggingSttpBackend import org.asynchttpclient.DefaultAsyncHttpClientConfig import org.testcontainers.containers.Network -import sttp.client3._ +import sttp.client3.TryHttpURLConnectionBackend import sttp.client3.asynchttpclient.future.AsyncHttpClientFutureBackend import java.net.InetAddress @@ -21,8 +18,8 @@ import java.time.format.DateTimeFormatter import java.util.concurrent.Executors import java.util.concurrent.atomic.AtomicReference import scala.concurrent.{ExecutionContext, Future} -import scala.util.chaining._ import scala.util.{Random, Try} +import scala.util.chaining._ trait BaseContainersKit extends ScorexLogging { diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/ConfigurableToxicProxyContainer.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/ConfigurableToxicProxyContainer.scala similarity index 98% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/ConfigurableToxicProxyContainer.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/ConfigurableToxicProxyContainer.scala index 262dd2333d..02acd48ab0 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/ConfigurableToxicProxyContainer.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/ConfigurableToxicProxyContainer.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.it.docker +package com.wavesplatform.dex.it.containers import com.dimafeng.testcontainers.GenericContainer import org.testcontainers.containers.{GenericContainer => JavaGenericContainer} diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/DexContainer.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/DexContainer.scala similarity index 93% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/DexContainer.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/DexContainer.scala index 57cb5615c9..a7057f5315 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/DexContainer.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/DexContainer.scala @@ -1,23 +1,23 @@ -package com.wavesplatform.dex.it.docker +package com.wavesplatform.dex.it.containers import cats.Functor import cats.tagless.FunctorK import com.dimafeng.testcontainers.GenericContainer -import com.github.dockerjava.api.model.Ports.Binding -import com.github.dockerjava.api.model.{Capability, ExposedPort, PortBinding} +import com.github.dockerjava.api.model.Capability import com.typesafe.config.Config -import com.wavesplatform.dex.app.MatcherStatus.Working +import com.wavesplatform.dex.it.api.Transformations +import com.wavesplatform.dex.collections.Implicits.ListOps import com.wavesplatform.dex.domain.utils.ScorexLogging -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.Status -import com.wavesplatform.dex.it.api._ import com.wavesplatform.dex.it.api.dex.{AsyncEnrichedDexApi, DexApi, DexApiSyntax} import com.wavesplatform.dex.it.api.responses.dex.MatcherError import com.wavesplatform.dex.it.cache.CachedData -import com.wavesplatform.dex.it.collections.Implicits.ListOps +import com.wavesplatform.dex.it.docker.{apiKey, ignoreWaitStrategy, MountableFileOps, PortBindingKeeper} import com.wavesplatform.dex.it.fp.CanRepeat import com.wavesplatform.dex.it.resources.getRawContentFromResource import com.wavesplatform.dex.it.sttp.LoggingSttpBackend -import com.wavesplatform.dex.settings.utils.ConfigOps.ConfigOps +import com.wavesplatform.dex.settings.ConfigOps.ConfigOps +import com.wavesplatform.dex.statuses.CombinedStreamStatus +import com.wavesplatform.dex.statuses.MatcherStatus.Working import org.testcontainers.containers.{BindMode, Network} import java.net.InetSocketAddress @@ -101,7 +101,7 @@ final case class DexContainer private (override val internalIp: String, underlyi Thread.sleep(1000) try { val s = api.getMatcherStatus - s.blockchain.isInstanceOf[Status.Working] && s.service == Working + s.blockchain.isInstanceOf[CombinedStreamStatus.Working] && s.service == Working } catch { case _: Throwable => false } diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/HasDex.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasDex.scala similarity index 90% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/HasDex.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasDex.scala index 8b48253cb2..7086e46635 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/dex/HasDex.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasDex.scala @@ -1,16 +1,14 @@ -package com.wavesplatform.dex.it.api.dex - -import java.util.Properties -import java.util.concurrent.ThreadLocalRandom +package com.wavesplatform.dex.it.containers import cats.Functor import com.typesafe.config.{Config, ConfigFactory} -import com.wavesplatform.dex.it.api.BaseContainersKit -import com.wavesplatform.dex.it.docker.DexContainer +import com.wavesplatform.dex.it.api.dex.{DexApi, DexApiSyntax} import com.wavesplatform.dex.it.fp.CanRepeat -import mouse.any._ import org.apache.kafka.clients.admin.{AdminClient, NewTopic} +import java.util.Properties +import java.util.concurrent.ThreadLocalRandom +import scala.util.chaining._ import scala.jdk.CollectionConverters._ trait HasDex { self: BaseContainersKit => @@ -44,7 +42,7 @@ trait HasDex { self: BaseContainersKit => suiteInitialConfig: Config = dexInitialSuiteConfig, image: String = dexImage ): DexContainer = - DexContainer(name, networkName, network, getIp(name), runConfig, suiteInitialConfig, localLogsDir, image) unsafeTap addKnownContainer + DexContainer(name, networkName, network, getIp(name), runConfig, suiteInitialConfig, localLogsDir, image) tap addKnownContainer protected lazy val dex1: DexContainer = createDex("dex-1") diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/HasKafka.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasKafka.scala similarity index 98% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/HasKafka.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasKafka.scala index 8716cebb9d..1ca666a74f 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/HasKafka.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasKafka.scala @@ -1,12 +1,11 @@ -package com.wavesplatform.dex.it.api - -import java.util.concurrent.ThreadLocalRandom +package com.wavesplatform.dex.it.containers import com.dimafeng.testcontainers.KafkaContainer import com.github.dockerjava.api.model.{ContainerNetwork, NetworkSettings} import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.it.test.InformativeTestStart +import java.util.concurrent.ThreadLocalRandom import scala.jdk.CollectionConverters._ trait HasKafka { self: BaseContainersKit with InformativeTestStart => diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/HasToxiProxy.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasToxiProxy.scala similarity index 88% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/HasToxiProxy.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasToxiProxy.scala index ab2cda2379..5c54dba0b7 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/HasToxiProxy.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasToxiProxy.scala @@ -1,7 +1,8 @@ -package com.wavesplatform.dex.it.api +package com.wavesplatform.dex.it.containers -import com.wavesplatform.dex.it.docker.{ConfigurableToxicProxyContainer, PortBindingKeeper, WavesNodeContainer} -import com.wavesplatform.dex.it.docker.ConfigurableToxicProxyContainer.ContainerProxy +import com.wavesplatform.dex.it.docker.PortBindingKeeper +import com.wavesplatform.dex.it.containers.{ConfigurableToxicProxyContainer, WavesNodeContainer} +import com.wavesplatform.dex.it.containers.ConfigurableToxicProxyContainer.ContainerProxy import scala.jdk.CollectionConverters._ diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/HasWavesNode.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasWavesNode.scala similarity index 85% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/HasWavesNode.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasWavesNode.scala index 9438c101ab..01b700eed8 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/api/node/HasWavesNode.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/HasWavesNode.scala @@ -1,12 +1,12 @@ -package com.wavesplatform.dex.it.api.node +package com.wavesplatform.dex.it.containers import cats.{FlatMap, Functor} import com.typesafe.config.{Config, ConfigFactory} -import com.wavesplatform.dex.it.api.BaseContainersKit +import com.wavesplatform.dex.it.api.node.{NodeApi, NodeApiSyntax} import com.wavesplatform.dex.it.config.GenesisConfig -import com.wavesplatform.dex.it.docker.WavesNodeContainer import com.wavesplatform.dex.it.fp.CanRepeat -import mouse.any._ + +import scala.util.chaining._ trait HasWavesNode { self: BaseContainersKit => protected val defaultNodeImage = "wavesplatform/waves-integration-it:latest" @@ -36,7 +36,7 @@ trait HasWavesNode { self: BaseContainersKit => localLogsDir, image, netAlias - ) unsafeTap addKnownContainer + ) tap addKnownContainer protected lazy val wavesNode1: WavesNodeContainer = createWavesNode("waves-1") } diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/WavesNodeContainer.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/WavesNodeContainer.scala similarity index 97% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/WavesNodeContainer.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/containers/WavesNodeContainer.scala index aed5ae0881..87e816a571 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/WavesNodeContainer.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/containers/WavesNodeContainer.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.it.docker +package com.wavesplatform.dex.it.containers import cats.tagless.FunctorK import com.dimafeng.testcontainers.GenericContainer @@ -8,9 +8,10 @@ import com.wavesplatform.dex.it.api.Transformations import com.wavesplatform.dex.it.api.node.{AsyncEnrichedNodeApi, NodeApi} import com.wavesplatform.dex.it.api.responses.node.ErrorResponse import com.wavesplatform.dex.it.cache.CachedData +import com.wavesplatform.dex.it.docker.{apiKey, ignoreWaitStrategy, MountableFileOps, PortBindingKeeper} import com.wavesplatform.dex.it.resources.getRawContentFromResource import com.wavesplatform.dex.it.sttp.LoggingSttpBackend -import com.wavesplatform.dex.settings.utils.ConfigOps.ConfigOps +import com.wavesplatform.dex.settings.ConfigOps.ConfigOps import org.testcontainers.containers.{BindMode, Network} import sttp.model.StatusCode diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/MountableFileOps.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/docker/MountableFileOps.scala similarity index 71% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/MountableFileOps.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/docker/MountableFileOps.scala index 0253be6c4e..304bc8b490 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/MountableFileOps.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/docker/MountableFileOps.scala @@ -1,16 +1,17 @@ package com.wavesplatform.dex.it.docker +import org.testcontainers.utility.MountableFile + import java.nio.charset.StandardCharsets import java.nio.file.Files -import mouse.any._ -import org.testcontainers.utility.MountableFile +import scala.util.chaining._ // Can't create an implicit for Java's MountableFile.type object MountableFileOps { def fromContent(content: String): MountableFile = MountableFile.forHostPath { - Files.createTempFile("dex-it", "").unsafeTap(Files.write(_, content getBytes StandardCharsets.UTF_8)) + Files.createTempFile("dex-it", "") tap (Files.write(_, content getBytes StandardCharsets.UTF_8)) } } diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/PortBindingKeeper.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/docker/PortBindingKeeper.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/PortBindingKeeper.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/docker/PortBindingKeeper.scala index b9ebf68420..ed4aa5f638 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/PortBindingKeeper.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/docker/PortBindingKeeper.scala @@ -8,8 +8,8 @@ import com.wavesplatform.dex.domain.utils.ScorexLogging import java.net.ServerSocket import java.util import scala.annotation.nowarn -import scala.jdk.CollectionConverters._ import scala.util.Using +import scala.jdk.CollectionConverters._ object PortBindingKeeper extends ScorexLogging { diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/package.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/docker/docker.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/docker/package.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/docker/docker.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/CanExtract.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/fp/CanExtract.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/CanExtract.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/fp/CanExtract.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/CanExtractInstances.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/fp/CanExtractInstances.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/CanExtractInstances.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/fp/CanExtractInstances.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/CanRepeat.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/fp/CanRepeat.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/CanRepeat.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/fp/CanRepeat.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/CanWait.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/fp/CanWait.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/CanWait.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/fp/CanWait.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/RepeatRequestOptions.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/fp/RepeatRequestOptions.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/RepeatRequestOptions.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/fp/RepeatRequestOptions.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/package.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/fp/fp.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/fp/package.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/fp/fp.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/matchers/FailWith.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/matchers/FailWith.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/matchers/FailWith.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/matchers/FailWith.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/matchers/ItMatchers.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/matchers/ItMatchers.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/matchers/ItMatchers.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/matchers/ItMatchers.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/resources/package.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/resources/package.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/resources/package.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/resources/package.scala diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/test/InformativeTestStart.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/test/InformativeTestStart.scala similarity index 88% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/test/InformativeTestStart.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/test/InformativeTestStart.scala index 3304f008ca..331bd53615 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/test/InformativeTestStart.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/test/InformativeTestStart.scala @@ -1,12 +1,11 @@ package com.wavesplatform.dex.it.test -import java.time.{LocalDateTime, ZoneId} - -import com.wavesplatform.dex.it.api.BaseContainersKit -import mouse.any._ -import org.scalatest._ +import com.wavesplatform.dex.it.containers.BaseContainersKit +import org.scalatest.{Args, CancelAfterFailure, Status, TestSuite} +import java.time.{LocalDateTime, ZoneId} import scala.util.{Failure, Success} +import scala.util.chaining._ trait InformativeTestStart extends TestSuite { self: BaseContainersKit => @@ -17,7 +16,7 @@ trait InformativeTestStart extends TestSuite { self: BaseContainersKit => override protected def runTest(testName: String, args: Args): Status = { if (shouldWrite(success = true)) print(s"STARTED: $testName") - super.runTest(testName, args).unsafeTap { + super.runTest(testName, args).tap { _.whenCompleted { case Success(success) => if (shouldWrite(success)) print(s"${if (success) "SUCCEEDED" else "FAILED"}: $testName") case Failure(e) => if (shouldWrite(success = false)) print(s"FAILED WITH ${e.getClass.getSimpleName}: $testName") diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/test/NoStackTraceCancelAfterFailure.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/test/NoStackTraceCancelAfterFailure.scala similarity index 81% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/test/NoStackTraceCancelAfterFailure.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/test/NoStackTraceCancelAfterFailure.scala index 60a16192ab..f6e27741ff 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/test/NoStackTraceCancelAfterFailure.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/test/NoStackTraceCancelAfterFailure.scala @@ -1,6 +1,6 @@ package com.wavesplatform.dex.it.test -import org.scalatest._ +import org.scalatest.{CancelAfterFailure, Canceled, Outcome, TestSuite} trait NoStackTraceCancelAfterFailure extends CancelAfterFailure { this: TestSuite => diff --git a/dex-test-common/src/main/scala/com/wavesplatform/dex/test/matchers/ProduceError.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/test/matchers/ProduceError.scala similarity index 95% rename from dex-test-common/src/main/scala/com/wavesplatform/dex/test/matchers/ProduceError.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/test/matchers/ProduceError.scala index 3e0804a972..aefa2f74ea 100644 --- a/dex-test-common/src/main/scala/com/wavesplatform/dex/test/matchers/ProduceError.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/test/matchers/ProduceError.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.test.matchers +package com.wavesplatform.dex.it.test.matchers import org.scalatest.matchers.{MatchResult, Matcher} diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/waves/Implicits.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/waves/Implicits.scala similarity index 100% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/waves/Implicits.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/waves/Implicits.scala index 41f9874662..c02d2a1131 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/waves/Implicits.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/waves/Implicits.scala @@ -4,8 +4,8 @@ import com.wavesplatform.dex.domain.account.{Address, KeyPair, PublicKey} import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.order.{Order, OrderType} -import com.wavesplatform.dex.domain.transaction.ExchangeTransaction import com.wavesplatform.dex.it.config.GenesisConfig +import com.wavesplatform.dex.domain.transaction.ExchangeTransaction import com.wavesplatform.transactions.account.{Address => JAddress, PrivateKey => JPrivateKey, PublicKey => JPublicKey} import com.wavesplatform.transactions.common.{Amount, AssetId, Id, Proof => JProof} import com.wavesplatform.transactions.exchange.{Order => JOrder, OrderType => JOrderType} diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/waves/MkWavesEntities.scala b/dex-common/src/test/scala/com/wavesplatform/dex/it/waves/MkWavesEntities.scala similarity index 99% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/waves/MkWavesEntities.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/it/waves/MkWavesEntities.scala index 0355da69bc..d44c3c0138 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/waves/MkWavesEntities.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/it/waves/MkWavesEntities.scala @@ -11,7 +11,7 @@ import com.wavesplatform.dex.domain.model.Normalization import com.wavesplatform.dex.domain.order.{Order, OrderType} import com.wavesplatform.dex.domain.transaction.{ExchangeTransaction, ExchangeTransactionV2} import com.wavesplatform.dex.it.config.GenesisConfig -import com.wavesplatform.dex.it.config.PredefinedAccounts.matcher +import com.wavesplatform.dex.predefined.PredefinedAccounts.matcher import com.wavesplatform.dex.it.waves.Implicits._ import com.wavesplatform.dex.it.waves.MkWavesEntities.IssueResults import com.wavesplatform.dex.waves.WavesFeeConstants._ diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/domain/order/OrderJsonSpec.scala b/dex-common/src/test/scala/com/wavesplatform/dex/order/OrderJsonSpec.scala similarity index 86% rename from waves-integration/src/test/scala/com/wavesplatform/dex/domain/order/OrderJsonSpec.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/order/OrderJsonSpec.scala index 7b835f5de3..162e048104 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/domain/order/OrderJsonSpec.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/order/OrderJsonSpec.scala @@ -1,16 +1,20 @@ -package com.wavesplatform.dex.domain.order +package com.wavesplatform.dex.order import cats.syntax.option._ -import com.wavesplatform.dex.WavesIntegrationSuiteBase import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.AssetPair +import com.wavesplatform.dex.domain.order.{Order, OrderType, OrderV3} import com.wavesplatform.dex.domain.order.OrderJson.orderFormat import com.wavesplatform.dex.domain.order.OrderOps._ +import com.wavesplatform.dex.utils.Diffs +import io.qameta.allure.scalatest.AllureScalatestContext +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.freespec.AnyFreeSpecLike import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json -class OrderJsonSpec extends WavesIntegrationSuiteBase with Matchers { +class OrderJsonSpec extends AnyFreeSpecLike with AllureScalatestContext with ScalaFutures with Diffs with Matchers { private val usd: IssuedAsset = IssuedAsset("USDN".getBytes) private val wavesUsdPair: AssetPair = AssetPair(Waves, usd) diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/PredefinedAccounts.scala b/dex-common/src/test/scala/com/wavesplatform/dex/predefined/PredefinedAccounts.scala similarity index 96% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/PredefinedAccounts.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/predefined/PredefinedAccounts.scala index 1a8d6f09bb..41eb1b92c4 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/PredefinedAccounts.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/predefined/PredefinedAccounts.scala @@ -1,12 +1,11 @@ -package com.wavesplatform.dex.it.config - -import java.nio.charset.StandardCharsets +package com.wavesplatform.dex.predefined import com.google.common.primitives.{Bytes, Ints} import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.crypto import com.wavesplatform.dex.it.config.GenesisConfig.generatorConfig +import java.nio.charset.StandardCharsets import scala.jdk.CollectionConverters._ object PredefinedAccounts extends PredefinedAccounts { diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/PredefinedAssets.scala b/dex-common/src/test/scala/com/wavesplatform/dex/predefined/PredefinedAssets.scala similarity index 96% rename from dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/PredefinedAssets.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/predefined/PredefinedAssets.scala index 1432507071..acdda8936f 100644 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/config/PredefinedAssets.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/predefined/PredefinedAssets.scala @@ -1,12 +1,12 @@ -package com.wavesplatform.dex.it.config +package com.wavesplatform.dex.predefined import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.utils.ScorexLogging -import com.wavesplatform.dex.it.config.PredefinedAccounts._ -import com.wavesplatform.dex.it.waves.Implicits._ import com.wavesplatform.dex.it.waves.MkWavesEntities.mkIssue +import com.wavesplatform.dex.predefined.PredefinedAccounts._ +import com.wavesplatform.dex.it.waves.Implicits._ import com.wavesplatform.transactions.IssueTransaction trait PredefinedAssets extends ScorexLogging { diff --git a/dex-test-common/src/main/scala/com/wavesplatform/dex/asset/DoubleOps.scala b/dex-common/src/test/scala/com/wavesplatform/dex/util/DoubleOps.scala similarity index 92% rename from dex-test-common/src/main/scala/com/wavesplatform/dex/asset/DoubleOps.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/util/DoubleOps.scala index 79c84e5ad6..0e55547d28 100644 --- a/dex-test-common/src/main/scala/com/wavesplatform/dex/asset/DoubleOps.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/util/DoubleOps.scala @@ -1,4 +1,4 @@ -package com.wavesplatform.dex.asset +package com.wavesplatform.dex.util import com.wavesplatform.dex.domain.model.Normalization diff --git a/dex-test-common/src/main/scala/com/wavesplatform/dex/NoShrink.scala b/dex-common/src/test/scala/com/wavesplatform/dex/util/NoShrink.scala similarity index 72% rename from dex-test-common/src/main/scala/com/wavesplatform/dex/NoShrink.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/util/NoShrink.scala index de15a2c8ab..72c7444c4e 100644 --- a/dex-test-common/src/main/scala/com/wavesplatform/dex/NoShrink.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/util/NoShrink.scala @@ -1,7 +1,8 @@ -package com.wavesplatform.dex +package com.wavesplatform.dex.util import org.scalacheck.Shrink trait NoShrink { + // NoShrink implicit def noShrink[A]: Shrink[A] = Shrink.withLazyList(_ => LazyList.empty) } diff --git a/dex-test-common/src/main/scala/com/wavesplatform/dex/waves/WavesFeeConstants.scala b/dex-common/src/test/scala/com/wavesplatform/dex/waves/WavesFeeConstants.scala similarity index 94% rename from dex-test-common/src/main/scala/com/wavesplatform/dex/waves/WavesFeeConstants.scala rename to dex-common/src/test/scala/com/wavesplatform/dex/waves/WavesFeeConstants.scala index 909ce348f7..601373e6d1 100644 --- a/dex-test-common/src/main/scala/com/wavesplatform/dex/waves/WavesFeeConstants.scala +++ b/dex-common/src/test/scala/com/wavesplatform/dex/waves/WavesFeeConstants.scala @@ -1,6 +1,6 @@ package com.wavesplatform.dex.waves -import com.wavesplatform.dex.asset.DoubleOps.NumericOps +import com.wavesplatform.dex.util.DoubleOps.NumericOps object WavesFeeConstants extends WavesFeeConstants diff --git a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/json/package.scala b/dex-it-common/src/main/scala/com/wavesplatform/dex/it/json/package.scala deleted file mode 100644 index a9e48a9c07..0000000000 --- a/dex-it-common/src/main/scala/com/wavesplatform/dex/it/json/package.scala +++ /dev/null @@ -1,68 +0,0 @@ -package com.wavesplatform.dex.it - -import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} -import com.wavesplatform.dex.domain.bytes.ByteStr -import com.wavesplatform.dex.domain.order.Order -import com.wavesplatform.transactions.{ExchangeTransaction, Transaction} -import play.api.libs.json._ - -import scala.util.{Failure, Success, Try} - -package object json { - - implicit val transactionFormat: Format[Transaction] = Format[Transaction]( - Reads { json => - Try(Transaction.fromJson(json.toString)) match { - case Success(x) => JsSuccess(x) - case Failure(e) => JsError(e.getMessage) - } - }, - Writes(tx => Json.parse(tx.toJson)) - ) - - implicit val byteStrFormat: Format[ByteStr] = Format( - Reads { - case JsString(str) => - ByteStr.decodeBase58(str) match { - case Success(x) => JsSuccess(x) - case Failure(e) => JsError(e.getMessage) - } - - case _ => JsError("Can't read ByteStr") - }, - Writes(x => JsString(x.toString)) - ) - - implicit val exchangeTxReads: Reads[ExchangeTransaction] = transactionFormat.map(_.asInstanceOf[ExchangeTransaction]) - - implicit val orderWrites: Writes[Order] = Writes(_.json()) - - implicit val assetPairFormat: Format[AssetPair] = AssetPair.assetPairFormat - - implicit val assetRatesReads: Reads[Map[Asset, Double]] = Reads { json => - json.validate[Map[String, Double]].map { assetRates => - assetRates.map { case (assetStr, rateValue) => AssetPair.extractAsset(assetStr).get -> rateValue } - } - } - - implicit val assetBalancesReads: Reads[Map[Asset, Long]] = Reads.map[Long].map { assetBalances => - assetBalances.map { case (assetStr, balanceValue) => AssetPair.extractAsset(assetStr).get -> balanceValue } - } - - implicit val assetPairOffsetsReads: Reads[Map[AssetPair, Long]] = Reads { json => - json.validate[Map[String, Long]].map { - _.map { - case (assetPairStr, offset) => - val assetPairStrArr = assetPairStr.split("-") - val assetPair = ( - assetPairStrArr match { - case Array(amtAssetStr, prcAssetStr) => AssetPair.createAssetPair(amtAssetStr, prcAssetStr) - case _ => throw new Exception(s"$assetPairStr (incorrect assets count, expected 2 but got ${assetPairStrArr.size})") - } - ).fold(ex => throw new Exception(s"$assetPairStr (${ex.getMessage})"), identity) - assetPair -> offset - } - } - } - -} diff --git a/dex-it/src/test/scala/com/wavesplatform/it/MatcherSuiteBase.scala b/dex-it/src/test/scala/com/wavesplatform/it/MatcherSuiteBase.scala index 38f415df2f..910e243495 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/MatcherSuiteBase.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/MatcherSuiteBase.scala @@ -4,21 +4,20 @@ import cats.instances.FutureInstances import cats.syntax.either._ import com.softwaremill.diffx.{Derived, Diff} import com.wavesplatform.dex.api.http.entities.HttpV0OrderBook -import com.wavesplatform.dex.asset.DoubleOps import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.domain.order.OrderType.BUY import com.wavesplatform.dex.domain.utils.ScorexLogging -import com.wavesplatform.dex.it.api.BaseContainersKit -import com.wavesplatform.dex.it.api.dex.HasDex -import com.wavesplatform.dex.it.api.node.HasWavesNode -import com.wavesplatform.dex.it.config.{GenesisConfig, PredefinedAccounts, PredefinedAssets} +import com.wavesplatform.dex.it.config.GenesisConfig +import com.wavesplatform.dex.it.containers.{BaseContainersKit, HasDex, HasWavesNode} import com.wavesplatform.dex.it.matchers.ItMatchers import com.wavesplatform.dex.it.test.{InformativeTestStart, NoStackTraceCancelAfterFailure} import com.wavesplatform.dex.it.waves.{MkWavesEntities, ToWavesJConversions} -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.predefined.{PredefinedAccounts, PredefinedAssets} +import com.wavesplatform.dex.util.DoubleOps +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import com.wavesplatform.dex.waves.WavesFeeConstants import com.wavesplatform.it.api.ApiExtensions import com.wavesplatform.transactions.ExchangeTransaction diff --git a/dex-it/src/test/scala/com/wavesplatform/it/WsSuiteBase.scala b/dex-it/src/test/scala/com/wavesplatform/it/WsSuiteBase.scala index af7c4aa6d7..a30ad8af84 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/WsSuiteBase.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/WsSuiteBase.scala @@ -5,9 +5,9 @@ import com.softwaremill.diffx.{Derived, Diff} import com.wavesplatform.dex.api.ws.connection.WsConnection import com.wavesplatform.dex.api.ws.connection.WsConnection.WsRawMessage import com.wavesplatform.dex.api.ws.entities.WsFullOrder -import com.wavesplatform.dex.api.ws.protocol.{WsAddressChanges, WsError, WsOrderBookChanges, WsPingOrPong, WsServerMessage} +import com.wavesplatform.dex.api.ws.protocol._ import com.wavesplatform.dex.it.api.websockets.HasWebSockets -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import scala.concurrent.duration.{DurationInt, FiniteDuration} import scala.reflect.ClassTag diff --git a/dex-it/src/test/scala/com/wavesplatform/it/api/ApiExtensions.scala b/dex-it/src/test/scala/com/wavesplatform/it/api/ApiExtensions.scala index c57f53425a..53a3592f21 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/api/ApiExtensions.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/api/ApiExtensions.scala @@ -1,7 +1,6 @@ package com.wavesplatform.it.api import java.util.concurrent.ThreadLocalRandom - import cats.Id import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.api.http.entities.{HttpOrderBookHistoryItem, HttpOrderStatus} @@ -10,7 +9,7 @@ import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.it.api.dex.DexApi import com.wavesplatform.dex.it.api.node.{NodeApi, NodeApiExtensions} -import com.wavesplatform.dex.it.docker.DexContainer +import com.wavesplatform.dex.it.containers.DexContainer import com.wavesplatform.it.{api, MatcherSuiteBase} import com.wavesplatform.transactions.ExchangeTransaction import mouse.any._ diff --git a/dex-it/src/test/scala/com/wavesplatform/it/api/MatcherCommand.scala b/dex-it/src/test/scala/com/wavesplatform/it/api/MatcherCommand.scala index 49ca3bd4e0..f3d2521ff2 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/api/MatcherCommand.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/api/MatcherCommand.scala @@ -2,7 +2,7 @@ package com.wavesplatform.it.api import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.order.Order -import com.wavesplatform.dex.it.docker.DexContainer +import com.wavesplatform.dex.it.containers.DexContainer sealed trait MatcherCommand extends Product with Serializable diff --git a/dex-it/src/test/scala/com/wavesplatform/it/config/DexTestConfig.scala b/dex-it/src/test/scala/com/wavesplatform/it/config/DexTestConfig.scala index fc54e4108e..12929c6359 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/config/DexTestConfig.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/config/DexTestConfig.scala @@ -5,15 +5,15 @@ import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.Asset.IssuedAsset import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.bytes.ByteStr -import com.wavesplatform.dex.it.waves.Implicits._ -import com.wavesplatform.dex.it.waves.MkWavesEntities._ +import com.wavesplatform.dex.it.waves.MkWavesEntities.{mkIssue, mkIssueExtended, IssueResults} import com.wavesplatform.dex.model.AssetPairBuilder -import com.wavesplatform.dex.waves.WavesFeeConstants._ +import com.wavesplatform.dex.waves.WavesFeeConstants.{issueFee, someAssetAmount} import com.wavesplatform.transactions.IssueTransaction +import com.wavesplatform.dex.it.waves.ToWavesJConversions import scala.util.Random -object DexTestConfig { +object DexTestConfig extends ToWavesJConversions { val orderLimit = 10 diff --git a/dex-it/src/test/scala/com/wavesplatform/it/it.scala b/dex-it/src/test/scala/com/wavesplatform/it/it.scala index bcd432f6d4..c5bdecd07a 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/it.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/it.scala @@ -5,7 +5,7 @@ import com.wavesplatform.dex.domain.account.{KeyPair, PublicKey} import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.order.{Order, OrderType} import com.wavesplatform.dex.error.OrderNotFound -import com.wavesplatform.dex.waves.WavesFeeConstants._ +import com.wavesplatform.dex.waves.WavesFeeConstants.matcherFee import com.wavesplatform.it.api.MatcherCommand import org.scalacheck.Gen import org.scalatest.concurrent.ScalaFutures._ diff --git a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/debug/GetMatcherConfigSpec.scala b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/debug/GetMatcherConfigSpec.scala index b19744c519..497d383218 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/debug/GetMatcherConfigSpec.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/debug/GetMatcherConfigSpec.scala @@ -1,6 +1,6 @@ package com.wavesplatform.it.matcher.api.http.debug -import com.wavesplatform.dex.settings.utils.ConfigOps.ConfigOps +import com.wavesplatform.dex.settings.ConfigOps.ConfigOps import com.wavesplatform.it.MatcherSuiteBase import com.wavesplatform.it.matcher.api.http.ApiKeyHeaderChecks diff --git a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/debug/GetMatcherStatusSpec.scala b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/debug/GetMatcherStatusSpec.scala index 736be705e4..6f52e1449c 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/debug/GetMatcherStatusSpec.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/debug/GetMatcherStatusSpec.scala @@ -1,7 +1,6 @@ package com.wavesplatform.it.matcher.api.http.debug -import com.wavesplatform.dex.app.MatcherStatus -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream +import com.wavesplatform.dex.statuses.{CombinedStreamStatus, MatcherStatus} import com.wavesplatform.it.MatcherSuiteBase import com.wavesplatform.it.matcher.api.http.ApiKeyHeaderChecks @@ -11,7 +10,7 @@ class GetMatcherStatusSpec extends MatcherSuiteBase with ApiKeyHeaderChecks { "should return matcher status" in { eventually { val httpSystemStatus = validate200Json(dex1.rawApi.getMatcherStatus) - httpSystemStatus.blockchain shouldBe a[CombinedStream.Status.Working] + httpSystemStatus.blockchain shouldBe a[CombinedStreamStatus.Working] httpSystemStatus.service shouldBe MatcherStatus.Working } } diff --git a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/http.scala b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/http.scala index ab8b63118c..5ac59047fe 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/http.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/http.scala @@ -1,9 +1,9 @@ package com.wavesplatform.it.matcher.api import com.wavesplatform.dex.api.http.entities.HttpOrderBookHistoryItem -import com.wavesplatform.dex.asset.DoubleOps.NumericOps -import com.wavesplatform.dex.domain.order.Order -import com.wavesplatform.dex.model.{AcceptedOrderType, OrderStatus} +import com.wavesplatform.dex.util.DoubleOps.NumericOps +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order} +import com.wavesplatform.dex.model.OrderStatus package object http { diff --git a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/markets/GetOrderBookStatusSpec.scala b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/markets/GetOrderBookStatusSpec.scala index 7d6e775785..6490ae3641 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/markets/GetOrderBookStatusSpec.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/markets/GetOrderBookStatusSpec.scala @@ -2,12 +2,11 @@ package com.wavesplatform.it.matcher.api.http.markets import sttp.model.StatusCode import com.typesafe.config.{Config, ConfigFactory} -import com.wavesplatform.dex.api.http.entities.HttpOrderBookStatus +import com.wavesplatform.dex.api.http.entities.{HttpLastTrade, HttpLevelAgg, HttpOrderBookStatus} import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} import com.wavesplatform.dex.error.{AssetNotFound, InvalidAsset, OrderAssetPairReversed} import com.wavesplatform.dex.it.api.RawHttpChecks -import com.wavesplatform.dex.model.{LastTrade, LevelAgg} import com.wavesplatform.it.MatcherSuiteBase import org.scalatest.prop.TableDrivenPropertyChecks @@ -73,9 +72,9 @@ class GetOrderBookStatusSpec extends MatcherSuiteBase with TableDrivenPropertyCh Some(1.waves) )) - status.lastTrade.get should be(LastTrade(1.9.usd, 1.waves, BUY)) - status.bestBid.get should be(LevelAgg(10.waves, 1.1.usd)) - status.bestAsk.get should be(LevelAgg(1.waves, 1.9.usd)) + status.lastTrade.get should be(HttpLastTrade(1.9.usd, 1.waves, BUY)) + status.bestBid.get should be(HttpLevelAgg(10.waves, 1.1.usd)) + status.bestAsk.get should be(HttpLevelAgg(1.waves, 1.9.usd)) } withClue("- trade (best sell order fully filled)") { @@ -92,9 +91,9 @@ class GetOrderBookStatusSpec extends MatcherSuiteBase with TableDrivenPropertyCh Some(4.waves) )) - status.lastTrade.get should be(LastTrade(1.9.usd, 1.waves, BUY)) - status.bestBid.get should be(LevelAgg(10.waves, 1.1.usd)) - status.bestAsk.get should be(LevelAgg(4.waves, 2.usd)) + status.lastTrade.get should be(HttpLastTrade(1.9.usd, 1.waves, BUY)) + status.bestBid.get should be(HttpLevelAgg(10.waves, 1.1.usd)) + status.bestAsk.get should be(HttpLevelAgg(4.waves, 2.usd)) } } diff --git a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/status/GetOrderStatusByPKAndIdWithSigSpec.scala b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/status/GetOrderStatusByPKAndIdWithSigSpec.scala index bde1b2becc..6d8537a5f2 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/status/GetOrderStatusByPKAndIdWithSigSpec.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/matcher/api/http/status/GetOrderStatusByPKAndIdWithSigSpec.scala @@ -7,10 +7,10 @@ import com.wavesplatform.dex.api.http.entities.HttpOrderBookHistoryItem import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.domain.bytes.codec.Base58 import com.wavesplatform.dex.domain.crypto +import com.wavesplatform.dex.domain.order.AcceptedOrderType import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} import com.wavesplatform.dex.error.{InvalidBase58String, OrderNotFound} import com.wavesplatform.dex.it.api.RawHttpChecks -import com.wavesplatform.dex.model.AcceptedOrderType import com.wavesplatform.it.MatcherSuiteBase import org.scalatest.prop.TableDrivenPropertyChecks diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/AutoCancelOrderTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/AutoCancelOrderTestSuite.scala index a035592d60..2e7c7352fe 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/AutoCancelOrderTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/AutoCancelOrderTestSuite.scala @@ -7,7 +7,7 @@ import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.order.OrderType import com.wavesplatform.dex.effect.Implicits.FutureCompanionOps -import com.wavesplatform.dex.it.docker.DexContainer +import com.wavesplatform.dex.it.containers.DexContainer import com.wavesplatform.it.MatcherSuiteBase import com.wavesplatform.it.tags.DexItExternalKafkaRequired import com.wavesplatform.transactions.ExchangeTransaction diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/BouncingBalancesTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/BouncingBalancesTestSuite.scala index ca180236de..a0d83eb16c 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/BouncingBalancesTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/BouncingBalancesTestSuite.scala @@ -3,14 +3,15 @@ package com.wavesplatform.it.sync import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.api.ws.connection.WsConnection -import com.wavesplatform.dex.api.ws.entities.{WsBalances, WsOrder} +import com.wavesplatform.dex.api.ws.converters.WsOrderConverter +import com.wavesplatform.dex.api.ws.entities.WsBalances import com.wavesplatform.dex.api.ws.protocol.WsAddressChanges import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.order.OrderType import com.wavesplatform.dex.domain.order.OrderType.SELL import com.wavesplatform.dex.error.ErrorFormatterContext -import com.wavesplatform.dex.it.docker.WavesNodeContainer +import com.wavesplatform.dex.it.containers.WavesNodeContainer import com.wavesplatform.dex.it.waves.MkWavesEntities.IssueResults import com.wavesplatform.dex.model.LimitOrder import com.wavesplatform.dex.tool.Using._ @@ -106,7 +107,7 @@ class BouncingBalancesTestSuite extends WsSuiteBase { assertChanges(wsc)( Map(Waves -> WsBalances(4949949.997, 0.003)), // Fee for order Map(doggyCoin -> WsBalances(0, 1000000)) - )(WsOrder.fromDomain(LimitOrder(bobOrder))) + )(WsOrderConverter.fromDomain(LimitOrder(bobOrder))) wsc.clearMessages() dex1.api.orderStatusByAssetPairAndId(bobOrder).status shouldBe Status.Accepted diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/BroadcastUntilConfirmedTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/BroadcastUntilConfirmedTestSuite.scala index 8e31906785..b61f3817d8 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/BroadcastUntilConfirmedTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/BroadcastUntilConfirmedTestSuite.scala @@ -2,7 +2,7 @@ package com.wavesplatform.it.sync import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.domain.order.OrderType -import com.wavesplatform.dex.it.docker.WavesNodeContainer +import com.wavesplatform.dex.it.containers.WavesNodeContainer import com.wavesplatform.it.MatcherSuiteBase class BroadcastUntilConfirmedTestSuite extends MatcherSuiteBase { diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/MarketOrderTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/MarketOrderTestSuite.scala index f97ccb60f1..eb1ea5da40 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/MarketOrderTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/MarketOrderTestSuite.scala @@ -7,9 +7,8 @@ import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} -import com.wavesplatform.dex.domain.order.{Order, OrderType} +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order, OrderType} import com.wavesplatform.dex.error.InvalidMarketOrderPrice -import com.wavesplatform.dex.model.AcceptedOrderType import com.wavesplatform.it.MatcherSuiteBase import com.wavesplatform.it.sync.MarketOrderTestSuite.FeeMode diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/MatcherTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/MatcherTestSuite.scala index 87549af63c..ae8bed04a7 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/MatcherTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/MatcherTestSuite.scala @@ -10,11 +10,11 @@ import com.wavesplatform.dex.api.http.headers.MatcherHttpServer import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.order.OrderType._ -import com.wavesplatform.dex.domain.order.{Order, OrderType} +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order, OrderType} import com.wavesplatform.dex.error.{AssetNotFound, BalanceNotEnough, OrderNotFound, PriceLastDecimalsMustBeZero, UserPublicKeyIsNotValid} import com.wavesplatform.dex.it.api.responses.dex._ import com.wavesplatform.dex.it.waves.MkWavesEntities.IssueResults -import com.wavesplatform.dex.model.{AcceptedOrderType, OrderStatus} +import com.wavesplatform.dex.model.OrderStatus import com.wavesplatform.it.MatcherSuiteBase import com.wavesplatform.it.config.DexTestConfig.issueAssetPair import com.wavesplatform.it.tags.SmokeTests diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/MatcherTickerTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/MatcherTickerTestSuite.scala index 7074eaff1a..d5acb385dd 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/MatcherTickerTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/MatcherTickerTestSuite.scala @@ -1,11 +1,11 @@ package com.wavesplatform.it.sync import com.typesafe.config.{Config, ConfigFactory} +import com.wavesplatform.dex.api.http.entities.{HttpLastTrade, HttpLevelAgg} import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.order.OrderType -import com.wavesplatform.dex.model.{LastTrade, LevelAgg} import com.wavesplatform.it.MatcherSuiteBase class MatcherTickerTestSuite extends MatcherSuiteBase { @@ -37,7 +37,7 @@ class MatcherTickerTestSuite extends MatcherSuiteBase { val r = dex1.api.getOrderBookStatus(btcUsdPair) r.lastTrade shouldBe None - r.bestBid should matchTo(Option(LevelAgg(2 * bidAmount, bidPrice))) + r.bestBid should matchTo(Option(HttpLevelAgg(2 * bidAmount, bidPrice))) r.bestAsk shouldBe None } @@ -48,7 +48,7 @@ class MatcherTickerTestSuite extends MatcherSuiteBase { val r = dex1.api.getOrderBookStatus(btcWavesPair) r.lastTrade shouldBe None r.bestBid shouldBe None - r.bestAsk should matchTo(Option(LevelAgg(2 * askAmount, askPrice))) + r.bestAsk should matchTo(Option(HttpLevelAgg(2 * askAmount, askPrice))) } "place ask order for first pair" in { @@ -57,33 +57,33 @@ class MatcherTickerTestSuite extends MatcherSuiteBase { val r = dex1.api.getOrderBookStatus(btcUsdPair) r.lastTrade shouldBe None - r.bestBid should matchTo(Option(LevelAgg(2 * bidAmount, bidPrice))) - r.bestAsk should matchTo(Option(LevelAgg(2 * askAmount, askPrice))) + r.bestBid should matchTo(Option(HttpLevelAgg(2 * bidAmount, bidPrice))) + r.bestAsk should matchTo(Option(HttpLevelAgg(2 * askAmount, askPrice))) } "match bid order for first pair" in { placeAndAwaitAtDex(mkOrder(bob, btcUsdPair, OrderType.SELL, askAmount, bidPrice), Status.Filled) val r1 = dex1.api.getOrderBookStatus(btcUsdPair) - r1.lastTrade should matchTo(Option(LastTrade(bidPrice, askAmount, OrderType.SELL))) - r1.bestBid should matchTo(Option(LevelAgg(2 * bidAmount - askAmount, bidPrice))) - r1.bestAsk should matchTo(Option(LevelAgg(2 * askAmount, askPrice))) + r1.lastTrade should matchTo(Option(HttpLastTrade(bidPrice, askAmount, OrderType.SELL))) + r1.bestBid should matchTo(Option(HttpLevelAgg(2 * bidAmount - askAmount, bidPrice))) + r1.bestAsk should matchTo(Option(HttpLevelAgg(2 * askAmount, askPrice))) placeAndAwaitAtDex(mkOrder(bob, btcUsdPair, OrderType.SELL, 3 * askAmount, bidPrice), Status.Filled) val r2 = dex1.api.getOrderBookStatus(btcUsdPair) r2.lastTrade should matchTo { - Option(LastTrade(bidPrice, 2 * askAmount, OrderType.SELL)) + Option(HttpLastTrade(bidPrice, 2 * askAmount, OrderType.SELL)) } // second BUY order (bidAmount = 2 * askAmount) filled r2.bestBid shouldBe None - r2.bestAsk should matchTo(Option(LevelAgg(2 * askAmount, askPrice))) + r2.bestAsk should matchTo(Option(HttpLevelAgg(2 * askAmount, askPrice))) } "match ask order for first pair" in { placeAndAwaitAtDex(mkOrder(alice, btcUsdPair, OrderType.BUY, bidAmount, askPrice), Status.Filled) val r = dex1.api.getOrderBookStatus(btcUsdPair) - r.lastTrade should matchTo(Option(LastTrade(askPrice, askAmount, OrderType.BUY))) // second SELL order filled + r.lastTrade should matchTo(Option(HttpLastTrade(askPrice, askAmount, OrderType.BUY))) // second SELL order filled r.bestBid shouldBe None r.bestAsk shouldBe None } diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/MultipleMatchersTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/MultipleMatchersTestSuite.scala index 89ae4184bc..547cc7abd6 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/MultipleMatchersTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/MultipleMatchersTestSuite.scala @@ -14,7 +14,7 @@ import com.wavesplatform.dex.domain.order.{Order, OrderType} import com.wavesplatform.dex.error.OrderCanceled import com.wavesplatform.dex.it.api.dex.DexApi import com.wavesplatform.dex.it.api.websockets.HasWebSockets -import com.wavesplatform.dex.it.docker.DexContainer +import com.wavesplatform.dex.it.containers.DexContainer import com.wavesplatform.dex.tool.Using._ import com.wavesplatform.it._ import com.wavesplatform.it.api.{MatcherCommand, MatcherState} diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/ReBroadcastUntilConfirmedTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/ReBroadcastUntilConfirmedTestSuite.scala index e2e7c8cd97..65e76fe911 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/ReBroadcastUntilConfirmedTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/ReBroadcastUntilConfirmedTestSuite.scala @@ -2,7 +2,7 @@ package com.wavesplatform.it.sync import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.domain.order.OrderType -import com.wavesplatform.dex.it.docker.WavesNodeContainer +import com.wavesplatform.dex.it.containers.WavesNodeContainer import com.wavesplatform.it.MatcherSuiteBase import org.scalatest.EitherValues diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsAddressStreamTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsAddressStreamTestSuite.scala index 3dadd75dd5..d4af231afa 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsAddressStreamTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsAddressStreamTestSuite.scala @@ -6,6 +6,7 @@ import com.wavesplatform.dex.Implicits.releasable import com.wavesplatform.dex.api.http.entities.HttpOrderStatus import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.api.ws.connection.WsConnection +import com.wavesplatform.dex.api.ws.converters.WsOrderConverter import com.wavesplatform.dex.api.ws.entities.{WsAddressFlag, WsBalances, WsMatchTransactionInfo, WsOrder} import com.wavesplatform.dex.api.ws.protocol.{WsAddressChanges, WsAddressSubscribe, WsError, WsUnsubscribe} import com.wavesplatform.dex.domain.account.KeyPair @@ -14,12 +15,12 @@ import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.model.Denormalization -import com.wavesplatform.dex.domain.order.OrderType +import com.wavesplatform.dex.domain.order.{OrderStatusNames, OrderType} import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} import com.wavesplatform.dex.error.{AddressAndPublicKeyAreIncompatible, SubscriptionTokenExpired, SubscriptionsLimitReached} import com.wavesplatform.dex.it.test.Scripts import com.wavesplatform.dex.it.waves.MkWavesEntities.IssueResults -import com.wavesplatform.dex.model.{LimitOrder, MarketOrder, OrderStatus} +import com.wavesplatform.dex.model.{LimitOrder, MarketOrder} import com.wavesplatform.dex.tool.Using._ import com.wavesplatform.it.WsSuiteBase import org.scalatest.prop.TableDrivenPropertyChecks @@ -143,18 +144,18 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck Map(usd -> WsBalances(50, 100), Waves -> WsBalances(9.997, 0.003)), Map(usd -> WsBalances(39.70, 110.30)) )( - WsOrder.fromDomain(LimitOrder(bo1)), - WsOrder.fromDomain(LimitOrder(bo2)) + WsOrderConverter.fromDomain(LimitOrder(bo1)), + WsOrderConverter.fromDomain(LimitOrder(bo2)) ) cancelAndAwait(acc, bo1) assertChanges(wsc, squash = false)(Map(usd -> WsBalances(139.70, 10.30), Waves -> WsBalances(10, 0)))( - WsOrder.fromOrder(bo1, status = OrderStatus.Cancelled.name.some) + WsOrder.fromOrder(bo1, status = OrderStatusNames.CANCELLED.some) ) cancelAndAwait(acc, bo2) assertChanges(wsc, squash = false)(Map(usd -> WsBalances(150, 0)))( - WsOrder.fromOrder(bo2, status = OrderStatus.Cancelled.name.some) + WsOrder.fromOrder(bo2, status = OrderStatusNames.CANCELLED.some) ) } } @@ -185,10 +186,10 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck Map(usd -> WsBalances(45.5, 0)), Map(usd -> WsBalances(55.5, 0)) )( - WsOrder.fromDomain(mo), + WsOrderConverter.fromDomain(mo), WsOrder.fromOrder( mo.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 15.0.some, filledFee = 0.0009.some, avgWeighedPrice = 1.2.some, @@ -197,7 +198,7 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck ), WsOrder.fromOrder( mo.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 40.0.some, filledFee = 0.0024.some, avgWeighedPrice = 1.1375.some, @@ -206,7 +207,7 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck ), WsOrder.fromOrder( mo.order, - status = OrderStatus.Filled.name.some, + status = OrderStatusNames.FILLED.some, filledAmount = 50.0.some, filledFee = 0.003.some, avgWeighedPrice = 1.11.some, @@ -236,10 +237,10 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck // since balance increasing comes after transaction mining, + 10 - 0.003, Waves balance on Node = 19.997 Map(Waves -> WsBalances(19.997, 0)) )( - WsOrder.fromDomain(LimitOrder(bo)), + WsOrderConverter.fromDomain(LimitOrder(bo)), WsOrder.fromOrder( bo, - status = OrderStatus.Filled.name.some, + status = OrderStatusNames.FILLED.some, filledAmount = 10.0.some, filledFee = 0.003.some, avgWeighedPrice = 1.0.some, @@ -277,11 +278,11 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck wsc.orderChanges.squashed should matchTo( Map( - limitOrder.id -> WsOrder + limitOrder.id -> WsOrderConverter .fromDomain(limitOrder) .copy( id = limitOrder.id, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 5.0.some, filledFee = 0.0015.some, avgWeighedPrice = 1.0.some, @@ -298,7 +299,7 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck eventually { wsc.balanceChanges.squashed should matchTo(Map(usd -> WsBalances(5, 0), Waves -> WsBalances(14.9985, 0))) wsc.orderChanges.squashed should matchTo( - Map(limitOrder.id -> WsOrder.fromOrder(bo, status = OrderStatus.Cancelled.name.some)) + Map(limitOrder.id -> WsOrder.fromOrder(bo, status = OrderStatusNames.CANCELLED.some)) ) } } @@ -525,10 +526,10 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck placeAndAwaitAtDex(firstCounterOrder, Status.Filled) eventually(wsc.orderChanges should matchTo(List( - WsOrder.fromDomain(LimitOrder(order)), + WsOrderConverter.fromDomain(LimitOrder(order)), WsOrder.fromOrder( order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 4.5.some, filledFee = 0.00135.some, avgWeighedPrice = 1.0.some, @@ -543,7 +544,7 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck eventually(wsc.orderChanges should matchTo(List(WsOrder.fromOrder( order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 8.5.some, filledFee = 0.00255.some, avgWeighedPrice = 1.0.some, @@ -560,7 +561,7 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck val order = mkOrder(acc, wavesUsdPair, OrderType.SELL, 10.waves, 1.usd) placeAndAwaitAtDex(order) - eventually(wsc.orderChanges should matchTo(List(WsOrder.fromDomain(LimitOrder(order))))) + eventually(wsc.orderChanges should matchTo(List(WsOrderConverter.fromDomain(LimitOrder(order))))) wsc.clearMessages() val counterOrder = mkOrder(alice, wavesUsdPair, OrderType.BUY, 10.waves, 1.usd) @@ -568,7 +569,7 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck eventually(wsc.orderChanges should matchTo(List(WsOrder.fromOrder( order, - status = OrderStatus.Filled.name.some, + status = OrderStatusNames.FILLED.some, filledAmount = 10.0.some, filledFee = 0.003.some, avgWeighedPrice = 1.0.some, @@ -594,11 +595,11 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck dex1.api.placeMarket(accountsOrder) dex1.api.waitForOrderStatus(accountsOrder, Status.Filled) - eventually(wsc.orderChanges.squashed(accountsOrder.id()) should matchTo(WsOrder.fromDomain(MarketOrder( + eventually(wsc.orderChanges.squashed(accountsOrder.id()) should matchTo(WsOrderConverter.fromDomain(MarketOrder( accountsOrder, Long.MaxValue )).copy( - status = OrderStatus.Filled.name.some, + status = OrderStatusNames.FILLED.some, filledAmount = 50.0.some, filledFee = 0.003.some, avgWeighedPrice = 1.2.some, @@ -614,7 +615,7 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck "when trading with itself" in { def copyWithCommonPart(wsOrder: WsOrder): WsOrder = wsOrder.copy( - status = OrderStatus.Filled.name.some, + status = OrderStatusNames.FILLED.some, filledAmount = 10.0.some, filledFee = 0.003.some, avgWeighedPrice = 1.0.some, @@ -633,10 +634,10 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck eventually { val orderChanges = wsc.orderChanges.squashed orderChanges(order1.id()) should matchTo( - copyWithCommonPart(WsOrder.fromDomain(LimitOrder(order1))) + copyWithCommonPart(WsOrderConverter.fromDomain(LimitOrder(order1))) ) orderChanges(order2.id()) should matchTo( - copyWithCommonPart(WsOrder.fromDomain(LimitOrder(order2))) + copyWithCommonPart(WsOrderConverter.fromDomain(LimitOrder(order2))) ) orderChanges(order1.id()).matchInfo.head.txId shouldBe orderChanges(order2.id()).matchInfo.head.txId @@ -666,14 +667,14 @@ class WsAddressStreamTestSuite extends WsSuiteBase with TableDrivenPropertyCheck Map(usd -> WsBalances(400, 100), Waves -> WsBalances(9.997, 0.003)), Map(usd -> WsBalances(300, 200), Waves -> WsBalances(9.994, 0.006)) )( - WsOrder.fromDomain(LimitOrder(bo1)), - WsOrder.fromDomain(LimitOrder(bo2)) + WsOrderConverter.fromDomain(LimitOrder(bo1)), + WsOrderConverter.fromDomain(LimitOrder(bo2)) ) Using.resource(mkWsAddressConnection(acc, dex1)) { wsc2 => assertChanges(wsc2)(Map(Waves -> WsBalances(9.994, 0.006), usd -> WsBalances(300, 200)))( - WsOrder.fromDomain(LimitOrder(bo1)), - WsOrder.fromDomain(LimitOrder(bo2)) + WsOrderConverter.fromDomain(LimitOrder(bo1)), + WsOrderConverter.fromDomain(LimitOrder(bo2)) ) } } diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsConnectionTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsConnectionTestSuite.scala index beffdef452..8e5cabc16b 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsConnectionTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsConnectionTestSuite.scala @@ -5,10 +5,10 @@ import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.Implicits.releasable import com.wavesplatform.dex.api.http.entities.HttpWebSocketConnections import com.wavesplatform.dex.api.ws.connection.WsConnection -import com.wavesplatform.dex.api.ws.protocol._ +import com.wavesplatform.dex.api.ws.protocol.{WsAddressChanges, WsAddressSubscribe, WsOrderBookChanges, WsOrderBookSubscribe, WsUnsubscribe} import com.wavesplatform.dex.domain.order.OrderType.SELL import com.wavesplatform.dex.fp.MapImplicits.MapNumericOps -import com.wavesplatform.dex.it.docker.DexContainer +import com.wavesplatform.dex.it.containers.DexContainer import com.wavesplatform.dex.tool.Using._ import com.wavesplatform.it.WsSuiteBase diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsImaginaryTransactionsTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsImaginaryTransactionsTestSuite.scala index 3e0816e52b..92125e8275 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsImaginaryTransactionsTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsImaginaryTransactionsTestSuite.scala @@ -9,8 +9,7 @@ import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.order.OrderType import com.wavesplatform.dex.domain.transaction.ExchangeTransaction.Id -import com.wavesplatform.dex.it.api.HasKafka -import com.wavesplatform.dex.it.docker.DexContainer +import com.wavesplatform.dex.it.containers.{DexContainer, HasKafka} import com.wavesplatform.it.WsSuiteBase import java.util.concurrent.atomic.AtomicLong diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsInternalStreamTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsInternalStreamTestSuite.scala index 07f3ddaeb3..61e1346bdf 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsInternalStreamTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsInternalStreamTestSuite.scala @@ -6,7 +6,7 @@ import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.api.ws.connection.WsConnection import com.wavesplatform.dex.api.ws.entities.WsFullOrder import com.wavesplatform.dex.api.ws.entities.WsFullOrder.WsExecutionInfo -import com.wavesplatform.dex.api.ws.protocol.WsOrdersUpdate +import com.wavesplatform.dex.api.ws.protocol._ import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.model.Denormalization import com.wavesplatform.dex.domain.order.{Order, OrderType} diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsOrderBookStreamTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsOrderBookStreamTestSuite.scala index 9b45f455bd..cefb32dafa 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsOrderBookStreamTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsOrderBookStreamTestSuite.scala @@ -6,9 +6,8 @@ import com.wavesplatform.dex.Implicits.releasable import com.wavesplatform.dex.api.http.entities.HttpOrderStatus import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.api.ws.connection.WsConnection -import com.wavesplatform.dex.api.ws.entities.{WsLastTrade, WsOrderBookSettings} -import com.wavesplatform.dex.api.ws.protocol -import com.wavesplatform.dex.api.ws.protocol.{WsError, WsOrderBookChanges, WsOrderBookSubscribe, WsUnsubscribe} +import com.wavesplatform.dex.api.ws.entities.{WsLastTrade, WsOrderBookRestrictions, WsOrderBookSettings} +import com.wavesplatform.dex.api.ws.protocol._ import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.AssetPair @@ -16,7 +15,7 @@ import com.wavesplatform.dex.domain.order.OrderType import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} import com.wavesplatform.dex.error.{AmountAssetBlacklisted, OrderAssetPairReversed, OrderBookStopped, SubscriptionsLimitReached} import com.wavesplatform.dex.it.waves.MkWavesEntities.IssueResults -import com.wavesplatform.dex.settings.{DenormalizedMatchingRule, OrderRestrictionsSettings} +import com.wavesplatform.dex.settings.DenormalizedMatchingRule import com.wavesplatform.dex.tool.Using._ import com.wavesplatform.it.api.MatcherCommand import com.wavesplatform.it.{executeCommands, WsSuiteBase} @@ -31,7 +30,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { private val carol: KeyPair = mkKeyPair("carol") private val orderBookSettings: Option[WsOrderBookSettings] = WsOrderBookSettings( - OrderRestrictionsSettings( + WsOrderBookRestrictions( stepAmount = 0.00000001, minAmount = 0.0000001, maxAmount = 200000000, @@ -106,7 +105,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { buffer0 should have size 1 buffer0.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = ethWavesPair, asks = TreeMap(199d -> 1d), bids = TreeMap.empty, @@ -126,7 +125,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { buffer.size should (be >= 1 and be <= 2) buffer.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = ethWavesPair, asks = TreeMap(200d -> 1d), bids = TreeMap.empty, @@ -155,7 +154,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { } buffer0 should have size 1 buffer0.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = wavesBtcPair, asks = TreeMap.empty, bids = TreeMap.empty, @@ -174,7 +173,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { } buffer1 should have size 1 buffer1.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = wavesBtcPair, asks = TreeMap.empty, bids = TreeMap(0.00011403d -> 1.05d), @@ -195,7 +194,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { buffer2 should have size 1 buffer2.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = wavesBtcPair, asks = TreeMap(0.00012d -> 1d), bids = TreeMap(0.00011403d -> 1.05d), @@ -216,7 +215,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { buffer3.size should (be >= 1 and be <= 2) buffer3.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = wavesBtcPair, asks = TreeMap(0.00012d -> 0.5d), bids = TreeMap(0.00011403d -> 1.05d), @@ -244,7 +243,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { buffer4.size should (be >= 1 and be <= 2) buffer4.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = wavesBtcPair, asks = TreeMap( 0.00012d -> 0.5d, @@ -280,7 +279,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { val buffer = wsc.receiveAtLeastN[WsOrderBookChanges](1) buffer should have size 1 buffer.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = wavesBtcPair, asks = TreeMap.empty, bids = TreeMap(0.00012d -> 1d), @@ -301,7 +300,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { val buffer = wsc.receiveAtLeastN[WsOrderBookChanges](1) buffer.size should (be >= 1 and be <= 2) buffer.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = wavesBtcPair, asks = TreeMap(0.00012d -> 0.5d), bids = TreeMap(0.00012d -> 0d), @@ -325,7 +324,7 @@ class WsOrderBookStreamTestSuite extends WsSuiteBase { val buffer = wsc.receiveAtLeastN[WsOrderBookChanges](1) buffer.size shouldBe 1 buffer.squashed.values.head should matchTo( - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = wavesBtcPair, asks = TreeMap(0.00012d -> 0d), bids = TreeMap.empty, diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsPingPongBaseSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsPingPongBaseSuite.scala index f367fea6f2..1d24deb6b0 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsPingPongBaseSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsPingPongBaseSuite.scala @@ -2,11 +2,11 @@ package com.wavesplatform.it.sync.api.ws import akka.http.scaladsl.model.Uri import akka.http.scaladsl.model.ws.TextMessage -import com.wavesplatform.dex.api.ws.connection.WsConnection -import com.wavesplatform.dex.api.ws.protocol._ import com.wavesplatform.dex.error.{InvalidJson, WsConnectionPongTimeout} import com.wavesplatform.it.WsSuiteBase import com.wavesplatform.dex.Implicits.durationToScalatestTimeout +import com.wavesplatform.dex.api.ws.connection.WsConnection +import com.wavesplatform.dex.api.ws.protocol._ import scala.concurrent.duration._ diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsPingPongExternalTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsPingPongExternalTestSuite.scala index 2a5bfee80f..6c9199939f 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsPingPongExternalTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/api/ws/WsPingPongExternalTestSuite.scala @@ -2,8 +2,8 @@ package com.wavesplatform.it.sync.api.ws import akka.http.scaladsl.model.Uri import com.typesafe.config.{Config, ConfigFactory} -import com.wavesplatform.dex.api.ws.protocol.WsError import com.wavesplatform.dex.Implicits.durationToScalatestTimeout +import com.wavesplatform.dex.api.ws.protocol.WsError import com.wavesplatform.dex.error.WsConnectionMaxLifetimeExceeded import scala.concurrent.duration.{DurationInt, FiniteDuration} diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/compat/OrderBookBackwardCompatTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/compat/OrderBookBackwardCompatTestSuite.scala index 996d15c001..7cc58a59fd 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/compat/OrderBookBackwardCompatTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/compat/OrderBookBackwardCompatTestSuite.scala @@ -4,7 +4,7 @@ import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} import com.wavesplatform.dex.domain.order.{Order, OrderType} -import com.wavesplatform.dex.it.api.HasKafka +import com.wavesplatform.dex.it.containers.HasKafka import com.wavesplatform.it.orderGen import com.wavesplatform.it.tags.{DexItExternalKafkaRequired, DexMultipleVersions} import org.scalacheck.Gen diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/kafka/issues/DeserializationIssuesTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/kafka/issues/DeserializationIssuesTestSuite.scala index 2095efb6fe..4af9d76426 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/kafka/issues/DeserializationIssuesTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/kafka/issues/DeserializationIssuesTestSuite.scala @@ -2,7 +2,7 @@ package com.wavesplatform.it.sync.kafka.issues import com.wavesplatform.dex.Implicits.durationToScalatestTimeout import com.wavesplatform.dex.app.QueueMessageDeserializationError -import com.wavesplatform.dex.it.api.HasKafka +import com.wavesplatform.dex.it.containers.HasKafka import com.wavesplatform.it.MatcherSuiteBase import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord, RecordMetadata} import org.apache.kafka.common.serialization.StringSerializer diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/kafka/issues/NetworkAndQueueIssuesTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/kafka/issues/NetworkAndQueueIssuesTestSuite.scala index c23dd43e95..4c47a7b3c5 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/kafka/issues/NetworkAndQueueIssuesTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/kafka/issues/NetworkAndQueueIssuesTestSuite.scala @@ -3,14 +3,16 @@ package com.wavesplatform.it.sync.kafka.issues import cats.implicits.catsSyntaxOptionId import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status +import com.wavesplatform.dex.api.ws.converters.WsOrderConverter import com.wavesplatform.dex.api.ws.entities.{WsBalances, WsOrder} import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.model.Denormalization._ +import com.wavesplatform.dex.domain.order.OrderStatusNames import com.wavesplatform.dex.domain.order.OrderType.SELL -import com.wavesplatform.dex.it.api.HasKafka import com.wavesplatform.dex.it.api.websockets.HasWebSockets -import com.wavesplatform.dex.model.{LimitOrder, OrderStatus} +import com.wavesplatform.dex.it.containers.HasKafka +import com.wavesplatform.dex.model.LimitOrder import com.wavesplatform.it.WsSuiteBase import java.util.concurrent.ThreadLocalRandom @@ -94,7 +96,7 @@ class NetworkAndQueueIssuesTestSuite extends WsSuiteBase with HasWebSockets with dex1.api.getReservedBalanceWithApiKey(alice) should matchTo(Map[Asset, Long](Waves -> 10.003.waves)) assertChanges(wsac)(Map(Waves -> WsBalances(initialWavesBalance - 10.003, 10.003))) { - WsOrder.fromDomain(LimitOrder(sellOrder)) + WsOrderConverter.fromDomain(LimitOrder(sellOrder)) } disconnectKafkaFromNetwork() @@ -126,7 +128,7 @@ class NetworkAndQueueIssuesTestSuite extends WsSuiteBase with HasWebSockets with dex1.api.getReservedBalanceWithApiKey(alice) shouldBe empty assertChanges(wsac, squash = false)(Map(Waves -> WsBalances(initialWavesBalance, 0))) { - WsOrder.fromOrder(sellOrder, status = OrderStatus.Cancelled.name.some) + WsOrder.fromOrder(sellOrder, status = OrderStatusNames.CANCELLED.some) } dex1.tryApi.place(bigSellOrder) shouldBe Symbol("right") @@ -136,7 +138,7 @@ class NetworkAndQueueIssuesTestSuite extends WsSuiteBase with HasWebSockets with dex1.api.getReservedBalanceWithApiKey(alice) should matchTo(Map[Asset, Long](Waves -> 30.003.waves)) assertChanges(wsac, squash = false)(Map(Waves -> WsBalances(initialWavesBalance - 30.003, 30.003))) { - WsOrder.fromDomain(LimitOrder(bigSellOrder)) + WsOrderConverter.fromDomain(LimitOrder(bigSellOrder)) } dex1.api.cancelAllOrdersWithSig(alice) diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/DexClientFaultToleranceTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/DexClientFaultToleranceTestSuite.scala index fbea0c6ced..29f4e6c7bb 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/DexClientFaultToleranceTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/DexClientFaultToleranceTestSuite.scala @@ -6,9 +6,8 @@ import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.order.OrderType import com.wavesplatform.dex.error.WavesNodeConnectionBroken -import com.wavesplatform.dex.it.api.HasToxiProxy import com.wavesplatform.dex.it.api.node.NodeApi -import com.wavesplatform.dex.it.docker.WavesNodeContainer +import com.wavesplatform.dex.it.containers.{HasToxiProxy, WavesNodeContainer} import com.wavesplatform.it.MatcherSuiteBase import com.wavesplatform.it.tags.NetworkTests diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/MultipleMatchersOrderCancelTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/MultipleMatchersOrderCancelTestSuite.scala index d55f2dcb7a..29cf432456 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/MultipleMatchersOrderCancelTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/MultipleMatchersOrderCancelTestSuite.scala @@ -6,7 +6,7 @@ import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.order.OrderType -import com.wavesplatform.dex.it.docker.{DexContainer, WavesNodeContainer} +import com.wavesplatform.dex.it.containers.{DexContainer, WavesNodeContainer} import com.wavesplatform.it.MatcherSuiteBase import com.wavesplatform.it.tags.DexItExternalKafkaRequired import org.testcontainers.containers.Network diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/NetworkIssuesTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/NetworkIssuesTestSuite.scala index 3111e8be77..e2b80be27d 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/NetworkIssuesTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/networking/NetworkIssuesTestSuite.scala @@ -9,9 +9,8 @@ import com.wavesplatform.dex.domain.order.OrderType import com.wavesplatform.dex.domain.order.OrderType.SELL import com.wavesplatform.dex.effect.Implicits.FutureCompanionOps import com.wavesplatform.dex.error.BalanceNotEnough -import com.wavesplatform.dex.it.api.HasToxiProxy import com.wavesplatform.dex.it.api.responses.dex.MatcherError -import com.wavesplatform.dex.it.docker.WavesNodeContainer +import com.wavesplatform.dex.it.containers.{HasToxiProxy, WavesNodeContainer} import com.wavesplatform.it.WsSuiteBase import com.wavesplatform.it.tags.NetworkTests import eu.rekawek.toxiproxy.model.ToxicDirection diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/smartcontracts/OrdersFromScriptedAssetTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/smartcontracts/OrdersFromScriptedAssetTestSuite.scala index b7c6d207ee..97421afc7e 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/smartcontracts/OrdersFromScriptedAssetTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/smartcontracts/OrdersFromScriptedAssetTestSuite.scala @@ -10,6 +10,7 @@ import com.wavesplatform.dex.error.AssetScriptDeniedOrder import com.wavesplatform.dex.it.api.responses.dex.MatcherError import com.wavesplatform.dex.it.test.Scripts import com.wavesplatform.dex.it.waves.{MkWavesEntities, ToWavesJConversions} +import com.wavesplatform.dex.waves.WavesFeeConstants.smartIssueFee import com.wavesplatform.it.MatcherSuiteBase import com.wavesplatform.transactions.IssueTransaction @@ -141,8 +142,7 @@ class OrdersFromScriptedAssetTestSuite extends MatcherSuiteBase { object OrdersFromScriptedAssetTestSuite extends ToWavesJConversions { - import com.wavesplatform.dex.it.config.PredefinedAccounts.matcher - import com.wavesplatform.dex.waves.WavesFeeConstants.smartIssueFee + import com.wavesplatform.dex.predefined.PredefinedAccounts.matcher private def mkAllow(id: Int): IssueTransaction = MkWavesEntities.mkIssue(matcher, s"AllowAsset-$id", Int.MaxValue / 3, 0, smartIssueFee, Some(Scripts.alwaysTrue)) diff --git a/dex-it/src/test/scala/com/wavesplatform/it/sync/txts/MultipleMatchersTxTsTestSuite.scala b/dex-it/src/test/scala/com/wavesplatform/it/sync/txts/MultipleMatchersTxTsTestSuite.scala index e5e81308ea..a6f8419a8d 100644 --- a/dex-it/src/test/scala/com/wavesplatform/it/sync/txts/MultipleMatchersTxTsTestSuite.scala +++ b/dex-it/src/test/scala/com/wavesplatform/it/sync/txts/MultipleMatchersTxTsTestSuite.scala @@ -3,8 +3,7 @@ package com.wavesplatform.it.sync.txts import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status import com.wavesplatform.dex.domain.order.{Order, OrderType} -import com.wavesplatform.dex.it.api.HasKafka -import com.wavesplatform.dex.it.docker.DexContainer +import com.wavesplatform.dex.it.containers.{DexContainer, HasKafka} import com.wavesplatform.it.MatcherSuiteBase final class MultipleMatchersTxTsTestSuite extends MatcherSuiteBase with HasKafka { diff --git a/dex-load/src/main/scala/com/wavesplatform/dex/load/TankGenerator.scala b/dex-load/src/main/scala/com/wavesplatform/dex/load/TankGenerator.scala index ad173cf1b5..bab74131e0 100644 --- a/dex-load/src/main/scala/com/wavesplatform/dex/load/TankGenerator.scala +++ b/dex-load/src/main/scala/com/wavesplatform/dex/load/TankGenerator.scala @@ -1,6 +1,6 @@ package com.wavesplatform.dex.load -import com.wavesplatform.dex.api.http.protocol.HttpCancelOrder +import com.wavesplatform.dex.api.http.entities.protocol.HttpCancelOrder import com.wavesplatform.dex.domain.account.{AddressScheme, KeyPair, PrivateKey, PublicKey} import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.bytes.ByteStr diff --git a/dex-load/src/main/scala/com/wavesplatform/dex/load/WavesDexLoadCli.scala b/dex-load/src/main/scala/com/wavesplatform/dex/load/WavesDexLoadCli.scala index a32a7feb00..9274cae0e3 100644 --- a/dex-load/src/main/scala/com/wavesplatform/dex/load/WavesDexLoadCli.scala +++ b/dex-load/src/main/scala/com/wavesplatform/dex/load/WavesDexLoadCli.scala @@ -10,15 +10,15 @@ import cats.syntax.either._ import cats.syntax.option._ import cats.{catsInstancesForId, Id} import com.softwaremill.diffx._ -import com.wavesplatform.dex.api.ws.protocol.{WsAddressChanges, WsOrderBookChanges} import com.wavesplatform.dex.cli.ScoptImplicits import com.wavesplatform.dex.domain.account.AddressScheme import com.wavesplatform.dex.error.Implicits.ThrowableOps import com.wavesplatform.dex.it.time.GlobalTimer -import com.wavesplatform.dex.it.time.GlobalTimer.TimerOpsImplicits +import com.wavesplatform.dex.it.time.GlobalTimer._ import com.wavesplatform.dex.load.WavesDexLoadCli.WsCheckType.{CheckLeaps, CheckUpdates} +import com.wavesplatform.dex.api.ws.protocol._ import com.wavesplatform.dex.load.ws.WsCollectChangesClient -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import com.wavesplatform.dex.{cli, Version} import scopt.{OParser, RenderingMode} diff --git a/dex-load/src/main/scala/com/wavesplatform/dex/load/ws/WsConnection.scala b/dex-load/src/main/scala/com/wavesplatform/dex/load/ws/WsConnection.scala index c9531291d2..075b03e134 100644 --- a/dex-load/src/main/scala/com/wavesplatform/dex/load/ws/WsConnection.scala +++ b/dex-load/src/main/scala/com/wavesplatform/dex/load/ws/WsConnection.scala @@ -1,7 +1,6 @@ package com.wavesplatform.dex.load.ws import java.util.concurrent.ThreadLocalRandom - import akka.Done import akka.actor.{ActorRef, ActorSystem, Status} import akka.http.scaladsl.Http diff --git a/dex/src/main/scala/com/wavesplatform/dex/Application.scala b/dex/src/main/scala/com/wavesplatform/dex/Application.scala index 46cca8ff33..e0c88f2dbe 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/Application.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/Application.scala @@ -52,7 +52,8 @@ import com.wavesplatform.dex.model.{AssetPairBuilder, ExchangeTransactionCreator import com.wavesplatform.dex.queue.ValidatedCommandWithMeta.Offset import com.wavesplatform.dex.queue._ import com.wavesplatform.dex.settings.MatcherSettings -import com.wavesplatform.dex.settings.utils.ConfigOps.ConfigOps +import com.wavesplatform.dex.settings.ConfigOps.ConfigOps +import com.wavesplatform.dex.statuses.MatcherStatus import com.wavesplatform.dex.time.NTP import com.wavesplatform.dex.tool.{KamonTraceUtils, WaitOffsetTool} import kamon.Kamon @@ -726,7 +727,7 @@ object Application { private def loadApplicationConfig(external: Option[File]): (Config, MatcherSettings) = { import com.wavesplatform.dex.settings.loadConfig - import com.wavesplatform.dex.settings.utils.ConfigOps.ConfigOps + import com.wavesplatform.dex.settings.ConfigOps.ConfigOps val config = loadConfig(external map ConfigFactory.parseFile) val scalaContextPath = "scala.concurrent.context" diff --git a/dex/src/main/scala/com/wavesplatform/dex/actors/address/AddressActor.scala b/dex/src/main/scala/com/wavesplatform/dex/actors/address/AddressActor.scala index 0ad55000b5..5b0d8b14d2 100755 --- a/dex/src/main/scala/com/wavesplatform/dex/actors/address/AddressActor.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/actors/address/AddressActor.scala @@ -16,7 +16,8 @@ import com.wavesplatform.dex.actors.address.AddressActor.Settings.default import com.wavesplatform.dex.actors.address.AddressActor._ import com.wavesplatform.dex.actors.address.BalancesFormatter.format import com.wavesplatform.dex.api.http.entities.MatcherResponse -import com.wavesplatform.dex.api.ws.entities.{WsAddressFlag, WsAssetInfo, WsBalances, WsOrder} +import com.wavesplatform.dex.api.ws.converters.WsOrderConverter +import com.wavesplatform.dex.api.ws.entities.{WsAddressFlag, WsAssetInfo, WsBalances} import com.wavesplatform.dex.api.ws.protocol.WsAddressChanges import com.wavesplatform.dex.api.ws.state.WsAddressState import com.wavesplatform.dex.collections.{NegativeMap, PositiveMap} @@ -528,7 +529,7 @@ class AddressActor( wsAddressState = wsAddressState.addSubscription( client, mkWsBalances(balances.allAssets, includeEmpty = false), - activeOrders.values.map(WsOrder.fromDomain(_)).to(Seq), + activeOrders.values.map(WsOrderConverter.fromDomain(_)).to(Seq), balances.notObservedTxs.view.mapValues(_.orderIds).toMap, balances.notCreatedTxs.view.mapValues(_.orderIds).toMap, flags, @@ -707,7 +708,7 @@ class AddressActor( maybeMatchTx: Option[ExchangeTransaction] ): Unit = scheduleWs { status match { - case OrderStatus.Accepted => wsAddressState.putOrderUpdate(remaining.id, WsOrder.fromDomain(remaining, status)) + case OrderStatus.Accepted => wsAddressState.putOrderUpdate(remaining.id, WsOrderConverter.fromDomain(remaining, status)) case _: OrderStatus.Cancelled => wsAddressState.putOrderStatusNameUpdate(remaining.order, status) case _ => // unmatchable can be only if OrderStatus.Filled @@ -721,7 +722,7 @@ class AddressActor( ): Unit = scheduleWs { orders.foldLeft(wsAddressState) { case (addressState, aoWtx) => aoWtx.order.status match { - case OrderStatus.Accepted => addressState.putOrderUpdate(aoWtx.order.id, WsOrder.fromDomain(aoWtx.order, aoWtx.order.status)) + case OrderStatus.Accepted => addressState.putOrderUpdate(aoWtx.order.id, WsOrderConverter.fromDomain(aoWtx.order, aoWtx.order.status)) case _: OrderStatus.Cancelled => addressState.putOrderStatusNameUpdate(aoWtx.order.order, aoWtx.order.status) case _ => addressState.putOrderFillingInfoAndStatusNameUpdate(aoWtx.order, aoWtx.order.status, aoWtx.tx.transaction.some) } diff --git a/dex/src/main/scala/com/wavesplatform/dex/actors/orderbook/AggregatedOrderBookActor.scala b/dex/src/main/scala/com/wavesplatform/dex/actors/orderbook/AggregatedOrderBookActor.scala index 83f02f6199..0a196e161e 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/actors/orderbook/AggregatedOrderBookActor.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/actors/orderbook/AggregatedOrderBookActor.scala @@ -5,11 +5,13 @@ import akka.actor.typed.scaladsl.{ActorContext, Behaviors} import akka.actor.typed.{ActorRef, Behavior, Terminated} import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse} import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor.State._ -import com.wavesplatform.dex.api.http.entities.HttpOrderBook +import com.wavesplatform.dex.api.http.entities.{HttpLevelAgg, HttpOrderBook} +import com.wavesplatform.dex.api.ws.converters.{WsLastTradeConverter, WsLevelAggregationConverter, WsOrderRestrictionsConverter} import com.wavesplatform.dex.api.ws.protocol.{WsError, WsOrderBookChanges, WsServerMessage} import com.wavesplatform.dex.api.ws.state.WsOrderBookState import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.model.{Amount, Price} +import com.wavesplatform.dex.domain.order.OrderType import com.wavesplatform.dex.error import com.wavesplatform.dex.model.MatcherModel.{DecimalsFormat, Denormalized} import com.wavesplatform.dex.model.{LastTrade, LevelAgg, LevelAmounts, OrderBook, OrderBookAggregatedSnapshot, Side} @@ -109,11 +111,11 @@ object AggregatedOrderBookActor { assetPair = assetPair, amountDecimals = amountDecimals, priceDecimals = priceDecimals, - asks = ob.asks, - bids = ob.bids, - lt = state.lastTrade, + asks = ob.asks.map(WsLevelAggregationConverter.toWs(OrderType.SELL)), + bids = ob.bids.map(WsLevelAggregationConverter.toWs(OrderType.BUY)), + lt = state.lastTrade.map(WsLastTradeConverter.toWs), updateId = 0L, - restrictions = restrictions, + restrictions = restrictions.map(WsOrderRestrictionsConverter.toWs), tickSize = tickSize ) @@ -170,8 +172,8 @@ object AggregatedOrderBookActor { HttpOrderBook( state.lastUpdateTs, assetPair, - state.bids.take(depth).map { case (price, amount) => LevelAgg(amount, price) }.toList, - state.asks.take(depth).map { case (price, amount) => LevelAgg(amount, price) }.toList, + state.bids.take(depth).map { case (price, amount) => HttpLevelAgg(amount, price) }.toList, + state.asks.take(depth).map { case (price, amount) => HttpLevelAgg(amount, price) }.toList, assetPairDecimals ) diff --git a/dex/src/main/scala/com/wavesplatform/dex/actors/orderbook/OrderBookActor.scala b/dex/src/main/scala/com/wavesplatform/dex/actors/orderbook/OrderBookActor.scala index cce29f0a66..351957abe4 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/actors/orderbook/OrderBookActor.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/actors/orderbook/OrderBookActor.scala @@ -13,7 +13,7 @@ import com.wavesplatform.dex.actors.events.OrderEventsCoordinatorActor import com.wavesplatform.dex.actors.orderbook.OrderBookActor._ import com.wavesplatform.dex.actors.{orderbook, OrderBookDirectoryActor} import com.wavesplatform.dex.api.ws.actors.WsInternalBroadcastActor -import com.wavesplatform.dex.api.ws.protocol.WsOrdersUpdate +import com.wavesplatform.dex.api.ws.converters.WsOrderUpdateConverter import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.utils.LoggerFacade import com.wavesplatform.dex.error @@ -182,8 +182,8 @@ class OrderBookActor( logEvent(event) // DEX-1192 docs/places-and-cancels.md event match { - case event: Events.OrderExecuted => WsOrdersUpdate.from(event, timestamp).some - case event: Events.OrderCanceled => WsOrdersUpdate.from(event).some + case event: Events.OrderExecuted => WsOrderUpdateConverter.toWs(event, timestamp).some + case event: Events.OrderCanceled => WsOrderUpdateConverter.toWs(event).some case _ => none } } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/HasStatusBarrier.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/HasStatusBarrier.scala index 03acf3a728..204d0e1c50 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/HasStatusBarrier.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/HasStatusBarrier.scala @@ -3,7 +3,7 @@ package com.wavesplatform.dex.api.http import akka.http.scaladsl.server.Directive0 import com.wavesplatform.dex.api.http.entities.{DuringShutdown, DuringStart} import com.wavesplatform.dex.api.routes.ApiRoute -import com.wavesplatform.dex.app.MatcherStatus +import com.wavesplatform.dex.statuses.MatcherStatus trait HasStatusBarrier { this: ApiRoute => diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/OrderBookHttpInfo.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/OrderBookHttpInfo.scala index 75b6bb7ed9..93d3b8deee 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/OrderBookHttpInfo.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/OrderBookHttpInfo.scala @@ -6,7 +6,7 @@ import cats.syntax.semigroupal._ import com.wavesplatform.dex.actors.OrderBookAskAdapter import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor.{Depth, MarketStatus} import com.wavesplatform.dex.api.http.entities.MatcherResponse.toHttpResponse -import com.wavesplatform.dex.api.http.entities.{HttpOrderBook, HttpOrderBookStatus, OrderBookUnavailable, SimpleErrorResponse, SimpleResponse} +import com.wavesplatform.dex.api.http.entities.{HttpLastTrade, HttpLevelAgg, HttpMarketStatus, HttpOrderBook, HttpOrderBookStatus, OrderBookUnavailable, SimpleErrorResponse, SimpleResponse} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.effect.{liftValueAsync, FutureResult} import com.wavesplatform.dex.model.MatcherModel.{DecimalsFormat, Denormalized} @@ -36,7 +36,17 @@ class OrderBookHttpInfo( } } - private def toHttpMarketStatusResponse(ms: MarketStatus): HttpResponse = toHttpResponse(SimpleResponse(HttpOrderBookStatus fromMarketStatus ms)) + private def toHttpMarketStatusResponse(ms: MarketStatus): HttpResponse = toHttpResponse( + SimpleResponse( + HttpOrderBookStatus.fromMarketStatus( + HttpMarketStatus( + ms.lastTrade.map(lt => HttpLastTrade(lt.price, lt.amount, lt.side)), + bestBid = ms.bestBid.map(bb => HttpLevelAgg(bb.amount, bb.price)), + bestAsk = ms.bestAsk.map(ba => HttpLevelAgg(ba.amount, ba.price)) + ) + ) + ) + ) def getHttpView(assetPair: AssetPair, format: DecimalsFormat, depth: Option[Depth]): Future[HttpResponse] = askAdapter.getHttpView(assetPair, format, settings.nearestBigger(depth)).flatMap { diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpAssetInfoConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpAssetInfoConverter.scala new file mode 100644 index 0000000000..a2798d1870 --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpAssetInfoConverter.scala @@ -0,0 +1,10 @@ +package com.wavesplatform.dex.api.http.converters + +import com.wavesplatform.dex.actors.OrderBookDirectoryActor.AssetInfo +import com.wavesplatform.dex.api.http.entities.HttpAssetInfo + +object HttpAssetInfoConverter { + + def fromAssetInfo(ai: AssetInfo): HttpAssetInfo = HttpAssetInfo(ai.decimals) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpAssetTypeConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpAssetTypeConverter.scala new file mode 100644 index 0000000000..2e65c7789c --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpAssetTypeConverter.scala @@ -0,0 +1,15 @@ +package com.wavesplatform.dex.api.http.converters + +import com.wavesplatform.dex.api.http.entities.HttpAssetType +import com.wavesplatform.dex.settings.AssetType + +object HttpAssetTypeConverter { + + def toHttp(at: AssetType): HttpAssetType = at match { + case AssetType.Amount => HttpAssetType.Amount + case AssetType.Price => HttpAssetType.Price + case AssetType.Spending => HttpAssetType.Spending + case AssetType.Receiving => HttpAssetType.Receiving + } + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderBookHistoryItemConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderBookHistoryItemConverter.scala new file mode 100644 index 0000000000..5a208256f8 --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderBookHistoryItemConverter.scala @@ -0,0 +1,27 @@ +package com.wavesplatform.dex.api.http.converters + +import com.wavesplatform.dex.api.http.entities.HttpOrderBookHistoryItem +import com.wavesplatform.dex.domain.order.Order +import com.wavesplatform.dex.model.{OrderInfo, OrderStatus} + +object HttpOrderBookHistoryItemConverter { + + def fromOrderInfo(id: Order.Id, info: OrderInfo[OrderStatus]): HttpOrderBookHistoryItem = HttpOrderBookHistoryItem( + id = id, + `type` = info.side, + orderType = info.orderType, + amount = info.amount, + filled = info.status.filledAmount, + price = info.price, + fee = info.matcherFee, + filledFee = info.status.filledFee, + feeAsset = info.feeAsset, + timestamp = info.timestamp, + status = info.status.name, + assetPair = info.assetPair, + avgWeighedPrice = info.avgWeighedPrice, + version = info.orderVersion, + totalExecutedPriceAssets = info.totalExecutedPriceAssets + ) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderFeeConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderFeeConverter.scala new file mode 100644 index 0000000000..d1b7bd813d --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderFeeConverter.scala @@ -0,0 +1,16 @@ +package com.wavesplatform.dex.api.http.converters + +import com.wavesplatform.dex.api.http.entities.HttpOrderFeeMode +import com.wavesplatform.dex.api.http.entities.HttpOrderFeeMode._ +import com.wavesplatform.dex.domain.asset.Asset +import com.wavesplatform.dex.settings.OrderFeeSettings + +object HttpOrderFeeConverter { + + def fromSettings(settings: OrderFeeSettings, matcherAccountFee: Long, allRates: Map[Asset, Double]): HttpOrderFeeMode = settings match { + case x: OrderFeeSettings.DynamicSettings => FeeModeDynamic(x.maxBaseFee + matcherAccountFee, allRates) + case OrderFeeSettings.FixedSettings(assetId, minFee) => FeeModeFixed(assetId, minFee) + case OrderFeeSettings.PercentSettings(assetType, minFee) => FeeModePercent(HttpAssetTypeConverter.toHttp(assetType), minFee) + } + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderStatusConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderStatusConverter.scala new file mode 100644 index 0000000000..35e4d2a24d --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpOrderStatusConverter.scala @@ -0,0 +1,18 @@ +package com.wavesplatform.dex.api.http.converters + +import cats.syntax.option._ +import com.wavesplatform.dex.api.http.entities.HttpOrderStatus +import com.wavesplatform.dex.api.http.entities.HttpOrderStatus.Status +import com.wavesplatform.dex.model.OrderStatus + +object HttpOrderStatusConverter { + + def from(x: OrderStatus): HttpOrderStatus = x match { + case OrderStatus.Accepted => HttpOrderStatus(Status.Accepted) + case OrderStatus.NotFound => HttpOrderStatus(Status.NotFound, message = Some("The limit order is not found")) + case OrderStatus.PartiallyFilled(filledAmount, filledFee) => HttpOrderStatus(Status.PartiallyFilled, filledAmount.some, filledFee.some) + case OrderStatus.Filled(filledAmount, filledFee) => HttpOrderStatus(Status.Filled, filledAmount.some, filledFee.some) + case OrderStatus.Cancelled(filledAmount, filledFee) => HttpOrderStatus(Status.Cancelled, filledAmount.some, filledFee.some) + } + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpV0LevelAggConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpV0LevelAggConverter.scala new file mode 100644 index 0000000000..482b60041b --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpV0LevelAggConverter.scala @@ -0,0 +1,10 @@ +package com.wavesplatform.dex.api.http.converters + +import com.wavesplatform.dex.api.http.entities.HttpV0LevelAgg +import com.wavesplatform.dex.model.LevelAgg + +object HttpV0LevelAggConverter { + + def fromLevelAgg(la: LevelAgg): HttpV0LevelAgg = HttpV0LevelAgg(la.amount, la.price) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1LevelAgg.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpV1LevelAggConverter.scala similarity index 54% rename from dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1LevelAgg.scala rename to dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpV1LevelAggConverter.scala index a6d1e13977..21845abd9d 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/entities/HttpV1LevelAgg.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/converters/HttpV1LevelAggConverter.scala @@ -1,32 +1,12 @@ -package com.wavesplatform.dex.api.http.entities +package com.wavesplatform.dex.api.http.converters +import com.wavesplatform.dex.api.http.entities.HttpV1LevelAgg import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.model.Denormalization import com.wavesplatform.dex.error.ErrorFormatterContext -import com.wavesplatform.dex.json import com.wavesplatform.dex.model.LevelAgg -import io.swagger.annotations.ApiModelProperty -import play.api.libs.json.{Format, JsArray, _} -case class HttpV1LevelAgg( - @ApiModelProperty( - dataType = "string", - example = "831.87648950" - ) amount: Double, - @ApiModelProperty( - dataType = "string", - example = "0.00012079" - ) price: Double -) - -object HttpV1LevelAgg { - - implicit val doubleFormat: Format[Double] = json.stringAsDoubleFormat - - implicit val httpV1LevelAggReads: Reads[HttpV1LevelAgg] = Reads { - case JsArray(value) if value.lengthCompare(2) == 0 => JsSuccess(HttpV1LevelAgg(value(1).as[Double], value(0).as[Double])) - case x => JsError(s"Cannot parse $x as ApiV1LevelAgg") - } +object HttpV1LevelAggConverter { def fromLevelAgg(la: LevelAgg, assetPair: AssetPair)(implicit efc: ErrorFormatterContext): HttpV1LevelAgg = { val amountAssetDecimals = diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/BalancesRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/BalancesRoute.scala index 1c9ca6116b..dd1b4ea740 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/BalancesRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/BalancesRoute.scala @@ -11,10 +11,10 @@ import com.wavesplatform.dex.api.http.directives.ProtectDirective import com.wavesplatform.dex.api.http.entities._ import com.wavesplatform.dex.api.routes.PathMatchers.{AddressPM, AssetPairPM, PublicKeyPM} import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.domain.account.PublicKey import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.model.AssetPairBuilder +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations.{Api, _} import javax.ws.rs.Path diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/CancelRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/CancelRoute.scala index aea0ae5d7b..71fae5d640 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/CancelRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/CancelRoute.scala @@ -14,13 +14,13 @@ import com.wavesplatform.dex.api.http.headers.`X-User-Public-Key` import com.wavesplatform.dex.api.http.{HasStatusBarrier, _} import com.wavesplatform.dex.api.routes.PathMatchers.{AddressPM, AssetPairPM, OrderPM} import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.db.OrderDb import com.wavesplatform.dex.domain.account.{Address, PublicKey} import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.model.AssetPairBuilder +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations._ import javax.ws.rs.Path diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/DebugRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/DebugRoute.scala index 7fdead677f..07ab0f503a 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/DebugRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/DebugRoute.scala @@ -17,11 +17,10 @@ import com.wavesplatform.dex.api.http.headers.CustomContentTypes import com.wavesplatform.dex.api.http.{HasStatusBarrier, _} import com.wavesplatform.dex.api.routes.PathMatchers.AddressPM import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.domain.utils.ScorexLogging -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream import com.wavesplatform.dex.queue.ValidatedCommandWithMeta -import com.wavesplatform.dex.settings.utils.ConfigOps.ConfigOps +import com.wavesplatform.dex.settings.ConfigOps.ConfigOps +import com.wavesplatform.dex.statuses.{CombinedStreamStatus, MatcherStatus} import io.swagger.annotations._ import javax.ws.rs.Path @@ -35,7 +34,7 @@ final class DebugRoute( safeConfig: Config, matcher: ActorRef, addressActor: ActorRef, - blockchainStatus: => CombinedStream.Status, + blockchainStatus: => CombinedStreamStatus, override val matcherStatus: () => MatcherStatus, currentOffset: () => ValidatedCommandWithMeta.Offset, lastOffset: () => Future[ValidatedCommandWithMeta.Offset], @@ -192,8 +191,17 @@ final class DebugRoute( (withMetricsAndTraces("getAddressState") & withAuth) { withAddress(addressOrError) { address => complete { - askMapAddressActor[GetState](addressActor, address, GetCurrentState) { - HttpAddressState(_) + askMapAddressActor[GetState](addressActor, address, GetCurrentState) { reply => + HttpAddressState( + reply.balances.regular.xs, + reply.balances.reserved.xs, + reply.balances.allTradableBalance.xs, + reply.balances.unconfirmed.xs, + reply.balances.outgoingLeasing.getOrElse(0L), + reply.balances.notCreatedTxs map { case (k, v) => (k.toString, v.pessimisticChanges.xs) }, + reply.balances.notObservedTxs map { case (k, v) => (k.toString, v.executionTotalVolumeDiff.xs) }, + reply.placementQueue.toList + ) } } } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/HistoryRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/HistoryRoute.scala index ff1a009db3..6c1c2cae93 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/HistoryRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/HistoryRoute.scala @@ -8,19 +8,20 @@ import akka.util.Timeout import com.wavesplatform.dex._ import com.wavesplatform.dex.actors.address.AddressActor import com.wavesplatform.dex.actors.address.AddressActor.OrderListType +import com.wavesplatform.dex.api.http.converters.HttpOrderBookHistoryItemConverter import com.wavesplatform.dex.api.http.directives.HttpKamonDirectives._ import com.wavesplatform.dex.api.http.directives.ProtectDirective import com.wavesplatform.dex.api.http.entities._ -import com.wavesplatform.dex.api.http.protocol.HttpCancelOrder +import com.wavesplatform.dex.api.http.entities.protocol.HttpCancelOrder import com.wavesplatform.dex.api.http.{HasStatusBarrier, _} import com.wavesplatform.dex.api.routes.PathMatchers.{AddressPM, AssetPairPM, PublicKeyPM} import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.order.Order.Id import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.model.{AssetPairBuilder, OrderInfo, OrderStatus} +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations._ import javax.ws.rs.Path @@ -244,7 +245,7 @@ final class HistoryRoute( } private val tupledOrderBookHistoryItem: ((Id, OrderInfo[OrderStatus])) => HttpOrderBookHistoryItem = - Function.tupled(HttpOrderBookHistoryItem.fromOrderInfo) + Function.tupled(HttpOrderBookHistoryItemConverter.fromOrderInfo) private def loadOrders(address: Address, pair: Option[AssetPair], orderListType: OrderListType): Route = complete { askMapAddressActor[AddressActor.Reply.GetOrderStatuses](addressActor, address, AddressActor.Query.GetOrdersStatuses(pair, orderListType)) { diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/MarketsRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/MarketsRoute.scala index bd55b0eb3f..34b0a78383 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/MarketsRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/MarketsRoute.scala @@ -14,6 +14,7 @@ import cats.syntax.traverse._ import com.wavesplatform.dex._ import com.wavesplatform.dex.actors.OrderBookDirectoryActor._ import com.wavesplatform.dex.actors.address.AddressActor +import com.wavesplatform.dex.api.http.converters.{HttpAssetInfoConverter, HttpOrderBookHistoryItemConverter, HttpOrderStatusConverter} import com.wavesplatform.dex.api.http.directives.HttpKamonDirectives._ import com.wavesplatform.dex.api.http.directives.ProtectDirective import com.wavesplatform.dex.api.http.entities._ @@ -21,7 +22,6 @@ import com.wavesplatform.dex.api.http.headers.`X-User-Public-Key` import com.wavesplatform.dex.api.http.{HasStatusBarrier, OrderBookHttpInfo, _} import com.wavesplatform.dex.api.routes.PathMatchers.{AddressPM, AssetPairPM, OrderPM, PublicKeyPM} import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.db.OrderDb import com.wavesplatform.dex.domain.account.{Address, PublicKey} import com.wavesplatform.dex.domain.asset.AssetPair @@ -33,6 +33,7 @@ import com.wavesplatform.dex.model.{AssetPairBuilder, _} import com.wavesplatform.dex.queue.MatcherQueue.StoreValidatedCommand import com.wavesplatform.dex.queue.ValidatedCommand import com.wavesplatform.dex.settings.OrderRestrictionsSettings +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations._ import javax.ws.rs.Path @@ -267,12 +268,12 @@ final class MarketsRoute( case Some(order) => askMapAddressActor[AddressActor.Reply.GetOrderStatus](addressActor, order.sender, AddressActor.Query.GetOrderStatus(orderId)) { r => - HttpOrderStatus.from(r.x) + HttpOrderStatusConverter.from(r.x) } case None => orderDb .getOrderInfo(orderId) - .map(_.fold(HttpOrderStatus.from(OrderStatus.NotFound))(x => HttpOrderStatus.from(x.status))) + .map(_.fold(HttpOrderStatusConverter.from(OrderStatus.NotFound))(x => HttpOrderStatusConverter.from(x.status))) .map(ToResponseMarshallable(_)) } } @@ -303,16 +304,16 @@ final class MarketsRoute( complete( (matcher ? GetMarkets).mapTo[List[MarketData]].flatMap { markets => markets - .map { md => + .map { md: MarketData => getOrderBookRestrictions(md.pair) .map { meta => HttpMarketDataWithMeta( md.pair.amountAsset, md.amountAssetName, - md.amountAssetInfo.map(HttpAssetInfo.fromAssetInfo), + md.amountAssetInfo.map(HttpAssetInfoConverter.fromAssetInfo), md.pair.priceAsset, md.priceAssetName, - md.priceAssetInfo.map(HttpAssetInfo.fromAssetInfo), + md.priceAssetInfo.map(HttpAssetInfoConverter.fromAssetInfo), md.created, meta.restrictions, meta.matchingRules @@ -416,7 +417,16 @@ final class MarketsRoute( private def getOrderBookRestrictions(pair: AssetPair): FutureResult[HttpOrderBookInfo] = settings.getActualTickSize(pair).map { tickSize => HttpOrderBookInfo( - restrictions = settings.orderRestrictions.get(pair).map(HttpOrderRestrictions.fromSettings), + restrictions = settings.orderRestrictions.get(pair).map(s => + HttpOrderRestrictions( + stepAmount = s.stepAmount, + minAmount = s.minAmount, + maxAmount = s.maxAmount, + stepPrice = s.stepPrice, + minPrice = s.minPrice, + maxPrice = s.maxPrice + ) + ), matchingRules = HttpMatchingRules(tickSize = tickSize.toDouble) ) } @@ -424,7 +434,7 @@ final class MarketsRoute( private def getOrderStatusInfo(id: Order.Id, address: Address): StandardRoute = complete { askMapAddressActor[AddressActor.Reply.GetOrdersStatusInfo](addressActor, address, AddressActor.Query.GetOrderStatusInfo(id)) { _.maybeOrderStatusInfo match { - case Some(oi) => SimpleResponse(HttpOrderBookHistoryItem.fromOrderInfo(id, oi)) + case Some(oi) => SimpleResponse(HttpOrderBookHistoryItemConverter.fromOrderInfo(id, oi)) case None => InfoNotFound(error.OrderNotFound(id)) } } diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/MatcherInfoRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/MatcherInfoRoute.scala index e13b66d51d..756508ef97 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/MatcherInfoRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/MatcherInfoRoute.scala @@ -4,16 +4,17 @@ import akka.http.scaladsl.server.Route import akka.stream.Materializer import com.wavesplatform.dex._ import com.wavesplatform.dex.api.http.HasStatusBarrier +import com.wavesplatform.dex.api.http.converters.HttpOrderFeeConverter import com.wavesplatform.dex.api.http.directives.HttpKamonDirectives._ import com.wavesplatform.dex.api.http.directives.ProtectDirective import com.wavesplatform.dex.api.http.entities._ import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.caches.RateCache import com.wavesplatform.dex.domain.account.PublicKey import com.wavesplatform.dex.domain.asset.Asset.IssuedAsset import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.settings.{MatcherSettings, OrderFeeSettings} +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations._ import javax.ws.rs.Path @@ -74,7 +75,7 @@ final class MatcherInfoRoute( matcherVersion = Version.VersionString, priceAssets = matcherSettings.priceAssets.filterNot(a => matcherSettings.blacklistedAssets.contains(IssuedAsset(a.compatId.orNull))), - orderFee = HttpOrderFeeMode.fromSettings( + orderFee = HttpOrderFeeConverter.fromSettings( settings = getActualOrderFeeSettings(), matcherAccountFee = matcherAccountFee, allRates = rateCache.getAllRates diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/PlaceRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/PlaceRoute.scala index 1458e1fe54..c730250bf1 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/PlaceRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/PlaceRoute.scala @@ -12,7 +12,6 @@ import com.wavesplatform.dex.api.http.directives.HttpKamonDirectives.withMetrics import com.wavesplatform.dex.api.http.directives.ProtectDirective import com.wavesplatform.dex.api.http.entities.{HttpError, HttpSuccessfulPlace, SimpleResponse} import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.domain.order.OrderJson.orderFormat import com.wavesplatform.dex.domain.utils.ScorexLogging @@ -20,6 +19,7 @@ import com.wavesplatform.dex.effect.FutureResult import com.wavesplatform.dex.error import com.wavesplatform.dex.metrics.TimerExt import com.wavesplatform.dex.model.AssetPairBuilder +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations.{Api, _} import javax.ws.rs.Path diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/RatesRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/RatesRoute.scala index 9712d57f43..06b43c211e 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/RatesRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/RatesRoute.scala @@ -12,11 +12,11 @@ import com.wavesplatform.dex.api.http.{HasStatusBarrier, _} import com.wavesplatform.dex.api.routes.PathMatchers.AssetPM import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} import com.wavesplatform.dex.api.ws.actors.WsExternalClientDirectoryActor -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.caches.RateCache import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.model.AssetPairBuilder +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations.{Api, _} import javax.ws.rs.Path diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/TransactionsRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/TransactionsRoute.scala index 0045e47783..fbc1169ddb 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/TransactionsRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v0/TransactionsRoute.scala @@ -8,10 +8,10 @@ import com.wavesplatform.dex.api.http.directives.ProtectDirective import com.wavesplatform.dex.api.http.{HasStatusBarrier, _} import com.wavesplatform.dex.api.routes.PathMatchers.OrderPM import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.db.OrderDb import com.wavesplatform.dex.domain.transaction.ExchangeTransactionV2 import com.wavesplatform.dex.domain.utils.ScorexLogging +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations._ import play.api.libs.json._ diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v1/OrderBookRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v1/OrderBookRoute.scala index 7fa5478cd1..e719e4be92 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v1/OrderBookRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/http/routes/v1/OrderBookRoute.scala @@ -5,10 +5,10 @@ import com.wavesplatform.dex.api.http.directives.HttpKamonDirectives.withMetrics import com.wavesplatform.dex.api.http.entities.HttpV1OrderBook import com.wavesplatform.dex.api.http.{HasStatusBarrier, OrderBookHttpInfo} import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute, PathMatchers} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.error.ErrorFormatterContext import com.wavesplatform.dex.model.{AssetPairBuilder, MatcherModel} +import com.wavesplatform.dex.statuses.MatcherStatus import io.swagger.annotations.{Api, ApiImplicitParam, ApiImplicitParams, ApiOperation} import javax.ws.rs.Path diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/routes/ApiRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/routes/ApiRoute.scala index 882cede672..1c2858377b 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/routes/ApiRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/routes/ApiRoute.scala @@ -9,9 +9,9 @@ import akka.pattern.{ask, AskTimeoutException} import com.google.common.primitives.Longs import com.wavesplatform.dex._ import com.wavesplatform.dex.actors.address.{AddressActor, AddressDirectoryActor} +import com.wavesplatform.dex.api.http.entities.protocol.HttpCancelOrder import com.wavesplatform.dex.api.http.entities.{InfoNotFound, InvalidAddress, InvalidAsset, InvalidBase58String, InvalidPublicKey, InvalidSignature, MatcherResponse, TimedOut, _} import com.wavesplatform.dex.api.http.headers.`X-User-Public-Key` -import com.wavesplatform.dex.api.http.protocol.HttpCancelOrder import com.wavesplatform.dex.api.http.{entities, ApiMarshallers} import com.wavesplatform.dex.domain.account.{Address, PublicKey} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/actors/WsExternalClientHandlerActor.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/actors/WsExternalClientHandlerActor.scala index 8469dd67e5..f0e3dff750 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/actors/WsExternalClientHandlerActor.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/actors/WsExternalClientHandlerActor.scala @@ -15,7 +15,7 @@ import com.wavesplatform.dex.api.ws.state.WsAddressState import com.wavesplatform.dex.domain.account.{Address, AddressScheme} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.error -import com.wavesplatform.dex.error.{MatcherError, SubscriptionsLimitReached, WsConnectionMaxLifetimeExceeded, WsConnectionPongTimeout} +import com.wavesplatform.dex.error._ import com.wavesplatform.dex.model.AssetPairBuilder import com.wavesplatform.dex.settings.SubscriptionsSettings import com.wavesplatform.dex.time.Time diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/actors/WsInternalClientHandlerActor.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/actors/WsInternalClientHandlerActor.scala index 749bfe8357..26c8124125 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/actors/WsInternalClientHandlerActor.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/actors/WsInternalClientHandlerActor.scala @@ -5,7 +5,7 @@ import akka.actor.typed.scaladsl.Behaviors import akka.actor.typed.{ActorRef, Behavior} import akka.{actor => classic} import cats.syntax.option._ -import com.wavesplatform.dex.api.ws.protocol.{WsError, WsInitial, WsPingOrPong, WsServerMessage} +import com.wavesplatform.dex.api.ws.protocol._ import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.error.{MatcherError, WsConnectionPongTimeout} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsFullOrderConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsFullOrderConverter.scala new file mode 100644 index 0000000000..fbe50578b7 --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsFullOrderConverter.scala @@ -0,0 +1,83 @@ +package com.wavesplatform.dex.api.ws.converters + +import cats.syntax.option._ +import com.wavesplatform.dex.api.ws.entities.WsFullOrder +import com.wavesplatform.dex.api.ws.entities.WsFullOrder.WsExecutionInfo +import com.wavesplatform.dex.domain.model.Denormalization +import com.wavesplatform.dex.domain.order.OrderStatusNames +import com.wavesplatform.dex.error.ErrorFormatterContext +import com.wavesplatform.dex.model.Events.{OrderCanceled, OrderExecuted} +import com.wavesplatform.dex.model.AcceptedOrder + +object WsFullOrderConverter { + + def toWs(event: OrderCanceled)(implicit efc: ErrorFormatterContext): WsFullOrder = { + val ao = event.acceptedOrder + + val amountAssetDecimals = efc.unsafeAssetDecimals(ao.order.assetPair.amountAsset) + val feeAssetDecimals = efc.unsafeAssetDecimals(ao.order.feeAsset) + val priceAssetDecimals = efc.unsafeAssetDecimals(ao.order.assetPair.priceAsset) + + def denormalizeAmount(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, amountAssetDecimals).toDouble + def denormalizePrice(value: Long): Double = Denormalization.denormalizePrice(value, amountAssetDecimals, priceAssetDecimals).toDouble + def denormalizeFee(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, feeAssetDecimals).toDouble + + val fillingInfo = ao.fillingInfo + WsFullOrder( + id = ao.id, + owner = ao.order.sender.toAddress, + timestamp = ao.order.timestamp, + amountAsset = ao.order.assetPair.amountAsset, + priceAsset = ao.order.assetPair.priceAsset, + side = ao.order.orderType, + isMarket = ao.isMarket, + price = denormalizePrice(ao.order.price), + amount = denormalizeAmount(ao.order.amount), + fee = denormalizeFee(ao.order.matcherFee), + feeAsset = ao.order.feeAsset, + status = OrderStatusNames.CANCELLED, + filledAmount = denormalizeAmount(fillingInfo.filledAmount), + filledFee = denormalizeFee(fillingInfo.filledFee), + avgWeighedPrice = denormalizePrice(fillingInfo.avgWeighedPrice), + eventTimestamp = event.timestamp, + executionInfo = none + ) + } + + def toWs( + ao: AcceptedOrder, + event: OrderExecuted, + denormalizeAmount: Long => Double, + denormalizePrice: Long => Double, + denormalizeFee: Long => Double + )(implicit efc: ErrorFormatterContext): WsFullOrder = { + val fillingInfo = ao.fillingInfo + val executedFee = if (ao.id == event.counter.order.id()) event.counterExecutedFee else event.submittedExecutedFee + + WsFullOrder( + id = ao.id, + owner = ao.order.sender.toAddress, + timestamp = ao.order.timestamp, + amountAsset = ao.order.assetPair.amountAsset, + priceAsset = ao.order.assetPair.priceAsset, + side = ao.order.orderType, + isMarket = ao.isMarket, + price = denormalizePrice(ao.order.price), + amount = denormalizeAmount(ao.order.amount), + fee = denormalizeFee(ao.order.matcherFee), + feeAsset = ao.order.feeAsset, + status = ao.status.name, + filledAmount = denormalizeAmount(fillingInfo.filledAmount), + filledFee = denormalizeFee(fillingInfo.filledFee), + avgWeighedPrice = denormalizePrice(fillingInfo.avgWeighedPrice), + eventTimestamp = event.timestamp, + executionInfo = WsExecutionInfo( + amount = denormalizeAmount(event.executedAmount), + fee = denormalizeFee(executedFee), + price = denormalizePrice(event.executedPrice), + totalPriceAssets = denormalizePrice(ao.fillingInfo.totalExecutedPriceAssets) + ).some + ) + } + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsLastTradeConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsLastTradeConverter.scala new file mode 100644 index 0000000000..b478a518d8 --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsLastTradeConverter.scala @@ -0,0 +1,10 @@ +package com.wavesplatform.dex.api.ws.converters + +import com.wavesplatform.dex.api.ws.protocol.WsOrderBookChanges.LTrade +import com.wavesplatform.dex.model.LastTrade + +object WsLastTradeConverter { + + def toWs(lt: LastTrade): LTrade = LTrade(lt.price, lt.amount, lt.side) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsLevelAggregationConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsLevelAggregationConverter.scala new file mode 100644 index 0000000000..b0acfbfb55 --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsLevelAggregationConverter.scala @@ -0,0 +1,11 @@ +package com.wavesplatform.dex.api.ws.converters + +import com.wavesplatform.dex.api.ws.protocol.WsOrderBookChanges.LevelAggregation +import com.wavesplatform.dex.domain.order.OrderType +import com.wavesplatform.dex.model.LevelAgg + +object WsLevelAggregationConverter { + + def toWs(side: OrderType)(levelAgg: LevelAgg): LevelAggregation = LevelAggregation(levelAgg.price, levelAgg.amount, side) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsMatchTxInfoConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsMatchTxInfoConverter.scala new file mode 100644 index 0000000000..8653f9d7a5 --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsMatchTxInfoConverter.scala @@ -0,0 +1,28 @@ +package com.wavesplatform.dex.api.ws.converters + +import com.wavesplatform.dex.api.ws.entities.WsMatchTransactionInfo +import com.wavesplatform.dex.domain.asset.AssetPair +import com.wavesplatform.dex.domain.bytes.ByteStr +import com.wavesplatform.dex.domain.model.Denormalization.{denormalizeAmountAndFee, denormalizePrice} +import com.wavesplatform.dex.error.ErrorFormatterContext +import com.wavesplatform.dex.model.AcceptedOrder + +object WsMatchTxInfoConverter { + + def toWs(assetPair: AssetPair, txId: ByteStr, timestamp: Long, price: Long, executedAmountAssets: Long)(implicit + efc: ErrorFormatterContext + ): WsMatchTransactionInfo = { + + val ad = efc.unsafeAssetDecimals(assetPair.amountAsset) + val pd = efc.unsafeAssetDecimals(assetPair.priceAsset) + + WsMatchTransactionInfo( + txId, + timestamp, + price = denormalizePrice(price, ad, pd).toDouble, + executedAmountAssets = denormalizeAmountAndFee(executedAmountAssets, ad).toDouble, + executedPriceAssets = denormalizeAmountAndFee(AcceptedOrder.calcAmountOfPriceAsset(executedAmountAssets, price), pd).toDouble + ) + } + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderConverter.scala new file mode 100644 index 0000000000..9d56c4aa45 --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderConverter.scala @@ -0,0 +1,42 @@ +package com.wavesplatform.dex.api.ws.converters + +import cats.syntax.option._ +import com.wavesplatform.dex.api.ws.entities.WsOrder +import com.wavesplatform.dex.domain.model.Denormalization +import com.wavesplatform.dex.error.ErrorFormatterContext +import com.wavesplatform.dex.model.{AcceptedOrder, OrderStatus} + +object WsOrderConverter { + + def fromDomain(ao: AcceptedOrder)(implicit efc: ErrorFormatterContext): WsOrder = fromDomain(ao, ao.status) + + def fromDomain(ao: AcceptedOrder, status: OrderStatus)(implicit efc: ErrorFormatterContext): WsOrder = { + + val amountAssetDecimals = efc.unsafeAssetDecimals(ao.order.assetPair.amountAsset) + val feeAssetDecimals = efc.unsafeAssetDecimals(ao.order.feeAsset) + val priceAssetDecimals = efc.unsafeAssetDecimals(ao.order.assetPair.priceAsset) + + def denormalizeAmount(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, amountAssetDecimals).toDouble + def denormalizeFee(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, feeAssetDecimals).toDouble + def denormalizePrice(value: Long): Double = Denormalization.denormalizePrice(value, amountAssetDecimals, priceAssetDecimals).toDouble + + WsOrder( + ao.id, + ao.order.assetPair.amountAsset, + ao.order.assetPair.priceAsset, + ao.feeAsset, + ao.order.orderType, + ao.order.timestamp.some, + ao.isMarket.some, + ao.price.some.map(denormalizePrice), + ao.order.amount.some.map(denormalizeAmount), + ao.order.matcherFee.some.map(denormalizeFee), + status.name.some, + ao.fillingInfo.filledAmount.some.map(denormalizeAmount), + ao.fillingInfo.filledFee.some.map(denormalizeFee), + ao.fillingInfo.avgWeighedPrice.some.map(denormalizePrice), + ao.fillingInfo.totalExecutedPriceAssets.some.map(denormalizePrice) + ) + } + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderRestrictionsConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderRestrictionsConverter.scala new file mode 100644 index 0000000000..1e833e36d9 --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderRestrictionsConverter.scala @@ -0,0 +1,17 @@ +package com.wavesplatform.dex.api.ws.converters + +import com.wavesplatform.dex.api.ws.entities.WsOrderBookRestrictions +import com.wavesplatform.dex.settings.OrderRestrictionsSettings + +object WsOrderRestrictionsConverter { + + def toWs(ors: OrderRestrictionsSettings): WsOrderBookRestrictions = WsOrderBookRestrictions( + stepAmount = ors.stepAmount, + maxAmount = ors.maxAmount, + minAmount = ors.minAmount, + stepPrice = ors.stepPrice, + maxPrice = ors.maxPrice, + minPrice = ors.minPrice + ) + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderUpdateConverter.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderUpdateConverter.scala new file mode 100644 index 0000000000..42a68ea91e --- /dev/null +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/converters/WsOrderUpdateConverter.scala @@ -0,0 +1,39 @@ +package com.wavesplatform.dex.api.ws.converters + +import cats.data.NonEmptyList +import com.wavesplatform.dex.api.ws.entities.WsFullOrder +import com.wavesplatform.dex.api.ws.protocol.WsOrdersUpdate +import com.wavesplatform.dex.domain.model.Denormalization +import com.wavesplatform.dex.error.ErrorFormatterContext +import com.wavesplatform.dex.model.AcceptedOrder +import com.wavesplatform.dex.model.Events.{OrderCanceled, OrderExecuted} + +object WsOrderUpdateConverter { + + def toWs(x: OrderCanceled)(implicit efc: ErrorFormatterContext): WsOrdersUpdate = WsOrdersUpdate( + NonEmptyList.one(WsFullOrderConverter.toWs(x)) + ) + + def toWs(x: OrderExecuted, ts: Long)(implicit efc: ErrorFormatterContext): WsOrdersUpdate = { + val ao1 = x.counterRemaining + val assetPair = ao1.order.assetPair + + val amountAssetDecimals = efc.unsafeAssetDecimals(assetPair.amountAsset) + val priceAssetDecimals = efc.unsafeAssetDecimals(assetPair.priceAsset) + + def denormalizeAmount(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, amountAssetDecimals).toDouble + def denormalizePrice(value: Long): Double = Denormalization.denormalizePrice(value, amountAssetDecimals, priceAssetDecimals).toDouble + + def from(ao: AcceptedOrder): WsFullOrder = + WsFullOrderConverter.toWs( + ao, + x, + denormalizeAmount, + denormalizePrice, + Denormalization.denormalizeAmountAndFee(_, efc.unsafeAssetDecimals(ao.feeAsset)).toDouble + ) + + WsOrdersUpdate(NonEmptyList.of(ao1, x.submittedRemaining).map(from), timestamp = ts) + } + +} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrdersUpdate.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrdersUpdate.scala deleted file mode 100644 index dbae6397dc..0000000000 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/protocol/WsOrdersUpdate.scala +++ /dev/null @@ -1,71 +0,0 @@ -package com.wavesplatform.dex.api.ws.protocol - -import cats.data.NonEmptyList -import cats.syntax.option._ -import com.wavesplatform.dex.api.ws.entities.WsFullOrder -import com.wavesplatform.dex.domain.model.Denormalization -import com.wavesplatform.dex.error.ErrorFormatterContext -import com.wavesplatform.dex.model.AcceptedOrder -import com.wavesplatform.dex.model.Events.{OrderCanceled, OrderExecuted} -import play.api.libs.functional.syntax._ -import play.api.libs.json._ - -case class WsOrdersUpdate(orders: NonEmptyList[WsFullOrder], timestamp: Long = System.currentTimeMillis) extends WsServerMessage { - override val tpe: String = WsOrdersUpdate.tpe - - def append(other: WsOrdersUpdate): WsOrdersUpdate = copy( - orders = other.orders ::: orders, - timestamp = other.timestamp - ) - -} - -object WsOrdersUpdate { - - val tpe = "osu" - - def from(x: OrderCanceled)(implicit efc: ErrorFormatterContext): WsOrdersUpdate = WsOrdersUpdate( - NonEmptyList.one(WsFullOrder.from(x)) - ) - - def from(x: OrderExecuted, ts: Long)(implicit efc: ErrorFormatterContext): WsOrdersUpdate = { - val ao1 = x.counterRemaining - val assetPair = ao1.order.assetPair - - val amountAssetDecimals = efc.unsafeAssetDecimals(assetPair.amountAsset) - val priceAssetDecimals = efc.unsafeAssetDecimals(assetPair.priceAsset) - - def denormalizeAmount(value: Long): Double = Denormalization.denormalizeAmountAndFee(value, amountAssetDecimals).toDouble - def denormalizePrice(value: Long): Double = Denormalization.denormalizePrice(value, amountAssetDecimals, priceAssetDecimals).toDouble - - def from(ao: AcceptedOrder): WsFullOrder = - WsFullOrder.from( - ao, - x, - denormalizeAmount, - denormalizePrice, - Denormalization.denormalizeAmountAndFee(_, efc.unsafeAssetDecimals(ao.feeAsset)).toDouble - ) - - WsOrdersUpdate(NonEmptyList.of(ao1, x.submittedRemaining).map(from), timestamp = ts) - } - - def wsUnapply(arg: WsOrdersUpdate): Option[(String, Long, NonEmptyList[WsFullOrder])] = (arg.tpe, arg.timestamp, arg.orders).some - - implicit def nonEmptyListFormat[T: Format]: Format[NonEmptyList[T]] = Format( - Reads.list[T].flatMap { xs => - NonEmptyList.fromList(xs).fold[Reads[NonEmptyList[T]]](Reads.failed("The list is empty"))(Reads.pure(_)) - }, - Writes.list[T].contramap(_.toList) - ) - - implicit val wsOrdersUpdateFormat: Format[WsOrdersUpdate] = ( - (__ \ "T").format[String] and - (__ \ "_").format[Long] and - (__ \ "o").format(nonEmptyListFormat[WsFullOrder]) - )( - (_, ts, orders) => WsOrdersUpdate(orders, ts), - unlift(WsOrdersUpdate.wsUnapply) - ) - -} diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/routes/MatcherWebSocketRoute.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/routes/MatcherWebSocketRoute.scala index 9f460d5e37..01d600e711 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/routes/MatcherWebSocketRoute.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/routes/MatcherWebSocketRoute.scala @@ -21,7 +21,6 @@ import com.wavesplatform.dex.api.routes.{ApiRoute, AuthRoute} import com.wavesplatform.dex.api.ws.actors.{WsExternalClientDirectoryActor, WsExternalClientHandlerActor, WsInternalBroadcastActor, WsInternalClientHandlerActor} import com.wavesplatform.dex.api.ws.protocol._ import com.wavesplatform.dex.api.ws.routes.MatcherWebSocketRoute.CloseHandler -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.error @@ -29,6 +28,7 @@ import com.wavesplatform.dex.error.{InvalidJson, MatcherIsStopping} import com.wavesplatform.dex.exceptions.BinaryMessagesNotSupportedException import com.wavesplatform.dex.model.AssetPairBuilder import com.wavesplatform.dex.settings.MatcherSettings +import com.wavesplatform.dex.statuses.MatcherStatus import com.wavesplatform.dex.time.Time import io.swagger.annotations._ diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/state/WsAddressState.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/state/WsAddressState.scala index a8485cbba0..c0e013fa4a 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/state/WsAddressState.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/state/WsAddressState.scala @@ -2,6 +2,7 @@ package com.wavesplatform.dex.api.ws.state import akka.actor.typed.ActorRef import cats.syntax.option._ +import com.wavesplatform.dex.api.ws.converters.WsMatchTxInfoConverter import com.wavesplatform.dex.api.ws.entities._ import com.wavesplatform.dex.api.ws.protocol.WsAddressChanges import com.wavesplatform.dex.api.ws.state.WsAddressState.Subscription @@ -88,7 +89,7 @@ final case class WsAddressState( val fd = efc.unsafeAssetDecimals(ao.feeAsset) def mkMatchTxInfo(): Option[WsMatchTransactionInfo] = maybeMatchTx.map { matchTx => - WsMatchTransactionInfo.normalized( + WsMatchTxInfoConverter.toWs( ao.order.assetPair, txId = matchTx.id(), timestamp = matchTx.timestamp, diff --git a/dex/src/main/scala/com/wavesplatform/dex/api/ws/state/WsOrderBookState.scala b/dex/src/main/scala/com/wavesplatform/dex/api/ws/state/WsOrderBookState.scala index 10242ca8c5..9abb5058a7 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/api/ws/state/WsOrderBookState.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/api/ws/state/WsOrderBookState.scala @@ -3,7 +3,6 @@ package com.wavesplatform.dex.api.ws.state import akka.actor.typed.ActorRef import cats.syntax.option._ import com.wavesplatform.dex.api.ws.entities.{WsLastTrade, WsOrderBookSettings} -import com.wavesplatform.dex.api.ws.protocol import com.wavesplatform.dex.api.ws.protocol.WsOrderBookChanges import com.wavesplatform.dex.api.ws.state.WsAddressState.getNextUpdateId import com.wavesplatform.dex.api.ws.state.WsOrderBookState._ @@ -58,7 +57,7 @@ case class WsOrderBookState( wsConnections = if (hasChanges) { val changes = - protocol.WsOrderBookChanges( + WsOrderBookChanges( assetPair = assetPair, asks = denormalized(amountDecimals, priceDecimals, take(asks, changedAsks), OrderBook.asksDenormalizedOrdering), bids = denormalized(amountDecimals, priceDecimals, take(bids, changedBids), OrderBook.bidsDenormalizedOrdering), diff --git a/dex/src/main/scala/com/wavesplatform/dex/codecs/ByteBufferCodecs.scala b/dex/src/main/scala/com/wavesplatform/dex/codecs/ByteBufferCodecs.scala index fe206f3f9d..54541a037e 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/codecs/ByteBufferCodecs.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/codecs/ByteBufferCodecs.scala @@ -1,11 +1,11 @@ package com.wavesplatform.dex.codecs import java.nio.ByteBuffer - import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.bytes.ByteStr -import com.wavesplatform.dex.model.{AcceptedOrderType, OrderStatus} +import com.wavesplatform.dex.domain.order.AcceptedOrderType +import com.wavesplatform.dex.model.OrderStatus object ByteBufferCodecs { diff --git a/dex/src/main/scala/com/wavesplatform/dex/db/OrderDb.scala b/dex/src/main/scala/com/wavesplatform/dex/db/OrderDb.scala index 4c89871f1f..e0aff6f2b0 100755 --- a/dex/src/main/scala/com/wavesplatform/dex/db/OrderDb.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/db/OrderDb.scala @@ -96,9 +96,7 @@ object OrderDb { } - val orderIdOrdering: Ordering[(Order.Id, Long)] = Ordering.by { case (id, ts) => (-ts, id) } - - def orderInfoOrdering: Ordering[(ByteStr, OrderInfo[OrderStatus])] = orderIdOrdering.on { + def orderInfoOrdering: Ordering[(ByteStr, OrderInfo[OrderStatus])] = Order.orderIdOrdering.on { case (id, orderInfo) => (id, orderInfo.timestamp) } diff --git a/dex/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/MatcherExtensionAssetsCachingClient.scala b/dex/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/MatcherExtensionAssetsCachingClient.scala index 957c6c4a69..8f7ae3bc58 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/MatcherExtensionAssetsCachingClient.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/MatcherExtensionAssetsCachingClient.scala @@ -10,9 +10,9 @@ import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.domain.transaction.ExchangeTransaction import com.wavesplatform.dex.domain.utils.ScorexLogging -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.Status import com.wavesplatform.dex.grpc.integration.clients.domain.{AddressBalanceUpdates, WavesNodeUpdates} import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription +import com.wavesplatform.dex.statuses.CombinedStreamStatus import monix.eval.Task import monix.reactive.Observable @@ -86,5 +86,5 @@ class MatcherExtensionAssetsCachingClient( .map(_ => ()) } - override def status(): Status = underlying.status() + override def status(): CombinedStreamStatus = underlying.status() } diff --git a/dex/src/main/scala/com/wavesplatform/dex/json/Implicits.scala b/dex/src/main/scala/com/wavesplatform/dex/json/Implicits.scala deleted file mode 100644 index 4537873242..0000000000 --- a/dex/src/main/scala/com/wavesplatform/dex/json/Implicits.scala +++ /dev/null @@ -1,21 +0,0 @@ -package com.wavesplatform.dex.json - -import com.wavesplatform.dex.fp.MayBeEmpty -import play.api.libs.functional.syntax._ -import play.api.libs.json._ - -object Implicits { - - implicit final class JsPathOps(val self: JsPath) extends AnyVal { - - def formatMayBeEmpty[T](implicit f: Format[T], mayBeEmpty: MayBeEmpty[T]): OFormat[T] = - self - .formatNullable[T] - .inmap[T]( - _.fold(mayBeEmpty.empty)(identity), - Option(_).filterNot(mayBeEmpty.isEmpty) - ) - - } - -} diff --git a/dex/src/main/scala/com/wavesplatform/dex/model/MatcherModel.scala b/dex/src/main/scala/com/wavesplatform/dex/model/MatcherModel.scala index 968a7f9d58..9e683c788b 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/model/MatcherModel.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/model/MatcherModel.scala @@ -6,7 +6,7 @@ import cats.syntax.group._ import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.model.Price -import com.wavesplatform.dex.domain.order.{Order, OrderType} +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order, OrderStatusNames, OrderType} import com.wavesplatform.dex.domain.transaction.ExchangeTransaction import com.wavesplatform.dex.error import com.wavesplatform.dex.fp.MapImplicits.cleaningGroup @@ -356,41 +356,29 @@ object OrderStatus { sealed trait Final extends OrderStatus case object Accepted extends OrderStatus { - val name = "Accepted" + val name = OrderStatusNames.ACCEPTED override def filledAmount: Long = 0 override def filledFee: Long = 0 } case object NotFound extends Final { - val name = "NotFound" + val name = OrderStatusNames.NOT_FOUND override def filledAmount: Long = 0 override def filledFee: Long = 0 } case class PartiallyFilled(filledAmount: Long, filledFee: Long) extends OrderStatus { - val name = PartiallyFilled.name - } - - object PartiallyFilled { - val name = "PartiallyFilled" + val name = OrderStatusNames.PARTIALLY_FILLED } case class Filled(filledAmount: Long, filledFee: Long) extends Final { - val name = Filled.name - } - - object Filled { - val name = "Filled" + val name = OrderStatusNames.FILLED } case class Cancelled(filledAmount: Long, filledFee: Long) extends Final { - val name = Cancelled.name - } - - object Cancelled { - val name = "Cancelled" + val name = OrderStatusNames.CANCELLED } def finalCancelStatus(ao: AcceptedOrder, reason: OrderCanceledReason): Final = { diff --git a/dex/src/main/scala/com/wavesplatform/dex/model/OrderInfo.scala b/dex/src/main/scala/com/wavesplatform/dex/model/OrderInfo.scala index fb54bdf8bd..d6cdb296ec 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/model/OrderInfo.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/model/OrderInfo.scala @@ -2,12 +2,11 @@ package com.wavesplatform.dex.model import java.math.BigInteger import java.nio.ByteBuffer - import com.google.common.primitives.{Ints, Longs} import com.wavesplatform.dex.codecs.ByteBufferCodecs.ByteBufferExt import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} -import com.wavesplatform.dex.domain.order.{Order, OrderType} +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order, OrderType} sealed trait OrderInfo[+S <: OrderStatus] { diff --git a/dex/src/main/scala/com/wavesplatform/dex/model/OrderValidator.scala b/dex/src/main/scala/com/wavesplatform/dex/model/OrderValidator.scala index 39bd8504b8..19d5fc0786 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/model/OrderValidator.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/model/OrderValidator.scala @@ -128,11 +128,12 @@ object OrderValidator extends ScorexLogging { def normalizePrice(prc: Double): Long = Normalization.normalizePrice(prc, amountAssetDecimals, priceAssetDecimals) liftValueAsync(order) - .ensure(error.OrderInvalidAmount(order, restrictions)) { o => - normalizeAmount(restrictions.minAmount) <= o.amount && o.amount <= normalizeAmount(restrictions.maxAmount) && - o.amount % normalizeAmount(restrictions.stepAmount).max(1) == 0 + .ensure(error.OrderInvalidAmount(order, OrderRestriction(restrictions.minAmount, restrictions.maxAmount, restrictions.stepAmount))) { + o => + normalizeAmount(restrictions.minAmount) <= o.amount && o.amount <= normalizeAmount(restrictions.maxAmount) && + o.amount % normalizeAmount(restrictions.stepAmount).max(1) == 0 } - .ensure(error.OrderInvalidPrice(order, restrictions)) { o => + .ensure(error.OrderInvalidPrice(order, OrderRestriction(restrictions.minPrice, restrictions.maxPrice, restrictions.stepPrice))) { o => normalizePrice(restrictions.minPrice) <= o.price && o.price <= normalizePrice(restrictions.maxPrice) && o.price % normalizePrice(restrictions.stepPrice).max(1) == 0 } @@ -327,7 +328,7 @@ object OrderValidator extends ScorexLogging { * best bid = highest price of buy * best ask = lowest price of sell */ - private def validatePriceDeviation(order: Order, deviationSettings: DeviationsSettings, marketStatus: Option[MarketStatus])(implicit + private def validatePriceDeviation(order: Order, deviations: Deviations, marketStatus: Option[MarketStatus])(implicit efc: ErrorFormatterContext ): Result[Order] = { @@ -343,9 +344,9 @@ object OrderValidator extends ScorexLogging { isPriceHigherThanMinDeviation && isPriceLessThanMaxDeviation } - lift(order).ensure(error.DeviantOrderPrice(order, deviationSettings)) { _ => - if (order.orderType == OrderType.BUY) isPriceInDeviationBounds(deviationSettings.maxPriceProfit, deviationSettings.maxPriceLoss) - else isPriceInDeviationBounds(deviationSettings.maxPriceLoss, deviationSettings.maxPriceProfit) + lift(order).ensure(error.DeviantOrderPrice(order, deviations)) { _ => + if (order.orderType == OrderType.BUY) isPriceInDeviationBounds(deviations.maxPriceProfit, deviations.maxPriceLoss) + else isPriceInDeviationBounds(deviations.maxPriceLoss, deviations.maxPriceProfit) } } @@ -365,7 +366,7 @@ object OrderValidator extends ScorexLogging { */ private def validateFeeDeviation( order: Order, - deviationSettings: DeviationsSettings, + deviations: Deviations, orderFeeSettings: OrderFeeSettings, marketStatus: Option[MarketStatus] )(implicit efc: ErrorFormatterContext): Result[Order] = { @@ -375,7 +376,7 @@ object OrderValidator extends ScorexLogging { order.matcherFee >= getMinValidFeeForPercentFeeSettings( order, - PercentSettings(assetType, minFee * (1 - (deviationSettings.maxFeeDeviation / 100))), + PercentSettings(assetType, minFee * (1 - (deviations.maxFeeDeviation / 100))), matchedPrice ) case _ => true @@ -391,18 +392,19 @@ object OrderValidator extends ScorexLogging { } } - Either.cond(isFeeInDeviationBounds, order, error.DeviantOrderMatcherFee(order, deviationSettings)) + Either.cond(isFeeInDeviationBounds, order, error.DeviantOrderMatcherFee(order, deviations)) } def marketAware(orderFeeSettings: OrderFeeSettings, deviationSettings: DeviationsSettings, marketStatus: Option[MarketStatus])( order: Order )(implicit efc: ErrorFormatterContext): Result[Order] = - if (deviationSettings.enable) + if (deviationSettings.enable) { + val deviations = Deviations(deviationSettings.maxPriceProfit, deviationSettings.maxPriceLoss, deviationSettings.maxFeeDeviation) for { - _ <- validatePriceDeviation(order, deviationSettings, marketStatus) - _ <- validateFeeDeviation(order, deviationSettings, orderFeeSettings, marketStatus) + _ <- validatePriceDeviation(order, deviations, marketStatus) + _ <- validateFeeDeviation(order, deviations, orderFeeSettings, marketStatus) } yield order - else lift(order) + } else lift(order) def timeAware(time: Time)(order: Order): Result[Order] = for { diff --git a/dex/src/main/scala/com/wavesplatform/dex/settings/AssetType.scala b/dex/src/main/scala/com/wavesplatform/dex/settings/AssetType.scala index 40d5291daa..dcae9b3d09 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/settings/AssetType.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/settings/AssetType.scala @@ -1,6 +1,6 @@ package com.wavesplatform.dex.settings -import cats.implicits.catsSyntaxEitherId +import cats.syntax.either._ import com.wavesplatform.dex.settings.utils.RawFailureReason import enumeratum.{Enum, EnumEntry, PlayLowercaseJsonEnum} import pureconfig.ConfigReader diff --git a/dex/src/main/scala/com/wavesplatform/dex/settings/package.scala b/dex/src/main/scala/com/wavesplatform/dex/settings/package.scala index 78f480bc26..e7503b6b16 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/settings/package.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/settings/package.scala @@ -3,22 +3,15 @@ package com.wavesplatform.dex import cats.syntax.either._ import com.typesafe.config.{Config, ConfigFactory} import com.wavesplatform.dex.error.Implicits.ThrowableOps -import com.wavesplatform.dex.settings.utils.ConfigOps.ConfigOps -import com.wavesplatform.dex.tool.LocaleUtils +import com.wavesplatform.dex.settings.ConfigOps.ConfigOps import pureconfig.ConfigSource -import java.text.DecimalFormat import scala.util.Try package object settings { implicit def toConfigOps(config: Config): ConfigOps = new ConfigOps(config) - private val format = new DecimalFormat("#.################", LocaleUtils.symbols) - - /** Formats amount or price */ - def formatValue(value: BigDecimal): String = format.format(value.bigDecimal) - def loadMatcherSettings(config: Config): Either[String, MatcherSettings] = Try(ConfigSource.fromConfig(loadConfig(config)).at("waves.dex").loadOrThrow[MatcherSettings]) .toEither.leftMap(th => s"Cannot load matcher settings: ${th.getWithStackTrace}") diff --git a/dex/src/main/scala/com/wavesplatform/dex/settings/utils/ConfigReaders.scala b/dex/src/main/scala/com/wavesplatform/dex/settings/utils/ConfigReaders.scala index 1468ae88df..a424bb6992 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/settings/utils/ConfigReaders.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/settings/utils/ConfigReaders.scala @@ -20,6 +20,7 @@ trait ConfigReaders { implicit val publicKeyReader = byteStr58ConfigReader.map(PublicKey(_)) implicit val uriReader = ConfigReader.fromString(x => Uri.parse(x).left.map(e => CannotConvert(x, "Uri", e))) + } object ConfigReaders extends ConfigReaders diff --git a/dex/src/main/scala/com/wavesplatform/dex/tool/Checker.scala b/dex/src/main/scala/com/wavesplatform/dex/tool/Checker.scala index 873bd2538d..3df8637eef 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/tool/Checker.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/tool/Checker.scala @@ -6,6 +6,7 @@ import cats.syntax.either._ import cats.syntax.option._ import cats.syntax.traverse._ import com.typesafe.config.Config +import com.wavesplatform.dex.api.http.converters.HttpOrderStatusConverter import com.wavesplatform.dex.api.http.entities.HttpOrderStatus import com.wavesplatform.dex.api.ws.protocol.{WsAddressChanges, WsOrderBookChanges} import com.wavesplatform.dex.cli._ @@ -14,7 +15,7 @@ import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.model.{Denormalization, Normalization} import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} -import com.wavesplatform.dex.domain.order.{Order, OrderType, OrderV3} +import com.wavesplatform.dex.domain.order.{Order, OrderStatusNames, OrderType, OrderV3} import com.wavesplatform.dex.model.OrderStatus import com.wavesplatform.dex.settings.MatcherSettings import com.wavesplatform.dex.tool.connectors.DexExtensionGrpcConnector.DetailedBalance @@ -130,7 +131,7 @@ class Checker(superConnector: SuperConnector) { v.foreach { o => val id = (o \ "id").as[ByteStr] dexRest.cancelOrder(id, assetPairInfo.assetPair, env.matcherKeyPair) - dexRest.waitForOrderStatus(id, assetPairInfo.assetPair, OrderStatus.Cancelled.name) + dexRest.waitForOrderStatus(id, assetPairInfo.assetPair, OrderStatusNames.CANCELLED) } dexRest.getActiveOrdersByPair(env.matcherKeyPair, assetPairInfo.assetPair) match { case Left(x) => Left(x) @@ -145,7 +146,7 @@ class Checker(superConnector: SuperConnector) { for { activeOrders <- dexRest.getActiveOrdersByPair(env.matcherKeyPair, assetPair).map(_.map(j => (j \ "id").as[ByteStr]).toList) _ <- activeOrders.traverse(id => dexRest.cancelOrder(id, assetPair, env.matcherKeyPair)) - _ <- activeOrders.traverse(id => dexRest.waitForOrderStatus(id, assetPair, OrderStatus.Cancelled.name)) + _ <- activeOrders.traverse(id => dexRest.waitForOrderStatus(id, assetPair, OrderStatusNames.CANCELLED)) } yield if (activeOrders.isEmpty) (assetPairInfo, s"Matcher didn't have any active orders on a test asset pair ${assetPair.toString}") else (assetPairInfo, s"Matcher had active orders on a test asset pair ${assetPair.toString}: ${activeOrders.mkString(", ")} cancelled") @@ -163,7 +164,7 @@ class Checker(superConnector: SuperConnector) { private def checkCancellation(order: Order): CheckLoggedResult[Order] = for { _ <- dexRest.cancelOrder(order, env.matcherKeyPair) - _ <- dexRest.waitForOrderStatus(order, OrderStatus.Cancelled.name) + _ <- dexRest.waitForOrderStatus(order, OrderStatusNames.CANCELLED) } yield order -> s"Order with id ${order.id()} cancelled" private def checkExecution(assetPairInfo: AssetPairInfo): ErrorOr[String] = { @@ -176,7 +177,7 @@ class Checker(superConnector: SuperConnector) { lazy val expectedFilledStatus = { val orderStatus = OrderStatus.Filled(submitted.amount, submitted.matcherFee) - HttpOrderStatus.httpOrderStatusFormat.writes(HttpOrderStatus from orderStatus).toString + HttpOrderStatus.httpOrderStatusFormat.writes(HttpOrderStatusConverter from orderStatus).toString } ( @@ -199,7 +200,7 @@ class Checker(superConnector: SuperConnector) { _ <- dexRest.placeOrder(counter) counterStatus <- dexRest.waitForOrderStatus(counter, OrderStatus.Accepted.name) _ <- dexRest.placeOrder(submitted) - submittedStatus <- dexRest.waitForOrderStatus(submitted, OrderStatus.Filled.name) + submittedStatus <- dexRest.waitForOrderStatus(submitted, OrderStatusNames.FILLED) _ <- checkFillingAtDex(submittedStatus) txs <- awaitSubmittedOrderAtNode } yield { diff --git a/dex/src/main/scala/com/wavesplatform/dex/tool/ComparisonTool.scala b/dex/src/main/scala/com/wavesplatform/dex/tool/ComparisonTool.scala index fe21e63a9f..468ec47197 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/tool/ComparisonTool.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/tool/ComparisonTool.scala @@ -1,10 +1,10 @@ package com.wavesplatform.dex.tool import com.wavesplatform.dex.domain.asset.Asset + import java.io.File import java.util.{Timer, TimerTask} import java.util.concurrent.{Executors, TimeUnit} - import cats.data.NonEmptyList import cats.syntax.either._ import com.google.common.util.concurrent.ThreadFactoryBuilder @@ -14,10 +14,10 @@ import com.wavesplatform.dex.cli.ErrorOr import com.wavesplatform.dex.domain.account.{AddressScheme, PublicKey} import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.error.Implicits.ThrowableOps -import com.wavesplatform.dex.json import com.wavesplatform.dex.settings.{loadConfig, MatcherSettings} import com.wavesplatform.dex.tool.ComparisonTool._ import com.wavesplatform.dex.domain.asset.AssetPair +import com.wavesplatform.dex.utils.JsonImplicits import play.api.libs.json.Json import pureconfig.ConfigSource import sttp.client3.asynchttpclient.future.AsyncHttpClientFutureBackend @@ -102,7 +102,7 @@ class ComparisonTool(settings: Settings) extends ScorexLogging { private def parse(response: Response[Either[String, String]]): TradableBalanceCheckResponse = response.body match { case Left(_) => TradableBalanceCheckResponse.Failed(response.code.code) - case Right(body) => TradableBalanceCheckResponse.Parsed(Json.parse(body).as[Map[Asset, Long]](json.assetMapFormat[Long])) + case Right(body) => TradableBalanceCheckResponse.Parsed(Json.parse(body).as[Map[Asset, Long]](JsonImplicits.assetMapFormat[Long])) } } diff --git a/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/AuthServiceRestConnector.scala b/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/AuthServiceRestConnector.scala index 0c2e2db3dc..0c6629923d 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/AuthServiceRestConnector.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/AuthServiceRestConnector.scala @@ -1,9 +1,9 @@ package com.wavesplatform.dex.tool.connectors +import com.wavesplatform.dex.auth.JwtUtils + import java.nio.charset.StandardCharsets import java.util.concurrent.ThreadLocalRandom - -import com.wavesplatform.dex.auth.JwtUtils import com.wavesplatform.dex.cli.ErrorOr import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.crypto diff --git a/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/DexRestConnector.scala b/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/DexRestConnector.scala index ca597360b8..76394ac24e 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/DexRestConnector.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/DexRestConnector.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.tool.connectors import cats.syntax.option._ import com.google.common.primitives.Longs -import com.wavesplatform.dex.api.http.protocol.HttpCancelOrder +import com.wavesplatform.dex.api.http.entities.protocol.HttpCancelOrder import com.wavesplatform.dex.cli.ErrorOr import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.AssetPair diff --git a/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/DexWsConnector.scala b/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/DexWsConnector.scala index 49cb3f2b4d..ed5f51f9fc 100644 --- a/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/DexWsConnector.scala +++ b/dex/src/main/scala/com/wavesplatform/dex/tool/connectors/DexWsConnector.scala @@ -4,7 +4,7 @@ import akka.actor.ActorSystem import akka.stream.Materializer import cats.syntax.either._ import com.wavesplatform.dex.api.ws.connection.WsConnection -import com.wavesplatform.dex.api.ws.connection.WsConnectionOps._ +import com.wavesplatform.dex.api.ws.connection.WsConnectionOps.Ops import com.wavesplatform.dex.api.ws.protocol._ import com.wavesplatform.dex.cli.{lift, ErrorOr} import com.wavesplatform.dex.domain.asset.AssetPair diff --git a/dex/src/test/scala/com/wavesplatform/dex/MatcherSpecBase.scala b/dex/src/test/scala/com/wavesplatform/dex/MatcherSpecBase.scala index da47448c46..14ff903189 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/MatcherSpecBase.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/MatcherSpecBase.scala @@ -3,9 +3,8 @@ package com.wavesplatform.dex import com.google.common.base.Charsets import com.google.common.primitives.{Bytes, Ints} import com.softwaremill.diffx.{Derived, Diff} -import com.wavesplatform.dex.api.ws.protocol.WsError import com.wavesplatform.dex.api.ws.entities.WsMatchTransactionInfo -import com.wavesplatform.dex.asset.DoubleOps +import com.wavesplatform.dex.api.ws.protocol.WsError import com.wavesplatform.dex.caches.RateCache import com.wavesplatform.dex.db.TestRateDb import com.wavesplatform.dex.domain.account.{Address, KeyPair} @@ -26,8 +25,9 @@ import com.wavesplatform.dex.queue.ValidatedCommand.{CancelOrder, DeleteOrderBoo import com.wavesplatform.dex.queue.{ValidatedCommand, ValidatedCommandWithMeta} import com.wavesplatform.dex.settings.OrderFeeSettings._ import com.wavesplatform.dex.settings.{loadConfig, AssetType, MatcherSettings, OrderFeeSettings} -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits import com.wavesplatform.dex.time.SystemTime +import com.wavesplatform.dex.util.DoubleOps +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import com.wavesplatform.dex.waves.WavesFeeConstants import io.qameta.allure.scalatest.AllureScalatestContext import kamon.context.Context diff --git a/dex/src/test/scala/com/wavesplatform/dex/actors/AskActorSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/actors/AskActorSpec.scala index 6c1830549c..626c26f3c6 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/actors/AskActorSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/actors/AskActorSpec.scala @@ -2,8 +2,8 @@ package com.wavesplatform.dex.actors import akka.actor.ActorRef import akka.testkit.TestProbe -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits import com.wavesplatform.dex.time.SystemTime +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/actors/SnapshotStateSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/actors/SnapshotStateSpecification.scala index 60cc558422..454391fc8f 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/actors/SnapshotStateSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/actors/SnapshotStateSpecification.scala @@ -1,9 +1,9 @@ package com.wavesplatform.dex.actors -import com.wavesplatform.dex.NoShrink import com.wavesplatform.dex.domain.asset.Asset.IssuedAsset import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.bytes.ByteStr +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.matchers.should.Matchers import org.scalatest.propspec.AnyPropSpecLike diff --git a/dex/src/test/scala/com/wavesplatform/dex/actors/address/AddressActorSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/actors/address/AddressActorSpecification.scala index 454e8998e6..6124bf5753 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/actors/address/AddressActorSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/actors/address/AddressActorSpecification.scala @@ -26,7 +26,7 @@ import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription import com.wavesplatform.dex.model.Events.{OrderAdded, OrderAddedReason, OrderCancelFailed, OrderExecuted} import com.wavesplatform.dex.model.{AcceptedOrder, LimitOrder, MarketOrder} import com.wavesplatform.dex.queue.{ValidatedCommand, ValidatedCommandWithMeta} -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.{BeforeAndAfterAll, EitherValues} import org.scalatest.concurrent.Eventually import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/actors/address/AddressBalanceSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/actors/address/AddressBalanceSpec.scala index 360cc32101..5c513a6282 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/actors/address/AddressBalanceSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/actors/address/AddressBalanceSpec.scala @@ -4,13 +4,13 @@ import cats.instances.long._ import cats.syntax.group._ import cats.syntax.option._ import com.softwaremill.diffx.scalatest.DiffMatcher -import com.wavesplatform.dex.NoShrink import com.wavesplatform.dex.actors.Generators import com.wavesplatform.dex.actors.address.AddressBalance.{NotCreatedTxData, NotObservedTxData} import com.wavesplatform.dex.collections.{NegativeMap, NonNegativeMap, NonPositiveMap, PositiveMap} import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.fp.MapImplicits.group -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.util.NoShrink +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalacheck.{Arbitrary, Gen} import org.scalatest.freespec.AnyFreeSpecLike import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/actors/orderbook/AggregatedOrderBookActorSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/actors/orderbook/AggregatedOrderBookActorSpec.scala index 9e5546f800..9428ecf157 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/actors/orderbook/AggregatedOrderBookActorSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/actors/orderbook/AggregatedOrderBookActorSpec.scala @@ -8,10 +8,11 @@ import akka.actor.typed.scaladsl.adapter._ import akka.http.scaladsl.model.HttpResponse import akka.testkit.TestProbe import cats.data.NonEmptyList -import com.wavesplatform.dex.NoShrink import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor.{Command, InputMessage, MarketStatus, Query} import com.wavesplatform.dex.actors.{MatcherSpecLike, OrderBookAskAdapter, OrderBookDirectoryActor} +import com.wavesplatform.dex.api.http.converters.HttpV0LevelAggConverter import com.wavesplatform.dex.api.http.entities.{HttpV0LevelAgg, HttpV0OrderBook} +import com.wavesplatform.dex.api.ws.converters.WsOrderRestrictionsConverter import com.wavesplatform.dex.api.ws.entities.WsOrderBookSettings import com.wavesplatform.dex.api.ws.protocol.{WsMessage, WsOrderBookChanges} import com.wavesplatform.dex.db.TestOrderBookSnapshotDb @@ -24,8 +25,9 @@ import com.wavesplatform.dex.error.ErrorFormatterContext import com.wavesplatform.dex.gen.OrderBookGen import com.wavesplatform.dex.model._ import com.wavesplatform.dex.settings.{DenormalizedMatchingRule, MatchingRule, OrderRestrictionsSettings} -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits import com.wavesplatform.dex.time.{SystemTime, Time} +import com.wavesplatform.dex.util.NoShrink +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalacheck.Gen import org.scalatest.concurrent.Eventually import org.scalatest.freespec.AnyFreeSpec @@ -376,7 +378,10 @@ class AggregatedOrderBookActorSpec snapshot.asks shouldBe empty snapshot.bids shouldBe empty snapshot.lastTrade shouldBe None - snapshot.settings should matchTo(Option(WsOrderBookSettings(maybeRestrictions, Some(tickSize)))) + snapshot.settings should matchTo(Option(WsOrderBookSettings( + maybeRestrictions.map(v => WsOrderRestrictionsConverter.toWs(v)), + Some(tickSize) + ))) } def mkAoba(maybeRestrictions: Option[OrderRestrictionsSettings], tickSize: Double): ActorRef[InputMessage] = @@ -421,7 +426,7 @@ class AggregatedOrderBookActorSpec private def levelAggsFromSide(side: Side): List[HttpV0LevelAgg] = AggregatedOrderBookActor .aggregateByPrice(side) - .map(pa => HttpV0LevelAgg.fromLevelAgg(AggregatedOrderBookActor.toLevelAgg(pa))) + .map(pa => HttpV0LevelAggConverter.fromLevelAgg(AggregatedOrderBookActor.toLevelAgg(pa))) .toList .sortBy(_.price)(side.ordering) diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpBalanceSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpBalanceSpec.scala index 731de37ab1..54fbbb76dd 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpBalanceSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpBalanceSpec.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.bytes.codec.Base58 -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpErrorSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpErrorSpec.scala index d7ba4824d7..e0904f5f57 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpErrorSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpErrorSpec.scala @@ -1,7 +1,7 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.error.OrderDuplicate -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpMatcherPublicSettingsSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpMatcherPublicSettingsSpec.scala index 760981b95d..c53c488c39 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpMatcherPublicSettingsSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpMatcherPublicSettingsSpec.scala @@ -4,7 +4,7 @@ import com.wavesplatform.dex.domain.account.PublicKey import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.bytes.codec.Base58 import com.wavesplatform.dex.domain.utils.EitherExt2 -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpMessageSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpMessageSpec.scala index 8fc19beea7..bf0cec0555 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpMessageSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpMessageSpec.scala @@ -1,6 +1,6 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItemSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItemSpec.scala index e990e2dd17..76643b573a 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItemSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookHistoryItemSpec.scala @@ -3,9 +3,9 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.bytes.ByteStr -import com.wavesplatform.dex.domain.order.OrderType -import com.wavesplatform.dex.model.{AcceptedOrderType, OrderStatus} -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, OrderType} +import com.wavesplatform.dex.model.OrderStatus +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookInfoSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookInfoSpec.scala index a4e0926f62..1acf8675a6 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookInfoSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookInfoSpec.scala @@ -1,6 +1,6 @@ package com.wavesplatform.dex.api.http.entities -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatusSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatusSpec.scala index 2761d78ff8..e8c7883e03 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatusSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderBookStatusSpec.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.api.http.entities import cats.syntax.option._ import com.wavesplatform.dex.domain.order.OrderType -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.{JsBoolean, JsString, Json} diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeModeSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeModeSpec.scala index b62d8d4ac0..b651b9cd74 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeModeSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpOrderFeeModeSpec.scala @@ -3,8 +3,7 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.api.http.entities.HttpOrderFeeMode.{FeeModeDynamic, FeeModeFixed, FeeModePercent} import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.bytes.codec.Base58 -import com.wavesplatform.dex.settings.AssetType -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json @@ -36,7 +35,7 @@ class HttpOrderFeeModeSpec extends AnyFreeSpec with Matchers with DiffMatcherWit | } |}""".stripMargin - private val percentMode: HttpOrderFeeMode = FeeModePercent(AssetType.Price, 0.14) + private val percentMode: HttpOrderFeeMode = FeeModePercent(HttpAssetType.Price, 0.14) private val dynamicMode: HttpOrderFeeMode = FeeModeDynamic(600000, Map(Waves -> 1)) diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpRatesSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpRatesSpec.scala index 34f0625fdf..908efc31b0 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpRatesSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpRatesSpec.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.bytes.codec.Base58 -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSnapshotOffsetsSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSnapshotOffsetsSpec.scala index 2f329d8993..051d88c7d1 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSnapshotOffsetsSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSnapshotOffsetsSpec.scala @@ -3,7 +3,7 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.bytes.codec.Base58 -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancelSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancelSpec.scala index e69810ce6f..014b8216cf 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancelSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulBatchCancelSpec.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.error.CanNotPersistEvent -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulPlaceSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulPlaceSpec.scala index 6671ff7154..9ed828ee11 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulPlaceSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulPlaceSpec.scala @@ -6,7 +6,7 @@ import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.bytes.codec.Base58 import com.wavesplatform.dex.domain.order.{OrderType, OrderV1} -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulSingleCancelSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulSingleCancelSpec.scala index 9d17c26d6d..afd41447f7 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulSingleCancelSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSuccessfulSingleCancelSpec.scala @@ -1,7 +1,7 @@ package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.domain.bytes.ByteStr -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatusSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatusSpec.scala index 7cfc5cfdcb..fae791dfee 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatusSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpSystemStatusSpec.scala @@ -1,7 +1,8 @@ package com.wavesplatform.dex.api.http.entities +import com.wavesplatform.dex.api.http.converters.HttpOrderStatusConverter import com.wavesplatform.dex.model.OrderStatus -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json @@ -17,7 +18,7 @@ class HttpOrderStatusSpec extends AnyFreeSpec with Matchers with DiffMatcherWith OrderStatus.Cancelled(202, 12) -> """{"status":"Cancelled","filledAmount":202,"filledFee":12}""" ).foreach { case (status, json) => - val apiStatus = HttpOrderStatus.from(status) + val apiStatus = HttpOrderStatusConverter.from(status) status.name - { "deserialization" in { diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpTradingMarketsSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpTradingMarketsSpec.scala index 29084c84ef..168d1463e3 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpTradingMarketsSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpTradingMarketsSpec.scala @@ -1,10 +1,11 @@ package com.wavesplatform.dex.api.http.entities import cats.syntax.option._ +import com.softwaremill.diffx.Diff import com.wavesplatform.dex.domain.account.PublicKey import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.utils.EitherExt2 -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBookSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBookSpec.scala index 2b28ab7bcb..c0936211d3 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBookSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpV0OrderBookSpec.scala @@ -1,9 +1,10 @@ package com.wavesplatform.dex.api.http.entities +import com.wavesplatform.dex.api.http.converters.HttpV0LevelAggConverter import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.model.LevelAgg -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json @@ -39,8 +40,11 @@ class HttpV0OrderBookSpec extends AnyFreeSpec with Matchers with DiffMatcherWith private val bids = List(LevelAgg(10000000000000L, 41), LevelAgg(2500000000000L, 40), LevelAgg(300000000000000L, 1)) private val asks = List(LevelAgg(50000000000L, 50), LevelAgg(2500000000000L, 51)) - private val orderBookV0 = HttpV0OrderBook(0, assetPair, bids.map(HttpV0LevelAgg.fromLevelAgg), asks.map(HttpV0LevelAgg.fromLevelAgg)) - private val orderBookResult = HttpOrderBook(0, assetPair, bids, asks) + private val orderBookV0 = + HttpV0OrderBook(0, assetPair, bids.map(HttpV0LevelAggConverter.fromLevelAgg), asks.map(HttpV0LevelAggConverter.fromLevelAgg)) + + private val orderBookResult = + HttpOrderBook(0, assetPair, bids.map(v => HttpLevelAgg(v.amount, v.price)), asks.map(v => HttpLevelAgg(v.amount, v.price))) "backward JSON compatibility" - { "deserialization" in { diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBookSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBookSpec.scala index dc8c0055a8..6431eb585b 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBookSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/entities/HttpV1OrderBookSpec.scala @@ -1,11 +1,12 @@ package com.wavesplatform.dex.api.http.entities import cats.syntax.option._ +import com.wavesplatform.dex.api.http.converters.HttpV1LevelAggConverter import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.{Asset, AssetPair} import com.wavesplatform.dex.error.ErrorFormatterContext import com.wavesplatform.dex.model.LevelAgg -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers import play.api.libs.json.Json @@ -32,11 +33,12 @@ class HttpV1OrderBookSpec extends AnyFreeSpec with Matchers with DiffMatcherWith private val orderBookV1 = HttpV1OrderBook( timestamp = 0, - bids = bids.map(la => HttpV1LevelAgg.fromLevelAgg(la, wavesUsdPair)), - asks = asks.map(la => HttpV1LevelAgg.fromLevelAgg(la, wavesUsdPair)) + bids = bids.map(la => HttpV1LevelAggConverter.fromLevelAgg(la, wavesUsdPair)), + asks = asks.map(la => HttpV1LevelAggConverter.fromLevelAgg(la, wavesUsdPair)) ) - private val orderBookResult = HttpOrderBook(0, wavesUsdPair, bids, asks, Some(8 -> 2)) + private val orderBookResult = + HttpOrderBook(0, wavesUsdPair, bids.map(v => HttpLevelAgg(v.amount, v.price)), asks.map(v => HttpLevelAgg(v.amount, v.price)), Some(8 -> 2)) "backward JSON compatibility" - { "deserialization" in { diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/MatcherApiRouteSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/MatcherApiRouteSpec.scala index affc01fb6e..28a47a4551 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/MatcherApiRouteSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/MatcherApiRouteSpec.scala @@ -23,14 +23,14 @@ import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor.MarketStatus import com.wavesplatform.dex.api.RouteSpec import com.wavesplatform.dex.api.http.ApiMarshallers._ +import com.wavesplatform.dex.api.http.converters.HttpV0LevelAggConverter import com.wavesplatform.dex.api.http.entities._ +import com.wavesplatform.dex.api.http.entities.protocol.HttpCancelOrder import com.wavesplatform.dex.api.http.headers.{`X-Api-Key`, CustomContentTypes} -import com.wavesplatform.dex.api.http.protocol.HttpCancelOrder import com.wavesplatform.dex.api.http.routes.v0.MarketsRoute.Settings import com.wavesplatform.dex.api.http.routes.v0._ import com.wavesplatform.dex.api.http.{entities, OrderBookHttpInfo} import com.wavesplatform.dex.api.ws.actors.WsExternalClientDirectoryActor -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.caches.RateCache import com.wavesplatform.dex.db._ import com.wavesplatform.dex.domain.account.{Address, AddressScheme, KeyPair, PublicKey} @@ -42,19 +42,19 @@ import com.wavesplatform.dex.domain.crypto import com.wavesplatform.dex.domain.order.OrderJson._ import com.wavesplatform.dex.domain.order.OrderOps._ import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} -import com.wavesplatform.dex.domain.order.{Order, OrderType} +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order, OrderType} import com.wavesplatform.dex.domain.transaction.ExchangeTransactionV2 import com.wavesplatform.dex.domain.utils.EitherExt2 import com.wavesplatform.dex.effect._ import com.wavesplatform.dex.error.{AddressIsBlacklisted, CanNotPersistEvent, InvalidAddress, InvalidJson, OrderDuplicate, OrderNotFound, RequestInvalidSignature, UnsupportedContentType, UserPublicKeyIsNotValid} import com.wavesplatform.dex.gen.issuedAssetIdGen -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription import com.wavesplatform.dex.model.MatcherModel.Denormalized import com.wavesplatform.dex.model.{LimitOrder, OrderInfo, OrderStatus, _} import com.wavesplatform.dex.queue.{ValidatedCommand, ValidatedCommandWithMeta} import com.wavesplatform.dex.settings.OrderFeeSettings.DynamicSettings import com.wavesplatform.dex.settings.{MatcherSettings, OrderRestrictionsSettings} +import com.wavesplatform.dex.statuses.{CombinedStreamStatus, MatcherStatus} import org.scalamock.scalatest.PathMockFactory import org.scalatest.concurrent.Eventually import play.api.libs.json.{JsArray, JsString, Json, JsonFacade => _} @@ -189,7 +189,14 @@ class MatcherApiRouteSpec extends RouteSpec("/matcher") with MatcherSpecBase wit status shouldEqual StatusCodes.OK responseAs[HttpOrderBookInfo] should matchTo( HttpOrderBookInfo( - restrictions = Some(HttpOrderRestrictions.fromSettings(orderRestrictions)), + restrictions = Some(HttpOrderRestrictions( + stepAmount = orderRestrictions.stepAmount, + minAmount = orderRestrictions.minAmount, + maxAmount = orderRestrictions.maxAmount, + stepPrice = orderRestrictions.stepPrice, + minPrice = orderRestrictions.minPrice, + maxPrice = orderRestrictions.maxPrice + )), matchingRules = HttpMatchingRules(0.1) ) ) @@ -329,8 +336,8 @@ class MatcherApiRouteSpec extends RouteSpec("/matcher") with MatcherSpecBase wit HttpV0OrderBook( timestamp = 0L, pair = smartWavesPair, - bids = smartWavesAggregatedSnapshot.bids.toList.map(HttpV0LevelAgg.fromLevelAgg), - asks = smartWavesAggregatedSnapshot.asks.toList.map(HttpV0LevelAgg.fromLevelAgg) + bids = smartWavesAggregatedSnapshot.bids.toList.map(HttpV0LevelAggConverter.fromLevelAgg), + asks = smartWavesAggregatedSnapshot.asks.toList.map(HttpV0LevelAggConverter.fromLevelAgg) ) ) } @@ -342,7 +349,13 @@ class MatcherApiRouteSpec extends RouteSpec("/matcher") with MatcherSpecBase wit "returns an order book status" in test { route => Get(routePath(s"/orderbook/$smartAssetId/WAVES/status")) ~> route ~> check { status shouldEqual StatusCodes.OK - responseAs[HttpOrderBookStatus] should matchTo(HttpOrderBookStatus fromMarketStatus smartWavesMarketStatus) + responseAs[HttpOrderBookStatus] should matchTo(HttpOrderBookStatus.fromMarketStatus( + HttpMarketStatus( + smartWavesMarketStatus.lastTrade.map(lt => HttpLastTrade(lt.price, lt.amount, lt.side)), + bestBid = smartWavesMarketStatus.bestBid.map(bb => HttpLevelAgg(bb.amount, bb.price)), + bestAsk = smartWavesMarketStatus.bestAsk.map(ba => HttpLevelAgg(ba.amount, ba.price)) + ) + )) } } @@ -1311,8 +1324,8 @@ class MatcherApiRouteSpec extends RouteSpec("/matcher") with MatcherSpecBase wit HttpOrderBook( 0L, smartWavesPair, - smartWavesAggregatedSnapshot.bids, - smartWavesAggregatedSnapshot.asks, + smartWavesAggregatedSnapshot.bids.map(v => HttpLevelAgg(v.amount, v.price)), + smartWavesAggregatedSnapshot.asks.map(v => HttpLevelAgg(v.amount, v.price)), assetPairDecimals ) @@ -1434,7 +1447,7 @@ class MatcherApiRouteSpec extends RouteSpec("/matcher") with MatcherSpecBase wit ConfigFactory.load().atKey("waves.dex"), orderBookDirectoryActor.ref, addressActor.ref, - CombinedStream.Status.Working(10), + CombinedStreamStatus.Working(10), () => MatcherStatus.Working, () => 0L, () => Future.successful(0L), diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/MatcherWebSocketRouteSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/MatcherWebSocketRouteSpec.scala index 71589d8002..7f29d7f4b7 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/MatcherWebSocketRouteSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/MatcherWebSocketRouteSpec.scala @@ -13,13 +13,13 @@ import com.wavesplatform.dex.api.http.entities._ import com.wavesplatform.dex.api.http.headers.`X-Api-Key` import com.wavesplatform.dex.api.ws.actors.{WsExternalClientDirectoryActor, WsInternalBroadcastActor} import com.wavesplatform.dex.api.ws.routes.MatcherWebSocketRoute -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.crypto import com.wavesplatform.dex.effect._ import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription import com.wavesplatform.dex.model._ import com.wavesplatform.dex.settings.MatcherSettings +import com.wavesplatform.dex.statuses.MatcherStatus import com.wavesplatform.dex.time.TestTime import org.scalamock.scalatest.PathMockFactory import org.scalatest.concurrent.Eventually diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/v1OrderBookRouteSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/v1OrderBookRouteSpec.scala index d8606122ea..04280db041 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/v1OrderBookRouteSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/http/routes/v1OrderBookRouteSpec.scala @@ -12,10 +12,11 @@ import com.wavesplatform.dex.actors.OrderBookAskAdapter import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor import com.wavesplatform.dex.api.RouteSpec import com.wavesplatform.dex.api.http.ApiMarshallers._ -import com.wavesplatform.dex.api.http.entities.{HttpOrderBook, HttpV1LevelAgg, HttpV1OrderBook} +import com.wavesplatform.dex.api.http.converters.HttpV1LevelAggConverter +import com.wavesplatform.dex.api.http.entities.{HttpOrderBook, HttpV1OrderBook} +import com.wavesplatform.dex.api.http.entities.HttpLevelAgg import com.wavesplatform.dex.api.http.routes.v1.OrderBookRoute import com.wavesplatform.dex.api.http.{entities, OrderBookHttpInfo} -import com.wavesplatform.dex.app.MatcherStatus import com.wavesplatform.dex.db.WithDb import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.crypto @@ -24,6 +25,7 @@ import com.wavesplatform.dex.error.ErrorFormatterContext import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription import com.wavesplatform.dex.model.{AssetPairBuilder, LevelAgg, OrderBookAggregatedSnapshot} import com.wavesplatform.dex.settings.MatcherSettings +import com.wavesplatform.dex.statuses.MatcherStatus import org.scalamock.scalatest.PathMockFactory import org.scalatest.concurrent.Eventually import pureconfig.ConfigSource @@ -65,8 +67,8 @@ class v1OrderBookRouteSpec extends RouteSpec("/api/v1") with MatcherSpecBase wit HttpOrderBook( 0L, wavesUsdPair, - wavesUsdAggregatedSnapshot.bids, - wavesUsdAggregatedSnapshot.asks, + wavesUsdAggregatedSnapshot.bids.map(v => HttpLevelAgg(v.amount, v.price)), + wavesUsdAggregatedSnapshot.asks.map(v => HttpLevelAgg(v.amount, v.price)), Some(8 -> 2) ) @@ -130,8 +132,8 @@ class v1OrderBookRouteSpec extends RouteSpec("/api/v1") with MatcherSpecBase wit responseAs[HttpV1OrderBook] should matchTo( entities.HttpV1OrderBook( timestamp = 0L, - bids = wavesUsdAggregatedSnapshot.bids.toList.map(HttpV1LevelAgg.fromLevelAgg(_, wavesUsdPair)), - asks = wavesUsdAggregatedSnapshot.asks.toList.map(HttpV1LevelAgg.fromLevelAgg(_, wavesUsdPair)) + bids = wavesUsdAggregatedSnapshot.bids.toList.map(HttpV1LevelAggConverter.fromLevelAgg(_, wavesUsdPair)), + asks = wavesUsdAggregatedSnapshot.asks.toList.map(HttpV1LevelAggConverter.fromLevelAgg(_, wavesUsdPair)) ) ) } diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/ws/ActorsWebSocketInteractionsSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/api/ws/ActorsWebSocketInteractionsSpecification.scala index d58b3c05cb..b65b0d693e 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/ws/ActorsWebSocketInteractionsSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/ws/ActorsWebSocketInteractionsSpecification.scala @@ -7,6 +7,7 @@ import cats.syntax.option._ import com.wavesplatform.dex.MatcherSpecBase import com.wavesplatform.dex.actors.address.AddressActor.BlockchainInteraction import com.wavesplatform.dex.actors.address.{AddressActor, AddressDirectoryActor} +import com.wavesplatform.dex.api.ws.converters.WsOrderConverter import com.wavesplatform.dex.api.ws.entities.{WsBalances, WsOrder} import com.wavesplatform.dex.api.ws.protocol.{WsAddressChanges, WsMessage} import com.wavesplatform.dex.db.EmptyOrderDb @@ -15,6 +16,7 @@ import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.crypto.Proofs import com.wavesplatform.dex.domain.error.ValidationError +import com.wavesplatform.dex.domain.order.OrderStatusNames import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} import com.wavesplatform.dex.domain.state.{LeaseBalance, Portfolio} import com.wavesplatform.dex.domain.transaction.ExchangeTransactionV2 @@ -203,13 +205,13 @@ class ActorsWebSocketInteractionsSpecification .placeOrder(lo) .expectWsBalancesAndOrders( Map(usd -> WsBalances(285, 15), Waves -> WsBalances(99.997, 0.003)), - Seq(WsOrder.fromDomain(lo)), + Seq(WsOrderConverter.fromDomain(lo)), 1 ) .cancelOrder(lo, unmatchable = false) .expectWsBalancesAndOrders( Map(usd -> WsBalances(300, 0), Waves -> WsBalances(100, 0)), - Seq(WsOrder.fromOrder(lo.order, status = OrderStatus.Cancelled.name.some)), + Seq(WsOrder.fromOrder(lo.order, status = OrderStatusNames.CANCELLED.some)), 2 ) .kill() @@ -237,7 +239,7 @@ class ActorsWebSocketInteractionsSpecification .placeOrder(buyOrder) .expectWsBalancesAndOrders( Map(usd -> WsBalances(270, 30), Waves -> WsBalances(99.997, 0.003)), - Seq(WsOrder.fromDomain(buyOrder)), + Seq(WsOrderConverter.fromDomain(buyOrder)), 1 ) } @@ -264,7 +266,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( buyOrder.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 5.0.some, filledFee = 0.0015.some, avgWeighedPrice = 3.0.some, @@ -298,7 +300,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( buyOrder.order, - status = OrderStatus.Cancelled.name.some + status = OrderStatusNames.CANCELLED.some ) ), 5 @@ -334,7 +336,7 @@ class ActorsWebSocketInteractionsSpecification .placeOrder(mo) .expectWsBalancesAndOrders( Map(usd -> WsBalances(150, 150), eth -> WsBalances(2, 1)), - Seq(WsOrder.fromDomain(mo)), + Seq(WsOrderConverter.fromDomain(mo)), 1 ) } @@ -348,7 +350,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( mo.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 10.0.some, filledFee = 0.2.some, avgWeighedPrice = 3.0.some, @@ -368,7 +370,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( mo.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 25.0.some, filledFee = 0.5.some, avgWeighedPrice = 3.0.some, @@ -388,7 +390,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( mo.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 30.0.some, filledFee = 0.6.some, avgWeighedPrice = 3.0.some, @@ -408,7 +410,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( mo.order, - status = OrderStatus.Filled.name.some + status = OrderStatusNames.FILLED.some ) ), 5 @@ -486,7 +488,7 @@ class ActorsWebSocketInteractionsSpecification .subscribeAddress() .expectWsBalancesAndOrders( Map(Waves -> WsBalances(114.997, 0.003), usd -> WsBalances(297, 3), eth -> WsBalances(5, 0)), - Seq(WsOrder.fromDomain(lo)), + Seq(WsOrderConverter.fromDomain(lo)), 0 ) .kill() @@ -502,7 +504,7 @@ class ActorsWebSocketInteractionsSpecification .subscribeAddress() .expectWsBalancesAndOrders( Map(Waves -> WsBalances(99.997, 0.003), btc -> WsBalances(0, 1)), - Seq(WsOrder.fromDomain(lo)), + Seq(WsOrderConverter.fromDomain(lo)), 0 ) .kill() @@ -540,7 +542,7 @@ class ActorsWebSocketInteractionsSpecification env .expectWsBalancesAndOrders( Map(Waves -> WsBalances(100, 0)), - Seq(WsOrder.fromDomain(oe.submittedRemaining)), + Seq(WsOrderConverter.fromDomain(oe.submittedRemaining)), 1 ) .kill() @@ -580,8 +582,8 @@ class ActorsWebSocketInteractionsSpecification .expectWsBalancesAndOrders( Map(Waves -> WsBalances(100, 0), btc -> WsBalances(1, 0)), Seq( - WsOrder.fromDomain(oe.counterRemaining).copy(matchInfo = mkSeqWsMatchTxInfo(3.0, 5.0)), - WsOrder.fromDomain(oe.submittedRemaining).copy(matchInfo = mkSeqWsMatchTxInfo(3.0, 5.0)) + WsOrderConverter.fromDomain(oe.counterRemaining).copy(matchInfo = mkSeqWsMatchTxInfo(3.0, 5.0)), + WsOrderConverter.fromDomain(oe.submittedRemaining).copy(matchInfo = mkSeqWsMatchTxInfo(3.0, 5.0)) ), 1 ) @@ -609,11 +611,23 @@ class ActorsWebSocketInteractionsSpecification 0 ) .placeOrder(counter1) - .expectWsBalancesAndOrders(Map(usd -> WsBalances(55, 15), Waves -> WsBalances(99.997, 0.003)), Seq(WsOrder.fromDomain(counter1)), 1) + .expectWsBalancesAndOrders( + Map(usd -> WsBalances(55, 15), Waves -> WsBalances(99.997, 0.003)), + Seq(WsOrderConverter.fromDomain(counter1)), + 1 + ) .placeOrder(counter2) - .expectWsBalancesAndOrders(Map(usd -> WsBalances(39.5, 30.5), Waves -> WsBalances(99.994, 0.006)), Seq(WsOrder.fromDomain(counter2)), 2) + .expectWsBalancesAndOrders( + Map(usd -> WsBalances(39.5, 30.5), Waves -> WsBalances(99.994, 0.006)), + Seq(WsOrderConverter.fromDomain(counter2)), + 2 + ) .placeOrder(counter3) - .expectWsBalancesAndOrders(Map(usd -> WsBalances(23.5, 46.5), Waves -> WsBalances(99.991, 0.009)), Seq(WsOrder.fromDomain(counter3)), 3) + .expectWsBalancesAndOrders( + Map(usd -> WsBalances(23.5, 46.5), Waves -> WsBalances(99.991, 0.009)), + Seq(WsOrderConverter.fromDomain(counter3)), + 3 + ) mo = matchOrders(mo, counter1)._1 @@ -627,7 +641,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( counter1.order, - status = OrderStatus.Filled.name.some, + status = OrderStatusNames.FILLED.some, filledAmount = 5.0.some, filledFee = 0.003.some, avgWeighedPrice = 3.0.some, @@ -649,7 +663,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( counter2.order, - status = OrderStatus.Filled.name.some, + status = OrderStatusNames.FILLED.some, filledAmount = 5.0.some, filledFee = 0.003.some, avgWeighedPrice = 3.1.some, @@ -672,7 +686,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( counter3.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 2.0.some, filledFee = 0.0012.some, avgWeighedPrice = 3.2.some, @@ -685,7 +699,7 @@ class ActorsWebSocketInteractionsSpecification .cancelOrder(counter3Remaining, unmatchable = false) .expectWsBalancesAndOrders( Map(usd -> WsBalances(70, 0), Waves -> WsBalances(100, 0)), - Seq(WsOrder.fromOrder(counter3.order, status = OrderStatus.Cancelled.name.some)), + Seq(WsOrder.fromOrder(counter3.order, status = OrderStatusNames.CANCELLED.some)), 7 ) .updateBalances(Map(usd -> 33.1.usd, Waves -> 111.9928.waves)) @@ -719,7 +733,7 @@ class ActorsWebSocketInteractionsSpecification .placeOrder(mo) .expectWsBalancesAndOrders( Map(Waves -> WsBalances(87.997, 12.003)), - Seq(WsOrder.fromDomain(mo)), + Seq(WsOrderConverter.fromDomain(mo)), 1 ) @@ -732,7 +746,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( mo.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 5.0.some, filledFee = 0.00125.some, avgWeighedPrice = 3.0.some, @@ -752,7 +766,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( mo.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 10.0.some, filledFee = 0.0025.some, avgWeighedPrice = 3.05.some, @@ -772,7 +786,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( mo.order, - status = OrderStatus.Filled.name.some, + status = OrderStatusNames.FILLED.some, filledAmount = 12.0.some, filledFee = 0.003.some, avgWeighedPrice = 3.07.some, @@ -807,7 +821,7 @@ class ActorsWebSocketInteractionsSpecification .placeOrder(bo) .expectWsBalancesAndOrders( Map(usd -> WsBalances(0, 10), Waves -> WsBalances(9.997, 0.003)), - Seq(WsOrder.fromDomain(bo)), + Seq(WsOrderConverter.fromDomain(bo)), 1 ) @@ -819,7 +833,7 @@ class ActorsWebSocketInteractionsSpecification Seq( WsOrder.fromOrder( bo.order, - status = OrderStatus.PartiallyFilled.name.some, + status = OrderStatusNames.PARTIALLY_FILLED.some, filledAmount = 5.0.some, filledFee = 0.0015.some, avgWeighedPrice = 1.0.some, @@ -838,7 +852,7 @@ class ActorsWebSocketInteractionsSpecification .cancelOrder(oe.counterRemaining, unmatchable = false) .expectWsBalancesAndOrders( Map(usd -> WsBalances(5, 0), Waves -> WsBalances(14.9985, 0)), - Seq(WsOrder.fromOrder(bo.order, status = OrderStatus.Cancelled.name.some)), + Seq(WsOrder.fromOrder(bo.order, status = OrderStatusNames.CANCELLED.some)), 4 ) .kill() diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/ws/HasJwt.scala b/dex/src/test/scala/com/wavesplatform/dex/api/ws/HasJwt.scala index b8bf748faf..be93a3293f 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/ws/HasJwt.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/ws/HasJwt.scala @@ -1,10 +1,10 @@ package com.wavesplatform.dex.api.ws -import java.security -import java.security.KeyPairGenerator - import com.wavesplatform.dex.api.ws.protocol.WsAddressSubscribe.JwtPayload import com.wavesplatform.dex.auth.JwtUtils + +import java.security +import java.security.KeyPairGenerator import play.api.libs.json.{JsObject, Json} trait HasJwt extends JwtUtils { diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/ws/WsAddressSubscribeSerializationSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/ws/WsAddressSubscribeSerializationSpec.scala index e7738646cd..340de032e5 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/ws/WsAddressSubscribeSerializationSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/ws/WsAddressSubscribeSerializationSpec.scala @@ -3,7 +3,7 @@ package com.wavesplatform.dex.api.ws import com.wavesplatform.dex.MatcherSpecBase import com.wavesplatform.dex.api.ws.entities.WsAddressFlag.ExcludeNft import com.wavesplatform.dex.api.ws.protocol.WsAddressSubscribe -import com.wavesplatform.dex.api.ws.protocol.WsAddressSubscribe.wsAddressSubscribeFormat +import com.wavesplatform.dex.api.ws.protocol.WsAddressSubscribe._ import com.wavesplatform.dex.domain.account.Address import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/ws/WsMessagesSerdeSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/api/ws/WsMessagesSerdeSpecification.scala index 95dc6379d6..decad7b935 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/ws/WsMessagesSerdeSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/ws/WsMessagesSerdeSpecification.scala @@ -3,6 +3,7 @@ package com.wavesplatform.dex.api.ws import com.softwaremill.diffx.Diff import com.wavesplatform.dex.MatcherSpecBase import com.wavesplatform.dex.api.http.PlayJsonException +import com.wavesplatform.dex.api.ws.converters.{WsMatchTxInfoConverter, WsOrderConverter} import com.wavesplatform.dex.api.ws.entities._ import com.wavesplatform.dex.api.ws.protocol.WsOrderBookChanges.WsSide import com.wavesplatform.dex.api.ws.protocol.{WsAddressChanges, WsOrderBookChanges, WsRatesUpdates} @@ -12,7 +13,6 @@ import com.wavesplatform.dex.domain.model.Denormalization import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.error.ErrorFormatterContext import com.wavesplatform.dex.model.{LimitOrder, MarketOrder, OrderBook} -import com.wavesplatform.dex.settings.OrderRestrictionsSettings import org.scalacheck.{Arbitrary, Gen} import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers @@ -51,8 +51,8 @@ class WsMessagesSerdeSpecification extends AnyFreeSpec with ScalaCheckDrivenProp case (false, false) => LimitOrder(order).partial(partialAmount, partialFee, BigInteger.valueOf(order.price)) } - val result = WsOrder.fromDomain(ao).copy(matchInfo = - Seq(WsMatchTransactionInfo.normalized( + val result = WsOrderConverter.fromDomain(ao).copy(matchInfo = + Seq(WsMatchTxInfoConverter.toWs( ao.order.assetPair, ByteStr.empty, System.currentTimeMillis(), @@ -114,7 +114,7 @@ class WsMessagesSerdeSpecification extends AnyFreeSpec with ScalaCheckDrivenProp stepPrice <- getDenormalizedValueInRange(1, 10) minPrice <- getDenormalizedValueInRange(1, 10) maxPrice <- getDenormalizedValueInRange(1 * Order.PriceConstant, 10 * Order.PriceConstant) - } yield OrderRestrictionsSettings(stepAmount, minAmount, maxAmount, stepPrice, minPrice, maxPrice) + } yield WsOrderBookRestrictions(stepAmount, minAmount, maxAmount, stepPrice, minPrice, maxPrice) val tickSizeGen = getDenormalizedValueInRange(10, 50) diff --git a/dex/src/test/scala/com/wavesplatform/dex/api/ws/actors/WsExternalClientHandlerActorSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/api/ws/actors/WsExternalClientHandlerActorSpec.scala index cd5b2aeed8..581baae1c4 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/api/ws/actors/WsExternalClientHandlerActorSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/api/ws/actors/WsExternalClientHandlerActorSpec.scala @@ -15,7 +15,7 @@ import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor import com.wavesplatform.dex.actors.orderbook.AggregatedOrderBookActor.Command import com.wavesplatform.dex.api.ws.HasJwt import com.wavesplatform.dex.api.ws.actors.WsExternalClientHandlerActor.Command.ProcessClientMessage -import com.wavesplatform.dex.api.ws.protocol._ +import com.wavesplatform.dex.api.ws.protocol.{WsAddressSubscribe, WsError, WsInitial, WsMessage, WsOrderBookSubscribe} import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.AssetPair diff --git a/dex/src/test/scala/com/wavesplatform/dex/caches/DropOldestFixedBuffer2Spec.scala b/dex/src/test/scala/com/wavesplatform/dex/caches/DropOldestFixedBuffer2Spec.scala index a33ffe08cf..149a67a872 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/caches/DropOldestFixedBuffer2Spec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/caches/DropOldestFixedBuffer2Spec.scala @@ -1,6 +1,6 @@ package com.wavesplatform.dex.caches -import com.wavesplatform.dex.NoShrink +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.{Arbitrary, Gen} import org.scalatest.freespec.AnyFreeSpecLike import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/caches/RateCacheSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/caches/RateCacheSpecification.scala index 7d4c46bad2..788655d9a9 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/caches/RateCacheSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/caches/RateCacheSpecification.scala @@ -3,7 +3,8 @@ package com.wavesplatform.dex.caches import com.wavesplatform.dex.db.{RateDb, TestRateDb, WithDb} import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.asset.Asset.Waves -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike diff --git a/dex/src/test/scala/com/wavesplatform/dex/db/AssetPairsDbSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/db/AssetPairsDbSpec.scala index 3a49ef1fb4..98b375d128 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/db/AssetPairsDbSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/db/AssetPairsDbSpec.scala @@ -3,7 +3,8 @@ package com.wavesplatform.dex.db import cats.Id import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.AssetPair -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/db/AssetsDbSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/db/AssetsDbSpec.scala index 3883adc4cb..d6609a077f 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/db/AssetsDbSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/db/AssetsDbSpec.scala @@ -2,8 +2,8 @@ package com.wavesplatform.dex.db import cats.Id import cats.syntax.option._ -import com.wavesplatform.dex.NoShrink import com.wavesplatform.dex.gen.AssetDescriptionGen +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/db/OrderBookSnapshotDbSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/db/OrderBookSnapshotDbSpec.scala index c803c542b9..95bec12ff6 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/db/OrderBookSnapshotDbSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/db/OrderBookSnapshotDbSpec.scala @@ -4,7 +4,8 @@ import cats.Id import com.wavesplatform.dex.domain.asset.Asset.Waves import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.model.{BuyLimitOrder, LastTrade, OrderBookSideSnapshot, OrderBookSnapshot, SellLimitOrder} -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/db/RateDbSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/db/RateDbSpecification.scala index fa89b02f32..df786b10ce 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/db/RateDbSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/db/RateDbSpecification.scala @@ -1,6 +1,7 @@ package com.wavesplatform.dex.db -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike diff --git a/dex/src/test/scala/com/wavesplatform/dex/fp/MapImplicitsSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/fp/MapImplicitsSpec.scala index f91f6d1a80..b115e62b86 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/fp/MapImplicitsSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/fp/MapImplicitsSpec.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.fp import cats.instances.long.catsKernelStdGroupForLong import cats.syntax.group._ -import com.wavesplatform.dex.NoShrink +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.{Arbitrary, Gen} import org.scalatest.matchers.should.Matchers import org.scalatest.propspec.AnyPropSpec diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/AssetPairBuilderSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/model/AssetPairBuilderSpec.scala index d9f0582542..dec1254478 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/AssetPairBuilderSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/AssetPairBuilderSpec.scala @@ -8,7 +8,7 @@ import com.wavesplatform.dex.effect._ import com.wavesplatform.dex.error import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription import com.wavesplatform.dex.settings.{loadConfig, MatcherSettings} -import com.wavesplatform.dex.test.matchers.ProduceError.produce +import com.wavesplatform.dex.it.test.matchers.ProduceError.produce import org.scalamock.scalatest.MockFactory import org.scalatest.concurrent.ScalaFutures import org.scalatest.freespec.AnyFreeSpec diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/DenormalizedMatchingRulesSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/model/DenormalizedMatchingRulesSpecification.scala index 5d73252f77..6bc63d583d 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/DenormalizedMatchingRulesSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/DenormalizedMatchingRulesSpecification.scala @@ -2,7 +2,8 @@ package com.wavesplatform.dex.model import cats.data.NonEmptyList import com.wavesplatform.dex.settings.DenormalizedMatchingRule -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.matchers.should.Matchers import org.scalatest.propspec.AnyPropSpec diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/ExchangeTransactionCreatorSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/model/ExchangeTransactionCreatorSpecification.scala index fcda4896f2..e0d6901301 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/ExchangeTransactionCreatorSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/ExchangeTransactionCreatorSpecification.scala @@ -7,7 +7,8 @@ import com.wavesplatform.dex.domain.crypto.Proofs import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.domain.order.OrderOps._ import com.wavesplatform.dex.domain.transaction.ExchangeTransactionV2 -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalamock.scalatest.PathMockFactory import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/FeeSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/model/FeeSpecification.scala index a849e931ca..f4d42a9e3e 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/FeeSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/FeeSpecification.scala @@ -6,7 +6,8 @@ import com.wavesplatform.dex.domain.order.OrderType.{BUY, SELL} import com.wavesplatform.dex.model.Events.OrderExecuted import com.wavesplatform.dex.settings.OrderFeeSettings import com.wavesplatform.dex.settings.OrderFeeSettings.DynamicSettings -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalamock.scalatest.PathMockFactory import org.scalatest.BeforeAndAfterAll import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/OrderBookSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/model/OrderBookSpec.scala index 578f22f3c9..0e537812c0 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/OrderBookSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/OrderBookSpec.scala @@ -1,11 +1,9 @@ package com.wavesplatform.dex.model import java.nio.charset.StandardCharsets - import cats.instances.long.catsKernelStdGroupForLong import cats.kernel.{Group, Monoid} import cats.syntax.group._ -import com.wavesplatform.dex.NoShrink import com.wavesplatform.dex.domain.account.PublicKey import com.wavesplatform.dex.domain.asset.Asset import com.wavesplatform.dex.domain.bytes.ByteStr @@ -15,7 +13,8 @@ import com.wavesplatform.dex.fp.MapImplicits.group import com.wavesplatform.dex.gen.OrderBookGen import com.wavesplatform.dex.model.Events.{Event, OrderAdded, OrderCanceled, OrderExecuted} import com.wavesplatform.dex.model.OrderBook.OrderBookUpdates -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.util.NoShrink +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalacheck.Gen import org.scalatest.freespec.AnyFreeSpecLike import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/OrderBookTestSuite.scala b/dex/src/test/scala/com/wavesplatform/dex/model/OrderBookTestSuite.scala index bea67a2d84..e501749280 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/OrderBookTestSuite.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/OrderBookTestSuite.scala @@ -2,7 +2,6 @@ package com.wavesplatform.dex.model import java.math.BigInteger import java.nio.ByteBuffer - import cats.syntax.semigroup._ import com.wavesplatform.dex.codecs.OrderBookSideSnapshotCodecs import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} @@ -16,7 +15,8 @@ import com.wavesplatform.dex.model.OrderBook.OrderBookUpdates import com.wavesplatform.dex.settings.OrderFeeSettings.DynamicSettings import com.wavesplatform.dex.settings.{MatchingRule, OrderFeeSettings} import com.wavesplatform.dex.time.SystemTime -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/OrderDbSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/model/OrderDbSpec.scala index cf75413c54..7e69a3eb90 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/OrderDbSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/OrderDbSpec.scala @@ -5,7 +5,8 @@ import com.wavesplatform.dex.db.{OrderDb, WithDb} import com.wavesplatform.dex.domain.account.KeyPair import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.order.Order -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/OrderHistoryBalanceSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/model/OrderHistoryBalanceSpecification.scala index bc6a583f9c..615dc22e67 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/OrderHistoryBalanceSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/OrderHistoryBalanceSpecification.scala @@ -14,8 +14,8 @@ import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.domain.order.Order.Id import com.wavesplatform.dex.model.Events.{OrderAdded, OrderAddedReason, OrderCanceled} -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits import com.wavesplatform.dex.time.SystemTime +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalactic.source import org.scalatest.BeforeAndAfterEach import org.scalatest.concurrent.Eventually diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/OrderInfoSpec.scala b/dex/src/test/scala/com/wavesplatform/dex/model/OrderInfoSpec.scala index 7b30d8cffb..93c60c29d8 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/OrderInfoSpec.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/OrderInfoSpec.scala @@ -1,10 +1,10 @@ package com.wavesplatform.dex.model import java.math.BigInteger - -import com.wavesplatform.dex.domain.order.Order +import com.wavesplatform.dex.domain.order.{AcceptedOrderType, Order} import com.wavesplatform.dex.model.OrderInfoSpec.OrderExt -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/dex/src/test/scala/com/wavesplatform/dex/model/OrderValidatorSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/model/OrderValidatorSpecification.scala index 43e7937dd3..fd8e51d4f4 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/model/OrderValidatorSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/model/OrderValidatorSpecification.scala @@ -24,9 +24,10 @@ import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription import com.wavesplatform.dex.model.OrderValidator.Result import com.wavesplatform.dex.settings.OrderFeeSettings.{DynamicSettings, FixedSettings, PercentSettings} import com.wavesplatform.dex.settings.{AssetType, DeviationsSettings, OrderFeeSettings, OrderRestrictionsSettings} -import com.wavesplatform.dex.test.matchers.ProduceError.produce +import com.wavesplatform.dex.it.test.matchers.ProduceError.produce import com.wavesplatform.dex.time.TestTime -import com.wavesplatform.dex.{MatcherSpecBase, NoShrink} +import com.wavesplatform.dex.MatcherSpecBase +import com.wavesplatform.dex.util.NoShrink import mouse.any._ import org.scalacheck.Gen import org.scalamock.scalatest.PathMockFactory diff --git a/dex/src/test/scala/com/wavesplatform/dex/settings/MatcherSettingsSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/settings/MatcherSettingsSpecification.scala index 8ddfe13534..524294fe98 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/settings/MatcherSettingsSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/settings/MatcherSettingsSpecification.scala @@ -20,9 +20,9 @@ import com.wavesplatform.dex.model.Implicits.AssetPairOps import com.wavesplatform.dex.queue.LocalMatcherQueue import com.wavesplatform.dex.settings.EventsQueueSettings.CircuitBreakerSettings import com.wavesplatform.dex.settings.OrderFeeSettings.PercentSettings -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits -import com.wavesplatform.dex.test.matchers.ProduceError.produce +import com.wavesplatform.dex.it.test.matchers.ProduceError.produce import com.wavesplatform.dex.tool.ComparisonTool +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import org.scalatest.matchers.should.Matchers import pureconfig.ConfigSource import sttp.client3.UriContext diff --git a/dex/src/test/scala/com/wavesplatform/dex/settings/MatchingRulesSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/settings/MatchingRulesSpecification.scala index 36db09f046..08daeef892 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/settings/MatchingRulesSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/settings/MatchingRulesSpecification.scala @@ -5,7 +5,7 @@ import com.typesafe.config.Config import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.utils.EitherExt2 import com.wavesplatform.dex.model.Implicits.AssetPairOps -import com.wavesplatform.dex.test.matchers.ProduceError.produce +import com.wavesplatform.dex.it.test.matchers.ProduceError.produce import org.scalatest.matchers.should.Matchers class MatchingRulesSpecification extends BaseSettingsSpecification with Matchers { diff --git a/dex/src/test/scala/com/wavesplatform/dex/settings/OrderRestrictionSpecification.scala b/dex/src/test/scala/com/wavesplatform/dex/settings/OrderRestrictionSpecification.scala index 9f56e36b9e..3d85f8a26f 100644 --- a/dex/src/test/scala/com/wavesplatform/dex/settings/OrderRestrictionSpecification.scala +++ b/dex/src/test/scala/com/wavesplatform/dex/settings/OrderRestrictionSpecification.scala @@ -3,7 +3,7 @@ package com.wavesplatform.dex.settings import com.typesafe.config.Config import com.wavesplatform.dex.domain.asset.AssetPair import com.wavesplatform.dex.domain.utils.EitherExt2 -import com.wavesplatform.dex.test.matchers.ProduceError.produce +import com.wavesplatform.dex.it.test.matchers.ProduceError.produce import org.scalatest.matchers.should.Matchers class OrderRestrictionSpecification extends BaseSettingsSpecification with Matchers { diff --git a/project/Dependencies.scala b/project/Dependencies.scala index a794bba96b..95579ae4a9 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -41,6 +41,7 @@ object Dependencies { val wavesProtobufSchemas = "1.3.2" val wavesJ = "1.2.2" + val wavesTransactions = "1.0.8" val postgresql = "42.2.23" val quillJdbc = "3.8.0" @@ -55,6 +56,7 @@ object Dependencies { val jackson = "2.10.0" val playJson = "2.9.2" + val googleProtobuf = "3.17.2" val googleGuava = "28.2-jre" val kafka = "2.8.0" @@ -148,6 +150,8 @@ object Dependencies { private val sttpAsyncHttpClient = sttpClientModule("async-http-client-backend-future") private val allureScalaTest = "io.qameta.allure" %% "allure-scalatest" % Version.allureScalaTest private val jaxbApi = "javax.xml.bind" % "jaxb-api" % Version.jaxbApi + private val googleProtobuf = "com.google.protobuf" % "protobuf-java" % Version.googleProtobuf + private val wavesTransaction = "com.wavesplatform" % "waves-transactions" % Version.wavesTransactions private[this] val levelDBJNA = Seq( @@ -227,6 +231,33 @@ object Dependencies { object Module { + lazy val dexCommon: Seq[ModuleID] = + Seq( + sttpClient, + sttpPlayJson, + wavesTransaction, + sttpAsyncHttpClient, + jwtModule("core"), + jwtModule("play-json"), + kindProjector, + catsCore, + shapeless, + catsTaglessMacros, + betterMonadicFor, + scorexCrypto, + supertagged, + monixReactive, + swagger, + playJson, + googleProtobuf, + toxiProxy % Test, + kafka % Test, + allureScalaTest % Test, + diffx, + scalaCheck % Test, + scalaTest % Test + ) ++ testContainers ++ enumeratum ++ pureConfig.map(_ % Test) + lazy val dex: Seq[ModuleID] = Seq( akkaActor, akkaActorTyped, diff --git a/waves-ext/src/main/scala/com/wavesplatform/dex/collections/Implicits.scala b/waves-ext/src/main/scala/com/wavesplatform/dex/collections/Implicits.scala index 86b16c999b..731317957d 100644 --- a/waves-ext/src/main/scala/com/wavesplatform/dex/collections/Implicits.scala +++ b/waves-ext/src/main/scala/com/wavesplatform/dex/collections/Implicits.scala @@ -1,6 +1,5 @@ package com.wavesplatform.dex.collections -// TODO DEX-994 object Implicits { implicit final class ListOps[T](val self: List[T]) extends AnyVal { diff --git a/waves-ext/src/test/scala/com/wavesplatform/dex/grpc/integration/protobuf/ConversionsSuite.scala b/waves-ext/src/test/scala/com/wavesplatform/dex/grpc/integration/protobuf/ConversionsSuite.scala index e4e11315ba..f7c6058870 100644 --- a/waves-ext/src/test/scala/com/wavesplatform/dex/grpc/integration/protobuf/ConversionsSuite.scala +++ b/waves-ext/src/test/scala/com/wavesplatform/dex/grpc/integration/protobuf/ConversionsSuite.scala @@ -3,7 +3,8 @@ package com.wavesplatform.dex.grpc.integration.protobuf import com.wavesplatform.dex.grpc.integration.protobuf.PbToWavesConversions._ import com.wavesplatform.dex.grpc.integration.protobuf.WavesToPbConversions._ import com.wavesplatform.dex.test.WavesEntitiesGen -import com.wavesplatform.dex.{NoShrink, WavesExtSuiteBase} +import com.wavesplatform.dex.WavesExtSuiteBase +import com.wavesplatform.dex.util.NoShrink import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks class ConversionsSuite extends WavesExtSuiteBase with ScalaCheckDrivenPropertyChecks with WavesEntitiesGen with NoShrink { diff --git a/waves-ext/src/test/scala/com/wavesplatform/dex/smart/MatcherScriptRunnerSpecification.scala b/waves-ext/src/test/scala/com/wavesplatform/dex/smart/MatcherScriptRunnerSpecification.scala index 9de850fe8b..479054856c 100644 --- a/waves-ext/src/test/scala/com/wavesplatform/dex/smart/MatcherScriptRunnerSpecification.scala +++ b/waves-ext/src/test/scala/com/wavesplatform/dex/smart/MatcherScriptRunnerSpecification.scala @@ -8,7 +8,7 @@ import com.wavesplatform.common.utils.EitherExt2 import com.wavesplatform.dex.WavesExtSuiteBase import com.wavesplatform.dex.grpc.integration.smart.MatcherScriptRunner import com.wavesplatform.dex.grpc.integration.smart.MatcherScriptRunner.deniedBlockchain -import com.wavesplatform.dex.test.matchers.ProduceError.produce +import com.wavesplatform.dex.it.test.matchers.ProduceError.produce import com.wavesplatform.lang.script.Script import com.wavesplatform.lang.v1.compiler.Terms import com.wavesplatform.lang.v1.estimator.v2.ScriptEstimatorV2 diff --git a/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/ExchangeTransactionMinimumFeeTestSuite.scala b/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/ExchangeTransactionMinimumFeeTestSuite.scala index 8555d02529..d2d665a729 100644 --- a/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/ExchangeTransactionMinimumFeeTestSuite.scala +++ b/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/ExchangeTransactionMinimumFeeTestSuite.scala @@ -2,7 +2,7 @@ package com.wavesplatform.dex.grpc.integration import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.asset.AssetPair -import com.wavesplatform.dex.it.config.PredefinedAccounts.generateNewAccount +import com.wavesplatform.dex.predefined.PredefinedAccounts.generateNewAccount import com.wavesplatform.dex.it.test.Scripts import com.wavesplatform.transactions.{IssueTransaction, Transaction} diff --git a/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/IntegrationSuiteBase.scala b/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/IntegrationSuiteBase.scala index c46706b421..e4b545b657 100644 --- a/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/IntegrationSuiteBase.scala +++ b/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/IntegrationSuiteBase.scala @@ -1,13 +1,14 @@ package com.wavesplatform.dex.grpc.integration -import com.wavesplatform.dex.asset.DoubleOps import com.wavesplatform.dex.domain.utils.ScorexLogging -import com.wavesplatform.dex.it.api.BaseContainersKit -import com.wavesplatform.dex.it.api.node.{HasWavesNode, NodeApiExtensions} -import com.wavesplatform.dex.it.config.{GenesisConfig, PredefinedAccounts, PredefinedAssets} +import com.wavesplatform.dex.it.api.node.NodeApiExtensions +import com.wavesplatform.dex.it.config.GenesisConfig +import com.wavesplatform.dex.it.containers.{BaseContainersKit, HasWavesNode} import com.wavesplatform.dex.it.test.InformativeTestStart import com.wavesplatform.dex.it.waves.{MkWavesEntities, ToWavesJConversions} -import com.wavesplatform.dex.test.matchers.DiffMatcherWithImplicits +import com.wavesplatform.dex.predefined.{PredefinedAccounts, PredefinedAssets} +import com.wavesplatform.dex.util.DoubleOps +import com.wavesplatform.dex.utils.DiffMatcherWithImplicits import com.wavesplatform.dex.waves.WavesFeeConstants import io.qameta.allure.scalatest.AllureScalatestContext import org.scalatest.concurrent.{Eventually, ScalaFutures} diff --git a/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/BlockchainUpdatesClientTestSuite.scala b/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/BlockchainUpdatesClientTestSuite.scala index 35ea9a42c2..183000a0ac 100644 --- a/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/BlockchainUpdatesClientTestSuite.scala +++ b/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/BlockchainUpdatesClientTestSuite.scala @@ -12,8 +12,7 @@ import com.wavesplatform.dex.grpc.integration.clients.domain.{TransactionWithCha import com.wavesplatform.dex.grpc.integration.protobuf.PbToDexConversions._ import com.wavesplatform.dex.grpc.integration.settings.GrpcClientSettings import com.wavesplatform.dex.grpc.integration.tool.RestartableManagedChannel -import com.wavesplatform.dex.it.api.HasToxiProxy -import com.wavesplatform.dex.it.docker.WavesNodeContainer +import com.wavesplatform.dex.it.containers.{HasToxiProxy, WavesNodeContainer} import com.wavesplatform.dex.it.test.NoStackTraceCancelAfterFailure import com.wavesplatform.transactions.Transaction import io.netty.channel.nio.NioEventLoopGroup diff --git a/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedWavesBlockchainClientTestSuite.scala b/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedWavesBlockchainClientTestSuite.scala index 7a46feb812..1a3a8e34e1 100644 --- a/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedWavesBlockchainClientTestSuite.scala +++ b/waves-integration-it/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedWavesBlockchainClientTestSuite.scala @@ -16,8 +16,7 @@ import com.wavesplatform.dex.grpc.integration.clients.domain.portfolio.Synchroni import com.wavesplatform.dex.grpc.integration.clients.{BroadcastResult, RunScriptResult} import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription import com.wavesplatform.dex.grpc.integration.settings.{GrpcClientSettings, WavesBlockchainClientSettings} -import com.wavesplatform.dex.it.api.HasToxiProxy -import com.wavesplatform.dex.it.docker.WavesNodeContainer +import com.wavesplatform.dex.it.containers.{HasToxiProxy, WavesNodeContainer} import com.wavesplatform.dex.it.test.{NoStackTraceCancelAfterFailure, Scripts} import monix.execution.Scheduler diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/WavesBlockchainClient.scala b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/WavesBlockchainClient.scala index 4e98d9979f..3d6208cb80 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/WavesBlockchainClient.scala +++ b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/WavesBlockchainClient.scala @@ -6,9 +6,9 @@ import com.wavesplatform.dex.domain.asset.Asset.IssuedAsset import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.order.Order import com.wavesplatform.dex.domain.transaction.ExchangeTransaction -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream import com.wavesplatform.dex.grpc.integration.clients.domain.{AddressBalanceUpdates, WavesNodeUpdates} import com.wavesplatform.dex.grpc.integration.dto.BriefAssetDescription +import com.wavesplatform.dex.statuses.CombinedStreamStatus import monix.reactive.Observable import scala.concurrent.Future @@ -48,5 +48,5 @@ trait WavesBlockchainClient { def close(): Future[Unit] - def status(): CombinedStream.Status + def status(): CombinedStreamStatus } diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/AkkaCombinedStream.scala b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/AkkaCombinedStream.scala index 0a97142488..3768bfe9c8 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/AkkaCombinedStream.scala +++ b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/AkkaCombinedStream.scala @@ -4,9 +4,10 @@ import akka.actor.ActorSystem import akka.actor.typed.scaladsl.adapter._ import com.wavesplatform.dex.grpc.integration.clients.blockchainupdates.BlockchainUpdatesControlledStream import com.wavesplatform.dex.grpc.integration.clients.combined -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.{Settings, Status} +import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.Settings import com.wavesplatform.dex.grpc.integration.clients.domain.WavesNodeEvent import com.wavesplatform.dex.grpc.integration.clients.matcherext.UtxEventsControlledStream +import com.wavesplatform.dex.statuses.CombinedStreamStatus import monix.eval.Task import monix.execution.Scheduler import monix.reactive.Observable @@ -22,8 +23,8 @@ class AkkaCombinedStream(settings: Settings, blockchainUpdates: BlockchainUpdate private val processedHeight = new AtomicInteger(0) - private val statusStream = ConcurrentSubject.publish[Status] - @volatile private var lastStatus: Status = Status.Starting() + private val statusStream = ConcurrentSubject.publish[CombinedStreamStatus] + @volatile private var lastStatus: CombinedStreamStatus = CombinedStreamStatus.Starting() statusStream.doOnNext(x => Task { lastStatus = x }).lastL.runToFuture private val outputStream = ConcurrentSubject.publish[WavesNodeEvent] @@ -37,7 +38,7 @@ class AkkaCombinedStream(settings: Settings, blockchainUpdates: BlockchainUpdate override def restart(): Unit = ref ! CombinedStreamActor.Command.Restart - override def currentStatus: CombinedStream.Status = lastStatus + override def currentStatus: CombinedStreamStatus = lastStatus override def updateProcessedHeight(height: Int): Unit = ref ! CombinedStreamActor.Command.UpdateProcessedHeight(height) diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedStream.scala b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedStream.scala index c83825bc6a..887ad01d65 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedStream.scala +++ b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedStream.scala @@ -1,10 +1,8 @@ package com.wavesplatform.dex.grpc.integration.clients.combined -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.Status import com.wavesplatform.dex.grpc.integration.clients.domain.WavesNodeEvent -import com.wavesplatform.dex.meta.getSimpleName +import com.wavesplatform.dex.statuses.CombinedStreamStatus import monix.reactive.Observable -import play.api.libs.json.{Format, JsError, JsNumber, JsObject, JsString, JsSuccess, Reads, Writes} import scala.concurrent.duration.FiniteDuration @@ -12,7 +10,7 @@ trait CombinedStream { def startFrom(height: Int): Unit def restart(): Unit - def currentStatus: Status + def currentStatus: CombinedStreamStatus def updateProcessedHeight(height: Int): Unit def currentProcessedHeight: Int @@ -22,45 +20,6 @@ trait CombinedStream { object CombinedStream { - sealed abstract class Status extends Product with Serializable - - object Status { - - final case class Starting(blockchainUpdates: Boolean = false, utxEvents: Boolean = false) extends Status with HasStreams - final case class Stopping(blockchainUpdates: Boolean = false, utxEvents: Boolean = false) extends Status with HasStreams - final case class Closing(blockchainUpdates: Boolean = false, utxEvents: Boolean = false) extends Status with HasStreams - final case class Working(height: Int) extends Status - - implicit val format: Format[Status] = Format( - Reads { json => - (json \ "status").as[String] match { - case "Starting" => JsSuccess(Starting()) - case "Stopping" => JsSuccess(Stopping()) - case "Closing" => JsSuccess(Closing()) - case "Working" => - val height = (json \ "height").as[Int] - JsSuccess(Working(height)) - case x => JsError(s"Can't parse '$x' as CombinedStream.Status") - } - }, - Writes { - case _: Starting => JsObject(Map("status" -> JsString("Starting"))) - case _: Stopping => JsObject(Map("status" -> JsString("Stopping"))) - case _: Closing => JsObject(Map("status" -> JsString("Closing"))) - case x: Working => JsObject(Map("status" -> JsString("Working"), "height" -> JsNumber(x.height))) - } - ) - - sealed trait HasStreams { - def blockchainUpdates: Boolean - def utxEvents: Boolean - - def oneDone: Boolean = blockchainUpdates || utxEvents - override def toString: String = s"${getSimpleName(this)}(b=$blockchainUpdates, u=$utxEvents)" - } - - } - case class Settings(restartDelay: FiniteDuration) } diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedStreamActor.scala b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedStreamActor.scala index 8e0eab072e..41b0ee2e50 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedStreamActor.scala +++ b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedStreamActor.scala @@ -8,10 +8,11 @@ import com.wavesplatform.dex.fp.PartialFunctionOps import com.wavesplatform.dex.fp.PartialFunctionOps.Implicits import com.wavesplatform.dex.grpc.integration.clients.ControlledStream.SystemEvent import com.wavesplatform.dex.grpc.integration.clients.blockchainupdates.{BlockchainUpdatesControlledStream, BlockchainUpdatesConversions} -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.{Settings, Status} +import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.Settings import com.wavesplatform.dex.grpc.integration.clients.domain.WavesNodeEvent import com.wavesplatform.dex.grpc.integration.clients.matcherext.{UtxEventConversions, UtxEventsControlledStream} import com.wavesplatform.dex.grpc.integration.services.UtxEvent +import com.wavesplatform.dex.statuses.CombinedStreamStatus import com.wavesplatform.events.api.grpc.protobuf.SubscribeEvent import monix.execution.Scheduler import monix.reactive.subjects.ConcurrentSubject @@ -45,7 +46,7 @@ object CombinedStreamActor { processedHeight: AtomicInteger, blockchainUpdates: BlockchainUpdatesControlledStream, utxEvents: UtxEventsControlledStream, - status: ConcurrentSubject[Status, Status], + status: ConcurrentSubject[CombinedStreamStatus, CombinedStreamStatus], output: ConcurrentSubject[WavesNodeEvent, WavesNodeEvent] )(implicit monixScheduler: Scheduler): Behavior[Command] = Behaviors.setup[Command] { context => // Subscribe on events @@ -76,13 +77,13 @@ object CombinedStreamActor { def closed: Behavior[Command] = { context.log.info("Status: closed") - status.onNext(Status.Closing(blockchainUpdates = true, utxEvents = true)) + status.onNext(CombinedStreamStatus.Closing(blockchainUpdates = true, utxEvents = true)) Behaviors.receiveMessage[Command](x => logAndKeepBehavior(s"Unexpected $x")) } def closing(utxEventsClosed: Boolean, blockchainUpdatesClosed: Boolean): Behavior[Command] = { context.log.info(s"Status: closing(utx=$utxEventsClosed, bu=$blockchainUpdatesClosed)") - status.onNext(Status.Closing(blockchainUpdates = blockchainUpdatesClosed, utxEvents = utxEventsClosed)) + status.onNext(CombinedStreamStatus.Closing(blockchainUpdates = blockchainUpdatesClosed, utxEvents = utxEventsClosed)) Behaviors.receiveMessage[Command] { case Command.ProcessUtxSystemEvent(SystemEvent.Closed) => if (utxEventsClosed) @@ -153,7 +154,7 @@ object CombinedStreamActor { def starting(utxEventsStarted: Boolean, blockchainUpdatesStarted: Boolean): Behavior[Command] = { context.log.info(s"Status: starting(utx=$utxEventsStarted, bu=$blockchainUpdatesStarted)") - status.onNext(Status.Starting(blockchainUpdates = blockchainUpdatesStarted, utxEvents = utxEventsStarted)) + status.onNext(CombinedStreamStatus.Starting(blockchainUpdates = blockchainUpdatesStarted, utxEvents = utxEventsStarted)) Behaviors.stashWithCtxPropagation[Command](Int.MaxValue) { stash => Behaviors.receiveMessagePartial[Command] { mkPartial { @@ -196,7 +197,7 @@ object CombinedStreamActor { def working: Behavior[Command] = { context.log.info("Status: working") - status.onNext(Status.Working(processedHeight.get())) + status.onNext(CombinedStreamStatus.Working(processedHeight.get())) Behaviors.receiveMessagePartial[Command] { mkPartial { case Command.ProcessUtxSystemEvent(SystemEvent.Stopped) => @@ -225,7 +226,7 @@ object CombinedStreamActor { case Command.UpdateProcessedHeight(x) => processedHeight.set(x) - status.onNext(Status.Working(processedHeight.get())) + status.onNext(CombinedStreamStatus.Working(processedHeight.get())) Behaviors.same }.orElse(onClosedOrRestart) } @@ -235,7 +236,7 @@ object CombinedStreamActor { def stopping(utxEventsStopped: Boolean, blockchainUpdatesStopped: Boolean): Behavior[Command] = { context.log.info(s"Status: stopping(utx=$utxEventsStopped, bu=$blockchainUpdatesStopped)") - status.onNext(Status.Stopping(blockchainUpdates = blockchainUpdatesStopped, utxEvents = utxEventsStopped)) + status.onNext(CombinedStreamStatus.Stopping(blockchainUpdates = blockchainUpdatesStopped, utxEvents = utxEventsStopped)) Behaviors.receiveMessagePartial[Command] { mkPartial { case Command.ProcessUtxSystemEvent(SystemEvent.Stopped) => diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedWavesBlockchainClient.scala b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedWavesBlockchainClient.scala index c3ead3b6b9..915dac3f53 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedWavesBlockchainClient.scala +++ b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/CombinedWavesBlockchainClient.scala @@ -16,8 +16,6 @@ import com.wavesplatform.dex.domain.transaction.ExchangeTransaction import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.grpc.integration.clients._ import com.wavesplatform.dex.grpc.integration.clients.blockchainupdates.{BlockchainUpdatesClient, DefaultBlockchainUpdatesClient} -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.Status -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.Status.Starting import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedWavesBlockchainClient.Settings import com.wavesplatform.dex.grpc.integration.clients.domain.StatusUpdate.LastBlockHeight import com.wavesplatform.dex.grpc.integration.clients.domain._ @@ -29,6 +27,7 @@ import com.wavesplatform.dex.grpc.integration.protobuf.PbToDexConversions._ import com.wavesplatform.dex.grpc.integration.services.UtxTransaction import com.wavesplatform.dex.grpc.integration.settings.WavesBlockchainClientSettings import com.wavesplatform.dex.grpc.integration.tool.RestartableManagedChannel +import com.wavesplatform.dex.statuses.CombinedStreamStatus import com.wavesplatform.protobuf.transaction.SignedTransaction import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioSocketChannel @@ -54,9 +53,9 @@ class CombinedWavesBlockchainClient( type Balances = Map[Address, Map[Asset, Long]] type Leases = Map[Address, Long] - @volatile private var blockchainStatus: Status = Starting() + @volatile private var blockchainStatus: CombinedStreamStatus = CombinedStreamStatus.Starting() - override def status(): Status = blockchainStatus + override def status(): CombinedStreamStatus = blockchainStatus private val pbMatcherPublicKey = matcherPublicKey.toPB diff --git a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/NoOpCombinedStream.scala b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/NoOpCombinedStream.scala index e962281bc2..f200171b14 100644 --- a/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/NoOpCombinedStream.scala +++ b/waves-integration/src/main/scala/com/wavesplatform/dex/grpc/integration/clients/combined/NoOpCombinedStream.scala @@ -1,12 +1,13 @@ package com.wavesplatform.dex.grpc.integration.clients.combined import com.wavesplatform.dex.grpc.integration.clients.domain.WavesNodeEvent +import com.wavesplatform.dex.statuses.CombinedStreamStatus import monix.reactive.Observable object NoOpCombinedStream extends CombinedStream { override def startFrom(height: Int): Unit = {} override def restart(): Unit = {} - override def currentStatus: CombinedStream.Status = CombinedStream.Status.Closing(blockchainUpdates = true, utxEvents = true) + override def currentStatus: CombinedStreamStatus = CombinedStreamStatus.Closing(blockchainUpdates = true, utxEvents = true) override def updateProcessedHeight(height: Int): Unit = {} override def currentProcessedHeight: Int = 0 override val stream: Observable[WavesNodeEvent] = Observable.empty diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/NoShrink.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/NoShrink.scala deleted file mode 100644 index f9ba9a3f39..0000000000 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/NoShrink.scala +++ /dev/null @@ -1,8 +0,0 @@ -package com.wavesplatform.dex - -import org.scalacheck.Shrink - -trait NoShrink { - // NoShrink - implicit def noShrink[A]: Shrink[A] = Shrink.withLazyList(_ => LazyList.empty) // TODO DEX-994 -} diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/WavesIntegrationSuiteBase.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/WavesIntegrationSuiteBase.scala index e602f507bd..a952bd064d 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/WavesIntegrationSuiteBase.scala +++ b/waves-integration/src/test/scala/com/wavesplatform/dex/WavesIntegrationSuiteBase.scala @@ -8,6 +8,7 @@ import com.wavesplatform.dex.domain.asset.Asset.IssuedAsset import com.wavesplatform.dex.domain.bytes.codec.Base58 import com.wavesplatform.dex.grpc.integration.clients.domain.{TransactionWithChanges, WavesBlock, WavesChain} import com.wavesplatform.dex.grpc.integration.services.UtxTransaction +import com.wavesplatform.dex.utils.Diffs import com.wavesplatform.events.protobuf.StateUpdate import com.wavesplatform.protobuf.transaction.SignedTransaction import io.qameta.allure.scalatest.AllureScalatestContext @@ -20,8 +21,7 @@ import org.scalatest.matchers.{MatchResult, Matcher} import scala.collection.immutable.Vector import scala.concurrent.duration._ -// TODO DEX-994 -trait WavesIntegrationSuiteBase extends AnyFreeSpecLike with Matchers with AllureScalatestContext with ScalaFutures { +trait WavesIntegrationSuiteBase extends AnyFreeSpecLike with Matchers with AllureScalatestContext with ScalaFutures with Diffs { implicit override def patienceConfig = PatienceConfig(5.seconds) @@ -29,38 +29,10 @@ trait WavesIntegrationSuiteBase extends AnyFreeSpecLike with Matchers with Allur implicit val optionEmptiness: Emptiness[Option[Any]] = (thing: Option[Any]) => thing.isEmpty - // diffx - val byteStringDiff: Diff[ByteString] = Diff[String].contramap[ByteString](xs => Base58.encode(xs.toByteArray)) - - implicit val derivedByteStringDiff: Derived[Diff[ByteString]] = Derived(byteStringDiff) - implicit val derivedUtxTransactionDiff: Derived[Diff[UtxTransaction]] = Derived(byteStringDiff.contramap[UtxTransaction](_.id)) - - implicit val addressDiff: Diff[Address] = Diff[String].contramap[Address](_.stringRepr) - - // TODO Duplicate - implicit val issuedAssetDiff: Diff[IssuedAsset] = { (left: IssuedAsset, right: IssuedAsset, _: List[FieldPath]) => - if (left.id == right.id) Identical(left) else DiffResultValue(left, right) - } - - // TODO Duplicate - implicit val assetDiff: Diff[Asset] = { (left: Asset, right: Asset, _: List[FieldPath]) => - if (left == right) Identical(left) else DiffResultValue(left, right) - } - - // TODO Duplicate - implicit val issuedAssetDerivedDiff: Derived[Diff[IssuedAsset]] = Derived(issuedAssetDiff) - - // TODO Duplicate - implicit val assetDerivedDiff: Derived[Diff[Asset]] = Derived(assetDiff) - // Fixes "Class too large" compiler issue implicit val derivedSignedTransactionDiff: Derived[Diff[TransactionWithChanges]] = Derived(byteStringDiff.contramap[TransactionWithChanges](_.txId)) - def getDiff[T](comparison: (T, T) => Boolean): Diff[T] = { (left: T, right: T, _: List[FieldPath]) => - if (comparison(left, right)) Identical(left) else DiffResultValue(left, right) - } - def matchTo[A: Diff](right: A)(implicit c: ConsoleColorConfig): Matcher[A] = { left => Diff[A].apply(left, right) match { case c: DiffResultDifferent => diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/collections/ListOfMapOpsSpec.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/collections/ListOfMapOpsSpec.scala index ac75c71361..d2c742ef6e 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/collections/ListOfMapOpsSpec.scala +++ b/waves-integration/src/test/scala/com/wavesplatform/dex/collections/ListOfMapOpsSpec.scala @@ -1,7 +1,8 @@ package com.wavesplatform.dex.collections import com.wavesplatform.dex.collections.ListOps.ListOfMapsOps -import com.wavesplatform.dex.{NoShrink, WavesIntegrationSuiteBase} +import com.wavesplatform.dex.WavesIntegrationSuiteBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatest.matchers.should.Matchers import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/combined/AkkaCombinedStreamTestSuite.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/combined/AkkaCombinedStreamTestSuite.scala index d36783e754..3650972c65 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/combined/AkkaCombinedStreamTestSuite.scala +++ b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/combined/AkkaCombinedStreamTestSuite.scala @@ -8,9 +8,9 @@ import com.wavesplatform.dex.WavesIntegrationSuiteBase import com.wavesplatform.dex.grpc.integration.clients.ControlledStream.SystemEvent import com.wavesplatform.dex.grpc.integration.clients.blockchainupdates.BlockchainUpdatesControlledStream import com.wavesplatform.dex.grpc.integration.clients.combined.AkkaCombinedStreamTestSuite._ -import com.wavesplatform.dex.grpc.integration.clients.combined.CombinedStream.Status import com.wavesplatform.dex.grpc.integration.clients.matcherext.UtxEventsControlledStream import com.wavesplatform.dex.grpc.integration.services.UtxEvent +import com.wavesplatform.dex.statuses.CombinedStreamStatus import com.wavesplatform.events.api.grpc.protobuf.SubscribeEvent import monix.execution.{ExecutionModel, Scheduler} import monix.reactive.Observable @@ -88,7 +88,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit val t = mk() t.cs.startFrom(10) eventually { - t.cs.currentStatus shouldBe Status.Working(9) + t.cs.currentStatus shouldBe CombinedStreamStatus.Working(9) } } @@ -96,7 +96,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit val t = mkEventuallyWorking() t.cs.updateProcessedHeight(10) eventually { - t.cs.currentStatus shouldBe Status.Working(10) + t.cs.currentStatus shouldBe CombinedStreamStatus.Working(10) } } } @@ -137,7 +137,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit val t = mk() t.blockchainUpdates.systemStream.onNext(SystemEvent.BecameReady) logged(t.utxEvents.systemStream)(_.lastOption shouldBe empty) - t.cs.currentStatus shouldBe Status.Starting() + t.cs.currentStatus shouldBe CombinedStreamStatus.Starting() } "Stopped" - { @@ -156,7 +156,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit t.cs.currentProcessedHeight shouldBe -1 } eventually { - t.cs.currentStatus should matchTo[Status](Status.Working(-1)) + t.cs.currentStatus should matchTo[CombinedStreamStatus](CombinedStreamStatus.Working(-1)) } } } @@ -172,7 +172,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit val t = mkEventuallyWorking() t.blockchainUpdates.close() eventually { - t.cs.currentStatus should matchTo[Status](Status.Closing( + t.cs.currentStatus should matchTo[CombinedStreamStatus](CombinedStreamStatus.Closing( blockchainUpdates = true, utxEvents = true )) @@ -186,7 +186,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit val t = mk() t.utxEvents.systemStream.onNext(SystemEvent.BecameReady) logged(t.blockchainUpdates.systemStream)(_.headOption shouldBe empty) - t.cs.currentStatus shouldBe Status.Starting() + t.cs.currentStatus shouldBe CombinedStreamStatus.Starting() } "Stopped" - { @@ -216,7 +216,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit t.cs.currentProcessedHeight shouldBe -1 } eventually { - t.cs.currentStatus should matchTo[Status](Status.Working(-1)) + t.cs.currentStatus should matchTo[CombinedStreamStatus](CombinedStreamStatus.Working(-1)) } } } @@ -232,7 +232,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit val t = mkEventuallyWorking() t.utxEvents.close() eventually { - t.cs.currentStatus should matchTo[Status](Status.Closing( + t.cs.currentStatus should matchTo[CombinedStreamStatus](CombinedStreamStatus.Closing( blockchainUpdates = true, utxEvents = true )) @@ -262,7 +262,7 @@ class AkkaCombinedStreamTestSuite extends WavesIntegrationSuiteBase with TestKit private def mkEventuallyWorking(): TestClasses = mk().tap { x => x.cs.startFrom(1) eventually { - x.cs.currentStatus shouldBe Status.Working(0) + x.cs.currentStatus shouldBe CombinedStreamStatus.Working(0) } } diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/WavesChainTestSuite.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/WavesChainTestSuite.scala index 653538bbc4..b2059a533f 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/WavesChainTestSuite.scala +++ b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/WavesChainTestSuite.scala @@ -1,7 +1,6 @@ package com.wavesplatform.dex.grpc.integration.clients.domain import java.nio.charset.StandardCharsets - import cats.Monoid import cats.syntax.either._ import cats.syntax.option._ @@ -11,7 +10,8 @@ import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.bytes.codec.Base58 import com.wavesplatform.dex.test.matchers.ProduceError.produce -import com.wavesplatform.dex.{NoShrink, WavesIntegrationSuiteBase} +import com.wavesplatform.dex.WavesIntegrationSuiteBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/WavesForkTestSuite.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/WavesForkTestSuite.scala index 0989915f30..1d6b62785b 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/WavesForkTestSuite.scala +++ b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/WavesForkTestSuite.scala @@ -1,7 +1,6 @@ package com.wavesplatform.dex.grpc.integration.clients.domain import java.nio.charset.StandardCharsets - import cats.Monoid import cats.implicits._ import com.wavesplatform.dex.domain.account.KeyPair @@ -9,7 +8,8 @@ import com.wavesplatform.dex.domain.asset.Asset.{IssuedAsset, Waves} import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.bytes.codec.Base58 import com.wavesplatform.dex.grpc.integration.clients.domain.WavesFork.Status -import com.wavesplatform.dex.{NoShrink, WavesIntegrationSuiteBase} +import com.wavesplatform.dex.WavesIntegrationSuiteBase +import com.wavesplatform.dex.util.NoShrink import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks class WavesForkTestSuite extends WavesIntegrationSuiteBase with ScalaCheckDrivenPropertyChecks with NoShrink { diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/portfolio/PessimisticPortfoliosTestSuiteBase.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/portfolio/PessimisticPortfoliosTestSuiteBase.scala index 6884bafbd6..c6c54b8903 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/portfolio/PessimisticPortfoliosTestSuiteBase.scala +++ b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/portfolio/PessimisticPortfoliosTestSuiteBase.scala @@ -7,7 +7,8 @@ import cats.kernel.Monoid import cats.syntax.foldable._ import com.wavesplatform.dex.domain.account.Address import com.wavesplatform.dex.domain.asset.Asset -import com.wavesplatform.dex.{NoShrink, WavesIntegrationSuiteBase} +import com.wavesplatform.dex.WavesIntegrationSuiteBase +import com.wavesplatform.dex.util.NoShrink import org.scalacheck.Gen import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/portfolio/StateUpdateOpsTestSuite.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/portfolio/StateUpdateOpsTestSuite.scala index 7ef9f3ae6c..a94f3ecc58 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/portfolio/StateUpdateOpsTestSuite.scala +++ b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/integration/clients/domain/portfolio/StateUpdateOpsTestSuite.scala @@ -8,7 +8,8 @@ import com.wavesplatform.dex.domain.bytes.ByteStr import com.wavesplatform.dex.domain.utils.EitherExt2 import com.wavesplatform.dex.grpc.integration.clients.domain.portfolio.Implicits.StateUpdateOps import com.wavesplatform.dex.grpc.integration.protobuf.PbToDexConversions._ -import com.wavesplatform.dex.{NoShrink, WavesIntegrationSuiteBase} +import com.wavesplatform.dex.WavesIntegrationSuiteBase +import com.wavesplatform.dex.util.NoShrink import com.wavesplatform.events.protobuf.StateUpdate import com.wavesplatform.protobuf.Amount import com.wavesplatform.protobuf.transaction.Transaction diff --git a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/observers/IntegrationObserverSpec.scala b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/observers/IntegrationObserverSpec.scala index 3bb9f83419..da14fec46f 100644 --- a/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/observers/IntegrationObserverSpec.scala +++ b/waves-integration/src/test/scala/com/wavesplatform/dex/grpc/observers/IntegrationObserverSpec.scala @@ -1,6 +1,7 @@ package com.wavesplatform.dex.grpc.observers -import com.wavesplatform.dex.{NoShrink, WavesIntegrationSuiteBase} +import com.wavesplatform.dex.WavesIntegrationSuiteBase +import com.wavesplatform.dex.util.NoShrink import monix.execution.UncaughtExceptionReporter import monix.reactive.Observer import org.scalacheck.Gen