diff --git a/chainntnfs/bitcoindnotify/bitcoind.go b/chainntnfs/bitcoindnotify/bitcoind.go index 8be208b6..5eb3ff98 100644 --- a/chainntnfs/bitcoindnotify/bitcoind.go +++ b/chainntnfs/bitcoindnotify/bitcoind.go @@ -527,7 +527,12 @@ func (b *BitcoindNotifier) RegisterSpendNtfn(outpoint *wire.OutPoint, } } - if transaction != nil { + // We'll only request a rescan if the transaction has actually + // been included within a block. Otherwise, we'll encounter an + // error when scanning for blocks. This can happens in the case + // of a race condition, wherein the output itself is unspent, + // and only arrives in the mempool after the getxout call. + if transaction != nil && transaction.BlockHash != "" { blockhash, err := chainhash.NewHashFromStr(transaction.BlockHash) if err != nil { return nil, err diff --git a/chainntnfs/btcdnotify/btcd.go b/chainntnfs/btcdnotify/btcd.go index cdc2f816..a5ff7ec5 100644 --- a/chainntnfs/btcdnotify/btcd.go +++ b/chainntnfs/btcdnotify/btcd.go @@ -547,7 +547,12 @@ func (b *BtcdNotifier) RegisterSpendNtfn(outpoint *wire.OutPoint, } } - if transaction != nil { + // We'll only request a rescan if the transaction has actually + // been included within a block. Otherwise, we'll encounter an + // error when scanning for blocks. This can happens in the case + // of a race condition, wherein the output itself is unspent, + // and only arrives in the mempool after the getxout call. + if transaction != nil && transaction.BlockHash != "" { blockhash, err := chainhash.NewHashFromStr(transaction.BlockHash) if err != nil { return nil, err