Skip to content

Commit

Permalink
make mempool fee estimation optional
Browse files Browse the repository at this point in the history
  • Loading branch information
JssDWt committed Feb 2, 2024
1 parent b5276d4 commit 95ecf1a
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 59 deletions.
22 changes: 22 additions & 0 deletions chain/default_fee_estimator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package chain

import "context"

type DefaultFeeEstimator struct {
targetConf uint32
}

func NewDefaultFeeEstimator(targetConf uint32) *DefaultFeeEstimator {
return &DefaultFeeEstimator{
targetConf: targetConf,
}
}

func (e *DefaultFeeEstimator) EstimateFeeRate(
context.Context,
FeeStrategy,
) (*FeeEstimation, error) {
return &FeeEstimation{
TargetConf: &e.targetConf,
}, nil
}
20 changes: 18 additions & 2 deletions chain/fee_estimator.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package chain

import "context"
import (
"context"
"fmt"
)

type FeeStrategy int

Expand All @@ -13,7 +16,20 @@ const (
)

type FeeEstimation struct {
SatPerVByte float64
SatPerVByte *float64
TargetConf *uint32
}

func (f *FeeEstimation) String() string {
feeStr := "<nil>"
confStr := "<nil>"
if f.SatPerVByte != nil {
feeStr = fmt.Sprintf("%.5f", *f.SatPerVByte)
}
if f.TargetConf != nil {
confStr = fmt.Sprintf("%v", *f.TargetConf)
}
return fmt.Sprintf("satPerVbyte %s, targetConf %s", feeStr, confStr)
}

type FeeEstimator interface {
Expand Down
34 changes: 12 additions & 22 deletions interceptor/intercept_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"bytes"
"context"
"encoding/hex"
"fmt"
"log"
"math/big"
"time"
Expand Down Expand Up @@ -354,41 +353,32 @@ func (i *Interceptor) openChannel(paymentHash, destination []byte, incomingAmoun
capacity++
}

var targetConf *uint32
confStr := "<nil>"
var feeEstimation *float64
feeStr := "<nil>"
if i.feeEstimator != nil {
fee, err := i.feeEstimator.EstimateFeeRate(
context.Background(),
i.feeStrategy,
)
if err == nil {
feeEstimation = &fee.SatPerVByte
feeStr = fmt.Sprintf("%.5f", *feeEstimation)
} else {
log.Printf("Error estimating chain fee, fallback to target conf: %v", err)
targetConf = &i.config.TargetConf
confStr = fmt.Sprintf("%v", *targetConf)
fee, err := i.feeEstimator.EstimateFeeRate(
context.Background(),
i.feeStrategy,
)
if err != nil || fee == nil {
log.Printf("Error estimating chain fee, fallback to target conf: %v", err)
fee = &chain.FeeEstimation{
TargetConf: &i.config.TargetConf,
}
}

log.Printf(
"Opening zero conf channel. Paymenthash: %x, Destination: %x, capacity: %v, fee: %s, targetConf: %s",
"Opening zero conf channel. Paymenthash: %x, Destination: %x, capacity: %v, fee: %s",
paymentHash,
destination,
capacity,
feeStr,
confStr,
fee.String(),
)
channelPoint, err := i.client.OpenChannel(&lightning.OpenChannelRequest{
Destination: destination,
CapacitySat: uint64(capacity),
MinConfs: i.config.MinConfs,
IsPrivate: true,
IsZeroConf: true,
FeeSatPerVByte: feeEstimation,
TargetConf: targetConf,
FeeSatPerVByte: fee.SatPerVByte,
TargetConf: fee.TargetConf,
})
if err != nil {
log.Printf("paymenthash %x, client.OpenChannelSync(%x, %v) error: %v", paymentHash, destination, capacity, err)
Expand Down
35 changes: 12 additions & 23 deletions lsps2/intercept_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package lsps2
import (
"context"
"encoding/hex"
"fmt"
"log"
"math"
"strings"
Expand Down Expand Up @@ -414,23 +413,14 @@ func (i *Interceptor) ensureChannelOpen(payment *paymentState) {
return
}

var targetConf *uint32
confStr := "<nil>"
var feeEstimation *float64
feeStr := "<nil>"
if i.feeEstimator != nil {
fee, err := i.feeEstimator.EstimateFeeRate(
context.Background(),
i.config.FeeStrategy,
)
if err == nil {
feeEstimation = &fee.SatPerVByte
feeStr = fmt.Sprintf("%.5f", *feeEstimation)
} else {
log.Printf("Error estimating chain fee, fallback to target "+
"conf: %v", err)
targetConf = &i.config.TargetConf
confStr = fmt.Sprintf("%v", *targetConf)
fee, err := i.feeEstimator.EstimateFeeRate(
context.Background(),
i.config.FeeStrategy,
)
if err != nil || fee == nil {
log.Printf("Error estimating chain fee, fallback to target conf: %v", err)
fee = &chain.FeeEstimation{
TargetConf: &i.config.TargetConf,
}
}

Expand All @@ -439,11 +429,10 @@ func (i *Interceptor) ensureChannelOpen(payment *paymentState) {

log.Printf(
"LSPS2: Opening zero conf channel. Destination: %x, capacity: %v, "+
"fee: %s, targetConf: %s",
"fee: %s",
destination,
capacity,
feeStr,
confStr,
fee.String(),
)

channelPoint, err := i.client.OpenChannel(&lightning.OpenChannelRequest{
Expand All @@ -452,8 +441,8 @@ func (i *Interceptor) ensureChannelOpen(payment *paymentState) {
MinConfs: i.config.MinConfs,
IsPrivate: true,
IsZeroConf: true,
FeeSatPerVByte: feeEstimation,
TargetConf: targetConf,
FeeSatPerVByte: fee.SatPerVByte,
TargetConf: fee.TargetConf,
})
if err != nil {
log.Printf(
Expand Down
29 changes: 18 additions & 11 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,6 @@ func main() {
log.Fatalf("failed to create nodes service: %v", err)
}

mempoolUrl := os.Getenv("MEMPOOL_API_BASE_URL")
if mempoolUrl == "" {
log.Fatalf("No mempool url configured.")
}

feeEstimator, err := mempool.NewMempoolClient(mempoolUrl)
if err != nil {
log.Fatalf("failed to initialize mempool client: %v", err)
}

var feeStrategy chain.FeeStrategy
envFeeStrategy := os.Getenv("MEMPOOL_PRIORITY")
switch strings.ToLower(envFeeStrategy) {
Expand All @@ -85,7 +75,17 @@ func main() {
default:
feeStrategy = chain.FeeStrategyEconomy
}
log.Printf("using mempool api for fee estimation: %v, fee strategy: %v:%v", mempoolUrl, envFeeStrategy, feeStrategy)

var mempoolClient *mempool.MempoolClient
mempoolUrl := os.Getenv("MEMPOOL_API_BASE_URL")
if mempoolUrl != "" {
mempoolClient, err = mempool.NewMempoolClient(mempoolUrl)
if err != nil {
log.Fatalf("failed to initialize mempool client: %v", err)
}

log.Printf("using mempool api for fee estimation: %v, fee strategy: %v:%v", mempoolUrl, envFeeStrategy, feeStrategy)
}

databaseUrl := os.Getenv("DATABASE_URL")
pool, err := postgresql.PgConnect(databaseUrl)
Expand All @@ -111,6 +111,13 @@ func main() {
var interceptors []interceptor.HtlcInterceptor
for _, node := range nodes {
var htlcInterceptor interceptor.HtlcInterceptor
var feeEstimator chain.FeeEstimator
if mempoolClient == nil {
feeEstimator = chain.NewDefaultFeeEstimator(node.NodeConfig.TargetConf)
} else {
feeEstimator = mempoolClient
}

if node.NodeConfig.Lnd != nil {
client, err := lnd.NewLndClient(node.NodeConfig.Lnd)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion mempool/mempool_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,6 @@ func (m *MempoolClient) EstimateFeeRate(
}

return &chain.FeeEstimation{
SatPerVByte: rate,
SatPerVByte: &rate,
}, nil
}

0 comments on commit 95ecf1a

Please sign in to comment.