code.vegaprotocol.io/vega@v0.79.0/core/governance/volume_discount_program.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 governance 17 18 import ( 19 "fmt" 20 21 "code.vegaprotocol.io/vega/core/netparams" 22 "code.vegaprotocol.io/vega/core/types" 23 ) 24 25 func validateUpdateVolumeDiscountProgram(netp NetParams, p *types.UpdateVolumeDiscountProgram) (types.ProposalError, error) { 26 maxTiers, _ := netp.GetUint(netparams.VolumeDiscountProgramMaxBenefitTiers) 27 if len(p.Changes.VolumeBenefitTiers) > int(maxTiers.Uint64()) { 28 return types.ProposalErrorInvalidVolumeDiscountProgram, fmt.Errorf("the number of tiers in the proposal is higher than the maximum allowed by the network parameter %q: maximum is %s, but got %d", netparams.VolumeDiscountProgramMaxBenefitTiers, maxTiers.String(), len(p.Changes.VolumeBenefitTiers)) 29 } 30 31 maxDiscountFactor, _ := netp.GetDecimal(netparams.VolumeDiscountProgramMaxVolumeDiscountFactor) 32 for i, tier := range p.Changes.VolumeBenefitTiers { 33 if tier.VolumeDiscountFactors.Infra.GreaterThan(maxDiscountFactor) { 34 return types.ProposalErrorInvalidVolumeDiscountProgram, fmt.Errorf("tier %d defines a volume discount infrastructure factor higher than the maximum allowed by the network parameter %q: maximum is %s, but got %s", i+1, netparams.VolumeDiscountProgramMaxVolumeDiscountFactor, maxDiscountFactor.String(), tier.VolumeDiscountFactors.Infra.String()) 35 } 36 if tier.VolumeDiscountFactors.Maker.GreaterThan(maxDiscountFactor) { 37 return types.ProposalErrorInvalidVolumeDiscountProgram, fmt.Errorf("tier %d defines a volume discount maker factor higher than the maximum allowed by the network parameter %q: maximum is %s, but got %s", i+1, netparams.VolumeDiscountProgramMaxVolumeDiscountFactor, maxDiscountFactor.String(), tier.VolumeDiscountFactors.Maker.String()) 38 } 39 if tier.VolumeDiscountFactors.Liquidity.GreaterThan(maxDiscountFactor) { 40 return types.ProposalErrorInvalidVolumeDiscountProgram, fmt.Errorf("tier %d defines a volume discount liquidity factor higher than the maximum allowed by the network parameter %q: maximum is %s, but got %s", i+1, netparams.VolumeDiscountProgramMaxVolumeDiscountFactor, maxDiscountFactor.String(), tier.VolumeDiscountFactors.Liquidity.String()) 41 } 42 } 43 return 0, nil 44 } 45 46 func updatedVolumeDiscountProgramFromProposal(p *proposal) *types.VolumeDiscountProgram { 47 terms := p.Terms.GetUpdateVolumeDiscountProgram() 48 49 return &types.VolumeDiscountProgram{ 50 ID: p.ID, 51 Version: terms.Changes.Version, 52 EndOfProgramTimestamp: terms.Changes.EndOfProgramTimestamp, 53 WindowLength: terms.Changes.WindowLength, 54 VolumeBenefitTiers: terms.Changes.VolumeBenefitTiers, 55 } 56 }