-
Notifications
You must be signed in to change notification settings - Fork 2
/
simulate.go
81 lines (72 loc) · 2.44 KB
/
simulate.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
package wasm
import (
"github.com/fibonacci-chain/fbc/app/rpc/simulator"
"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/baseapp"
"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
types2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
"github.com/fibonacci-chain/fbc/x/wasm/keeper"
"github.com/fibonacci-chain/fbc/x/wasm/proxy"
"github.com/fibonacci-chain/fbc/x/wasm/types"
)
type Simulator struct {
handler sdk.Handler
ctx sdk.Context
k *keeper.Keeper
}
func NewWasmSimulator() simulator.Simulator {
k := NewProxyKeeper()
h := NewHandler(keeper.NewDefaultPermissionKeeper(k))
ctx := proxy.MakeContext(k.GetStoreKey())
return &Simulator{
handler: h,
k: &k,
ctx: ctx,
}
}
func (w *Simulator) Simulate(msgs []sdk.Msg) (*sdk.Result, error) {
//wasm Result has no Logs
data := make([]byte, 0, len(msgs))
events := sdk.EmptyEvents()
for _, msg := range msgs {
res, err := w.handler(w.ctx, msg)
if err != nil {
return nil, err
}
data = append(data, res.Data...)
events = events.AppendEvents(res.Events)
}
return &sdk.Result{
Data: data,
Events: events,
}, nil
}
func (w *Simulator) Context() *sdk.Context {
return &w.ctx
}
func NewProxyKeeper() keeper.Keeper {
cdc := codec.New()
RegisterCodec(cdc)
bank.RegisterCodec(cdc)
interfaceReg := types2.NewInterfaceRegistry()
RegisterInterfaces(interfaceReg)
bank.RegisterInterface(interfaceReg)
protoCdc := codec.NewProtoCodec(interfaceReg)
ss := proxy.SubspaceProxy{}
akp := proxy.NewAccountKeeperProxy()
bkp := proxy.NewBankKeeperProxy(akp)
pkp := proxy.PortKeeperProxy{}
ckp := proxy.CapabilityKeeperProxy{}
skp := proxy.SupplyKeeperProxy{}
msgRouter := baseapp.NewMsgServiceRouter()
msgRouter.SetInterfaceRegistry(interfaceReg)
queryRouter := baseapp.NewGRPCQueryRouter()
queryRouter.SetInterfaceRegistry(interfaceReg)
k := keeper.NewSimulateKeeper(codec.NewCodecProxy(protoCdc, cdc), sdk.NewKVStoreKey(StoreKey), ss, akp, bkp, nil, pkp, ckp, nil, msgRouter, queryRouter, WasmDir(), WasmConfig(), SupportedFeatures)
types.RegisterMsgServer(msgRouter, keeper.NewMsgServerImpl(keeper.NewDefaultPermissionKeeper(k)))
types.RegisterQueryServer(queryRouter, NewQuerier(&k))
bank.RegisterBankMsgServer(msgRouter, bank.NewMsgServerImpl(bkp))
bank.RegisterQueryServer(queryRouter, bank.NewBankQueryServer(bkp, skp))
return k
}