code.vegaprotocol.io/vega@v0.79.0/core/execution/engine_netparams.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 execution 17 18 import ( 19 "context" 20 "errors" 21 "time" 22 23 "code.vegaprotocol.io/vega/core/execution/common" 24 "code.vegaprotocol.io/vega/core/execution/future" 25 "code.vegaprotocol.io/vega/core/execution/spot" 26 "code.vegaprotocol.io/vega/core/types" 27 "code.vegaprotocol.io/vega/libs/num" 28 "code.vegaprotocol.io/vega/logging" 29 "code.vegaprotocol.io/vega/protos/vega" 30 ) 31 32 type netParamsValues struct { 33 feeDistributionTimeStep time.Duration 34 marketValueWindowLength time.Duration 35 suppliedStakeToObligationFactor num.Decimal 36 infrastructureFee num.Decimal 37 makerFee num.Decimal 38 treasuryFee num.Decimal 39 buyBackFee num.Decimal 40 scalingFactors *types.ScalingFactors 41 maxLiquidityFee num.Decimal 42 bondPenaltyFactor num.Decimal 43 auctionMinDuration time.Duration 44 auctionMaxDuration time.Duration 45 probabilityOfTradingTauScaling num.Decimal 46 minProbabilityOfTradingLPOrders num.Decimal 47 minLpStakeQuantumMultiple num.Decimal 48 marketCreationQuantumMultiple num.Decimal 49 markPriceUpdateMaximumFrequency time.Duration 50 internalCompositePriceUpdateFrequency time.Duration 51 marketPartiesMaximumStopOrdersUpdate *num.Uint 52 53 // Liquidity version 2. 54 liquidityV2BondPenaltyFactor num.Decimal 55 liquidityV2EarlyExitPenalty num.Decimal 56 liquidityV2MaxLiquidityFee num.Decimal 57 liquidityV2SLANonPerformanceBondPenaltyMax num.Decimal 58 liquidityV2SLANonPerformanceBondPenaltySlope num.Decimal 59 liquidityV2StakeToCCYVolume num.Decimal 60 liquidityV2ProvidersFeeCalculationTimeStep time.Duration 61 liquidityELSFeeFraction num.Decimal 62 63 // AMM 64 ammCommitmentQuantum *num.Uint 65 ammCalculationLevels *num.Uint 66 67 // only used for protocol upgrade to v0.74 68 chainID uint64 69 70 // network wide auction duration 71 lbadTable *types.LongBlockAuctionDurationTable 72 } 73 74 func defaultNetParamsValues() netParamsValues { 75 return netParamsValues{ 76 feeDistributionTimeStep: -1, 77 marketValueWindowLength: -1, 78 suppliedStakeToObligationFactor: num.DecimalFromInt64(-1), 79 infrastructureFee: num.DecimalFromInt64(-1), 80 makerFee: num.DecimalFromInt64(-1), 81 buyBackFee: num.DecimalFromInt64(-1), 82 treasuryFee: num.DecimalFromInt64(-1), 83 scalingFactors: nil, 84 maxLiquidityFee: num.DecimalFromInt64(-1), 85 bondPenaltyFactor: num.DecimalFromInt64(-1), 86 87 auctionMinDuration: -1, 88 probabilityOfTradingTauScaling: num.DecimalFromInt64(-1), 89 minProbabilityOfTradingLPOrders: num.DecimalFromInt64(-1), 90 minLpStakeQuantumMultiple: num.DecimalFromInt64(-1), 91 marketCreationQuantumMultiple: num.DecimalFromInt64(-1), 92 markPriceUpdateMaximumFrequency: 5 * time.Second, // default is 5 seconds, should come from net params though 93 internalCompositePriceUpdateFrequency: 5 * time.Second, 94 marketPartiesMaximumStopOrdersUpdate: num.UintZero(), 95 96 // Liquidity version 2. 97 liquidityV2BondPenaltyFactor: num.DecimalFromInt64(-1), 98 liquidityV2EarlyExitPenalty: num.DecimalFromInt64(-1), 99 liquidityV2MaxLiquidityFee: num.DecimalFromInt64(-1), 100 liquidityV2SLANonPerformanceBondPenaltyMax: num.DecimalFromInt64(-1), 101 liquidityV2SLANonPerformanceBondPenaltySlope: num.DecimalFromInt64(-1), 102 liquidityV2StakeToCCYVolume: num.DecimalFromInt64(-1), 103 liquidityV2ProvidersFeeCalculationTimeStep: time.Second * 5, 104 105 ammCommitmentQuantum: num.UintZero(), 106 ammCalculationLevels: num.NewUint(100), 107 } 108 } 109 110 func (e *Engine) OnMarketAuctionMinimumDurationUpdate(ctx context.Context, d time.Duration) error { 111 for _, mkt := range e.allMarketsCpy { 112 mkt.OnMarketAuctionMinimumDurationUpdate(ctx, d) 113 } 114 e.npv.auctionMinDuration = d 115 return nil 116 } 117 118 func (e *Engine) OnMarketAuctionMaximumDurationUpdate(ctx context.Context, d time.Duration) error { 119 for _, mkt := range e.allMarketsCpy { 120 if mkt.IsOpeningAuction() { 121 mkt.OnMarketAuctionMaximumDurationUpdate(ctx, d) 122 } 123 } 124 e.npv.auctionMaxDuration = d 125 return nil 126 } 127 128 func (e *Engine) OnMarkPriceUpdateMaximumFrequency(ctx context.Context, d time.Duration) error { 129 for _, mkt := range e.allMarketsCpy { 130 mkt.OnMarkPriceUpdateMaximumFrequency(ctx, d) 131 } 132 e.npv.markPriceUpdateMaximumFrequency = d 133 return nil 134 } 135 136 func (e *Engine) OnInternalCompositePriceUpdateFrequency(ctx context.Context, d time.Duration) error { 137 for _, mkt := range e.futureMarkets { 138 mkt.OnInternalCompositePriceUpdateFrequency(ctx, d) 139 } 140 e.npv.internalCompositePriceUpdateFrequency = d 141 return nil 142 } 143 144 // OnMarketLiquidityV2BondPenaltyUpdate stores net param on execution engine and applies to markets at the start of new epoch. 145 func (e *Engine) OnMarketLiquidityV2BondPenaltyUpdate(_ context.Context, d num.Decimal) error { 146 if e.log.IsDebug() { 147 e.log.Debug("update market liquidity bond penalty (liquidity v2)", 148 logging.Decimal("bond-penalty-factor", d), 149 ) 150 } 151 152 // Set immediately during opening auction 153 for _, mkt := range e.allMarketsCpy { 154 if mkt.IsOpeningAuction() { 155 mkt.OnMarketLiquidityV2BondPenaltyFactorUpdate(d) 156 } 157 } 158 159 e.npv.liquidityV2BondPenaltyFactor = d 160 return nil 161 } 162 163 // OnMarketLiquidityV2EarlyExitPenaltyUpdate stores net param on execution engine and applies to markets 164 // at the start of new epoch. 165 func (e *Engine) OnMarketLiquidityV2EarlyExitPenaltyUpdate(_ context.Context, d num.Decimal) error { 166 if e.log.IsDebug() { 167 e.log.Debug("update market liquidity early exit penalty (liquidity v2)", 168 logging.Decimal("early-exit-penalty", d), 169 ) 170 } 171 172 // Set immediately during opening auction 173 for _, mkt := range e.allMarketsCpy { 174 if mkt.IsOpeningAuction() { 175 mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(d) 176 } 177 } 178 179 e.npv.liquidityV2EarlyExitPenalty = d 180 return nil 181 } 182 183 // OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate stores net param on execution engine and 184 // applies at the start of new epoch. 185 func (e *Engine) OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(_ context.Context, d num.Decimal) error { 186 if e.log.IsDebug() { 187 e.log.Debug("update liquidity provision max liquidity fee factor (liquidity v2)", 188 logging.Decimal("max-liquidity-fee", d), 189 ) 190 } 191 192 // Set immediately during opening auction 193 for _, mkt := range e.allMarketsCpy { 194 if mkt.IsOpeningAuction() { 195 mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(d) 196 } 197 } 198 199 e.npv.liquidityV2MaxLiquidityFee = d 200 return nil 201 } 202 203 // OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate stores net param on execution engine and applies to markets at the 204 // start of new epoch. 205 func (e *Engine) OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(_ context.Context, d num.Decimal) error { 206 if e.log.IsDebug() { 207 e.log.Debug("update market SLA non performance bond penalty slope (liquidity v2)", 208 logging.Decimal("bond-penalty-slope", d), 209 ) 210 } 211 212 // Set immediately during opening auction 213 for _, mkt := range e.allMarketsCpy { 214 if mkt.IsOpeningAuction() { 215 mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(d) 216 } 217 } 218 219 e.npv.liquidityV2SLANonPerformanceBondPenaltySlope = d 220 return nil 221 } 222 223 // OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate stores net param on execution engine and applies to markets 224 // at the start of new epoch. 225 func (e *Engine) OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(_ context.Context, d num.Decimal) error { 226 if e.log.IsDebug() { 227 e.log.Debug("update market SLA non performance bond penalty max (liquidity v2)", 228 logging.Decimal("bond-penalty-max", d), 229 ) 230 } 231 232 for _, m := range e.futureMarketsCpy { 233 // Set immediately during opening auction 234 if m.IsOpeningAuction() { 235 m.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(d) 236 } 237 } 238 239 e.npv.liquidityV2SLANonPerformanceBondPenaltyMax = d 240 return nil 241 } 242 243 // OnMarketLiquidityV2StakeToCCYVolumeUpdate stores net param on execution engine and applies to markets 244 // at the start of new epoch. 245 func (e *Engine) OnMarketLiquidityV2StakeToCCYVolumeUpdate(_ context.Context, d num.Decimal) error { 246 if e.log.IsDebug() { 247 e.log.Debug("update market stake to CCYVolume (liquidity v2)", 248 logging.Decimal("stake-to-ccy-volume", d), 249 ) 250 } 251 252 for _, m := range e.futureMarketsCpy { 253 // Set immediately during opening auction 254 if m.IsOpeningAuction() { 255 m.OnMarketLiquidityV2StakeToCCYVolume(d) 256 } 257 } 258 259 e.npv.liquidityV2StakeToCCYVolume = d 260 return nil 261 } 262 263 // OnMarketLiquidityV2ProvidersFeeCalculationTimeStep stores net param on execution engine and applies to markets 264 // at the start of new epoch. 265 func (e *Engine) OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(_ context.Context, d time.Duration) error { 266 if e.log.IsDebug() { 267 e.log.Debug("update market SLA providers fee calculation time step (liquidity v2)", 268 logging.Duration("providersFeeCalculationTimeStep", d), 269 ) 270 } 271 272 for _, m := range e.allMarketsCpy { 273 // Set immediately during opening auction 274 if m.IsOpeningAuction() { 275 m.OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(d) 276 } 277 } 278 279 e.npv.liquidityV2ProvidersFeeCalculationTimeStep = d 280 return nil 281 } 282 283 func (e *Engine) OnNetworkWideAuctionDurationUpdated(ctx context.Context, v interface{}) error { 284 if e.log.IsDebug() { 285 e.log.Debug("update network wide auction duration", 286 logging.Reflect("network-wide-auction-duration", v), 287 ) 288 } 289 lbadTable, ok := v.(*vega.LongBlockAuctionDurationTable) 290 if !ok { 291 return errors.New("invalid long block auction duration table") 292 } 293 lbads, err := types.LongBlockAuctionDurationTableFromProto(lbadTable) 294 if err != nil { 295 return err 296 } 297 e.npv.lbadTable = lbads 298 return nil 299 } 300 301 func (e *Engine) OnMarketMarginScalingFactorsUpdate(ctx context.Context, v interface{}) error { 302 if e.log.IsDebug() { 303 e.log.Debug("update market scaling factors", 304 logging.Reflect("scaling-factors", v), 305 ) 306 } 307 308 pscalingFactors, ok := v.(*vega.ScalingFactors) 309 if !ok { 310 return errors.New("invalid types for Margin ScalingFactors") 311 } 312 scalingFactors := types.ScalingFactorsFromProto(pscalingFactors) 313 for _, mkt := range e.futureMarketsCpy { 314 if err := mkt.OnMarginScalingFactorsUpdate(ctx, scalingFactors); err != nil { 315 return err 316 } 317 } 318 e.npv.scalingFactors = scalingFactors 319 return nil 320 } 321 322 func (e *Engine) OnMarketFeeFactorsMakerFeeUpdate(ctx context.Context, d num.Decimal) error { 323 if e.log.IsDebug() { 324 e.log.Debug("update maker fee in market fee factors", 325 logging.Decimal("maker-fee", d), 326 ) 327 } 328 329 for _, mkt := range e.allMarketsCpy { 330 mkt.OnFeeFactorsMakerFeeUpdate(ctx, d) 331 } 332 e.npv.makerFee = d 333 return nil 334 } 335 336 func (e *Engine) OnMarketFeeFactorsTreasuryFeeUpdate(ctx context.Context, d num.Decimal) error { 337 if e.log.IsDebug() { 338 e.log.Debug("update treasury fee in market fee factors", 339 logging.Decimal("treasury-fee", d), 340 ) 341 } 342 343 for _, mkt := range e.allMarketsCpy { 344 mkt.OnFeeFactorsTreasuryFeeUpdate(ctx, d) 345 } 346 e.npv.treasuryFee = d 347 return nil 348 } 349 350 func (e *Engine) OnMarketFeeFactorsBuyBackFeeUpdate(ctx context.Context, d num.Decimal) error { 351 if e.log.IsDebug() { 352 e.log.Debug("update buy back fee in market fee factors", 353 logging.Decimal("buy-back-fee", d), 354 ) 355 } 356 357 for _, mkt := range e.allMarketsCpy { 358 mkt.OnFeeFactorsBuyBackFeeUpdate(ctx, d) 359 } 360 e.npv.buyBackFee = d 361 return nil 362 } 363 364 func (e *Engine) OnMarketFeeFactorsInfrastructureFeeUpdate(ctx context.Context, d num.Decimal) error { 365 if e.log.IsDebug() { 366 e.log.Debug("update infrastructure fee in market fee factors", 367 logging.Decimal("infrastructure-fee", d), 368 ) 369 } 370 for _, mkt := range e.allMarketsCpy { 371 mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, d) 372 } 373 e.npv.infrastructureFee = d 374 return nil 375 } 376 377 func (e *Engine) OnMarketValueWindowLengthUpdate(_ context.Context, d time.Duration) error { 378 if e.log.IsDebug() { 379 e.log.Debug("update market value window length", 380 logging.Duration("window-length", d), 381 ) 382 } 383 384 for _, mkt := range e.allMarketsCpy { 385 mkt.OnMarketValueWindowLengthUpdate(d) 386 } 387 e.npv.marketValueWindowLength = d 388 return nil 389 } 390 391 // to be removed and replaced by its v2 counterpart. in use only for future. 392 func (e *Engine) OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(_ context.Context, d num.Decimal) error { 393 if e.log.IsDebug() { 394 e.log.Debug("update liquidity provision max liquidity fee factor", 395 logging.Decimal("max-liquidity-fee", d), 396 ) 397 } 398 399 for _, mkt := range e.futureMarketsCpy { 400 mkt.OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(d) 401 } 402 e.npv.maxLiquidityFee = d 403 404 return nil 405 } 406 407 func (e *Engine) OnMarketLiquidityEquityLikeShareFeeFractionUpdate(_ context.Context, d num.Decimal) error { 408 if e.log.IsDebug() { 409 e.log.Debug("update market liquidity equityLikeShareFeeFraction", 410 logging.Decimal("market.liquidity.equityLikeShareFeeFraction", d), 411 ) 412 } 413 for _, mkt := range e.allMarketsCpy { 414 mkt.OnMarketLiquidityEquityLikeShareFeeFractionUpdate(d) 415 } 416 e.npv.liquidityELSFeeFraction = d 417 return nil 418 } 419 420 func (e *Engine) OnMarketProbabilityOfTradingTauScalingUpdate(ctx context.Context, d num.Decimal) error { 421 if e.log.IsDebug() { 422 e.log.Debug("update probability of trading tau scaling", 423 logging.Decimal("probability-of-trading-tau-scaling", d), 424 ) 425 } 426 for _, mkt := range e.allMarketsCpy { 427 mkt.OnMarketProbabilityOfTradingTauScalingUpdate(ctx, d) 428 } 429 e.npv.probabilityOfTradingTauScaling = d 430 return nil 431 } 432 433 func (e *Engine) OnMarketMinProbabilityOfTradingForLPOrdersUpdate(ctx context.Context, d num.Decimal) error { 434 if e.log.IsDebug() { 435 e.log.Debug("update min probability of trading tau scaling", 436 logging.Decimal("min-probability-of-trading-lp-orders", d), 437 ) 438 } 439 440 for _, mkt := range e.allMarketsCpy { 441 mkt.OnMarketMinProbabilityOfTradingLPOrdersUpdate(ctx, d) 442 } 443 e.npv.minProbabilityOfTradingLPOrders = d 444 return nil 445 } 446 447 func (e *Engine) OnMinLpStakeQuantumMultipleUpdate(ctx context.Context, d num.Decimal) error { 448 if e.log.IsDebug() { 449 e.log.Debug("update min lp stake quantum multiple", 450 logging.Decimal("min-lp-stake-quantum-multiple", d), 451 ) 452 } 453 for _, mkt := range e.allMarketsCpy { 454 mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, d) 455 } 456 e.npv.minLpStakeQuantumMultiple = d 457 return nil 458 } 459 460 func (e *Engine) OnMarketCreationQuantumMultipleUpdate(ctx context.Context, d num.Decimal) error { 461 if e.log.IsDebug() { 462 e.log.Debug("update market creation quantum multiple", 463 logging.Decimal("market-creation-quantum-multiple", d), 464 ) 465 } 466 e.npv.marketCreationQuantumMultiple = d 467 return nil 468 } 469 470 func (e *Engine) OnMarketPartiesMaximumStopOrdersUpdate(ctx context.Context, u *num.Uint) error { 471 if e.log.IsDebug() { 472 e.log.Debug("update market parties maxiumum stop orders", 473 logging.BigUint("value", u), 474 ) 475 } 476 e.npv.marketPartiesMaximumStopOrdersUpdate = u 477 for _, mkt := range e.allMarketsCpy { 478 mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, u) 479 } 480 return nil 481 } 482 483 func (e *Engine) OnMaxPeggedOrderUpdate(ctx context.Context, max *num.Uint) error { 484 if e.log.IsDebug() { 485 e.log.Debug("update max pegged orders", 486 logging.Uint64("max-pegged-orders", max.Uint64()), 487 ) 488 } 489 e.maxPeggedOrders = max.Uint64() 490 return nil 491 } 492 493 func (e *Engine) OnMarketAMMMinCommitmentQuantum(ctx context.Context, c *num.Uint) error { 494 if e.log.IsDebug() { 495 e.log.Debug("update amm min commitment quantum", 496 logging.BigUint("commitment-quantum", c), 497 ) 498 } 499 e.npv.ammCommitmentQuantum = c 500 for _, m := range e.allMarketsCpy { 501 m.OnAMMMinCommitmentQuantumUpdate(ctx, c.Clone()) 502 } 503 504 return nil 505 } 506 507 func (e *Engine) OnMarketAMMMaxCalculationLevels(ctx context.Context, c *num.Uint) error { 508 if e.log.IsDebug() { 509 e.log.Debug("update amm max calculation levels", 510 logging.BigUint("ccalculation-levels", c), 511 ) 512 } 513 e.npv.ammCalculationLevels = c 514 for _, m := range e.allMarketsCpy { 515 m.OnMarketAMMMaxCalculationLevels(ctx, c.Clone()) 516 } 517 return nil 518 } 519 520 func (e *Engine) propagateSpotInitialNetParams(ctx context.Context, mkt *spot.Market, isRestore bool) error { 521 if !e.npv.minLpStakeQuantumMultiple.Equal(num.DecimalFromInt64(-1)) { 522 mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, e.npv.minLpStakeQuantumMultiple) 523 } 524 if e.npv.auctionMinDuration != -1 { 525 mkt.OnMarketAuctionMinimumDurationUpdate(ctx, e.npv.auctionMinDuration) 526 } 527 if e.npv.auctionMaxDuration > 0 { 528 mkt.OnMarketAuctionMaximumDurationUpdate(ctx, e.npv.auctionMaxDuration) 529 } 530 if !e.npv.infrastructureFee.Equal(num.DecimalFromInt64(-1)) { 531 mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, e.npv.infrastructureFee) 532 } 533 534 if !e.npv.makerFee.Equal(num.DecimalFromInt64(-1)) { 535 mkt.OnFeeFactorsMakerFeeUpdate(ctx, e.npv.makerFee) 536 } 537 538 if !e.npv.buyBackFee.Equal(num.DecimalFromInt64(-1)) { 539 mkt.OnFeeFactorsBuyBackFeeUpdate(ctx, e.npv.buyBackFee) 540 } 541 542 if !e.npv.treasuryFee.Equal(num.DecimalFromInt64(-1)) { 543 mkt.OnFeeFactorsTreasuryFeeUpdate(ctx, e.npv.treasuryFee) 544 } 545 546 if e.npv.marketValueWindowLength != -1 { 547 mkt.OnMarketValueWindowLengthUpdate(e.npv.marketValueWindowLength) 548 } 549 550 if e.npv.markPriceUpdateMaximumFrequency > 0 { 551 mkt.OnMarkPriceUpdateMaximumFrequency(ctx, e.npv.markPriceUpdateMaximumFrequency) 552 } 553 554 if !e.npv.liquidityV2EarlyExitPenalty.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 555 mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(e.npv.liquidityV2EarlyExitPenalty) 556 } 557 558 if !e.npv.liquidityV2MaxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 559 mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(e.npv.liquidityV2MaxLiquidityFee) 560 } 561 562 if !e.npv.liquidityV2SLANonPerformanceBondPenaltySlope.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 563 mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltySlope) 564 } 565 566 if !e.npv.liquidityV2SLANonPerformanceBondPenaltyMax.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 567 mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltyMax) 568 } 569 570 if !e.npv.liquidityV2StakeToCCYVolume.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 571 mkt.OnMarketLiquidityV2StakeToCCYVolume(e.npv.liquidityV2StakeToCCYVolume) 572 } 573 574 mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, e.npv.marketPartiesMaximumStopOrdersUpdate) 575 mkt.OnMinimalHoldingQuantumMultipleUpdate(e.minHoldingQuantumMultiplier) 576 577 e.propagateSLANetParams(ctx, mkt, isRestore) 578 579 if !e.npv.liquidityELSFeeFraction.IsZero() { 580 mkt.OnMarketLiquidityEquityLikeShareFeeFractionUpdate(e.npv.liquidityELSFeeFraction) 581 } 582 return nil 583 } 584 585 func (e *Engine) propagateInitialNetParamsToFutureMarket(ctx context.Context, mkt *future.Market, isRestore bool) error { 586 if !e.npv.probabilityOfTradingTauScaling.Equal(num.DecimalFromInt64(-1)) { 587 mkt.OnMarketProbabilityOfTradingTauScalingUpdate(ctx, e.npv.probabilityOfTradingTauScaling) 588 } 589 if !e.npv.minProbabilityOfTradingLPOrders.Equal(num.DecimalFromInt64(-1)) { 590 mkt.OnMarketMinProbabilityOfTradingLPOrdersUpdate(ctx, e.npv.minProbabilityOfTradingLPOrders) 591 } 592 if !e.npv.minLpStakeQuantumMultiple.Equal(num.DecimalFromInt64(-1)) { 593 mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, e.npv.minLpStakeQuantumMultiple) 594 } 595 if e.npv.auctionMinDuration != -1 { 596 mkt.OnMarketAuctionMinimumDurationUpdate(ctx, e.npv.auctionMinDuration) 597 } 598 if e.npv.auctionMaxDuration > 0 { 599 mkt.OnMarketAuctionMaximumDurationUpdate(ctx, e.npv.auctionMaxDuration) 600 } 601 602 if !e.npv.infrastructureFee.Equal(num.DecimalFromInt64(-1)) { 603 mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, e.npv.infrastructureFee) 604 } 605 606 if !e.npv.makerFee.Equal(num.DecimalFromInt64(-1)) { 607 mkt.OnFeeFactorsMakerFeeUpdate(ctx, e.npv.makerFee) 608 } 609 610 if !e.npv.buyBackFee.Equal(num.DecimalFromInt64(-1)) { 611 mkt.OnFeeFactorsBuyBackFeeUpdate(ctx, e.npv.buyBackFee) 612 } 613 614 if !e.npv.treasuryFee.Equal(num.DecimalFromInt64(-1)) { 615 mkt.OnFeeFactorsTreasuryFeeUpdate(ctx, e.npv.treasuryFee) 616 } 617 618 if e.npv.scalingFactors != nil { 619 if err := mkt.OnMarginScalingFactorsUpdate(ctx, e.npv.scalingFactors); err != nil { 620 return err 621 } 622 } 623 624 if e.npv.marketValueWindowLength != -1 { 625 mkt.OnMarketValueWindowLengthUpdate(e.npv.marketValueWindowLength) 626 } 627 628 if !e.npv.maxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { 629 mkt.OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(e.npv.maxLiquidityFee) 630 } 631 if e.npv.markPriceUpdateMaximumFrequency > 0 { 632 mkt.OnMarkPriceUpdateMaximumFrequency(ctx, e.npv.markPriceUpdateMaximumFrequency) 633 } 634 if e.npv.internalCompositePriceUpdateFrequency > 0 { 635 mkt.OnInternalCompositePriceUpdateFrequency(ctx, e.npv.internalCompositePriceUpdateFrequency) 636 } 637 if !e.npv.liquidityELSFeeFraction.IsZero() { 638 mkt.OnMarketLiquidityEquityLikeShareFeeFractionUpdate(e.npv.liquidityELSFeeFraction) 639 } 640 641 mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, e.npv.marketPartiesMaximumStopOrdersUpdate) 642 mkt.OnMinimalMarginQuantumMultipleUpdate(e.minMaintenanceMarginQuantumMultiplier) 643 644 mkt.OnAMMMinCommitmentQuantumUpdate(ctx, e.npv.ammCommitmentQuantum) 645 mkt.OnMarketAMMMaxCalculationLevels(ctx, e.npv.ammCalculationLevels) 646 647 e.propagateSLANetParams(ctx, mkt, isRestore) 648 649 return nil 650 } 651 652 func (e *Engine) propagateSLANetParams(_ context.Context, mkt common.CommonMarket, isRestore bool) { 653 if !e.npv.liquidityV2BondPenaltyFactor.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 654 mkt.OnMarketLiquidityV2BondPenaltyFactorUpdate(e.npv.liquidityV2BondPenaltyFactor) 655 } 656 657 if !e.npv.liquidityV2EarlyExitPenalty.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 658 mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(e.npv.liquidityV2EarlyExitPenalty) 659 } 660 661 if !e.npv.liquidityV2MaxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 662 mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(e.npv.liquidityV2MaxLiquidityFee) 663 } 664 665 if !e.npv.liquidityV2SLANonPerformanceBondPenaltySlope.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 666 mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltySlope) 667 } 668 669 if !e.npv.liquidityV2SLANonPerformanceBondPenaltyMax.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 670 mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltyMax) 671 } 672 673 if !e.npv.liquidityV2StakeToCCYVolume.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck 674 mkt.OnMarketLiquidityV2StakeToCCYVolume(e.npv.liquidityV2StakeToCCYVolume) 675 } 676 677 if !isRestore && e.npv.liquidityV2ProvidersFeeCalculationTimeStep != 0 { 678 mkt.OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(e.npv.liquidityV2ProvidersFeeCalculationTimeStep) 679 } 680 }