-
Notifications
You must be signed in to change notification settings - Fork 7
/
msgs.go
116 lines (93 loc) · 2.96 KB
/
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
package simulation
import (
"fmt"
"math/rand"
"github.com/cosmos/cosmos-sdk/baseapp"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/simulation"
"github.com/coinexchain/cet-sdk/modules/alias"
"github.com/coinexchain/cet-sdk/modules/alias/internal/keepers"
"github.com/coinexchain/cet-sdk/modules/alias/internal/types"
simulationx "github.com/coinexchain/cet-sdk/simulation"
)
// TODO
func SimulateMsgAliasUpdate(k keepers.Keeper) simulation.Operation {
return func(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simulation.Account) (
opMsg simulation.OperationMsg, fOps []simulation.FutureOperation, err error) {
isAdd := simulationx.RandomBool(r)
fromAcc, msg, err := createMsgAliasUpdate(r, ctx, k, accs, isAdd)
if err != nil {
return simulation.NoOpMsg(alias.ModuleName), nil, nil
}
ok := handleAlias(ctx, app, k, msg, fromAcc)
opMsg = simulation.NewOperationMsg(msg, ok, "")
if !ok {
return opMsg, nil, nil
}
if err = verify(ctx, k, msg); err != nil {
return opMsg, nil, err
}
return opMsg, nil, nil
}
}
func createMsgAliasUpdate(r *rand.Rand, ctx sdk.Context, k keepers.Keeper, accs []simulation.Account, isAdd bool) (
fromAcc simulation.Account, msg types.MsgAliasUpdate, err error) {
fromAcc = simulation.RandomAcc(r, accs)
if isAdd {
alias := randomAlias(r)
asDefault := simulationx.RandomBool(r)
msg = types.MsgAliasUpdate{
Owner: fromAcc.Address,
Alias: alias,
IsAdd: isAdd,
AsDefault: asDefault,
}
} else {
aliasList := getAccountAlias(ctx, k, fromAcc.Address)
if len(aliasList) == 0 {
return fromAcc, msg, fmt.Errorf("no alias to remove")
}
alias := randomAliasFromList(r, aliasList)
msg = types.MsgAliasUpdate{
Owner: fromAcc.Address,
Alias: alias,
IsAdd: isAdd,
}
}
if msg.ValidateBasic() != nil {
return fromAcc, msg, fmt.Errorf("expect msg to pass validation check")
}
return fromAcc, msg, nil
}
func handleAlias(ctx sdk.Context, app *baseapp.BaseApp, k keepers.Keeper, msg types.MsgAliasUpdate, fromAcc simulation.Account) bool {
handler := alias.NewHandler(k)
cachectx, write := ctx.CacheContext()
ok := handler(cachectx, msg).IsOK()
if ok {
write()
}
return ok
}
func verify(ctx sdk.Context, k keepers.Keeper, msg types.MsgAliasUpdate) error {
addr, asDefault := k.GetAddressFromAlias(ctx, msg.Alias)
if msg.IsAdd {
if !msg.Owner.Equals(sdk.AccAddress(addr)) || asDefault != msg.AsDefault {
return fmt.Errorf("alias added operation failed")
}
} else {
if addr != nil {
return fmt.Errorf("alias remove operation failed")
}
}
return nil
}
func getAccountAlias(ctx sdk.Context, k keepers.Keeper, addr sdk.AccAddress) []string {
return k.GetAliasListOfAccount(ctx, addr)
}
func randomAlias(r *rand.Rand) string {
aliasLength := r.Intn(aliasMaxLength-1) + aliasMinLength
return randomSymbol(r, aliasLength)
}
func randomAliasFromList(r *rand.Rand, aliasList []string) string {
return aliasList[r.Intn(len(aliasList))]
}