packages feed

blockfrost-api 0.12.1.0 → 0.12.2.0

raw patch · 8 files changed

+126/−16 lines, 8 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Blockfrost.Types.Cardano.Pools: instance Data.Aeson.Types.FromJSON.FromJSON (GHC.Maybe.Maybe Blockfrost.Types.Cardano.Pools.PoolMetadata)
- Blockfrost.Types.Cardano.Pools: instance Data.Aeson.Types.ToJSON.ToJSON (GHC.Maybe.Maybe Blockfrost.Types.Cardano.Pools.PoolMetadata)
+ Blockfrost.Types.Cardano.Blocks: TxHashCBOR :: (TxHash, TransactionCBOR) -> TxHashCBOR
+ Blockfrost.Types.Cardano.Blocks: [$sel:getTxHashCBOR:TxHashCBOR] :: TxHashCBOR -> (TxHash, TransactionCBOR)
+ Blockfrost.Types.Cardano.Blocks: instance Data.Aeson.Types.FromJSON.FromJSON Blockfrost.Types.Cardano.Blocks.TxHashCBOR
+ Blockfrost.Types.Cardano.Blocks: instance Data.Aeson.Types.ToJSON.ToJSON Blockfrost.Types.Cardano.Blocks.TxHashCBOR
+ Blockfrost.Types.Cardano.Blocks: instance GHC.Classes.Eq Blockfrost.Types.Cardano.Blocks.TxHashCBOR
+ Blockfrost.Types.Cardano.Blocks: instance GHC.Generics.Generic Blockfrost.Types.Cardano.Blocks.TxHashCBOR
+ Blockfrost.Types.Cardano.Blocks: instance GHC.Show.Show Blockfrost.Types.Cardano.Blocks.TxHashCBOR
+ Blockfrost.Types.Cardano.Blocks: instance Servant.Docs.Internal.ToSample Blockfrost.Types.Cardano.Blocks.TxHashCBOR
+ Blockfrost.Types.Cardano.Blocks: newtype TxHashCBOR
+ Blockfrost.Types.Cardano.Pools: PoolMetadataResponse :: Maybe PoolMetadata -> PoolMetadataResponse
+ Blockfrost.Types.Cardano.Pools: [$sel:getMetadata:PoolMetadataResponse] :: PoolMetadataResponse -> Maybe PoolMetadata
+ Blockfrost.Types.Cardano.Pools: instance Data.Aeson.Types.FromJSON.FromJSON Blockfrost.Types.Cardano.Pools.PoolMetadataResponse
+ Blockfrost.Types.Cardano.Pools: instance Data.Aeson.Types.ToJSON.ToJSON Blockfrost.Types.Cardano.Pools.PoolMetadataResponse
+ Blockfrost.Types.Cardano.Pools: instance GHC.Classes.Eq Blockfrost.Types.Cardano.Pools.PoolMetadataResponse
+ Blockfrost.Types.Cardano.Pools: instance GHC.Generics.Generic Blockfrost.Types.Cardano.Pools.PoolMetadataResponse
+ Blockfrost.Types.Cardano.Pools: instance GHC.Show.Show Blockfrost.Types.Cardano.Pools.PoolMetadataResponse
+ Blockfrost.Types.Cardano.Pools: newtype PoolMetadataResponse

Files

CHANGELOG.md view
@@ -1,3 +1,11 @@+# Version [0.12.2.0](https://github.com/blockfrost/blockfrost-haskell/compare/api-0.12.1.0...api-0.12.2.0) (2025-04-07)++* Additions+  * `/blocks/:hash_or_number/txs/cbor`+    and `/blocks/latest/txs/cbor` endpoints with `[TxHashCBOR]` data type [#73](https://github.com/blockfrost/blockfrost-haskell/pull/73) [#75](https://github.com/blockfrost/blockfrost-haskell/pull/75)+* Removal of problematic overlapping `From/ToJSON`+  instances on `Mabye PoolMetadata` [#72](https://github.com/blockfrost/blockfrost-haskell/pull/72)+ # Version [0.12.1.0](https://github.com/blockfrost/blockfrost-haskell/compare/api-0.12.0.0...api-0.12.1.0) (2024-09-25)  * Fix return type of `/txs/:hash/cbor` endpoint from `[TransactionCBOR]` to `TransactionCBOR`.
blockfrost-api.cabal view
@@ -1,6 +1,6 @@ cabal-version:       2.2 name:                blockfrost-api-version:             0.12.1.0+version:             0.12.2.0 synopsis:            API definitions for blockfrost.io description:         Core types and Servant API description homepage:            https://github.com/blockfrost/blockfrost-haskell
src/Blockfrost/API/Cardano/Blocks.hs view
@@ -32,6 +32,16 @@         :> Pagination         :> Sorting         :> Get '[JSON] [TxHash]+      , _latestTxsCBOR+        :: route+        :- Summary "Latest transactions with CBOR data"+        :> Description "Return the transactions within the latest block, including CBOR representations."+        :> "latest"+        :> "txs"+        :> "cbor"+        :> Pagination+        :> Sorting+        :> Get '[JSON] [TxHashCBOR]      , _block         :: route         :- Summary "Latest block transactions"@@ -79,6 +89,16 @@         :> Pagination         :> Sorting         :> Get '[JSON] [TxHash]+      , _blockTxsCBOR+        :: route+        :- Summary "Block transactions with CBOR data"+        :> Description "Return the transactions within the block, including CBOR representations."+        :> Capture "hash_or_number" (Either Integer BlockHash)+        :> "txs"+        :> "cbor"+        :> Pagination+        :> Sorting+        :> Get '[JSON] [TxHashCBOR]       , _blockAffectedAddresses         :: route         :- Summary "Addresses affected in a specific block"
src/Blockfrost/API/Cardano/Pools.hs view
@@ -68,7 +68,7 @@         :> Description "Stake pool registration metadata."         :> Capture "pool_id" PoolId         :> "metadata"-        :> Get '[JSON] (Maybe PoolMetadata)+        :> Get '[JSON] PoolMetadataResponse     , _getPoolRelays         :: route         :- Summary "Stake pool relays"
src/Blockfrost/Types/Cardano/Blocks.hs view
@@ -2,6 +2,7 @@  module Blockfrost.Types.Cardano.Blocks   ( Block (..)+  , TxHashCBOR (..)   ) where  import Data.Text (Text)@@ -12,6 +13,7 @@ import Servant.Docs (ToSample (..), singleSample)  import Blockfrost.Types.Shared+import Blockfrost.Types.Cardano.Transactions (TransactionCBOR(..))  -- | Information about a block data Block = Block@@ -73,3 +75,30 @@       o       "transactions"     pure (addr, txs)++-- | Transaction @TxHash@ to its respective @TransactionCBOR@ wrapper.+-- Intentionally not a Map to preserve ordering+newtype TxHashCBOR = TxHashCBOR { getTxHashCBOR :: (TxHash, TransactionCBOR) }+  deriving stock (Show, Eq, Generic)++instance ToSample TxHashCBOR where+  toSamples _ =+      singleSample+    $ TxHashCBOR+        ( TxHash "6f044565223657acdde3c569d6555b2edbd71bc2bfb4df0b1cce0ef805f606d4"+        , TransactionCBOR "84a300d9010281825820787b3a89b1d32806968b867a4a31f1e33054b573821293a1c915559e34810a3602018282583900bd71b1547ab3ec95725100d0c0fb06da5ffae9cf54fb97e0f52fb9cab51adb784c4997143ba56990c0584111137d02898950245f5db5e2631a05f5e10082583900bd71b1547ab3ec95725100d0c0fb06da5ffae9cf54fb97e0f52fb9cab51adb784c4997143ba56990c0584111137d02898950245f5db5e2631b0000001588345487021a0002922da100818258206a7884092084c018eed71f9df5ff61935ab021f578b2d57d8ffb0b0e8ac0ea285840a2045496acf31996336ef187f9f3c2bd24c24995b540541586cbbc73a1550a50c2fdc3d4b99766c2823eb520866b03a38a60a4eb94f24994f441fb2852447c0ef5f6"+        )++instance ToJSON TxHashCBOR where+  toJSON (TxHashCBOR (k, v)) =+    object+      [ "tx_hash" .= toJSON k+      , "cbor" .= toJSON v+      ]++instance FromJSON TxHashCBOR where+  parseJSON =+    withObject "txHashCBOR" $ \to -> do+      th <- to .: "tx_hash"+      cb <- TransactionCBOR <$> to .: "cbor"+      pure $ TxHashCBOR (th, cb)
src/Blockfrost/Types/Cardano/Pools.hs view
@@ -6,6 +6,7 @@   , PoolInfo (..)   , PoolHistory (..)   , PoolMetadata (..)+  , PoolMetadataResponse (..)   , PoolRelay (..)   , PoolDelegator (..)   , PoolUpdate (..)@@ -164,18 +165,6 @@   deriving (FromJSON, ToJSON)   via CustomJSON '[FieldLabelModifier '[StripPrefix "_poolMetadata", CamelToSnake]] PoolMetadata --- We need this more specific--- instance since API returns--- empty object if there's no metadata-instance {-# OVERLAPS #-} ToJSON (Maybe PoolMetadata) where-  toJSON Nothing   = object mempty-  toJSON (Just pm) = toJSON pm-  toEncoding Nothing   = pairs mempty-  toEncoding (Just pm) = toEncoding pm-instance {-# OVERLAPS #-} FromJSON (Maybe PoolMetadata) where-  parseJSON x | x == object [] = pure Nothing-  parseJSON x = Just <$> parseJSON x- instance ToSample PoolMetadata where   toSamples = pure $ singleSample samplePoolMetadata @@ -191,6 +180,23 @@     , _poolMetadataDescription = Just "The best pool ever"     , _poolMetadataHomepage = Just "https://stakentus.com/"     }++-- | Actual response about stake pool metadata.+newtype PoolMetadataResponse = PoolMetadataResponse { getMetadata :: Maybe PoolMetadata }+  deriving stock (Show, Eq, Generic)++-- NOTE: Manual instance to produce empty object if there is no metadata+instance ToJSON PoolMetadataResponse where+  toJSON (PoolMetadataResponse Nothing) = object mempty+  toJSON (PoolMetadataResponse (Just pm)) = toJSON pm++  toEncoding (PoolMetadataResponse Nothing) = pairs mempty+  toEncoding (PoolMetadataResponse (Just pm)) = toEncoding pm++-- NOTE: Manual instance to accept empty objects as no metadata.+instance FromJSON PoolMetadataResponse where+  parseJSON x | x == object [] = pure $ PoolMetadataResponse Nothing+  parseJSON x = PoolMetadataResponse . Just <$> parseJSON x  -- | Relays of a stake pool data PoolRelay = PoolRelay
test/Cardano/Blocks.hs view
@@ -22,11 +22,17 @@     `shouldBe`     Right blockExpected -  it "parses afftected addresses sample" $ do+  it "parses affected addresses sample" $ do     eitherDecode affectedAddrsSample     `shouldBe`     Right affectedAddrsExpected +  it "parses transactions with cbor sample" $ do+    eitherDecode txHashesCBORSample+    `shouldBe`+    Right txHashesCBORExpected++ blockSample = [r| {     "time": 1641338934,@@ -96,4 +102,45 @@      [TxHash "1a0570af966fb355a7160e4f82d5a80b8681b7955f5d44bec0dce628516157f0"])   , (Address "addr1qxqs59lphg8g6qndelq8xwqn60ag3aeyfcp33c2kdp46a09re5df3pzwwmyq946axfcejy5n4x0y99wqpgtp2gd0k09qsgy6pz",      [TxHash "1a0570af966fb355a7160e4f82d5a80b8681b7955f5d44bec0dce628516157d0"])+  ]++txHashesCBORSample = [r|+[+  {+    "tx_hash": "6f044565223657acdde3c569d6555b2edbd71bc2bfb4df0b1cce0ef805f606d4",+    "cbor": "84a300d9010281825820787b3a89b1d32806968b867a4a31f1e33054b573821293a1c915559e34810a3602018282583900bd71b1547ab3ec95725100d0c0fb06da5ffae9cf54fb97e0f52fb9cab51adb784c4997143ba56990c0584111137d02898950245f5db5e2631a05f5e10082583900bd71b1547ab3ec95725100d0c0fb06da5ffae9cf54fb97e0f52fb9cab51adb784c4997143ba56990c0584111137d02898950245f5db5e2631b0000001588345487021a0002922da100818258206a7884092084c018eed71f9df5ff61935ab021f578b2d57d8ffb0b0e8ac0ea285840a2045496acf31996336ef187f9f3c2bd24c24995b540541586cbbc73a1550a50c2fdc3d4b99766c2823eb520866b03a38a60a4eb94f24994f441fb2852447c0ef5f6"+  },+  {+    "tx_hash": "9b9ddb7ee8101e5a2638b5b79fe4dbafafcda56df12eebe2fd456e9862b848ea",+    "cbor": "84a300d90102818258207df720d99d8323830709439492876005ff752b94dafeb7bec529ab1679ec236901018282583900f2b425e12b7d90128fff6368c9c3cee21e29ae0273dda6f4c21c66f8364d4566878a66fab0bbc596dac020e3188cb58e40f7069e3c6652fa1a00e4e1c082583900c8cbbfc1db08891d2c2ec9f8df43c2904a61c0626c7e1a57627eb0753e9649b2a3596889c539a17e4d4cbefd9ed73a73d4d8f6089e02d1df1b00000004a6558a56021a0002922da10081825820844e231d37f9b76a2b02978d634ec7fa9fa7bc74a4ce3bc403e3091321a672405840c3cebb97014af06991be1a15fbc86adf71c2441dcbf3078edb11d9407306a13694f7ca5d8fc366bf28ea30fda713c2368e648ce7c87bd2981b43e4fecdd05403f5f6"+  },+  {+    "tx_hash": "52aec9ace9b710bc2e662d4fe20e71c1bc3a0c0f3b8076f069af9713963d4559",+    "cbor": "84a300d9010281825820c8e9b710248220c28f5fbf6fb040b3a392707d19d0bfdaa5474c882d02b0c3ab0101828258390036e0cf1e52e05ef92e52c7bc2a04493d6bae481b8acbab12ec4300d7f9c9e87246d2f0373885896ad2804b7229673204cac9208345c1ea5b1a001e848082583900263bdbb58275ab6396c39a3188b6594bd5d46f54e08b6868c9fb3e498141d8651e0139b3bfc9c31f76d885431f83957329d75e0e53a65c2a1b000000730e797dda021a0002a2ada100d90102818258200909d10ce4850cd340b155d1dceae0bdcd77eba09524296ffe40f061dfc537c7584073a9efedf31dafc428605836d1ce2e2f62c1c6a9e733a5e538de034449b8ade504521e5fff96df5712487d214c83ac69babaa604bec9bc7a278f9f38b58ef70cf5f6"+  },+  {+    "tx_hash": "b49ccb4ee194da2d97bfa5374509b2ed11a3b8265d346287928e6d25b82f48cb",+    "cbor": "84a300d9010281825820c5952d922ea00bbb4b6be104c647e6e7b8366c290db5173655f871243494d1001818018182581d60da0eb5ed7611482ec5089b69d870e0c56c1c45180256112398e0835b1b00000002540be400021a00030d40a100d90102818258206855ffb8cbde9163c55c2405f93a8cfa063a631d811281d954e16782123956a75840a4208e0e2236b7f04f77f47ba07f3ec40cbf567ddfd7c7562a451cd51b38f58936e233be2a1a4f202c704fc9963215cdfdde19970c7d05d928403ee688e4ac08f5f6"+  }+]+|]++txHashesCBORExpected :: [TxHashCBOR]+txHashesCBORExpected =+  [ TxHashCBOR+      ( TxHash "6f044565223657acdde3c569d6555b2edbd71bc2bfb4df0b1cce0ef805f606d4"+      , TransactionCBOR "84a300d9010281825820787b3a89b1d32806968b867a4a31f1e33054b573821293a1c915559e34810a3602018282583900bd71b1547ab3ec95725100d0c0fb06da5ffae9cf54fb97e0f52fb9cab51adb784c4997143ba56990c0584111137d02898950245f5db5e2631a05f5e10082583900bd71b1547ab3ec95725100d0c0fb06da5ffae9cf54fb97e0f52fb9cab51adb784c4997143ba56990c0584111137d02898950245f5db5e2631b0000001588345487021a0002922da100818258206a7884092084c018eed71f9df5ff61935ab021f578b2d57d8ffb0b0e8ac0ea285840a2045496acf31996336ef187f9f3c2bd24c24995b540541586cbbc73a1550a50c2fdc3d4b99766c2823eb520866b03a38a60a4eb94f24994f441fb2852447c0ef5f6"+      )+  , TxHashCBOR+      ( TxHash "9b9ddb7ee8101e5a2638b5b79fe4dbafafcda56df12eebe2fd456e9862b848ea"+      , TransactionCBOR "84a300d90102818258207df720d99d8323830709439492876005ff752b94dafeb7bec529ab1679ec236901018282583900f2b425e12b7d90128fff6368c9c3cee21e29ae0273dda6f4c21c66f8364d4566878a66fab0bbc596dac020e3188cb58e40f7069e3c6652fa1a00e4e1c082583900c8cbbfc1db08891d2c2ec9f8df43c2904a61c0626c7e1a57627eb0753e9649b2a3596889c539a17e4d4cbefd9ed73a73d4d8f6089e02d1df1b00000004a6558a56021a0002922da10081825820844e231d37f9b76a2b02978d634ec7fa9fa7bc74a4ce3bc403e3091321a672405840c3cebb97014af06991be1a15fbc86adf71c2441dcbf3078edb11d9407306a13694f7ca5d8fc366bf28ea30fda713c2368e648ce7c87bd2981b43e4fecdd05403f5f6"+      )+  , TxHashCBOR+      ( TxHash "52aec9ace9b710bc2e662d4fe20e71c1bc3a0c0f3b8076f069af9713963d4559"+      , TransactionCBOR "84a300d9010281825820c8e9b710248220c28f5fbf6fb040b3a392707d19d0bfdaa5474c882d02b0c3ab0101828258390036e0cf1e52e05ef92e52c7bc2a04493d6bae481b8acbab12ec4300d7f9c9e87246d2f0373885896ad2804b7229673204cac9208345c1ea5b1a001e848082583900263bdbb58275ab6396c39a3188b6594bd5d46f54e08b6868c9fb3e498141d8651e0139b3bfc9c31f76d885431f83957329d75e0e53a65c2a1b000000730e797dda021a0002a2ada100d90102818258200909d10ce4850cd340b155d1dceae0bdcd77eba09524296ffe40f061dfc537c7584073a9efedf31dafc428605836d1ce2e2f62c1c6a9e733a5e538de034449b8ade504521e5fff96df5712487d214c83ac69babaa604bec9bc7a278f9f38b58ef70cf5f6"+      )+  , TxHashCBOR+      ( TxHash "b49ccb4ee194da2d97bfa5374509b2ed11a3b8265d346287928e6d25b82f48cb"+      , TransactionCBOR "84a300d9010281825820c5952d922ea00bbb4b6be104c647e6e7b8366c290db5173655f871243494d1001818018182581d60da0eb5ed7611482ec5089b69d870e0c56c1c45180256112398e0835b1b00000002540be400021a00030d40a100d90102818258206855ffb8cbde9163c55c2405f93a8cfa063a631d811281d954e16782123956a75840a4208e0e2236b7f04f77f47ba07f3ec40cbf567ddfd7c7562a451cd51b38f58936e233be2a1a4f202c704fc9963215cdfdde19970c7d05d928403ee688e4ac08f5f6"+      )   ]
test/Cardano/Pools.hs view
@@ -45,7 +45,7 @@   it "parses empty object pool metadata sample" $ do     eitherDecode "{}"     `shouldBe`-    Right (Nothing :: Maybe PoolMetadata)+    Right (PoolMetadataResponse Nothing)    it "parses pool relay sample" $ do     eitherDecode poolRelaySample