@@ -19,6 +19,7 @@ import (
19
19
"github.com/lightninglabs/aperture/l402"
20
20
"github.com/lightninglabs/lndclient"
21
21
"github.com/lightninglabs/loop"
22
+ "github.com/lightninglabs/loop/fsm"
22
23
"github.com/lightninglabs/loop/instantout"
23
24
"github.com/lightninglabs/loop/instantout/reservation"
24
25
"github.com/lightninglabs/loop/labels"
@@ -1395,6 +1396,195 @@ func (s *swapClientServer) WithdrawDeposits(ctx context.Context,
1395
1396
return & clientrpc.WithdrawDepositsResponse {}, err
1396
1397
}
1397
1398
1399
+ // GetStaticAddressSummary returns a summary static address related information.
1400
+ // Amongst deposits and withdrawals and their total values it also includes a
1401
+ // list of detailed deposit information filtered by their state.
1402
+ func (s * swapClientServer ) GetStaticAddressSummary (ctx context.Context ,
1403
+ req * clientrpc.StaticAddressSummaryRequest ) (
1404
+ * clientrpc.StaticAddressSummaryResponse , error ) {
1405
+
1406
+ if req .StateFilter != clientrpc .DepositState_UNKNOWN_STATE &&
1407
+ len (req .Outpoints ) > 0 {
1408
+
1409
+ return nil , fmt .Errorf ("can either filter by state or " +
1410
+ "outpoints" )
1411
+ }
1412
+
1413
+ allDeposits , err := s .depositManager .GetAllDeposits ()
1414
+ if err != nil {
1415
+ return nil , err
1416
+ }
1417
+
1418
+ return s .depositSummary (
1419
+ ctx , allDeposits , req .StateFilter , req .Outpoints ,
1420
+ )
1421
+ }
1422
+
1423
+ func (s * swapClientServer ) depositSummary (ctx context.Context ,
1424
+ deposits []* deposit.Deposit , stateFilter clientrpc.DepositState ,
1425
+ outpointsFilter []string ) (* clientrpc.StaticAddressSummaryResponse ,
1426
+ error ) {
1427
+
1428
+ var (
1429
+ totalNumDeposits = len (deposits )
1430
+ valueUnconfirmed int64
1431
+ valueDeposited int64
1432
+ valueExpired int64
1433
+ valueWithdrawn int64
1434
+ )
1435
+
1436
+ // Value unconfirmed.
1437
+ utxos , err := s .staticAddressManager .ListUnspent (
1438
+ ctx , 0 , deposit .MinConfs - 1 ,
1439
+ )
1440
+ if err != nil {
1441
+ return nil , err
1442
+ }
1443
+ for _ , u := range utxos {
1444
+ valueUnconfirmed += int64 (u .Value )
1445
+ }
1446
+
1447
+ // Confirmed total values by category.
1448
+ for _ , d := range deposits {
1449
+ value := int64 (d .Value )
1450
+ switch d .GetState () {
1451
+ case deposit .Deposited :
1452
+ valueDeposited += value
1453
+
1454
+ case deposit .Expired :
1455
+ valueExpired += value
1456
+
1457
+ case deposit .Withdrawn :
1458
+ valueWithdrawn += value
1459
+ }
1460
+ }
1461
+
1462
+ // Deposits filtered by state or outpoints.
1463
+ var clientDeposits []* clientrpc.Deposit
1464
+ if stateFilter != clientrpc .DepositState_UNKNOWN_STATE {
1465
+ f := func (d * deposit.Deposit ) bool {
1466
+ return d .GetState () == toServerState (stateFilter )
1467
+ }
1468
+ clientDeposits = filter (deposits , f )
1469
+ } else if len (outpointsFilter ) > 0 {
1470
+ f := func (d * deposit.Deposit ) bool {
1471
+ for _ , outpoint := range outpointsFilter {
1472
+ if outpoint == d .OutPoint .String () {
1473
+ return true
1474
+ }
1475
+ }
1476
+ return false
1477
+ }
1478
+ clientDeposits = filter (deposits , f )
1479
+
1480
+ if len (outpointsFilter ) != len (clientDeposits ) {
1481
+ return nil , fmt .Errorf ("not all outpoints found in " +
1482
+ "deposits" )
1483
+ }
1484
+ }
1485
+
1486
+ params , err := s .staticAddressManager .GetStaticAddressParameters (ctx )
1487
+ if err != nil {
1488
+ return nil , err
1489
+ }
1490
+
1491
+ address , err := s .staticAddressManager .GetTaprootAddress (
1492
+ params .ClientPubkey , params .ServerPubkey , int64 (params .Expiry ),
1493
+ )
1494
+ if err != nil {
1495
+ return nil , err
1496
+ }
1497
+
1498
+ return & clientrpc.StaticAddressSummaryResponse {
1499
+ StaticAddress : address .String (),
1500
+ TotalNumDeposits : uint32 (totalNumDeposits ),
1501
+ ValueUnconfirmed : valueUnconfirmed ,
1502
+ ValueDeposited : valueDeposited ,
1503
+ ValueExpired : valueExpired ,
1504
+ ValueWithdrawn : valueWithdrawn ,
1505
+ FilteredDeposits : clientDeposits ,
1506
+ }, nil
1507
+ }
1508
+
1509
+ type filterFunc func (deposits * deposit.Deposit ) bool
1510
+
1511
+ func filter (deposits []* deposit.Deposit , f filterFunc ) []* clientrpc.Deposit {
1512
+ var clientDeposits []* clientrpc.Deposit
1513
+ for _ , d := range deposits {
1514
+ if f (d ) {
1515
+ hash := d .Hash
1516
+ outpoint := wire .NewOutPoint (& hash , d .Index ).String ()
1517
+ deposit := & clientrpc.Deposit {
1518
+ Id : d .ID [:],
1519
+ State : toClientState (d .GetState ()),
1520
+ Outpoint : outpoint ,
1521
+ Value : int64 (d .Value ),
1522
+ ConfirmationHeight : d .ConfirmationHeight ,
1523
+ }
1524
+
1525
+ clientDeposits = append (clientDeposits , deposit )
1526
+ }
1527
+ }
1528
+
1529
+ return clientDeposits
1530
+ }
1531
+
1532
+ func toClientState (state fsm.StateType ) clientrpc.DepositState {
1533
+ switch state {
1534
+ case deposit .Deposited :
1535
+ return clientrpc .DepositState_DEPOSITED
1536
+
1537
+ case deposit .Withdrawing :
1538
+ return clientrpc .DepositState_WITHDRAWING
1539
+
1540
+ case deposit .Withdrawn :
1541
+ return clientrpc .DepositState_WITHDRAWN
1542
+
1543
+ case deposit .PublishExpiredDeposit :
1544
+ return clientrpc .DepositState_PUBLISH_EXPIRED
1545
+
1546
+ case deposit .WaitForExpirySweep :
1547
+ return clientrpc .DepositState_WAIT_FOR_EXPIRY_SWEEP
1548
+
1549
+ case deposit .Expired :
1550
+ return clientrpc .DepositState_EXPIRED
1551
+
1552
+ case deposit .Failed :
1553
+ return clientrpc .DepositState_FAILED_STATE
1554
+
1555
+ default :
1556
+ return clientrpc .DepositState_UNKNOWN_STATE
1557
+ }
1558
+ }
1559
+
1560
+ func toServerState (state clientrpc.DepositState ) fsm.StateType {
1561
+ switch state {
1562
+ case clientrpc .DepositState_DEPOSITED :
1563
+ return deposit .Deposited
1564
+
1565
+ case clientrpc .DepositState_WITHDRAWING :
1566
+ return deposit .Withdrawing
1567
+
1568
+ case clientrpc .DepositState_WITHDRAWN :
1569
+ return deposit .Withdrawn
1570
+
1571
+ case clientrpc .DepositState_PUBLISH_EXPIRED :
1572
+ return deposit .PublishExpiredDeposit
1573
+
1574
+ case clientrpc .DepositState_WAIT_FOR_EXPIRY_SWEEP :
1575
+ return deposit .WaitForExpirySweep
1576
+
1577
+ case clientrpc .DepositState_EXPIRED :
1578
+ return deposit .Expired
1579
+
1580
+ case clientrpc .DepositState_FAILED_STATE :
1581
+ return deposit .Failed
1582
+
1583
+ default :
1584
+ return fsm .EmptyState
1585
+ }
1586
+ }
1587
+
1398
1588
func toServerOutpoints (outpoints []* clientrpc.OutPoint ) ([]wire.OutPoint ,
1399
1589
error ) {
1400
1590
0 commit comments