• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lightningnetwork / lnd / 12375116696

17 Dec 2024 02:29PM UTC coverage: 58.366% (-0.2%) from 58.595%
12375116696

Pull #8777

github

ziggie1984
docs: add release-notes
Pull Request #8777: multi: make deletion of edge atomic.

132 of 177 new or added lines in 6 files covered. (74.58%)

670 existing lines in 37 files now uncovered.

133926 of 229458 relevant lines covered (58.37%)

19223.6 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

40.96
/lnwallet/btcwallet/blockchain.go
1
package btcwallet
2

3
import (
4
        "encoding/hex"
5
        "errors"
6
        "fmt"
7

8
        "github.com/btcsuite/btcd/btcutil"
9
        "github.com/btcsuite/btcd/chaincfg/chainhash"
10
        "github.com/btcsuite/btcd/wire"
11
        "github.com/btcsuite/btcwallet/chain"
12
        "github.com/lightninglabs/neutrino"
13
        "github.com/lightninglabs/neutrino/headerfs"
14
        "github.com/lightningnetwork/lnd/lntypes"
15
        "github.com/lightningnetwork/lnd/lnwallet"
16
)
17

18
var (
19
        // ErrOutputSpent is returned by the GetUtxo method if the target output
20
        // for lookup has already been spent.
21
        ErrOutputSpent = errors.New("target output has been spent")
22

23
        // ErrOutputNotFound signals that the desired output could not be
24
        // located.
25
        ErrOutputNotFound = errors.New("target output was not found")
26
)
27

28
// GetBestBlock returns the current height and hash of the best known block
29
// within the main chain.
30
//
31
// This method is a part of the lnwallet.BlockChainIO interface.
32
func (b *BtcWallet) GetBestBlock() (*chainhash.Hash, int32, error) {
294✔
33
        return b.chain.GetBestBlock()
294✔
34
}
294✔
35

36
// GetUtxo returns the original output referenced by the passed outpoint that
37
// creates the target pkScript.
38
//
39
// This method is a part of the lnwallet.BlockChainIO interface.
40
func (b *BtcWallet) GetUtxo(op *wire.OutPoint, pkScript []byte,
41
        heightHint uint32, cancel <-chan struct{}) (*wire.TxOut, error) {
1✔
42

1✔
43
        switch backend := b.chain.(type) {
1✔
44

UNCOV
45
        case *chain.NeutrinoClient:
×
UNCOV
46
                spendReport, err := backend.CS.GetUtxo(
×
UNCOV
47
                        neutrino.WatchInputs(neutrino.InputWithScript{
×
UNCOV
48
                                OutPoint: *op,
×
UNCOV
49
                                PkScript: pkScript,
×
UNCOV
50
                        }),
×
UNCOV
51
                        neutrino.StartBlock(&headerfs.BlockStamp{
×
UNCOV
52
                                Height: int32(heightHint),
×
UNCOV
53
                        }),
×
UNCOV
54
                        neutrino.QuitChan(cancel),
×
UNCOV
55
                )
×
UNCOV
56
                if err != nil {
×
57
                        return nil, err
×
58
                }
×
59

60
                // If the spend report is nil, then the output was not found in
61
                // the rescan.
UNCOV
62
                if spendReport == nil {
×
63
                        return nil, ErrOutputNotFound
×
64
                }
×
65

66
                // If the spending transaction is populated in the spend report,
67
                // this signals that the output has already been spent.
UNCOV
68
                if spendReport.SpendingTx != nil {
×
69
                        return nil, ErrOutputSpent
×
70
                }
×
71

72
                // Otherwise, the output is assumed to be in the UTXO.
UNCOV
73
                return spendReport.Output, nil
×
74

UNCOV
75
        case *chain.RPCClient:
×
UNCOV
76
                txout, err := backend.GetTxOut(&op.Hash, op.Index, false)
×
UNCOV
77
                if err != nil {
×
78
                        return nil, err
×
UNCOV
79
                } else if txout == nil {
×
80
                        return nil, ErrOutputSpent
×
81
                }
×
82

UNCOV
83
                pkScript, err := hex.DecodeString(txout.ScriptPubKey.Hex)
×
UNCOV
84
                if err != nil {
×
85
                        return nil, err
×
86
                }
×
87

88
                // We'll ensure we properly convert the amount given in BTC to
89
                // satoshis.
UNCOV
90
                amt, err := btcutil.NewAmount(txout.Value)
×
UNCOV
91
                if err != nil {
×
92
                        return nil, err
×
93
                }
×
94

UNCOV
95
                return &wire.TxOut{
×
UNCOV
96
                        Value:    int64(amt),
×
UNCOV
97
                        PkScript: pkScript,
×
UNCOV
98
                }, nil
×
99

100
        case *chain.BitcoindClient:
1✔
101
                txout, err := backend.GetTxOut(&op.Hash, op.Index, false)
1✔
102
                if err != nil {
1✔
103
                        return nil, err
×
104
                } else if txout == nil {
1✔
105
                        return nil, ErrOutputSpent
×
106
                }
×
107

108
                pkScript, err := hex.DecodeString(txout.ScriptPubKey.Hex)
1✔
109
                if err != nil {
1✔
110
                        return nil, err
×
111
                }
×
112

113
                // Sadly, gettxout returns the output value in BTC instead of
114
                // satoshis.
115
                amt, err := btcutil.NewAmount(txout.Value)
1✔
116
                if err != nil {
1✔
117
                        return nil, err
×
118
                }
×
119

120
                return &wire.TxOut{
1✔
121
                        Value:    int64(amt),
1✔
122
                        PkScript: pkScript,
1✔
123
                }, nil
1✔
124

125
        default:
×
126
                return nil, fmt.Errorf("unknown backend")
×
127
        }
128
}
129

130
// GetBlock returns a raw block from the server given its hash. For the Neutrino
131
// implementation of the lnwallet.BlockChainIO interface, the Neutrino GetBlock
132
// method is called directly. For other implementations, the block cache is used
133
// to wrap the call to GetBlock.
134
//
135
// This method is a part of the lnwallet.BlockChainIO interface.
136
func (b *BtcWallet) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) {
5✔
137
        _, ok := b.chain.(*chain.NeutrinoClient)
5✔
138
        if !ok {
9✔
139
                return b.blockCache.GetBlock(blockHash, b.chain.GetBlock)
4✔
140
        }
4✔
141

142
        // For the neutrino implementation of lnwallet.BlockChainIO the neutrino
143
        // GetBlock function can be called directly since it uses the same block
144
        // cache. However, it does not lock the block cache mutex for the given
145
        // block hash and so that is done here.
146
        b.blockCache.HashMutex.Lock(lntypes.Hash(*blockHash))
1✔
147
        defer b.blockCache.HashMutex.Unlock(lntypes.Hash(*blockHash))
1✔
148

1✔
149
        return b.chain.GetBlock(blockHash)
1✔
150
}
151

152
// GetBlockHeader returns a block header for the block with the given hash.
153
//
154
// This method is a part of the lnwallet.BlockChainIO interface.
155
func (b *BtcWallet) GetBlockHeader(
156
        blockHash *chainhash.Hash) (*wire.BlockHeader, error) {
1✔
157

1✔
158
        return b.chain.GetBlockHeader(blockHash)
1✔
159
}
1✔
160

161
// GetBlockHash returns the hash of the block in the best blockchain at the
162
// given height.
163
//
164
// This method is a part of the lnwallet.BlockChainIO interface.
165
func (b *BtcWallet) GetBlockHash(blockHeight int64) (*chainhash.Hash, error) {
1✔
166
        return b.chain.GetBlockHash(blockHeight)
1✔
167
}
1✔
168

169
// A compile time check to ensure that BtcWallet implements the BlockChainIO
170
// interface.
171
var _ lnwallet.WalletController = (*BtcWallet)(nil)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc