diff --git a/lnwallet/chanvalidate/validate.go b/lnwallet/chanvalidate/validate.go index c349ea974..5cf5bbf10 100644 --- a/lnwallet/chanvalidate/validate.go +++ b/lnwallet/chanvalidate/validate.go @@ -186,10 +186,14 @@ func Validate(ctx *Context) (*wire.OutPoint, error) { // If we reach this point, then all other checks have succeeded, so // we'll now attempt a full Script VM execution to ensure that we're // able to close the channel using this initial state. + prevFetcher := txscript.NewCannedPrevOutputFetcher( + ctx.MultiSigPkScript, fundingValue, + ) + commitTx := ctx.CommitCtx.FullySignedCommitTx + hashCache := txscript.NewTxSigHashes(commitTx, prevFetcher) vm, err := txscript.NewEngine( - ctx.MultiSigPkScript, ctx.CommitCtx.FullySignedCommitTx, - 0, txscript.StandardVerifyFlags, nil, nil, fundingValue, - txscript.NewCannedPrevOutputFetcher(ctx.MultiSigPkScript, 0), + ctx.MultiSigPkScript, commitTx, 0, txscript.StandardVerifyFlags, + nil, hashCache, fundingValue, prevFetcher, ) if err != nil { return nil, err diff --git a/lnwallet/wallet.go b/lnwallet/wallet.go index 318a851a5..74f24c826 100644 --- a/lnwallet/wallet.go +++ b/lnwallet/wallet.go @@ -2433,26 +2433,43 @@ func (l *LightningWallet) ValidateChannel(channelState *channeldb.OpenChannel, if err != nil { return err } - signedCommitTx, err := channel.getSignedCommitTx() - if err != nil { - return err - } + + localKey := channelState.LocalChanCfg.MultiSigKey.PubKey + remoteKey := channelState.RemoteChanCfg.MultiSigKey.PubKey // We'll also need the multi-sig witness script itself so the // chanvalidate package can check it for correctness against the // funding transaction, and also commitment validity. - localKey := channelState.LocalChanCfg.MultiSigKey.PubKey - remoteKey := channelState.RemoteChanCfg.MultiSigKey.PubKey - witnessScript, err := input.GenMultiSigScript( - localKey.SerializeCompressed(), - remoteKey.SerializeCompressed(), - ) + var fundingScript []byte + if channelState.ChanType.IsTaproot() { + fundingScript, _, err = input.GenTaprootFundingScript( + localKey, remoteKey, int64(channel.Capacity), + ) + if err != nil { + return err + } + + } else { + witnessScript, err := input.GenMultiSigScript( + localKey.SerializeCompressed(), + remoteKey.SerializeCompressed(), + ) + if err != nil { + return err + } + fundingScript, err = input.WitnessScriptHash(witnessScript) + if err != nil { + return err + } + } + + signedCommitTx, err := channel.getSignedCommitTx() if err != nil { return err } - pkScript, err := input.WitnessScriptHash(witnessScript) - if err != nil { - return err + commitCtx := &chanvalidate.CommitmentContext{ + Value: channel.Capacity, + FullySignedCommitTx: signedCommitTx, } // Finally, we'll pass in all the necessary context needed to fully @@ -2462,12 +2479,9 @@ func (l *LightningWallet) ValidateChannel(channelState *channeldb.OpenChannel, Locator: &chanvalidate.OutPointChanLocator{ ChanPoint: channelState.FundingOutpoint, }, - MultiSigPkScript: pkScript, + MultiSigPkScript: fundingScript, FundingTx: fundingTx, - CommitCtx: &chanvalidate.CommitmentContext{ - Value: channel.Capacity, - FullySignedCommitTx: signedCommitTx, - }, + CommitCtx: commitCtx, }) if err != nil { return err