5172a5e255
In this commit, we introduce support for arbitrary client fee preferences when accepting input sweep requests. This is possible with the addition of fee rate buckets. Fee rate buckets are buckets that contain inputs with similar fee rates within a specific range, e.g., 1-10 sat/vbyte, 11-20 sat/vbyte, etc. Having these buckets allows us to batch and sweep inputs from different clients with similar fee rates within a single transaction, allowing us to save on chain fees. With this addition, we can now get rid of the UtxoSweeper's default fee preference. As of this commit, any clients using the it to sweep inputs specify the same fee preference to not change their behavior. Each of these can be fine-tuned later on given their use cases.
79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package sweep
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/lightningnetwork/lnd/lnwallet"
|
|
)
|
|
|
|
// mockFeeEstimator implements a mock fee estimator. It closely resembles
|
|
// lnwallet.StaticFeeEstimator with the addition that fees can be changed for
|
|
// testing purposes in a thread safe manner.
|
|
type mockFeeEstimator struct {
|
|
feePerKW lnwallet.SatPerKWeight
|
|
|
|
relayFee lnwallet.SatPerKWeight
|
|
|
|
blocksToFee map[uint32]lnwallet.SatPerKWeight
|
|
|
|
// A closure that when set is used instead of the
|
|
// mockFeeEstimator.EstimateFeePerKW method.
|
|
estimateFeePerKW func(numBlocks uint32) (lnwallet.SatPerKWeight, error)
|
|
|
|
lock sync.Mutex
|
|
}
|
|
|
|
func newMockFeeEstimator(feePerKW,
|
|
relayFee lnwallet.SatPerKWeight) *mockFeeEstimator {
|
|
|
|
return &mockFeeEstimator{
|
|
feePerKW: feePerKW,
|
|
relayFee: relayFee,
|
|
blocksToFee: make(map[uint32]lnwallet.SatPerKWeight),
|
|
}
|
|
}
|
|
|
|
func (e *mockFeeEstimator) updateFees(feePerKW,
|
|
relayFee lnwallet.SatPerKWeight) {
|
|
|
|
e.lock.Lock()
|
|
defer e.lock.Unlock()
|
|
|
|
e.feePerKW = feePerKW
|
|
e.relayFee = relayFee
|
|
}
|
|
|
|
func (e *mockFeeEstimator) EstimateFeePerKW(numBlocks uint32) (
|
|
lnwallet.SatPerKWeight, error) {
|
|
|
|
e.lock.Lock()
|
|
defer e.lock.Unlock()
|
|
|
|
if e.estimateFeePerKW != nil {
|
|
return e.estimateFeePerKW(numBlocks)
|
|
}
|
|
|
|
if fee, ok := e.blocksToFee[numBlocks]; ok {
|
|
return fee, nil
|
|
}
|
|
|
|
return e.feePerKW, nil
|
|
}
|
|
|
|
func (e *mockFeeEstimator) RelayFeePerKW() lnwallet.SatPerKWeight {
|
|
e.lock.Lock()
|
|
defer e.lock.Unlock()
|
|
|
|
return e.relayFee
|
|
}
|
|
|
|
func (e *mockFeeEstimator) Start() error {
|
|
return nil
|
|
}
|
|
|
|
func (e *mockFeeEstimator) Stop() error {
|
|
return nil
|
|
}
|
|
|
|
var _ lnwallet.FeeEstimator = (*mockFeeEstimator)(nil)
|