@@ -34,8 +34,10 @@ import (
3434 "github.com/lightninglabs/loop/swap"
3535 "github.com/lightninglabs/loop/swapserverrpc"
3636 "github.com/lightninglabs/taproot-assets/rfqmath"
37+ "github.com/lightningnetwork/lnd/input"
3738 "github.com/lightningnetwork/lnd/lnrpc/walletrpc"
3839 "github.com/lightningnetwork/lnd/lntypes"
40+ "github.com/lightningnetwork/lnd/lnwallet"
3941 "github.com/lightningnetwork/lnd/queue"
4042 "github.com/lightningnetwork/lnd/routing/route"
4143 "github.com/lightningnetwork/lnd/zpay32"
@@ -845,21 +847,30 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
845847 log .Infof ("Loop in quote request received" )
846848
847849 var (
848- numDeposits = uint32 (len (req .DepositOutpoints ))
849- err error
850+ selectedAmount = btcutil .Amount (req .Amt )
851+ selectedDepositAmount btcutil.Amount
852+ numDeposits = len (req .DepositOutpoints )
853+ err error
850854 )
851855
856+ if selectedAmount == 0 && numDeposits == 0 {
857+ return nil , fmt .Errorf ("amount and deposit outpoints " +
858+ "cannot both be zero" )
859+ }
860+
852861 htlcConfTarget , err := validateLoopInRequest (
853- req .ConfTarget , req .ExternalHtlc , numDeposits , req .Amt ,
862+ req .ConfTarget , req .ExternalHtlc , uint32 ( numDeposits ) , req .Amt ,
854863 )
855864 if err != nil {
856865 return nil , err
857866 }
858867
859868 // Retrieve deposits to calculate their total value.
860869 var depositList * looprpc.ListStaticAddressDepositsResponse
861- amount := btcutil .Amount (req .Amt )
862- if len (req .DepositOutpoints ) > 0 {
870+
871+ // If deposits are selected, we need to retrieve them to calculate the
872+ // total value which we request a quote for. If a
873+ if numDeposits > 0 {
863874 depositList , err = s .ListStaticAddressDeposits (
864875 ctx , & looprpc.ListStaticAddressDepositsRequest {
865876 Outpoints : req .DepositOutpoints ,
@@ -874,20 +885,34 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
874885 "deposit outpoints" )
875886 }
876887
877- // The requested amount should be 0 here if the request
878- // contained deposit outpoints.
879- if amount != 0 && len (depositList .FilteredDeposits ) > 0 {
880- return nil , fmt .Errorf ("amount should be 0 for " +
881- "deposit quotes" )
888+ if numDeposits != len (depositList .FilteredDeposits ) {
889+ return nil , fmt .Errorf ("expected %d deposits, got %d" ,
890+ numDeposits , len (depositList .FilteredDeposits ))
882891 }
883892
884893 // In case we quote for deposits we send the server both the
885- // total value and the number of deposits. This is so the server
886- // can probe the total amount and calculate the per input fee.
887- if amount == 0 && len (depositList .FilteredDeposits ) > 0 {
888- for _ , deposit := range depositList .FilteredDeposits {
889- amount += btcutil .Amount (deposit .Value )
890- }
894+ // selected value and the number of deposits. This is so the
895+ // server can probe the selected value and calculate the per
896+ // input fee.
897+ for _ , deposit := range depositList .FilteredDeposits {
898+ selectedDepositAmount += btcutil .Amount (
899+ deposit .Value ,
900+ )
901+ }
902+
903+ // If the selected amount would leave a dust change output or
904+ // exceeds the total deposits value, we return an error.
905+ dustLimit := lnwallet .DustLimitForSize (input .P2TRSize )
906+ if selectedDepositAmount - selectedAmount < dustLimit {
907+ return nil , fmt .Errorf ("selected amount %v leaves " +
908+ "dust or exceeds total deposit value %v" ,
909+ selectedAmount , selectedDepositAmount )
910+ }
911+
912+ // If the client didn't select an amount we quote for the total
913+ // deposits value.
914+ if selectedAmount == 0 {
915+ selectedAmount = selectedDepositAmount
891916 }
892917 }
893918
@@ -914,14 +939,14 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
914939 }
915940
916941 quote , err := s .impl .LoopInQuote (ctx , & loop.LoopInQuoteRequest {
917- Amount : amount ,
942+ Amount : selectedAmount ,
918943 HtlcConfTarget : htlcConfTarget ,
919944 ExternalHtlc : req .ExternalHtlc ,
920945 LastHop : lastHop ,
921946 RouteHints : routeHints ,
922947 Private : req .Private ,
923948 Initiator : defaultLoopdInitiator ,
924- NumDeposits : numDeposits ,
949+ NumDeposits : uint32 ( numDeposits ) ,
925950 })
926951 if err != nil {
927952 return nil , err
@@ -1764,6 +1789,7 @@ func (s *swapClientServer) StaticAddressLoopIn(ctx context.Context,
17641789 }
17651790
17661791 req := & loop.StaticAddressLoopInRequest {
1792+ SelectedAmount : btcutil .Amount (in .Amount ),
17671793 DepositOutpoints : in .Outpoints ,
17681794 MaxSwapFee : btcutil .Amount (in .MaxSwapFeeSatoshis ),
17691795 Label : in .Label ,
0 commit comments