@@ -2,6 +2,7 @@ package keeper
2
2
3
3
import (
4
4
"encoding/json"
5
+ "fmt"
5
6
6
7
wasmvmtypes "github.com/CosmWasm/wasmvm/types"
7
8
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -11,13 +12,26 @@ import (
11
12
distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
12
13
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
13
14
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
15
+ abci "github.com/tendermint/tendermint/abci/types"
14
16
)
15
17
16
18
type QueryHandler struct {
17
19
Ctx sdk.Context
18
20
Plugins QueryPlugins
19
21
}
20
22
23
+ // -- interfaces from baseapp - so we can use the GPRQueryRouter --
24
+
25
+ // GRPCQueryHandler defines a function type which handles ABCI Query requests
26
+ // using gRPC
27
+ type GRPCQueryHandler = func (ctx sdk.Context , req abci.RequestQuery ) (abci.ResponseQuery , error )
28
+
29
+ type GRPCQueryRouter interface {
30
+ Route (path string ) GRPCQueryHandler
31
+ }
32
+
33
+ // -- end baseapp interfaces --
34
+
21
35
var _ wasmvmtypes.Querier = QueryHandler {}
22
36
23
37
func (q QueryHandler ) Query (request wasmvmtypes.QueryRequest , gasLimit uint64 ) ([]byte , error ) {
@@ -40,6 +54,9 @@ func (q QueryHandler) Query(request wasmvmtypes.QueryRequest, gasLimit uint64) (
40
54
if request .Staking != nil {
41
55
return q .Plugins .Staking (subctx , request .Staking )
42
56
}
57
+ if request .Stargate != nil {
58
+ return q .Plugins .Stargate (subctx , request .Stargate )
59
+ }
43
60
if request .Wasm != nil {
44
61
return q .Plugins .Wasm (subctx , request .Wasm )
45
62
}
@@ -53,18 +70,20 @@ func (q QueryHandler) GasConsumed() uint64 {
53
70
type CustomQuerier func (ctx sdk.Context , request json.RawMessage ) ([]byte , error )
54
71
55
72
type QueryPlugins struct {
56
- Bank func (ctx sdk.Context , request * wasmvmtypes.BankQuery ) ([]byte , error )
57
- Custom CustomQuerier
58
- Staking func (ctx sdk.Context , request * wasmvmtypes.StakingQuery ) ([]byte , error )
59
- Wasm func (ctx sdk.Context , request * wasmvmtypes.WasmQuery ) ([]byte , error )
73
+ Bank func (ctx sdk.Context , request * wasmvmtypes.BankQuery ) ([]byte , error )
74
+ Custom CustomQuerier
75
+ Staking func (ctx sdk.Context , request * wasmvmtypes.StakingQuery ) ([]byte , error )
76
+ Stargate func (ctx sdk.Context , request * wasmvmtypes.StargateQuery ) ([]byte , error )
77
+ Wasm func (ctx sdk.Context , request * wasmvmtypes.WasmQuery ) ([]byte , error )
60
78
}
61
79
62
- func DefaultQueryPlugins (bank bankkeeper.ViewKeeper , staking stakingkeeper.Keeper , distKeeper distributionkeeper.Keeper , wasm * Keeper ) QueryPlugins {
80
+ func DefaultQueryPlugins (bank bankkeeper.ViewKeeper , staking stakingkeeper.Keeper , distKeeper distributionkeeper.Keeper , queryRouter GRPCQueryRouter , wasm * Keeper ) QueryPlugins {
63
81
return QueryPlugins {
64
- Bank : BankQuerier (bank ),
65
- Custom : NoCustomQuerier ,
66
- Staking : StakingQuerier (staking , distKeeper ),
67
- Wasm : WasmQuerier (wasm ),
82
+ Bank : BankQuerier (bank ),
83
+ Custom : NoCustomQuerier ,
84
+ Staking : StakingQuerier (staking , distKeeper ),
85
+ Stargate : StargateQuerier (queryRouter ),
86
+ Wasm : WasmQuerier (wasm ),
68
87
}
69
88
}
70
89
@@ -82,6 +101,9 @@ func (e QueryPlugins) Merge(o *QueryPlugins) QueryPlugins {
82
101
if o .Staking != nil {
83
102
e .Staking = o .Staking
84
103
}
104
+ if o .Stargate != nil {
105
+ e .Stargate = o .Stargate
106
+ }
85
107
if o .Wasm != nil {
86
108
e .Wasm = o .Wasm
87
109
}
@@ -124,6 +146,24 @@ func NoCustomQuerier(sdk.Context, json.RawMessage) ([]byte, error) {
124
146
return nil , wasmvmtypes.UnsupportedRequest {Kind : "custom" }
125
147
}
126
148
149
+ func StargateQuerier (queryRouter GRPCQueryRouter ) func (ctx sdk.Context , request * wasmvmtypes.StargateQuery ) ([]byte , error ) {
150
+ return func (ctx sdk.Context , msg * wasmvmtypes.StargateQuery ) ([]byte , error ) {
151
+ route := queryRouter .Route (msg .Path )
152
+ if route == nil {
153
+ return nil , wasmvmtypes.UnsupportedRequest {Kind : fmt .Sprintf ("No route to query '%s'" , msg .Path )}
154
+ }
155
+ req := abci.RequestQuery {
156
+ Data : msg .Data ,
157
+ Path : msg .Path ,
158
+ }
159
+ res , err := route (ctx , req )
160
+ if err != nil {
161
+ return nil , err
162
+ }
163
+ return res .Value , nil
164
+ }
165
+ }
166
+
127
167
func StakingQuerier (keeper stakingkeeper.Keeper , distKeeper distributionkeeper.Keeper ) func (ctx sdk.Context , request * wasmvmtypes.StakingQuery ) ([]byte , error ) {
128
168
return func (ctx sdk.Context , request * wasmvmtypes.StakingQuery ) ([]byte , error ) {
129
169
if request .BondedDenom != nil {
0 commit comments