66 "os"
77 "time"
88
9+ "github.com/btcsuite/btcd/btcutil"
910 "github.com/lightninglabs/loop"
1011 "github.com/lightninglabs/loop/looprpc"
1112 "github.com/lightningnetwork/lnd/routing/route"
@@ -19,10 +20,11 @@ var quoteCommand = cli.Command{
1920}
2021
2122var quoteInCommand = cli.Command {
22- Name : "in" ,
23- Usage : "get a quote for the cost of a loop in swap" ,
24- ArgsUsage : "amt" ,
25- Description : "Allows to determine the cost of a swap up front" ,
23+ Name : "in" ,
24+ Usage : "get a quote for the cost of a loop in swap" ,
25+ ArgsUsage : "amt" ,
26+ Description : "Allows to determine the cost of a swap up front." +
27+ "Either specify an amount or deposit outpoints." ,
2628 Flags : []cli.Flag {
2729 cli.StringFlag {
2830 Name : lastHopFlag .Name ,
@@ -33,20 +35,38 @@ var quoteInCommand = cli.Command{
3335 verboseFlag ,
3436 privateFlag ,
3537 routeHintsFlag ,
38+ cli.StringSliceFlag {
39+ Name : "deposit_outpoint" ,
40+ Usage : "one or more static address deposit outpoints " +
41+ "to quote for. Deposit outpoints are not to " +
42+ "be used in combination with an amount. Each" +
43+ "additional outpoint can be added by " +
44+ "specifying --deposit_outpoint tx_id:idx" ,
45+ },
3646 },
3747 Action : quoteIn ,
3848}
3949
4050func quoteIn (ctx * cli.Context ) error {
4151 // Show command help if the incorrect number arguments was provided.
42- if ctx .NArg () != 1 {
52+ if ctx .NArg () != 1 && ! ctx . IsSet ( "deposit_outpoint" ) {
4353 return cli .ShowCommandHelp (ctx , "in" )
4454 }
4555
46- args := ctx .Args ()
47- amt , err := parseAmt (args [0 ])
48- if err != nil {
49- return err
56+ var (
57+ manualAmt btcutil.Amount
58+ depositAmt btcutil.Amount
59+ depositOutpoints []string
60+ err error
61+ ctxb = context .Background ()
62+ )
63+
64+ if ctx .NArg () == 1 {
65+ args := ctx .Args ()
66+ manualAmt , err = parseAmt (args [0 ])
67+ if err != nil {
68+ return err
69+ }
5070 }
5171
5272 client , cleanup , err := getClient (ctx )
@@ -62,11 +82,20 @@ func quoteIn(ctx *cli.Context) error {
6282 return err
6383 }
6484
85+ if ctx .IsSet ("deposit_outpoint" ) {
86+ depositOutpoints = ctx .StringSlice ("deposit_outpoint" )
87+ depositAmt , err = depositAmount (ctxb , client , depositOutpoints )
88+ if err != nil {
89+ return err
90+ }
91+ }
92+
6593 quoteReq := & looprpc.QuoteRequest {
66- Amt : int64 (amt ),
94+ Amt : int64 (manualAmt ),
6795 ConfTarget : int32 (ctx .Uint64 ("conf_target" )),
6896 LoopInRouteHints : hints ,
6997 Private : ctx .Bool (privateFlag .Name ),
98+ DepositOutpoints : depositOutpoints ,
7099 }
71100
72101 if ctx .IsSet (lastHopFlag .Name ) {
@@ -80,7 +109,6 @@ func quoteIn(ctx *cli.Context) error {
80109 quoteReq .LoopInLastHop = lastHopVertex [:]
81110 }
82111
83- ctxb := context .Background ()
84112 quoteResp , err := client .GetLoopInQuote (ctxb , quoteReq )
85113 if err != nil {
86114 return err
@@ -98,10 +126,36 @@ func quoteIn(ctx *cli.Context) error {
98126 "amount.\n " )
99127 }
100128
129+ // If the user specified static address deposits, we quoted for their
130+ // total value and need to display that value instead of the manually
131+ // selected one.
132+ if manualAmt == 0 {
133+ quoteReq .Amt = int64 (depositAmt )
134+ }
101135 printQuoteInResp (quoteReq , quoteResp , ctx .Bool ("verbose" ))
102136 return nil
103137}
104138
139+ func depositAmount (ctx context.Context , client looprpc.SwapClientClient ,
140+ depositOutpoints []string ) (btcutil.Amount , error ) {
141+
142+ addressSummary , err := client .GetStaticAddressSummary (
143+ ctx , & looprpc.StaticAddressSummaryRequest {
144+ Outpoints : depositOutpoints ,
145+ },
146+ )
147+ if err != nil {
148+ return 0 , err
149+ }
150+
151+ var depositAmt btcutil.Amount
152+ for _ , deposit := range addressSummary .FilteredDeposits {
153+ depositAmt += btcutil .Amount (deposit .Value )
154+ }
155+
156+ return depositAmt , nil
157+ }
158+
105159var quoteOutCommand = cli.Command {
106160 Name : "out" ,
107161 Usage : "get a quote for the cost of a loop out swap" ,
0 commit comments