Skip to content

Commit ac7d25e

Browse files
authored
feat(incentives): rollapp gauges upgrade handler and burn creation fee (#1113)
1 parent bb2cd89 commit ac7d25e

File tree

17 files changed

+201
-168
lines changed

17 files changed

+201
-168
lines changed

app/apptesting/test_suite.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ func (s *KeeperTestHelper) CreateSequencerByPubkey(ctx sdk.Context, rollappId st
117117
func (s *KeeperTestHelper) PostStateUpdate(ctx sdk.Context, rollappId, seqAddr string, startHeight, numOfBlocks uint64) (lastHeight uint64, err error) {
118118
var bds rollapptypes.BlockDescriptors
119119
bds.BD = make([]rollapptypes.BlockDescriptor, numOfBlocks)
120-
for k := 0; k < int(numOfBlocks); k++ {
121-
bds.BD[k] = rollapptypes.BlockDescriptor{Height: startHeight + uint64(k), Timestamp: time.Now().UTC()}
120+
for k := uint64(0); k < numOfBlocks; k++ {
121+
bds.BD[k] = rollapptypes.BlockDescriptor{Height: startHeight + k, Timestamp: time.Now().UTC()}
122122
}
123123

124124
updateState := rollapptypes.MsgUpdateState{

app/keepers/keepers.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,6 @@ func (a *AppKeepers) InitKeepers(
378378
a.BankKeeper,
379379
a.LockupKeeper,
380380
a.EpochsKeeper,
381-
a.DistrKeeper,
382381
a.TxFeesKeeper,
383382
a.RollappKeeper,
384383
)

app/upgrades/v4/upgrade.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package v4
33
import (
44
"github.com/cometbft/cometbft/crypto"
55
"github.com/cosmos/cosmos-sdk/baseapp"
6-
epochskeeper "github.com/osmosis-labs/osmosis/v15/x/epochs/keeper"
76

87
sdk "github.com/cosmos/cosmos-sdk/types"
98
"github.com/cosmos/cosmos-sdk/types/module"
@@ -23,8 +22,8 @@ import (
2322

2423
evmtypes "github.com/evmos/ethermint/x/evm/types"
2524
feemarkettypes "github.com/evmos/ethermint/x/feemarket/types"
25+
epochskeeper "github.com/osmosis-labs/osmosis/v15/x/epochs/keeper"
2626

27-
// Ethermint modules
2827
"github.com/dymensionxyz/dymension/v3/app/keepers"
2928
"github.com/dymensionxyz/dymension/v3/app/upgrades"
3029
delayedackkeeper "github.com/dymensionxyz/dymension/v3/x/delayedack/keeper"
@@ -66,7 +65,9 @@ func CreateUpgradeHandler(
6665
}
6766
migrateIncentivesParams(ctx, keepers.IncentivesKeeper)
6867

69-
// TODO: create rollapp gauges for each existing rollapp (https://github.com/dymensionxyz/dymension/issues/1005)
68+
if err := migrateRollappGauges(ctx, keepers.RollappKeeper, keepers.IncentivesKeeper); err != nil {
69+
return nil, err
70+
}
7071

7172
// Start running the module migrations
7273
logger.Debug("running module migrations ...")
@@ -139,6 +140,18 @@ func migrateRollappParams(ctx sdk.Context, rollappkeeper *rollappkeeper.Keeper)
139140
rollappkeeper.SetParams(ctx, params)
140141
}
141142

143+
// migrateRollappGauges creates a gauge for each rollapp in the store
144+
func migrateRollappGauges(ctx sdk.Context, rollappkeeper *rollappkeeper.Keeper, incentivizeKeeper *incentiveskeeper.Keeper) error {
145+
rollapps := rollappkeeper.GetAllRollapps(ctx)
146+
for _, rollapp := range rollapps {
147+
_, err := incentivizeKeeper.CreateRollappGauge(ctx, rollapp.RollappId)
148+
if err != nil {
149+
return err
150+
}
151+
}
152+
return nil
153+
}
154+
142155
func migrateRollapps(ctx sdk.Context, rollappkeeper *rollappkeeper.Keeper) error {
143156
list := rollappkeeper.GetAllRollapps(ctx)
144157
for _, oldRollapp := range list {

app/upgrades/v4/upgrade_test.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,12 @@ func (s *UpgradeTestSuite) TestUpgrade() {
121121
return
122122
}
123123

124-
s.validateStreamerMigration()
124+
// Check rollapp gauges
125+
if err = s.validateRollappGaugesMigration(); err != nil {
126+
return
127+
}
125128

126-
// TODO: check for rollapp gauges creation
129+
s.validateStreamerMigration()
127130

128131
return
129132
},
@@ -192,6 +195,39 @@ func (s *UpgradeTestSuite) validateRollappsMigration(numRoll int) error {
192195
return nil
193196
}
194197

198+
// validate rollapp gauges
199+
func (s *UpgradeTestSuite) validateRollappGaugesMigration() error {
200+
rollappMap := make(map[string]bool) // Create a map to store rollappId<->gaugeCreated
201+
202+
rollapps := s.App.RollappKeeper.GetAllRollapps(s.Ctx)
203+
for _, rollapp := range rollapps {
204+
rollappMap[rollapp.RollappId] = false // false until gauge is validated
205+
}
206+
207+
gauges := s.App.IncentivesKeeper.GetGauges(s.Ctx)
208+
if len(gauges) != len(rollapps) {
209+
return fmt.Errorf("rollapp gauges not created for all rollapps")
210+
}
211+
212+
// Check that for each rollapp there exists a rollapp gauge
213+
for _, gauge := range gauges {
214+
if gauge.GetRollapp() != nil {
215+
gaugeExists, ok := rollappMap[gauge.GetRollapp().RollappId]
216+
if !ok {
217+
return fmt.Errorf("rollapp gauge for unknown rollapp %s", gauge.GetRollapp().RollappId)
218+
}
219+
220+
if gaugeExists {
221+
return fmt.Errorf("rollapp gauge for rollapp %s already created", gauge.GetRollapp().RollappId)
222+
}
223+
224+
rollappMap[gauge.GetRollapp().RollappId] = true
225+
}
226+
}
227+
228+
return nil
229+
}
230+
195231
func (s *UpgradeTestSuite) validateSequencersMigration(numSeq int) error {
196232
testSeqs := s.seedSequencers(numSeq)
197233
expectSequencers := make([]sequencertypes.Sequencer, len(testSeqs))

x/incentives/client/cli/cli_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import (
55

66
"github.com/cosmos/cosmos-sdk/types/query"
77

8+
"github.com/osmosis-labs/osmosis/v15/osmoutils/osmocli"
9+
810
"github.com/dymensionxyz/dymension/v3/x/incentives/client/cli"
911
"github.com/dymensionxyz/dymension/v3/x/incentives/types"
10-
"github.com/osmosis-labs/osmosis/v15/osmoutils/osmocli"
1112
)
1213

1314
func TestGetCmdGauges(t *testing.T) {

x/incentives/client/cli/query.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ package cli
33
import (
44
"github.com/spf13/cobra"
55

6-
"github.com/dymensionxyz/dymension/v3/x/incentives/types"
76
"github.com/osmosis-labs/osmosis/v15/osmoutils/osmocli"
7+
8+
"github.com/dymensionxyz/dymension/v3/x/incentives/types"
89
)
910

1011
// GetQueryCmd returns the query commands for this module.

x/incentives/keeper/export_test.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,3 @@ func (k Keeper) MoveUpcomingGaugeToActiveGauge(ctx sdk.Context, gauge types.Gaug
3535
func (k Keeper) MoveActiveGaugeToFinishedGauge(ctx sdk.Context, gauge types.Gauge) error {
3636
return k.moveActiveGaugeToFinishedGauge(ctx, gauge)
3737
}
38-
39-
// ChargeFeeIfSufficientFeeDenomBalance see chargeFeeIfSufficientFeeDenomBalance spec.
40-
func (k Keeper) ChargeFeeIfSufficientFeeDenomBalance(ctx sdk.Context, address sdk.AccAddress, fee sdk.Int, gaugeCoins sdk.Coins) error {
41-
return k.chargeFeeIfSufficientFeeDenomBalance(ctx, address, fee, gaugeCoins)
42-
}

x/incentives/keeper/gauge.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,7 @@ func (k Keeper) CreateGauge(ctx sdk.Context, isPerpetual bool, owner sdk.AccAddr
110110
return 0, fmt.Errorf("denom does not exist: %s", distrTo.Denom)
111111
}
112112

113-
gauge := types.Gauge{
114-
Id: k.GetLastGaugeID(ctx) + 1,
115-
IsPerpetual: isPerpetual,
116-
DistributeTo: &types.Gauge_Asset{Asset: &distrTo},
117-
Coins: coins,
118-
StartTime: startTime,
119-
NumEpochsPaidOver: numEpochsPaidOver,
120-
}
113+
gauge := types.NewAssetGauge(k.GetLastGaugeID(ctx)+1, isPerpetual, distrTo, coins, startTime, numEpochsPaidOver)
121114

122115
if err := k.bk.SendCoinsFromAccountToModule(ctx, owner, types.ModuleName, gauge.Coins); err != nil {
123116
return 0, err

x/incentives/keeper/gauge_rollapp.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,7 @@ func (k Keeper) CreateRollappGauge(ctx sdk.Context, rollappId string) (uint64, e
1616
return 0, fmt.Errorf("rollapp %s not found", rollappId)
1717
}
1818

19-
gauge := types.Gauge{
20-
Id: k.GetLastGaugeID(ctx) + 1,
21-
IsPerpetual: true,
22-
DistributeTo: &types.Gauge_Rollapp{
23-
Rollapp: &types.RollappGauge{RollappId: rollappId},
24-
},
25-
NumEpochsPaidOver: 1,
26-
}
19+
gauge := types.NewRollappGauge(k.GetLastGaugeID(ctx)+1, rollappId)
2720

2821
err := k.setGauge(ctx, &gauge)
2922
if err != nil {

x/incentives/keeper/gauge_test.go

Lines changed: 0 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
sdk "github.com/cosmos/cosmos-sdk/types"
77
"github.com/stretchr/testify/suite"
88

9-
"github.com/dymensionxyz/dymension/v3/app/apptesting"
109
"github.com/dymensionxyz/dymension/v3/x/incentives/types"
1110
lockuptypes "github.com/dymensionxyz/dymension/v3/x/lockup/types"
1211
)
@@ -225,99 +224,3 @@ func (suite *KeeperTestSuite) TestGaugeOperations() {
225224
}
226225
}
227226
}
228-
229-
func (suite *KeeperTestSuite) TestChargeFeeIfSufficientFeeDenomBalance() {
230-
const baseFee = int64(100)
231-
232-
testcases := map[string]struct {
233-
accountBalanceToFund sdk.Coin
234-
feeToCharge int64
235-
gaugeCoins sdk.Coins
236-
237-
expectError bool
238-
}{
239-
"fee + base denom gauge coin == acount balance, success": {
240-
accountBalanceToFund: sdk.NewCoin("adym", sdk.NewInt(baseFee)),
241-
feeToCharge: baseFee / 2,
242-
gaugeCoins: sdk.NewCoins(sdk.NewCoin("adym", sdk.NewInt(baseFee/2))),
243-
},
244-
"fee + base denom gauge coin < acount balance, success": {
245-
accountBalanceToFund: sdk.NewCoin("adym", sdk.NewInt(baseFee)),
246-
feeToCharge: baseFee/2 - 1,
247-
gaugeCoins: sdk.NewCoins(sdk.NewCoin("adym", sdk.NewInt(baseFee/2))),
248-
},
249-
"fee + base denom gauge coin > acount balance, error": {
250-
accountBalanceToFund: sdk.NewCoin("adym", sdk.NewInt(baseFee)),
251-
feeToCharge: baseFee/2 + 1,
252-
gaugeCoins: sdk.NewCoins(sdk.NewCoin("adym", sdk.NewInt(baseFee/2))),
253-
expectError: true,
254-
},
255-
"fee + base denom gauge coin < acount balance, custom values, success": {
256-
accountBalanceToFund: sdk.NewCoin("adym", sdk.NewInt(11793193112)),
257-
feeToCharge: 55,
258-
gaugeCoins: sdk.NewCoins(sdk.NewCoin("adym", sdk.NewInt(328812))),
259-
},
260-
"account funded with coins other than base denom, error": {
261-
accountBalanceToFund: sdk.NewCoin("usdc", sdk.NewInt(baseFee)),
262-
feeToCharge: baseFee,
263-
gaugeCoins: sdk.NewCoins(sdk.NewCoin("adym", sdk.NewInt(baseFee/2))),
264-
expectError: true,
265-
},
266-
"fee == account balance, no gauge coins, success": {
267-
accountBalanceToFund: sdk.NewCoin("adym", sdk.NewInt(baseFee)),
268-
feeToCharge: baseFee,
269-
},
270-
"gauge coins == account balance, no fee, success": {
271-
accountBalanceToFund: sdk.NewCoin("adym", sdk.NewInt(baseFee)),
272-
gaugeCoins: sdk.NewCoins(sdk.NewCoin("adym", sdk.NewInt(baseFee))),
273-
},
274-
"fee == account balance, gauge coins in denom other than base, success": {
275-
accountBalanceToFund: sdk.NewCoin("adym", sdk.NewInt(baseFee)),
276-
feeToCharge: baseFee,
277-
gaugeCoins: sdk.NewCoins(sdk.NewCoin("usdc", sdk.NewInt(baseFee*2))),
278-
},
279-
"fee + gauge coins == account balance, multiple gauge coins, one in denom other than base, success": {
280-
accountBalanceToFund: sdk.NewCoin("adym", sdk.NewInt(baseFee)),
281-
feeToCharge: baseFee / 2,
282-
gaugeCoins: sdk.NewCoins(sdk.NewCoin("usdc", sdk.NewInt(baseFee*2)), sdk.NewCoin("adym", sdk.NewInt(baseFee/2))),
283-
},
284-
}
285-
286-
for name, tc := range testcases {
287-
suite.Run(name, func() {
288-
suite.SetupTest()
289-
290-
err := suite.App.TxFeesKeeper.SetBaseDenom(suite.Ctx, "adym")
291-
suite.Require().NoError(err)
292-
293-
testAccount := apptesting.CreateRandomAccounts(1)[0]
294-
ctx := suite.Ctx
295-
incentivesKeepers := suite.App.IncentivesKeeper
296-
bankKeeper := suite.App.BankKeeper
297-
298-
// Pre-fund account.
299-
// suite.FundAcc(testAccount, testutil.DefaultAcctFunds)
300-
suite.FundAcc(testAccount, sdk.NewCoins(tc.accountBalanceToFund))
301-
302-
oldBalanceAmount := bankKeeper.GetBalance(ctx, testAccount, "adym").Amount
303-
304-
// System under test.
305-
err = incentivesKeepers.ChargeFeeIfSufficientFeeDenomBalance(ctx, testAccount, sdk.NewInt(tc.feeToCharge), tc.gaugeCoins)
306-
307-
// Assertions.
308-
newBalanceAmount := bankKeeper.GetBalance(ctx, testAccount, "adym").Amount
309-
if tc.expectError {
310-
suite.Require().Error(err)
311-
312-
// check account balance unchanged
313-
suite.Require().Equal(oldBalanceAmount, newBalanceAmount)
314-
} else {
315-
suite.Require().NoError(err)
316-
317-
// check account balance changed.
318-
expectedNewBalanceAmount := oldBalanceAmount.Sub(sdk.NewInt(tc.feeToCharge))
319-
suite.Require().Equal(expectedNewBalanceAmount.String(), newBalanceAmount.String())
320-
}
321-
})
322-
}
323-
}

0 commit comments

Comments
 (0)