code.vegaprotocol.io/vega@v0.79.0/core/types/fees.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package types
    17  
    18  import (
    19  	"fmt"
    20  
    21  	"code.vegaprotocol.io/vega/libs/num"
    22  	"code.vegaprotocol.io/vega/libs/stringer"
    23  	proto "code.vegaprotocol.io/vega/protos/vega"
    24  )
    25  
    26  type FeeFactors struct {
    27  	MakerFee          num.Decimal
    28  	InfrastructureFee num.Decimal
    29  	LiquidityFee      num.Decimal
    30  	TreasuryFee       num.Decimal
    31  	BuyBackFee        num.Decimal
    32  }
    33  
    34  func FeeFactorsFromProto(f *proto.FeeFactors) *FeeFactors {
    35  	mf, err := num.DecimalFromString(f.MakerFee)
    36  	if err != nil {
    37  		mf = num.DecimalZero()
    38  	}
    39  	inf, err := num.DecimalFromString(f.InfrastructureFee)
    40  	if err != nil {
    41  		inf = num.DecimalZero()
    42  	}
    43  	lf, err := num.DecimalFromString(f.LiquidityFee)
    44  	if err != nil {
    45  		lf = num.DecimalZero()
    46  	}
    47  	bbf, err := num.DecimalFromString(f.BuyBackFee)
    48  	if err != nil {
    49  		bbf = num.DecimalZero()
    50  	}
    51  	tf, err := num.DecimalFromString(f.TreasuryFee)
    52  	if err != nil {
    53  		tf = num.DecimalZero()
    54  	}
    55  
    56  	return &FeeFactors{
    57  		MakerFee:          mf,
    58  		InfrastructureFee: inf,
    59  		LiquidityFee:      lf,
    60  		BuyBackFee:        bbf,
    61  		TreasuryFee:       tf,
    62  	}
    63  }
    64  
    65  func (f FeeFactors) IntoProto() *proto.FeeFactors {
    66  	return &proto.FeeFactors{
    67  		MakerFee:          f.MakerFee.String(),
    68  		InfrastructureFee: f.InfrastructureFee.String(),
    69  		LiquidityFee:      f.LiquidityFee.String(),
    70  		BuyBackFee:        f.BuyBackFee.String(),
    71  		TreasuryFee:       f.TreasuryFee.String(),
    72  	}
    73  }
    74  
    75  func (f FeeFactors) DeepClone() *FeeFactors {
    76  	return &FeeFactors{
    77  		MakerFee:          f.MakerFee,
    78  		InfrastructureFee: f.InfrastructureFee,
    79  		LiquidityFee:      f.LiquidityFee,
    80  		BuyBackFee:        f.BuyBackFee,
    81  		TreasuryFee:       f.TreasuryFee,
    82  	}
    83  }
    84  
    85  func (f FeeFactors) String() string {
    86  	return fmt.Sprintf(
    87  		"makerFee(%s) liquidityFee(%s) infrastructureFee(%s) buyBackFee(%s) treasuryFee(%s)",
    88  		f.MakerFee.String(),
    89  		f.LiquidityFee.String(),
    90  		f.InfrastructureFee.String(),
    91  		f.BuyBackFee.String(),
    92  		f.TreasuryFee.String(),
    93  	)
    94  }
    95  
    96  type Fees struct {
    97  	Factors              *FeeFactors
    98  	LiquidityFeeSettings *LiquidityFeeSettings
    99  }
   100  
   101  func FeesFromProto(f *proto.Fees) *Fees {
   102  	if f == nil {
   103  		return nil
   104  	}
   105  	return &Fees{
   106  		Factors:              FeeFactorsFromProto(f.Factors),
   107  		LiquidityFeeSettings: LiquidityFeeSettingsFromProto(f.LiquidityFeeSettings),
   108  	}
   109  }
   110  
   111  func (f Fees) IntoProto() *proto.Fees {
   112  	return &proto.Fees{
   113  		Factors:              f.Factors.IntoProto(),
   114  		LiquidityFeeSettings: f.LiquidityFeeSettings.IntoProto(),
   115  	}
   116  }
   117  
   118  func (f Fees) DeepClone() *Fees {
   119  	return &Fees{
   120  		Factors:              f.Factors.DeepClone(),
   121  		LiquidityFeeSettings: f.LiquidityFeeSettings.DeepClone(),
   122  	}
   123  }
   124  
   125  func (f Fees) String() string {
   126  	return fmt.Sprintf(
   127  		"factors(%s)",
   128  		stringer.PtrToString(f.Factors),
   129  	)
   130  }
   131  
   132  type Fee struct {
   133  	MakerFee           *num.Uint
   134  	InfrastructureFee  *num.Uint
   135  	LiquidityFee       *num.Uint
   136  	TreasuryFee        *num.Uint
   137  	BuyBackFee         *num.Uint
   138  	HighVolumeMakerFee *num.Uint
   139  
   140  	MakerFeeVolumeDiscount          *num.Uint
   141  	InfrastructureFeeVolumeDiscount *num.Uint
   142  	LiquidityFeeVolumeDiscount      *num.Uint
   143  
   144  	MakerFeeReferrerDiscount          *num.Uint
   145  	InfrastructureFeeReferrerDiscount *num.Uint
   146  	LiquidityFeeReferrerDiscount      *num.Uint
   147  }
   148  
   149  func (f Fee) IntoProto() *proto.Fee {
   150  	fee := &proto.Fee{
   151  		MakerFee:                          num.UintToString(f.MakerFee),
   152  		InfrastructureFee:                 num.UintToString(f.InfrastructureFee),
   153  		LiquidityFee:                      num.UintToString(f.LiquidityFee),
   154  		BuyBackFee:                        num.UintToString(f.BuyBackFee),
   155  		TreasuryFee:                       num.UintToString(f.TreasuryFee),
   156  		HighVolumeMakerFee:                num.UintToString(f.HighVolumeMakerFee),
   157  		MakerFeeVolumeDiscount:            num.UintToString(f.MakerFeeVolumeDiscount),
   158  		InfrastructureFeeVolumeDiscount:   num.UintToString(f.InfrastructureFeeVolumeDiscount),
   159  		LiquidityFeeVolumeDiscount:        num.UintToString(f.LiquidityFeeVolumeDiscount),
   160  		MakerFeeReferrerDiscount:          num.UintToString(f.MakerFeeReferrerDiscount),
   161  		InfrastructureFeeReferrerDiscount: num.UintToString(f.InfrastructureFeeReferrerDiscount),
   162  		LiquidityFeeReferrerDiscount:      num.UintToString(f.LiquidityFeeReferrerDiscount),
   163  	}
   164  
   165  	return fee
   166  }
   167  
   168  func FeeFromProto(f *proto.Fee) *Fee {
   169  	bbf := num.UintZero()
   170  	if len(f.BuyBackFee) > 0 {
   171  		bbf = num.MustUintFromString(f.BuyBackFee, 10)
   172  	}
   173  	tf := num.UintZero()
   174  	if len(f.TreasuryFee) > 0 {
   175  		tf = num.MustUintFromString(f.TreasuryFee, 10)
   176  	}
   177  	hvmf := num.UintZero()
   178  	if len(f.HighVolumeMakerFee) > 0 {
   179  		hvmf = num.MustUintFromString(f.HighVolumeMakerFee, 10)
   180  	}
   181  
   182  	return &Fee{
   183  		MakerFee:                          num.MustUintFromString(f.MakerFee, 10),
   184  		HighVolumeMakerFee:                hvmf,
   185  		InfrastructureFee:                 num.MustUintFromString(f.InfrastructureFee, 10),
   186  		LiquidityFee:                      num.MustUintFromString(f.LiquidityFee, 10),
   187  		BuyBackFee:                        bbf,
   188  		TreasuryFee:                       tf,
   189  		MakerFeeVolumeDiscount:            num.MustUintFromString(f.MakerFeeVolumeDiscount, 10),
   190  		InfrastructureFeeVolumeDiscount:   num.MustUintFromString(f.InfrastructureFeeVolumeDiscount, 10),
   191  		LiquidityFeeVolumeDiscount:        num.MustUintFromString(f.LiquidityFeeVolumeDiscount, 10),
   192  		MakerFeeReferrerDiscount:          num.MustUintFromString(f.MakerFeeReferrerDiscount, 10),
   193  		InfrastructureFeeReferrerDiscount: num.MustUintFromString(f.InfrastructureFeeReferrerDiscount, 10),
   194  		LiquidityFeeReferrerDiscount:      num.MustUintFromString(f.LiquidityFeeReferrerDiscount, 10),
   195  	}
   196  }
   197  
   198  func (f Fee) Clone() *Fee {
   199  	fee := &Fee{
   200  		MakerFee:           f.MakerFee.Clone(),
   201  		InfrastructureFee:  f.InfrastructureFee.Clone(),
   202  		LiquidityFee:       f.LiquidityFee.Clone(),
   203  		BuyBackFee:         f.BuyBackFee.Clone(),
   204  		TreasuryFee:        f.TreasuryFee.Clone(),
   205  		HighVolumeMakerFee: f.HighVolumeMakerFee.Clone(),
   206  	}
   207  	if f.MakerFeeVolumeDiscount != nil {
   208  		fee.MakerFeeVolumeDiscount = f.MakerFeeVolumeDiscount.Clone()
   209  	}
   210  	if f.InfrastructureFeeVolumeDiscount != nil {
   211  		fee.InfrastructureFeeVolumeDiscount = f.InfrastructureFeeVolumeDiscount.Clone()
   212  	}
   213  	if f.LiquidityFeeVolumeDiscount != nil {
   214  		fee.LiquidityFeeVolumeDiscount = f.LiquidityFeeVolumeDiscount.Clone()
   215  	}
   216  	if f.MakerFeeReferrerDiscount != nil {
   217  		fee.MakerFeeReferrerDiscount = f.MakerFeeReferrerDiscount.Clone()
   218  	}
   219  	if f.InfrastructureFeeReferrerDiscount != nil {
   220  		fee.InfrastructureFeeReferrerDiscount = f.InfrastructureFeeReferrerDiscount.Clone()
   221  	}
   222  	if f.LiquidityFeeReferrerDiscount != nil {
   223  		fee.LiquidityFeeReferrerDiscount = f.LiquidityFeeReferrerDiscount.Clone()
   224  	}
   225  	return fee
   226  }
   227  
   228  func (f *Fee) String() string {
   229  	return fmt.Sprintf(
   230  		"makerFee(%s) liquidityFee(%s) infrastructureFee(%s) buyBackFee(%s) treasuryFee(%s) highVolumeMakerFee(%s) makerFeeReferrerDiscount(%s) liquidityFeeReferrerDiscount(%s) infrastructureFeeReferrerDiscount(%s) makerFeeVolumeDiscount(%s) liquidityFeeVolumeDiscount(%s) infrastructureFeeVolumeDiscount(%s)",
   231  		stringer.PtrToString(f.MakerFee),
   232  		stringer.PtrToString(f.LiquidityFee),
   233  		stringer.PtrToString(f.InfrastructureFee),
   234  		stringer.PtrToString(f.BuyBackFee),
   235  		stringer.PtrToString(f.TreasuryFee),
   236  		stringer.PtrToString(f.HighVolumeMakerFee),
   237  		stringer.PtrToString(f.MakerFeeReferrerDiscount),
   238  		stringer.PtrToString(f.LiquidityFeeReferrerDiscount),
   239  		stringer.PtrToString(f.InfrastructureFeeReferrerDiscount),
   240  		stringer.PtrToString(f.MakerFeeVolumeDiscount),
   241  		stringer.PtrToString(f.LiquidityFeeVolumeDiscount),
   242  		stringer.PtrToString(f.InfrastructureFeeVolumeDiscount),
   243  	)
   244  }
   245  
   246  // NewFee returns a new fee object, with all fields initialised.
   247  func NewFee() *Fee {
   248  	return &Fee{
   249  		MakerFee:           num.UintZero(),
   250  		InfrastructureFee:  num.UintZero(),
   251  		LiquidityFee:       num.UintZero(),
   252  		BuyBackFee:         num.UintZero(),
   253  		TreasuryFee:        num.UintZero(),
   254  		HighVolumeMakerFee: num.UintZero(),
   255  	}
   256  }
   257  
   258  type ReferrerReward struct {
   259  	MakerFeeReferrerReward          *num.Uint
   260  	InfrastructureFeeReferrerReward *num.Uint
   261  	LiquidityFeeReferrerReward      *num.Uint
   262  }
   263  
   264  func (rf ReferrerReward) Clone() *ReferrerReward {
   265  	return &ReferrerReward{
   266  		MakerFeeReferrerReward:          rf.MakerFeeReferrerReward.Clone(),
   267  		InfrastructureFeeReferrerReward: rf.InfrastructureFeeReferrerReward.Clone(),
   268  		LiquidityFeeReferrerReward:      rf.LiquidityFeeReferrerReward.Clone(),
   269  	}
   270  }
   271  
   272  func (rf *ReferrerReward) String() string {
   273  	return fmt.Sprintf(
   274  		"makerFeeReferrerReward(%s) liquidityFeeReferrerReward(%s) infrastructureFeeReferrerReward(%s)",
   275  		stringer.PtrToString(rf.MakerFeeReferrerReward),
   276  		stringer.PtrToString(rf.LiquidityFeeReferrerReward),
   277  		stringer.PtrToString(rf.InfrastructureFeeReferrerReward),
   278  	)
   279  }
   280  
   281  func NewReferrerReward() *ReferrerReward {
   282  	return &ReferrerReward{
   283  		MakerFeeReferrerReward:          num.UintZero(),
   284  		InfrastructureFeeReferrerReward: num.UintZero(),
   285  		LiquidityFeeReferrerReward:      num.UintZero(),
   286  	}
   287  }