@@ -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,201 @@ 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 len (outpointsFilter ) > 0 {
1465
+ f := func (d * deposit.Deposit ) bool {
1466
+ for _ , outpoint := range outpointsFilter {
1467
+ if outpoint == d .OutPoint .String () {
1468
+ return true
1469
+ }
1470
+ }
1471
+ return false
1472
+ }
1473
+ clientDeposits = filter (deposits , f )
1474
+
1475
+ if len (outpointsFilter ) != len (clientDeposits ) {
1476
+ return nil , fmt .Errorf ("not all outpoints found in " +
1477
+ "deposits" )
1478
+ }
1479
+ } else {
1480
+ f := func (d * deposit.Deposit ) bool {
1481
+ if stateFilter == clientrpc .DepositState_UNKNOWN_STATE {
1482
+ // Per default, we return deposits in all
1483
+ // states.
1484
+ return true
1485
+ }
1486
+
1487
+ return d .GetState () == toServerState (stateFilter )
1488
+ }
1489
+ clientDeposits = filter (deposits , f )
1490
+ }
1491
+
1492
+ params , err := s .staticAddressManager .GetStaticAddressParameters (ctx )
1493
+ if err != nil {
1494
+ return nil , err
1495
+ }
1496
+
1497
+ address , err := s .staticAddressManager .GetTaprootAddress (
1498
+ params .ClientPubkey , params .ServerPubkey , int64 (params .Expiry ),
1499
+ )
1500
+ if err != nil {
1501
+ return nil , err
1502
+ }
1503
+
1504
+ return & clientrpc.StaticAddressSummaryResponse {
1505
+ StaticAddress : address .String (),
1506
+ TotalNumDeposits : uint32 (totalNumDeposits ),
1507
+ ValueUnconfirmed : valueUnconfirmed ,
1508
+ ValueDeposited : valueDeposited ,
1509
+ ValueExpired : valueExpired ,
1510
+ ValueWithdrawn : valueWithdrawn ,
1511
+ FilteredDeposits : clientDeposits ,
1512
+ }, nil
1513
+ }
1514
+
1515
+ type filterFunc func (deposits * deposit.Deposit ) bool
1516
+
1517
+ func filter (deposits []* deposit.Deposit , f filterFunc ) []* clientrpc.Deposit {
1518
+ var clientDeposits []* clientrpc.Deposit
1519
+ for _ , d := range deposits {
1520
+ if f (d ) {
1521
+ hash := d .Hash
1522
+ outpoint := wire .NewOutPoint (& hash , d .Index ).String ()
1523
+ deposit := & clientrpc.Deposit {
1524
+ Id : d .ID [:],
1525
+ State : toClientState (d .GetState ()),
1526
+ Outpoint : outpoint ,
1527
+ Value : int64 (d .Value ),
1528
+ ConfirmationHeight : d .ConfirmationHeight ,
1529
+ }
1530
+
1531
+ clientDeposits = append (clientDeposits , deposit )
1532
+ }
1533
+ }
1534
+
1535
+ return clientDeposits
1536
+ }
1537
+
1538
+ func toClientState (state fsm.StateType ) clientrpc.DepositState {
1539
+ switch state {
1540
+ case deposit .Deposited :
1541
+ return clientrpc .DepositState_DEPOSITED
1542
+
1543
+ case deposit .Withdrawing :
1544
+ return clientrpc .DepositState_WITHDRAWING
1545
+
1546
+ case deposit .Withdrawn :
1547
+ return clientrpc .DepositState_WITHDRAWN
1548
+
1549
+ case deposit .PublishExpiredDeposit :
1550
+ return clientrpc .DepositState_PUBLISH_EXPIRED
1551
+
1552
+ case deposit .WaitForExpirySweep :
1553
+ return clientrpc .DepositState_WAIT_FOR_EXPIRY_SWEEP
1554
+
1555
+ case deposit .Expired :
1556
+ return clientrpc .DepositState_EXPIRED
1557
+
1558
+ case deposit .Failed :
1559
+ return clientrpc .DepositState_FAILED_STATE
1560
+
1561
+ default :
1562
+ return clientrpc .DepositState_UNKNOWN_STATE
1563
+ }
1564
+ }
1565
+
1566
+ func toServerState (state clientrpc.DepositState ) fsm.StateType {
1567
+ switch state {
1568
+ case clientrpc .DepositState_DEPOSITED :
1569
+ return deposit .Deposited
1570
+
1571
+ case clientrpc .DepositState_WITHDRAWING :
1572
+ return deposit .Withdrawing
1573
+
1574
+ case clientrpc .DepositState_WITHDRAWN :
1575
+ return deposit .Withdrawn
1576
+
1577
+ case clientrpc .DepositState_PUBLISH_EXPIRED :
1578
+ return deposit .PublishExpiredDeposit
1579
+
1580
+ case clientrpc .DepositState_WAIT_FOR_EXPIRY_SWEEP :
1581
+ return deposit .WaitForExpirySweep
1582
+
1583
+ case clientrpc .DepositState_EXPIRED :
1584
+ return deposit .Expired
1585
+
1586
+ case clientrpc .DepositState_FAILED_STATE :
1587
+ return deposit .Failed
1588
+
1589
+ default :
1590
+ return fsm .EmptyState
1591
+ }
1592
+ }
1593
+
1398
1594
func toServerOutpoints (outpoints []* clientrpc.OutPoint ) ([]wire.OutPoint ,
1399
1595
error ) {
1400
1596
0 commit comments