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 }