Fix QueryUnreceivedPackets/Acks (#7320)
* fix queries * proto stuff * rebuild proto-tools off old makefile * rm buf-stamp * fix godoc * rename and fix implementation of UnreceivedAcks * lint * Update proto/ibc/channel/query.proto Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> * Update x/ibc/04-channel/client/cli/query.go Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> Co-authored-by: Jack Zampolin <jack.zampolin@gmail.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
parent
23578a9612
commit
7b1efcb8ae
File diff suppressed because it is too large
Load Diff
@ -58,13 +58,21 @@ service Query {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}";
|
||||
}
|
||||
|
||||
// UnrelayedPackets returns all the unrelayed IBC packets associated with a
|
||||
// UnreceivedPackets returns all the unrelayed IBC packets associated with a
|
||||
// channel and sequences.
|
||||
rpc UnrelayedPackets(QueryUnrelayedPacketsRequest) returns (QueryUnrelayedPacketsResponse) {
|
||||
rpc UnreceivedPackets(QueryUnreceivedPacketsRequest) returns (QueryUnreceivedPacketsResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/"
|
||||
"{packet_commitment_sequences}/packet_acks/{acknowledgements}/unrelayed_packets";
|
||||
"{packet_commitment_sequences}/unreceived_packets";
|
||||
}
|
||||
|
||||
// UnrelayedAcks returns all the unrelayed IBC acknowledgements associated with a
|
||||
// channel and sequences.
|
||||
rpc UnrelayedAcks(QueryUnrelayedAcksRequest) returns (QueryUnrelayedAcksResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/"
|
||||
"{packet_commitment_sequences}/unrelayed_acks";
|
||||
}
|
||||
|
||||
|
||||
// NextSequenceReceive returns the next receive sequence for a given channel.
|
||||
rpc NextSequenceReceive(QueryNextSequenceReceiveRequest) returns (QueryNextSequenceReceiveResponse) {
|
||||
option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence";
|
||||
@ -250,24 +258,41 @@ message QueryPacketAcknowledgementResponse {
|
||||
ibc.client.Height proof_height = 4 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
// QueryUnrelayedPacketsRequest is the request type for the
|
||||
// Query/UnrelayedPackets RPC method
|
||||
message QueryUnrelayedPacketsRequest {
|
||||
// QueryUnreceivedPacketsRequest is the request type for the
|
||||
// Query/UnreceivedPackets RPC method
|
||||
message QueryUnreceivedPacketsRequest {
|
||||
// port unique identifier
|
||||
string port_id = 1;
|
||||
// channel unique identifier
|
||||
string channel_id = 2;
|
||||
// list of packet sequences
|
||||
repeated uint64 packet_commitment_sequences = 3;
|
||||
// flag indicating if the return value is packet commitments or
|
||||
// acknowledgements
|
||||
bool acknowledgements = 4;
|
||||
}
|
||||
|
||||
// QueryUnrelayedPacketsResponse is the request type for the
|
||||
// Query/UnrelayedPacketCommitments RPC method
|
||||
message QueryUnrelayedPacketsResponse {
|
||||
// list of unrelayed packet sequences
|
||||
// QueryUnreceivedPacketsResponse is the response type for the
|
||||
// Query/UnreceivedPacketCommitments RPC method
|
||||
message QueryUnreceivedPacketsResponse {
|
||||
// list of unreceived packet sequences
|
||||
repeated uint64 sequences = 1;
|
||||
// query block height
|
||||
ibc.client.Height height = 2 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
// QueryUnrelayedAcksRequest is the request type for the
|
||||
// Query/UnrelayedAcks RPC method
|
||||
message QueryUnrelayedAcksRequest {
|
||||
// port unique identifier
|
||||
string port_id = 1;
|
||||
// channel unique identifier
|
||||
string channel_id = 2;
|
||||
// list of commitment sequences
|
||||
repeated uint64 packet_commitment_sequences = 3;
|
||||
}
|
||||
|
||||
// QueryUnrelayedAcksResponse is the response type for the
|
||||
// Query/UnrelayedAcks RPC method
|
||||
message QueryUnrelayedAcksResponse {
|
||||
// list of unrelayed acknowledgement sequences
|
||||
repeated uint64 sequences = 1;
|
||||
// query block height
|
||||
ibc.client.Height height = 2 [(gogoproto.nullable) = false];
|
||||
|
||||
@ -24,7 +24,8 @@ func GetQueryCmd() *cobra.Command {
|
||||
GetCmdQueryChannelClientState(),
|
||||
GetCmdQueryPacketCommitment(),
|
||||
GetCmdQueryPacketCommitments(),
|
||||
GetCmdQueryUnrelayedPackets(),
|
||||
GetCmdQueryUnreceivedPackets(),
|
||||
GetCmdQueryUnrelayedAcks(),
|
||||
GetCmdQueryNextSequenceReceive(),
|
||||
// TODO: next sequence Send ?
|
||||
)
|
||||
|
||||
@ -16,8 +16,7 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
flagSequences = "sequences"
|
||||
flagAcknowledgements = "acknowledgements"
|
||||
flagSequences = "sequences"
|
||||
)
|
||||
|
||||
// GetCmdQueryChannels defines the command to query all the channels ends
|
||||
@ -253,20 +252,18 @@ func GetCmdQueryPacketCommitment() *cobra.Command {
|
||||
return cmd
|
||||
}
|
||||
|
||||
// GetCmdQueryUnrelayedPackets defines the command to query all the unrelayed
|
||||
// packets for either packet commitments or acknowledgements.
|
||||
func GetCmdQueryUnrelayedPackets() *cobra.Command {
|
||||
// GetCmdQueryUnreceivedPackets defines the command to query all the unreceived
|
||||
// packets on the receiving chain
|
||||
func GetCmdQueryUnreceivedPackets() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "unrelayed-packets [port-id] [channel-id]",
|
||||
Short: "Query all the unrelayed packets associated with a channel",
|
||||
Long: `Determine if a packet, given a list of packet commitment sequences, is unrelayed.
|
||||
Use: "unreceived-packets [port-id] [channel-id]",
|
||||
Short: "Query all the unreceived packets associated with a channel",
|
||||
Long: `Determine if a packet, given a list of packet commitment sequences, is unreceived.
|
||||
|
||||
If the '-acknowledgements' flag is false (default) then the return value represents:
|
||||
- Unrelayed packet commitments: no acknowledgement exists for the given packet commitment sequence.
|
||||
|
||||
Otherwise, the return value represents:
|
||||
- Unrelayed packet acknowledgements: an acknowledgement exists for the given packet commitment sequence.`,
|
||||
Example: fmt.Sprintf("%s query %s %s unrelayed-packets [port-id] [channel-id] --sequences=1,2,3 --acknowledgements=false", version.AppName, host.ModuleName, types.SubModuleName),
|
||||
The return value represents:
|
||||
- Unreceived packet commitments: no acknowledgement exists on receiving chain for the given packet commitment sequence on sending chain.
|
||||
`,
|
||||
Example: fmt.Sprintf("%s query %s %s unreceived-packets [port-id] [channel-id] --sequences=1,2,3", version.AppName, host.ModuleName, types.SubModuleName),
|
||||
Args: cobra.ExactArgs(3),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
clientCtx := client.GetClientContextFromCmd(cmd)
|
||||
@ -281,24 +278,69 @@ Otherwise, the return value represents:
|
||||
return err
|
||||
}
|
||||
|
||||
acknowledgements, err := cmd.Flags().GetBool(flagAcknowledgements)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
seqs := make([]uint64, len(seqSlice))
|
||||
for i := range seqSlice {
|
||||
seqs[i] = uint64(seqSlice[i])
|
||||
}
|
||||
|
||||
req := &types.QueryUnrelayedPacketsRequest{
|
||||
req := &types.QueryUnreceivedPacketsRequest{
|
||||
PortId: args[0],
|
||||
ChannelId: args[1],
|
||||
PacketCommitmentSequences: seqs,
|
||||
Acknowledgements: acknowledgements,
|
||||
}
|
||||
|
||||
res, err := queryClient.UnrelayedPackets(context.Background(), req)
|
||||
res, err := queryClient.UnreceivedPackets(context.Background(), req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return clientCtx.PrintOutput(res)
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().Int64Slice(flagSequences, []int64{}, "comma separated list of packet sequence numbers")
|
||||
flags.AddQueryFlagsToCmd(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// GetCmdQueryUnrelayedAcks defines the command to query all the unrelayed acks on the original sending chain
|
||||
func GetCmdQueryUnrelayedAcks() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "unrelayed-acks [port-id] [channel-id]",
|
||||
Short: "Query all the unrelayed acks associated with a channel",
|
||||
Long: `Given a list of packet commitment sequences from counterparty, determine if an ack on executing chain has not been relayed to counterparty.
|
||||
|
||||
The return value represents:
|
||||
- Unrelayed packet acknowledgement: packet commitment exists on original sending chain and ack exists on receiving (executing) chain.
|
||||
`,
|
||||
Example: fmt.Sprintf("%s query %s %s unrelayed-acks [port-id] [channel-id] --sequences=1,2,3", version.AppName, host.ModuleName, types.SubModuleName),
|
||||
Args: cobra.ExactArgs(3),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
clientCtx := client.GetClientContextFromCmd(cmd)
|
||||
clientCtx, err := client.ReadQueryCommandFlags(clientCtx, cmd.Flags())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
queryClient := types.NewQueryClient(clientCtx)
|
||||
|
||||
seqSlice, err := cmd.Flags().GetInt64Slice(flagSequences)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
seqs := make([]uint64, len(seqSlice))
|
||||
for i := range seqSlice {
|
||||
seqs[i] = uint64(seqSlice[i])
|
||||
}
|
||||
|
||||
req := &types.QueryUnrelayedAcksRequest{
|
||||
PortId: args[0],
|
||||
ChannelId: args[1],
|
||||
PacketCommitmentSequences: seqs,
|
||||
}
|
||||
|
||||
res, err := queryClient.UnrelayedAcks(context.Background(), req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -308,7 +350,6 @@ Otherwise, the return value represents:
|
||||
}
|
||||
|
||||
cmd.Flags().Int64Slice(flagSequences, []int64{}, "comma separated list of packet sequence numbers")
|
||||
cmd.Flags().Bool(flagAcknowledgements, false, "boolean indicating if unrelayed acknowledgements (true) or unrelayed packet commitments (false) are returned.")
|
||||
flags.AddQueryFlagsToCmd(cmd)
|
||||
|
||||
return cmd
|
||||
|
||||
@ -309,17 +309,75 @@ func (q Keeper) PacketAcknowledgement(c context.Context, req *types.QueryPacketA
|
||||
return types.NewQueryPacketAcknowledgementResponse(req.PortId, req.ChannelId, req.Sequence, acknowledgementBz, nil, selfHeight), nil
|
||||
}
|
||||
|
||||
// UnrelayedPackets implements the Query/UnrelayedPackets gRPC method. Given
|
||||
// UnreceivedPackets implements the Query/UnreceivedPackets gRPC method. Given
|
||||
// a list of counterparty packet commitments, the querier checks if the packet
|
||||
// sequence has an acknowledgement stored. If req.Acknowledgements is true then
|
||||
// all unrelayed acknowledgements are returned (ack exists), otherwise all
|
||||
// unrelayed packet commitments are returned (ack does not exist).
|
||||
// has already been received by checking if an acknowledgement exists on this
|
||||
// chain for the packet sequence. All packets that haven't been received yet
|
||||
// are returned in the response
|
||||
// Usage: To use this method correctly, first query all packet commitments on
|
||||
// the sending chain using the Query/PacketCommitments gRPC method.
|
||||
// Then input the returned sequences into the QueryUnreceivedPacketsRequest
|
||||
// and send the request to this Query/UnreceivedPackets on the **receiving**
|
||||
// chain. This gRPC method will then return the list of packet sequences that
|
||||
// are yet to be received on the receiving chain.
|
||||
//
|
||||
// NOTE: The querier makes the assumption that the provided list of packet
|
||||
// commitments is correct and will not function properly if the list
|
||||
// is not up to date. Ideally the query height should equal the latest height
|
||||
// on the counterparty's client which represents this chain.
|
||||
func (q Keeper) UnrelayedPackets(c context.Context, req *types.QueryUnrelayedPacketsRequest) (*types.QueryUnrelayedPacketsResponse, error) {
|
||||
// TODO: Replace GetPacketAcknowledgement with GetPacketReceipt once async
|
||||
// acknowledgements issue is implemented.
|
||||
// Issue #7254: https://github.com/cosmos/cosmos-sdk/issues/7254
|
||||
func (q Keeper) UnreceivedPackets(c context.Context, req *types.QueryUnreceivedPacketsRequest) (*types.QueryUnreceivedPacketsResponse, error) {
|
||||
if req == nil {
|
||||
return nil, status.Error(codes.InvalidArgument, "empty request")
|
||||
}
|
||||
|
||||
if err := validategRPCRequest(req.PortId, req.ChannelId); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
|
||||
var unreceivedSequences = []uint64{}
|
||||
|
||||
for i, seq := range req.PacketCommitmentSequences {
|
||||
if seq == 0 {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "packet sequence %d cannot be 0", i)
|
||||
}
|
||||
|
||||
// if acknowledgement exists on the receiving chain, then packet has already been received
|
||||
if _, found := q.GetPacketAcknowledgement(ctx, req.PortId, req.ChannelId, seq); !found {
|
||||
unreceivedSequences = append(unreceivedSequences, seq)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
selfHeight := clienttypes.GetSelfHeight(ctx)
|
||||
return &types.QueryUnreceivedPacketsResponse{
|
||||
Sequences: unreceivedSequences,
|
||||
Height: selfHeight,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// UnrelayedAcks implements the Query/UnrelayedAcks gRPC method. Given
|
||||
// a list of counterparty packet acknowledgements, the querier checks if the packet
|
||||
// has already been received by checking if the packet commitment still exists on this
|
||||
// chain (original sender) for the packet sequence.
|
||||
// All acknowledgmeents that haven't been received yet are returned in the response.
|
||||
// Usage: To use this method correctly, first query all packet commitments on
|
||||
// the sending chain using the Query/PacketCommitments gRPC method.
|
||||
// Then input the returned sequences into the QueryUnrelayedPacketsRequest
|
||||
// and send the request to this Query/UnrelayedPackets on the **receiving**
|
||||
// chain. This gRPC method will then return the list of packet sequences whose
|
||||
// acknowledgements are already written on the receiving chain but haven't yet
|
||||
// been relayed back to the sending chain.
|
||||
//
|
||||
// NOTE: The querier makes the assumption that the provided list of packet
|
||||
// acknowledgements is correct and will not function properly if the list
|
||||
// is not up to date. Ideally the query height should equal the latest height
|
||||
// on the counterparty's client which represents this chain.
|
||||
func (q Keeper) UnrelayedAcks(c context.Context, req *types.QueryUnrelayedAcksRequest) (*types.QueryUnrelayedAcksResponse, error) {
|
||||
if req == nil {
|
||||
return nil, status.Error(codes.InvalidArgument, "empty request")
|
||||
}
|
||||
@ -337,16 +395,16 @@ func (q Keeper) UnrelayedPackets(c context.Context, req *types.QueryUnrelayedPac
|
||||
return nil, status.Errorf(codes.InvalidArgument, "packet sequence %d cannot be 0", i)
|
||||
}
|
||||
|
||||
// if req.Acknowledgements is true append sequences with an existing acknowledgement
|
||||
// otherwise append sequences without an existing acknowledgement.
|
||||
if _, found := q.GetPacketAcknowledgement(ctx, req.PortId, req.ChannelId, seq); found == req.Acknowledgements {
|
||||
// if packet commitment still exists on the original sending chain, then packet ack has not been received
|
||||
// since processing the ack will delete the packet commitment
|
||||
if _, found := q.GetPacketAcknowledgement(ctx, req.PortId, req.ChannelId, seq); found {
|
||||
unrelayedSequences = append(unrelayedSequences, seq)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
selfHeight := clienttypes.GetSelfHeight(ctx)
|
||||
return &types.QueryUnrelayedPacketsResponse{
|
||||
return &types.QueryUnrelayedAcksResponse{
|
||||
Sequences: unrelayedSequences,
|
||||
Height: selfHeight,
|
||||
}, nil
|
||||
|
||||
@ -835,9 +835,9 @@ func (suite *KeeperTestSuite) TestQueryPacketAcknowledgement() {
|
||||
}
|
||||
}
|
||||
|
||||
func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
func (suite *KeeperTestSuite) TestQueryUnreceivedPackets() {
|
||||
var (
|
||||
req *types.QueryUnrelayedPacketsRequest
|
||||
req *types.QueryUnreceivedPacketsRequest
|
||||
expSeq = []uint64{}
|
||||
)
|
||||
|
||||
@ -856,7 +856,7 @@ func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
{
|
||||
"invalid port ID",
|
||||
func() {
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
req = &types.QueryUnreceivedPacketsRequest{
|
||||
PortId: "",
|
||||
ChannelId: "test-channel-id",
|
||||
}
|
||||
@ -866,7 +866,7 @@ func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
{
|
||||
"invalid channel ID",
|
||||
func() {
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
req = &types.QueryUnreceivedPacketsRequest{
|
||||
PortId: "test-port-id",
|
||||
ChannelId: "",
|
||||
}
|
||||
@ -876,7 +876,7 @@ func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
{
|
||||
"invalid seq",
|
||||
func() {
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
req = &types.QueryUnreceivedPacketsRequest{
|
||||
PortId: "test-port-id",
|
||||
ChannelId: "test-channel-id",
|
||||
PacketCommitmentSequences: []uint64{0},
|
||||
@ -892,11 +892,10 @@ func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
// no ack exists
|
||||
|
||||
expSeq = []uint64{1}
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
req = &types.QueryUnreceivedPacketsRequest{
|
||||
PortId: channelA.PortID,
|
||||
ChannelId: channelA.ID,
|
||||
PacketCommitmentSequences: []uint64{1},
|
||||
Acknowledgements: false,
|
||||
}
|
||||
},
|
||||
true,
|
||||
@ -911,47 +910,10 @@ func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
suite.chainA.App.IBCKeeper.ChannelKeeper.SetPacketAcknowledgement(suite.chainA.GetContext(), channelA.PortID, channelA.ID, 1, ack.Hash)
|
||||
|
||||
expSeq = []uint64{}
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
req = &types.QueryUnreceivedPacketsRequest{
|
||||
PortId: channelA.PortID,
|
||||
ChannelId: channelA.ID,
|
||||
PacketCommitmentSequences: []uint64{1},
|
||||
Acknowledgements: false,
|
||||
}
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"basic success unrelayed acknowledgements",
|
||||
func() {
|
||||
_, _, _, _, channelA, _ := suite.coordinator.Setup(suite.chainA, suite.chainB, types.UNORDERED)
|
||||
|
||||
// ack exists
|
||||
ack := types.NewPacketAckCommitment(channelA.PortID, channelA.ID, 1, []byte("hash"))
|
||||
suite.chainA.App.IBCKeeper.ChannelKeeper.SetPacketAcknowledgement(suite.chainA.GetContext(), channelA.PortID, channelA.ID, 1, ack.Hash)
|
||||
|
||||
expSeq = []uint64{1}
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
PortId: channelA.PortID,
|
||||
ChannelId: channelA.ID,
|
||||
PacketCommitmentSequences: []uint64{1},
|
||||
Acknowledgements: true,
|
||||
}
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"basic success unrelayed acknowledgements, nothing to relay",
|
||||
func() {
|
||||
_, _, _, _, channelA, _ := suite.coordinator.Setup(suite.chainA, suite.chainB, types.UNORDERED)
|
||||
|
||||
// no ack exists
|
||||
|
||||
expSeq = []uint64{}
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
PortId: channelA.PortID,
|
||||
ChannelId: channelA.ID,
|
||||
PacketCommitmentSequences: []uint64{1},
|
||||
Acknowledgements: true,
|
||||
}
|
||||
},
|
||||
true,
|
||||
@ -975,17 +937,121 @@ func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
}
|
||||
}
|
||||
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
req = &types.QueryUnreceivedPacketsRequest{
|
||||
PortId: channelA.PortID,
|
||||
ChannelId: channelA.ID,
|
||||
PacketCommitmentSequences: packetCommitments,
|
||||
Acknowledgements: false,
|
||||
}
|
||||
},
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
|
||||
suite.SetupTest() // reset
|
||||
|
||||
tc.malleate()
|
||||
ctx := sdk.WrapSDKContext(suite.chainA.GetContext())
|
||||
|
||||
res, err := suite.chainA.QueryServer.UnreceivedPackets(ctx, req)
|
||||
|
||||
if tc.expPass {
|
||||
suite.Require().NoError(err)
|
||||
suite.Require().NotNil(res)
|
||||
suite.Require().Equal(expSeq, res.Sequences)
|
||||
} else {
|
||||
suite.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (suite *KeeperTestSuite) TestQueryUnrelayedAcks() {
|
||||
var (
|
||||
req *types.QueryUnrelayedAcksRequest
|
||||
expSeq = []uint64{}
|
||||
)
|
||||
|
||||
testCases := []struct {
|
||||
msg string
|
||||
malleate func()
|
||||
expPass bool
|
||||
}{
|
||||
{
|
||||
"empty request",
|
||||
func() {
|
||||
req = nil
|
||||
},
|
||||
false,
|
||||
},
|
||||
{
|
||||
"invalid port ID",
|
||||
func() {
|
||||
req = &types.QueryUnrelayedAcksRequest{
|
||||
PortId: "",
|
||||
ChannelId: "test-channel-id",
|
||||
}
|
||||
},
|
||||
false,
|
||||
},
|
||||
{
|
||||
"invalid channel ID",
|
||||
func() {
|
||||
req = &types.QueryUnrelayedAcksRequest{
|
||||
PortId: "test-port-id",
|
||||
ChannelId: "",
|
||||
}
|
||||
},
|
||||
false,
|
||||
},
|
||||
{
|
||||
"invalid seq",
|
||||
func() {
|
||||
req = &types.QueryUnrelayedAcksRequest{
|
||||
PortId: "test-port-id",
|
||||
ChannelId: "test-channel-id",
|
||||
PacketCommitmentSequences: []uint64{0},
|
||||
}
|
||||
},
|
||||
false,
|
||||
},
|
||||
{
|
||||
"basic success unrelayed packet acks",
|
||||
func() {
|
||||
_, _, _, _, channelA, _ := suite.coordinator.Setup(suite.chainA, suite.chainB, types.UNORDERED)
|
||||
|
||||
// ack exists
|
||||
ack := types.NewPacketAckCommitment(channelA.PortID, channelA.ID, 1, []byte("hash"))
|
||||
suite.chainA.App.IBCKeeper.ChannelKeeper.SetPacketAcknowledgement(suite.chainA.GetContext(), channelA.PortID, channelA.ID, 1, ack.Hash)
|
||||
|
||||
expSeq = []uint64{1}
|
||||
req = &types.QueryUnrelayedAcksRequest{
|
||||
PortId: channelA.PortID,
|
||||
ChannelId: channelA.ID,
|
||||
PacketCommitmentSequences: []uint64{1},
|
||||
}
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"success multiple unrelayed acknowledgements",
|
||||
"basic success unrelayed packet acknowledgements, nothing to relay",
|
||||
func() {
|
||||
_, _, _, _, channelA, _ := suite.coordinator.Setup(suite.chainA, suite.chainB, types.UNORDERED)
|
||||
|
||||
// no ack exists
|
||||
|
||||
expSeq = []uint64{}
|
||||
req = &types.QueryUnrelayedAcksRequest{
|
||||
PortId: channelA.PortID,
|
||||
ChannelId: channelA.ID,
|
||||
PacketCommitmentSequences: []uint64{1},
|
||||
}
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"success multiple unrelayed packet acknowledgements",
|
||||
func() {
|
||||
_, _, _, _, channelA, _ := suite.coordinator.Setup(suite.chainA, suite.chainB, types.UNORDERED)
|
||||
expSeq = []uint64{} // reset
|
||||
@ -1002,11 +1068,10 @@ func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
}
|
||||
}
|
||||
|
||||
req = &types.QueryUnrelayedPacketsRequest{
|
||||
req = &types.QueryUnrelayedAcksRequest{
|
||||
PortId: channelA.PortID,
|
||||
ChannelId: channelA.ID,
|
||||
PacketCommitmentSequences: packetCommitments,
|
||||
Acknowledgements: true,
|
||||
}
|
||||
},
|
||||
true,
|
||||
@ -1020,7 +1085,7 @@ func (suite *KeeperTestSuite) TestQueryUnrelayedPackets() {
|
||||
tc.malleate()
|
||||
ctx := sdk.WrapSDKContext(suite.chainA.GetContext())
|
||||
|
||||
res, err := suite.chainA.QueryServer.UnrelayedPackets(ctx, req)
|
||||
res, err := suite.chainA.QueryServer.UnrelayedAcks(ctx, req)
|
||||
|
||||
if tc.expPass {
|
||||
suite.Require().NoError(err)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -701,8 +701,8 @@ func local_request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler
|
||||
|
||||
}
|
||||
|
||||
func request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq QueryUnrelayedPacketsRequest
|
||||
func request_Query_UnreceivedPackets_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq QueryUnreceivedPacketsRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
var (
|
||||
@ -745,24 +745,13 @@ func request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Mar
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err)
|
||||
}
|
||||
|
||||
val, ok = pathParams["acknowledgements"]
|
||||
if !ok {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "acknowledgements")
|
||||
}
|
||||
|
||||
protoReq.Acknowledgements, err = runtime.Bool(val)
|
||||
|
||||
if err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "acknowledgements", err)
|
||||
}
|
||||
|
||||
msg, err := client.UnrelayedPackets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
msg, err := client.UnreceivedPackets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
func local_request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq QueryUnrelayedPacketsRequest
|
||||
func local_request_Query_UnreceivedPackets_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq QueryUnreceivedPacketsRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
var (
|
||||
@ -805,18 +794,105 @@ func local_request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runti
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err)
|
||||
}
|
||||
|
||||
val, ok = pathParams["acknowledgements"]
|
||||
msg, err := server.UnreceivedPackets(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
func request_Query_UnrelayedAcks_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq QueryUnrelayedAcksRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
var (
|
||||
val string
|
||||
ok bool
|
||||
err error
|
||||
_ = err
|
||||
)
|
||||
|
||||
val, ok = pathParams["channel_id"]
|
||||
if !ok {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "acknowledgements")
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id")
|
||||
}
|
||||
|
||||
protoReq.Acknowledgements, err = runtime.Bool(val)
|
||||
protoReq.ChannelId, err = runtime.String(val)
|
||||
|
||||
if err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "acknowledgements", err)
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err)
|
||||
}
|
||||
|
||||
msg, err := server.UnrelayedPackets(ctx, &protoReq)
|
||||
val, ok = pathParams["port_id"]
|
||||
if !ok {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id")
|
||||
}
|
||||
|
||||
protoReq.PortId, err = runtime.String(val)
|
||||
|
||||
if err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err)
|
||||
}
|
||||
|
||||
val, ok = pathParams["packet_commitment_sequences"]
|
||||
if !ok {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "packet_commitment_sequences")
|
||||
}
|
||||
|
||||
protoReq.PacketCommitmentSequences, err = runtime.Uint64Slice(val, ",")
|
||||
|
||||
if err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err)
|
||||
}
|
||||
|
||||
msg, err := client.UnrelayedAcks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
func local_request_Query_UnrelayedAcks_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq QueryUnrelayedAcksRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
var (
|
||||
val string
|
||||
ok bool
|
||||
err error
|
||||
_ = err
|
||||
)
|
||||
|
||||
val, ok = pathParams["channel_id"]
|
||||
if !ok {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id")
|
||||
}
|
||||
|
||||
protoReq.ChannelId, err = runtime.String(val)
|
||||
|
||||
if err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err)
|
||||
}
|
||||
|
||||
val, ok = pathParams["port_id"]
|
||||
if !ok {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id")
|
||||
}
|
||||
|
||||
protoReq.PortId, err = runtime.String(val)
|
||||
|
||||
if err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err)
|
||||
}
|
||||
|
||||
val, ok = pathParams["packet_commitment_sequences"]
|
||||
if !ok {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "packet_commitment_sequences")
|
||||
}
|
||||
|
||||
protoReq.PacketCommitmentSequences, err = runtime.Uint64Slice(val, ",")
|
||||
|
||||
if err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err)
|
||||
}
|
||||
|
||||
msg, err := server.UnrelayedAcks(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
@ -1063,7 +1139,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("GET", pattern_Query_UnrelayedPackets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
mux.Handle("GET", pattern_Query_UnreceivedPackets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
@ -1072,14 +1148,34 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := local_request_Query_UnrelayedPackets_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
resp, md, err := local_request_Query_UnreceivedPackets_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
forward_Query_UnrelayedPackets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
forward_Query_UnreceivedPackets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("GET", pattern_Query_UnrelayedAcks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := local_request_Query_UnrelayedAcks_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
forward_Query_UnrelayedAcks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
@ -1304,7 +1400,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("GET", pattern_Query_UnrelayedPackets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
mux.Handle("GET", pattern_Query_UnreceivedPackets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
@ -1313,14 +1409,34 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := request_Query_UnrelayedPackets_0(rctx, inboundMarshaler, client, req, pathParams)
|
||||
resp, md, err := request_Query_UnreceivedPackets_0(rctx, inboundMarshaler, client, req, pathParams)
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
forward_Query_UnrelayedPackets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
forward_Query_UnreceivedPackets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("GET", pattern_Query_UnrelayedAcks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := request_Query_UnrelayedAcks_0(rctx, inboundMarshaler, client, req, pathParams)
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
forward_Query_UnrelayedAcks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
@ -1364,7 +1480,9 @@ var (
|
||||
|
||||
pattern_Query_PacketAcknowledgement_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_acks", "sequence"}, "", runtime.AssumeColonVerbOpt(true)))
|
||||
|
||||
pattern_Query_UnrelayedPackets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8, 2, 9, 1, 0, 4, 1, 5, 10, 2, 11}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "packet_commitment_sequences", "packet_acks", "acknowledgements", "unrelayed_packets"}, "", runtime.AssumeColonVerbOpt(true)))
|
||||
pattern_Query_UnreceivedPackets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8, 2, 9}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "packet_commitment_sequences", "unreceived_packets"}, "", runtime.AssumeColonVerbOpt(true)))
|
||||
|
||||
pattern_Query_UnrelayedAcks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8, 2, 9}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "packet_commitment_sequences", "unrelayed_acks"}, "", runtime.AssumeColonVerbOpt(true)))
|
||||
|
||||
pattern_Query_NextSequenceReceive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "next_sequence"}, "", runtime.AssumeColonVerbOpt(true)))
|
||||
)
|
||||
@ -1386,7 +1504,9 @@ var (
|
||||
|
||||
forward_Query_PacketAcknowledgement_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_Query_UnrelayedPackets_0 = runtime.ForwardResponseMessage
|
||||
forward_Query_UnreceivedPackets_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_Query_UnrelayedAcks_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_Query_NextSequenceReceive_0 = runtime.ForwardResponseMessage
|
||||
)
|
||||
|
||||
@ -93,9 +93,14 @@ func (q Keeper) PacketAcknowledgement(c context.Context, req *channeltypes.Query
|
||||
return q.ChannelKeeper.PacketAcknowledgement(c, req)
|
||||
}
|
||||
|
||||
// UnrelayedPackets implements the IBC QueryServer interface
|
||||
func (q Keeper) UnrelayedPackets(c context.Context, req *channeltypes.QueryUnrelayedPacketsRequest) (*channeltypes.QueryUnrelayedPacketsResponse, error) {
|
||||
return q.ChannelKeeper.UnrelayedPackets(c, req)
|
||||
// UnreceivedPackets implements the IBC QueryServer interface
|
||||
func (q Keeper) UnreceivedPackets(c context.Context, req *channeltypes.QueryUnreceivedPacketsRequest) (*channeltypes.QueryUnreceivedPacketsResponse, error) {
|
||||
return q.ChannelKeeper.UnreceivedPackets(c, req)
|
||||
}
|
||||
|
||||
// UnrelayedAcks implements the IBC QueryServer interface
|
||||
func (q Keeper) UnrelayedAcks(c context.Context, req *channeltypes.QueryUnrelayedAcksRequest) (*channeltypes.QueryUnrelayedAcksResponse, error) {
|
||||
return q.ChannelKeeper.UnrelayedAcks(c, req)
|
||||
}
|
||||
|
||||
// NextSequenceReceive implements the IBC QueryServer interface
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user