diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,10 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html)
 
+## 0.58.0
+### Fixed
+- Correct output freeing algorithm.
+
 ## 0.57.0
 ### Changed
 - Report errors freeing outputs.
diff --git a/haskoin-store.cabal b/haskoin-store.cabal
--- a/haskoin-store.cabal
+++ b/haskoin-store.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           haskoin-store
-version:        0.57.0
+version:        0.58.0
 synopsis:       Storage and index for Bitcoin and Bitcoin Cash
 description:    Please see the README on GitHub at <https://github.com/haskoin/haskoin-store#readme>
 category:       Bitcoin, Finance, Network
diff --git a/src/Haskoin/Store/Logic.hs b/src/Haskoin/Store/Logic.hs
--- a/src/Haskoin/Store/Logic.hs
+++ b/src/Haskoin/Store/Logic.hs
@@ -397,19 +397,11 @@
 freeOutputs memonly rbfcheck tx = do
     let prevs = prevOuts tx
     unspents <- mapM getUnspent prevs
-    let spents = map fst $ filter (isNothing . snd) $ zip prevs unspents
-    spndrs <- mapM (\s -> getSpender s >>= spender s) spents
+    let spents = [ p | (p, Nothing) <- zip prevs unspents ]
+    spndrs <- catMaybes <$> mapM getSpender spents
     let txids = HashSet.fromList $ filter (/= txHash tx) $ map spenderHash spndrs
     del <- fmap concat $ mapM (deleteTx memonly rbfcheck) $ HashSet.toList txids
     return $ HashSet.fromList del
-  where
-    spender s Nothing = do
-      $(logErrorS) "BlockStore" $
-          "Spender not found for output " <>
-          txHashToHex (outPointHash s) <> ":" <>
-          cs (show (outPointIndex s))
-      throwError SpenderNotFound
-    spender _ (Just s) = return s
 
 deleteConfirmedTx :: MonadImport m => TxHash -> m [TxHash]
 deleteConfirmedTx = deleteTx False False
