44 "context"
55 "crypto/rand"
66 "crypto/sha256"
7+ "encoding/json"
78 "errors"
89 "fmt"
910 "math"
@@ -355,6 +356,10 @@ func (s *loopOutSwap) sendUpdate(ctx context.Context) error {
355356 info .OutgoingChanSet = outgoingChanSet
356357 }
357358
359+ if s .isAssetSwap () {
360+ info .AssetSwapInfo = s .AssetSwapInfo
361+ }
362+
358363 select {
359364 case s .statusChan <- * info :
360365 case <- ctx .Done ():
@@ -436,7 +441,7 @@ func (s *loopOutSwap) executeAndFinalize(globalCtx context.Context) error {
436441 case result := <- s .swapPaymentChan :
437442 s .swapPaymentChan = nil
438443
439- err := s .handlePaymentResult (result , true )
444+ err := s .handlePaymentResult (globalCtx , result , true )
440445 if err != nil {
441446 return err
442447 }
@@ -452,7 +457,7 @@ func (s *loopOutSwap) executeAndFinalize(globalCtx context.Context) error {
452457 case result := <- s .prePaymentChan :
453458 s .prePaymentChan = nil
454459
455- err := s .handlePaymentResult (result , false )
460+ err := s .handlePaymentResult (globalCtx , result , false )
456461 if err != nil {
457462 return err
458463 }
@@ -485,8 +490,8 @@ func (s *loopOutSwap) executeAndFinalize(globalCtx context.Context) error {
485490// handlePaymentResult processes the result of a payment attempt. If the
486491// payment was successful and this is the main swap payment, the cost of the
487492// swap is updated.
488- func (s * loopOutSwap ) handlePaymentResult (result paymentResult ,
489- swapPayment bool ) error {
493+ func (s * loopOutSwap ) handlePaymentResult (ctx context. Context ,
494+ result paymentResult , swapPayment bool ) error {
490495
491496 switch {
492497 // If our result has a non-nil error, our status will be nil. In this
@@ -513,6 +518,17 @@ func (s *loopOutSwap) handlePaymentResult(result paymentResult,
513518 // the swap payment and the prepay.
514519 s .cost .Offchain += result .status .Fee .ToSatoshis ()
515520
521+ // If this is an asset payment, we'll write the asset amounts
522+ // to the swap.
523+ if s .isAssetSwap () {
524+ err := s .fillAssetOffchainPaymentResult (
525+ ctx , result , swapPayment ,
526+ )
527+ if err != nil {
528+ return err
529+ }
530+ }
531+
516532 return nil
517533
518534 case result .status .State == lnrpc .Payment_FAILED :
@@ -1035,7 +1051,7 @@ func (s *loopOutSwap) waitForConfirmedHtlc(globalCtx context.Context) (
10351051 case result := <- s .swapPaymentChan :
10361052 s .swapPaymentChan = nil
10371053
1038- err := s .handlePaymentResult (result , true )
1054+ err := s .handlePaymentResult (ctx , result , true )
10391055 if err != nil {
10401056 return nil , err
10411057 }
@@ -1057,7 +1073,7 @@ func (s *loopOutSwap) waitForConfirmedHtlc(globalCtx context.Context) (
10571073 case result := <- s .prePaymentChan :
10581074 s .prePaymentChan = nil
10591075
1060- err := s .handlePaymentResult (result , false )
1076+ err := s .handlePaymentResult (ctx , result , false )
10611077 if err != nil {
10621078 return nil , err
10631079 }
@@ -1458,6 +1474,34 @@ func (s *loopOutSwap) canSweep() bool {
14581474 return true
14591475}
14601476
1477+ func (s * loopOutSwap ) fillAssetOffchainPaymentResult (ctx context.Context ,
1478+ result paymentResult , isSwapPayment bool ) error {
1479+
1480+ if len (result .status .Htlcs ) == 0 {
1481+ return fmt .Errorf ("no htlcs in payment result" )
1482+ }
1483+
1484+ // We only expect one htlc in the result.
1485+ htlc := result .status .Htlcs [0 ]
1486+
1487+ var assetData rfqmsg.JsonHtlc
1488+
1489+ err := json .Unmarshal (htlc .Route .CustomChannelData , & assetData )
1490+ if err != nil {
1491+ return err
1492+ }
1493+
1494+ assetSendAmt := assetData .Balances [0 ].Amount
1495+ if isSwapPayment {
1496+ s .AssetSwapInfo .SwapPaidAmt = assetSendAmt
1497+ log .Debugf ("Asset off-chain payment success: %v" , assetSendAmt )
1498+ } else {
1499+ s .AssetSwapInfo .PrepayPaidAmt = assetSendAmt
1500+ }
1501+
1502+ return s .store .UpdateLoopOutAssetInfo (ctx , s .hash , s .AssetSwapInfo )
1503+ }
1504+
14611505// isAssetSwap returns true if the swap is an asset swap.
14621506func (s * loopOutSwap ) isAssetSwap () bool {
14631507 return s .AssetSwapInfo != nil
0 commit comments