Skip to content

Commit 712a1d6

Browse files
committed
chore: add packet acknowledgements rpc
1 parent 831a351 commit 712a1d6

File tree

6 files changed

+962
-66
lines changed

6 files changed

+962
-66
lines changed

modules/core/04-channel/v2/keeper/grpc_query.go

+63-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
clienttypes "github.com/cosmos/ibc-go/v9/modules/core/02-client/types"
1818
"github.com/cosmos/ibc-go/v9/modules/core/04-channel/v2/types"
1919
host "github.com/cosmos/ibc-go/v9/modules/core/24-host"
20-
hostv2 "github.com/cosmos/ibc-go/v9/modules/core/24-host/v2"
2120
)
2221

2322
var _ types.QueryServer = (*queryServer)(nil)
@@ -113,7 +112,7 @@ func (q *queryServer) PacketCommitments(ctx context.Context, req *types.QueryPac
113112
}
114113

115114
var commitments []*types.PacketState
116-
store := prefix.NewStore(runtime.KVStoreAdapter(q.storeService.OpenKVStore(ctx)), hostv2.PacketCommitmentPrefixKey(req.ChannelId))
115+
store := prefix.NewStore(runtime.KVStoreAdapter(q.storeService.OpenKVStore(ctx)), types.PacketCommitmentPrefixKey(req.ChannelId))
117116

118117
pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error {
119118
keySplit := strings.Split(string(key), "/")
@@ -165,6 +164,68 @@ func (q *queryServer) PacketAcknowledgement(ctx context.Context, req *types.Quer
165164
return types.NewQueryPacketAcknowledgementResponse(acknowledgement, nil, clienttypes.GetSelfHeight(ctx)), nil
166165
}
167166

167+
// PacketAcknowledgements implements the Query/PacketAcknowledgements gRPC method.
168+
func (q *queryServer) PacketAcknowledgements(ctx context.Context, req *types.QueryPacketAcknowledgementsRequest) (*types.QueryPacketAcknowledgementsResponse, error) {
169+
if req == nil {
170+
return nil, status.Error(codes.InvalidArgument, "empty request")
171+
}
172+
173+
if err := host.ChannelIdentifierValidator(req.ChannelId); err != nil {
174+
return nil, status.Error(codes.InvalidArgument, err.Error())
175+
}
176+
177+
if !q.HasChannel(ctx, req.ChannelId) {
178+
return nil, status.Error(codes.NotFound, errorsmod.Wrapf(types.ErrChannelNotFound, req.ChannelId).Error())
179+
}
180+
181+
var acks []*types.PacketState
182+
store := prefix.NewStore(runtime.KVStoreAdapter(q.storeService.OpenKVStore(ctx)), types.PacketAcknowledgementPrefixKey(req.ChannelId))
183+
184+
// if a list of packet sequences is provided then query for each specific ack and return a list <= len(req.PacketCommitmentSequences)
185+
// otherwise, maintain previous behaviour and perform paginated query
186+
for _, seq := range req.PacketCommitmentSequences {
187+
acknowledgement := q.GetPacketAcknowledgement(ctx, req.ChannelId, seq)
188+
if len(acknowledgement) == 0 {
189+
continue
190+
}
191+
192+
ack := types.NewPacketState(req.ChannelId, seq, acknowledgement)
193+
acks = append(acks, &ack)
194+
}
195+
196+
if len(req.PacketCommitmentSequences) > 0 {
197+
selfHeight := clienttypes.GetSelfHeight(ctx)
198+
return &types.QueryPacketAcknowledgementsResponse{
199+
Acknowledgements: acks,
200+
Pagination: nil,
201+
Height: selfHeight,
202+
}, nil
203+
}
204+
205+
pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error {
206+
keySplit := strings.Split(string(key), "/")
207+
208+
sequence := sdk.BigEndianToUint64([]byte(keySplit[len(keySplit)-1]))
209+
if sequence == 0 {
210+
return types.ErrInvalidPacket
211+
}
212+
213+
ack := types.NewPacketState(req.ChannelId, sequence, value)
214+
acks = append(acks, &ack)
215+
216+
return nil
217+
})
218+
if err != nil {
219+
return nil, err
220+
}
221+
222+
return &types.QueryPacketAcknowledgementsResponse{
223+
Acknowledgements: acks,
224+
Pagination: pageRes,
225+
Height: clienttypes.GetSelfHeight(ctx),
226+
}, nil
227+
}
228+
168229
// PacketReceipt implements the Query/PacketReceipt gRPC method.
169230
func (q *queryServer) PacketReceipt(ctx context.Context, req *types.QueryPacketReceiptRequest) (*types.QueryPacketReceiptResponse, error) {
170231
if req == nil {

modules/core/04-channel/v2/types/keys.go

+10
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,13 @@ const (
1414
// the creator key is not a part of the ics-24 host specification
1515
CreatorKey = "creator"
1616
)
17+
18+
// PacketCommitmentPrefixKey returns the store key prefix under which packet commitments for a particular channel are stored.
19+
func PacketCommitmentPrefixKey(channelID string) []byte {
20+
return append([]byte(channelID), byte(1))
21+
}
22+
23+
// PacketAcknowledgementPrefixKey returns the store key prefix under which packet acknowledgements for a particular channel are stored.
24+
func PacketAcknowledgementPrefixKey(channelID string) []byte {
25+
return append([]byte(channelID), byte(3))
26+
}

0 commit comments

Comments
 (0)