From 790af9a5979bed87baeb4da3922d0186074dce48 Mon Sep 17 00:00:00 2001 From: Dzmitry Shuiski Date: Thu, 30 Oct 2025 12:50:03 +0100 Subject: [PATCH 1/3] Add utxosAtWithPageLimit --- src/Blockfrost/Service.purs | 17 +++++++++++++---- src/BlockfrostProvider.purs | 3 ++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Blockfrost/Service.purs b/src/Blockfrost/Service.purs index 84f5e8a..75d14bf 100644 --- a/src/Blockfrost/Service.purs +++ b/src/Blockfrost/Service.purs @@ -57,6 +57,7 @@ module Cardano.Blockfrost.Service , runBlockfrostServiceTestM , submitTx , utxosAt + , utxosAtWithPageLimit ) where import Prelude @@ -490,9 +491,16 @@ handle404AsMempty = map (fromMaybe mempty) <<< handle404AsNothing -------------------------------------------------------------------------------- utxosAt :: Address -> BlockfrostServiceM (Either ClientError UtxoMap) -utxosAt address = runExceptT $ - ExceptT (utxosAtAddressOnPage 1) - >>= (ExceptT <<< resolveBlockfrostUtxosAtAddress) +utxosAt = utxosAtWithPageLimit { maxPages: Nothing } + +utxosAtWithPageLimit + :: { maxPages :: Maybe Int } + -> Address + -> BlockfrostServiceM (Either ClientError UtxoMap) +utxosAtWithPageLimit { maxPages } address = + runExceptT do + ExceptT (utxosAtAddressOnPage 1) + >>= (ExceptT <<< resolveBlockfrostUtxosAtAddress) where utxosAtAddressOnPage :: Int -> BlockfrostServiceM (Either ClientError BlockfrostUtxosAtAddress) @@ -502,7 +510,8 @@ utxosAt address = runExceptT $ utxos <- ExceptT $ blockfrostGetRequest (UtxosAtAddress address page maxNumResultsOnPage) <#> handle404AsMempty <<< handleBlockfrostResponse - case Array.length (unwrap utxos) < maxNumResultsOnPage of + let pageLimitReached = maybe false (page >= _) maxPages + case (Array.length (unwrap utxos) < maxNumResultsOnPage) || pageLimitReached of true -> pure utxos false -> append utxos <$> ExceptT (utxosAtAddressOnPage $ page + 1) diff --git a/src/BlockfrostProvider.purs b/src/BlockfrostProvider.purs index 1134930..a5dd99e 100644 --- a/src/BlockfrostProvider.purs +++ b/src/BlockfrostProvider.purs @@ -59,8 +59,9 @@ import Cardano.Blockfrost.Service , runBlockfrostServiceTestM , submitTx , utxosAt + , utxosAtWithPageLimit ) as X import Cardano.Blockfrost.BlockfrostProtocolParameters ( BlockfrostProtocolParameters(BlockfrostProtocolParameters) ) as X -import Cardano.Blockfrost.Provider (providerForBlockfrostBackend) as X \ No newline at end of file +import Cardano.Blockfrost.Provider (providerForBlockfrostBackend) as X From 971ef0723a74cc916a665338c5fd26b77e80aac6 Mon Sep 17 00:00:00 2001 From: Dzmitry Shuiski Date: Thu, 30 Oct 2025 13:17:16 +0100 Subject: [PATCH 2/3] utxosAtWithPageLimit: return empty map for non-positive maxPages --- src/Blockfrost/Service.purs | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/Blockfrost/Service.purs b/src/Blockfrost/Service.purs index 75d14bf..611c007 100644 --- a/src/Blockfrost/Service.purs +++ b/src/Blockfrost/Service.purs @@ -497,23 +497,25 @@ utxosAtWithPageLimit :: { maxPages :: Maybe Int } -> Address -> BlockfrostServiceM (Either ClientError UtxoMap) -utxosAtWithPageLimit { maxPages } address = - runExceptT do - ExceptT (utxosAtAddressOnPage 1) - >>= (ExceptT <<< resolveBlockfrostUtxosAtAddress) - where - utxosAtAddressOnPage - :: Int -> BlockfrostServiceM (Either ClientError BlockfrostUtxosAtAddress) - utxosAtAddressOnPage page = runExceptT do - -- Maximum number of results per page supported by Blockfrost: - let maxNumResultsOnPage = 100 - utxos <- ExceptT $ - blockfrostGetRequest (UtxosAtAddress address page maxNumResultsOnPage) - <#> handle404AsMempty <<< handleBlockfrostResponse - let pageLimitReached = maybe false (page >= _) maxPages - case (Array.length (unwrap utxos) < maxNumResultsOnPage) || pageLimitReached of - true -> pure utxos - false -> append utxos <$> ExceptT (utxosAtAddressOnPage $ page + 1) +utxosAtWithPageLimit { maxPages } address + | maybe false (_ <= 0) maxPages = pure $ Right Map.empty + | otherwise = + runExceptT do + ExceptT (utxosAtAddressOnPage 1) + >>= (ExceptT <<< resolveBlockfrostUtxosAtAddress) + where + utxosAtAddressOnPage + :: Int -> BlockfrostServiceM (Either ClientError BlockfrostUtxosAtAddress) + utxosAtAddressOnPage page = runExceptT do + -- Maximum number of results per page supported by Blockfrost: + let maxNumResultsOnPage = 100 + utxos <- ExceptT $ + blockfrostGetRequest (UtxosAtAddress address page maxNumResultsOnPage) + <#> handle404AsMempty <<< handleBlockfrostResponse + let pageLimitReached = maybe false (page >= _) maxPages + case (Array.length (unwrap utxos) < maxNumResultsOnPage) || pageLimitReached of + true -> pure utxos + false -> append utxos <$> ExceptT (utxosAtAddressOnPage $ page + 1) getUtxoByOref :: TransactionInput From 79cbe86980f7602bb7446198601c723e073bfb0e Mon Sep 17 00:00:00 2001 From: Dzmitry Shuiski Date: Mon, 10 Nov 2025 17:37:44 +0100 Subject: [PATCH 3/3] Update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9a34b8..0ade945 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and we follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +# v2.2.0 + +## Added + +- `utxosAtWithPageLimit` query, which allows setting an upper limit on the number of pages requested ([#4](https://github.com/mlabs-haskell/purescript-cardano-blockfrost-provider/pull/4)) + # v2.1.0 ## Changed