From 5aeed1ac91ef2a9f3a7f4f078577cb1dc13ac584 Mon Sep 17 00:00:00 2001 From: kogisin Date: Tue, 12 Apr 2022 14:19:01 +0900 Subject: [PATCH 1/6] test: fix simulation (cherry-picked) --- x/claim/module.go | 2 +- x/claim/simulation/operations.go | 112 ++++++++++++++++---------- x/claim/simulation/operations_test.go | 2 +- x/claim/types/expected_keepers.go | 3 + 4 files changed, 73 insertions(+), 46 deletions(-) diff --git a/x/claim/module.go b/x/claim/module.go index c1bf97ae5..c24fc132f 100644 --- a/x/claim/module.go +++ b/x/claim/module.go @@ -208,6 +208,6 @@ func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { // WeightedOperations returns the all the module operations with their respective weights. func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { return simulation.WeightedOperations( - simState.AppParams, simState.Cdc, am.accountKeeper, am.bankKeeper, am.keeper, + simState.AppParams, simState.Cdc, am.accountKeeper, am.bankKeeper, am.liquidStakingKeeper, am.keeper, ) } diff --git a/x/claim/simulation/operations.go b/x/claim/simulation/operations.go index 82c3e5164..0d1113e43 100644 --- a/x/claim/simulation/operations.go +++ b/x/claim/simulation/operations.go @@ -2,7 +2,6 @@ package simulation import ( "math/rand" - "sort" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" @@ -14,6 +13,7 @@ import ( utils "github.com/crescent-network/crescent/types" "github.com/crescent-network/crescent/x/claim/keeper" "github.com/crescent-network/crescent/x/claim/types" + minttypes "github.com/crescent-network/crescent/x/mint/types" ) const ( @@ -25,9 +25,14 @@ var ( Fees = sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000)) ) +var ( + airdropDenom = "airdrop" +) + func WeightedOperations( appParams simtypes.AppParams, cdc codec.JSONCodec, - ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, + ak types.AccountKeeper, bk types.BankKeeper, + lk types.LiquidStakingKeeper, k keeper.Keeper, ) simulation.WeightedOperations { var weightMsgClaim int appParams.GetOrGenerate(cdc, OpWeightMsgClaim, &weightMsgClaim, nil, func(_ *rand.Rand) { @@ -37,51 +42,59 @@ func WeightedOperations( return simulation.WeightedOperations{ simulation.NewWeightedOperation( weightMsgClaim, - SimulateMsgClaim(ak, bk, k), + SimulateMsgClaim(ak, bk, lk, k), ), } } -func SimulateMsgClaim(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { +func SimulateMsgClaim(ak types.AccountKeeper, bk types.BankKeeper, lk types.LiquidStakingKeeper, k keeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { accs = utils.ShuffleSimAccounts(r, accs) - airdrops := k.GetAllAirdrops(ctx) - rand.Shuffle(len(airdrops), func(i, j int) { - airdrops[i], airdrops[j] = airdrops[j], airdrops[i] - }) + airdrop := setAirdrop(r, ctx, bk, k, accs) + + // Look for an account that has token with liquid bond denom var simAccount simtypes.Account - var airdrop types.Airdrop - var claimRecord types.ClaimRecord - var cond types.ConditionType skip := true - loop: - for _, simAccount = range accs { - for _, airdrop = range airdrops { - var found bool - claimRecord, found = k.GetClaimRecordByRecipient(ctx, airdrop.Id, simAccount.Address) - if !found { - continue - } - - conditions := unclaimedConditions(airdrop, claimRecord) - for _, cond = range conditions { - if err := k.ValidateCondition(ctx, simAccount.Address, cond); err == nil { - skip = false - break loop - } - } + for _, acc := range accs { + params := lk.GetParams(ctx) + spendable := bk.SpendableCoins(ctx, acc.Address) + bTokenBalance := spendable.AmountOf(params.LiquidBondDenom) + if !bTokenBalance.IsZero() { + simAccount = acc + skip = false + break } } if skip { - return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgClaim, "no account to claim"), nil, nil + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgClaim, "no recipient that has executed LIQUID_STAKE condition"), nil, nil + } + + recipient := simAccount.Address + spendable := bk.SpendableCoins(ctx, recipient) + + _, found := k.GetClaimRecordByRecipient(ctx, airdrop.Id, recipient) + if found { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgClaim, "recipient already has claim record"), nil, nil + } + + initialClaimableCoins := sdk.NewCoins( + sdk.NewInt64Coin(airdropDenom, int64(simtypes.RandIntBetween(r, 100_000_000, 1_000_000_000)))) + + // Set new claim record for the recipient + record := types.ClaimRecord{ + AirdropId: airdrop.Id, + Recipient: recipient.String(), + InitialClaimableCoins: initialClaimableCoins, + ClaimableCoins: initialClaimableCoins, + ClaimedConditions: []types.ConditionType{}, } + k.SetClaimRecord(ctx, record) - spendable := bk.SpendableCoins(ctx, simAccount.Address) - msg := types.NewMsgClaim(airdrop.Id, simAccount.Address, cond) + msg := types.NewMsgClaim(airdrop.Id, simAccount.Address, types.ConditionTypeLiquidStake) txCtx := simulation.OperationInput{ R: r, @@ -101,21 +114,32 @@ func SimulateMsgClaim(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keep } } -func unclaimedConditions(airdrop types.Airdrop, claimRecord types.ClaimRecord) []types.ConditionType { - conditionSet := map[types.ConditionType]struct{}{} - for _, cond := range airdrop.Conditions { - conditionSet[cond] = struct{}{} +func setAirdrop(r *rand.Rand, ctx sdk.Context, bk types.BankKeeper, k keeper.Keeper, accs []simtypes.Account) types.Airdrop { + sourceAddr := accs[r.Intn(len(accs))].Address + coins := sdk.NewCoins(sdk.NewInt64Coin(airdropDenom, 10_000_000_000_000)) + + if err := bk.MintCoins(ctx, minttypes.ModuleName, coins); err != nil { + panic(err) } - for _, cond := range claimRecord.ClaimedConditions { - delete(conditionSet, cond) + + if err := bk.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, sourceAddr, coins); err != nil { + panic(err) } - var conditions []types.ConditionType - for cond := range conditionSet { - conditions = append(conditions, cond) + + airdrop := types.Airdrop{ + Id: 1, + SourceAddress: sourceAddr.String(), + Conditions: []types.ConditionType{ + types.ConditionTypeDeposit, + types.ConditionTypeSwap, + types.ConditionTypeLiquidStake, + types.ConditionTypeVote, + }, + StartTime: ctx.BlockTime(), + EndTime: ctx.BlockTime().AddDate(0, simtypes.RandIntBetween(r, 1, 24), 0), } - // Sort conditions for deterministic simulation, since map keys are not sorted. - sort.Slice(conditions, func(i, j int) bool { - return conditions[i] < conditions[j] - }) - return conditions + + k.SetAirdrop(ctx, airdrop) + + return airdrop } diff --git a/x/claim/simulation/operations_test.go b/x/claim/simulation/operations_test.go index 04a78c853..36ab97186 100644 --- a/x/claim/simulation/operations_test.go +++ b/x/claim/simulation/operations_test.go @@ -59,7 +59,7 @@ func TestSimulateMsgClaim(t *testing.T) { app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash}}) - op := simulation.SimulateMsgClaim(app.AccountKeeper, app.BankKeeper, app.ClaimKeeper) + op := simulation.SimulateMsgClaim(app.AccountKeeper, app.BankKeeper, app.LiquidStakingKeeper, app.ClaimKeeper) opMsg, futureOps, err := op(r, app.BaseApp, ctx, accs, "") require.NoError(t, err) require.True(t, opMsg.OK) diff --git a/x/claim/types/expected_keepers.go b/x/claim/types/expected_keepers.go index a1d8739e3..d07c10e37 100644 --- a/x/claim/types/expected_keepers.go +++ b/x/claim/types/expected_keepers.go @@ -18,6 +18,9 @@ type AccountKeeper interface { type BankKeeper interface { SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error + // MintCoins is used only for simulation test codes + MintCoins(ctx sdk.Context, name string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error } // DistrKeeper is the keeper of the distribution store From d681dc7edd2303bc6eeb7951e3e2c8b87f1e05c6 Mon Sep 17 00:00:00 2001 From: kogisin Date: Tue, 12 Apr 2022 14:32:24 +0900 Subject: [PATCH 2/6] fix: fix broken test case (cherry-picked) --- x/claim/simulation/operations_test.go | 47 ++++++--------------------- 1 file changed, 10 insertions(+), 37 deletions(-) diff --git a/x/claim/simulation/operations_test.go b/x/claim/simulation/operations_test.go index 36ab97186..c77e58139 100644 --- a/x/claim/simulation/operations_test.go +++ b/x/claim/simulation/operations_test.go @@ -12,50 +12,18 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" chain "github.com/crescent-network/crescent/app" - utils "github.com/crescent-network/crescent/types" "github.com/crescent-network/crescent/x/claim/simulation" "github.com/crescent-network/crescent/x/claim/types" - liquiditytypes "github.com/crescent-network/crescent/x/liquidity/types" ) func TestSimulateMsgClaim(t *testing.T) { app := chain.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - r := rand.New(rand.NewSource(0)) - accs := getTestingAccounts(t, r, app, ctx, 1) - - srcAddr := utils.TestAddress(0) - airdrop := types.Airdrop{ - Id: 1, - SourceAddress: srcAddr.String(), - Conditions: []types.ConditionType{ - types.ConditionTypeDeposit, - types.ConditionTypeSwap, - types.ConditionTypeLiquidStake, - types.ConditionTypeVote, - }, - StartTime: utils.ParseTime("2022-01-01T00:00:00Z"), - EndTime: utils.ParseTime("2023-01-01T00:00:00Z"), - } - app.ClaimKeeper.SetAirdrop(ctx, airdrop) - err := chain.FundAccount(app.BankKeeper, ctx, srcAddr, utils.ParseCoins("1000000stake")) - require.NoError(t, err) - claimRecord := types.ClaimRecord{ - AirdropId: airdrop.Id, - Recipient: accs[0].Address.String(), - InitialClaimableCoins: utils.ParseCoins("1000000stake"), - ClaimableCoins: utils.ParseCoins("1000000stake"), - ClaimedConditions: nil, - } - app.ClaimKeeper.SetClaimRecord(ctx, claimRecord) + s := rand.NewSource(0) + r := rand.New(s) - pair := liquiditytypes.NewPair(1, "stake", "denom1") - app.LiquidityKeeper.SetPair(ctx, pair) - _, err = app.LiquidityKeeper.LimitOrder(ctx, liquiditytypes.NewMsgLimitOrder( - accs[0].Address, pair.Id, liquiditytypes.OrderDirectionSell, - utils.ParseCoin("10000stake"), "denom1", utils.ParseDec("1.0"), sdk.NewInt(10000), 0)) - require.NoError(t, err) + accs := getTestingAccounts(t, r, app, ctx, 1) app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash}}) @@ -72,14 +40,19 @@ func TestSimulateMsgClaim(t *testing.T) { require.Equal(t, types.ModuleName, msg.Route()) require.Equal(t, "cosmos1tp4es44j4vv8m59za3z0tm64dkmlnm8wg2frhc", msg.Recipient) require.Equal(t, uint64(1), msg.AirdropId) - require.Equal(t, types.ConditionTypeSwap, msg.ConditionType) + require.Equal(t, types.ConditionTypeLiquidStake, msg.ConditionType) } func getTestingAccounts(t *testing.T, r *rand.Rand, app *chain.App, ctx sdk.Context, n int) []simtypes.Account { accs := simtypes.RandomAccounts(r, n) + params := app.LiquidStakingKeeper.GetParams(ctx) + initAmt := app.StakingKeeper.TokensFromConsensusPower(ctx, 200) - initCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initAmt)) + initCoins := sdk.NewCoins( + sdk.NewCoin(sdk.DefaultBondDenom, initAmt), + sdk.NewCoin(params.LiquidBondDenom, initAmt), + ) // add coins to the accounts for _, account := range accs { From eb23cfdbd4b42ae28e6dd9d8a920d640b2b530f3 Mon Sep 17 00:00:00 2001 From: kogisin Date: Tue, 12 Apr 2022 14:45:07 +0900 Subject: [PATCH 3/6] test: add other conditions (cherry picked from commit 831a803313102249282254864d70d5d5b738f6cf) --- x/claim/module.go | 3 +- x/claim/simulation/operations.go | 45 +++++++++++++++++++++++---- x/claim/simulation/operations_test.go | 5 ++- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/x/claim/module.go b/x/claim/module.go index c24fc132f..044eb9174 100644 --- a/x/claim/module.go +++ b/x/claim/module.go @@ -208,6 +208,7 @@ func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { // WeightedOperations returns the all the module operations with their respective weights. func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { return simulation.WeightedOperations( - simState.AppParams, simState.Cdc, am.accountKeeper, am.bankKeeper, am.liquidStakingKeeper, am.keeper, + simState.AppParams, simState.Cdc, am.accountKeeper, am.bankKeeper, + am.liquidityKeeper, am.liquidStakingKeeper, am.govKeeper, am.keeper, ) } diff --git a/x/claim/simulation/operations.go b/x/claim/simulation/operations.go index 0d1113e43..4968f19c5 100644 --- a/x/claim/simulation/operations.go +++ b/x/claim/simulation/operations.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/cosmos-sdk/x/simulation" appparams "github.com/crescent-network/crescent/app/params" @@ -32,7 +33,8 @@ var ( func WeightedOperations( appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, bk types.BankKeeper, - lk types.LiquidStakingKeeper, k keeper.Keeper, + lk types.LiquidityKeeper, lsk types.LiquidStakingKeeper, + gk types.GovKeeper, k keeper.Keeper, ) simulation.WeightedOperations { var weightMsgClaim int appParams.GetOrGenerate(cdc, OpWeightMsgClaim, &weightMsgClaim, nil, func(_ *rand.Rand) { @@ -42,12 +44,16 @@ func WeightedOperations( return simulation.WeightedOperations{ simulation.NewWeightedOperation( weightMsgClaim, - SimulateMsgClaim(ak, bk, lk, k), + SimulateMsgClaim(ak, bk, lk, lsk, gk, k), ), } } -func SimulateMsgClaim(ak types.AccountKeeper, bk types.BankKeeper, lk types.LiquidStakingKeeper, k keeper.Keeper) simtypes.Operation { +func SimulateMsgClaim( + ak types.AccountKeeper, bk types.BankKeeper, + lk types.LiquidityKeeper, lsk types.LiquidStakingKeeper, + gk types.GovKeeper, k keeper.Keeper, +) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, @@ -56,18 +62,44 @@ func SimulateMsgClaim(ak types.AccountKeeper, bk types.BankKeeper, lk types.Liqu airdrop := setAirdrop(r, ctx, bk, k, accs) - // Look for an account that has token with liquid bond denom + // Look for an account that has executed any condition var simAccount simtypes.Account + var cond types.ConditionType skip := true for _, acc := range accs { - params := lk.GetParams(ctx) + if len(lk.GetDepositRequestsByDepositor(ctx, acc.Address)) != 0 { + simAccount = acc + skip = false + cond = types.ConditionTypeDeposit + break + } + + if len(lk.GetOrdersByOrderer(ctx, acc.Address)) != 0 { + simAccount = acc + skip = false + cond = types.ConditionTypeSwap + break + } + + params := lsk.GetParams(ctx) spendable := bk.SpendableCoins(ctx, acc.Address) bTokenBalance := spendable.AmountOf(params.LiquidBondDenom) if !bTokenBalance.IsZero() { simAccount = acc skip = false + cond = types.ConditionTypeLiquidStake break } + + gk.IterateAllVotes(ctx, func(vote govtypes.Vote) (stop bool) { + if vote.Voter == acc.Address.String() { + simAccount = acc + skip = false + cond = types.ConditionTypeVote + return true + } + return false + }) } if skip { return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgClaim, "no recipient that has executed LIQUID_STAKE condition"), nil, nil @@ -76,6 +108,7 @@ func SimulateMsgClaim(ak types.AccountKeeper, bk types.BankKeeper, lk types.Liqu recipient := simAccount.Address spendable := bk.SpendableCoins(ctx, recipient) + // To reduce complexity, skip if the recipient has already claim record _, found := k.GetClaimRecordByRecipient(ctx, airdrop.Id, recipient) if found { return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgClaim, "recipient already has claim record"), nil, nil @@ -94,7 +127,7 @@ func SimulateMsgClaim(ak types.AccountKeeper, bk types.BankKeeper, lk types.Liqu } k.SetClaimRecord(ctx, record) - msg := types.NewMsgClaim(airdrop.Id, simAccount.Address, types.ConditionTypeLiquidStake) + msg := types.NewMsgClaim(airdrop.Id, simAccount.Address, cond) txCtx := simulation.OperationInput{ R: r, diff --git a/x/claim/simulation/operations_test.go b/x/claim/simulation/operations_test.go index c77e58139..7ba89b804 100644 --- a/x/claim/simulation/operations_test.go +++ b/x/claim/simulation/operations_test.go @@ -27,7 +27,10 @@ func TestSimulateMsgClaim(t *testing.T) { app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash}}) - op := simulation.SimulateMsgClaim(app.AccountKeeper, app.BankKeeper, app.LiquidStakingKeeper, app.ClaimKeeper) + op := simulation.SimulateMsgClaim( + app.AccountKeeper, app.BankKeeper, + app.LiquidityKeeper, app.LiquidStakingKeeper, + app.GovKeeper, app.ClaimKeeper) opMsg, futureOps, err := op(r, app.BaseApp, ctx, accs, "") require.NoError(t, err) require.True(t, opMsg.OK) From 6dbfb47f6e8d3e1dd9fdb5f8e03f3f47d88e443b Mon Sep 17 00:00:00 2001 From: kogisin Date: Tue, 12 Apr 2022 14:47:15 +0900 Subject: [PATCH 4/6] test: update NoOpMsg comment (cherry picked from commit 1a52d5034b6bf0678596d7ef561e555a9732c978) --- x/claim/simulation/operations.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/claim/simulation/operations.go b/x/claim/simulation/operations.go index 4968f19c5..e0f53d690 100644 --- a/x/claim/simulation/operations.go +++ b/x/claim/simulation/operations.go @@ -102,7 +102,7 @@ func SimulateMsgClaim( }) } if skip { - return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgClaim, "no recipient that has executed LIQUID_STAKE condition"), nil, nil + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgClaim, "no recipient that has executed any condition"), nil, nil } recipient := simAccount.Address From ef643e3ff313a6d07b51e420d7121baad076d185 Mon Sep 17 00:00:00 2001 From: kogisin Date: Tue, 12 Apr 2022 15:35:09 +0900 Subject: [PATCH 5/6] refactor: validate condition (cherry picked from commit c3caff7468c9ac350e79141b1a433031474376ff) --- x/claim/simulation/operations.go | 44 ++++++++------------------------ 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/x/claim/simulation/operations.go b/x/claim/simulation/operations.go index e0f53d690..f946dbd02 100644 --- a/x/claim/simulation/operations.go +++ b/x/claim/simulation/operations.go @@ -7,7 +7,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/cosmos-sdk/x/simulation" appparams "github.com/crescent-network/crescent/app/params" @@ -66,40 +65,19 @@ func SimulateMsgClaim( var simAccount simtypes.Account var cond types.ConditionType skip := true - for _, acc := range accs { - if len(lk.GetDepositRequestsByDepositor(ctx, acc.Address)) != 0 { - simAccount = acc - skip = false - cond = types.ConditionTypeDeposit - break - } - - if len(lk.GetOrdersByOrderer(ctx, acc.Address)) != 0 { - simAccount = acc - skip = false - cond = types.ConditionTypeSwap - break - } - - params := lsk.GetParams(ctx) - spendable := bk.SpendableCoins(ctx, acc.Address) - bTokenBalance := spendable.AmountOf(params.LiquidBondDenom) - if !bTokenBalance.IsZero() { - simAccount = acc - skip = false - cond = types.ConditionTypeLiquidStake - break - } - - gk.IterateAllVotes(ctx, func(vote govtypes.Vote) (stop bool) { - if vote.Voter == acc.Address.String() { - simAccount = acc + loop: + for _, simAccount = range accs { + for _, cond = range []types.ConditionType{ + types.ConditionTypeDeposit, + types.ConditionTypeSwap, + types.ConditionTypeLiquidStake, + types.ConditionTypeVote, + } { + if err := k.ValidateCondition(ctx, simAccount.Address, cond); err == nil { skip = false - cond = types.ConditionTypeVote - return true + break loop } - return false - }) + } } if skip { return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgClaim, "no recipient that has executed any condition"), nil, nil From eb0e65938276bb686f60c141742d80dd4340642c Mon Sep 17 00:00:00 2001 From: crypin Date: Tue, 3 May 2022 12:45:40 +0900 Subject: [PATCH 6/6] fix: typo in labeler --- .github/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index d4c9fa5f6..e8b23f041 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -8,7 +8,7 @@ - x/liquidstaking/**/* "x/mint": - x/mint/**/* -"documentation" +"documentation": - docs/**/* "build": - Makefile