@@ -15,6 +15,7 @@ import (
15
15
"github.com/btcsuite/btcd/btcec/v2"
16
16
"github.com/btcsuite/btcd/btcutil"
17
17
"github.com/btcsuite/btcd/chaincfg"
18
+ "github.com/btcsuite/btcd/wire"
18
19
"github.com/lightninglabs/aperture/l402"
19
20
"github.com/lightninglabs/lndclient"
20
21
"github.com/lightninglabs/loop"
@@ -26,6 +27,7 @@ import (
26
27
clientrpc "github.com/lightninglabs/loop/looprpc"
27
28
"github.com/lightninglabs/loop/staticaddr/address"
28
29
"github.com/lightninglabs/loop/staticaddr/deposit"
30
+ "github.com/lightninglabs/loop/staticaddr/withdraw"
29
31
"github.com/lightninglabs/loop/swap"
30
32
looprpc "github.com/lightninglabs/loop/swapserverrpc"
31
33
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
@@ -87,6 +89,7 @@ type swapClientServer struct {
87
89
instantOutManager * instantout.Manager
88
90
staticAddressManager * address.Manager
89
91
depositManager * deposit.Manager
92
+ withdrawalManager * withdraw.Manager
90
93
swaps map [lntypes.Hash ]loop.SwapInfo
91
94
subscribers map [int ]chan <- interface {}
92
95
statusChan chan loop.SwapInfo
@@ -1336,6 +1339,67 @@ func (s *swapClientServer) ListUnspentDeposits(ctx context.Context,
1336
1339
return & clientrpc.ListUnspentDepositsResponse {Utxos : respUtxos }, nil
1337
1340
}
1338
1341
1342
+ // WithdrawDeposits tries to obtain a partial signature from the server to spend
1343
+ // the selected deposits to the client's wallet.
1344
+ func (s * swapClientServer ) WithdrawDeposits (ctx context.Context ,
1345
+ req * clientrpc.WithdrawDepositsRequest ) (
1346
+ * clientrpc.WithdrawDepositsResponse , error ) {
1347
+
1348
+ var (
1349
+ isAllSelected = req .All
1350
+ isUtxoSelected = req .Outpoints != nil
1351
+ outpoints []wire.OutPoint
1352
+ err error
1353
+ )
1354
+
1355
+ switch {
1356
+ case isAllSelected == isUtxoSelected :
1357
+ return nil , fmt .Errorf ("must select either all or some utxos" )
1358
+
1359
+ case isAllSelected :
1360
+ deposits , err := s .depositManager .GetActiveDepositsInState (
1361
+ deposit .Deposited ,
1362
+ )
1363
+ if err != nil {
1364
+ return nil , err
1365
+ }
1366
+
1367
+ for _ , d := range deposits {
1368
+ outpoints = append (outpoints , d .OutPoint )
1369
+ }
1370
+
1371
+ case isUtxoSelected :
1372
+ outpoints , err = toServerOutpoints (req .Outpoints )
1373
+ if err != nil {
1374
+ return nil , err
1375
+ }
1376
+ }
1377
+
1378
+ err = s .withdrawalManager .WithdrawDeposits (ctx , outpoints )
1379
+ if err != nil {
1380
+ return nil , err
1381
+ }
1382
+
1383
+ return & clientrpc.WithdrawDepositsResponse {}, err
1384
+ }
1385
+
1386
+ func toServerOutpoints (outpoints []* clientrpc.OutPoint ) ([]wire.OutPoint ,
1387
+ error ) {
1388
+
1389
+ var serverOutpoints []wire.OutPoint
1390
+ for _ , o := range outpoints {
1391
+ outpointStr := fmt .Sprintf ("%s:%d" , o .TxidStr , o .OutputIndex )
1392
+ newOutpoint , err := wire .NewOutPointFromString (outpointStr )
1393
+ if err != nil {
1394
+ return nil , err
1395
+ }
1396
+
1397
+ serverOutpoints = append (serverOutpoints , * newOutpoint )
1398
+ }
1399
+
1400
+ return serverOutpoints , nil
1401
+ }
1402
+
1339
1403
func rpcAutoloopReason (reason liquidity.Reason ) (clientrpc.AutoReason , error ) {
1340
1404
switch reason {
1341
1405
case liquidity .ReasonNone :
0 commit comments