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  }