@@ -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
@@ -1348,6 +1351,67 @@ func (s *swapClientServer) ListUnspentDeposits(ctx context.Context,
13481351 return & clientrpc.ListUnspentDepositsResponse {Utxos : respUtxos }, nil
13491352}
13501353
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+
13511415func rpcAutoloopReason (reason liquidity.Reason ) (clientrpc.AutoReason , error ) {
13521416 switch reason {
13531417 case liquidity .ReasonNone :
0 commit comments