Skip to content

Commit 5e9bc0e

Browse files
committed
WIP
1 parent 3628b43 commit 5e9bc0e

File tree

9 files changed

+38
-16
lines changed

9 files changed

+38
-16
lines changed

eclair-core/src/main/scala/fr/acinq/eclair/Eclair.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,11 +389,11 @@ class EclairImpl(appKit: Kit) extends Eclair with Logging {
389389

390390
override def disableOffer(offer: Offer)(implicit timeout: Timeout): Unit = {
391391
appKit.offerManager ! OfferManager.DisableOffer(offer)
392-
appKit.nodeParams.db.offers.disableOffer(offer)
392+
appKit.nodeParams.db.managedOffers.disableOffer(offer)
393393
}
394394

395395
override def listOffers(onlyActive: Boolean = true)(implicit timeout: Timeout): Future[Seq[Offer]] = Future {
396-
appKit.nodeParams.db.offers.listOffers(onlyActive).map(_.offer)
396+
appKit.nodeParams.db.managedOffers.listOffers(onlyActive).map(_.offer)
397397
}
398398

399399
override def newAddress(): Future[String] = {

eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ class Setup(val datadir: File,
363363
register = system.actorOf(SimpleSupervisor.props(Register.props(), "register", SupervisorStrategy.Resume))
364364
offerManager = system.spawn(Behaviors.supervise(OfferManager(nodeParams, router, paymentTimeout = 1 minute)).onFailure(typed.SupervisorStrategy.resume), name = "offer-manager")
365365
defaultOfferHandler = system.spawn(Behaviors.supervise(DefaultHandler(nodeParams, router)).onFailure(typed.SupervisorStrategy.resume), name = "default-offer-handler")
366+
_ = for (offer <- nodeParams.db.managedOffers.listOffers(onlyActive = true)) offerManager ! OfferManager.RegisterOffer(offer.offer, None, offer.pathId_opt, defaultOfferHandler)
366367
paymentHandler = system.actorOf(SimpleSupervisor.props(PaymentHandler.props(nodeParams, register, offerManager), "payment-handler", SupervisorStrategy.Resume))
367368
triggerer = system.spawn(Behaviors.supervise(AsyncPaymentTriggerer()).onFailure(typed.SupervisorStrategy.resume), name = "async-payment-triggerer")
368369
peerReadyManager = system.spawn(Behaviors.supervise(PeerReadyManager()).onFailure(typed.SupervisorStrategy.restart), name = "peer-ready-manager")

eclair-core/src/main/scala/fr/acinq/eclair/db/Databases.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ trait Databases {
4343
def channels: ChannelsDb
4444
def peers: PeersDb
4545
def payments: PaymentsDb
46-
def offers: OffersDb
46+
def managedOffers: OffersDb
4747
def pendingCommands: PendingCommandsDb
4848
def liquidity: LiquidityDb
4949
//@formatter:on
@@ -67,7 +67,7 @@ object Databases extends Logging {
6767
channels: SqliteChannelsDb,
6868
peers: SqlitePeersDb,
6969
payments: SqlitePaymentsDb,
70-
offers: SqliteOffersDb,
70+
managedOffers: SqliteOffersDb,
7171
pendingCommands: SqlitePendingCommandsDb,
7272
private val backupConnection: Connection) extends Databases with FileBackup {
7373
override def backup(backupFile: File): Unit = SqliteUtils.using(backupConnection.createStatement()) {
@@ -87,7 +87,7 @@ object Databases extends Logging {
8787
channels = new SqliteChannelsDb(eclairJdbc),
8888
peers = new SqlitePeersDb(eclairJdbc),
8989
payments = new SqlitePaymentsDb(eclairJdbc),
90-
offers = new SqliteOffersDb(eclairJdbc),
90+
managedOffers = new SqliteOffersDb(eclairJdbc),
9191
pendingCommands = new SqlitePendingCommandsDb(eclairJdbc),
9292
backupConnection = eclairJdbc
9393
)
@@ -100,7 +100,7 @@ object Databases extends Logging {
100100
channels: PgChannelsDb,
101101
peers: PgPeersDb,
102102
payments: PgPaymentsDb,
103-
offers: PgOffersDb,
103+
managedOffers: PgOffersDb,
104104
pendingCommands: PgPendingCommandsDb,
105105
dataSource: HikariDataSource,
106106
lock: PgLock) extends Databases with ExclusiveLock {
@@ -161,7 +161,7 @@ object Databases extends Logging {
161161
channels = new PgChannelsDb,
162162
peers = new PgPeersDb,
163163
payments = new PgPaymentsDb,
164-
offers = new PgOffersDb,
164+
managedOffers = new PgOffersDb,
165165
pendingCommands = new PgPendingCommandsDb,
166166
dataSource = ds,
167167
lock = lock)

eclair-core/src/main/scala/fr/acinq/eclair/db/DualDatabases.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ case class DualDatabases(primary: Databases, secondary: Databases) extends Datab
3636
override val channels: ChannelsDb = DualChannelsDb(primary.channels, secondary.channels)
3737
override val peers: PeersDb = DualPeersDb(primary.peers, secondary.peers)
3838
override val payments: PaymentsDb = DualPaymentsDb(primary.payments, secondary.payments)
39-
override val offers: OffersDb = DualOffersDb(primary.offers, secondary.offers)
39+
override val managedOffers: OffersDb = DualOffersDb(primary.managedOffers, secondary.managedOffers)
4040
override val pendingCommands: PendingCommandsDb = DualPendingCommandsDb(primary.pendingCommands, secondary.pendingCommands)
4141
override val liquidity: LiquidityDb = DualLiquidityDb(primary.liquidity, secondary.liquidity)
4242

eclair-core/src/main/scala/fr/acinq/eclair/db/OffersDb.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,25 @@ import fr.acinq.eclair.wire.protocol.OfferTypes.Offer
2121

2222
case class OfferData(offer: Offer, pathId_opt: Option[ByteVector32])
2323

24+
/**
25+
* Database for offers fully managed by eclair, as opposed to offers managed by a plugin.
26+
*/
2427
trait OffersDb {
28+
/**
29+
* Add an offer managed by eclair.
30+
* @param pathId_opt If the offer uses a blinded path, this is the corresponding pathId.
31+
*/
2532
def addOffer(offer: Offer, pathId_opt: Option[ByteVector32]): Unit
2633

34+
/**
35+
* Disable an offer. The offer is still stored but new invoice requests and new payment attempts for already emitted
36+
* invoices will be rejected. To reenable an offer, use `addOffer`.
37+
*/
2738
def disableOffer(offer: Offer): Unit
2839

40+
/**
41+
* List offers managed by eclair.
42+
* @param onlyActive Whether to return only active offers or also disabled ones.
43+
*/
2944
def listOffers(onlyActive: Boolean): Seq[OfferData]
3045
}

eclair-core/src/main/scala/fr/acinq/eclair/payment/offer/DefaultHandler.scala

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import akka.actor.typed.scaladsl.Behaviors
2121
import akka.actor.{ActorRef, typed}
2222
import akka.util.Collections
2323
import fr.acinq.eclair.crypto.Sphinx.RouteBlinding.BlindedRoute
24-
import fr.acinq.eclair.payment.receive.MultiPartHandler.ReceivingRoute
24+
import fr.acinq.eclair.payment.receive.MultiPartHandler.{DummyBlindedHop, ReceivingRoute}
2525
import fr.acinq.eclair.router.Router
2626
import fr.acinq.eclair.router.Router.BlindedRouteRequest
2727
import fr.acinq.eclair.wire.protocol.OfferTypes
@@ -41,7 +41,7 @@ object DefaultHandler {
4141
replyTo ! OfferManager.InvoiceRequestActor.ApproveRequest(amount, Seq(route), None)
4242
case OfferTypes.BlindedPath(BlindedRoute(firstNodeId: EncodedNodeId.WithPublicKey, _, _)) =>
4343
val routeParams = nodeParams.routerConf.pathFindingExperimentConf.getRandomConf().getDefaultRouteParams
44-
router ! BlindedRouteRequest(context.spawnAnonymous(waitForRoute(nodeParams, replyTo, amount)), firstNodeId.publicKey, nodeParams.nodeId, amount, routeParams, pathsToFind = 2)
44+
router ! BlindedRouteRequest(context.spawnAnonymous(waitForRoute(nodeParams, replyTo, amount, routeParams.boundaries.maxRouteLength)), firstNodeId.publicKey, nodeParams.nodeId, amount, routeParams, pathsToFind = 2)
4545
case OfferTypes.BlindedPath(BlindedRoute(_: EncodedNodeId.ShortChannelIdDir, _, _)) =>
4646
context.log.error("unexpected managed offer with compact first node id")
4747
replyTo ! OfferManager.InvoiceRequestActor.RejectRequest("internal error")
@@ -54,12 +54,18 @@ object DefaultHandler {
5454
)
5555
}
5656

57-
def waitForRoute(nodeParams: NodeParams, replyTo: typed.ActorRef[OfferManager.InvoiceRequestActor.Command], amount: MilliSatoshi): Behavior[Router.PaymentRouteResponse] = {
57+
def waitForRoute(nodeParams: NodeParams, replyTo: typed.ActorRef[OfferManager.InvoiceRequestActor.Command], amount: MilliSatoshi, maxRouteLength: Int): Behavior[Router.PaymentRouteResponse] = {
5858
Behaviors.receiveMessage {
5959
case Router.RouteResponse(routes) =>
6060
val receivingRoutes = routes.map(route => {
6161
val nodes = route.hops.head.nodeId +: route.hops.map(_.nextNodeId)
62-
ReceivingRoute(nodes, nodeParams.channelConf.maxExpiryDelta, dummyHops = ???)
62+
val maxFeeBase = route.hops.map(_.params.relayFees.feeBase).max
63+
val maxFeeProportional = route.hops.map(_.params.relayFees.feeProportionalMillionths).max
64+
val maxCltvExpiryDelta = route.hops.map(_.params.cltvExpiryDelta.toInt).max
65+
val dummyHops = (1 to maxRouteLength - route.hops.size).map(i => {
66+
DummyBlindedHop(randomFeeBase, feeProportionalMillionths = ???, cltvExpiryDelta = ???)
67+
})
68+
ReceivingRoute(nodes, nodeParams.channelConf.maxExpiryDelta, dummyHops)
6369
})
6470
replyTo ! OfferManager.InvoiceRequestActor.ApproveRequest(amount, receivingRoutes, None)
6571
Behaviors.stopped

eclair-core/src/main/scala/fr/acinq/eclair/payment/offer/OfferCreator.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ private class OfferCreator(context: ActorContext[OfferCreator.Command],
112112
}
113113

114114
private def registerOffer(offer: Offer, pathId_opt: Option[ByteVector32]): Behavior[Command] = {
115-
nodeParams.db.offers.addOffer(offer, pathId_opt)
115+
nodeParams.db.managedOffers.addOffer(offer, pathId_opt)
116116
offerManager ! OfferManager.RegisterOffer(offer, None, pathId_opt, defaultOfferHandler)
117117
replyTo ! Right(offer)
118118
Behaviors.stopped

eclair-core/src/main/scala/fr/acinq/eclair/router/Graph.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,8 +448,8 @@ object Graph {
448448
pathsToFind: Int,
449449
wr: WeightRatios[PaymentPathWeight],
450450
currentBlockHeight: BlockHeight,
451-
boundaries: PaymentPathWeight => Boolean): Seq[WeightedPath] = {
452-
val paths = new mutable.ArrayBuffer[WeightedPath](pathsToFind)
451+
boundaries: PaymentPathWeight => Boolean): Seq[WeightedPath[PaymentPathWeight]] = {
452+
val paths = new mutable.ArrayBuffer[WeightedPath[PaymentPathWeight]](pathsToFind)
453453
val verticesToIgnore = new mutable.HashSet[PublicKey]()
454454
verticesToIgnore.addAll(ignoredVertices)
455455
for (_ <- 1 to pathsToFind) {

eclair-core/src/test/scala/fr/acinq/eclair/TestDatabases.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ sealed trait TestDatabases extends Databases {
3333
override def channels: ChannelsDb = db.channels
3434
override def peers: PeersDb = db.peers
3535
override def payments: PaymentsDb = db.payments
36-
override def offers: OffersDb = db.offers
36+
override def managedOffers: OffersDb = db.managedOffers
3737
override def pendingCommands: PendingCommandsDb = db.pendingCommands
3838
override def liquidity: LiquidityDb = db.liquidity
3939
def close(): Unit

0 commit comments

Comments
 (0)