66 "fmt"
77 "math"
88 "net/url"
9+ "slices"
910 "sync"
1011 "sync/atomic"
1112
@@ -327,12 +328,14 @@ func (a *AuxSweeper) createSweepVpackets(sweepInputs []*cmsg.AssetOutput,
327328// signSweepVpackets attempts to sign the vPackets specified using the passed
328329// sign desc and script tree.
329330func (a * AuxSweeper ) signSweepVpackets (vPackets []* tappsbt.VPacket ,
330- signDesc input.SignDescriptor , tapscriptDesc tapscriptSweepDesc ) error {
331+ signDesc input.SignDescriptor , tapTweak , ctrlBlock []byte ,
332+ auxSigDesc lfn.Option [lnwallet.AuxSigDesc ],
333+ secondLevelSigIndex lfn.Option [uint32 ]) error {
331334
332335 // Before we sign below, we also need to generate the tapscript With
333336 // the vPackets prepared, we can now sign the output asset we'll create
334337 // at a later step.
335- for _ , vPacket := range vPackets {
338+ for vPktIndex , vPacket := range vPackets {
336339 if len (vPacket .Inputs ) != 1 {
337340 return fmt .Errorf ("expected single input, got %v" ,
338341 len (vPacket .Inputs ))
@@ -348,12 +351,12 @@ func (a *AuxSweeper) signSweepVpackets(vPackets []*tappsbt.VPacket,
348351 // signature.
349352 signingKey , leafToSign := applySignDescToVIn (
350353 signDesc , vIn , & a .cfg .ChainParams ,
351- tapscriptDesc . scriptTree . TapTweak () ,
354+ tapTweak ,
352355 )
353356
354357 // In this case, the witness isn't special, so we'll set the
355358 // control block now for it.
356- ctrlBlock := tapscriptDesc . ctrlBlockBytes
359+ ctrlBlock := ctrlBlock
357360 vIn .TaprootLeafScript [0 ].ControlBlock = ctrlBlock
358361
359362 log .Debugf ("signing vPacket for input=%v" ,
@@ -378,6 +381,52 @@ func (a *AuxSweeper) signSweepVpackets(vPackets []*tappsbt.VPacket,
378381 return fmt .Errorf ("error signing virtual packet, " +
379382 "got no sig" )
380383 }
384+
385+ // At this point, the witness looks like: <sig> <witnessScript>
386+ // <ctrlBlock>. This is a second level transaction, so we have
387+ // another signature that we need to add to the witness this
388+ // additional signature for the multi-sig.
389+ err = lfn .MapOptionZ (
390+ auxSigDesc ,
391+ func (aux lnwallet.AuxSigDesc ) error {
392+ assetSigs , err := cmsg .DecodeAssetSigListRecord (
393+ aux .AuxSig ,
394+ )
395+ if err != nil {
396+ return fmt .Errorf ("error " +
397+ "decoding asset sig list " +
398+ "record: %w" , err )
399+ }
400+ auxSig := assetSigs .Sigs [vPktIndex ]
401+
402+ // With the sig obtained, we'll now insert the
403+ // signature at the specified index.
404+ sigIndex , err := secondLevelSigIndex .UnwrapOrErr (
405+ fmt .Errorf ("no sig index" ),
406+ )
407+ if err != nil {
408+ return err
409+ }
410+
411+ auxSigBytes := append (
412+ auxSig .Sig .Val .RawBytes (),
413+ byte (auxSig .SigHashType .Val ),
414+ )
415+
416+ newAsset := vPacket .Outputs [0 ].Asset
417+
418+ prevWitness := newAsset .PrevWitnesses [0 ].TxWitness
419+ prevWitness = slices .Insert (
420+ prevWitness , int (sigIndex ), auxSigBytes ,
421+ )
422+ newAsset .UpdateTxWitness (0 , prevWitness )
423+
424+ return nil
425+ },
426+ )
427+ if err != nil {
428+ return err
429+ }
381430 }
382431
383432 return nil
@@ -400,7 +449,10 @@ func (a *AuxSweeper) createAndSignSweepVpackets(
400449 signPkts := func (vPkts []* tappsbt.VPacket ,
401450 desc tapscriptSweepDesc ) lfn.Result [[]* tappsbt.VPacket ] {
402451
403- err := a .signSweepVpackets (vPkts , resReq .SignDesc , desc )
452+ err := a .signSweepVpackets (
453+ vPkts , resReq .SignDesc , nil , nil ,
454+ lfn .None [lnwallet.AuxSigDesc ](), lfn .None [uint32 ](),
455+ )
404456 if err != nil {
405457 return lfn.Err [returnType ](err )
406458 }
0 commit comments