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