diff --git a/geniusyield-orderbot/geniusyield-orderbot.cabal b/geniusyield-orderbot/geniusyield-orderbot.cabal index f1f75aa..462c0bd 100644 --- a/geniusyield-orderbot/geniusyield-orderbot.cabal +++ b/geniusyield-orderbot/geniusyield-orderbot.cabal @@ -64,8 +64,10 @@ library , deriving-aeson , geniusyield-dex-api , http-api-data + , lens , rio , strict + , swagger2 -- Dependencies whose version is fixed by @cabal.project@ file. build-depends: diff --git a/geniusyield-orderbot/src/GeniusYield/OrderBot/Types.hs b/geniusyield-orderbot/src/GeniusYield/OrderBot/Types.hs index 4c40265..32bbea1 100644 --- a/geniusyield-orderbot/src/GeniusYield/OrderBot/Types.hs +++ b/geniusyield-orderbot/src/GeniusYield/OrderBot/Types.hs @@ -25,17 +25,20 @@ module GeniusYield.OrderBot.Types ( DexPair (..), ) where -import Data.Aeson (FromJSON (..), ToJSON, (.=)) +import Control.Lens ((?~)) +import Data.Aeson (FromJSON (..), ToJSON (..), (.=)) import Data.Aeson qualified as Aeson import Data.Kind (Type) import Data.Ratio (denominator, numerator, (%)) +import Data.Swagger qualified as Swagger +import Data.Swagger.Internal.Schema qualified as Swagger import Data.Word (Word64) import GeniusYield.Api.Dex.PartialOrder (PartialOrderInfo (..)) import GeniusYield.Types (rationalToGHC) import GeniusYield.Types.TxOutRef (GYTxOutRef) import GeniusYield.Types.Value (GYAssetClass (..)) import Numeric.Natural (Natural) -import RIO (Text) +import RIO (Text, (&)) import RIO.Text qualified as Text import RIO.Text.Partial qualified as Text import Web.HttpApiData (FromHttpApiData (..), ToHttpApiData (..)) @@ -236,6 +239,22 @@ instance FromHttpApiData OrderAssetPair where comAsset ← parseUrlPiece com pure $ OAssetPair curAsset comAsset +instance Swagger.ToParamSchema OrderAssetPair where + toParamSchema _ = + mempty + & Swagger.type_ + ?~ Swagger.SwaggerString + +instance Swagger.ToSchema OrderAssetPair where + declareNamedSchema p = + pure $ + Swagger.named "OrderAssetPair" $ + Swagger.paramSchemaToSchema p + & Swagger.example + ?~ toJSON ("f43a62fdc3965df486de8a0d32fe800963589c41b38946602a0dc535.41474958_dda5fdb1002f7389b33e036b6afee82a8189becb6cba852e8b79b4fb.0014df1047454e53" ∷ String) + & Swagger.description + ?~ "Market pair identifier. It's an underscore delimited concatenation of offered and asked asset's \"token detail\". A token detail is given by dot delimited concatenation of policy id and token name." + {- | Two order asset pairs are considered "equivalent" (but not strictly equal, as in 'Eq'), if they contain the same 2 assets irrespective of order. i.e {currencyAsset = A, commodityAsset = B} and diff --git a/geniusyield-server-lib/src/GeniusYield/Server/Dex/Markets.hs b/geniusyield-server-lib/src/GeniusYield/Server/Dex/Markets.hs index 96eab66..49c0b4d 100644 --- a/geniusyield-server-lib/src/GeniusYield/Server/Dex/Markets.hs +++ b/geniusyield-server-lib/src/GeniusYield/Server/Dex/Markets.hs @@ -16,13 +16,14 @@ import GeniusYield.HTTP.Errors ( ) import GeniusYield.Imports import GeniusYield.OrderBot.Domain.Markets (Markets (getMarkets)) -import GeniusYield.OrderBot.Types (DexPair (..), OrderAssetPair (commodityAsset, currencyAsset), TokenDisplayDetails (..)) +import GeniusYield.OrderBot.Types (DexPair (..), OrderAssetPair (commodityAsset, currencyAsset), TokenDisplayDetails (..), mkOrderAssetPair) import GeniusYield.Scripts.Dex.PartialOrderConfig (PartialOrderConfigInfoF (..)) import GeniusYield.Server.Ctx import GeniusYield.Server.Utils (addSwaggerDescription, addSwaggerExample, dropAndCamelToSnake, logInfo) import GeniusYield.TxBuilder.Class import GeniusYield.Types import Network.HTTP.Types (status400) +import RIO (Word64) import Servant {- $setup @@ -72,9 +73,13 @@ instance Swagger.ToSchema TargetAsset where & addSwaggerExample "GENS" data Market = Market - { marketId ∷ !MarketId, - baseAsset ∷ !BaseAsset, - targetAsset ∷ !TargetAsset + { marketId ∷ !OrderAssetPair, + baseAsset ∷ !GYAssetClass, + targetAsset ∷ !GYAssetClass, + baseAssetTicker ∷ !(Maybe Text), + targetAssetTicker ∷ !(Maybe Text), + baseAssetDecimals ∷ !(Maybe Word64), + targetAssetDecimals ∷ !(Maybe Word64) } deriving stock (Show, Eq, Generic) deriving @@ -104,7 +109,10 @@ handleMarkets ctx = do where -- We assume following for now as there is no link b/w display name and actual asset name, for instance @LENFI@ token has asset name @AADA@. fromDexPair ∷ DexPair → Market - fromDexPair DexPair {..} = Market {marketId = MarketId dpMarketPairId, baseAsset = BaseAsset (tddTicker dpCurrencyToken), targetAsset = TargetAsset (tddTicker dpCommodityToken)} + fromDexPair DexPair {..} = + let baseAsset' = tddAssetClass dpCurrencyToken + targetAsset' = tddAssetClass dpCommodityToken + in Market {marketId = mkOrderAssetPair baseAsset' targetAsset', baseAsset = baseAsset', targetAsset = targetAsset', baseAssetTicker = Just $ tddTicker dpCurrencyToken, targetAssetTicker = Just $ tddTicker dpCommodityToken, baseAssetDecimals = Just $ tddDecimals dpCurrencyToken, targetAssetDecimals = Just $ tddDecimals dpCommodityToken} -- Market -- { marketId = MarketId dexMarketPairId, diff --git a/geniusyield-server-lib/src/GeniusYield/Server/Dex/PartialOrder.hs b/geniusyield-server-lib/src/GeniusYield/Server/Dex/PartialOrder.hs index e4b1ba9..b408ef8 100644 --- a/geniusyield-server-lib/src/GeniusYield/Server/Dex/PartialOrder.hs +++ b/geniusyield-server-lib/src/GeniusYield/Server/Dex/PartialOrder.hs @@ -179,22 +179,6 @@ data OrderResponse = OrderResponse (FromJSON, ToJSON) via CustomJSON '[FieldLabelModifier '[StripPrefix OrderResPrefix, CamelToSnake]] OrderResponse -instance Swagger.ToParamSchema OrderAssetPair where - toParamSchema _ = - mempty - & Swagger.type_ - ?~ Swagger.SwaggerString - -instance Swagger.ToSchema OrderAssetPair where - declareNamedSchema p = - pure $ - Swagger.named "OrderAssetPair" $ - Swagger.paramSchemaToSchema p - & Swagger.example - ?~ toJSON ("f43a62fdc3965df486de8a0d32fe800963589c41b38946602a0dc535.41474958_dda5fdb1002f7389b33e036b6afee82a8189becb6cba852e8b79b4fb.0014df1047454e53" ∷ String) - & Swagger.description - ?~ "Market pair identifier. It's an underscore delimited concatenation of offered and asked asset's \"token detail\". A token detail is given by dot delimited concatenation of policy id and token name." - instance Swagger.ToSchema OrderResponse where declareNamedSchema = Swagger.genericDeclareNamedSchema Swagger.defaultSchemaOptions {Swagger.fieldLabelModifier = dropAndCamelToSnake @OrderResPrefix}