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 +8/−0
- blockfrost-api.cabal +1/−1
- src/Blockfrost/API/Cardano/Blocks.hs +20/−0
- src/Blockfrost/API/Cardano/Pools.hs +1/−1
- src/Blockfrost/Types/Cardano/Blocks.hs +29/−0
- src/Blockfrost/Types/Cardano/Pools.hs +18/−12
- test/Cardano/Blocks.hs +48/−1
- test/Cardano/Pools.hs +1/−1
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