mirror of
https://github.com/lightningnetwork/lnd.git
synced 2024-11-19 09:53:54 +01:00
54 lines
1.3 KiB
Go
54 lines
1.3 KiB
Go
package models
|
|
|
|
import "github.com/lightningnetwork/lnd/lnwire"
|
|
|
|
const (
|
|
// maxFeeRate is the maximum fee rate that we allow. It is set to allow
|
|
// a variable fee component of up to 10x the payment amount.
|
|
maxFeeRate = 10 * feeRateParts
|
|
)
|
|
|
|
type InboundFee struct {
|
|
Base int32
|
|
Rate int32
|
|
}
|
|
|
|
// NewInboundFeeFromWire constructs an inbound fee structure from a wire fee.
|
|
func NewInboundFeeFromWire(fee lnwire.Fee) InboundFee {
|
|
return InboundFee{
|
|
Base: fee.BaseFee,
|
|
Rate: fee.FeeRate,
|
|
}
|
|
}
|
|
|
|
// ToWire converts the inbound fee to a wire fee structure.
|
|
func (i *InboundFee) ToWire() lnwire.Fee {
|
|
return lnwire.Fee{
|
|
BaseFee: i.Base,
|
|
FeeRate: i.Rate,
|
|
}
|
|
}
|
|
|
|
// CalcFee calculates what the inbound fee should minimally be for forwarding
|
|
// the given amount. This amount is the total of the outgoing amount plus the
|
|
// outbound fee, which is what the inbound fee is based on.
|
|
func (i *InboundFee) CalcFee(amt lnwire.MilliSatoshi) int64 {
|
|
fee := int64(i.Base)
|
|
rate := int64(i.Rate)
|
|
|
|
// Cap the rate to prevent overflows.
|
|
switch {
|
|
case rate > maxFeeRate:
|
|
rate = maxFeeRate
|
|
|
|
case rate < -maxFeeRate:
|
|
rate = -maxFeeRate
|
|
}
|
|
|
|
// Calculate proportional component. To keep the integer math simple,
|
|
// positive fees are rounded down while negative fees are rounded up.
|
|
fee += rate * int64(amt) / feeRateParts
|
|
|
|
return fee
|
|
}
|