Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/apps/interchain-accounts/client.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,16 +84,16 @@ simd tx interchain-accounts host --help

##### `generate-packet-data`

The `generate-packet-data` command allows users to generate protobuf encoded interchain accounts packet data for input message(s). The packet data can then be used with the controller submodule's [`send-tx` command](#send-tx).
The `generate-packet-data` command allows users to generate protobuf or proto3 JSON encoded interchain accounts packet data for input message(s). The packet data can then be used with the controller submodule's [`send-tx` command](#send-tx). The encoding parameter must be either `proto3` or `proto3json`.

```shell
simd tx interchain-accounts host generate-packet-data [message]
simd tx interchain-accounts host generate-packet-data [encoding] [message]
```

Example:

```shell
simd tx interchain-accounts host generate-packet-data '[{
simd tx interchain-accounts host generate-packet-data proto3 '[{
"@type":"/cosmos.bank.v1beta1.MsgSend",
"from_address":"cosmos15ccshhmp0gsx29qpqq6g4zmltnnvgmyu9ueuadh9y2nc5zj0szls5gtddz",
"to_address":"cosmos10h9stc5v6ntgeygf5xf945njqq5h32r53uquvw",
Expand Down
34 changes: 20 additions & 14 deletions modules/apps/27-interchain-accounts/host/client/cli/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/cosmos/gogoproto/proto"
"github.com/spf13/cobra"
"golang.org/x/exp/slices"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/codec"
Expand All @@ -21,13 +22,13 @@ const (

func generatePacketDataCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "generate-packet-data [message]",
Short: "Generates protobuf encoded ICA packet data.",
Long: `generate-packet-data accepts a message string and serializes it using protobuf
into packet data which is outputted to stdout. It can be used in conjunction with send-tx"
which submits pre-built packet data containing messages to be executed on the host chain.
`,
Example: fmt.Sprintf(`%s tx interchain-accounts host generate-packet-data '{
Use: "generate-packet-data [encoding] [message]",
Short: "Generates protobuf or proto3 JSON encoded ICA packet data.",
Long: `generate-packet-data accepts a message string and serializes it (depending on the
encoding parameter) using protobuf or proto3 JSON into packet data which is outputted to stdout.
It can be used in conjunction with send-tx which submits pre-built packet data containing messages
to be executed on the host chain. The encoding parameter must be equal to either "proto3" o "proto3json".`,
Example: fmt.Sprintf(`%s tx interchain-accounts host generate-packet-data proto3 '{
"@type":"/cosmos.bank.v1beta1.MsgSend",
"from_address":"cosmos15ccshhmp0gsx29qpqq6g4zmltnnvgmyu9ueuadh9y2nc5zj0szls5gtddz",
"to_address":"cosmos10h9stc5v6ntgeygf5xf945njqq5h32r53uquvw",
Expand All @@ -40,7 +41,7 @@ which submits pre-built packet data containing messages to be executed on the ho
}' --memo memo


%s tx interchain-accounts host generate-packet-data '[{
%s tx interchain-accounts host generate-packet-data proto3 '[{
"@type":"/cosmos.bank.v1beta1.MsgSend",
"from_address":"cosmos15ccshhmp0gsx29qpqq6g4zmltnnvgmyu9ueuadh9y2nc5zj0szls5gtddz",
"to_address":"cosmos10h9stc5v6ntgeygf5xf945njqq5h32r53uquvw",
Expand All @@ -60,7 +61,7 @@ which submits pre-built packet data containing messages to be executed on the ho
"amount": "1000"
}
}]'`, version.AppName, version.AppName),
Args: cobra.ExactArgs(1),
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
Expand All @@ -74,7 +75,12 @@ which submits pre-built packet data containing messages to be executed on the ho
return err
}

packetDataBytes, err := generatePacketData(cdc, []byte(args[0]), memo)
encoding := args[0]
if !slices.Contains([]string{icatypes.EncodingProtobuf, icatypes.EncodingProto3JSON}, encoding) {
return fmt.Errorf("unsupported encoding type: %s", encoding)
}

packetDataBytes, err := generatePacketData(cdc, []byte(args[1]), memo, encoding)
if err != nil {
return err
}
Expand All @@ -91,13 +97,13 @@ which submits pre-built packet data containing messages to be executed on the ho

// generatePacketData takes in message bytes and a memo and serializes the message into an
// instance of InterchainAccountPacketData which is returned as bytes.
func generatePacketData(cdc *codec.ProtoCodec, msgBytes []byte, memo string) ([]byte, error) {
func generatePacketData(cdc *codec.ProtoCodec, msgBytes []byte, memo string, encoding string) ([]byte, error) {
protoMessages, err := convertBytesIntoProtoMessages(cdc, msgBytes)
if err != nil {
return nil, err
}

return generateIcaPacketDataFromProtoMessages(cdc, protoMessages, memo)
return generateIcaPacketDataFromProtoMessages(cdc, protoMessages, memo, encoding)
}

// convertBytesIntoProtoMessages returns a list of proto messages from bytes. The bytes can be in the form of a single
Expand Down Expand Up @@ -129,8 +135,8 @@ func convertBytesIntoProtoMessages(cdc *codec.ProtoCodec, msgBytes []byte) ([]pr
}

// generateIcaPacketDataFromProtoMessages generates ica packet data as bytes from a given set of proto encoded sdk messages and a memo.
func generateIcaPacketDataFromProtoMessages(cdc *codec.ProtoCodec, sdkMessages []proto.Message, memo string) ([]byte, error) {
icaPacketDataBytes, err := icatypes.SerializeCosmosTx(cdc, sdkMessages, icatypes.EncodingProtobuf)
func generateIcaPacketDataFromProtoMessages(cdc *codec.ProtoCodec, sdkMessages []proto.Message, memo string, encoding string) ([]byte, error) {
icaPacketDataBytes, err := icatypes.SerializeCosmosTx(cdc, sdkMessages, encoding)
if err != nil {
return nil, err
}
Expand Down
60 changes: 31 additions & 29 deletions modules/apps/27-interchain-accounts/host/client/cli/tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,44 +101,46 @@ func TestGeneratePacketData(t *testing.T) {
},
}

for _, tc := range tests {
tc := tc
ir := codectypes.NewInterfaceRegistry()
if tc.registerInterfaceFn != nil {
tc.registerInterfaceFn(ir)
}
encodings := []string{icatypes.EncodingProtobuf, icatypes.EncodingProto3JSON}
for _, encoding := range encodings {
for _, tc := range tests {
tc := tc
ir := codectypes.NewInterfaceRegistry()
if tc.registerInterfaceFn != nil {
tc.registerInterfaceFn(ir)
}

cdc := codec.NewProtoCodec(ir)
cdc := codec.NewProtoCodec(ir)

t.Run(tc.name, func(t *testing.T) {
bz, err := generatePacketData(cdc, []byte(tc.message), tc.memo)
t.Run(fmt.Sprintf("%s with %s encoding", tc.name, encoding), func(t *testing.T) {
bz, err := generatePacketData(cdc, []byte(tc.message), tc.memo, encoding)

if tc.expectedPass {
require.NoError(t, err)
require.NotNil(t, bz)
if tc.expectedPass {
require.NoError(t, err)
require.NotNil(t, bz)

packetData := icatypes.InterchainAccountPacketData{}
err = cdc.UnmarshalJSON(bz, &packetData)
require.NoError(t, err)
packetData := icatypes.InterchainAccountPacketData{}
err = cdc.UnmarshalJSON(bz, &packetData)
require.NoError(t, err)

require.Equal(t, icatypes.EXECUTE_TX, packetData.Type)
require.Equal(t, tc.memo, packetData.Memo)
require.Equal(t, icatypes.EXECUTE_TX, packetData.Type)
require.Equal(t, tc.memo, packetData.Memo)

data := packetData.Data
// cli tx commands always use protobuf encoding
messages, err := icatypes.DeserializeCosmosTx(cdc, data, icatypes.EncodingProtobuf)
data := packetData.Data
messages, err := icatypes.DeserializeCosmosTx(cdc, data, encoding)

require.NoError(t, err)
require.NotNil(t, messages)
require.NoError(t, err)
require.NotNil(t, messages)

if tc.assertionFn != nil {
tc.assertionFn(t, messages)
if tc.assertionFn != nil {
tc.assertionFn(t, messages)
}
} else {
require.Error(t, err)
require.Nil(t, bz)
}
} else {
require.Error(t, err)
require.Nil(t, bz)
}
})
})
}
}
}

Expand Down