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

lightningnetwork / lnd / 11170835610

03 Oct 2024 10:41PM UTC coverage: 49.188% (-9.6%) from 58.738%
11170835610

push

github

web-flow
Merge pull request #9154 from ziggie1984/master

multi: bump btcd version.

3 of 6 new or added lines in 6 files covered. (50.0%)

26110 existing lines in 428 files now uncovered.

97359 of 197934 relevant lines covered (49.19%)

1.04 hits per line

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

75.0
/watchtower/blob/type.go
1
package blob
2

3
import (
4
        "fmt"
5
        "strings"
6

7
        "github.com/lightningnetwork/lnd/channeldb"
8
)
9

10
// Flag represents a specify option that can be present in a Type.
11
type Flag uint16
12

13
const (
14
        // FlagReward signals that the justice transaction should contain an
15
        // additional output for itself. Signatures sent by the client should
16
        // include the reward script negotiated during session creation. Without
17
        // the flag, there is only one output sweeping clients funds back to
18
        // them solely.
19
        FlagReward Flag = 1
20

21
        // FlagCommitOutputs signals that the blob contains the information
22
        // required to sweep commitment outputs.
23
        FlagCommitOutputs Flag = 1 << 1
24

25
        // FlagAnchorChannel signals that this blob is meant to spend an anchor
26
        // channel, and therefore must expect a P2WSH-style to-remote output if
27
        // one exists.
28
        FlagAnchorChannel Flag = 1 << 2
29

30
        // FlagTaprootChannel signals that this blob is meant to spend a
31
        // taproot channel and therefore must expect P2TR outputs.
32
        FlagTaprootChannel Flag = 1 << 3
33
)
34

35
// Type returns a Type consisting solely of this flag enabled.
UNCOV
36
func (f Flag) Type() Type {
×
UNCOV
37
        return Type(f)
×
UNCOV
38
}
×
39

40
// String returns the name of the flag.
41
func (f Flag) String() string {
2✔
42
        switch f {
2✔
43
        case FlagReward:
2✔
44
                return "FlagReward"
2✔
45
        case FlagCommitOutputs:
2✔
46
                return "FlagCommitOutputs"
2✔
47
        case FlagAnchorChannel:
2✔
48
                return "FlagAnchorChannel"
2✔
49
        case FlagTaprootChannel:
2✔
50
                return "FlagTaprootChannel"
2✔
UNCOV
51
        default:
×
UNCOV
52
                return "FlagUnknown"
×
53
        }
54
}
55

56
// Type is a bit vector composed of Flags that govern various aspects of
57
// reconstructing the justice transaction from an encrypted blob. The flags can
58
// be used to signal behaviors such as which inputs are being swept, which
59
// outputs should be added to the justice transaction, or modify serialization
60
// of the blob itself.
61
type Type uint16
62

63
const (
64
        // TypeAltruistCommit sweeps only commitment outputs to a sweep address
65
        // controlled by the user, and does not give the tower a reward.
66
        TypeAltruistCommit = Type(FlagCommitOutputs)
67

68
        // TypeAltruistAnchorCommit sweeps only commitment outputs from an
69
        // anchor commitment to a sweep address controlled by the user, and does
70
        // not give the tower a reward.
71
        TypeAltruistAnchorCommit = Type(FlagCommitOutputs | FlagAnchorChannel)
72

73
        // TypeRewardCommit sweeps only commitment outputs to a sweep address
74
        // controlled by the user, and pays a negotiated reward to the tower.
75
        TypeRewardCommit = Type(FlagCommitOutputs | FlagReward)
76

77
        // TypeAltruistTaprootCommit sweeps only the commitment outputs from a
78
        // taproot channel commitment to a sweep address controlled by the user,
79
        // and does not give the tower a reward.
80
        TypeAltruistTaprootCommit = Type(FlagCommitOutputs | FlagTaprootChannel)
81
)
82

83
// TypeFromChannel returns the appropriate blob Type for the given channel
84
// type.
85
func TypeFromChannel(chanType channeldb.ChannelType) Type {
2✔
86
        switch {
2✔
87
        case chanType.IsTaproot():
2✔
88
                return TypeAltruistTaprootCommit
2✔
89
        case chanType.HasAnchors():
2✔
90
                return TypeAltruistAnchorCommit
2✔
91
        default:
2✔
92
                return TypeAltruistCommit
2✔
93
        }
94
}
95

96
// Identifier returns a unique, stable string identifier for the blob Type.
97
func (t Type) Identifier() (string, error) {
2✔
98
        switch t {
2✔
99
        case TypeAltruistCommit:
2✔
100
                return "legacy", nil
2✔
101
        case TypeAltruistAnchorCommit:
2✔
102
                return "anchor", nil
2✔
103
        case TypeRewardCommit:
×
104
                return "reward", nil
×
105
        case TypeAltruistTaprootCommit:
2✔
106
                return "taproot", nil
2✔
107
        default:
×
108
                return "", fmt.Errorf("unknown blob type: %v", t)
×
109
        }
110
}
111

112
// CommitmentType returns the appropriate CommitmentType for the given blob Type
113
// and channel type.
114
func (t Type) CommitmentType(chanType *channeldb.ChannelType) (CommitmentType,
115
        error) {
2✔
116

2✔
117
        switch {
2✔
118
        case t.Has(FlagTaprootChannel):
2✔
119
                return TaprootCommitment, nil
2✔
120

121
        case t.Has(FlagAnchorChannel):
2✔
122
                return AnchorCommitment, nil
2✔
123

124
        case t.Has(FlagCommitOutputs):
2✔
125
                if chanType != nil && chanType.IsTweakless() {
4✔
126
                        return LegacyTweaklessCommitment, nil
2✔
127
                }
2✔
128

129
                return LegacyCommitment, nil
2✔
130

UNCOV
131
        default:
×
UNCOV
132
                return 0, ErrUnknownBlobType
×
133
        }
134
}
135

136
// Has returns true if the Type has the passed flag enabled.
137
func (t Type) Has(flag Flag) bool {
2✔
138
        return Flag(t)&flag == flag
2✔
139
}
2✔
140

141
// TypeFromFlags creates a single Type from an arbitrary list of flags.
UNCOV
142
func TypeFromFlags(flags ...Flag) Type {
×
UNCOV
143
        var typ Type
×
UNCOV
144
        for _, flag := range flags {
×
UNCOV
145
                typ |= Type(flag)
×
UNCOV
146
        }
×
147

UNCOV
148
        return typ
×
149
}
150

151
// IsAnchorChannel returns true if the blob type is for an anchor channel.
152
func (t Type) IsAnchorChannel() bool {
2✔
153
        return t.Has(FlagAnchorChannel)
2✔
154
}
2✔
155

156
// IsTaprootChannel returns true if the blob type is for a taproot channel.
157
func (t Type) IsTaprootChannel() bool {
2✔
158
        return t.Has(FlagTaprootChannel)
2✔
159
}
2✔
160

161
// knownFlags maps the supported flags to their name.
162
var knownFlags = map[Flag]struct{}{
163
        FlagReward:         {},
164
        FlagCommitOutputs:  {},
165
        FlagAnchorChannel:  {},
166
        FlagTaprootChannel: {},
167
}
168

169
// String returns a human-readable description of a Type.
170
func (t Type) String() string {
2✔
171
        var (
2✔
172
                hrPieces        []string
2✔
173
                hasUnknownFlags bool
2✔
174
        )
2✔
175

2✔
176
        // Iterate through the possible flags from highest to lowest. This will
2✔
177
        // ensure that the human readable names will be in the same order as the
2✔
178
        // bits (left to right) if the type were to be printed in big-endian
2✔
179
        // byte order.
2✔
180
        for f := Flag(1 << 15); f != 0; f >>= 1 {
4✔
181
                // If this flag is known, we'll add a human-readable name or its
2✔
182
                // inverse depending on whether the type has this flag set.
2✔
183
                if _, ok := knownFlags[f]; ok {
4✔
184
                        if t.Has(f) {
4✔
185
                                hrPieces = append(hrPieces, f.String())
2✔
186
                        } else {
4✔
187
                                hrPieces = append(hrPieces, "No-"+f.String())
2✔
188
                        }
2✔
189
                } else {
2✔
190
                        // Make note of any unknown flags that this type has
2✔
191
                        // set. If any are present, we'll prepend the bit-wise
2✔
192
                        // representation of the type in the final string.
2✔
193
                        if t.Has(f) {
2✔
UNCOV
194
                                hasUnknownFlags = true
×
UNCOV
195
                        }
×
196
                }
197
        }
198

199
        // If there were no unknown flags, we'll simply return the list of human
200
        // readable pieces.
201
        if !hasUnknownFlags {
4✔
202
                return fmt.Sprintf("[%s]", strings.Join(hrPieces, "|"))
2✔
203
        }
2✔
204

205
        // Otherwise, we'll prepend the bit-wise representation to the human
206
        // readable names.
UNCOV
207
        return fmt.Sprintf("%016b[%s]", t, strings.Join(hrPieces, "|"))
×
208
}
209

210
// supportedTypes is the set of all configurations known to be supported by the
211
// package.
212
var supportedTypes = map[Type]struct{}{
213
        TypeAltruistCommit:        {},
214
        TypeRewardCommit:          {},
215
        TypeAltruistAnchorCommit:  {},
216
        TypeAltruistTaprootCommit: {},
217
}
218

219
// IsSupportedType returns true if the given type is supported by the package.
220
func IsSupportedType(blobType Type) bool {
2✔
221
        _, ok := supportedTypes[blobType]
2✔
222
        return ok
2✔
223
}
2✔
224

225
// SupportedTypes returns a list of all supported blob types.
UNCOV
226
func SupportedTypes() []Type {
×
UNCOV
227
        supported := make([]Type, 0, len(supportedTypes))
×
UNCOV
228
        for t := range supportedTypes {
×
UNCOV
229
                supported = append(supported, t)
×
UNCOV
230
        }
×
UNCOV
231
        return supported
×
232
}
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