@@ -7,9 +7,12 @@ import (
77 "io"
88
99 "github.com/btcsuite/btcd/blockchain"
10+ "github.com/btcsuite/btcd/btcec/v2"
11+ "github.com/btcsuite/btcd/txscript"
1012 "github.com/btcsuite/btcd/wire"
1113 "github.com/lightninglabs/taproot-assets/asset"
1214 "github.com/lightninglabs/taproot-assets/commitment"
15+ "github.com/lightninglabs/taproot-assets/fn"
1316 "github.com/lightningnetwork/lnd/input"
1417 "github.com/lightningnetwork/lnd/tlv"
1518)
@@ -553,6 +556,45 @@ func (p *Proof) ToChainAsset() (asset.ChainAsset, error) {
553556 }, nil
554557}
555558
559+ // TaprootOutputScript derives the taproot output script and taproot key
560+ // anchoring this proof using its inclusion path.
561+ func (p * Proof ) TaprootOutputScript () ([]byte , * btcec.PublicKey , error ) {
562+ commitmentKeys , err := p .InclusionProof .DeriveByAssetInclusion (
563+ & p .Asset , fn .Ptr (false ),
564+ )
565+ if err != nil {
566+ return nil , nil , fmt .Errorf ("derive inclusion commitment: %w" ,
567+ err )
568+ }
569+
570+ tapCommitment , err := commitmentKeys .GetCommitment ()
571+ if err != nil {
572+ return nil , nil , fmt .Errorf ("get taproot commitment: %w" , err )
573+ }
574+
575+ siblingPreimage := p .InclusionProof .CommitmentProof .TapSiblingPreimage
576+ _ , sibling , err := commitment .MaybeEncodeTapscriptPreimage (
577+ siblingPreimage ,
578+ )
579+ if err != nil {
580+ return nil , nil , fmt .Errorf ("encode tapscript sibling: %w" , err )
581+ }
582+
583+ tapKey , err := deriveTaprootKeyFromTapCommitment (
584+ tapCommitment , sibling , p .InclusionProof .InternalKey ,
585+ )
586+ if err != nil {
587+ return nil , nil , fmt .Errorf ("derive taproot key: %w" , err )
588+ }
589+
590+ pkScript , err := txscript .PayToTaprootScript (tapKey )
591+ if err != nil {
592+ return nil , nil , fmt .Errorf ("derive taproot script: %w" , err )
593+ }
594+
595+ return pkScript , tapKey , nil
596+ }
597+
556598// Ensure Proof implements the tlv.RecordProducer interface.
557599var _ tlv.RecordProducer = (* Proof )(nil )
558600
0 commit comments