github.com/mit-dci/lit@v0.0.0-20221102210550-8c3d3b49f2ce/qln/break.go (about) 1 package qln 2 3 import ( 4 "fmt" 5 6 "github.com/mit-dci/lit/logging" 7 8 "github.com/mit-dci/lit/lnutil" 9 ) 10 11 // ------------------------- break 12 func (nd *LitNode) BreakChannel(q *Qchan) error { 13 14 if nd.SubWallet[q.Coin()] == nil { 15 return fmt.Errorf("Not connected to coin type %d\n", q.Coin()) 16 } 17 18 err := nd.ReloadQchanState(q) 19 if err != nil { 20 return err 21 } 22 23 if q.CloseData.Closed { 24 if q.CloseData.CloseHeight != 0 { 25 return fmt.Errorf("Can't break channel %d with peer %d, already closed\n", q.Idx(), q.Peer()) 26 } 27 return fmt.Errorf("Can't break channel %d with peer %d, tx already broadcast, wait for confirmation.\n", q.Idx(), q.Peer()) 28 } 29 30 logging.Infof("breaking (%d,%d)\n", q.Peer(), q.Idx()) 31 32 // set delta to 0... needed for break 33 q.State.Delta = 0 34 35 for i, h := range q.State.HTLCs { 36 if !h.Cleared && h.Clearing { 37 q.State.HTLCs[i].Clearing = false 38 } 39 } 40 41 q.State.InProgHTLC = nil 42 q.State.CollidingHTLC = nil 43 44 tx, err := nd.SignBreakTx(q) 45 if err != nil { 46 return err 47 } 48 49 // broadcast break tx 50 err = nd.SubWallet[q.Coin()].PushTx(tx) 51 if err != nil { 52 return fmt.Errorf("Error while transmitting break tx, try again!") 53 } 54 55 // save channel state only after tx is broadcast 56 err = nd.SaveQchanUtxoData(q) 57 if err != nil { 58 return err 59 } 60 // set channel state to closed 61 nd.RemoteMtx.Lock() 62 q.CloseData.Closed = true 63 nd.RemoteMtx.Unlock() 64 q.CloseData.CloseTxid = tx.TxHash() 65 return nil 66 } 67 68 func (nd *LitNode) PrintBreakTxForDebugging(q *Qchan) error { 69 logging.Info("===== BUILDING Break TX for state [%d]:", q.State.StateIdx) 70 saveDelta := q.State.Delta 71 q.State.Delta = 0 72 tx, err := nd.SignBreakTx(q) 73 q.State.Delta = saveDelta 74 if err != nil { 75 return err 76 } 77 logging.Info("===== DONE BUILDING Break TX for state [%d]:", q.State.StateIdx) 78 logging.Info("Break TX for state [%d]:", q.State.StateIdx) 79 lnutil.PrintTx(tx) 80 return nil 81 }