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  }