cosmos-sdk/x/stake/simulation/msgs.go

257 lines
10 KiB
Go
Raw Normal View History

2018-07-17 15:04:10 -07:00
package simulation
import (
"fmt"
"math/rand"
"testing"
"github.com/stretchr/testify/require"
"github.com/cosmos/cosmos-sdk/baseapp"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
"github.com/cosmos/cosmos-sdk/x/mock"
"github.com/cosmos/cosmos-sdk/x/mock/simulation"
"github.com/cosmos/cosmos-sdk/x/stake"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/crypto"
)
// SimulateMsgCreateValidator
func SimulateMsgCreateValidator(m auth.AccountMapper, k stake.Keeper) simulation.Operation {
2018-07-17 16:27:51 -07:00
return func(t *testing.T, r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, keys []crypto.PrivKey, log string, event func(string)) (action string, err sdk.Error) {
2018-07-17 15:04:10 -07:00
denom := k.GetParams(ctx).BondDenom
description := stake.Description{
Moniker: simulation.RandStringOfLength(r, 10),
}
2018-07-18 23:47:54 -07:00
key := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
pubkey := key.PubKey()
address := sdk.AccAddress(pubkey.Address())
amount := m.GetAccount(ctx, address).GetCoins().AmountOf(denom)
if amount.GT(sdk.ZeroInt()) {
2018-07-18 23:47:54 -07:00
amount = simulation.RandomAmount(r, amount)
2018-07-17 15:04:10 -07:00
}
if amount.Equal(sdk.ZeroInt()) {
2018-07-18 00:47:55 -07:00
return "no-operation", nil
2018-07-17 15:04:10 -07:00
}
msg := stake.MsgCreateValidator{
Description: description,
ValidatorAddr: address,
DelegatorAddr: address,
PubKey: pubkey,
2018-07-30 17:09:50 -07:00
Delegation: sdk.NewCoin(denom, amount),
2018-07-17 15:04:10 -07:00
}
require.Nil(t, msg.ValidateBasic(), "expected msg to pass ValidateBasic: %s", msg.GetSignBytes())
ctx, write := ctx.CacheContext()
result := stake.NewHandler(k)(ctx, msg)
if result.IsOK() {
write()
}
2018-07-17 16:27:51 -07:00
event(fmt.Sprintf("stake/MsgCreateValidator/%v", result.IsOK()))
2018-07-17 15:04:10 -07:00
// require.True(t, result.IsOK(), "expected OK result but instead got %v", result)
action = fmt.Sprintf("TestMsgCreateValidator: ok %v, msg %s", result.IsOK(), msg.GetSignBytes())
2018-07-17 15:04:10 -07:00
return action, nil
}
}
// SimulateMsgEditValidator
func SimulateMsgEditValidator(k stake.Keeper) simulation.Operation {
2018-07-17 16:27:51 -07:00
return func(t *testing.T, r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, keys []crypto.PrivKey, log string, event func(string)) (action string, err sdk.Error) {
2018-07-17 15:04:10 -07:00
description := stake.Description{
Moniker: simulation.RandStringOfLength(r, 10),
Identity: simulation.RandStringOfLength(r, 10),
Website: simulation.RandStringOfLength(r, 10),
Details: simulation.RandStringOfLength(r, 10),
}
2018-07-18 23:47:54 -07:00
key := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
pubkey := key.PubKey()
address := sdk.AccAddress(pubkey.Address())
msg := stake.MsgEditValidator{
Description: description,
ValidatorAddr: address,
}
require.Nil(t, msg.ValidateBasic(), "expected msg to pass ValidateBasic: %s", msg.GetSignBytes())
ctx, write := ctx.CacheContext()
result := stake.NewHandler(k)(ctx, msg)
if result.IsOK() {
write()
}
2018-07-17 16:27:51 -07:00
event(fmt.Sprintf("stake/MsgEditValidator/%v", result.IsOK()))
action = fmt.Sprintf("TestMsgEditValidator: ok %v, msg %s", result.IsOK(), msg.GetSignBytes())
2018-07-17 15:04:10 -07:00
return action, nil
}
}
// SimulateMsgDelegate
func SimulateMsgDelegate(m auth.AccountMapper, k stake.Keeper) simulation.Operation {
2018-07-17 16:27:51 -07:00
return func(t *testing.T, r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, keys []crypto.PrivKey, log string, event func(string)) (action string, err sdk.Error) {
2018-07-17 15:04:10 -07:00
denom := k.GetParams(ctx).BondDenom
2018-07-18 23:47:54 -07:00
validatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
validatorAddress := sdk.AccAddress(validatorKey.PubKey().Address())
2018-07-18 23:47:54 -07:00
delegatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
delegatorAddress := sdk.AccAddress(delegatorKey.PubKey().Address())
amount := m.GetAccount(ctx, delegatorAddress).GetCoins().AmountOf(denom)
if amount.GT(sdk.ZeroInt()) {
2018-07-18 23:47:54 -07:00
amount = simulation.RandomAmount(r, amount)
2018-07-17 15:04:10 -07:00
}
if amount.Equal(sdk.ZeroInt()) {
2018-07-18 00:47:55 -07:00
return "no-operation", nil
2018-07-17 15:04:10 -07:00
}
msg := stake.MsgDelegate{
DelegatorAddr: delegatorAddress,
ValidatorAddr: validatorAddress,
2018-07-30 17:09:50 -07:00
Delegation: sdk.NewCoin(denom, amount),
2018-07-17 15:04:10 -07:00
}
require.Nil(t, msg.ValidateBasic(), "expected msg to pass ValidateBasic: %s", msg.GetSignBytes())
ctx, write := ctx.CacheContext()
result := stake.NewHandler(k)(ctx, msg)
if result.IsOK() {
write()
}
2018-07-17 16:27:51 -07:00
event(fmt.Sprintf("stake/MsgDelegate/%v", result.IsOK()))
action = fmt.Sprintf("TestMsgDelegate: ok %v, msg %s", result.IsOK(), msg.GetSignBytes())
2018-07-17 15:04:10 -07:00
return action, nil
}
}
// SimulateMsgBeginUnbonding
func SimulateMsgBeginUnbonding(m auth.AccountMapper, k stake.Keeper) simulation.Operation {
2018-07-17 16:27:51 -07:00
return func(t *testing.T, r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, keys []crypto.PrivKey, log string, event func(string)) (action string, err sdk.Error) {
2018-07-17 15:04:10 -07:00
denom := k.GetParams(ctx).BondDenom
2018-07-18 23:47:54 -07:00
validatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
validatorAddress := sdk.AccAddress(validatorKey.PubKey().Address())
2018-07-18 23:47:54 -07:00
delegatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
delegatorAddress := sdk.AccAddress(delegatorKey.PubKey().Address())
amount := m.GetAccount(ctx, delegatorAddress).GetCoins().AmountOf(denom)
if amount.GT(sdk.ZeroInt()) {
2018-07-18 23:47:54 -07:00
amount = simulation.RandomAmount(r, amount)
2018-07-17 15:04:10 -07:00
}
if amount.Equal(sdk.ZeroInt()) {
2018-07-18 00:47:55 -07:00
return "no-operation", nil
2018-07-17 15:04:10 -07:00
}
msg := stake.MsgBeginUnbonding{
DelegatorAddr: delegatorAddress,
ValidatorAddr: validatorAddress,
SharesAmount: sdk.NewDecFromInt(amount),
2018-07-17 15:04:10 -07:00
}
require.Nil(t, msg.ValidateBasic(), "expected msg to pass ValidateBasic: %s", msg.GetSignBytes())
ctx, write := ctx.CacheContext()
result := stake.NewHandler(k)(ctx, msg)
if result.IsOK() {
write()
}
2018-07-17 16:27:51 -07:00
event(fmt.Sprintf("stake/MsgBeginUnbonding/%v", result.IsOK()))
action = fmt.Sprintf("TestMsgBeginUnbonding: ok %v, msg %s", result.IsOK(), msg.GetSignBytes())
2018-07-17 15:04:10 -07:00
return action, nil
}
}
// SimulateMsgCompleteUnbonding
func SimulateMsgCompleteUnbonding(k stake.Keeper) simulation.Operation {
2018-07-17 16:27:51 -07:00
return func(t *testing.T, r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, keys []crypto.PrivKey, log string, event func(string)) (action string, err sdk.Error) {
2018-07-18 23:47:54 -07:00
validatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
validatorAddress := sdk.AccAddress(validatorKey.PubKey().Address())
2018-07-18 23:47:54 -07:00
delegatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
delegatorAddress := sdk.AccAddress(delegatorKey.PubKey().Address())
msg := stake.MsgCompleteUnbonding{
DelegatorAddr: delegatorAddress,
ValidatorAddr: validatorAddress,
}
require.Nil(t, msg.ValidateBasic(), "expected msg to pass ValidateBasic: %s", msg.GetSignBytes())
ctx, write := ctx.CacheContext()
result := stake.NewHandler(k)(ctx, msg)
if result.IsOK() {
write()
}
2018-07-17 16:27:51 -07:00
event(fmt.Sprintf("stake/MsgCompleteUnbonding/%v", result.IsOK()))
action = fmt.Sprintf("TestMsgCompleteUnbonding: ok %v, msg %s", result.IsOK(), msg.GetSignBytes())
2018-07-17 15:04:10 -07:00
return action, nil
}
}
// SimulateMsgBeginRedelegate
func SimulateMsgBeginRedelegate(m auth.AccountMapper, k stake.Keeper) simulation.Operation {
2018-07-17 16:27:51 -07:00
return func(t *testing.T, r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, keys []crypto.PrivKey, log string, event func(string)) (action string, err sdk.Error) {
2018-07-17 15:04:10 -07:00
denom := k.GetParams(ctx).BondDenom
2018-07-18 23:47:54 -07:00
sourceValidatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
sourceValidatorAddress := sdk.AccAddress(sourceValidatorKey.PubKey().Address())
2018-07-18 23:47:54 -07:00
destValidatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
destValidatorAddress := sdk.AccAddress(destValidatorKey.PubKey().Address())
2018-07-18 23:47:54 -07:00
delegatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
delegatorAddress := sdk.AccAddress(delegatorKey.PubKey().Address())
// TODO
amount := m.GetAccount(ctx, delegatorAddress).GetCoins().AmountOf(denom)
if amount.GT(sdk.ZeroInt()) {
2018-07-18 23:47:54 -07:00
amount = simulation.RandomAmount(r, amount)
2018-07-17 15:04:10 -07:00
}
if amount.Equal(sdk.ZeroInt()) {
2018-07-18 00:47:55 -07:00
return "no-operation", nil
2018-07-17 15:04:10 -07:00
}
msg := stake.MsgBeginRedelegate{
DelegatorAddr: delegatorAddress,
ValidatorSrcAddr: sourceValidatorAddress,
ValidatorDstAddr: destValidatorAddress,
SharesAmount: sdk.NewDecFromInt(amount),
2018-07-17 15:04:10 -07:00
}
require.Nil(t, msg.ValidateBasic(), "expected msg to pass ValidateBasic: %s", msg.GetSignBytes())
ctx, write := ctx.CacheContext()
result := stake.NewHandler(k)(ctx, msg)
if result.IsOK() {
write()
}
2018-07-17 16:27:51 -07:00
event(fmt.Sprintf("stake/MsgBeginRedelegate/%v", result.IsOK()))
2018-07-17 15:04:10 -07:00
action = fmt.Sprintf("TestMsgBeginRedelegate: %s", msg.GetSignBytes())
return action, nil
}
}
// SimulateMsgCompleteRedelegate
func SimulateMsgCompleteRedelegate(k stake.Keeper) simulation.Operation {
2018-07-17 16:27:51 -07:00
return func(t *testing.T, r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, keys []crypto.PrivKey, log string, event func(string)) (action string, err sdk.Error) {
2018-07-18 23:47:54 -07:00
validatorSrcKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
validatorSrcAddress := sdk.AccAddress(validatorSrcKey.PubKey().Address())
2018-07-18 23:47:54 -07:00
validatorDstKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
validatorDstAddress := sdk.AccAddress(validatorDstKey.PubKey().Address())
2018-07-18 23:47:54 -07:00
delegatorKey := simulation.RandomKey(r, keys)
2018-07-17 15:04:10 -07:00
delegatorAddress := sdk.AccAddress(delegatorKey.PubKey().Address())
msg := stake.MsgCompleteRedelegate{
DelegatorAddr: delegatorAddress,
ValidatorSrcAddr: validatorSrcAddress,
ValidatorDstAddr: validatorDstAddress,
}
require.Nil(t, msg.ValidateBasic(), "expected msg to pass ValidateBasic: %s", msg.GetSignBytes())
ctx, write := ctx.CacheContext()
result := stake.NewHandler(k)(ctx, msg)
if result.IsOK() {
write()
}
2018-07-17 16:27:51 -07:00
event(fmt.Sprintf("stake/MsgCompleteRedelegate/%v", result.IsOK()))
action = fmt.Sprintf("TestMsgCompleteRedelegate: ok %v, msg %s", result.IsOK(), msg.GetSignBytes())
2018-07-17 15:04:10 -07:00
return action, nil
}
}
2018-07-17 22:50:04 -07:00
// Setup
func Setup(mapp *mock.App, k stake.Keeper) simulation.RandSetup {
2018-07-17 15:04:10 -07:00
return func(r *rand.Rand, privKeys []crypto.PrivKey) {
ctx := mapp.NewContext(false, abci.Header{})
gen := stake.DefaultGenesisState()
2018-08-20 08:10:43 -07:00
gen.Params.InflationMax = sdk.NewDec(0)
gen.Params.InflationMin = sdk.NewDec(0)
stake.InitGenesis(ctx, k, gen)
2018-07-17 15:04:10 -07:00
params := k.GetParams(ctx)
denom := params.BondDenom
loose := sdk.ZeroInt()
mapp.AccountMapper.IterateAccounts(ctx, func(acc auth.Account) bool {
2018-07-18 23:47:54 -07:00
balance := simulation.RandomAmount(r, sdk.NewInt(1000000))
2018-07-30 17:09:50 -07:00
acc.SetCoins(acc.GetCoins().Plus(sdk.Coins{sdk.NewCoin(denom, balance)}))
2018-07-17 15:04:10 -07:00
mapp.AccountMapper.SetAccount(ctx, acc)
loose = loose.Add(balance)
return false
})
pool := k.GetPool(ctx)
pool.LooseTokens = pool.LooseTokens.Add(sdk.NewDec(loose.Int64()))
2018-07-17 15:04:10 -07:00
k.SetPool(ctx, pool)
}
}