Skip to content

Commit 6d2f6ff

Browse files
testinginprodunknown unknownjulienrbrt
authored
feat(tx): port simappv2 changes (#20648)
Co-authored-by: unknown unknown <unknown@unknown> Co-authored-by: Julien Robert <[email protected]>
1 parent 4b9dca0 commit 6d2f6ff

File tree

9 files changed

+91
-25
lines changed

9 files changed

+91
-25
lines changed

simapp/mint_fn.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717

1818
type MintBankKeeper interface {
1919
MintCoins(ctx context.Context, moduleName string, coins sdk.Coins) error
20-
SendCoinsFromModuleToModule(ctx context.Context, senderModule string, recipientModule string, amt sdk.Coins) error
20+
SendCoinsFromModuleToModule(ctx context.Context, senderModule, recipientModule string, amt sdk.Coins) error
2121
}
2222

2323
// ProvideExampleMintFn returns the function used in x/mint's endblocker to mint new tokens.

x/auth/ante/expected_keepers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ type FeegrantKeeper interface {
3030

3131
type ConsensusKeeper interface {
3232
Params(context.Context, *consensustypes.QueryParamsRequest) (*consensustypes.QueryParamsResponse, error)
33-
GetCometInfo(context.Context, *consensustypes.QueryGetCometInfoRequest) (*consensustypes.QueryGetCometInfoResponse, error)
33+
GetCometInfo(ctx context.Context, request *consensustypes.QueryGetCometInfoRequest) (*consensustypes.QueryGetCometInfoResponse, error)
3434
}

x/auth/ante/testutil/expected_keepers_mocks.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x/auth/tx/config.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,11 @@ func NewTxConfigWithOptions(protoCodec codec.Codec, configOptions ConfigOptions)
190190
}
191191

192192
if configOptions.ProtoDecoder == nil {
193-
dec, err := txdecode.NewDecoder(txdecode.Options{SigningContext: configOptions.SigningContext})
193+
dec, err := txdecode.NewDecoder(txdecode.Options{
194+
SigningContext: configOptions.SigningContext,
195+
ProtoCodec: protoCodec,
196+
},
197+
)
194198
if err != nil {
195199
return nil, err
196200
}

x/auth/tx/gogotx.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func newWrapperFromDecodedTx(addrCodec address.Codec, cdc codec.BinaryCodec, dec
7474

7575
// reflectMsgs
7676
reflectMsgs := make([]protoreflect.Message, len(msgs))
77-
for i, msg := range decodedTx.Messages {
77+
for i, msg := range decodedTx.DynamicMessages {
7878
reflectMsgs[i] = msg.ProtoReflect()
7979
}
8080

x/auth/tx/testutil/suite.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,5 +322,12 @@ func (s *TxConfigTestSuite) TestWrapTxBuilder() {
322322
newTxBldr, err := s.TxConfig.WrapTxBuilder(tx)
323323
s.Require().NoError(err)
324324
txBuilder.SetFeePayer(tx.FeePayer()) // NOTE: fee payer will be populated even if empty.
325-
s.Require().Equal(txBuilder.GetTx(), newTxBldr.GetTx())
325+
tx1 := txBuilder.GetTx()
326+
tx2 := newTxBldr.GetTx()
327+
328+
tx1Bytes, err := s.TxConfig.TxEncoder()(tx1)
329+
s.Require().NoError(err)
330+
tx2Bytes, err := s.TxConfig.TxEncoder()(tx2)
331+
s.Require().NoError(err)
332+
s.Require().Equal(tx1Bytes, tx2Bytes)
326333
}

x/tx/decode/decode.go

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ package decode
33
import (
44
"crypto/sha256"
55
"errors"
6+
"fmt"
7+
"reflect"
8+
"strings"
69

7-
"github.com/cosmos/cosmos-proto/anyutil"
10+
gogoproto "github.com/cosmos/gogoproto/proto"
811
"google.golang.org/protobuf/proto"
9-
"google.golang.org/protobuf/protoadapt"
12+
"google.golang.org/protobuf/reflect/protoreflect"
13+
"google.golang.org/protobuf/types/dynamicpb"
1014

1115
v1beta1 "cosmossdk.io/api/cosmos/tx/v1beta1"
1216
"cosmossdk.io/core/transaction"
@@ -16,7 +20,8 @@ import (
1620

1721
// DecodedTx contains the decoded transaction, its signers, and other flags.
1822
type DecodedTx struct {
19-
Messages []proto.Message
23+
DynamicMessages []proto.Message
24+
Messages []gogoproto.Message
2025
Tx *v1beta1.Tx
2126
TxRaw *v1beta1.TxRaw
2227
Signers [][]byte
@@ -30,24 +35,33 @@ type DecodedTx struct {
3035

3136
var _ transaction.Tx = &DecodedTx{}
3237

38+
type gogoProtoCodec interface {
39+
Unmarshal([]byte, gogoproto.Message) error
40+
}
41+
3342
// Decoder contains the dependencies required for decoding transactions.
3443
type Decoder struct {
3544
signingCtx *signing.Context
45+
codec gogoProtoCodec
3646
}
3747

3848
// Options are options for creating a Decoder.
3949
type Options struct {
4050
SigningContext *signing.Context
51+
ProtoCodec gogoProtoCodec
4152
}
4253

4354
// NewDecoder creates a new Decoder for decoding transactions.
4455
func NewDecoder(options Options) (*Decoder, error) {
4556
if options.SigningContext == nil {
4657
return nil, errors.New("signing context is required")
4758
}
48-
59+
if options.ProtoCodec == nil {
60+
return nil, errors.New("proto codec is required for unmarshalling gogoproto messages")
61+
}
4962
return &Decoder{
5063
signingCtx: options.SigningContext,
64+
codec: options.ProtoCodec,
5165
}, nil
5266
}
5367

@@ -105,16 +119,41 @@ func (d *Decoder) Decode(txBytes []byte) (*DecodedTx, error) {
105119
Signatures: raw.Signatures,
106120
}
107121

108-
var signers [][]byte
109-
var msgs []proto.Message
122+
var (
123+
signers [][]byte
124+
dynamicMsgs []proto.Message
125+
msgs []gogoproto.Message
126+
)
110127
seenSigners := map[string]struct{}{}
111128
for _, anyMsg := range body.Messages {
112-
msg, signerErr := anyutil.Unpack(anyMsg, fileResolver, d.signingCtx.TypeResolver())
113-
if signerErr != nil {
114-
return nil, errorsmod.Wrap(ErrTxDecode, signerErr.Error())
129+
typeURL := strings.TrimPrefix(anyMsg.TypeUrl, "/")
130+
131+
// unmarshal into dynamic message
132+
msgDesc, err := fileResolver.FindDescriptorByName(protoreflect.FullName(typeURL))
133+
if err != nil {
134+
return nil, fmt.Errorf("protoFiles does not have descriptor %s: %w", anyMsg.TypeUrl, err)
135+
}
136+
dynamicMsg := dynamicpb.NewMessageType(msgDesc.(protoreflect.MessageDescriptor)).New().Interface()
137+
err = anyMsg.UnmarshalTo(dynamicMsg)
138+
if err != nil {
139+
return nil, err
140+
}
141+
dynamicMsgs = append(dynamicMsgs, dynamicMsg)
142+
143+
// unmarshal into gogoproto message
144+
gogoType := gogoproto.MessageType(typeURL)
145+
if gogoType == nil {
146+
return nil, fmt.Errorf("cannot find type: %s", anyMsg.TypeUrl)
147+
}
148+
msg := reflect.New(gogoType.Elem()).Interface().(gogoproto.Message)
149+
err = d.codec.Unmarshal(anyMsg.Value, msg)
150+
if err != nil {
151+
return nil, err
115152
}
116153
msgs = append(msgs, msg)
117-
ss, signerErr := d.signingCtx.GetSigners(msg)
154+
155+
// fetch signers with dynamic message
156+
ss, signerErr := d.signingCtx.GetSigners(dynamicMsg)
118157
if signerErr != nil {
119158
return nil, errorsmod.Wrap(ErrTxDecode, signerErr.Error())
120159
}
@@ -130,6 +169,7 @@ func (d *Decoder) Decode(txBytes []byte) (*DecodedTx, error) {
130169

131170
return &DecodedTx{
132171
Messages: msgs,
172+
DynamicMessages: dynamicMsgs,
133173
Tx: theTx,
134174
TxRaw: &raw,
135175
TxBodyHasUnknownNonCriticals: txBodyHasUnknownNonCriticals,
@@ -157,12 +197,7 @@ func (dtx *DecodedTx) GetMessages() ([]transaction.Msg, error) {
157197
return nil, errors.New("messages not available or are nil")
158198
}
159199

160-
msgs := make([]transaction.Msg, len(dtx.Messages))
161-
for i, msg := range dtx.Messages {
162-
msgs[i] = protoadapt.MessageV1Of(msg)
163-
}
164-
165-
return msgs, nil
200+
return dtx.Messages, nil
166201
}
167202

168203
func (dtx *DecodedTx) GetSenders() ([][]byte, error) {

x/tx/decode/decode_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"testing"
88

99
"github.com/cosmos/cosmos-proto/anyutil"
10+
gogoproto "github.com/cosmos/gogoproto/proto"
1011
"github.com/stretchr/testify/require"
1112
"google.golang.org/protobuf/proto"
1213
"google.golang.org/protobuf/types/known/anypb"
@@ -21,6 +22,12 @@ import (
2122
"cosmossdk.io/x/tx/signing"
2223
)
2324

25+
type mockCodec struct{}
26+
27+
func (m mockCodec) Unmarshal(bytes []byte, message gogoproto.Message) error {
28+
return gogoproto.Unmarshal(bytes, message)
29+
}
30+
2431
func TestDecode(t *testing.T) {
2532
accSeq := uint64(2)
2633

@@ -46,9 +53,13 @@ func TestDecode(t *testing.T) {
4653
require.NoError(t, err)
4754
decoder, err := decode.NewDecoder(decode.Options{
4855
SigningContext: signingCtx,
56+
ProtoCodec: mockCodec{},
4957
})
5058
require.NoError(t, err)
5159

60+
gogoproto.RegisterType(&bankv1beta1.MsgSend{}, string((&bankv1beta1.MsgSend{}).ProtoReflect().Descriptor().FullName()))
61+
gogoproto.RegisterType(&testpb.A{}, string((&testpb.A{}).ProtoReflect().Descriptor().FullName()))
62+
5263
testCases := []struct {
5364
name string
5465
msg proto.Message
@@ -131,6 +142,7 @@ func TestDecodeTxBodyPanic(t *testing.T) {
131142
}
132143
dec, err := decode.NewDecoder(decode.Options{
133144
SigningContext: signingCtx,
145+
ProtoCodec: mockCodec{},
134146
})
135147
if err != nil {
136148
t.Fatal(err)

x/tx/decode/fuzz_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"testing"
66

77
"github.com/cosmos/cosmos-proto/anyutil"
8+
gogoproto "github.com/cosmos/gogoproto/proto"
89
fuzz "github.com/google/gofuzz"
910
"google.golang.org/protobuf/proto"
1011
"google.golang.org/protobuf/types/known/anypb"
@@ -17,6 +18,12 @@ import (
1718
"cosmossdk.io/x/tx/signing"
1819
)
1920

21+
type mockCodec struct{}
22+
23+
func (m mockCodec) Unmarshal(bytes []byte, message gogoproto.Message) error {
24+
return gogoproto.Unmarshal(bytes, message)
25+
}
26+
2027
var (
2128
accSeq = uint64(2)
2229

@@ -107,6 +114,7 @@ func FuzzDecode(f *testing.F) {
107114
}
108115
dec, err := NewDecoder(Options{
109116
SigningContext: signingCtx,
117+
ProtoCodec: mockCodec{},
110118
})
111119
if err != nil {
112120
return

0 commit comments

Comments
 (0)