Skip to content
This repository has been archived by the owner on Aug 1, 2024. It is now read-only.

Commit

Permalink
Merge pull request #83 from strangelove-ventures/steve/mailbox-delivered
Browse files Browse the repository at this point in the history
Add mailbox query for delivered messages
  • Loading branch information
misko9 authored Oct 10, 2023
2 parents 84c8019 + e74d5d1 commit 8396f47
Show file tree
Hide file tree
Showing 8 changed files with 607 additions and 43 deletions.
21 changes: 21 additions & 0 deletions interchaintest/helpers/mailbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,27 @@ func QueryCurrentTreeMetadata(
return stdout
}

// simd query hyperlane-mailbox delivered
func QueryMsgDelivered(
t *testing.T,
ctx context.Context,
chain *cosmos.CosmosChain,
msgId string,
) bool {
cmd := []string{
"simd", "query", "hyperlane-mailbox", "delivered", msgId,
"--node", chain.GetRPCAddress(),
"--home", chain.HomeDir(),
"--chain-id", chain.Config().ChainID,
}
stdout, _, err := chain.Exec(ctx, cmd, nil)
require.NoError(t, err)

fmt.Println("MsgDelivered stdout: ", string(stdout))

return strings.Contains(string(stdout), "true")
}

// simd query hyperlane-mailbox tree
func QueryCurrentTree(
t *testing.T,
Expand Down
18 changes: 12 additions & 6 deletions interchaintest/tests/module_mailbox_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"github.com/strangelove-ventures/interchaintest/v7/testutil"
"github.com/stretchr/testify/require"

common "github.com/strangelove-ventures/hyperlane-cosmos/x/common"
"github.com/strangelove-ventures/hyperlane-cosmos/x/ism/types/legacy_multisig"
)

Expand Down Expand Up @@ -75,27 +76,32 @@ func TestHyperlaneMailbox(t *testing.T) {
// Create first legacy multisig message from counter chain 1
sender := "0xbcb815f38D481a5EBA4D7ac4c9E74D9D0FC2A7e7"
destDomain := uint32(12345)
message, proof := counterChain1.CreateMessage(sender, destDomain, destDomain, contract, "Legacy Multisig 1")
message, proof := counterChain1.CreateMessage(sender, 1, destDomain, contract, "Legacy Multisig 1")
metadata := counterChain1.CreateLegacyMetadata(message, proof)
msgId := hexutil.Encode(common.Id(message))
delivered := helpers.QueryMsgDelivered(t, ctx, simd, msgId)
require.False(t, delivered)
helpers.CallProcessMsg(t, ctx, simd, user.KeyName(), hexutil.Encode(metadata), hexutil.Encode(message))
delivered = helpers.QueryMsgDelivered(t, ctx, simd, msgId)
require.True(t, delivered)

// Create second legacy multisig message from counter chain 1
message, proof = counterChain1.CreateMessage(sender, destDomain, destDomain, contract, "Legacy Multisig 2")
message, proof = counterChain1.CreateMessage(sender, 1, destDomain, contract, "Legacy Multisig 2")
metadata = counterChain1.CreateLegacyMetadata(message, proof)
helpers.CallProcessMsg(t, ctx, simd, user.KeyName(), hexutil.Encode(metadata), hexutil.Encode(message))

// Create third legacy multisig message from counter chain 1
message, proof = counterChain1.CreateMessage(sender, destDomain, destDomain, contract, "Legacy Multisig 3")
message, proof = counterChain1.CreateMessage(sender, 1, destDomain, contract, "Legacy Multisig 3")
metadata = counterChain1.CreateLegacyMetadata(message, proof)
helpers.CallProcessMsg(t, ctx, simd, user.KeyName(), hexutil.Encode(metadata), hexutil.Encode(message))

// Create first message id multisig message from counter chain 2
message, _ = counterChain2.CreateMessage(sender, destDomain, destDomain, contract, "Message Id Multisig 1")
message, _ = counterChain2.CreateMessage(sender, 2, destDomain, contract, "Message Id Multisig 1")
metadata = counterChain2.CreateMessageIdMetadata(message)
helpers.CallProcessMsg(t, ctx, simd, user.KeyName(), hexutil.Encode(metadata), hexutil.Encode(message))

// Create first merkle root multisig message from counter chain 3
message, proof = counterChain3.CreateMessage(sender, destDomain, destDomain, contract, "Merkle Root Multisig 1")
message, proof = counterChain3.CreateMessage(sender, 3, destDomain, contract, "Merkle Root Multisig 1")
metadata = counterChain3.CreateMerkleRootMetadata(message, proof)
helpers.CallProcessMsg(t, ctx, simd, user.KeyName(), hexutil.Encode(metadata), hexutil.Encode(message))

Expand All @@ -110,7 +116,7 @@ func TestHyperlaneMailbox(t *testing.T) {
require.NoError(t, err)
simd.ExecuteContract(ctx, user.KeyName(), contract, string(dipatchMsg))

err = testutil.WaitForBlocks(ctx, 125, simd)
err = testutil.WaitForBlocks(ctx, 2, simd)
require.NoError(t, err)
}

Expand Down
15 changes: 14 additions & 1 deletion proto/hyperlane/mailbox/v1/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ service Query {
rpc CurrentTree(QueryCurrentTreeRequest) returns (QueryCurrentTreeResponse) {
option (google.api.http).get = "/hyperlane/mailbox/v1/tree";
}

// Check if message was delivered
rpc MsgDelivered(QueryMsgDeliveredRequest)
returns (QueryMsgDeliveredResponse) {
option (google.api.http).get = "/hyperlane/mailbox/v1/delivered";
}
}

// QueryCurrentTreeMetadataRequest is the request type for the Query/Tree
Expand Down Expand Up @@ -49,4 +55,11 @@ message QueryCurrentTreeResponse {
message QueryDomainRequest {}

// QueryDomainResponse is the response type for the Query/Domain RPC method.
message QueryDomainResponse { uint32 domain = 1; }
message QueryDomainResponse { uint32 domain = 1; }

// QueryMsgDeliveredRequest is the request type to check if message was
// delivered
message QueryMsgDeliveredRequest { bytes message_id = 1; }

// QueryMsgDeliveredResponse is the response type if message was delivered
message QueryMsgDeliveredResponse { bool delivered = 1; }
3 changes: 2 additions & 1 deletion x/mailbox/client/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ func GetQueryCmd() *cobra.Command {
queryCmd.AddCommand(
getCurrentTreeMetadataCmd(),
getCurrentTreeCmd(),
getDomain(),
getDomainCmd(),
getMsgDeliveredCmd(),
)

return queryCmd
Expand Down
43 changes: 41 additions & 2 deletions x/mailbox/client/cli/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/version"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/spf13/cobra"

"github.com/strangelove-ventures/hyperlane-cosmos/x/mailbox/types"
Expand Down Expand Up @@ -74,8 +75,8 @@ func getCurrentTreeCmd() *cobra.Command {
return cmd
}

// getCurrentTreeMetadataCmd defines the command to query the current tree metadata
func getDomain() *cobra.Command {
// getDomainCmd defines the command to query the chain domain
func getDomainCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "domain",
Short: "Query domain",
Expand Down Expand Up @@ -104,3 +105,41 @@ func getDomain() *cobra.Command {

return cmd
}

// getMsgDeliveredCmd defines the command to query if a message has been delivered
func getMsgDeliveredCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "delivered [message-id-hex]",
Short: "Query message delivered",
Long: "Query whether a message has been delivered",
Example: fmt.Sprintf("%s query %s delivered [message-id-hex]", version.AppName, types.ModuleName),
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}
queryClient := types.NewQueryClient(clientCtx)

msgId, err := hexutil.Decode(args[0])
if err != nil {
return err
}

req := types.QueryMsgDeliveredRequest{
MessageId: msgId,
}

res, err := queryClient.MsgDelivered(context.Background(), &req)
if err != nil {
return err
}

return clientCtx.PrintProto(res)
},
}

flags.AddQueryFlagsToCmd(cmd)

return cmd
}
26 changes: 21 additions & 5 deletions x/mailbox/keeper/grpc_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"google.golang.org/grpc/status"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/ethereum/go-ethereum/common/hexutil"

"github.com/strangelove-ventures/hyperlane-cosmos/x/mailbox/types"
)
Expand All @@ -31,11 +32,6 @@ func (k Keeper) CurrentTree(c context.Context, req *types.QueryCurrentTreeReques
return nil, status.Error(codes.InvalidArgument, "empty request")
}

/*branches := [][]byte{}
for _, branch := range k.Tree.GetProofForNextIndex() {
branches = append(branches, branch[:])
}*/

return &types.QueryCurrentTreeResponse{
Branches: k.Tree.Branch[:],
Count: k.Tree.Count(),
Expand All @@ -57,3 +53,23 @@ func (k Keeper) Domain(c context.Context, req *types.QueryDomainRequest) (*types
Domain: domain,
}, nil
}

// MsgDelivered implements the Query/MsgDelivered gRPC method
func (k Keeper) MsgDelivered(c context.Context, req *types.QueryMsgDeliveredRequest) (*types.QueryMsgDeliveredResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "empty request")
}

delivered := false
msgId := hexutil.Encode(req.MessageId)

ctx := sdk.UnwrapSDKContext(c)
store := ctx.KVStore(k.storeKey)
if store.Has(types.MailboxDeliveredKey(msgId)) {
delivered = true
}

return &types.QueryMsgDeliveredResponse{
Delivered: delivered,
}, nil
}
Loading

0 comments on commit 8396f47

Please sign in to comment.