Skip to content

Commit 03ada27

Browse files
authored
ica: move Serialize/DeserializeCosmosTx to package types (#493)
* moving SerializeCosmosTx and DeserializeCosmosTx to types pkg * removing dead code * adding mockSdkMsg message type for failing codec test scenarios * Update modules/apps/27-interchain-accounts/types/codec_test.go
1 parent bd10403 commit 03ada27

File tree

7 files changed

+186
-89
lines changed

7 files changed

+186
-89
lines changed

modules/apps/27-interchain-accounts/keeper/keeper.go

-26
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66

77
baseapp "github.com/cosmos/cosmos-sdk/baseapp"
88
"github.com/cosmos/cosmos-sdk/codec"
9-
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
109
sdk "github.com/cosmos/cosmos-sdk/types"
1110
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
1211
capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
@@ -55,31 +54,6 @@ func NewKeeper(
5554
}
5655
}
5756

58-
// SerializeCosmosTx serializes a slice of sdk.Msg's using the CosmosTx type. The sdk.Msg's are
59-
// packed into Any's and inserted into the Messages field of a CosmosTx. The proto marshaled CosmosTx
60-
// bytes are returned.
61-
func (k Keeper) SerializeCosmosTx(cdc codec.BinaryCodec, msgs []sdk.Msg) (bz []byte, err error) {
62-
msgAnys := make([]*codectypes.Any, len(msgs))
63-
64-
for i, msg := range msgs {
65-
msgAnys[i], err = codectypes.NewAnyWithValue(msg)
66-
if err != nil {
67-
return nil, err
68-
}
69-
}
70-
71-
cosmosTx := &types.CosmosTx{
72-
Messages: msgAnys,
73-
}
74-
75-
bz, err = cdc.Marshal(cosmosTx)
76-
if err != nil {
77-
return nil, err
78-
}
79-
80-
return bz, nil
81-
}
82-
8357
// Logger returns the application logger, scoped to the associated module
8458
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
8559
return ctx.Logger().With("module", fmt.Sprintf("x/%s-%s", host.ModuleName, types.ModuleName))

modules/apps/27-interchain-accounts/keeper/relay.go

+1-25
Original file line numberDiff line numberDiff line change
@@ -75,30 +75,6 @@ func (k Keeper) createOutgoingPacket(
7575
return packet.Sequence, nil
7676
}
7777

78-
// DeserializeCosmosTx unmarshals and unpacks a slice of transaction bytes
79-
// into a slice of sdk.Msg's.
80-
func (k Keeper) DeserializeCosmosTx(_ sdk.Context, data []byte) ([]sdk.Msg, error) {
81-
var cosmosTx types.CosmosTx
82-
if err := k.cdc.Unmarshal(data, &cosmosTx); err != nil {
83-
return nil, err
84-
}
85-
86-
msgs := make([]sdk.Msg, len(cosmosTx.Messages))
87-
88-
for i, any := range cosmosTx.Messages {
89-
var msg sdk.Msg
90-
91-
err := k.cdc.UnpackAny(any, &msg)
92-
if err != nil {
93-
return nil, err
94-
}
95-
96-
msgs[i] = msg
97-
}
98-
99-
return msgs, nil
100-
}
101-
10278
func (k Keeper) AuthenticateTx(ctx sdk.Context, msgs []sdk.Msg, portId string) error {
10379
seen := map[string]bool{}
10480
var signers []sdk.AccAddress
@@ -176,7 +152,7 @@ func (k Keeper) OnRecvPacket(ctx sdk.Context, packet channeltypes.Packet) error
176152

177153
switch data.Type {
178154
case types.EXECUTE_TX:
179-
msgs, err := k.DeserializeCosmosTx(ctx, data.Data)
155+
msgs, err := types.DeserializeCosmosTx(k.cdc, data.Data)
180156
if err != nil {
181157
return err
182158
}

modules/apps/27-interchain-accounts/keeper/relay_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func (suite *KeeperTestSuite) TestTrySendTx() {
3535
interchainAccountAddr, _ := suite.chainB.GetSimApp().ICAKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), path.EndpointA.ChannelConfig.PortID)
3636
msg1 := &banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount}
3737
msg2 := &banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount}
38-
data, err := suite.chainB.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainB.GetSimApp().AppCodec(), []sdk.Msg{msg1, msg2})
38+
data, err := types.SerializeCosmosTx(suite.chainB.GetSimApp().AppCodec(), []sdk.Msg{msg1, msg2})
3939
suite.Require().NoError(err)
4040
icaPacketData.Data = data
4141
}, true,
@@ -79,7 +79,7 @@ func (suite *KeeperTestSuite) TestTrySendTx() {
7979
amount, _ := sdk.ParseCoinsNormalized("100stake")
8080
interchainAccountAddr, _ := suite.chainB.GetSimApp().ICAKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), path.EndpointA.ChannelConfig.PortID)
8181
msg := &banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount}
82-
data, err := suite.chainB.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainB.GetSimApp().AppCodec(), []sdk.Msg{msg})
82+
data, err := types.SerializeCosmosTx(suite.chainB.GetSimApp().AppCodec(), []sdk.Msg{msg})
8383
suite.Require().NoError(err)
8484

8585
// default packet data, must be modified in malleate for test cases expected to fail
@@ -122,7 +122,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
122122
interchainAccountAddr, _ := suite.chainB.GetSimApp().ICAKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), path.EndpointA.ChannelConfig.PortID)
123123
msg = &banktypes.MsgSend{FromAddress: interchainAccountAddr, ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount}
124124
// build packet data
125-
data, err := suite.chainA.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainA.Codec, []sdk.Msg{msg})
125+
data, err := types.SerializeCosmosTx(suite.chainA.Codec, []sdk.Msg{msg})
126126
suite.Require().NoError(err)
127127

128128
icaPacketData := types.InterchainAccountPacketData{
@@ -146,7 +146,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
146146
{
147147
"Invalid packet type", func() {
148148
// build packet data
149-
data, err := suite.chainA.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainA.Codec, []sdk.Msg{&banktypes.MsgSend{}})
149+
data, err := types.SerializeCosmosTx(suite.chainA.Codec, []sdk.Msg{&banktypes.MsgSend{}})
150150
suite.Require().NoError(err)
151151

152152
// Type here is an ENUM
@@ -175,7 +175,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
175175
// Incorrect FromAddress
176176
msg = &banktypes.MsgSend{FromAddress: suite.chainB.SenderAccount.GetAddress().String(), ToAddress: suite.chainB.SenderAccount.GetAddress().String(), Amount: amount}
177177
// build packet data
178-
data, err := suite.chainA.GetSimApp().ICAKeeper.SerializeCosmosTx(suite.chainA.Codec, []sdk.Msg{msg})
178+
data, err := types.SerializeCosmosTx(suite.chainA.Codec, []sdk.Msg{msg})
179179
suite.Require().NoError(err)
180180
icaPacketData := types.InterchainAccountPacketData{
181181
Type: types.EXECUTE_TX,

modules/apps/27-interchain-accounts/types/codec.go

+50
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package types
33
import (
44
"github.com/cosmos/cosmos-sdk/codec"
55
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
6+
sdk "github.com/cosmos/cosmos-sdk/types"
67
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
78
)
89

@@ -22,3 +23,52 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
2223
func RegisterInterfaces(registry codectypes.InterfaceRegistry) {
2324
registry.RegisterImplementations((*authtypes.AccountI)(nil), &InterchainAccount{})
2425
}
26+
27+
// SerializeCosmosTx serializes a slice of sdk.Msg's using the CosmosTx type. The sdk.Msg's are
28+
// packed into Any's and inserted into the Messages field of a CosmosTx. The proto marshaled CosmosTx
29+
// bytes are returned.
30+
func SerializeCosmosTx(cdc codec.BinaryCodec, msgs []sdk.Msg) (bz []byte, err error) {
31+
msgAnys := make([]*codectypes.Any, len(msgs))
32+
33+
for i, msg := range msgs {
34+
msgAnys[i], err = codectypes.NewAnyWithValue(msg)
35+
if err != nil {
36+
return nil, err
37+
}
38+
}
39+
40+
cosmosTx := &CosmosTx{
41+
Messages: msgAnys,
42+
}
43+
44+
bz, err = cdc.Marshal(cosmosTx)
45+
if err != nil {
46+
return nil, err
47+
}
48+
49+
return bz, nil
50+
}
51+
52+
// DeserializeCosmosTx unmarshals and unpacks a slice of transaction bytes
53+
// into a slice of sdk.Msg's.
54+
func DeserializeCosmosTx(cdc codec.BinaryCodec, data []byte) ([]sdk.Msg, error) {
55+
var cosmosTx CosmosTx
56+
if err := cdc.Unmarshal(data, &cosmosTx); err != nil {
57+
return nil, err
58+
}
59+
60+
msgs := make([]sdk.Msg, len(cosmosTx.Messages))
61+
62+
for i, any := range cosmosTx.Messages {
63+
var msg sdk.Msg
64+
65+
err := cdc.UnpackAny(any, &msg)
66+
if err != nil {
67+
return nil, err
68+
}
69+
70+
msgs[i] = msg
71+
}
72+
73+
return msgs, nil
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package types_test
2+
3+
import (
4+
sdk "github.com/cosmos/cosmos-sdk/types"
5+
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
6+
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
7+
8+
"github.com/cosmos/ibc-go/v2/modules/apps/27-interchain-accounts/types"
9+
"github.com/cosmos/ibc-go/v2/testing/simapp"
10+
)
11+
12+
// caseRawBytes defines a helper struct, used for testing codec operations
13+
type caseRawBytes struct {
14+
name string
15+
bz []byte
16+
expPass bool
17+
}
18+
19+
// mockSdkMsg defines a mock struct, used for testing codec error scenarios
20+
type mockSdkMsg struct{}
21+
22+
// Reset implements sdk.Msg
23+
func (mockSdkMsg) Reset() {
24+
}
25+
26+
// String implements sdk.Msg
27+
func (mockSdkMsg) String() string {
28+
return ""
29+
}
30+
31+
// ProtoMessage implements sdk.Msg
32+
func (mockSdkMsg) ProtoMessage() {
33+
}
34+
35+
// ValidateBasic implements sdk.Msg
36+
func (mockSdkMsg) ValidateBasic() error {
37+
return nil
38+
}
39+
40+
// GetSigners implements sdk.Msg
41+
func (mockSdkMsg) GetSigners() []sdk.AccAddress {
42+
return []sdk.AccAddress{}
43+
}
44+
45+
func (suite *TypesTestSuite) TestSerializeCosmosTx() {
46+
47+
testCases := []struct {
48+
name string
49+
msgs []sdk.Msg
50+
expPass bool
51+
}{
52+
{
53+
"single msg",
54+
[]sdk.Msg{
55+
&banktypes.MsgSend{
56+
FromAddress: TestOwnerAddress,
57+
ToAddress: TestOwnerAddress,
58+
Amount: sdk.NewCoins(sdk.NewCoin("bananas", sdk.NewInt(100))),
59+
},
60+
},
61+
true,
62+
},
63+
{
64+
"multiple msgs, same types",
65+
[]sdk.Msg{
66+
&banktypes.MsgSend{
67+
FromAddress: TestOwnerAddress,
68+
ToAddress: TestOwnerAddress,
69+
Amount: sdk.NewCoins(sdk.NewCoin("bananas", sdk.NewInt(100))),
70+
},
71+
&banktypes.MsgSend{
72+
FromAddress: TestOwnerAddress,
73+
ToAddress: TestOwnerAddress,
74+
Amount: sdk.NewCoins(sdk.NewCoin("bananas", sdk.NewInt(200))),
75+
},
76+
},
77+
true,
78+
},
79+
{
80+
"multiple msgs, different types",
81+
[]sdk.Msg{
82+
&banktypes.MsgSend{
83+
FromAddress: TestOwnerAddress,
84+
ToAddress: TestOwnerAddress,
85+
Amount: sdk.NewCoins(sdk.NewCoin("bananas", sdk.NewInt(100))),
86+
},
87+
&govtypes.MsgSubmitProposal{
88+
InitialDeposit: sdk.NewCoins(sdk.NewCoin("bananas", sdk.NewInt(100))),
89+
Proposer: TestOwnerAddress,
90+
},
91+
},
92+
true,
93+
},
94+
{
95+
"unregistered msg type",
96+
[]sdk.Msg{
97+
&mockSdkMsg{},
98+
},
99+
false,
100+
},
101+
{
102+
"multiple unregistered msg types",
103+
[]sdk.Msg{
104+
&mockSdkMsg{},
105+
&mockSdkMsg{},
106+
&mockSdkMsg{},
107+
},
108+
false,
109+
},
110+
}
111+
112+
testCasesAny := []caseRawBytes{}
113+
114+
for _, tc := range testCases {
115+
bz, err := types.SerializeCosmosTx(simapp.MakeTestEncodingConfig().Marshaler, tc.msgs)
116+
suite.Require().NoError(err, tc.name)
117+
118+
testCasesAny = append(testCasesAny, caseRawBytes{tc.name, bz, tc.expPass})
119+
}
120+
121+
for i, tc := range testCasesAny {
122+
msgs, err := types.DeserializeCosmosTx(simapp.MakeTestEncodingConfig().Marshaler, tc.bz)
123+
if tc.expPass {
124+
suite.Require().NoError(err, tc.name)
125+
suite.Require().Equal(testCases[i].msgs, msgs, tc.name)
126+
} else {
127+
suite.Require().Error(err, tc.name)
128+
}
129+
}
130+
}

modules/apps/27-interchain-accounts/types/encoder.go

-3
This file was deleted.

modules/apps/27-interchain-accounts/types/hook.go

-30
This file was deleted.

0 commit comments

Comments
 (0)