-
Notifications
You must be signed in to change notification settings - Fork 39
/
msg_binding.go
112 lines (92 loc) · 3.38 KB
/
msg_binding.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
package types
import (
"encoding/json"
wasmvmtypes "github.com/CosmWasm/wasmvm/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
// Routes of pre-determined wasm querier
const (
WasmMsgParserRouteBank = "bank"
WasmMsgParserRouteStaking = "staking"
WasmMsgParserRouteDistribution = "distribution"
WasmMsgParserRouteGov = "gov"
WasmMsgParserRouteMarket = "market"
WasmMsgParserRouteWasm = "wasm"
)
// WasmMsgParserInterface - msg parsers of each module
type WasmMsgParserInterface interface {
Parse(contractAddr sdk.AccAddress, msg wasmvmtypes.CosmosMsg) (sdk.Msg, error)
ParseCustom(contractAddr sdk.AccAddress, data json.RawMessage) (sdk.Msg, error)
}
// StargateWasmMsgParserInterface - stargate msg parsers
type StargateWasmMsgParserInterface interface {
Parse(msg wasmvmtypes.CosmosMsg) (sdk.Msg, error)
}
// WasmCustomMsg - wasm custom msg parser
type WasmCustomMsg struct {
Route string `json:"route"`
MsgData json.RawMessage `json:"msg_data"`
}
// MsgParser - holds multiple module msg parsers
type MsgParser struct {
Parsers map[string]WasmMsgParserInterface
StargateParser StargateWasmMsgParserInterface
}
// NewWasmMsgParser returns wasm msg parser
func NewWasmMsgParser() MsgParser {
return MsgParser{
Parsers: make(map[string]WasmMsgParserInterface),
}
}
// Parse convert Wasm raw msg to chain msg
func (p MsgParser) Parse(ctx sdk.Context, contractAddr sdk.AccAddress, msg wasmvmtypes.CosmosMsg) (sdk.Msg, error) {
switch {
case msg.Bank != nil:
if msg.Bank.Burn != nil {
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, "Burn not supported")
}
if parser, ok := p.Parsers[WasmMsgParserRouteBank]; ok {
return parser.Parse(contractAddr, msg)
}
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, WasmMsgParserRouteBank)
case msg.Custom != nil:
var customMsg WasmCustomMsg
err := json.Unmarshal(msg.Custom, &customMsg)
if err != nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
}
if parser, ok := p.Parsers[customMsg.Route]; ok {
return parser.ParseCustom(contractAddr, customMsg.MsgData)
}
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, customMsg.Route)
case msg.Staking != nil:
if parser, ok := p.Parsers[WasmMsgParserRouteStaking]; ok {
return parser.Parse(contractAddr, msg)
}
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, WasmMsgParserRouteStaking)
case msg.Distribution != nil:
if parser, ok := p.Parsers[WasmMsgParserRouteDistribution]; ok {
return parser.Parse(contractAddr, msg)
}
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, WasmMsgParserRouteDistribution)
case msg.Gov != nil:
if parser, ok := p.Parsers[WasmMsgParserRouteGov]; ok {
return parser.Parse(contractAddr, msg)
}
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, WasmMsgParserRouteGov)
case msg.Wasm != nil:
if parser, ok := p.Parsers[WasmMsgParserRouteWasm]; ok {
return parser.Parse(contractAddr, msg)
}
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, WasmMsgParserRouteWasm)
case msg.Stargate != nil:
if p.StargateParser != nil {
return p.StargateParser.Parse(msg)
}
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, "stargate")
case msg.IBC != nil:
return nil, sdkerrors.Wrap(ErrNoRegisteredParser, "IBC not supported")
}
return nil, sdkerrors.Wrap(ErrInvalidMsg, "failed to parse empty msg")
}