-
Notifications
You must be signed in to change notification settings - Fork 39
/
interface.go
111 lines (89 loc) · 3.01 KB
/
interface.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
package wasm
import (
"encoding/json"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
wasmvmtypes "github.com/CosmWasm/wasmvm/types"
"github.com/classic-terra/core/x/market/keeper"
"github.com/classic-terra/core/x/market/types"
wasm "github.com/classic-terra/core/x/wasm/exported"
)
var (
_ wasm.WasmQuerierInterface = Querier{}
_ wasm.WasmMsgParserInterface = MsgParser{}
)
// WasmMsgParser - wasm msg parser for staking msgs
type MsgParser struct{}
// NewWasmMsgParser returns bank wasm msg parser
func NewWasmMsgParser() MsgParser {
return MsgParser{}
}
// Parse implements wasm staking msg parser
func (MsgParser) Parse(_ sdk.AccAddress, _ wasmvmtypes.CosmosMsg) (sdk.Msg, error) {
return nil, nil
}
// CosmosMsg only contains swap msg
type CosmosMsg struct {
Swap *types.MsgSwap `json:"swap,omitempty"`
SwapSend *types.MsgSwapSend `json:"swap_send,omitempty"`
}
// ParseCustom implements custom parser
func (MsgParser) ParseCustom(contractAddr sdk.AccAddress, data json.RawMessage) (sdk.Msg, error) {
var sdkMsg CosmosMsg
err := json.Unmarshal(data, &sdkMsg)
if err != nil {
return nil, sdkerrors.Wrap(err, "failed to parse market custom msg")
}
if sdkMsg.Swap != nil {
sdkMsg.Swap.Trader = contractAddr.String()
return sdkMsg.Swap, sdkMsg.Swap.ValidateBasic()
} else if sdkMsg.SwapSend != nil {
sdkMsg.SwapSend.FromAddress = contractAddr.String()
return sdkMsg.SwapSend, sdkMsg.SwapSend.ValidateBasic()
}
return nil, sdkerrors.Wrap(wasm.ErrInvalidMsg, "Unknown variant of Market")
}
// WasmQuerier - staking query interface for wasm contract
type Querier struct {
keeper keeper.Keeper
}
// NewWasmQuerier return bank wasm query interface
func NewWasmQuerier(keeper keeper.Keeper) Querier {
return Querier{keeper}
}
// Query - implement query function
func (Querier) Query(_ sdk.Context, _ wasmvmtypes.QueryRequest) ([]byte, error) {
return nil, nil
}
// CosmosQuery only contains swap simulation
type CosmosQuery struct {
Swap *types.QuerySwapParams `json:"swap,omitempty"`
}
// SwapQueryResponse - swap simulation query response for wasm module
type SwapQueryResponse struct {
Receive wasmvmtypes.Coin `json:"receive"`
}
// QueryCustom implements custom query interface
func (querier Querier) QueryCustom(ctx sdk.Context, data json.RawMessage) ([]byte, error) {
var params CosmosQuery
err := json.Unmarshal(data, ¶ms)
if err != nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
}
q := keeper.NewQuerier(querier.keeper)
if params.Swap != nil {
res, err := q.Swap(sdk.WrapSDKContext(ctx), &types.QuerySwapRequest{
OfferCoin: params.Swap.OfferCoin.String(),
AskDenom: params.Swap.AskDenom,
})
if err != nil {
return nil, err
}
bz, err := json.Marshal(SwapQueryResponse{Receive: wasm.EncodeSdkCoin(res.ReturnCoin)})
if err != nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
}
return bz, err
}
return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown Market variant"}
}