Skip to content

Commit a8b47ae

Browse files
committed
loopd: add assets manager/server
1 parent 1232738 commit a8b47ae

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

loopd/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,8 @@ type Config struct {
201201
Tapd *assets.TapdConfig `group:"tapd" namespace:"tapd"`
202202

203203
View viewParameters `command:"view" alias:"v" description:"View all swaps in the database. This command can only be executed when loopd is not running."`
204+
205+
TapdConfig *assets.TapdConfig `group:"tapd" namespace:"tapd"`
204206
}
205207

206208
const (

loopd/daemon.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ func (d *Daemon) startWebServers() error {
249249
)
250250
loop_looprpc.RegisterSwapClientServer(d.grpcServer, d)
251251

252+
loop_looprpc.RegisterAssetsClientServer(d.grpcServer, d.assetsServer)
253+
252254
// Register our debug server if it is compiled in.
253255
d.registerDebugServer()
254256

@@ -495,6 +497,11 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
495497
swapClient.Conn,
496498
)
497499

500+
// Create a assets server client.
501+
assetsClient := loop_swaprpc.NewAssetsSwapServerClient(
502+
swapClient.Conn,
503+
)
504+
498505
// Both the client RPC server and the swap server client should stop
499506
// on main context cancel. So we create it early and pass it down.
500507
d.mainCtx, d.mainCtxCancel = context.WithCancel(context.Background())
@@ -644,6 +651,8 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
644651
var (
645652
reservationManager *reservation.Manager
646653
instantOutManager *instantout.Manager
654+
assetManager *assets.AssetsSwapManager
655+
assetClientServer *assets.AssetsClientServer
647656
)
648657

649658
// Create the reservation and instantout managers.
@@ -684,6 +693,27 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
684693
instantOutManager = instantout.NewInstantOutManager(
685694
instantOutConfig, int32(blockHeight),
686695
)
696+
697+
tapdClient, err := assets.NewTapdClient(
698+
d.cfg.TapdConfig,
699+
)
700+
if err != nil {
701+
return err
702+
}
703+
assetsStore := assets.NewPostgresStore(baseDb)
704+
assetsConfig := &assets.Config{
705+
ServerClient: assetsClient,
706+
Store: assetsStore,
707+
AssetClient: tapdClient,
708+
LndClient: d.lnd.Client,
709+
Router: d.lnd.Router,
710+
ChainNotifier: d.lnd.ChainNotifier,
711+
Signer: d.lnd.Signer,
712+
Wallet: d.lnd.WalletKit,
713+
ExchangeRateProvider: assets.NewFixedExchangeRateProvider(),
714+
}
715+
assetManager = assets.NewAssetSwapServer(assetsConfig)
716+
assetClientServer = assets.NewAssetsServer(assetManager)
687717
}
688718

689719
// Now finally fully initialize the swap client RPC server instance.
@@ -704,6 +734,8 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
704734
withdrawalManager: withdrawalManager,
705735
staticLoopInManager: staticLoopInManager,
706736
assetClient: d.assetClient,
737+
assetManager: assetManager,
738+
assetsServer: assetClientServer,
707739
}
708740

709741
// Retrieve all currently existing swaps from the database.
@@ -898,6 +930,20 @@ func (d *Daemon) initialize(withMacaroonService bool) error {
898930
staticLoopInManager.WaitInitComplete()
899931
}
900932

933+
// Start the asset manager.
934+
if d.assetManager != nil {
935+
d.wg.Add(1)
936+
go func() {
937+
defer d.wg.Done()
938+
infof("Starting asset manager")
939+
defer infof("Asset manager stopped")
940+
err := d.assetManager.Run(d.mainCtx, int32(getInfo.BlockHeight))
941+
if err != nil && !errors.Is(err, context.Canceled) {
942+
d.internalErrChan <- err
943+
}
944+
}()
945+
}
946+
901947
// Last, start our internal error handler. This will return exactly one
902948
// error or nil on the main error channel to inform the caller that
903949
// something went wrong or that shutdown is complete. We don't add to
@@ -943,6 +989,9 @@ func (d *Daemon) Stop() {
943989

944990
// stop does the actual shutdown and blocks until all goroutines have exit.
945991
func (d *Daemon) stop() {
992+
// Sleep a second in order to fix a blocking issue when having a
993+
// startup error.
994+
<-time.After(time.Second)
946995
// First of all, we can cancel the main context that all event handlers
947996
// are using. This should stop all swap activity and all event handlers
948997
// should exit.
@@ -960,6 +1009,7 @@ func (d *Daemon) stop() {
9601009
if d.restServer != nil {
9611010
// Don't return the error here, we first want to give everything
9621011
// else a chance to shut down cleanly.
1012+
9631013
err := d.restServer.Close()
9641014
if err != nil {
9651015
errorf("Error stopping REST server: %v", err)

loopd/log.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/lightninglabs/aperture/l402"
88
"github.com/lightninglabs/lndclient"
99
"github.com/lightninglabs/loop"
10+
"github.com/lightninglabs/loop/assets"
1011
"github.com/lightninglabs/loop/fsm"
1112
"github.com/lightninglabs/loop/instantout"
1213
"github.com/lightninglabs/loop/instantout/reservation"
@@ -16,6 +17,7 @@ import (
1617
"github.com/lightninglabs/loop/staticaddr"
1718
"github.com/lightninglabs/loop/sweep"
1819
"github.com/lightninglabs/loop/sweepbatcher"
20+
"github.com/lightninglabs/loop/utils"
1921
"github.com/lightningnetwork/lnd"
2022
"github.com/lightningnetwork/lnd/build"
2123
"github.com/lightningnetwork/lnd/signal"
@@ -92,6 +94,13 @@ func SetupLoggers(root *build.SubLoggerManager, intercept signal.Interceptor) {
9294
lnd.AddSubLogger(
9395
root, sweep.Subsystem, intercept, sweep.UseLogger,
9496
)
97+
98+
lnd.AddSubLogger(
99+
root, assets.Subsystem, intercept, assets.UseLogger,
100+
)
101+
lnd.AddSubLogger(
102+
root, utils.Subsystem, intercept, utils.UseLogger,
103+
)
95104
}
96105

97106
// genSubLogger creates a logger for a subsystem. We provide an instance of

loopd/perms/perms.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,20 @@ var RequiredPermissions = map[string][]bakery.Op{
169169
Entity: "swap",
170170
Action: "read",
171171
}},
172+
"/looprpc.AssetsClient/SwapOut": {{
173+
Entity: "swap",
174+
Action: "execute",
175+
}},
176+
"/looprpc.AssetsClient/ListAssetSwaps": {{
177+
Entity: "swap",
178+
Action: "read",
179+
}},
180+
"/looprpc.AssetsClient/ClientListAvailableAssets": {{
181+
Entity: "swap",
182+
Action: "read",
183+
}},
184+
"/looprpc.AssetsClient/ClientGetAssetSwapOutQuote": {{
185+
Entity: "swap",
186+
Action: "read",
187+
}},
172188
}

loopd/swapclient_server.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ type swapClientServer struct {
9696
withdrawalManager *withdraw.Manager
9797
staticLoopInManager *loopin.Manager
9898
assetClient *assets.TapdClient
99+
assetManager *assets.AssetsSwapManager
100+
assetsServer *assets.AssetsClientServer
99101
swaps map[lntypes.Hash]loop.SwapInfo
100102
subscribers map[int]chan<- interface{}
101103
statusChan chan loop.SwapInfo

0 commit comments

Comments
 (0)