Skip to content

Commit 39e0c50

Browse files
committed
loopd: static address loop-in support
1 parent 4deb312 commit 39e0c50

File tree

3 files changed

+145
-10
lines changed

3 files changed

+145
-10
lines changed

loopd/daemon.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/lightninglabs/loop/notifications"
2525
"github.com/lightninglabs/loop/staticaddr/address"
2626
"github.com/lightninglabs/loop/staticaddr/deposit"
27+
"github.com/lightninglabs/loop/staticaddr/loopin"
2728
"github.com/lightninglabs/loop/staticaddr/withdraw"
2829
loop_swaprpc "github.com/lightninglabs/loop/swapserverrpc"
2930
"github.com/lightninglabs/loop/sweepbatcher"
@@ -536,6 +537,7 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
536537
staticAddressManager *address.Manager
537538
depositManager *deposit.Manager
538539
withdrawalManager *withdraw.Manager
540+
staticLoopInManager *loopin.Manager
539541
)
540542

541543
// Create the reservation and instantout managers.
@@ -613,6 +615,28 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
613615
Signer: d.lnd.Signer,
614616
}
615617
withdrawalManager = withdraw.NewManager(withdrawalCfg)
618+
619+
// Static address loop-in manager setup.
620+
staticAddressLoopInStore := loopin.NewSqlStore(
621+
loopdb.NewTypedStore[loopin.Querier](baseDb),
622+
clock.NewDefaultClock(), d.lnd.ChainParams,
623+
)
624+
625+
staticLoopInManager = loopin.NewManager(&loopin.Config{
626+
Server: staticAddressClient,
627+
QuoteGetter: swapClient.Server,
628+
LndClient: d.lnd.Client,
629+
InvoicesClient: d.lnd.Invoices,
630+
NodePubkey: d.lnd.NodePubkey,
631+
AddressManager: staticAddressManager,
632+
DepositManager: depositManager,
633+
Store: staticAddressLoopInStore,
634+
WalletKit: d.lnd.WalletKit,
635+
ChainNotifier: d.lnd.ChainNotifier,
636+
ChainParams: d.lnd.ChainParams,
637+
Signer: d.lnd.Signer,
638+
ValidateLoopInContract: loop.ValidateLoopInContract,
639+
})
616640
}
617641

618642
// Now finally fully initialize the swap client RPC server instance.
@@ -631,6 +655,7 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
631655
staticAddressManager: staticAddressManager,
632656
depositManager: depositManager,
633657
withdrawalManager: withdrawalManager,
658+
staticLoopInManager: staticLoopInManager,
634659
}
635660

636661
// Retrieve all currently existing swaps from the database.
@@ -788,6 +813,34 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
788813
withdrawalManager.WaitInitComplete()
789814
}
790815

816+
// Start the static address loop-in manager.
817+
if staticLoopInManager != nil {
818+
d.wg.Add(1)
819+
go func() {
820+
defer d.wg.Done()
821+
822+
// Lnd's GetInfo call supplies us with the current block
823+
// height.
824+
info, err := d.lnd.Client.GetInfo(d.mainCtx)
825+
if err != nil {
826+
d.internalErrChan <- err
827+
828+
return
829+
}
830+
831+
log.Info("Starting static address loop-in manager...")
832+
err = staticLoopInManager.Run(
833+
d.mainCtx, info.BlockHeight,
834+
)
835+
if err != nil && !errors.Is(context.Canceled, err) {
836+
d.internalErrChan <- err
837+
}
838+
log.Info("Starting static address loop-in manager " +
839+
"stopped")
840+
}()
841+
staticLoopInManager.WaitInitComplete()
842+
}
843+
791844
// Last, start our internal error handler. This will return exactly one
792845
// error or nil on the main error channel to inform the caller that
793846
// something went wrong or that shutdown is complete. We don't add to

loopd/perms/perms.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,13 @@ var RequiredPermissions = map[string][]bakery.Op{
101101
Entity: "loop",
102102
Action: "in",
103103
}},
104+
"/looprpc.SwapClient/StaticAddressLoopIn": {{
105+
Entity: "swap",
106+
Action: "read",
107+
}, {
108+
Entity: "loop",
109+
Action: "in",
110+
}},
104111
"/looprpc.SwapClient/GetLsatTokens": {{
105112
Entity: "auth",
106113
Action: "read",

loopd/swapclient_server.go

Lines changed: 85 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/lightninglabs/loop/looprpc"
2929
"github.com/lightninglabs/loop/staticaddr/address"
3030
"github.com/lightninglabs/loop/staticaddr/deposit"
31+
"github.com/lightninglabs/loop/staticaddr/loopin"
3132
"github.com/lightninglabs/loop/staticaddr/withdraw"
3233
"github.com/lightninglabs/loop/swap"
3334
"github.com/lightninglabs/loop/swapserverrpc"
@@ -91,6 +92,7 @@ type swapClientServer struct {
9192
staticAddressManager *address.Manager
9293
depositManager *deposit.Manager
9394
withdrawalManager *withdraw.Manager
95+
staticLoopInManager *loopin.Manager
9496
swaps map[lntypes.Hash]loop.SwapInfo
9597
subscribers map[int]chan<- interface{}
9698
statusChan chan loop.SwapInfo
@@ -1461,6 +1463,45 @@ func (s *swapClientServer) GetStaticAddressSummary(ctx context.Context,
14611463
)
14621464
}
14631465

1466+
// StaticAddressLoopIn initiates a loop-in request using static address
1467+
// deposits.
1468+
func (s *swapClientServer) StaticAddressLoopIn(_ context.Context,
1469+
in *looprpc.StaticAddressLoopInRequest) (
1470+
*looprpc.StaticAddressLoopInResponse, error) {
1471+
1472+
log.Infof("Static loop-in request received")
1473+
1474+
routeHints, err := unmarshallRouteHints(in.RouteHints)
1475+
if err != nil {
1476+
return nil, err
1477+
}
1478+
1479+
req := &loop.StaticAddressLoopInRequest{
1480+
DepositOutpoints: in.Outpoints,
1481+
MaxSwapFee: btcutil.Amount(in.MaxSwapFeeSatoshis),
1482+
Label: in.Label,
1483+
Initiator: in.Initiator,
1484+
Private: in.Private,
1485+
RouteHints: routeHints,
1486+
PaymentTimeoutSeconds: in.PaymentTimeoutSeconds,
1487+
}
1488+
1489+
if in.LastHop != nil {
1490+
lastHop, err := route.NewVertexFromBytes(in.LastHop)
1491+
if err != nil {
1492+
return nil, err
1493+
}
1494+
req.LastHop = &lastHop
1495+
}
1496+
1497+
err = s.staticLoopInManager.InitiateLoopIn(req)
1498+
if err != nil {
1499+
return nil, err
1500+
}
1501+
1502+
return &looprpc.StaticAddressLoopInResponse{}, nil
1503+
}
1504+
14641505
func (s *swapClientServer) depositSummary(ctx context.Context,
14651506
deposits []*deposit.Deposit, stateFilter looprpc.DepositState,
14661507
outpointsFilter []string) (*looprpc.StaticAddressSummaryResponse,
@@ -1472,6 +1513,8 @@ func (s *swapClientServer) depositSummary(ctx context.Context,
14721513
valueDeposited int64
14731514
valueExpired int64
14741515
valueWithdrawn int64
1516+
valueLoopedIn int64
1517+
htlcTimeoutSwept int64
14751518
)
14761519

14771520
// Value unconfirmed.
@@ -1497,6 +1540,12 @@ func (s *swapClientServer) depositSummary(ctx context.Context,
14971540

14981541
case deposit.Withdrawn:
14991542
valueWithdrawn += value
1543+
1544+
case deposit.LoopedIn:
1545+
valueLoopedIn += value
1546+
1547+
case deposit.HtlcTimeoutSwept:
1548+
htlcTimeoutSwept += value
15001549
}
15011550
}
15021551

@@ -1525,7 +1574,7 @@ func (s *swapClientServer) depositSummary(ctx context.Context,
15251574
return true
15261575
}
15271576

1528-
return d.GetState() == toServerState(stateFilter)
1577+
return d.IsInState(toServerState(stateFilter))
15291578
}
15301579
clientDeposits = filter(deposits, f)
15311580
}
@@ -1543,13 +1592,15 @@ func (s *swapClientServer) depositSummary(ctx context.Context,
15431592
}
15441593

15451594
return &looprpc.StaticAddressSummaryResponse{
1546-
StaticAddress: address.String(),
1547-
TotalNumDeposits: uint32(totalNumDeposits),
1548-
ValueUnconfirmed: valueUnconfirmed,
1549-
ValueDeposited: valueDeposited,
1550-
ValueExpired: valueExpired,
1551-
ValueWithdrawn: valueWithdrawn,
1552-
FilteredDeposits: clientDeposits,
1595+
StaticAddress: address.String(),
1596+
TotalNumDeposits: uint32(totalNumDeposits),
1597+
ValueUnconfirmedSatoshis: valueUnconfirmed,
1598+
ValueDepositedSatoshis: valueDeposited,
1599+
ValueExpiredSatoshis: valueExpired,
1600+
ValueWithdrawnSatoshis: valueWithdrawn,
1601+
ValueLoopedInSatoshis: valueLoopedIn,
1602+
ValueHtlcTimeoutSweepsSatoshis: htlcTimeoutSwept,
1603+
FilteredDeposits: clientDeposits,
15531604
}, nil
15541605
}
15551606

@@ -1589,9 +1640,21 @@ func toClientState(state fsm.StateType) looprpc.DepositState {
15891640
case deposit.Withdrawn:
15901641
return looprpc.DepositState_WITHDRAWN
15911642

1592-
case deposit.PublishExpiredDeposit:
1643+
case deposit.PublishExpirySweep:
15931644
return looprpc.DepositState_PUBLISH_EXPIRED
15941645

1646+
case deposit.LoopingIn:
1647+
return looprpc.DepositState_LOOPING_IN
1648+
1649+
case deposit.LoopedIn:
1650+
return looprpc.DepositState_LOOPED_IN
1651+
1652+
case deposit.SweepHtlcTimeout:
1653+
return looprpc.DepositState_SWEEP_HTLC_TIMEOUT
1654+
1655+
case deposit.HtlcTimeoutSwept:
1656+
return looprpc.DepositState_HTLC_TIMEOUT_SWEPT
1657+
15951658
case deposit.WaitForExpirySweep:
15961659
return looprpc.DepositState_WAIT_FOR_EXPIRY_SWEEP
15971660

@@ -1618,7 +1681,19 @@ func toServerState(state looprpc.DepositState) fsm.StateType {
16181681
return deposit.Withdrawn
16191682

16201683
case looprpc.DepositState_PUBLISH_EXPIRED:
1621-
return deposit.PublishExpiredDeposit
1684+
return deposit.PublishExpirySweep
1685+
1686+
case looprpc.DepositState_LOOPING_IN:
1687+
return deposit.LoopingIn
1688+
1689+
case looprpc.DepositState_LOOPED_IN:
1690+
return deposit.LoopedIn
1691+
1692+
case looprpc.DepositState_SWEEP_HTLC_TIMEOUT:
1693+
return deposit.SweepHtlcTimeout
1694+
1695+
case looprpc.DepositState_HTLC_TIMEOUT_SWEPT:
1696+
return deposit.HtlcTimeoutSwept
16221697

16231698
case looprpc.DepositState_WAIT_FOR_EXPIRY_SWEEP:
16241699
return deposit.WaitForExpirySweep

0 commit comments

Comments
 (0)