@@ -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
@@ -1348,6 +1351,67 @@ func (s *swapClientServer) ListUnspentDeposits(ctx context.Context,
1348
1351
return & clientrpc.ListUnspentDepositsResponse {Utxos : respUtxos }, nil
1349
1352
}
1350
1353
1354
+ // WithdrawDeposits tries to obtain a partial signature from the server to spend
1355
+ // the selected deposits to the client's wallet.
1356
+ func (s * swapClientServer ) WithdrawDeposits (ctx context.Context ,
1357
+ req * clientrpc.WithdrawDepositsRequest ) (
1358
+ * clientrpc.WithdrawDepositsResponse , error ) {
1359
+
1360
+ var (
1361
+ isAllSelected = req .All
1362
+ isUtxoSelected = len (req .Outpoints ) > 0
1363
+ outpoints []wire.OutPoint
1364
+ err error
1365
+ )
1366
+
1367
+ switch {
1368
+ case isAllSelected == isUtxoSelected :
1369
+ return nil , fmt .Errorf ("must select either all or some utxos" )
1370
+
1371
+ case isAllSelected :
1372
+ deposits , err := s .depositManager .GetActiveDepositsInState (
1373
+ deposit .Deposited ,
1374
+ )
1375
+ if err != nil {
1376
+ return nil , err
1377
+ }
1378
+
1379
+ for _ , d := range deposits {
1380
+ outpoints = append (outpoints , d .OutPoint )
1381
+ }
1382
+
1383
+ case isUtxoSelected :
1384
+ outpoints , err = toServerOutpoints (req .Outpoints )
1385
+ if err != nil {
1386
+ return nil , err
1387
+ }
1388
+ }
1389
+
1390
+ err = s .withdrawalManager .WithdrawDeposits (ctx , outpoints )
1391
+ if err != nil {
1392
+ return nil , err
1393
+ }
1394
+
1395
+ return & clientrpc.WithdrawDepositsResponse {}, err
1396
+ }
1397
+
1398
+ func toServerOutpoints (outpoints []* clientrpc.OutPoint ) ([]wire.OutPoint ,
1399
+ error ) {
1400
+
1401
+ var serverOutpoints []wire.OutPoint
1402
+ for _ , o := range outpoints {
1403
+ outpointStr := fmt .Sprintf ("%s:%d" , o .TxidStr , o .OutputIndex )
1404
+ newOutpoint , err := wire .NewOutPointFromString (outpointStr )
1405
+ if err != nil {
1406
+ return nil , err
1407
+ }
1408
+
1409
+ serverOutpoints = append (serverOutpoints , * newOutpoint )
1410
+ }
1411
+
1412
+ return serverOutpoints , nil
1413
+ }
1414
+
1351
1415
func rpcAutoloopReason (reason liquidity.Reason ) (clientrpc.AutoReason , error ) {
1352
1416
switch reason {
1353
1417
case liquidity .ReasonNone :
0 commit comments