Skip to content

Commit 467a5a4

Browse files
committed
WIP
1 parent be8b828 commit 467a5a4

File tree

10 files changed

+42
-23
lines changed

10 files changed

+42
-23
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
@@ -359,6 +359,7 @@ class Setup(val datadir: File,
359359
register = system.actorOf(SimpleSupervisor.props(Register.props(), "register", SupervisorStrategy.Resume))
360360
offerManager = system.spawn(Behaviors.supervise(OfferManager(nodeParams, paymentTimeout = 1 minute)).onFailure(typed.SupervisorStrategy.resume), name = "offer-manager")
361361
defaultOfferHandler = system.spawn(Behaviors.supervise(DefaultHandler(nodeParams, router)).onFailure(typed.SupervisorStrategy.resume), name = "default-offer-handler")
362+
_ = for (offer <- nodeParams.db.managedOffers.listOffers(onlyActive = true)) offerManager ! OfferManager.RegisterOffer(offer.offer, None, offer.pathId_opt, defaultOfferHandler)
362363
paymentHandler = system.actorOf(SimpleSupervisor.props(PaymentHandler.props(nodeParams, register, offerManager), "payment-handler", SupervisorStrategy.Resume))
363364
triggerer = system.spawn(Behaviors.supervise(AsyncPaymentTriggerer()).onFailure(typed.SupervisorStrategy.resume), name = "async-payment-triggerer")
364365
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: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,16 @@ import akka.actor.typed.Behavior
2020
import akka.actor.typed.scaladsl.Behaviors
2121
import akka.actor.{ActorRef, typed}
2222
import akka.util.Collections
23+
import fr.acinq.bitcoin.scalacompat.{ByteVector32, Crypto}
2324
import fr.acinq.eclair.crypto.Sphinx.RouteBlinding.BlindedRoute
25+
import fr.acinq.eclair.payment.offer.OfferManager.InvoiceRequestActor
2426
import fr.acinq.eclair.payment.receive.MultiPartHandler.ReceivingRoute
2527
import fr.acinq.eclair.router.Router
2628
import fr.acinq.eclair.router.Router.BlindedRouteRequest
2729
import fr.acinq.eclair.wire.protocol.OfferTypes
28-
import fr.acinq.eclair.{EncodedNodeId, MilliSatoshi, MilliSatoshiLong, NodeParams}
30+
import fr.acinq.eclair.{CltvExpiryDelta, EncodedNodeId, MilliSatoshi, MilliSatoshiLong, NodeParams}
31+
import scodec.bits.ByteVector
32+
import scodec.codecs.{int32, uint32}
2933

3034
import scala.collection.immutable.{AbstractSeq, LinearSeq}
3135

@@ -36,15 +40,15 @@ object DefaultHandler {
3640
case OfferManager.HandleInvoiceRequest(replyTo, invoiceRequest) =>
3741
val amount = invoiceRequest.amount.getOrElse(10_000_000.msat)
3842
invoiceRequest.offer.contactInfos.head match {
39-
case OfferTypes.RecipientNodeId(nodeId) =>
40-
val route = ReceivingRoute(Seq(nodeId), nodeParams.channelConf.maxExpiryDelta)
41-
replyTo ! OfferManager.InvoiceRequestActor.ApproveRequest(amount, Seq(route), None)
43+
case OfferTypes.RecipientNodeId(_) =>
44+
val route = InvoiceRequestActor.Route(Nil, nodeParams.channelConf.maxExpiryDelta)
45+
replyTo ! InvoiceRequestActor.ApproveRequest(amount, Seq(route), hideFees = true)
4246
case OfferTypes.BlindedPath(BlindedRoute(firstNodeId: EncodedNodeId.WithPublicKey, _, _)) =>
4347
val routeParams = nodeParams.routerConf.pathFindingExperimentConf.getRandomConf().getDefaultRouteParams
4448
router ! BlindedRouteRequest(context.spawnAnonymous(waitForRoute(nodeParams, replyTo, amount)), firstNodeId.publicKey, nodeParams.nodeId, amount, routeParams, pathsToFind = 2)
4549
case OfferTypes.BlindedPath(BlindedRoute(_: EncodedNodeId.ShortChannelIdDir, _, _)) =>
4650
context.log.error("unexpected managed offer with compact first node id")
47-
replyTo ! OfferManager.InvoiceRequestActor.RejectRequest("internal error")
51+
replyTo ! InvoiceRequestActor.RejectRequest("internal error")
4852
}
4953
Behaviors.same
5054
case OfferManager.HandlePayment(replyTo, _, _) =>
@@ -54,18 +58,17 @@ object DefaultHandler {
5458
)
5559
}
5660

57-
def waitForRoute(nodeParams: NodeParams, replyTo: typed.ActorRef[OfferManager.InvoiceRequestActor.Command], amount: MilliSatoshi): Behavior[Router.PaymentRouteResponse] = {
61+
def waitForRoute(nodeParams: NodeParams, replyTo: typed.ActorRef[InvoiceRequestActor.Command], amount: MilliSatoshi): Behavior[Router.PaymentRouteResponse] = {
5862
Behaviors.receiveMessage {
5963
case Router.RouteResponse(routes) =>
6064
val receivingRoutes = routes.map(route => {
61-
val nodes = route.hops.head.nodeId +: route.hops.map(_.nextNodeId)
62-
ReceivingRoute(nodes, nodeParams.channelConf.maxExpiryDelta, dummyHops = ???)
65+
InvoiceRequestActor.Route(route.hops, nodeParams.channelConf.maxExpiryDelta)
6366
})
64-
replyTo ! OfferManager.InvoiceRequestActor.ApproveRequest(amount, receivingRoutes, None)
67+
replyTo ! InvoiceRequestActor.ApproveRequest(amount, receivingRoutes, hideFees = true)
6568
Behaviors.stopped
6669
case Router.PaymentRouteNotFound(error) =>
6770
// TODO: log error
68-
replyTo ! OfferManager.InvoiceRequestActor.RejectRequest("internal error")
71+
replyTo ! InvoiceRequestActor.RejectRequest("internal error")
6972
Behaviors.stopped
7073
}
7174

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

eclair-core/src/test/scala/fr/acinq/eclair/payment/offer/OfferManagerSpec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ class OfferManagerSpec extends ScalaTestWithActorTestKit(ConfigFactory.load("app
314314
offerManager ! ReceivePayment(paymentHandler.ref, invoice.paymentHash, paymentPayload, amountAfterFee(1000 msat, 200, amount))
315315

316316
val handlePayment = handler.expectMessageType[HandlePayment]
317-
assert(handlePayment.offerId == offer.offerId)
317+
assert(handlePayment.offer == offer)
318318
handlePayment.replyTo ! PaymentActor.AcceptPayment()
319319
val ProcessPayment(incomingPayment, hiddenRelayFees) = paymentHandler.expectMessageType[ProcessPayment]
320320
assert(Crypto.sha256(incomingPayment.paymentPreimage) == invoice.paymentHash)

0 commit comments

Comments
 (0)