code.vegaprotocol.io/vega@v0.79.0/core/netparams/defaults.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 netparams
    17  
    18  import (
    19  	"errors"
    20  	"fmt"
    21  	"time"
    22  
    23  	"code.vegaprotocol.io/vega/core/netparams/checks"
    24  	"code.vegaprotocol.io/vega/core/types"
    25  	"code.vegaprotocol.io/vega/libs/crypto"
    26  	"code.vegaprotocol.io/vega/libs/num"
    27  	proto "code.vegaprotocol.io/vega/protos/vega"
    28  )
    29  
    30  const (
    31  	week = "168h0m0s"
    32  )
    33  
    34  var (
    35  	// Decimals.
    36  	gtD0     = DecimalGT(num.DecimalZero())
    37  	gteD0    = DecimalGTE(num.DecimalZero())
    38  	gteD1    = DecimalGTE(num.DecimalOne())
    39  	lteD1    = DecimalLTE(num.DecimalOne())
    40  	lteD100  = DecimalLTE(num.DecimalFromInt64(100))
    41  	lteD1000 = DecimalLTE(num.DecimalFromInt64(1000))
    42  
    43  	// Uints.
    44  	gteU0  = UintGTE(num.UintZero())
    45  	lteU1  = UintLTE(num.NewUint(1))
    46  	gteU1  = UintGTE(num.NewUint(1))
    47  	gteU5  = UintGTE(num.NewUint(5))
    48  	ltMaxU = UintLT(num.MaxUint())
    49  
    50  	// Ints.
    51  	gteI0    = IntGTE(0)
    52  	gteI1    = IntGTE(1)
    53  	lteI500  = IntLTE(500)
    54  	lteI1000 = IntLTE(1000)
    55  	lteI1    = IntLTE(1)
    56  
    57  	// Durations.
    58  	gte0s   = DurationGTE(0 * time.Second)
    59  	gte1s   = DurationGTE(1 * time.Second)
    60  	gte1m   = DurationGTE(1 * time.Minute)
    61  	lte1h   = DurationLTE(1 * time.Hour)
    62  	lte1d   = DurationLTE(24 * time.Hour)
    63  	lte255h = DurationLTE(255 * time.Hour)
    64  	lte1mo  = DurationLTE(30 * 24 * time.Hour)
    65  	lte1y   = DurationLTE(365 * 24 * time.Hour)
    66  )
    67  
    68  func defaultNetParams() map[string]value {
    69  	m := map[string]value{
    70  		NetworkWideAuctionDuration:    NewJSON(&proto.LongBlockAuctionDurationTable{}, checks.LongBlockAuctionDurationTable()).Mutable(true).MustUpdate(`{"threshold_and_duration": [{"threshold":"10s","duration":"1m"},{"threshold":"1m","duration":"5m"},{"threshold":"10m","duration":"1h"},{"threshold":"1h","duration":"1h"},{"threshold":"6h","duration":"3h"},{"threshold":"24h","duration":"6h"}]}`),
    71  		MinimumMarginQuantumMultiple:  NewDecimal(gteD0).Mutable(true).MustUpdate("0.01"),
    72  		MinimumHoldingQuantumMultiple: NewDecimal(gteD0).Mutable(true).MustUpdate("0.01"),
    73  
    74  		// spots
    75  		SpotMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("1"),
    76  
    77  		// perps
    78  		PerpsMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("0"),
    79  
    80  		// AMMs
    81  		AMMMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("0"),
    82  
    83  		// ethereum oracles
    84  		EthereumOraclesEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("0"),
    85  
    86  		MarketAMMMinCommitmentQuantum: NewUint(gteU0).Mutable(true).MustUpdate("100"),
    87  		MarketAMMMaxCalculationLevels: NewUint(gteU1).Mutable(true).MustUpdate("100"),
    88  
    89  		// markets
    90  		MarketAggressiveOrderBlockDelay:           NewUint(gteU0).Mutable(true).MustUpdate("1"),
    91  		MarketMarginScalingFactors:                NewJSON(&proto.ScalingFactors{}, checks.MarginScalingFactor(), checks.MarginScalingFactorRange(num.DecimalOne(), num.DecimalFromInt64(100))).Mutable(true).MustUpdate(`{"search_level": 1.1, "initial_margin": 1.2, "collateral_release": 1.4}`),
    92  		MarketFeeFactorsMakerFee:                  NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00025"),
    93  		MarketFeeFactorsInfrastructureFee:         NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.0005"),
    94  		MarketFeeFactorsBuyBackFee:                NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0"),
    95  		MarketFeeFactorsTreasuryFee:               NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0"),
    96  		MarketAuctionMinimumDuration:              NewDuration(gte1s, lte1d).Mutable(true).MustUpdate("30m0s"),
    97  		MarketAuctionMaximumDuration:              NewDuration(gte1s, lte1mo).Mutable(true).MustUpdate(week),
    98  		MarketLiquidityTargetStakeTriggeringRatio: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0"),
    99  		MarketProbabilityOfTradingTauScaling:      NewDecimal(DecimalGTE(num.MustDecimalFromString("0.0001")), lteD1000).Mutable(true).MustUpdate("1"),
   100  		MarketMinProbabilityOfTradingForLPOrders:  NewDecimal(DecimalGTE(num.MustDecimalFromString("1e-12")), DecimalLTE(num.MustDecimalFromString("0.1"))).Mutable(true).MustUpdate("1e-8"),
   101  		MarketTargetStakeTimeWindow:               NewDuration(gte1s, lte1mo).Mutable(true).MustUpdate("1h0m0s"),
   102  		MarketTargetStakeScalingFactor:            NewDecimal(gtD0, lteD100).Mutable(true).MustUpdate("10"),
   103  		MarketValueWindowLength:                   NewDuration(gte1m, lte1mo).Mutable(true).MustUpdate(week),
   104  		MarketPriceMonitoringDefaultParameters:    NewJSON(&proto.PriceMonitoringParameters{}, checks.PriceMonitoringParametersAuctionExtension(5*time.Second, 30*24*time.Hour), checks.PriceMonitoringParametersHorizon(5*time.Second, 30*24*time.Hour), checks.PriceMonitoringParametersProbability(num.DecimalFromFloat(0.9), num.DecimalOne())).Mutable(true).MustUpdate(`{"triggers": []}`),
   105  		MarketLiquidityProvisionShapesMaxSize:     NewInt(gteI1, lteI1000).Mutable(true).MustUpdate("5"),
   106  		MarketMinLpStakeQuantumMultiple:           NewDecimal(gtD0, DecimalLT(num.MustDecimalFromString("1e10"))).Mutable(true).MustUpdate("1"),
   107  		RewardMarketCreationQuantumMultiple:       NewDecimal(gteD1, DecimalLT(num.MustDecimalFromString("1e20"))).Mutable(true).MustUpdate("10000000"),
   108  
   109  		MarketLiquidityBondPenaltyParameter:              NewDecimal(gteD0, lteD1000).Mutable(true).MustUpdate("0.1"),
   110  		MarketLiquidityEarlyExitPenalty:                  NewDecimal(gteD0, lteD1000).Mutable(true).MustUpdate("0.05"),
   111  		MarketLiquidityMaximumLiquidityFeeFactorLevel:    NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("1"),
   112  		MarketLiquiditySLANonPerformanceBondPenaltyMax:   NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.05"),
   113  		MarketLiquiditySLANonPerformanceBondPenaltySlope: NewDecimal(gteD0, lteD1000).Mutable(true).MustUpdate("1"),
   114  		MarketLiquidityStakeToCCYVolume:                  NewDecimal(gteD0, lteD100).Mutable(true).MustUpdate("1"),
   115  		MarketLiquidityProvidersFeeCalculationTimeStep:   NewDuration(gte1s, lte255h).Mutable(true).MustUpdate("1m"),
   116  		MarketLiquidityEquityLikeShareFeeFraction:        NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("1"),
   117  
   118  		// governance market proposal
   119  		GovernanceProposalMarketMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   120  		GovernanceProposalMarketMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   121  		GovernanceProposalMarketMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   122  		GovernanceProposalMarketMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   123  		GovernanceProposalMarketRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00001"),
   124  		GovernanceProposalMarketRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   125  		GovernanceProposalMarketMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   126  		GovernanceProposalMarketMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   127  
   128  		// governance asset proposal
   129  		GovernanceProposalAssetMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   130  		GovernanceProposalAssetMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   131  		GovernanceProposalAssetMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   132  		GovernanceProposalAssetMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   133  		GovernanceProposalAssetRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00001"),
   134  		GovernanceProposalAssetRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   135  		GovernanceProposalAssetMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   136  		GovernanceProposalAssetMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   137  
   138  		// governance update asset proposal
   139  		GovernanceProposalUpdateAssetMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   140  		GovernanceProposalUpdateAssetMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   141  		GovernanceProposalUpdateAssetMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   142  		GovernanceProposalUpdateAssetMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   143  		GovernanceProposalUpdateAssetRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00001"),
   144  		GovernanceProposalUpdateAssetRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   145  		GovernanceProposalUpdateAssetMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   146  		GovernanceProposalUpdateAssetMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   147  
   148  		// governance update market proposal
   149  		GovernanceProposalUpdateMarketMinClose:                   NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   150  		GovernanceProposalUpdateMarketMaxClose:                   NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   151  		GovernanceProposalUpdateMarketMinEnact:                   NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   152  		GovernanceProposalUpdateMarketMaxEnact:                   NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   153  		GovernanceProposalUpdateMarketRequiredParticipation:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00001"),
   154  		GovernanceProposalUpdateMarketRequiredMajority:           NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   155  		GovernanceProposalUpdateMarketMinProposerBalance:         NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   156  		GovernanceProposalUpdateMarketMinVoterBalance:            NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   157  		GovernanceProposalUpdateMarketRequiredParticipationLP:    NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00001"),
   158  		GovernanceProposalUpdateMarketRequiredMajorityLP:         NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   159  		GovernanceProposalUpdateMarketMinProposerEquityLikeShare: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   160  
   161  		// governance UpdateNetParam proposal
   162  		GovernanceProposalUpdateNetParamMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   163  		GovernanceProposalUpdateNetParamMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   164  		GovernanceProposalUpdateNetParamMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   165  		GovernanceProposalUpdateNetParamMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   166  		GovernanceProposalUpdateNetParamRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00001"),
   167  		GovernanceProposalUpdateNetParamRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   168  		GovernanceProposalUpdateNetParamMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   169  		GovernanceProposalUpdateNetParamMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   170  
   171  		// governance Freeform proposal
   172  		GovernanceProposalFreeformMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   173  		GovernanceProposalFreeformMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   174  		GovernanceProposalFreeformRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00001"),
   175  		GovernanceProposalFreeformRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   176  		GovernanceProposalFreeformMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   177  		GovernanceProposalFreeformMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   178  
   179  		// governance transfer proposal
   180  		GovernanceProposalTransferMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   181  		GovernanceProposalTransferMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   182  		GovernanceProposalTransferRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00001"),
   183  		GovernanceProposalTransferMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"),
   184  		GovernanceProposalTransferMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   185  		GovernanceProposalTransferRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   186  		GovernanceProposalTransferMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   187  		GovernanceProposalTransferMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1"),
   188  		GovernanceTransferMaxAmount:                     NewDecimal(gteD1).Mutable(true).MustUpdate("7000"),
   189  		GovernanceTransferMaxFraction:                   NewDecimal(gtD0, lteD1).Mutable(true).MustUpdate("1"),
   190  
   191  		// Update referral program.
   192  		GovernanceProposalReferralProgramMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("120h0m0s"),
   193  		GovernanceProposalReferralProgramMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   194  		GovernanceProposalReferralProgramMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("120h0m0s"),
   195  		GovernanceProposalReferralProgramMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   196  		GovernanceProposalReferralProgramRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.01"),
   197  		GovernanceProposalReferralProgramRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   198  		GovernanceProposalReferralProgramMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("10000000000000000000000"),
   199  		GovernanceProposalReferralProgramMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1000000000000000000"),
   200  
   201  		GovernanceProposalVolumeDiscountProgramMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("120h0m0s"),
   202  		GovernanceProposalVolumeDiscountProgramMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   203  		GovernanceProposalVolumeDiscountProgramMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("120h0m0s"),
   204  		GovernanceProposalVolumeDiscountProgramMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   205  		GovernanceProposalVolumeDiscountProgramRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.01"),
   206  		GovernanceProposalVolumeDiscountProgramRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   207  		GovernanceProposalVolumeDiscountProgramMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("10000000000000000000000"),
   208  		GovernanceProposalVolumeDiscountProgramMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1000000000000000000"),
   209  
   210  		GovernanceProposalVolumeRebateProgramMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("120h0m0s"),
   211  		GovernanceProposalVolumeRebateProgramMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   212  		GovernanceProposalVolumeRebateProgramMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("120h0m0s"),
   213  		GovernanceProposalVolumeRebateProgramMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   214  		GovernanceProposalVolumeRebateProgramRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.01"),
   215  		GovernanceProposalVolumeRebateProgramRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   216  		GovernanceProposalVolumeRebateProgramMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("10000000000000000000000"),
   217  		GovernanceProposalVolumeRebateProgramMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1000000000000000000"),
   218  
   219  		GovernanceProposalAutomatedPurchaseConfigMinClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("120h0m0s"),
   220  		GovernanceProposalAutomatedPurchaseConfigMaxClose:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   221  		GovernanceProposalAutomatedPurchaseConfigMinEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("120h0m0s"),
   222  		GovernanceProposalAutomatedPurchaseConfigMaxEnact:              NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("8760h0m0s"),
   223  		GovernanceProposalAutomatedPurchaseConfigRequiredParticipation: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.01"),
   224  		GovernanceProposalAutomatedPurchaseConfigRequiredMajority:      NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.66"),
   225  		GovernanceProposalAutomatedPurchaseConfigMinProposerBalance:    NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("10000000000000000000000"),
   226  		GovernanceProposalAutomatedPurchaseConfigMinVoterBalance:       NewUint(gteU1, ltMaxU).Mutable(true).MustUpdate("1000000000000000000"),
   227  
   228  		// Delegation default params
   229  		DelegationMinAmount: NewDecimal(gtD0).Mutable(true).MustUpdate("1"),
   230  
   231  		// staking and delegation
   232  		StakingAndDelegationRewardPayoutFraction:          NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("1.0"),
   233  		StakingAndDelegationRewardPayoutDelay:             NewDuration(DurationGTE(0 * time.Second)).Mutable(true).MustUpdate("24h0m0s"),
   234  		StakingAndDelegationRewardMaxPayoutPerParticipant: NewDecimal(gteD0).Mutable(true).MustUpdate("0"),
   235  		StakingAndDelegationRewardDelegatorShare:          NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.883"),
   236  		StakingAndDelegationRewardMinimumValidatorStake:   NewDecimal(gteD0).Mutable(true).MustUpdate("0"),
   237  		StakingAndDelegationRewardCompetitionLevel:        NewDecimal(gteD1).Mutable(true).MustUpdate("1.1"),
   238  		StakingAndDelegationRewardMaxPayoutPerEpoch:       NewDecimal(gteD0).Mutable(true).MustUpdate("7000000000000000000000"),
   239  		StakingAndDelegationRewardsMinValidators:          NewInt(gteI1, lteI500).Mutable(true).MustUpdate("5"),
   240  		StakingAndDelegationRewardOptimalStakeMultiplier:  NewDecimal(gteD1).Mutable(true).MustUpdate("3.0"),
   241  
   242  		// team rewards - //TODO review the constraint and defaults
   243  		MinEpochsInTeamForMetricRewardEligibility: NewInt(gteI0, lteI500).Mutable(true).MustUpdate("5"),
   244  
   245  		// spam protection policies
   246  		SpamProtectionMaxVotes:                         NewInt(gteI1).Mutable(true).MustUpdate("3"),
   247  		SpamProtectionMinTokensForVoting:               NewDecimal(gteD1).Mutable(true).MustUpdate("100000000000000000000"),
   248  		SpamProtectionMaxProposals:                     NewInt(gteI1).Mutable(true).MustUpdate("3"),
   249  		SpamProtectionMinTokensForProposal:             NewDecimal(gteD1).Mutable(true).MustUpdate("100000000000000000000000"),
   250  		SpamProtectionMaxDelegations:                   NewInt(gteI1).Mutable(true).MustUpdate("390"),
   251  		SpamProtectionMinTokensForDelegation:           NewDecimal(gteD1).Mutable(true).MustUpdate("1000000000000000000"),
   252  		SpamProtectionMinimumWithdrawalQuantumMultiple: NewDecimal(gtD0, DecimalLT(num.MustDecimalFromString("1e6"))).Mutable(true).MustUpdate("10"),
   253  		SpamProtectionMinMultisigUpdates:               NewDecimal(gteD1).Mutable(true).MustUpdate("100000000000000000000"),
   254  		SpamProtectionMaxMultisigUpdates:               NewInt(gteI0).Mutable(true).MustUpdate("4"),
   255  		SpamProtectionMaxCreateReferralSet:             NewInt(gteI0).Mutable(true).MustUpdate("3"),
   256  		SpamProtectionMaxUpdateReferralSet:             NewInt(gteI0).Mutable(true).MustUpdate("3"),
   257  		SpamProtectionMaxApplyReferralCode:             NewInt(gteI0).Mutable(true).MustUpdate("5"),
   258  		SpamProtectionBalanceSnapshotFrequency:         NewDuration(gte0s, lte1h).Mutable(true).MustUpdate("5s"),
   259  		SpamProtectionApplyReferralMinFunds:            NewUint(UintGTE(num.NewUint(0))).Mutable(true).MustUpdate("10"),
   260  		SpamProtectionReferralSetMinFunds:              NewUint(UintGTE(num.NewUint(0))).Mutable(true).MustUpdate("10"),
   261  		SpamProtectionMaxUpdatePartyProfile:            NewInt(gteI0).Mutable(true).MustUpdate("10"),
   262  		SpamProtectionUpdateProfileMinFunds:            NewUint(UintGTE(num.NewUint(0))).Mutable(true).MustUpdate("10"),
   263  
   264  		// no validation for this initially as we configure the
   265  		// the bootstrapping asset.
   266  		// validation will be added at node startup, so we can use dynamic stuff
   267  		// e.g: assets and collateral when setting up a new ID.
   268  		RewardAsset: NewString().Mutable(true).MustUpdate("VOTE"),
   269  
   270  		BlockchainsEthereumL2Configs: NewJSON(&proto.EthereumL2Configs{}, types.CheckUntypedEthereumL2Configs).Mutable(true).
   271  			MustUpdate(`{"configs":[{"network_id":"100","chain_id":"100","confirmations":3,"name":"Gnosis Chain", "block_interval": 3}, {"network_id":"42161","chain_id":"42161","confirmations":3,"name":"Arbitrum One", "block_interval": 50}]}`),
   272  		BlockchainsPrimaryEthereumConfig: NewJSON(&proto.EthereumConfig{}, types.CheckUntypedEthereumConfig).Mutable(true).
   273  			MustUpdate(`{"network_id": "XXX", "chain_id": "XXX", "collateral_bridge_contract": { "address": "0xXXX" }, "confirmations": 3, "staking_bridge_contract": { "address": "0xXXX", "deployment_block_height": 0}, "token_vesting_contract": { "address": "0xXXX", "deployment_block_height": 0 }, "multisig_control_contract": { "address": "0xXXX", "deployment_block_height": 0 }}`),
   274  		BlockchainsEVMBridgeConfigs: NewJSON(&proto.EVMBridgeConfigs{}, types.CheckUntypedEVMChainConfig).Mutable(true).
   275  			MustUpdate(`{"configs": [{"network_id": "XXX", "chain_id": "XXX", "collateral_bridge_contract": { "address": "0xXXX" }, "confirmations": 3, "multisig_control_contract": {"address": "0xXXX", "deployment_block_height": 0}}]}`),
   276  
   277  		ValidatorsEpochLength: NewDuration(gte1s, lte255h).Mutable(true).MustUpdate("24h0m0s"),
   278  
   279  		ValidatorsVoteRequired: NewDecimal(gtD0, lteD1).Mutable(true).MustUpdate("0.67"),
   280  
   281  		// network checkpoint parameters
   282  		NetworkCheckpointTimeElapsedBetweenCheckpoints: NewDuration(DurationGT(0 * time.Second)).Mutable(true).MustUpdate("1m"),
   283  		// take a snapshot every 1000 blocks, ~20 minutes
   284  		// if we assume a block time of anything between 1 to 2 seconds
   285  		SnapshotIntervalLength: NewUint(gteU1).Mutable(true).MustUpdate("1000"),
   286  
   287  		FloatingPointUpdatesDuration: NewDuration(DurationGTE(10*time.Second), DurationLTE(1*time.Hour)).Mutable(true).MustUpdate("5m"),
   288  
   289  		// validators by stake
   290  		NumberOfTendermintValidators:               NewUint(gteU1, UintLTE(num.NewUint(500))).Mutable(true).MustUpdate("30"),
   291  		ValidatorIncumbentBonus:                    NewDecimal(gteD0).Mutable(true).MustUpdate("1"),
   292  		NumberEthMultisigSigners:                   NewUint(gteU1, UintLTE(num.NewUint(500))).Mutable(true).MustUpdate("13"),
   293  		ErsatzvalidatorsRewardFactor:               NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.5"),
   294  		MultipleOfTendermintValidatorsForEtsatzSet: NewDecimal(gteD0).Mutable(true).MustUpdate("0.5"),
   295  		MinimumEthereumEventsForNewValidator:       NewUint(gteU0).Mutable(true).MustUpdate("3"),
   296  
   297  		// transfers
   298  		TransferFeeFactor:                       NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.001"),
   299  		TransferMinTransferQuantumMultiple:      NewDecimal(gteD0).Mutable(true).MustUpdate("0.1"),
   300  		TransferMaxCommandsPerEpoch:             NewInt(gteI0).Mutable(true).MustUpdate("20"),
   301  		TransferFeeMaxQuantumAmount:             NewDecimal(gteD0).Mutable(true).MustUpdate("1"),
   302  		TransferFeeDiscountDecayFraction:        NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.8"),
   303  		TransferFeeDiscountMinimumTrackedAmount: NewDecimal(gteD0).Mutable(true).MustUpdate("0.01"),
   304  
   305  		// pow
   306  		SpamPoWNumberOfPastBlocks:   NewUint(gteU5, UintLTE(num.NewUint(500))).Mutable(true).MustUpdate("100"),
   307  		SpamPoWDifficulty:           NewUint(gteU0, UintLTE(num.NewUint(256))).Mutable(true).MustUpdate("15"),
   308  		SpamPoWHashFunction:         NewString(checks.SpamPoWHashFunction([]string{crypto.Sha3})).Mutable(true).MustUpdate(crypto.Sha3),
   309  		SpamPoWNumberOfTxPerBlock:   NewUint(gteU1).Mutable(true).MustUpdate("2"),
   310  		SpamPoWIncreasingDifficulty: NewUint(gteU0, lteU1).Mutable(true).MustUpdate("0"),
   311  
   312  		LimitsProposeMarketEnabledFrom: NewString(checkOptionalRFC3339Date).Mutable(true).MustUpdate(""), // none by default
   313  		LimitsProposeAssetEnabledFrom:  NewString(checkOptionalRFC3339Date).Mutable(true).MustUpdate(""), // none by default
   314  
   315  		SpamProtectionMaxBatchSize: NewUint(UintGTE(num.NewUint(2)), UintLTE(num.NewUint(200))).Mutable(true).MustUpdate("15"),
   316  		MaxGasPerBlock:             NewUint(UintGTE(num.NewUint(100)), UintLTE(num.NewUint(10000000))).Mutable(true).MustUpdate("500000"),
   317  		DefaultGas:                 NewUint(UintGTE(num.NewUint(1)), UintLTE(num.NewUint(99))).Mutable(true).MustUpdate("1"),
   318  		MinBlockCapacity:           NewUint(UintGTE(num.NewUint(1)), UintLTE(num.NewUint(10000))).Mutable(true).MustUpdate("32"),
   319  		MaxPeggedOrders:            NewUint(UintGTE(num.NewUint(0)), UintLTE(num.NewUint(10000))).Mutable(true).MustUpdate("1500"),
   320  
   321  		MarkPriceUpdateMaximumFrequency:       NewDuration(gte0s, lte1h).Mutable(true).MustUpdate("5s"),
   322  		InternalCompositePriceUpdateFrequency: NewDuration(gte0s, lte1h).Mutable(true).MustUpdate("5s"),
   323  		ValidatorPerformanceScalingFactor:     NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0"),
   324  		MarketSuccessorLaunchWindow:           NewDuration(gte1s, lte1mo).Mutable(true).MustUpdate("168h"), // 168h == 7 days
   325  		SpamProtectionMaxStopOrdersPerMarket:  NewUint(UintGTE(num.UintZero()), UintLTE(num.NewUint(100))).Mutable(true).MustUpdate("4"),
   326  
   327  		RewardsVestingBaseRate:        NewDecimal(gtD0, lteD1).Mutable(true).MustUpdate("0.25"),
   328  		RewardsVestingMinimumTransfer: NewDecimal(gtD0).Mutable(true).MustUpdate("10"),
   329  		RewardsVestingBenefitTiers:    NewJSON(&proto.VestingBenefitTiers{}, types.CheckUntypedVestingBenefitTier).Mutable(true).MustUpdate(`{"tiers": []}`),
   330  		RewardsUpdateFrequency:        NewDuration(gte1s).Mutable(true).MustUpdate("10m"),
   331  
   332  		// Referral program
   333  		ReferralProgramMaxReferralTiers:                        NewUint(UintGTE(num.NewUint(0)), UintLTE(num.NewUint(100))).Mutable(true).MustUpdate("10"),
   334  		ReferralProgramMaxReferralRewardFactor:                 NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.5"),
   335  		ReferralProgramMaxReferralDiscountFactor:               NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.5"),
   336  		ReferralProgramMaxPartyNotionalVolumeByQuantumPerEpoch: NewUint(UintGTE(num.NewUint(0))).Mutable(true).MustUpdate("250000"),
   337  		ReferralProgramMinStakedVegaTokens:                     NewUint(UintGTE(num.NewUint(0))).Mutable(true).MustUpdate("0"),
   338  		ReferralProgramMaxReferralRewardProportion:             NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.5"),
   339  
   340  		VolumeDiscountProgramMaxVolumeDiscountFactor: NewDecimal(gteD0, DecimalLTE(num.MustDecimalFromString("1"))).Mutable(true).MustUpdate("0.9"),
   341  		VolumeDiscountProgramMaxBenefitTiers:         NewUint(UintGTE(num.NewUint(0)), UintLTE(num.NewUint(10))).Mutable(true).MustUpdate("10"),
   342  
   343  		VolumeRebateProgramMaxBenefitTiers: NewUint(UintGTE(num.NewUint(0)), UintLTE(num.NewUint(10))).Mutable(true).MustUpdate("10"),
   344  
   345  		RewardsActivityStreakInactivityLimit:       NewUint(UintGTE(num.UintOne()), UintLTE(num.NewUint(100))).Mutable(true).MustUpdate("3"),
   346  		RewardsActivityStreakBenefitTiers:          NewJSON(&proto.ActivityStreakBenefitTiers{}, types.CheckUntypedActivityStreakBenefitTier).Mutable(true).MustUpdate(`{"tiers": []}`),
   347  		RewardsActivityStreakMinQuantumOpenVolume:  NewUint().Mutable(true).MustUpdate("500"),
   348  		RewardsActivityStreakMinQuantumTradeVolume: NewUint().Mutable(true).MustUpdate("2500"),
   349  	}
   350  
   351  	// add additional cross net param rules
   352  	m[MarketAuctionMinimumDuration].AddRules(DurationDependentLT(MarketAuctionMaximumDuration, m[MarketAuctionMaximumDuration].(*Duration)))
   353  	m[MarketAuctionMaximumDuration].AddRules(DurationDependentGT(MarketAuctionMinimumDuration, m[MarketAuctionMinimumDuration].(*Duration)))
   354  
   355  	m[NumberEthMultisigSigners].AddRules(UintDependentLTE(NumberOfTendermintValidators, m[NumberOfTendermintValidators].(*Uint), num.MustDecimalFromString("1")))
   356  	m[NumberOfTendermintValidators].AddRules(UintDependentGTE(NumberEthMultisigSigners, m[NumberEthMultisigSigners].(*Uint), num.MustDecimalFromString("1")))
   357  
   358  	// ensure that MinBlockCapacity <= 2*
   359  	m[MaxGasPerBlock].AddRules(UintDependentGTE(MinBlockCapacity, m[MinBlockCapacity].(*Uint), num.MustDecimalFromString("2")))
   360  	m[MinBlockCapacity].AddRules(UintDependentLTE(MaxGasPerBlock, m[MaxGasPerBlock].(*Uint), num.MustDecimalFromString("0.5")))
   361  	m[MarkPriceUpdateMaximumFrequency].AddRules(DurationGT(time.Duration(0)))
   362  	// could just do 24 * 3600 * time.Second, but this is easier to read
   363  	maxFreq, _ := time.ParseDuration("24h")
   364  	m[MarkPriceUpdateMaximumFrequency].AddRules(DurationGT(time.Duration(0)), DurationLTE(maxFreq))
   365  
   366  	m[InternalCompositePriceUpdateFrequency].AddRules(DurationGT(time.Duration(0)))
   367  	// could just do 24 * 3600 * time.Second, but this is easier to read
   368  	m[InternalCompositePriceUpdateFrequency].AddRules(DurationGT(time.Duration(0)), DurationLTE(maxFreq))
   369  
   370  	m[MarketLiquidityProvidersFeeCalculationTimeStep].AddRules(
   371  		DurationDependentLTE(ValidatorsEpochLength, m[ValidatorsEpochLength].(*Duration)),
   372  	)
   373  	return m
   374  }
   375  
   376  func checkOptionalRFC3339Date(d string) error {
   377  	if len(d) <= 0 {
   378  		// an empty string is correct, it just disable the value.
   379  		return nil
   380  	}
   381  
   382  	// now let's just try to parse and see
   383  	_, err := time.Parse(time.RFC3339, d)
   384  	return err
   385  }
   386  
   387  func PriceMonitoringParametersValidation(i interface{}, _ interface{}) error {
   388  	pmp, ok := i.(*proto.PriceMonitoringParameters)
   389  	if !ok {
   390  		return errors.New("not a price monitoring parameters type")
   391  	}
   392  
   393  	for _, trigger := range pmp.Triggers {
   394  		if trigger.Horizon <= 0 {
   395  			return fmt.Errorf("triggers.horizon must be greater than `0`, got `%d`", trigger.Horizon)
   396  		}
   397  
   398  		probability, err := num.DecimalFromString(trigger.Probability)
   399  		if err != nil {
   400  			return fmt.Errorf("triggers.probability must be greater than `0`, got `%s`", trigger.Probability)
   401  		}
   402  
   403  		if probability.Cmp(num.DecimalZero()) <= 0 {
   404  			return fmt.Errorf("triggers.probability must be greater than `0`, got `%s`", trigger.Probability)
   405  		}
   406  		if probability.Cmp(num.DecimalFromInt64(1)) >= 0 {
   407  			return fmt.Errorf("triggers.probability must be lower than `1`, got `%s`", trigger.Probability)
   408  		}
   409  
   410  		if trigger.AuctionExtension <= 0 {
   411  			return fmt.Errorf("triggers.auction_extension must be greater than `0`, got `%d`", trigger.AuctionExtension)
   412  		}
   413  	}
   414  
   415  	return nil
   416  }