@@ -15,6 +15,7 @@ import (
1515 "github.com/btcsuite/btcd/btcec/v2"
1616 "github.com/btcsuite/btcd/btcutil"
1717 "github.com/btcsuite/btcd/chaincfg"
18+ "github.com/btcsuite/btcd/wire"
1819 "github.com/lightninglabs/aperture/l402"
1920 "github.com/lightninglabs/lndclient"
2021 "github.com/lightninglabs/loop"
@@ -26,6 +27,7 @@ import (
2627 clientrpc "github.com/lightninglabs/loop/looprpc"
2728 "github.com/lightninglabs/loop/staticaddr/address"
2829 "github.com/lightninglabs/loop/staticaddr/deposit"
30+ "github.com/lightninglabs/loop/staticaddr/withdraw"
2931 "github.com/lightninglabs/loop/swap"
3032 looprpc "github.com/lightninglabs/loop/swapserverrpc"
3133 "github.com/lightningnetwork/lnd/lnrpc/walletrpc"
@@ -87,6 +89,7 @@ type swapClientServer struct {
8789 instantOutManager * instantout.Manager
8890 staticAddressManager * address.Manager
8991 depositManager * deposit.Manager
92+ withdrawalManager * withdraw.Manager
9093 swaps map [lntypes.Hash ]loop.SwapInfo
9194 subscribers map [int ]chan <- interface {}
9295 statusChan chan loop.SwapInfo
@@ -1336,6 +1339,67 @@ func (s *swapClientServer) ListUnspentDeposits(ctx context.Context,
13361339 return & clientrpc.ListUnspentDepositsResponse {Utxos : respUtxos }, nil
13371340}
13381341
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 = len (req .Outpoints ) > 0
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+
13391403func rpcAutoloopReason (reason liquidity.Reason ) (clientrpc.AutoReason , error ) {
13401404 switch reason {
13411405 case liquidity .ReasonNone :
0 commit comments