github.com/cosmos/cosmos-sdk@v0.50.10/x/staking/app_test.go (about) 1 package staking_test 2 3 import ( 4 "testing" 5 6 abci "github.com/cometbft/cometbft/abci/types" 7 cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" 8 "github.com/stretchr/testify/require" 9 10 "cosmossdk.io/depinject" 11 "cosmossdk.io/log" 12 "cosmossdk.io/math" 13 14 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" 15 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" 16 simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" 17 sdk "github.com/cosmos/cosmos-sdk/types" 18 moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" 19 authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" 20 bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" 21 stakingKeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" 22 "github.com/cosmos/cosmos-sdk/x/staking/testutil" 23 "github.com/cosmos/cosmos-sdk/x/staking/types" 24 ) 25 26 var ( 27 priv1 = secp256k1.GenPrivKey() 28 addr1 = sdk.AccAddress(priv1.PubKey().Address()) 29 priv2 = secp256k1.GenPrivKey() 30 addr2 = sdk.AccAddress(priv2.PubKey().Address()) 31 32 valKey = ed25519.GenPrivKey() 33 commissionRates = types.NewCommissionRates(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()) 34 ) 35 36 func TestStakingMsgs(t *testing.T) { 37 genTokens := sdk.TokensFromConsensusPower(42, sdk.DefaultPowerReduction) 38 bondTokens := sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction) 39 genCoin := sdk.NewCoin(sdk.DefaultBondDenom, genTokens) 40 bondCoin := sdk.NewCoin(sdk.DefaultBondDenom, bondTokens) 41 42 acc1 := &authtypes.BaseAccount{Address: addr1.String()} 43 acc2 := &authtypes.BaseAccount{Address: addr2.String()} 44 accs := []simtestutil.GenesisAccount{ 45 {GenesisAccount: acc1, Coins: sdk.Coins{genCoin}}, 46 {GenesisAccount: acc2, Coins: sdk.Coins{genCoin}}, 47 } 48 49 var ( 50 bankKeeper bankKeeper.Keeper 51 stakingKeeper *stakingKeeper.Keeper 52 ) 53 54 startupCfg := simtestutil.DefaultStartUpConfig() 55 startupCfg.GenesisAccounts = accs 56 57 app, err := simtestutil.SetupWithConfiguration( 58 depinject.Configs( 59 testutil.AppConfig, 60 depinject.Supply(log.NewNopLogger()), 61 ), 62 startupCfg, &bankKeeper, &stakingKeeper) 63 require.NoError(t, err) 64 ctxCheck := app.BaseApp.NewContext(true) 65 66 require.True(t, sdk.Coins{genCoin}.Equal(bankKeeper.GetAllBalances(ctxCheck, addr1))) 67 require.True(t, sdk.Coins{genCoin}.Equal(bankKeeper.GetAllBalances(ctxCheck, addr2))) 68 69 // create validator 70 description := types.NewDescription("foo_moniker", "", "", "", "") 71 createValidatorMsg, err := types.NewMsgCreateValidator( 72 sdk.ValAddress(addr1).String(), valKey.PubKey(), bondCoin, description, commissionRates, math.OneInt(), 73 ) 74 require.NoError(t, err) 75 76 header := cmtproto.Header{Height: app.LastBlockHeight() + 1} 77 txConfig := moduletestutil.MakeTestTxConfig() 78 _, _, err = simtestutil.SignCheckDeliver(t, txConfig, app.BaseApp, header, []sdk.Msg{createValidatorMsg}, "", []uint64{0}, []uint64{0}, true, true, priv1) 79 require.NoError(t, err) 80 require.True(t, sdk.Coins{genCoin.Sub(bondCoin)}.Equal(bankKeeper.GetAllBalances(ctxCheck, addr1))) 81 82 _, err = app.FinalizeBlock(&abci.RequestFinalizeBlock{Height: app.LastBlockHeight() + 1}) 83 require.NoError(t, err) 84 ctxCheck = app.BaseApp.NewContext(true) 85 validator, err := stakingKeeper.GetValidator(ctxCheck, sdk.ValAddress(addr1)) 86 require.NoError(t, err) 87 88 require.Equal(t, sdk.ValAddress(addr1).String(), validator.OperatorAddress) 89 require.Equal(t, types.Bonded, validator.Status) 90 require.True(math.IntEq(t, bondTokens, validator.BondedTokens())) 91 92 _, err = app.FinalizeBlock(&abci.RequestFinalizeBlock{Height: app.LastBlockHeight() + 1}) 93 require.NoError(t, err) 94 95 // edit the validator 96 description = types.NewDescription("bar_moniker", "", "", "", "") 97 editValidatorMsg := types.NewMsgEditValidator(sdk.ValAddress(addr1).String(), description, nil, nil) 98 99 header = cmtproto.Header{Height: app.LastBlockHeight() + 1} 100 _, _, err = simtestutil.SignCheckDeliver(t, txConfig, app.BaseApp, header, []sdk.Msg{editValidatorMsg}, "", []uint64{0}, []uint64{1}, true, true, priv1) 101 require.NoError(t, err) 102 103 ctxCheck = app.BaseApp.NewContext(true) 104 validator, err = stakingKeeper.GetValidator(ctxCheck, sdk.ValAddress(addr1)) 105 require.NoError(t, err) 106 require.Equal(t, description, validator.Description) 107 108 // delegate 109 require.True(t, sdk.Coins{genCoin}.Equal(bankKeeper.GetAllBalances(ctxCheck, addr2))) 110 delegateMsg := types.NewMsgDelegate(addr2.String(), sdk.ValAddress(addr1).String(), bondCoin) 111 112 header = cmtproto.Header{Height: app.LastBlockHeight() + 1} 113 _, _, err = simtestutil.SignCheckDeliver(t, txConfig, app.BaseApp, header, []sdk.Msg{delegateMsg}, "", []uint64{1}, []uint64{0}, true, true, priv2) 114 require.NoError(t, err) 115 116 ctxCheck = app.BaseApp.NewContext(true) 117 require.True(t, sdk.Coins{genCoin.Sub(bondCoin)}.Equal(bankKeeper.GetAllBalances(ctxCheck, addr2))) 118 _, err = stakingKeeper.GetDelegation(ctxCheck, addr2, sdk.ValAddress(addr1)) 119 require.NoError(t, err) 120 121 // begin unbonding 122 beginUnbondingMsg := types.NewMsgUndelegate(addr2.String(), sdk.ValAddress(addr1).String(), bondCoin) 123 header = cmtproto.Header{Height: app.LastBlockHeight() + 1} 124 _, _, err = simtestutil.SignCheckDeliver(t, txConfig, app.BaseApp, header, []sdk.Msg{beginUnbondingMsg}, "", []uint64{1}, []uint64{1}, true, true, priv2) 125 require.NoError(t, err) 126 127 // delegation should exist anymore 128 ctxCheck = app.BaseApp.NewContext(true) 129 _, err = stakingKeeper.GetDelegation(ctxCheck, addr2, sdk.ValAddress(addr1)) 130 require.ErrorIs(t, err, types.ErrNoDelegation) 131 132 // balance should be the same because bonding not yet complete 133 require.True(t, sdk.Coins{genCoin.Sub(bondCoin)}.Equal(bankKeeper.GetAllBalances(ctxCheck, addr2))) 134 }