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 }