diff --git a/contractcourt/briefcase.go b/contractcourt/briefcase.go index 2132da6de..11ab83390 100644 --- a/contractcourt/briefcase.go +++ b/contractcourt/briefcase.go @@ -10,9 +10,11 @@ import ( "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/fn" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/kvdb" "github.com/lightningnetwork/lnd/lnwallet" + "github.com/lightningnetwork/lnd/tlv" ) // ContractResolutions is a wrapper struct around the two forms of resolutions @@ -1554,6 +1556,12 @@ func encodeTaprootAuxData(w io.Writer, c *ContractResolutions) error { commitSignDesc := commitResolution.SelfOutputSignDesc //nolint:lll tapCase.CtrlBlocks.Val.CommitSweepCtrlBlock = commitSignDesc.ControlBlock + + c.CommitResolution.ResolutionBlob.WhenSome(func(b []byte) { + tapCase.CommitBlob = tlv.SomeRecordT( + tlv.NewPrimitiveRecord[tlv.TlvType2](b), + ) + }) } for _, htlc := range c.HtlcResolutions.IncomingHTLCs { @@ -1640,6 +1648,10 @@ func decodeTapRootAuxData(r io.Reader, c *ContractResolutions) error { if c.CommitResolution != nil { c.CommitResolution.SelfOutputSignDesc.ControlBlock = tapCase.CtrlBlocks.Val.CommitSweepCtrlBlock + + tapCase.CommitBlob.WhenSomeV(func(b []byte) { + c.CommitResolution.ResolutionBlob = fn.Some(b) + }) } for i := range c.HtlcResolutions.IncomingHTLCs { diff --git a/contractcourt/taproot_briefcase.go b/contractcourt/taproot_briefcase.go index 2057c0b01..016dee5e0 100644 --- a/contractcourt/taproot_briefcase.go +++ b/contractcourt/taproot_briefcase.go @@ -29,6 +29,11 @@ type taprootBriefcase struct { // are to be spent via a keyspend path. This includes anchors, and any // revocation paths. TapTweaks tlv.RecordT[tlv.TlvType1, tapTweaks] + + // CommitBlob is an optional record that contains an opaque blob that + // may be used to properly sweep commitment outputs on a force close + // transaction. + CommitBlob tlv.OptionalRecordT[tlv.TlvType2, tlv.Blob] } // TODO(roasbeef): morph into new tlv record @@ -47,6 +52,11 @@ func (t *taprootBriefcase) EncodeRecords() []tlv.Record { records := []tlv.Record{ t.CtrlBlocks.Record(), t.TapTweaks.Record(), } + + t.CommitBlob.WhenSome(func(r tlv.RecordT[tlv.TlvType2, tlv.Blob]) { + records = append(records, r.Record()) + }) + return records } @@ -69,16 +79,22 @@ func (t *taprootBriefcase) Encode(w io.Writer) error { // Decode decodes the given reader into the target struct. func (t *taprootBriefcase) Decode(r io.Reader) error { - stream, err := tlv.NewStream(t.DecodeRecords()...) + commitBlob := t.CommitBlob.Zero() + records := append(t.DecodeRecords(), commitBlob.Record()) + stream, err := tlv.NewStream(records...) if err != nil { return err } - _, err = stream.DecodeWithParsedTypes(r) + typeMap, err := stream.DecodeWithParsedTypes(r) if err != nil { return err } + if val, ok := typeMap[t.CommitBlob.TlvType()]; ok && val == nil { + t.CommitBlob = tlv.SomeRecordT(commitBlob) + } + return nil } diff --git a/contractcourt/taproot_briefcase_test.go b/contractcourt/taproot_briefcase_test.go index 1b0d0b399..66adc3c07 100644 --- a/contractcourt/taproot_briefcase_test.go +++ b/contractcourt/taproot_briefcase_test.go @@ -70,6 +70,10 @@ func TestTaprootBriefcase(t *testing.T) { _, err = rand.Read(anchorTweak[:]) require.NoError(t, err) + var commitBlob [100]byte + _, err = rand.Read(commitBlob[:]) + require.NoError(t, err) + testCase := &taprootBriefcase{ CtrlBlocks: tlv.NewRecordT[tlv.TlvType0](ctrlBlocks{ CommitSweepCtrlBlock: sweepCtrlBlock[:], @@ -83,6 +87,9 @@ func TestTaprootBriefcase(t *testing.T) { BreachedHtlcTweaks: randHtlcTweaks(t), BreachedSecondLevelHltcTweaks: randHtlcTweaks(t), }), + CommitBlob: tlv.SomeRecordT( + tlv.NewPrimitiveRecord[tlv.TlvType2](commitBlob[:]), + ), } var b bytes.Buffer