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 :
@@ -1033,7 +1049,7 @@ func (s *loopOutSwap) waitForConfirmedHtlc(globalCtx context.Context) (
10331049 case result := <- s .swapPaymentChan :
10341050 s .swapPaymentChan = nil
10351051
1036- err := s .handlePaymentResult (result , true )
1052+ err := s .handlePaymentResult (ctx , result , true )
10371053 if err != nil {
10381054 return nil , err
10391055 }
@@ -1055,7 +1071,7 @@ func (s *loopOutSwap) waitForConfirmedHtlc(globalCtx context.Context) (
10551071 case result := <- s .prePaymentChan :
10561072 s .prePaymentChan = nil
10571073
1058- err := s .handlePaymentResult (result , false )
1074+ err := s .handlePaymentResult (ctx , result , false )
10591075 if err != nil {
10601076 return nil , err
10611077 }
@@ -1456,6 +1472,34 @@ func (s *loopOutSwap) canSweep() bool {
14561472 return true
14571473}
14581474
1475+ func (s * loopOutSwap ) fillAssetOffchainPaymentResult (ctx context.Context ,
1476+ result paymentResult , isSwapPayment bool ) error {
1477+
1478+ if len (result .status .Htlcs ) == 0 {
1479+ return fmt .Errorf ("no htlcs in payment result" )
1480+ }
1481+
1482+ // We only expect one htlc in the result.
1483+ htlc := result .status .Htlcs [0 ]
1484+
1485+ var assetData rfqmsg.JsonHtlc
1486+
1487+ err := json .Unmarshal (htlc .Route .CustomChannelData , & assetData )
1488+ if err != nil {
1489+ return err
1490+ }
1491+
1492+ assetSendAmt := btcutil .Amount (assetData .Balances [0 ].Amount )
1493+ if isSwapPayment {
1494+ s .AssetSwapInfo .SwapPaidAmt = assetSendAmt
1495+ log .Debugf ("Asset off-chain payment success: %v" , assetSendAmt )
1496+ } else {
1497+ s .AssetSwapInfo .PrepayPaidAmt = assetSendAmt
1498+ }
1499+
1500+ return s .store .UpdateLoopOutAssetInfo (ctx , s .hash , s .AssetSwapInfo )
1501+ }
1502+
14591503// isAssetSwap returns true if the swap is an asset swap.
14601504func (s * loopOutSwap ) isAssetSwap () bool {
14611505 return s .AssetSwapInfo != nil
0 commit comments