Skip to content

Commit 32c935e

Browse files
mergify[bot]nir1218crodriguezvega
authored
add cli to get denom hash from trace path and base denom (backport #679) (#981)
* add cli to get denom hash from trace path and base denom (#679) * get denom hash from denom trace * revert .gitignore * final revert * ignore history files * Update modules/apps/transfer/client/cli/query.go Co-authored-by: Carlos Rodriguez <carlos@interchain.io> * Update modules/apps/transfer/keeper/grpc_query.go Co-authored-by: Carlos Rodriguez <carlos@interchain.io> * Update modules/apps/transfer/keeper/keeper.go Co-authored-by: Carlos Rodriguez <carlos@interchain.io> * Update modules/apps/transfer/keeper/grpc_query.go Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> * code review feedback integration * moved new feature to unreleased section * fix duplicate block in success test case * fix CHANGELOG format * fix invalid trace path argument error handling * refactor positive test case code Co-authored-by: Carlos Rodriguez <carlos@interchain.io> Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> (cherry picked from commit cb9bf5d) # Conflicts: # CHANGELOG.md # modules/apps/transfer/types/query.pb.go * fix merge conflict * fix more conflicts Co-authored-by: nir1218 <nir1218@users.noreply.github.com> Co-authored-by: Carlos Rodriguez <crodveg@gmail.com>
1 parent 89f0435 commit 32c935e

File tree

11 files changed

+777
-35
lines changed

11 files changed

+777
-35
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,6 @@ dependency-graph.png
5252
*.aux
5353
*.out
5454
*.synctex.gz
55+
56+
*.history
57+

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ Ref: https://keepachangelog.com/en/1.0.0/
3434

3535
# Changelog
3636

37+
## [v1.3.0](https://github.com/cosmos/ibc-go/releases/tag/v1.3.0) - 2022-03-01
38+
39+
### Features
40+
41+
* [\#679](https://github.com/cosmos/ibc-go/pull/679) New CLI command `query ibc-transfer denom-hash <denom trace>` to get the denom hash for a denom trace; this might be useful for debug
42+
3743
## [v1.2.6](https://github.com/cosmos/ibc-go/releases/tag/v1.2.6) - 2022-02-03
3844

3945
### Improvements

docs/client/swagger-ui/swagger.yaml

+66
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,54 @@ info:
44
description: A REST interface for state queries
55
version: 1.0.0
66
paths:
7+
'/ibc/apps/transfer/v1/denom_hashes/{trace}':
8+
get:
9+
summary: DenomHash queries a denomination hash information.
10+
operationId: DenomHash
11+
responses:
12+
'200':
13+
description: A successful response.
14+
schema:
15+
type: object
16+
properties:
17+
hash:
18+
type: string
19+
description: hash (in hex format) of the denomination trace information.
20+
description: >-
21+
QueryDenomHashResponse is the response type for the
22+
Query/DenomHash RPC
23+
24+
method.
25+
default:
26+
description: An unexpected error response
27+
schema:
28+
type: object
29+
properties:
30+
error:
31+
type: string
32+
code:
33+
type: integer
34+
format: int32
35+
message:
36+
type: string
37+
details:
38+
type: array
39+
items:
40+
type: object
41+
properties:
42+
type_url:
43+
type: string
44+
value:
45+
type: string
46+
format: byte
47+
parameters:
48+
- name: trace
49+
description: 'The denomination trace ([port_id]/[channel_id])+/[denom]'
50+
in: path
51+
required: true
52+
type: string
53+
tags:
54+
- Query
755
/ibc/apps/transfer/v1/denom_traces:
856
get:
957
summary: DenomTraces queries all denomination traces.
@@ -7326,6 +7374,15 @@ paths:
73267374
required: false
73277375
type: boolean
73287376
format: boolean
7377+
- name: packet_commitment_sequences
7378+
description: list of packet sequences.
7379+
in: query
7380+
required: false
7381+
type: array
7382+
items:
7383+
type: string
7384+
format: uint64
7385+
collectionFormat: multi
73297386
tags:
73307387
- Query
73317388
'/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}':
@@ -9839,6 +9896,15 @@ definitions:
98399896
SendEnabled
98409897
98419898
parameter for the denomination to false.
9899+
ibc.applications.transfer.v1.QueryDenomHashResponse:
9900+
type: object
9901+
properties:
9902+
hash:
9903+
type: string
9904+
description: hash (in hex format) of the denomination trace information.
9905+
description: |-
9906+
QueryDenomHashResponse is the response type for the Query/DenomHash RPC
9907+
method.
98429908
ibc.applications.transfer.v1.QueryDenomTraceResponse:
98439909
type: object
98449910
properties:

docs/ibc/proto-docs.md

+35
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
- [GenesisState](#ibc.applications.transfer.v1.GenesisState)
1414

1515
- [ibc/applications/transfer/v1/query.proto](#ibc/applications/transfer/v1/query.proto)
16+
- [QueryDenomHashRequest](#ibc.applications.transfer.v1.QueryDenomHashRequest)
17+
- [QueryDenomHashResponse](#ibc.applications.transfer.v1.QueryDenomHashResponse)
1618
- [QueryDenomTraceRequest](#ibc.applications.transfer.v1.QueryDenomTraceRequest)
1719
- [QueryDenomTraceResponse](#ibc.applications.transfer.v1.QueryDenomTraceResponse)
1820
- [QueryDenomTracesRequest](#ibc.applications.transfer.v1.QueryDenomTracesRequest)
@@ -358,6 +360,38 @@ GenesisState defines the ibc-transfer genesis state
358360

359361

360362

363+
<a name="ibc.applications.transfer.v1.QueryDenomHashRequest"></a>
364+
365+
### QueryDenomHashRequest
366+
QueryDenomHashRequest is the request type for the Query/DenomHash RPC
367+
method
368+
369+
370+
| Field | Type | Label | Description |
371+
| ----- | ---- | ----- | ----------- |
372+
| `trace` | [string](#string) | | The denomination trace ([port_id]/[channel_id])+/[denom] |
373+
374+
375+
376+
377+
378+
379+
<a name="ibc.applications.transfer.v1.QueryDenomHashResponse"></a>
380+
381+
### QueryDenomHashResponse
382+
QueryDenomHashResponse is the response type for the Query/DenomHash RPC
383+
method.
384+
385+
386+
| Field | Type | Label | Description |
387+
| ----- | ---- | ----- | ----------- |
388+
| `hash` | [string](#string) | | hash (in hex format) of the denomination trace information. |
389+
390+
391+
392+
393+
394+
361395
<a name="ibc.applications.transfer.v1.QueryDenomTraceRequest"></a>
362396

363397
### QueryDenomTraceRequest
@@ -464,6 +498,7 @@ Query provides defines the gRPC querier service.
464498
| `DenomTrace` | [QueryDenomTraceRequest](#ibc.applications.transfer.v1.QueryDenomTraceRequest) | [QueryDenomTraceResponse](#ibc.applications.transfer.v1.QueryDenomTraceResponse) | DenomTrace queries a denomination trace information. | GET|/ibc/apps/transfer/v1/denom_traces/{hash}|
465499
| `DenomTraces` | [QueryDenomTracesRequest](#ibc.applications.transfer.v1.QueryDenomTracesRequest) | [QueryDenomTracesResponse](#ibc.applications.transfer.v1.QueryDenomTracesResponse) | DenomTraces queries all denomination traces. | GET|/ibc/apps/transfer/v1/denom_traces|
466500
| `Params` | [QueryParamsRequest](#ibc.applications.transfer.v1.QueryParamsRequest) | [QueryParamsResponse](#ibc.applications.transfer.v1.QueryParamsResponse) | Params queries all parameters of the ibc-transfer module. | GET|/ibc/apps/transfer/v1/params|
501+
| `DenomHash` | [QueryDenomHashRequest](#ibc.applications.transfer.v1.QueryDenomHashRequest) | [QueryDenomHashResponse](#ibc.applications.transfer.v1.QueryDenomHashResponse) | DenomHash queries a denomination hash information. | GET|/ibc/apps/transfer/v1/denom_hashes/{trace}|
467502

468503
<!-- end services -->
469504

modules/apps/transfer/client/cli/cli.go

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func GetQueryCmd() *cobra.Command {
2020
GetCmdQueryDenomTraces(),
2121
GetCmdParams(),
2222
GetCmdQueryEscrowAddress(),
23+
GetCmdQueryDenomHash(),
2324
)
2425

2526
return queryCmd

modules/apps/transfer/client/cli/query.go

+32
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,35 @@ func GetCmdQueryEscrowAddress() *cobra.Command {
131131

132132
return cmd
133133
}
134+
135+
// GetCmdQueryDenomHash defines the command to query a denomination hash from a given trace.
136+
func GetCmdQueryDenomHash() *cobra.Command {
137+
cmd := &cobra.Command{
138+
Use: "denom-hash [trace]",
139+
Short: "Query the denom hash info from a given denom trace",
140+
Long: "Query the denom hash info from a given denom trace",
141+
Example: fmt.Sprintf("%s query ibc-transfer denom-hash [denom_trace]", version.AppName),
142+
Args: cobra.ExactArgs(1),
143+
RunE: func(cmd *cobra.Command, args []string) error {
144+
clientCtx, err := client.GetClientQueryContext(cmd)
145+
if err != nil {
146+
return err
147+
}
148+
queryClient := types.NewQueryClient(clientCtx)
149+
150+
req := &types.QueryDenomHashRequest{
151+
Trace: args[0],
152+
}
153+
154+
res, err := queryClient.DenomHash(cmd.Context(), req)
155+
if err != nil {
156+
return err
157+
}
158+
159+
return clientCtx.PrintProto(res)
160+
},
161+
}
162+
163+
flags.AddQueryFlagsToCmd(cmd)
164+
return cmd
165+
}

modules/apps/transfer/keeper/grpc_query.go

+27
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,30 @@ func (q Keeper) Params(c context.Context, _ *types.QueryParamsRequest) (*types.Q
8181
Params: &params,
8282
}, nil
8383
}
84+
85+
// DenomHash implements the Query/DenomHash gRPC method
86+
func (q Keeper) DenomHash(c context.Context, req *types.QueryDenomHashRequest) (*types.QueryDenomHashResponse, error) {
87+
if req == nil {
88+
return nil, status.Error(codes.InvalidArgument, "empty request")
89+
}
90+
91+
// Convert given request trace path to DenomTrace struct to confirm the path in a valid denom trace format
92+
denomTrace := types.ParseDenomTrace(req.Trace)
93+
if err := denomTrace.Validate(); err != nil {
94+
return nil, status.Error(codes.InvalidArgument, err.Error())
95+
}
96+
97+
ctx := sdk.UnwrapSDKContext(c)
98+
denomHash := denomTrace.Hash()
99+
found := q.HasDenomTrace(ctx, denomHash)
100+
if !found {
101+
return nil, status.Error(
102+
codes.NotFound,
103+
sdkerrors.Wrap(types.ErrTraceNotFound, req.Trace).Error(),
104+
)
105+
}
106+
107+
return &types.QueryDenomHashResponse{
108+
Hash: denomHash.String(),
109+
}, nil
110+
}

modules/apps/transfer/keeper/grpc_query_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,70 @@ func (suite *KeeperTestSuite) TestQueryParams() {
140140
res, _ := suite.queryClient.Params(ctx, &types.QueryParamsRequest{})
141141
suite.Require().Equal(&expParams, res.Params)
142142
}
143+
144+
func (suite *KeeperTestSuite) TestQueryDenomHash() {
145+
146+
reqTrace := types.DenomTrace{
147+
Path: "transfer/channelToA/transfer/channelToB",
148+
BaseDenom: "uatom",
149+
}
150+
151+
var (
152+
req *types.QueryDenomHashRequest
153+
expHash = reqTrace.Hash().String()
154+
)
155+
156+
testCases := []struct {
157+
msg string
158+
malleate func()
159+
expPass bool
160+
}{
161+
{
162+
"invalid trace",
163+
func() {
164+
req = &types.QueryDenomHashRequest{
165+
Trace: "transfer/channelToA/transfer/",
166+
}
167+
},
168+
false,
169+
},
170+
{
171+
"not found denom trace",
172+
func() {
173+
req = &types.QueryDenomHashRequest{
174+
Trace: "transfer/channelToC/uatom",
175+
}
176+
},
177+
false,
178+
},
179+
{
180+
"success",
181+
func() {},
182+
true,
183+
},
184+
}
185+
186+
for _, tc := range testCases {
187+
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
188+
suite.SetupTest() // reset
189+
190+
req = &types.QueryDenomHashRequest{
191+
Trace: reqTrace.GetFullDenomPath(),
192+
}
193+
suite.chainA.GetSimApp().TransferKeeper.SetDenomTrace(suite.chainA.GetContext(), reqTrace)
194+
195+
tc.malleate()
196+
ctx := sdk.WrapSDKContext(suite.chainA.GetContext())
197+
198+
res, err := suite.queryClient.DenomHash(ctx, req)
199+
200+
if tc.expPass {
201+
suite.Require().NoError(err)
202+
suite.Require().NotNil(res)
203+
suite.Require().Equal(expHash, res.Hash)
204+
} else {
205+
suite.Require().Error(err)
206+
}
207+
})
208+
}
209+
}

0 commit comments

Comments
 (0)