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  }