@@ -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,26 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
843
845
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
+ totalDepositAmount btcutil.Amount
850
+ numDeposits = len (req .DepositOutpoints )
851
+ err error
848
852
)
849
853
850
854
htlcConfTarget , err := validateLoopInRequest (
851
- req .ConfTarget , req .ExternalHtlc , numDeposits , req .Amt ,
855
+ req .ConfTarget , req .ExternalHtlc , uint32 (numDeposits ),
856
+ int64 (selectedAmount ),
852
857
)
853
858
if err != nil {
854
859
return nil , err
855
860
}
856
861
857
862
// Retrieve deposits to calculate their total value.
858
863
var depositList * looprpc.ListStaticAddressDepositsResponse
859
- amount := btcutil .Amount (req .Amt )
860
- if len (req .DepositOutpoints ) > 0 {
864
+
865
+ // If deposits are selected, we need to retrieve them to calculate the
866
+ // total value which we request a quote for.
867
+ if numDeposits > 0 {
861
868
depositList , err = s .ListStaticAddressDeposits (
862
869
ctx , & looprpc.ListStaticAddressDepositsRequest {
863
870
Outpoints : req .DepositOutpoints ,
@@ -872,20 +879,34 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
872
879
"deposit outpoints" )
873
880
}
874
881
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" )
882
+ if numDeposits != len (depositList .FilteredDeposits ) {
883
+ return nil , fmt .Errorf ("expected %d deposits, got %d" ,
884
+ numDeposits , len (depositList .FilteredDeposits ))
880
885
}
881
886
882
887
// 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
- }
888
+ // selected value and the number of deposits. This is so the
889
+ // server can probe the selected value and calculate the per
890
+ // input fee.
891
+ for _ , deposit := range depositList .FilteredDeposits {
892
+ totalDepositAmount += btcutil .Amount (
893
+ deposit .Value ,
894
+ )
895
+ }
896
+
897
+ // If the selected amount would leave a dust change output or
898
+ // exceeds the total deposits value, we return an error.
899
+ dustLimit := lnwallet .DustLimitForSize (input .P2TRSize )
900
+ if totalDepositAmount - selectedAmount < dustLimit {
901
+ return nil , fmt .Errorf ("selected amount %v leaves " +
902
+ "dust or exceeds total deposit value %v" ,
903
+ selectedAmount , totalDepositAmount )
904
+ }
905
+
906
+ // If the client didn't select an amount we quote for the total
907
+ // deposits value.
908
+ if selectedAmount == 0 {
909
+ selectedAmount = totalDepositAmount
889
910
}
890
911
}
891
912
@@ -912,14 +933,14 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
912
933
}
913
934
914
935
quote , err := s .impl .LoopInQuote (ctx , & loop.LoopInQuoteRequest {
915
- Amount : amount ,
936
+ Amount : selectedAmount ,
916
937
HtlcConfTarget : htlcConfTarget ,
917
938
ExternalHtlc : req .ExternalHtlc ,
918
939
LastHop : lastHop ,
919
940
RouteHints : routeHints ,
920
941
Private : req .Private ,
921
942
Initiator : defaultLoopdInitiator ,
922
- NumDeposits : numDeposits ,
943
+ NumDeposits : uint32 ( numDeposits ) ,
923
944
})
924
945
if err != nil {
925
946
return nil , err
@@ -1762,6 +1783,7 @@ func (s *swapClientServer) StaticAddressLoopIn(ctx context.Context,
1762
1783
}
1763
1784
1764
1785
req := & loop.StaticAddressLoopInRequest {
1786
+ SelectedAmount : btcutil .Amount (in .Amount ),
1765
1787
DepositOutpoints : in .Outpoints ,
1766
1788
MaxSwapFee : btcutil .Amount (in .MaxSwapFeeSatoshis ),
1767
1789
Label : in .Label ,
0 commit comments