@@ -506,6 +506,29 @@ func (s *Client) resumeSwaps(ctx context.Context,
506506func (s * Client ) LoopOut (globalCtx context.Context ,
507507 request * OutRequest ) (* LoopOutSwapInfo , error ) {
508508
509+ if request .AssetId != nil {
510+ rfq , err := s .assetClient .GetRfqForAsset (
511+ globalCtx , request .AssetAmount , request .AssetId ,
512+ request .AssetEdgeNode ,
513+ )
514+ if err != nil {
515+ return nil , err
516+ }
517+
518+ satAmt , err := assets .GetSatAmtFromRfq (
519+ request .AssetAmount , rfq .BidAssetRate ,
520+ )
521+ if err != nil {
522+ return nil , err
523+ }
524+
525+ log .Infof ("LoopOut %v to %v (channels: %v) with asset %x" ,
526+ satAmt , request .DestAddr , request .OutgoingChanSet ,
527+ request .AssetId ,
528+ )
529+ request .Amount = satAmt
530+ }
531+
509532 log .Infof ("LoopOut %v to %v (channels: %v)" ,
510533 request .Amount , request .DestAddr , request .OutgoingChanSet ,
511534 )
@@ -530,6 +553,13 @@ func (s *Client) LoopOut(globalCtx context.Context,
530553
531554 // Create a new swap object for this swap.
532555 swapCfg := newSwapConfig (s .lndServices , s .Store , s .Server , s .assetClient )
556+
557+ // Verify that if we have an asset id set, we have a valid asset client
558+ // to use.
559+ if request .AssetId != nil && s .assetClient == nil {
560+ return nil , errors .New ("asset id set but no asset client provided" )
561+ }
562+
533563 initResult , err := newLoopOutSwap (
534564 globalCtx , swapCfg , initiationHeight , request ,
535565 )
@@ -579,11 +609,31 @@ func (s *Client) LoopOutQuote(ctx context.Context,
579609 return nil , err
580610 }
581611
582- if request .Amount < terms .MinSwapAmount {
612+ satAmount := request .Amount
613+ // If we use an Asset we'll rfq to check if the sat amount meets the
614+ // min swap amount criteria.
615+ if request .AssetId != nil {
616+ rfq , err := s .assetClient .GetRfqForAsset (
617+ ctx , request .Amount , request .AssetId ,
618+ request .PeerPubkey ,
619+ )
620+ if err != nil {
621+ return nil , err
622+ }
623+
624+ satAmount , err = assets .GetSatAmtFromRfq (
625+ request .Amount , rfq .BidAssetRate ,
626+ )
627+ if err != nil {
628+ return nil , err
629+ }
630+ }
631+
632+ if satAmount < terms .MinSwapAmount {
583633 return nil , ErrSwapAmountTooLow
584634 }
585635
586- if request . Amount > terms .MaxSwapAmount {
636+ if satAmount > terms .MaxSwapAmount {
587637 return nil , ErrSwapAmountTooHigh
588638 }
589639
@@ -594,7 +644,7 @@ func (s *Client) LoopOutQuote(ctx context.Context,
594644 }
595645
596646 quote , err := s .Server .GetLoopOutQuote (
597- ctx , request . Amount , expiry , request .SwapPublicationDeadline ,
647+ ctx , satAmount , expiry , request .SwapPublicationDeadline ,
598648 request .Initiator ,
599649 )
600650 if err != nil {
@@ -613,6 +663,7 @@ func (s *Client) LoopOutQuote(ctx context.Context,
613663 MinerFee : minerFee ,
614664 PrepayAmount : quote .PrepayAmount ,
615665 SwapPaymentDest : quote .SwapPaymentDest ,
666+ InvoiceAmtSat : satAmount ,
616667 }, nil
617668}
618669
0 commit comments