/
querier.go
183 lines (147 loc) · 6.19 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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
package checkpoint
import (
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
jsoniter "github.com/json-iterator/go"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/maticnetwork/heimdall/checkpoint/types"
"github.com/maticnetwork/heimdall/common"
"github.com/maticnetwork/heimdall/helper"
"github.com/maticnetwork/heimdall/staking"
"github.com/maticnetwork/heimdall/topup"
hmTypes "github.com/maticnetwork/heimdall/types"
)
// NewQuerier creates a querier for auth REST endpoints
func NewQuerier(keeper Keeper, stakingKeeper staking.Keeper, topupKeeper topup.Keeper, contractCaller helper.IContractCaller) sdk.Querier {
return func(ctx sdk.Context, path []string, req abci.RequestQuery) ([]byte, sdk.Error) {
switch path[0] {
case types.QueryParams:
return handleQueryParams(ctx, req, keeper)
case types.QueryAckCount:
return handleQueryAckCount(ctx, req, keeper)
case types.QueryCheckpoint:
return handleQueryCheckpoint(ctx, req, keeper)
case types.QueryCheckpointBuffer:
return handleQueryCheckpointBuffer(ctx, req, keeper)
case types.QueryLastNoAck:
return handleQueryLastNoAck(ctx, req, keeper)
case types.QueryCheckpointList:
return handleQueryCheckpointList(ctx, req, keeper)
case types.QueryNextCheckpoint:
return handleQueryNextCheckpoint(ctx, req, keeper, stakingKeeper, topupKeeper, contractCaller)
default:
return nil, sdk.ErrUnknownRequest("unknown auth query endpoint")
}
}
}
func handleQueryParams(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
bz, err := jsoniter.ConfigFastest.Marshal(keeper.GetParams(ctx))
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
}
return bz, nil
}
func handleQueryAckCount(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
bz, err := jsoniter.ConfigFastest.Marshal(keeper.GetACKCount(ctx))
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
}
return bz, nil
}
func handleQueryCheckpoint(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
var params types.QueryCheckpointParams
if err := keeper.cdc.UnmarshalJSON(req.Data, ¶ms); err != nil {
return nil, sdk.ErrInternal(fmt.Sprintf("failed to parse params: %s", err))
}
res, err := keeper.GetCheckpointByNumber(ctx, params.Number)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr(fmt.Sprintf("could not fetch checkpoint by index %v", params.Number), err.Error()))
}
bz, err := jsoniter.ConfigFastest.Marshal(res)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
}
return bz, nil
}
func handleQueryCheckpointBuffer(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
res, err := keeper.GetCheckpointFromBuffer(ctx)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not fetch checkpoint buffer", err.Error()))
}
if res == nil {
return nil, common.ErrNoCheckpointBufferFound(keeper.Codespace())
}
bz, err := jsoniter.ConfigFastest.Marshal(res)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
}
return bz, nil
}
func handleQueryLastNoAck(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
// get last no ack
res := keeper.GetLastNoAck(ctx)
// send result
bz, err := jsoniter.ConfigFastest.Marshal(res)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
}
return bz, nil
}
func handleQueryCheckpointList(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
var params hmTypes.QueryPaginationParams
if err := keeper.cdc.UnmarshalJSON(req.Data, ¶ms); err != nil {
return nil, sdk.ErrInternal(fmt.Sprintf("failed to parse params: %s", err))
}
res, err := keeper.GetCheckpointList(ctx, params.Page, params.Limit)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr(fmt.Sprintf("could not fetch checkpoint list with page %v and limit %v", params.Page, params.Limit), err.Error()))
}
bz, err := jsoniter.ConfigFastest.Marshal(res)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err.Error()))
}
return bz, nil
}
func handleQueryNextCheckpoint(ctx sdk.Context, req abci.RequestQuery, keeper Keeper, sk staking.Keeper, tk topup.Keeper, contractCaller helper.IContractCaller) ([]byte, sdk.Error) {
var queryParams types.QueryBorChainID
if err := keeper.cdc.UnmarshalJSON(req.Data, &queryParams); err != nil {
return nil, sdk.ErrInternal(fmt.Sprintf("failed to parse query params: %s", err))
}
// get validator set
validatorSet := sk.GetValidatorSet(ctx)
proposer := validatorSet.GetProposer()
ackCount := keeper.GetACKCount(ctx)
params := keeper.GetParams(ctx)
var start uint64
if ackCount != 0 {
checkpointNumber := ackCount
lastCheckpoint, err := keeper.GetCheckpointByNumber(ctx, checkpointNumber)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr(fmt.Sprintf("could not fetch checkpoint by index %v", checkpointNumber), err.Error()))
}
start = lastCheckpoint.EndBlock + 1
}
end := start + params.AvgCheckpointLength
rootHash, err := contractCaller.GetRootHash(start, end, params.MaxCheckpointLength)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr(fmt.Sprintf("could not fetch roothash for start:%v end:%v error:%v", start, end, err), err.Error()))
}
accs := tk.GetAllDividendAccounts(ctx)
accRootHash, err := types.GetAccountRootHash(accs)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr(fmt.Sprintf("could not get generate account root hash. Error:%v", err), err.Error()))
}
checkpointMsg := types.NewMsgCheckpointBlock(
proposer.Signer,
start,
start+params.AvgCheckpointLength,
hmTypes.BytesToHeimdallHash(rootHash),
hmTypes.BytesToHeimdallHash(accRootHash),
queryParams.BorChainID,
)
bz, err := jsoniter.ConfigFastest.Marshal(checkpointMsg)
if err != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr(fmt.Sprintf("could not marshall checkpoint msg. Error:%v", err), err.Error()))
}
return bz, nil
}