chainntnfs+sweep: add LookupInputMempoolSpend and use it in the
sweeper This commit implements a new method, `LookupInputMempoolSpend` to do lookups in the mempool. This method is useful in the case when we only want to know whether an input is already been spent in the mempool by the time we call.
This commit is contained in:
6 files changed
+107
-111
No files matched your search
@@ -15,6 +15,7 @@ import (
|
||||
"github.com/btcsuite/btcwallet/chain"
|
||||
"github.com/lightningnetwork/lnd/blockcache"
|
||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||
"github.com/lightningnetwork/lnd/fn"
|
||||
"github.com/lightningnetwork/lnd/queue"
|
||||
)
|
||||
|
||||
@@ -1070,3 +1071,26 @@ func (b *BitcoindNotifier) CancelMempoolSpendEvent(
|
||||
|
||||
b.memNotifier.UnsubscribeEvent(sub)
|
||||
}
|
||||
|
||||
// LookupInputMempoolSpend takes an outpoint and queries the mempool to find
|
||||
// its spending tx. Returns the tx if found, otherwise fn.None.
|
||||
//
|
||||
// NOTE: part of the MempoolWatcher interface.
|
||||
func (b *BitcoindNotifier) LookupInputMempoolSpend(
|
||||
op wire.OutPoint) fn.Option[wire.MsgTx] {
|
||||
|
||||
// Find the spending txid.
|
||||
txid, found := b.chainConn.LookupInputMempoolSpend(op)
|
||||
if !found {
|
||||
return fn.None[wire.MsgTx]()
|
||||
}
|
||||
|
||||
// Query the spending tx using the id.
|
||||
tx, err := b.chainConn.GetRawTransaction(&txid)
|
||||
if err != nil {
|
||||
// TODO(yy): enable logging errors in this package.
|
||||
return fn.None[wire.MsgTx]()
|
||||
}
|
||||
|
||||
return fn.Some(*tx.MsgTx().Copy())
|
||||
}
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/btcsuite/btcwallet/chain"
|
||||
"github.com/lightningnetwork/lnd/blockcache"
|
||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||
"github.com/lightningnetwork/lnd/fn"
|
||||
"github.com/lightningnetwork/lnd/queue"
|
||||
)
|
||||
|
||||
@@ -1137,3 +1138,26 @@ func (b *BtcdNotifier) CancelMempoolSpendEvent(
|
||||
|
||||
b.memNotifier.UnsubscribeEvent(sub)
|
||||
}
|
||||
|
||||
// LookupInputMempoolSpend takes an outpoint and queries the mempool to find
|
||||
// its spending tx. Returns the tx if found, otherwise fn.None.
|
||||
//
|
||||
// NOTE: part of the MempoolWatcher interface.
|
||||
func (b *BtcdNotifier) LookupInputMempoolSpend(
|
||||
op wire.OutPoint) fn.Option[wire.MsgTx] {
|
||||
|
||||
// Find the spending txid.
|
||||
txid, found := b.chainConn.LookupInputMempoolSpend(op)
|
||||
if !found {
|
||||
return fn.None[wire.MsgTx]()
|
||||
}
|
||||
|
||||
// Query the spending tx using the id.
|
||||
tx, err := b.chainConn.GetRawTransaction(&txid)
|
||||
if err != nil {
|
||||
// TODO(yy): enable logging errors in this package.
|
||||
return fn.None[wire.MsgTx]()
|
||||
}
|
||||
|
||||
return fn.Some(*tx.MsgTx().Copy())
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"github.com/btcsuite/btcd/btcutil"
|
||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
"github.com/lightningnetwork/lnd/fn"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -849,4 +850,9 @@ type MempoolWatcher interface {
|
||||
// CancelMempoolSpendEvent allows the caller to cancel a subscription to
|
||||
// watch for a spend of an outpoint in the mempool.
|
||||
CancelMempoolSpendEvent(sub *MempoolSpendEvent)
|
||||
|
||||
// LookupInputMempoolSpend looks up the mempool to find a spending tx
|
||||
// which spends the given outpoint. A fn.None is returned if it's not
|
||||
// found.
|
||||
LookupInputMempoolSpend(op wire.OutPoint) fn.Option[wire.MsgTx]
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package chainntnfs
|
||||
|
||||
import (
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
"github.com/lightningnetwork/lnd/fn"
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
@@ -39,3 +40,13 @@ func (m *MockMempoolWatcher) CancelMempoolSpendEvent(
|
||||
|
||||
m.Called(sub)
|
||||
}
|
||||
|
||||
// LookupInputMempoolSpend looks up the mempool to find a spending tx which
|
||||
// spends the given outpoint.
|
||||
func (m *MockMempoolWatcher) LookupInputMempoolSpend(
|
||||
op wire.OutPoint) fn.Option[wire.MsgTx] {
|
||||
|
||||
args := m.Called(op)
|
||||
|
||||
return args.Get(0).(fn.Option[wire.MsgTx])
|
||||
}
|
||||
Reference in new issue
Block a user