github.com/Finschia/finschia-sdk@v0.48.1/x/staking/app_test.go (about) 1 package staking_test 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 tmproto "github.com/tendermint/tendermint/proto/tendermint/types" 8 9 ocabci "github.com/Finschia/ostracon/abci/types" 10 11 "github.com/Finschia/finschia-sdk/simapp" 12 sdk "github.com/Finschia/finschia-sdk/types" 13 authtypes "github.com/Finschia/finschia-sdk/x/auth/types" 14 banktypes "github.com/Finschia/finschia-sdk/x/bank/types" 15 "github.com/Finschia/finschia-sdk/x/staking/types" 16 ) 17 18 func checkValidator(t *testing.T, app *simapp.SimApp, addr sdk.ValAddress, expFound bool) types.Validator { 19 ctxCheck := app.BaseApp.NewContext(true, tmproto.Header{}) 20 validator, found := app.StakingKeeper.GetValidator(ctxCheck, addr) 21 22 require.Equal(t, expFound, found) 23 return validator 24 } 25 26 func checkDelegation( 27 t *testing.T, app *simapp.SimApp, delegatorAddr sdk.AccAddress, 28 validatorAddr sdk.ValAddress, expFound bool, expShares sdk.Dec, 29 ) { 30 ctxCheck := app.BaseApp.NewContext(true, tmproto.Header{}) 31 delegation, found := app.StakingKeeper.GetDelegation(ctxCheck, delegatorAddr, validatorAddr) 32 if expFound { 33 require.True(t, found) 34 require.True(sdk.DecEq(t, expShares, delegation.Shares)) 35 36 return 37 } 38 39 require.False(t, found) 40 } 41 42 func TestStakingMsgs(t *testing.T) { 43 genTokens := sdk.TokensFromConsensusPower(42, sdk.DefaultPowerReduction) 44 bondTokens := sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction) 45 genCoin := sdk.NewCoin(sdk.DefaultBondDenom, genTokens) 46 bondCoin := sdk.NewCoin(sdk.DefaultBondDenom, bondTokens) 47 48 acc1 := &authtypes.BaseAccount{Address: addr1.String()} 49 acc2 := &authtypes.BaseAccount{Address: addr2.String()} 50 accs := authtypes.GenesisAccounts{acc1, acc2} 51 balances := []banktypes.Balance{ 52 { 53 Address: addr1.String(), 54 Coins: sdk.Coins{genCoin}, 55 }, 56 { 57 Address: addr2.String(), 58 Coins: sdk.Coins{genCoin}, 59 }, 60 } 61 62 app := simapp.SetupWithGenesisAccounts(accs, balances...) 63 simapp.CheckBalance(t, app, addr1, sdk.Coins{genCoin}) 64 simapp.CheckBalance(t, app, addr2, sdk.Coins{genCoin}) 65 66 // create validator 67 description := types.NewDescription("foo_moniker", "", "", "", "") 68 createValidatorMsg, err := types.NewMsgCreateValidator( 69 sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commissionRates, sdk.OneInt(), 70 ) 71 require.NoError(t, err) 72 73 header := tmproto.Header{Height: app.LastBlockHeight() + 1} 74 txGen := simapp.MakeTestEncodingConfig().TxConfig 75 _, _, err = simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{createValidatorMsg}, "", []uint64{0}, []uint64{0}, true, true, priv1) 76 require.NoError(t, err) 77 simapp.CheckBalance(t, app, addr1, sdk.Coins{genCoin.Sub(bondCoin)}) 78 79 header = tmproto.Header{Height: app.LastBlockHeight() + 1} 80 app.BeginBlock(ocabci.RequestBeginBlock{Header: header}) 81 82 validator := checkValidator(t, app, sdk.ValAddress(addr1), true) 83 require.Equal(t, sdk.ValAddress(addr1).String(), validator.OperatorAddress) 84 require.Equal(t, types.Bonded, validator.Status) 85 require.True(sdk.IntEq(t, bondTokens, validator.BondedTokens())) 86 87 header = tmproto.Header{Height: app.LastBlockHeight() + 1} 88 app.BeginBlock(ocabci.RequestBeginBlock{Header: header}) 89 90 // edit the validator 91 description = types.NewDescription("bar_moniker", "", "", "", "") 92 editValidatorMsg := types.NewMsgEditValidator(sdk.ValAddress(addr1), description, nil, nil) 93 94 header = tmproto.Header{Height: app.LastBlockHeight() + 1} 95 _, _, err = simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{editValidatorMsg}, "", []uint64{0}, []uint64{1}, true, true, priv1) 96 require.NoError(t, err) 97 98 validator = checkValidator(t, app, sdk.ValAddress(addr1), true) 99 require.Equal(t, description, validator.Description) 100 101 // delegate 102 simapp.CheckBalance(t, app, addr2, sdk.Coins{genCoin}) 103 delegateMsg := types.NewMsgDelegate(addr2, sdk.ValAddress(addr1), bondCoin) 104 105 header = tmproto.Header{Height: app.LastBlockHeight() + 1} 106 _, _, err = simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{delegateMsg}, "", []uint64{1}, []uint64{0}, true, true, priv2) 107 require.NoError(t, err) 108 109 simapp.CheckBalance(t, app, addr2, sdk.Coins{genCoin.Sub(bondCoin)}) 110 checkDelegation(t, app, addr2, sdk.ValAddress(addr1), true, bondTokens.ToDec()) 111 112 // begin unbonding 113 beginUnbondingMsg := types.NewMsgUndelegate(addr2, sdk.ValAddress(addr1), bondCoin) 114 header = tmproto.Header{Height: app.LastBlockHeight() + 1} 115 _, _, err = simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{beginUnbondingMsg}, "", []uint64{1}, []uint64{1}, true, true, priv2) 116 require.NoError(t, err) 117 118 // delegation should exist anymore 119 checkDelegation(t, app, addr2, sdk.ValAddress(addr1), false, sdk.Dec{}) 120 121 // balance should be the same because bonding not yet complete 122 simapp.CheckBalance(t, app, addr2, sdk.Coins{genCoin.Sub(bondCoin)}) 123 }