code.vegaprotocol.io/vega@v0.79.0/core/governance/engine_update_volume_rebate_program_test.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_test 17 18 import ( 19 "testing" 20 "time" 21 22 "code.vegaprotocol.io/vega/core/events" 23 "code.vegaprotocol.io/vega/core/netparams" 24 "code.vegaprotocol.io/vega/core/types" 25 "code.vegaprotocol.io/vega/libs/num" 26 vgrand "code.vegaprotocol.io/vega/libs/rand" 27 vgtest "code.vegaprotocol.io/vega/libs/test" 28 29 "github.com/golang/mock/gomock" 30 "github.com/stretchr/testify/require" 31 ) 32 33 func TestProposalForUpdateVolumeRebateProgram(t *testing.T) { 34 t.Run("Submitting a proposal for referral program update succeeds", testSubmittingProposalForVolumeRebateProgramUpdateSucceeds) 35 t.Run("Submitting a proposal for referral program update with too many tiers fails", testSubmittingProposalForVolumeRebateProgramUpdateWithTooManyTiersFails) 36 } 37 38 func testSubmittingProposalForVolumeRebateProgramUpdateSucceeds(t *testing.T) { 39 now := time.Now() 40 ctx := vgtest.VegaContext(vgrand.RandomStr(5), vgtest.RandomPositiveI64()) 41 eng := getTestEngine(t, now) 42 43 // setup 44 eng.broker.EXPECT().Send(gomock.Any()).Times(3) 45 eng.netp.Update(ctx, netparams.GovernanceProposalVolumeRebateProgramMinClose, "48h") 46 eng.netp.Update(ctx, netparams.GovernanceProposalVolumeRebateProgramMinEnact, "48h") 47 eng.netp.Update(ctx, netparams.GovernanceProposalVolumeRebateProgramMinProposerBalance, "1000") 48 49 eng.broker.EXPECT().Send(events.NewNetworkParameterEvent(ctx, netparams.VolumeRebateProgramMaxBenefitTiers, "2")).Times(1) 50 require.NoError(t, eng.netp.Update(ctx, netparams.VolumeRebateProgramMaxBenefitTiers, "2")) 51 52 // given 53 proposer := vgrand.RandomStr(5) 54 proposal := eng.newProposalForVolumeRebateProgramUpdate(proposer, now, &types.VolumeRebateProgramChanges{ 55 EndOfProgramTimestamp: now.Add(4 * 48 * time.Hour), 56 WindowLength: 15, 57 VolumeRebateBenefitTiers: []*types.VolumeRebateBenefitTier{ 58 { 59 MinimumPartyMakerVolumeFraction: num.DecimalFromFloat(0.1), 60 AdditionalMakerRebate: num.DecimalFromFloat(0.00001), 61 }, { 62 MinimumPartyMakerVolumeFraction: num.DecimalFromFloat(0.2), 63 AdditionalMakerRebate: num.DecimalFromFloat(0.00002), 64 }, 65 }, 66 }) 67 68 // setup 69 eng.ensureTokenBalanceForParty(t, proposer, 1000) 70 71 // expect 72 eng.expectOpenProposalEvent(t, proposer, proposal.ID) 73 74 // when 75 toSubmit, err := eng.submitProposal(t, proposal) 76 77 // then 78 require.NoError(t, err) 79 require.NotNil(t, toSubmit) 80 } 81 82 func testSubmittingProposalForVolumeRebateProgramUpdateWithTooManyTiersFails(t *testing.T) { 83 now := time.Now() 84 ctx := vgtest.VegaContext(vgrand.RandomStr(5), vgtest.RandomPositiveI64()) 85 eng := getTestEngine(t, now) 86 87 // setup 88 eng.broker.EXPECT().Send(gomock.Any()).Times(3) 89 eng.netp.Update(ctx, netparams.GovernanceProposalVolumeRebateProgramMinClose, "48h") 90 eng.netp.Update(ctx, netparams.GovernanceProposalVolumeRebateProgramMinEnact, "48h") 91 eng.netp.Update(ctx, netparams.GovernanceProposalVolumeRebateProgramMinProposerBalance, "1000") 92 93 eng.broker.EXPECT().Send(events.NewNetworkParameterEvent(ctx, netparams.VolumeRebateProgramMaxBenefitTiers, "1")).Times(1) 94 require.NoError(t, eng.netp.Update(ctx, netparams.VolumeRebateProgramMaxBenefitTiers, "1")) 95 96 // given 97 proposer := vgrand.RandomStr(5) 98 proposal := eng.newProposalForVolumeRebateProgramUpdate(proposer, now, &types.VolumeRebateProgramChanges{ 99 EndOfProgramTimestamp: now.Add(4 * 48 * time.Hour), 100 WindowLength: 15, 101 VolumeRebateBenefitTiers: []*types.VolumeRebateBenefitTier{ 102 { 103 MinimumPartyMakerVolumeFraction: num.DecimalFromFloat(0.1), 104 AdditionalMakerRebate: num.DecimalFromFloat(0.001), 105 }, { 106 MinimumPartyMakerVolumeFraction: num.DecimalFromFloat(0.2), 107 AdditionalMakerRebate: num.DecimalFromFloat(0.002), 108 }, 109 }, 110 }) 111 112 // setup 113 eng.ensureTokenBalanceForParty(t, proposer, 1000) 114 115 // expect 116 eng.expectRejectedProposalEvent(t, proposer, proposal.ID, types.ProposalErrorInvalidVolumeRebateProgram) 117 118 // when 119 toSubmit, err := eng.submitProposal(t, proposal) 120 121 // then 122 require.Error(t, err) 123 require.Nil(t, toSubmit) 124 }