/ intercepted_forward.go
intercepted_forward.go
 1  package lnd
 2  
 3  import (
 4  	"errors"
 5  
 6  	"github.com/lightningnetwork/lnd/fn/v2"
 7  	"github.com/lightningnetwork/lnd/htlcswitch"
 8  	"github.com/lightningnetwork/lnd/lntypes"
 9  	"github.com/lightningnetwork/lnd/lnwire"
10  )
11  
12  var (
13  	// ErrCannotResume is returned when an intercepted forward cannot be
14  	// resumed. This is the case in the on-chain resolution flow.
15  	ErrCannotResume = errors.New("cannot resume in the on-chain flow")
16  
17  	// ErrCannotFail is returned when an intercepted forward cannot be failed.
18  	// This is the case in the on-chain resolution flow.
19  	ErrCannotFail = errors.New("cannot fail in the on-chain flow")
20  
21  	// ErrPreimageMismatch is returned when the preimage that is specified to
22  	// settle an htlc doesn't match the htlc hash.
23  	ErrPreimageMismatch = errors.New("preimage does not match hash")
24  )
25  
26  // interceptedForward implements the on-chain behavior for the resolution of
27  // a forwarded htlc.
28  type interceptedForward struct {
29  	packet *htlcswitch.InterceptedPacket
30  	beacon *preimageBeacon
31  }
32  
33  func newInterceptedForward(
34  	packet *htlcswitch.InterceptedPacket,
35  	beacon *preimageBeacon) *interceptedForward {
36  
37  	return &interceptedForward{
38  		beacon: beacon,
39  		packet: packet,
40  	}
41  }
42  
43  // Packet returns the intercepted htlc packet.
44  func (f *interceptedForward) Packet() htlcswitch.InterceptedPacket {
45  	return *f.packet
46  }
47  
48  // Resume notifies the intention to resume an existing hold forward. This
49  // basically means the caller wants to resume with the default behavior for this
50  // htlc which usually means forward it.
51  func (f *interceptedForward) Resume() error {
52  	return ErrCannotResume
53  }
54  
55  // ResumeModified notifies the intention to resume an existing hold forward with
56  // a modified htlc.
57  func (f *interceptedForward) ResumeModified(_, _ fn.Option[lnwire.MilliSatoshi],
58  	_ fn.Option[lnwire.CustomRecords]) error {
59  
60  	return ErrCannotResume
61  }
62  
63  // Fail notifies the intention to fail an existing hold forward with an
64  // encrypted failure reason.
65  func (f *interceptedForward) Fail(_ []byte) error {
66  	// We can't actively fail an htlc. The best we could do is abandon the
67  	// resolver, but this wouldn't be a safe operation. There may be a race
68  	// with the preimage beacon supplying a preimage. Therefore we don't
69  	// attempt to fail and just return an error here.
70  	return ErrCannotFail
71  }
72  
73  // FailWithCode notifies the intention to fail an existing hold forward with the
74  // specified failure code.
75  func (f *interceptedForward) FailWithCode(_ lnwire.FailCode) error {
76  	return ErrCannotFail
77  }
78  
79  // Settle notifies the intention to settle an existing hold forward with a given
80  // preimage.
81  func (f *interceptedForward) Settle(preimage lntypes.Preimage) error {
82  	if !preimage.Matches(f.packet.Hash) {
83  		return ErrPreimageMismatch
84  	}
85  
86  	// Add preimage to the preimage beacon. The onchain resolver will pick
87  	// up the preimage from the beacon.
88  	return f.beacon.AddPreimages(preimage)
89  }