diff --git a/haskoin-store.cabal b/haskoin-store.cabal
--- a/haskoin-store.cabal
+++ b/haskoin-store.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: b1a8d34c8b0abb61f5882a9454a5c93e684db97d46d01e20eb7bc24cfc02c188
+-- hash: 2634f3871c33f6dba54c93ffab3a2f2f1f8ff5eb9bc8559216a0367cc2c421f6
 
 name:           haskoin-store
-version:        0.38.0
+version:        0.38.1
 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
@@ -53,7 +53,7 @@
     , hashable >=1.3.0.0
     , haskoin-core >=0.13.6
     , haskoin-node >=0.14.1
-    , haskoin-store-data ==0.38.0
+    , haskoin-store-data ==0.38.1
     , hedis >=0.12.13
     , http-types >=0.12.3
     , monad-logger >=0.3.32
@@ -96,7 +96,7 @@
     , haskoin-core >=0.13.6
     , haskoin-node >=0.14.1
     , haskoin-store
-    , haskoin-store-data ==0.38.0
+    , haskoin-store-data ==0.38.1
     , monad-logger >=0.3.32
     , mtl >=2.2.2
     , nqe >=0.6.1
@@ -135,8 +135,8 @@
     , hashable >=1.3.0.0
     , haskoin-core >=0.13.6
     , haskoin-node >=0.14.1
-    , haskoin-store ==0.38.0
-    , haskoin-store-data ==0.38.0
+    , haskoin-store ==0.38.1
+    , haskoin-store-data ==0.38.1
     , hedis >=0.12.13
     , hspec >=2.7.1
     , http-types >=0.12.3
diff --git a/src/Haskoin/Store/Web.hs b/src/Haskoin/Store/Web.hs
--- a/src/Haskoin/Store/Web.hs
+++ b/src/Haskoin/Store/Web.hs
@@ -15,7 +15,8 @@
     , runWeb
     ) where
 
-import           Conduit                       ()
+import           Conduit                       (await, runConduit, takeC, yield,
+                                                (.|))
 import           Control.Applicative           ((<|>))
 import           Control.Monad                 (forever, unless, when, (<=<))
 import           Control.Monad.Logger          (MonadLoggerIO, logErrorS,
@@ -35,6 +36,7 @@
 import           Data.Char                     (isSpace)
 import           Data.Default                  (Default (..))
 import           Data.Function                 ((&))
+import qualified Data.HashSet                  as HashSet
 import           Data.List                     (nub)
 import           Data.Maybe                    (catMaybes, fromMaybe,
                                                 listToMaybe, mapMaybe)
@@ -656,39 +658,38 @@
     GenericResult <$> cbAfterHeight (fromIntegral height) txid
 
 -- | Check if any of the ancestors of this transaction is a coinbase after the
--- specified height. Returns'Nothing' if answer cannot be computed before
+-- specified height. Returns 'Nothing' if answer cannot be computed before
 -- hitting limits.
 cbAfterHeight ::
        (MonadIO m, StoreReadBase m)
     => H.BlockHeight
     -> TxHash
     -> m (Maybe Bool)
-cbAfterHeight height begin =
-    go (10000 :: Int) [begin] -- Depth first search
+cbAfterHeight height txid =
+    inputs 10000 HashSet.empty HashSet.empty [txid]
   where
-    go 0 _ = return Nothing -- We searched too far. Return Nothing.
-    go _ [] = return $ Just False -- Nothing left to search.
-    go i (txid:xs) =
-        getTransaction txid >>= \case
-            Nothing -> return Nothing -- Error. Bail out.
-            Just tx
-                | cbCheck tx -> return $ Just True -- Stop everything. Return.
-                | heightCheck tx -> go i xs -- Continue search sideways
-                | otherwise -> do
-                    let is = outPointHash . inputPoint <$> transactionInputs tx
-                    -- We have to search down and search sideways
-                    go (i - 1) is `returnOr` go i xs
-    cbCheck tx =
-        any isCoinbase (transactionInputs tx) &&
-        blockRefHeight (transactionBlock tx) > height
-    heightCheck tx =
+    inputs 0 _ _ [] = return Nothing
+    inputs i is ns [] =
+        let is' = HashSet.union is ns
+            ns' = HashSet.empty
+            ts = HashSet.toList (HashSet.difference ns is)
+        in case ts of
+               [] -> return (Just False)
+               _ -> inputs i is' ns' ts
+    inputs i is ns (t:ts) = getTransaction t >>= \case
+        Nothing -> return Nothing
+        Just tx | height_check tx ->
+                      if cb_check tx
+                      then return (Just True)
+                      else let ns' = HashSet.union (ins tx) ns
+                          in inputs (i - 1) is ns' ts
+                | otherwise -> inputs (i - 1) is ns ts
+    cb_check = any isCoinbase . transactionInputs
+    ins = HashSet.fromList . map (outPointHash . inputPoint) . transactionInputs
+    height_check tx =
         case transactionBlock tx of
-            BlockRef thisHeight _ -> thisHeight <= height
-            _                     -> False
-    returnOr a b =
-        a >>= \case
-            Just True -> return $ Just True -- Bubble up this result
-            _ -> b
+            BlockRef h _ -> h > height
+            _            -> True
 
 -- POST Transaction --
 
