-
Notifications
You must be signed in to change notification settings - Fork 4
/
querier.go
90 lines (79 loc) · 2.63 KB
/
querier.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
package strongforce
import (
"encoding/base64"
"strings"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
abci "github.com/tendermint/tendermint/abci/types"
)
// NewQuerier returns a querier for strongforce
func NewQuerier(keeper Keeper) sdk.Querier {
return func(ctx sdk.Context, path []string, req abci.RequestQuery) ([]byte, sdk.Error) {
switch path[1] {
case "state":
{
addresses := strings.Split(path[2], "+")
stateMap := map[string][]byte{}
for _, element := range addresses {
id, err := base64.RawURLEncoding.DecodeString(element)
if err != nil {
return nil, sdk.ErrInvalidAddress("cannot parse strongforce contract address")
}
state := keeper.GetState(ctx, id)
stateMap[element] = state
}
result, err := codec.MarshalJSONIndent(keeper.cdc, stateMap)
if err != nil {
return nil, sdk.ErrInternal("could not convert address list to json")
}
return result, nil
}
case "addresses":
{
var addresses []string
for iterator := keeper.GetContractsStateIterator(ctx); iterator.Valid(); iterator.Next() {
address := iterator.Key()
addresses = append(addresses, base64.RawURLEncoding.EncodeToString(address))
}
result, err := codec.MarshalJSONIndent(keeper.cdc, addresses)
if err != nil {
return nil, sdk.ErrInternal("could not convert address list to json")
}
return result, nil
}
case "type":
{
var addresses []string
for iterator := keeper.GetContractsTypeIterator(ctx); iterator.Valid(); iterator.Next() {
address := iterator.Key()
value := string(iterator.Value())
if value == path[2] {
addresses = append(addresses, base64.RawURLEncoding.EncodeToString(address))
}
}
result, err := codec.MarshalJSONIndent(keeper.cdc, addresses)
if err != nil {
return nil, sdk.ErrInternal("could not convert address list to json")
}
return result, nil
}
case "amino-action-wrap":
{
var stdTx authtypes.StdTx
str := string(req.Data)
decodedStr, err := base64.StdEncoding.DecodeString(str)
keeper.cdc.MustUnmarshalJSON(decodedStr, &stdTx)
txBytes, err := keeper.cdc.MarshalBinaryLengthPrefixed(stdTx)
if err != nil {
return nil, sdk.ErrInternal("could not encode Action to amino")
}
//encoded := []byte(base64.StdEncoding.EncodeToString(txBytes))
return txBytes, nil
}
// return nil, sdk.ErrUnknownRequest("invalid parameters for strongforce/contract endpoint")
default:
return nil, sdk.ErrUnknownRequest("unknown strongforce query endpoint")
}
}
}