-
Notifications
You must be signed in to change notification settings - Fork 557
/
sim_msgs.go
132 lines (112 loc) · 4.32 KB
/
sim_msgs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package simulation
import (
"errors"
legacysimulationtype "github.com/cosmos/cosmos-sdk/types/simulation"
"github.com/osmosis-labs/osmosis/osmoutils"
"github.com/osmosis-labs/osmosis/v16/simulation/simtypes"
"github.com/osmosis-labs/osmosis/v16/x/tokenfactory/keeper"
"github.com/osmosis-labs/osmosis/v16/x/tokenfactory/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// RandomMsgCreateDenom creates a random tokenfactory denom that is no greater than 44 alphanumeric characters
func RandomMsgCreateDenom(k keeper.Keeper, sim *simtypes.SimCtx, ctx sdk.Context) (*types.MsgCreateDenom, error) {
minCoins := k.GetParams(ctx).DenomCreationFee
acc, err := sim.RandomSimAccountWithMinCoins(ctx, minCoins)
if err != nil {
return nil, err
}
return &types.MsgCreateDenom{
Sender: acc.Address.String(),
Subdenom: sim.RandStringOfLength(types.MaxSubdenomLength),
}, nil
}
// RandomMsgMintDenom takes a random denom that has been created and uses the denom's admin to mint a random amount
func RandomMsgMintDenom(k keeper.Keeper, sim *simtypes.SimCtx, ctx sdk.Context) (*types.MsgMint, error) {
acc, senderExists := sim.RandomSimAccountWithConstraint(accountCreatedTokenFactoryDenom(k, ctx))
if !senderExists {
return nil, errors.New("no addr has created a tokenfactory coin")
}
denom, addr, err := getTokenFactoryDenomAndItsAdmin(k, sim, ctx, acc)
if err != nil {
return nil, err
}
if addr == nil {
return nil, errors.New("denom has no admin")
}
// TODO: Replace with an improved rand exponential coin
mintAmount := sim.RandPositiveInt(sdk.NewIntFromUint64(1000_000000))
return &types.MsgMint{
Sender: addr.String(),
Amount: sdk.NewCoin(denom, mintAmount),
}, nil
}
// RandomMsgBurnDenom takes a random denom that has been created and uses the denom's admin to burn a random amount
func RandomMsgBurnDenom(k keeper.Keeper, sim *simtypes.SimCtx, ctx sdk.Context) (*types.MsgBurn, error) {
acc, senderExists := sim.RandomSimAccountWithConstraint(accountCreatedTokenFactoryDenom(k, ctx))
if !senderExists {
return nil, errors.New("no addr has created a tokenfactory coin")
}
denom, addr, err := getTokenFactoryDenomAndItsAdmin(k, sim, ctx, acc)
if err != nil {
return nil, err
}
if addr == nil {
return nil, errors.New("denom has no admin")
}
denomBal := sim.BankKeeper().GetBalance(ctx, addr, denom)
if denomBal.IsZero() {
return nil, errors.New("addr does not have enough balance to burn")
}
// TODO: Replace with an improved rand exponential coin
burnAmount := sim.RandPositiveInt(denomBal.Amount)
return &types.MsgBurn{
Sender: addr.String(),
Amount: sdk.NewCoin(denom, burnAmount),
}, nil
}
// RandomMsgChangeAdmin takes a random denom that has been created and changes the admin to another random account
func RandomMsgChangeAdmin(k keeper.Keeper, sim *simtypes.SimCtx, ctx sdk.Context) (*types.MsgChangeAdmin, error) {
acc, senderExists := sim.RandomSimAccountWithConstraint(accountCreatedTokenFactoryDenom(k, ctx))
if !senderExists {
return nil, errors.New("no addr has created a tokenfactory coin")
}
denom, addr, err := getTokenFactoryDenomAndItsAdmin(k, sim, ctx, acc)
if err != nil {
return nil, err
}
if addr == nil {
return nil, errors.New("denom has no admin")
}
newAdmin := sim.RandomSimAccount()
if newAdmin.Address.String() == addr.String() {
return nil, errors.New("new admin cannot be the same as current admin")
}
return &types.MsgChangeAdmin{
Sender: addr.String(),
Denom: denom,
NewAdmin: newAdmin.Address.String(),
}, nil
}
func accountCreatedTokenFactoryDenom(k keeper.Keeper, ctx sdk.Context) simtypes.SimAccountConstraint {
return func(acc legacysimulationtype.Account) bool {
store := k.GetCreatorPrefixStore(ctx, acc.Address.String())
iterator := store.Iterator(nil, nil)
defer iterator.Close()
return iterator.Valid()
}
}
func getTokenFactoryDenomAndItsAdmin(k keeper.Keeper, sim *simtypes.SimCtx, ctx sdk.Context, acc legacysimulationtype.Account) (string, sdk.AccAddress, error) {
store := k.GetCreatorPrefixStore(ctx, acc.Address.String())
denoms := osmoutils.GatherAllKeysFromStore(store)
denom := simtypes.RandSelect(sim, denoms...)
authData, err := k.GetAuthorityMetadata(ctx, denom)
if err != nil {
return "", nil, err
}
admin := authData.Admin
addr, err := sdk.AccAddressFromBech32(admin)
if err != nil {
return "", nil, err
}
return denom, addr, nil
}