@@ -34,8 +34,10 @@ import (
34
34
"github.com/lightninglabs/loop/swap"
35
35
"github.com/lightninglabs/loop/swapserverrpc"
36
36
"github.com/lightninglabs/taproot-assets/rfqmath"
37
+ "github.com/lightningnetwork/lnd/input"
37
38
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
38
39
"github.com/lightningnetwork/lnd/lntypes"
40
+ "github.com/lightningnetwork/lnd/lnwallet"
39
41
"github.com/lightningnetwork/lnd/queue"
40
42
"github.com/lightningnetwork/lnd/routing/route"
41
43
"github.com/lightningnetwork/lnd/zpay32"
@@ -843,21 +845,30 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
843
845
log .Infof ("Loop in quote request received" )
844
846
845
847
var (
846
- numDeposits = uint32 (len (req .DepositOutpoints ))
847
- err error
848
+ selectedAmount = btcutil .Amount (req .Amt )
849
+ selectedDepositAmount btcutil.Amount
850
+ numDeposits = len (req .DepositOutpoints )
851
+ err error
848
852
)
849
853
854
+ if selectedAmount == 0 && numDeposits == 0 {
855
+ return nil , fmt .Errorf ("amount and deposit outpoints " +
856
+ "cannot both be zero" )
857
+ }
858
+
850
859
htlcConfTarget , err := validateLoopInRequest (
851
- req .ConfTarget , req .ExternalHtlc , numDeposits , req .Amt ,
860
+ req .ConfTarget , req .ExternalHtlc , uint32 ( numDeposits ) , req .Amt ,
852
861
)
853
862
if err != nil {
854
863
return nil , err
855
864
}
856
865
857
866
// Retrieve deposits to calculate their total value.
858
867
var depositList * looprpc.ListStaticAddressDepositsResponse
859
- amount := btcutil .Amount (req .Amt )
860
- if len (req .DepositOutpoints ) > 0 {
868
+
869
+ // If deposits are selected, we need to retrieve them to calculate the
870
+ // total value which we request a quote for. If a
871
+ if numDeposits > 0 {
861
872
depositList , err = s .ListStaticAddressDeposits (
862
873
ctx , & looprpc.ListStaticAddressDepositsRequest {
863
874
Outpoints : req .DepositOutpoints ,
@@ -872,20 +883,34 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
872
883
"deposit outpoints" )
873
884
}
874
885
875
- // The requested amount should be 0 here if the request
876
- // contained deposit outpoints.
877
- if amount != 0 && len (depositList .FilteredDeposits ) > 0 {
878
- return nil , fmt .Errorf ("amount should be 0 for " +
879
- "deposit quotes" )
886
+ if numDeposits != len (depositList .FilteredDeposits ) {
887
+ return nil , fmt .Errorf ("expected %d deposits, got %d" ,
888
+ numDeposits , len (depositList .FilteredDeposits ))
880
889
}
881
890
882
891
// In case we quote for deposits we send the server both the
883
- // total value and the number of deposits. This is so the server
884
- // can probe the total amount and calculate the per input fee.
885
- if amount == 0 && len (depositList .FilteredDeposits ) > 0 {
886
- for _ , deposit := range depositList .FilteredDeposits {
887
- amount += btcutil .Amount (deposit .Value )
888
- }
892
+ // selected value and the number of deposits. This is so the
893
+ // server can probe the selected value and calculate the per
894
+ // input fee.
895
+ for _ , deposit := range depositList .FilteredDeposits {
896
+ selectedDepositAmount += btcutil .Amount (
897
+ deposit .Value ,
898
+ )
899
+ }
900
+
901
+ // If the selected amount would leave a dust change output or
902
+ // exceeds the total deposits value, we return an error.
903
+ dustLimit := lnwallet .DustLimitForSize (input .P2TRSize )
904
+ if selectedDepositAmount - selectedAmount < dustLimit {
905
+ return nil , fmt .Errorf ("selected amount %v leaves " +
906
+ "dust or exceeds total deposit value %v" ,
907
+ selectedAmount , selectedDepositAmount )
908
+ }
909
+
910
+ // If the client didn't select an amount we quote for the total
911
+ // deposits value.
912
+ if selectedAmount == 0 {
913
+ selectedAmount = selectedDepositAmount
889
914
}
890
915
}
891
916
@@ -912,14 +937,14 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
912
937
}
913
938
914
939
quote , err := s .impl .LoopInQuote (ctx , & loop.LoopInQuoteRequest {
915
- Amount : amount ,
940
+ Amount : selectedAmount ,
916
941
HtlcConfTarget : htlcConfTarget ,
917
942
ExternalHtlc : req .ExternalHtlc ,
918
943
LastHop : lastHop ,
919
944
RouteHints : routeHints ,
920
945
Private : req .Private ,
921
946
Initiator : defaultLoopdInitiator ,
922
- NumDeposits : numDeposits ,
947
+ NumDeposits : uint32 ( numDeposits ) ,
923
948
})
924
949
if err != nil {
925
950
return nil , err
@@ -1762,6 +1787,7 @@ func (s *swapClientServer) StaticAddressLoopIn(ctx context.Context,
1762
1787
}
1763
1788
1764
1789
req := & loop.StaticAddressLoopInRequest {
1790
+ SelectedAmount : btcutil .Amount (in .Amount ),
1765
1791
DepositOutpoints : in .Outpoints ,
1766
1792
MaxSwapFee : btcutil .Amount (in .MaxSwapFeeSatoshis ),
1767
1793
Label : in .Label ,
0 commit comments