From 53bd5421671864eefc569875e81fe4e8e4874a05 Mon Sep 17 00:00:00 2001 From: Louis Singer <41042567+louisinger@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:50:10 +0100 Subject: [PATCH] Fix checking lifetime in client (#93) * handle vtxo lifetime in noah send command, ask for comfirmation * remove confirm question in noah send --- noah/common.go | 43 +++++++++++++++++++++++++++++++++++++-- noah/unilateral_redeem.go | 29 +++++--------------------- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/noah/common.go b/noah/common.go index d347b17..3e1615b 100644 --- a/noah/common.go +++ b/noah/common.go @@ -400,18 +400,23 @@ func handleRoundStream( return "", err } + _, seconds, err := findSweepClosure(congestionTree) + if err != nil { + return "", err + } + // validate the congestion tree if err := tree.ValidateCongestionTree( congestionTree, poolPartialTx, aspPublicKey, - 1209344, // ~ 2 weeks + int64(seconds), ); err != nil { return "", err } // validate the receivers - sweepLeaf, err := tree.SweepScript(aspPublicKey, 1209344) + sweepLeaf, err := tree.SweepScript(aspPublicKey, seconds) if err != nil { return "", err } @@ -621,3 +626,37 @@ func decodeReceiverAddress(addr string) ( return true, outputScript, nil, nil } + +func findSweepClosure( + congestionTree tree.CongestionTree, +) (sweepClosure *taproot.TapElementsLeaf, seconds uint, err error) { + root, err := congestionTree.Root() + if err != nil { + return + } + + // find the sweep closure + tx, err := psetv2.NewPsetFromBase64(root.Tx) + if err != nil { + return + } + + for _, tapLeaf := range tx.Inputs[0].TapLeafScript { + isSweep, _, lifetime, err := tree.DecodeSweepScript(tapLeaf.Script) + if err != nil { + continue + } + + if isSweep { + seconds = lifetime + sweepClosure = &tapLeaf.TapElementsLeaf + break + } + } + + if sweepClosure == nil { + return nil, 0, fmt.Errorf("sweep closure not found") + } + + return +} diff --git a/noah/unilateral_redeem.go b/noah/unilateral_redeem.go index 4733b28..6d338af 100644 --- a/noah/unilateral_redeem.go +++ b/noah/unilateral_redeem.go @@ -28,35 +28,16 @@ type redeemBranch struct { } func newRedeemBranch(ctx *cli.Context, congestionTree tree.CongestionTree, vtxo vtxo) (RedeemBranch, error) { + sweepClosure, _, err := findSweepClosure(congestionTree) + if err != nil { + return nil, err + } + nodes, err := congestionTree.Branch(vtxo.txid) if err != nil { return nil, err } - // find the sweep closure - tx, err := psetv2.NewPsetFromBase64(nodes[0].Tx) - if err != nil { - return nil, err - } - - var sweepClosure *taproot.TapElementsLeaf - - for _, tapLeaf := range tx.Inputs[0].TapLeafScript { - isSweep, _, _, err := tree.DecodeSweepScript(tapLeaf.Script) - if err != nil { - continue - } - - if isSweep { - sweepClosure = &tapLeaf.TapElementsLeaf - break - } - } - - if sweepClosure == nil { - return nil, fmt.Errorf("sweep closure not found") - } - branch := make([]*psetv2.Pset, 0, len(nodes)) for _, node := range nodes { pset, err := psetv2.NewPsetFromBase64(node.Tx)