89bd58786e
This enforces the _actualized_ fee rate of the commitment transaction, rather than the fee floor used for estimation. The new value of 250 sat/kw corresponds to 1 sat/byte, rather than 253 which is only rounded up during estimation to account for the fact that BOLT 3 rounds down to the nearest satoshi and that the vbyte fee estimation is lossy. Previously we would incorrectly fail to sign the next commitment even though the fee was technically high enough. Restarting with this commit should solve the issue as long as the channel hasn't already gone to chain.
59 lines
1.8 KiB
Go
59 lines
1.8 KiB
Go
package chainfee
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/btcsuite/btcd/blockchain"
|
|
"github.com/btcsuite/btcutil"
|
|
)
|
|
|
|
const (
|
|
// FeePerKwFloor is the lowest fee rate in sat/kw that we should use for
|
|
// estimating transaction fees before signing.
|
|
FeePerKwFloor SatPerKWeight = 253
|
|
|
|
// AbsoluteFeePerKwFloor is the lowest fee rate in sat/kw of a
|
|
// transaction that we should ever _create_. This is the the equivalent
|
|
// of 1 sat/byte in sat/kw.
|
|
AbsoluteFeePerKwFloor SatPerKWeight = 250
|
|
)
|
|
|
|
// SatPerKVByte represents a fee rate in sat/kb.
|
|
type SatPerKVByte btcutil.Amount
|
|
|
|
// FeeForVSize calculates the fee resulting from this fee rate and the given
|
|
// vsize in vbytes.
|
|
func (s SatPerKVByte) FeeForVSize(vbytes int64) btcutil.Amount {
|
|
return btcutil.Amount(s) * btcutil.Amount(vbytes) / 1000
|
|
}
|
|
|
|
// FeePerKWeight converts the current fee rate from sat/kb to sat/kw.
|
|
func (s SatPerKVByte) FeePerKWeight() SatPerKWeight {
|
|
return SatPerKWeight(s / blockchain.WitnessScaleFactor)
|
|
}
|
|
|
|
// String returns a human-readable string of the fee rate.
|
|
func (s SatPerKVByte) String() string {
|
|
return fmt.Sprintf("%v sat/kb", int64(s))
|
|
}
|
|
|
|
// SatPerKWeight represents a fee rate in sat/kw.
|
|
type SatPerKWeight btcutil.Amount
|
|
|
|
// FeeForWeight calculates the fee resulting from this fee rate and the given
|
|
// weight in weight units (wu).
|
|
func (s SatPerKWeight) FeeForWeight(wu int64) btcutil.Amount {
|
|
// The resulting fee is rounded down, as specified in BOLT#03.
|
|
return btcutil.Amount(s) * btcutil.Amount(wu) / 1000
|
|
}
|
|
|
|
// FeePerKVByte converts the current fee rate from sat/kw to sat/kb.
|
|
func (s SatPerKWeight) FeePerKVByte() SatPerKVByte {
|
|
return SatPerKVByte(s * blockchain.WitnessScaleFactor)
|
|
}
|
|
|
|
// String returns a human-readable string of the fee rate.
|
|
func (s SatPerKWeight) String() string {
|
|
return fmt.Sprintf("%v sat/kw", int64(s))
|
|
}
|