@@ -26,7 +26,13 @@ const (
26
26
queryRedelegationsEndpoint = "/query_redelegations"
27
27
)
28
28
29
- var addrKey = "address"
29
+ const addrKey = "address"
30
+
31
+ var (
32
+ ErrInvalidAddressFormat = errors .New ("address must be a valid account or validator address" )
33
+ ErrMissingAddress = errors .New ("address not specified" )
34
+ ErrInvalidAmount = errors .New ("amount must be greater than zero" )
35
+ )
30
36
31
37
// submitTxRequest represents a request to submit a raw transaction
32
38
type submitTxRequest struct {
@@ -78,6 +84,7 @@ type cancelUnbondRequest struct {
78
84
GasLimit uint64 `json:"gas_limit"`
79
85
}
80
86
87
+ // queryRedelegationsRequest represents a request to query redelegations
81
88
type queryRedelegationsRequest struct {
82
89
From string `json:"from"`
83
90
To string `json:"to"`
@@ -93,10 +100,16 @@ func (h *Handler) handleBalanceRequest(w http.ResponseWriter, r *http.Request) {
93
100
addrStr , exists := vars [addrKey ]
94
101
if exists {
95
102
// convert address to Address type
96
- addr , addrerr := types .AccAddressFromBech32 (addrStr )
97
- if addrerr != nil {
98
- writeError (w , http .StatusBadRequest , balanceEndpoint , addrerr )
99
- return
103
+ var addr state.AccAddress
104
+ addr , err = types .AccAddressFromBech32 (addrStr )
105
+ if err != nil {
106
+ // first check if it is a validator address and can be converted
107
+ valAddr , err := types .ValAddressFromBech32 (addrStr )
108
+ if err != nil {
109
+ writeError (w , http .StatusBadRequest , balanceEndpoint , ErrInvalidAddressFormat )
110
+ return
111
+ }
112
+ addr = valAddr .Bytes ()
100
113
}
101
114
bal , err = h .state .BalanceForAddress (r .Context (), addr )
102
115
} else {
@@ -190,13 +203,18 @@ func (h *Handler) handleTransfer(w http.ResponseWriter, r *http.Request) {
190
203
return
191
204
}
192
205
if req .Amount <= 0 {
193
- writeError (w , http .StatusBadRequest , transferEndpoint , errors . New ( "amount must be greater than 0" ) )
206
+ writeError (w , http .StatusBadRequest , transferEndpoint , ErrInvalidAmount )
194
207
return
195
208
}
196
209
addr , err := types .AccAddressFromBech32 (req .To )
197
210
if err != nil {
198
- writeError (w , http .StatusBadRequest , transferEndpoint , err )
199
- return
211
+ // first check if it is a validator address and can be converted
212
+ valAddr , err := types .ValAddressFromBech32 (req .To )
213
+ if err != nil {
214
+ writeError (w , http .StatusBadRequest , transferEndpoint , ErrInvalidAddressFormat )
215
+ return
216
+ }
217
+ addr = valAddr .Bytes ()
200
218
}
201
219
amount := types .NewInt (req .Amount )
202
220
@@ -224,7 +242,7 @@ func (h *Handler) handleDelegation(w http.ResponseWriter, r *http.Request) {
224
242
return
225
243
}
226
244
if req .Amount <= 0 {
227
- writeError (w , http .StatusBadRequest , delegationEndpoint , errors . New ( "amount must be greater than 0" ) )
245
+ writeError (w , http .StatusBadRequest , delegationEndpoint , ErrInvalidAmount )
228
246
return
229
247
}
230
248
addr , err := types .ValAddressFromBech32 (req .To )
@@ -258,7 +276,7 @@ func (h *Handler) handleUndelegation(w http.ResponseWriter, r *http.Request) {
258
276
return
259
277
}
260
278
if req .Amount <= 0 {
261
- writeError (w , http .StatusBadRequest , undelegationEndpoint , errors . New ( "amount must be greater than 0" ) )
279
+ writeError (w , http .StatusBadRequest , undelegationEndpoint , ErrInvalidAmount )
262
280
return
263
281
}
264
282
addr , err := types .ValAddressFromBech32 (req .From )
@@ -292,7 +310,7 @@ func (h *Handler) handleCancelUnbonding(w http.ResponseWriter, r *http.Request)
292
310
return
293
311
}
294
312
if req .Amount <= 0 {
295
- writeError (w , http .StatusBadRequest , cancelUnbondingEndpoint , errors . New ( "amount must be greater than 0" ) )
313
+ writeError (w , http .StatusBadRequest , cancelUnbondingEndpoint , ErrInvalidAmount )
296
314
return
297
315
}
298
316
addr , err := types .ValAddressFromBech32 (req .From )
@@ -326,7 +344,7 @@ func (h *Handler) handleRedelegation(w http.ResponseWriter, r *http.Request) {
326
344
return
327
345
}
328
346
if req .Amount <= 0 {
329
- writeError (w , http .StatusBadRequest , beginRedelegationEndpoint , errors . New ( "amount must be greater than 0" ) )
347
+ writeError (w , http .StatusBadRequest , beginRedelegationEndpoint , ErrInvalidAmount )
330
348
return
331
349
}
332
350
srcAddr , err := types .ValAddressFromBech32 (req .From )
@@ -362,7 +380,7 @@ func (h *Handler) handleQueryDelegation(w http.ResponseWriter, r *http.Request)
362
380
vars := mux .Vars (r )
363
381
addrStr , exists := vars [addrKey ]
364
382
if ! exists {
365
- writeError (w , http .StatusBadRequest , queryDelegationEndpoint , errors . New ( "address not specified" ) )
383
+ writeError (w , http .StatusBadRequest , queryDelegationEndpoint , ErrMissingAddress )
366
384
return
367
385
}
368
386
@@ -393,7 +411,7 @@ func (h *Handler) handleQueryUnbonding(w http.ResponseWriter, r *http.Request) {
393
411
vars := mux .Vars (r )
394
412
addrStr , exists := vars [addrKey ]
395
413
if ! exists {
396
- writeError (w , http .StatusBadRequest , queryUnbondingEndpoint , errors . New ( "address not specified" ) )
414
+ writeError (w , http .StatusBadRequest , queryUnbondingEndpoint , ErrMissingAddress )
397
415
return
398
416
}
399
417
0 commit comments