diff --git a/chainntnfs/bitcoindnotify/bitcoind.go b/chainntnfs/bitcoindnotify/bitcoind.go index 8e65bb32a..2139e1f6d 100644 --- a/chainntnfs/bitcoindnotify/bitcoind.go +++ b/chainntnfs/bitcoindnotify/bitcoind.go @@ -331,6 +331,14 @@ out: // handleRelevantTx notifies any clients of a relevant transaction. func (b *BitcoindNotifier) handleRelevantTx(tx chain.RelevantTx, bestHeight int32) { msgTx := tx.TxRecord.MsgTx + + // We only care about notifying on confirmed spends, so in case this is + // a mempool spend, we can continue, and wait for the spend to appear + // in chain. + if tx.Block == nil { + return + } + // First, check if this transaction spends an output // that has an existing spend notification for it. for i, txIn := range msgTx.TxIn { @@ -349,55 +357,22 @@ func (b *BitcoindNotifier) handleRelevantTx(tx chain.RelevantTx, bestHeight int3 SpendingTx: &msgTx, SpenderInputIndex: uint32(i), } - // TODO(roasbeef): after change to - // loadfilter, only notify on block - // inclusion? + spendDetails.SpendingHeight = tx.Block.Height - confirmedSpend := false - if tx.Block != nil { - confirmedSpend = true - spendDetails.SpendingHeight = tx.Block.Height - } else { - spendDetails.SpendingHeight = bestHeight + 1 - } - - // Keep spendNotifications that are - // waiting for a confirmation around. - // They will be notified when we find - // the spend within a block. - rem := make(map[uint64]*spendNotification) - for c, ntfn := range clients { - // If this is a mempool spend, store the client - // to wait for a confirmed spend. - if !confirmedSpend { - rem[c] = ntfn - continue - } - - confStr := "unconfirmed" - if confirmedSpend { - confStr = "confirmed" - } - - chainntnfs.Log.Infof("Dispatching %s "+ - "spend notification for "+ - "outpoint=%v at height %v", - confStr, ntfn.targetOutpoint, + for _, ntfn := range clients { + chainntnfs.Log.Infof("Dispatching confirmed "+ + "spend notification for outpoint=%v "+ + "at height %v", ntfn.targetOutpoint, spendDetails.SpendingHeight) ntfn.spendChan <- spendDetails - // Close spendChan to ensure that any calls to Cancel will not - // block. This is safe to do since the channel is buffered, and the + // Close spendChan to ensure that any calls to + // Cancel will not block. This is safe to do + // since the channel is buffered, and the // message can still be read by the receiver. close(ntfn.spendChan) } delete(b.spendNotifications, prevOut) - - // If we had any clients left, add them - // back to the map. - if len(rem) > 0 { - b.spendNotifications[prevOut] = rem - } } } }