typed_fee.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package lnwire
  2. import (
  3. "io"
  4. "github.com/lightningnetwork/lnd/tlv"
  5. )
  6. const (
  7. FeeRecordType tlv.Type = 55555
  8. )
  9. // Fee represents a fee schedule.
  10. type Fee struct {
  11. BaseFee int32
  12. FeeRate int32
  13. }
  14. // Record returns a TLV record that can be used to encode/decode the fee
  15. // type from a given TLV stream.
  16. func (l *Fee) Record() tlv.Record {
  17. return tlv.MakeStaticRecord(
  18. FeeRecordType, l, 8, feeEncoder, feeDecoder, //nolint:gomnd
  19. )
  20. }
  21. // feeEncoder is a custom TLV encoder for the fee record.
  22. func feeEncoder(w io.Writer, val interface{}, buf *[8]byte) error {
  23. v, ok := val.(*Fee)
  24. if !ok {
  25. return tlv.NewTypeForEncodingErr(val, "lnwire.Fee")
  26. }
  27. if err := tlv.EUint32T(w, uint32(v.BaseFee), buf); err != nil {
  28. return err
  29. }
  30. return tlv.EUint32T(w, uint32(v.FeeRate), buf)
  31. }
  32. // feeDecoder is a custom TLV decoder for the fee record.
  33. func feeDecoder(r io.Reader, val interface{}, buf *[8]byte, l uint64) error {
  34. v, ok := val.(*Fee)
  35. if !ok {
  36. return tlv.NewTypeForDecodingErr(val, "lnwire.Fee", l, 8)
  37. }
  38. var baseFee, feeRate uint32
  39. if err := tlv.DUint32(r, &baseFee, buf, 4); err != nil { //nolint: gomnd,lll
  40. return err
  41. }
  42. if err := tlv.DUint32(r, &feeRate, buf, 4); err != nil { //nolint: gomnd,lll
  43. return err
  44. }
  45. v.FeeRate = int32(feeRate)
  46. v.BaseFee = int32(baseFee)
  47. return nil
  48. }