code.vegaprotocol.io/vega@v0.79.0/core/types/amm.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 "code.vegaprotocol.io/vega/libs/num" 20 "code.vegaprotocol.io/vega/libs/ptr" 21 commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" 22 eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" 23 ) 24 25 type OrderbookShapeResult struct { 26 AmmParty string 27 Buys []*Order 28 Sells []*Order 29 Approx bool 30 } 31 32 // AMMBaseCommand these 3 parameters should be always specified 33 // in both the the submit and amend commands. 34 type AMMBaseCommand struct { 35 MarketID string 36 Party string 37 SlippageTolerance num.Decimal 38 ProposedFee num.Decimal 39 MinimumPriceChangeTrigger num.Decimal 40 } 41 42 type ConcentratedLiquidityParameters struct { 43 Base *num.Uint 44 LowerBound *num.Uint 45 UpperBound *num.Uint 46 LeverageAtLowerBound *num.Decimal 47 LeverageAtUpperBound *num.Decimal 48 DataSourceID *string 49 } 50 51 func (p *ConcentratedLiquidityParameters) ToProtoEvent() *eventspb.AMM_ConcentratedLiquidityParameters { 52 var upper, lower *string 53 if p.UpperBound != nil { 54 upper = ptr.From(p.UpperBound.String()) 55 } 56 57 if p.LowerBound != nil { 58 lower = ptr.From(p.LowerBound.String()) 59 } 60 61 var lowerLeverage, upperLeverage *string 62 if p.LeverageAtLowerBound != nil { 63 lowerLeverage = ptr.From(p.LeverageAtLowerBound.String()) 64 } 65 66 if p.LeverageAtUpperBound != nil { 67 upperLeverage = ptr.From(p.LeverageAtUpperBound.String()) 68 } 69 return &eventspb.AMM_ConcentratedLiquidityParameters{ 70 Base: p.Base.String(), 71 LowerBound: lower, 72 UpperBound: upper, 73 LeverageAtUpperBound: upperLeverage, 74 LeverageAtLowerBound: lowerLeverage, 75 DataSourceId: p.DataSourceID, 76 } 77 } 78 79 func (p ConcentratedLiquidityParameters) Clone() *ConcentratedLiquidityParameters { 80 ret := &ConcentratedLiquidityParameters{} 81 if p.Base != nil { 82 ret.Base = p.Base.Clone() 83 } 84 if p.LowerBound != nil { 85 ret.LowerBound = p.LowerBound.Clone() 86 } 87 if p.UpperBound != nil { 88 ret.UpperBound = p.UpperBound.Clone() 89 } 90 if p.LeverageAtLowerBound != nil { 91 cpy := *p.LeverageAtLowerBound 92 ret.LeverageAtLowerBound = &cpy 93 } 94 if p.LeverageAtUpperBound != nil { 95 cpy := *p.LeverageAtUpperBound 96 ret.LeverageAtUpperBound = &cpy 97 } 98 99 if p.DataSourceID != nil { 100 cpy := *p.DataSourceID 101 ret.DataSourceID = &cpy 102 } 103 104 if p.DataSourceID != nil { 105 cpy := *p.DataSourceID 106 ret.DataSourceID = &cpy 107 } 108 return ret 109 } 110 111 func (p ConcentratedLiquidityParameters) IntoProto() *commandspb.SubmitAMM_ConcentratedLiquidityParameters { 112 ret := &commandspb.SubmitAMM_ConcentratedLiquidityParameters{} 113 return ret 114 } 115 116 type SubmitAMM struct { 117 AMMBaseCommand 118 CommitmentAmount *num.Uint 119 Parameters *ConcentratedLiquidityParameters 120 } 121 122 func NewSubmitAMMFromProto( 123 submitAMM *commandspb.SubmitAMM, 124 party string, 125 ) *SubmitAMM { 126 // all parameters have been validated by the command package here. 127 var ( 128 upperBound, lowerBound *num.Uint 129 upperLeverage, lowerLeverage *num.Decimal 130 ) 131 132 commitment, _ := num.UintFromString(submitAMM.CommitmentAmount, 10) 133 134 params := submitAMM.ConcentratedLiquidityParameters 135 base, _ := num.UintFromString(params.Base, 10) 136 if params.LowerBound != nil { 137 lowerBound, _ = num.UintFromString(*params.LowerBound, 10) 138 } 139 140 if params.LeverageAtLowerBound != nil { 141 leverage, _ := num.DecimalFromString(*params.LeverageAtLowerBound) 142 lowerLeverage = ptr.From(leverage) 143 } 144 145 if params.UpperBound != nil { 146 upperBound, _ = num.UintFromString(*params.UpperBound, 10) 147 } 148 149 if params.LeverageAtUpperBound != nil { 150 leverage, _ := num.DecimalFromString(*params.LeverageAtUpperBound) 151 upperLeverage = ptr.From(leverage) 152 } 153 154 if params.LeverageAtUpperBound != nil { 155 leverage, _ := num.DecimalFromString(*params.LeverageAtUpperBound) 156 upperLeverage = ptr.From(leverage) 157 } 158 159 minimumPriceChangeTrigger := num.DecimalZero() 160 if submitAMM.MinimumPriceChangeTrigger != nil { 161 minimumPriceChangeTrigger, _ = num.DecimalFromString(*submitAMM.MinimumPriceChangeTrigger) 162 } 163 164 slippage, _ := num.DecimalFromString(submitAMM.SlippageTolerance) 165 proposedFee, _ := num.DecimalFromString(submitAMM.ProposedFee) 166 return &SubmitAMM{ 167 AMMBaseCommand: AMMBaseCommand{ 168 Party: party, 169 MarketID: submitAMM.MarketId, 170 SlippageTolerance: slippage, 171 ProposedFee: proposedFee, 172 MinimumPriceChangeTrigger: minimumPriceChangeTrigger, 173 }, 174 CommitmentAmount: commitment, 175 Parameters: &ConcentratedLiquidityParameters{ 176 Base: base, 177 LowerBound: lowerBound, 178 UpperBound: upperBound, 179 LeverageAtLowerBound: lowerLeverage, 180 LeverageAtUpperBound: upperLeverage, 181 DataSourceID: submitAMM.ConcentratedLiquidityParameters.DataSourceId, 182 }, 183 } 184 } 185 186 func (s SubmitAMM) IntoProto() *commandspb.SubmitAMM { 187 // set defaults, this is why we don't use a pointer receiver 188 zero := num.UintZero() // this call clones, we are just calling String(), so we only need a single 0-value 189 if s.CommitmentAmount == nil { 190 s.CommitmentAmount = zero 191 } 192 // create a shallow copy, because this field is a pointer, we mustn't reassign anything 193 cpy := *s.Parameters 194 s.Parameters = &cpy 195 // this should be split to a different function, because this is modifying the 196 var lower, upper, leverageLower, leverageUpper *string 197 var base string 198 if s.Parameters.LowerBound != nil { 199 lower = ptr.From(s.Parameters.LowerBound.String()) 200 } 201 202 if s.Parameters.LeverageAtLowerBound != nil { 203 leverageLower = ptr.From(s.Parameters.LeverageAtLowerBound.String()) 204 } 205 206 if s.Parameters.UpperBound != nil { 207 upper = ptr.From(s.Parameters.UpperBound.String()) 208 } 209 210 if s.Parameters.LeverageAtUpperBound != nil { 211 leverageUpper = ptr.From(s.Parameters.LeverageAtUpperBound.String()) 212 } 213 214 if s.Parameters.Base != nil { 215 base = s.Parameters.Base.String() 216 } 217 218 minimumPriceChangeTrigger := ptr.From(s.MinimumPriceChangeTrigger.String()) 219 return &commandspb.SubmitAMM{ 220 MarketId: s.MarketID, 221 CommitmentAmount: s.CommitmentAmount.String(), 222 SlippageTolerance: s.SlippageTolerance.String(), 223 ProposedFee: s.ProposedFee.String(), 224 ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ 225 UpperBound: upper, 226 LowerBound: lower, 227 Base: base, 228 LeverageAtUpperBound: leverageUpper, 229 LeverageAtLowerBound: leverageLower, 230 }, 231 MinimumPriceChangeTrigger: minimumPriceChangeTrigger, 232 } 233 } 234 235 type AmendAMM struct { 236 AMMBaseCommand 237 CommitmentAmount *num.Uint 238 Parameters *ConcentratedLiquidityParameters 239 } 240 241 func (a AmendAMM) IntoProto() *commandspb.AmendAMM { 242 ret := &commandspb.AmendAMM{ 243 MarketId: a.MarketID, 244 CommitmentAmount: nil, 245 SlippageTolerance: a.SlippageTolerance.String(), 246 ProposedFee: nil, 247 } 248 if a.CommitmentAmount != nil { 249 ret.CommitmentAmount = ptr.From(a.CommitmentAmount.String()) 250 } 251 if !a.ProposedFee.IsZero() { 252 ret.ProposedFee = ptr.From(a.ProposedFee.String()) 253 } 254 if a.Parameters == nil { 255 return ret 256 } 257 ret.ConcentratedLiquidityParameters = &commandspb.AmendAMM_ConcentratedLiquidityParameters{} 258 if a.Parameters.Base != nil { 259 ret.ConcentratedLiquidityParameters.Base = a.Parameters.Base.String() 260 } 261 if a.Parameters.LowerBound != nil { 262 ret.ConcentratedLiquidityParameters.LowerBound = ptr.From(a.Parameters.LowerBound.String()) 263 } 264 if a.Parameters.UpperBound != nil { 265 ret.ConcentratedLiquidityParameters.UpperBound = ptr.From(a.Parameters.UpperBound.String()) 266 } 267 if a.Parameters.LeverageAtLowerBound != nil { 268 ret.ConcentratedLiquidityParameters.LeverageAtLowerBound = ptr.From(a.Parameters.LeverageAtLowerBound.String()) 269 } 270 if a.Parameters.LeverageAtUpperBound != nil { 271 ret.ConcentratedLiquidityParameters.LeverageAtUpperBound = ptr.From(a.Parameters.LeverageAtUpperBound.String()) 272 } 273 ret.MinimumPriceChangeTrigger = ptr.From(a.MinimumPriceChangeTrigger.String()) 274 return ret 275 } 276 277 func NewAmendAMMFromProto( 278 amendAMM *commandspb.AmendAMM, 279 party string, 280 ) *AmendAMM { 281 // all parameters have been validated by the command package here. 282 283 var commitment, base, lowerBound, upperBound *num.Uint 284 var leverageAtUpperBound, leverageAtLowerBound *num.Decimal 285 var dataSourceID *string 286 287 // this is optional 288 if amendAMM.CommitmentAmount != nil { 289 commitment, _ = num.UintFromString(*amendAMM.CommitmentAmount, 10) 290 } 291 292 // this too, and the parameters it contains 293 if amendAMM.ConcentratedLiquidityParameters != nil { 294 base, _ = num.UintFromString(amendAMM.ConcentratedLiquidityParameters.Base, 10) 295 if amendAMM.ConcentratedLiquidityParameters.LowerBound != nil { 296 lowerBound, _ = num.UintFromString(*amendAMM.ConcentratedLiquidityParameters.LowerBound, 10) 297 } 298 if amendAMM.ConcentratedLiquidityParameters.UpperBound != nil { 299 upperBound, _ = num.UintFromString(*amendAMM.ConcentratedLiquidityParameters.UpperBound, 10) 300 } 301 if amendAMM.ConcentratedLiquidityParameters.LeverageAtLowerBound != nil { 302 leverage, _ := num.DecimalFromString(*amendAMM.ConcentratedLiquidityParameters.LeverageAtLowerBound) 303 leverageAtLowerBound = ptr.From(leverage) 304 } 305 if amendAMM.ConcentratedLiquidityParameters.LeverageAtUpperBound != nil { 306 leverage, _ := num.DecimalFromString(*amendAMM.ConcentratedLiquidityParameters.LeverageAtUpperBound) 307 leverageAtUpperBound = ptr.From(leverage) 308 } 309 310 dataSourceID = amendAMM.ConcentratedLiquidityParameters.DataSourceId 311 } 312 313 slippage, _ := num.DecimalFromString(amendAMM.SlippageTolerance) 314 315 var proposedFee num.Decimal 316 if amendAMM.ProposedFee != nil { 317 proposedFee, _ = num.DecimalFromString(*amendAMM.ProposedFee) 318 } 319 320 minimumPriceChangeTrigger := num.DecimalZero() 321 if amendAMM.MinimumPriceChangeTrigger != nil { 322 minimumPriceChangeTrigger, _ = num.DecimalFromString(*amendAMM.MinimumPriceChangeTrigger) 323 } 324 325 return &AmendAMM{ 326 AMMBaseCommand: AMMBaseCommand{ 327 Party: party, 328 MarketID: amendAMM.MarketId, 329 SlippageTolerance: slippage, 330 ProposedFee: proposedFee, 331 MinimumPriceChangeTrigger: minimumPriceChangeTrigger, 332 }, 333 CommitmentAmount: commitment, 334 Parameters: &ConcentratedLiquidityParameters{ 335 Base: base, 336 LowerBound: lowerBound, 337 UpperBound: upperBound, 338 LeverageAtUpperBound: leverageAtUpperBound, 339 LeverageAtLowerBound: leverageAtLowerBound, 340 DataSourceID: dataSourceID, 341 }, 342 } 343 } 344 345 type CancelAMM struct { 346 MarketID string 347 Party string 348 Method AMMCancellationMethod 349 } 350 351 func (c CancelAMM) IntoProto() *commandspb.CancelAMM { 352 return &commandspb.CancelAMM{ 353 MarketId: c.MarketID, 354 Method: c.Method, 355 } 356 } 357 358 func NewCancelAMMFromProto( 359 cancelAMM *commandspb.CancelAMM, 360 party string, 361 ) *CancelAMM { 362 return &CancelAMM{ 363 MarketID: cancelAMM.MarketId, 364 Party: party, 365 Method: cancelAMM.Method, 366 } 367 } 368 369 type AMMCancellationMethod = commandspb.CancelAMM_Method 370 371 const ( 372 AMMCancellationMethodUnspecified AMMCancellationMethod = commandspb.CancelAMM_METHOD_UNSPECIFIED 373 AMMCancellationMethodImmediate = commandspb.CancelAMM_METHOD_IMMEDIATE 374 AMMCancellationMethodReduceOnly = commandspb.CancelAMM_METHOD_REDUCE_ONLY 375 ) 376 377 type AMMStatusReason = eventspb.AMM_StatusReason 378 379 const ( 380 AMMStatusReasonUnspecified AMMStatusReason = eventspb.AMM_STATUS_REASON_UNSPECIFIED 381 AMMStatusReasonCancelledByParty = eventspb.AMM_STATUS_REASON_CANCELLED_BY_PARTY 382 AMMStatusReasonCannotFillCommitment = eventspb.AMM_STATUS_REASON_CANNOT_FILL_COMMITMENT 383 AMMStatusReasonPartyAlreadyOwnsAPool = eventspb.AMM_STATUS_REASON_PARTY_ALREADY_OWNS_AMM_FOR_MARKET 384 AMMStatusReasonPartyClosedOut = eventspb.AMM_STATUS_REASON_PARTY_CLOSED_OUT 385 AMMStatusReasonMarketClosed = eventspb.AMM_STATUS_REASON_MARKET_CLOSED 386 AMMStatusReasonCommitmentTooLow = eventspb.AMM_STATUS_REASON_COMMITMENT_TOO_LOW 387 AMMStatusReasonCannotRebase = eventspb.AMM_STATUS_REASON_CANNOT_REBASE 388 ) 389 390 type AMMPoolStatus = eventspb.AMM_Status 391 392 const ( 393 AMMPoolStatusUnspecified AMMPoolStatus = eventspb.AMM_STATUS_UNSPECIFIED 394 AMMPoolStatusActive = eventspb.AMM_STATUS_ACTIVE 395 AMMPoolStatusRejected = eventspb.AMM_STATUS_REJECTED 396 AMMPoolStatusCancelled = eventspb.AMM_STATUS_CANCELLED 397 AMMPoolStatusStopped = eventspb.AMM_STATUS_STOPPED 398 AMMPoolStatusReduceOnly = eventspb.AMM_STATUS_REDUCE_ONLY 399 AMMPoolStatusPending = eventspb.AMM_STATUS_PENDING 400 )