From b41db408c1361dc93d7fab66ef09a4cea23481d8 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 19 Sep 2024 18:18:14 +0200 Subject: [PATCH 1/7] feat: introduce x/validate and split x/auth/tx/config --- .github/pr_labeler.yml | 2 + CHANGELOG.md | 7 + api/cosmos/auth/v1beta1/accounts.pulsar.go | 68 +-- api/cosmos/tx/config/v1/config.pulsar.go | 172 +----- .../validate/module/v1/module.pulsar.go | 504 ++++++++++++++++++ .../cosmos/auth/module/v1/module.proto | 0 .../cosmos/auth/v1beta1/accounts.proto | 0 .../cosmos/auth/v1beta1/auth.proto | 0 .../cosmos/auth/v1beta1/genesis.proto | 0 .../cosmos/auth/v1beta1/query.proto | 0 .../cosmos/auth/v1beta1/tx.proto | 0 proto/cosmos/tx/config/v1/config.proto | 8 - proto/cosmos/validate/module/v1/module.proto | 12 + simapp/app_config.go | 21 +- simapp/v2/app_config.go | 24 +- x/README.md | 1 + x/auth/proto/buf.gen.gogo.yaml | 8 - x/auth/proto/buf.gen.pulsar.yaml | 18 - x/auth/proto/buf.lock | 28 - x/auth/proto/buf.yaml | 18 - x/auth/tx/README.md | 23 +- x/auth/tx/config/depinject.go | 155 +----- x/auth/types/accounts.pb.go | 54 +- x/tx/README.md | 30 +- x/validate/README.md | 5 + x/validate/depinject.go | 153 ++++++ x/validate/keys.go | 4 + x/{auth/tx/config => validate}/module.go | 2 +- 28 files changed, 848 insertions(+), 469 deletions(-) create mode 100644 api/cosmos/validate/module/v1/module.pulsar.go rename {x/auth/proto => proto}/cosmos/auth/module/v1/module.proto (100%) rename {x/auth/proto => proto}/cosmos/auth/v1beta1/accounts.proto (100%) rename {x/auth/proto => proto}/cosmos/auth/v1beta1/auth.proto (100%) rename {x/auth/proto => proto}/cosmos/auth/v1beta1/genesis.proto (100%) rename {x/auth/proto => proto}/cosmos/auth/v1beta1/query.proto (100%) rename {x/auth/proto => proto}/cosmos/auth/v1beta1/tx.proto (100%) create mode 100644 proto/cosmos/validate/module/v1/module.proto delete mode 100644 x/auth/proto/buf.gen.gogo.yaml delete mode 100644 x/auth/proto/buf.gen.pulsar.yaml delete mode 100644 x/auth/proto/buf.lock delete mode 100644 x/auth/proto/buf.yaml create mode 100644 x/validate/README.md create mode 100644 x/validate/depinject.go create mode 100644 x/validate/keys.go rename x/{auth/tx/config => validate}/module.go (99%) diff --git a/.github/pr_labeler.yml b/.github/pr_labeler.yml index ed6ea1e9118d..b3a4ddfbe37b 100644 --- a/.github/pr_labeler.yml +++ b/.github/pr_labeler.yml @@ -80,6 +80,8 @@ - x/upgrade/**/* "C:x/epochs": - x/epochs/**/* +"C:x/validate": + - x/validate/**/* "C:server/v2": - server/v2/**/* "C:server/v2 stf": diff --git a/CHANGELOG.md b/CHANGELOG.md index ffb15bee3b26..c0471f22345a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,13 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i ### Deprecated +### TO SORT + +* (x/auth/tx/config) Sign mode textual not more automatically added to tx config when using runtime. Should be added manually on the server side. +* (x/auth/tx/config) This depinject module now only provide txconfig and tx config options. x/validate now handlers the providing of ante/post handlers, alongside tx validators for v2. The corresponding app config options have been removed +* (x/validate) New module solely responsible for providing ante/post handlers and tx validators for v2. It can be extended by the app developer to provide extra tx validators. + * In comparison to x/auth/tx/config, there is no app config to skip ante/post handlers, as overwriting them is baseapp or not injecting the x/validate module has the same effect. + ## [v0.52.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.52.0) - 2024-XX-XX Every module contains its own CHANGELOG.md. Please refer to the module you are interested in. diff --git a/api/cosmos/auth/v1beta1/accounts.pulsar.go b/api/cosmos/auth/v1beta1/accounts.pulsar.go index 1068e6db79cd..3b794645d037 100644 --- a/api/cosmos/auth/v1beta1/accounts.pulsar.go +++ b/api/cosmos/auth/v1beta1/accounts.pulsar.go @@ -372,14 +372,14 @@ func (x *fastReflection_QueryLegacyAccount) ProtoMethods() *protoiface.Methods { var ( md_QueryLegacyAccountResponse protoreflect.MessageDescriptor fd_QueryLegacyAccountResponse_account protoreflect.FieldDescriptor - fd_QueryLegacyAccountResponse_info protoreflect.FieldDescriptor + fd_QueryLegacyAccountResponse_base protoreflect.FieldDescriptor ) func init() { file_cosmos_auth_v1beta1_accounts_proto_init() md_QueryLegacyAccountResponse = File_cosmos_auth_v1beta1_accounts_proto.Messages().ByName("QueryLegacyAccountResponse") fd_QueryLegacyAccountResponse_account = md_QueryLegacyAccountResponse.Fields().ByName("account") - fd_QueryLegacyAccountResponse_info = md_QueryLegacyAccountResponse.Fields().ByName("info") + fd_QueryLegacyAccountResponse_base = md_QueryLegacyAccountResponse.Fields().ByName("base") } var _ protoreflect.Message = (*fastReflection_QueryLegacyAccountResponse)(nil) @@ -453,9 +453,9 @@ func (x *fastReflection_QueryLegacyAccountResponse) Range(f func(protoreflect.Fi return } } - if x.Info != nil { - value := protoreflect.ValueOfMessage(x.Info.ProtoReflect()) - if !f(fd_QueryLegacyAccountResponse_info, value) { + if x.Base != nil { + value := protoreflect.ValueOfMessage(x.Base.ProtoReflect()) + if !f(fd_QueryLegacyAccountResponse_base, value) { return } } @@ -476,8 +476,8 @@ func (x *fastReflection_QueryLegacyAccountResponse) Has(fd protoreflect.FieldDes switch fd.FullName() { case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.account": return x.Account != nil - case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.info": - return x.Info != nil + case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.base": + return x.Base != nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.auth.v1beta1.QueryLegacyAccountResponse")) @@ -496,8 +496,8 @@ func (x *fastReflection_QueryLegacyAccountResponse) Clear(fd protoreflect.FieldD switch fd.FullName() { case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.account": x.Account = nil - case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.info": - x.Info = nil + case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.base": + x.Base = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.auth.v1beta1.QueryLegacyAccountResponse")) @@ -517,8 +517,8 @@ func (x *fastReflection_QueryLegacyAccountResponse) Get(descriptor protoreflect. case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.account": value := x.Account return protoreflect.ValueOfMessage(value.ProtoReflect()) - case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.info": - value := x.Info + case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.base": + value := x.Base return protoreflect.ValueOfMessage(value.ProtoReflect()) default: if descriptor.IsExtension() { @@ -542,8 +542,8 @@ func (x *fastReflection_QueryLegacyAccountResponse) Set(fd protoreflect.FieldDes switch fd.FullName() { case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.account": x.Account = value.Message().Interface().(*anypb.Any) - case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.info": - x.Info = value.Message().Interface().(*BaseAccount) + case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.base": + x.Base = value.Message().Interface().(*BaseAccount) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.auth.v1beta1.QueryLegacyAccountResponse")) @@ -569,11 +569,11 @@ func (x *fastReflection_QueryLegacyAccountResponse) Mutable(fd protoreflect.Fiel x.Account = new(anypb.Any) } return protoreflect.ValueOfMessage(x.Account.ProtoReflect()) - case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.info": - if x.Info == nil { - x.Info = new(BaseAccount) + case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.base": + if x.Base == nil { + x.Base = new(BaseAccount) } - return protoreflect.ValueOfMessage(x.Info.ProtoReflect()) + return protoreflect.ValueOfMessage(x.Base.ProtoReflect()) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.auth.v1beta1.QueryLegacyAccountResponse")) @@ -590,7 +590,7 @@ func (x *fastReflection_QueryLegacyAccountResponse) NewField(fd protoreflect.Fie case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.account": m := new(anypb.Any) return protoreflect.ValueOfMessage(m.ProtoReflect()) - case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.info": + case "cosmos.auth.v1beta1.QueryLegacyAccountResponse.base": m := new(BaseAccount) return protoreflect.ValueOfMessage(m.ProtoReflect()) default: @@ -666,8 +666,8 @@ func (x *fastReflection_QueryLegacyAccountResponse) ProtoMethods() *protoiface.M l = options.Size(x.Account) n += 1 + l + runtime.Sov(uint64(l)) } - if x.Info != nil { - l = options.Size(x.Info) + if x.Base != nil { + l = options.Size(x.Base) n += 1 + l + runtime.Sov(uint64(l)) } if x.unknownFields != nil { @@ -699,8 +699,8 @@ func (x *fastReflection_QueryLegacyAccountResponse) ProtoMethods() *protoiface.M i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } - if x.Info != nil { - encoded, err := options.Marshal(x.Info) + if x.Base != nil { + encoded, err := options.Marshal(x.Base) if err != nil { return protoiface.MarshalOutput{ NoUnkeyedLiterals: input.NoUnkeyedLiterals, @@ -814,7 +814,7 @@ func (x *fastReflection_QueryLegacyAccountResponse) ProtoMethods() *protoiface.M iNdEx = postIndex case 2: if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Base", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -841,10 +841,10 @@ func (x *fastReflection_QueryLegacyAccountResponse) ProtoMethods() *protoiface.M if postIndex > l { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF } - if x.Info == nil { - x.Info = &BaseAccount{} + if x.Base == nil { + x.Base = &BaseAccount{} } - if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Info); err != nil { + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Base); err != nil { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err } iNdEx = postIndex @@ -938,9 +938,9 @@ type QueryLegacyAccountResponse struct { // sdk.AccountI interface. Account *anypb.Any `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // info represents the account as a BaseAccount, this can return - // nil if the account cannot be represented as a base account. + // nil if the account cannot be represented as a BaseAccount. // This is used in the gRPC QueryAccountInfo method. - Info *BaseAccount `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + Base *BaseAccount `protobuf:"bytes,2,opt,name=base,proto3" json:"base,omitempty"` } func (x *QueryLegacyAccountResponse) Reset() { @@ -970,9 +970,9 @@ func (x *QueryLegacyAccountResponse) GetAccount() *anypb.Any { return nil } -func (x *QueryLegacyAccountResponse) GetInfo() *BaseAccount { +func (x *QueryLegacyAccountResponse) GetBase() *BaseAccount { if x != nil { - return x.Info + return x.Base } return nil } @@ -993,10 +993,10 @@ var file_cosmos_auth_v1beta1_accounts_proto_rawDesc = []byte{ 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x04, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x42, 0x61, - 0x73, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x42, + 0x73, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x42, 0xc8, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x63, 0x6f, @@ -1034,7 +1034,7 @@ var file_cosmos_auth_v1beta1_accounts_proto_goTypes = []interface{}{ } var file_cosmos_auth_v1beta1_accounts_proto_depIdxs = []int32{ 2, // 0: cosmos.auth.v1beta1.QueryLegacyAccountResponse.account:type_name -> google.protobuf.Any - 3, // 1: cosmos.auth.v1beta1.QueryLegacyAccountResponse.info:type_name -> cosmos.auth.v1beta1.BaseAccount + 3, // 1: cosmos.auth.v1beta1.QueryLegacyAccountResponse.base:type_name -> cosmos.auth.v1beta1.BaseAccount 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name diff --git a/api/cosmos/tx/config/v1/config.pulsar.go b/api/cosmos/tx/config/v1/config.pulsar.go index c0b353c4367f..0c4daa5dff10 100644 --- a/api/cosmos/tx/config/v1/config.pulsar.go +++ b/api/cosmos/tx/config/v1/config.pulsar.go @@ -14,16 +14,12 @@ import ( ) var ( - md_Config protoreflect.MessageDescriptor - fd_Config_skip_ante_handler protoreflect.FieldDescriptor - fd_Config_skip_post_handler protoreflect.FieldDescriptor + md_Config protoreflect.MessageDescriptor ) func init() { file_cosmos_tx_config_v1_config_proto_init() md_Config = File_cosmos_tx_config_v1_config_proto.Messages().ByName("Config") - fd_Config_skip_ante_handler = md_Config.Fields().ByName("skip_ante_handler") - fd_Config_skip_post_handler = md_Config.Fields().ByName("skip_post_handler") } var _ protoreflect.Message = (*fastReflection_Config)(nil) @@ -91,18 +87,6 @@ func (x *fastReflection_Config) Interface() protoreflect.ProtoMessage { // While iterating, mutating operations may only be performed // on the current field descriptor. func (x *fastReflection_Config) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if x.SkipAnteHandler != false { - value := protoreflect.ValueOfBool(x.SkipAnteHandler) - if !f(fd_Config_skip_ante_handler, value) { - return - } - } - if x.SkipPostHandler != false { - value := protoreflect.ValueOfBool(x.SkipPostHandler) - if !f(fd_Config_skip_post_handler, value) { - return - } - } } // Has reports whether a field is populated. @@ -118,10 +102,6 @@ func (x *fastReflection_Config) Range(f func(protoreflect.FieldDescriptor, proto // a repeated field is populated if it is non-empty. func (x *fastReflection_Config) Has(fd protoreflect.FieldDescriptor) bool { switch fd.FullName() { - case "cosmos.tx.config.v1.Config.skip_ante_handler": - return x.SkipAnteHandler != false - case "cosmos.tx.config.v1.Config.skip_post_handler": - return x.SkipPostHandler != false default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.tx.config.v1.Config")) @@ -138,10 +118,6 @@ func (x *fastReflection_Config) Has(fd protoreflect.FieldDescriptor) bool { // Clear is a mutating operation and unsafe for concurrent use. func (x *fastReflection_Config) Clear(fd protoreflect.FieldDescriptor) { switch fd.FullName() { - case "cosmos.tx.config.v1.Config.skip_ante_handler": - x.SkipAnteHandler = false - case "cosmos.tx.config.v1.Config.skip_post_handler": - x.SkipPostHandler = false default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.tx.config.v1.Config")) @@ -158,12 +134,6 @@ func (x *fastReflection_Config) Clear(fd protoreflect.FieldDescriptor) { // of the value; to obtain a mutable reference, use Mutable. func (x *fastReflection_Config) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { switch descriptor.FullName() { - case "cosmos.tx.config.v1.Config.skip_ante_handler": - value := x.SkipAnteHandler - return protoreflect.ValueOfBool(value) - case "cosmos.tx.config.v1.Config.skip_post_handler": - value := x.SkipPostHandler - return protoreflect.ValueOfBool(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.tx.config.v1.Config")) @@ -184,10 +154,6 @@ func (x *fastReflection_Config) Get(descriptor protoreflect.FieldDescriptor) pro // Set is a mutating operation and unsafe for concurrent use. func (x *fastReflection_Config) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { switch fd.FullName() { - case "cosmos.tx.config.v1.Config.skip_ante_handler": - x.SkipAnteHandler = value.Bool() - case "cosmos.tx.config.v1.Config.skip_post_handler": - x.SkipPostHandler = value.Bool() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.tx.config.v1.Config")) @@ -208,10 +174,6 @@ func (x *fastReflection_Config) Set(fd protoreflect.FieldDescriptor, value proto // Mutable is a mutating operation and unsafe for concurrent use. func (x *fastReflection_Config) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { - case "cosmos.tx.config.v1.Config.skip_ante_handler": - panic(fmt.Errorf("field skip_ante_handler of message cosmos.tx.config.v1.Config is not mutable")) - case "cosmos.tx.config.v1.Config.skip_post_handler": - panic(fmt.Errorf("field skip_post_handler of message cosmos.tx.config.v1.Config is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.tx.config.v1.Config")) @@ -225,10 +187,6 @@ func (x *fastReflection_Config) Mutable(fd protoreflect.FieldDescriptor) protore // For lists, maps, and messages, this returns a new, empty, mutable value. func (x *fastReflection_Config) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { - case "cosmos.tx.config.v1.Config.skip_ante_handler": - return protoreflect.ValueOfBool(false) - case "cosmos.tx.config.v1.Config.skip_post_handler": - return protoreflect.ValueOfBool(false) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.tx.config.v1.Config")) @@ -298,12 +256,6 @@ func (x *fastReflection_Config) ProtoMethods() *protoiface.Methods { var n int var l int _ = l - if x.SkipAnteHandler { - n += 2 - } - if x.SkipPostHandler { - n += 2 - } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -333,26 +285,6 @@ func (x *fastReflection_Config) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } - if x.SkipPostHandler { - i-- - if x.SkipPostHandler { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if x.SkipAnteHandler { - i-- - if x.SkipAnteHandler { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } if input.Buf != nil { input.Buf = append(input.Buf, dAtA...) } else { @@ -402,46 +334,6 @@ func (x *fastReflection_Config) ProtoMethods() *protoiface.Methods { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Config: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SkipAnteHandler", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - x.SkipAnteHandler = bool(v != 0) - case 2: - if wireType != 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SkipPostHandler", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - x.SkipPostHandler = bool(v != 0) default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -495,13 +387,6 @@ type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - // skip_ante_handler defines whether the ante handler registration should be skipped in case an app wants to override - // this functionality. - SkipAnteHandler bool `protobuf:"varint,1,opt,name=skip_ante_handler,json=skipAnteHandler,proto3" json:"skip_ante_handler,omitempty"` - // skip_post_handler defines whether the post handler registration should be skipped in case an app wants to override - // this functionality. - SkipPostHandler bool `protobuf:"varint,2,opt,name=skip_post_handler,json=skipPostHandler,proto3" json:"skip_post_handler,omitempty"` } func (x *Config) Reset() { @@ -524,20 +409,6 @@ func (*Config) Descriptor() ([]byte, []int) { return file_cosmos_tx_config_v1_config_proto_rawDescGZIP(), []int{0} } -func (x *Config) GetSkipAnteHandler() bool { - if x != nil { - return x.SkipAnteHandler - } - return false -} - -func (x *Config) GetSkipPostHandler() bool { - if x != nil { - return x.SkipPostHandler - } - return false -} - var File_cosmos_tx_config_v1_config_proto protoreflect.FileDescriptor var file_cosmos_tx_config_v1_config_proto_rawDesc = []byte{ @@ -546,29 +417,24 @@ var file_cosmos_tx_config_v1_config_proto_rawDesc = []byte{ 0x74, 0x6f, 0x12, 0x13, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x78, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x1a, 0x20, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x90, 0x01, 0x0a, 0x06, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x61, 0x6e, 0x74, - 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x41, 0x6e, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, - 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73, 0x6b, 0x69, - 0x70, 0x50, 0x6f, 0x73, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x3a, 0x2e, 0xba, 0xc0, - 0x96, 0xda, 0x01, 0x28, 0x0a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, - 0x64, 0x6b, 0x2f, 0x78, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x74, 0x78, 0x42, 0xc4, 0x01, 0x0a, - 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x78, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2d, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, - 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2f, 0x74, 0x78, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x54, 0x43, 0xaa, 0x02, 0x13, 0x43, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x54, 0x78, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x56, 0x31, 0xca, 0x02, 0x13, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x54, 0x78, 0x5c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1f, 0x43, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x5c, 0x54, 0x78, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5c, 0x56, 0x31, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x16, 0x43, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x54, 0x78, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x38, 0x0a, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x3a, 0x2e, 0xba, 0xc0, 0x96, 0xda, 0x01, 0x28, 0x0a, 0x26, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x78, 0x2f, 0x61, 0x75, 0x74, 0x68, + 0x2f, 0x74, 0x78, 0x42, 0xc4, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x74, 0x78, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x42, + 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2d, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x74, 0x78, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x76, 0x31, 0xa2, 0x02, 0x03, + 0x43, 0x54, 0x43, 0xaa, 0x02, 0x13, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x54, 0x78, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x43, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x5c, 0x54, 0x78, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x1f, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x54, 0x78, 0x5c, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x54, 0x78, 0x3a, 0x3a, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/api/cosmos/validate/module/v1/module.pulsar.go b/api/cosmos/validate/module/v1/module.pulsar.go new file mode 100644 index 000000000000..2c27aa07d75e --- /dev/null +++ b/api/cosmos/validate/module/v1/module.pulsar.go @@ -0,0 +1,504 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package modulev1 + +import ( + _ "cosmossdk.io/api/cosmos/app/v1alpha1" + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_Module protoreflect.MessageDescriptor +) + +func init() { + file_cosmos_validate_module_v1_module_proto_init() + md_Module = File_cosmos_validate_module_v1_module_proto.Messages().ByName("Module") +} + +var _ protoreflect.Message = (*fastReflection_Module)(nil) + +type fastReflection_Module Module + +func (x *Module) ProtoReflect() protoreflect.Message { + return (*fastReflection_Module)(x) +} + +func (x *Module) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_validate_module_v1_module_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_Module_messageType fastReflection_Module_messageType +var _ protoreflect.MessageType = fastReflection_Module_messageType{} + +type fastReflection_Module_messageType struct{} + +func (x fastReflection_Module_messageType) Zero() protoreflect.Message { + return (*fastReflection_Module)(nil) +} +func (x fastReflection_Module_messageType) New() protoreflect.Message { + return new(fastReflection_Module) +} +func (x fastReflection_Module_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_Module +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_Module) Descriptor() protoreflect.MessageDescriptor { + return md_Module +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_Module) Type() protoreflect.MessageType { + return _fastReflection_Module_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_Module) New() protoreflect.Message { + return new(fastReflection_Module) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_Module) Interface() protoreflect.ProtoMessage { + return (*Module)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_Module) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_Module) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.validate.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.validate.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Module) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.validate.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.validate.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_Module) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.validate.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.validate.module.v1.Module does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Module) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.validate.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.validate.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Module) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.validate.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.validate.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_Module) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.validate.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.validate.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_Module) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.validate.module.v1.Module", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_Module) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Module) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_Module) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_Module) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*Module) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*Module) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*Module) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Module: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Module: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: cosmos/validate/module/v1/module.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Module is the config object of the x/validate module. +type Module struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Module) Reset() { + *x = Module{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_validate_module_v1_module_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Module) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Module) ProtoMessage() {} + +// Deprecated: Use Module.ProtoReflect.Descriptor instead. +func (*Module) Descriptor() ([]byte, []int) { + return file_cosmos_validate_module_v1_module_proto_rawDescGZIP(), []int{0} +} + +var File_cosmos_validate_module_v1_module_proto protoreflect.FileDescriptor + +var file_cosmos_validate_module_v1_module_proto_rawDesc = []byte{ + 0x0a, 0x26, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x2e, 0x76, 0x31, 0x1a, 0x20, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x2f, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x39, 0x0a, 0x06, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x3a, + 0x2f, 0xba, 0xc0, 0x96, 0xda, 0x01, 0x29, 0x0a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x78, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x42, 0xe8, 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, + 0x76, 0x31, 0x42, 0x0b, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x33, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x56, 0x4d, 0xaa, 0x02, 0x19, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x43, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x5c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5c, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5c, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x3a, + 0x3a, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_cosmos_validate_module_v1_module_proto_rawDescOnce sync.Once + file_cosmos_validate_module_v1_module_proto_rawDescData = file_cosmos_validate_module_v1_module_proto_rawDesc +) + +func file_cosmos_validate_module_v1_module_proto_rawDescGZIP() []byte { + file_cosmos_validate_module_v1_module_proto_rawDescOnce.Do(func() { + file_cosmos_validate_module_v1_module_proto_rawDescData = protoimpl.X.CompressGZIP(file_cosmos_validate_module_v1_module_proto_rawDescData) + }) + return file_cosmos_validate_module_v1_module_proto_rawDescData +} + +var file_cosmos_validate_module_v1_module_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_cosmos_validate_module_v1_module_proto_goTypes = []interface{}{ + (*Module)(nil), // 0: cosmos.validate.module.v1.Module +} +var file_cosmos_validate_module_v1_module_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_cosmos_validate_module_v1_module_proto_init() } +func file_cosmos_validate_module_v1_module_proto_init() { + if File_cosmos_validate_module_v1_module_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_cosmos_validate_module_v1_module_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Module); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cosmos_validate_module_v1_module_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_cosmos_validate_module_v1_module_proto_goTypes, + DependencyIndexes: file_cosmos_validate_module_v1_module_proto_depIdxs, + MessageInfos: file_cosmos_validate_module_v1_module_proto_msgTypes, + }.Build() + File_cosmos_validate_module_v1_module_proto = out.File + file_cosmos_validate_module_v1_module_proto_rawDesc = nil + file_cosmos_validate_module_v1_module_proto_goTypes = nil + file_cosmos_validate_module_v1_module_proto_depIdxs = nil +} diff --git a/x/auth/proto/cosmos/auth/module/v1/module.proto b/proto/cosmos/auth/module/v1/module.proto similarity index 100% rename from x/auth/proto/cosmos/auth/module/v1/module.proto rename to proto/cosmos/auth/module/v1/module.proto diff --git a/x/auth/proto/cosmos/auth/v1beta1/accounts.proto b/proto/cosmos/auth/v1beta1/accounts.proto similarity index 100% rename from x/auth/proto/cosmos/auth/v1beta1/accounts.proto rename to proto/cosmos/auth/v1beta1/accounts.proto diff --git a/x/auth/proto/cosmos/auth/v1beta1/auth.proto b/proto/cosmos/auth/v1beta1/auth.proto similarity index 100% rename from x/auth/proto/cosmos/auth/v1beta1/auth.proto rename to proto/cosmos/auth/v1beta1/auth.proto diff --git a/x/auth/proto/cosmos/auth/v1beta1/genesis.proto b/proto/cosmos/auth/v1beta1/genesis.proto similarity index 100% rename from x/auth/proto/cosmos/auth/v1beta1/genesis.proto rename to proto/cosmos/auth/v1beta1/genesis.proto diff --git a/x/auth/proto/cosmos/auth/v1beta1/query.proto b/proto/cosmos/auth/v1beta1/query.proto similarity index 100% rename from x/auth/proto/cosmos/auth/v1beta1/query.proto rename to proto/cosmos/auth/v1beta1/query.proto diff --git a/x/auth/proto/cosmos/auth/v1beta1/tx.proto b/proto/cosmos/auth/v1beta1/tx.proto similarity index 100% rename from x/auth/proto/cosmos/auth/v1beta1/tx.proto rename to proto/cosmos/auth/v1beta1/tx.proto diff --git a/proto/cosmos/tx/config/v1/config.proto b/proto/cosmos/tx/config/v1/config.proto index 65c6b6bbac8d..adfb28c1d7ec 100644 --- a/proto/cosmos/tx/config/v1/config.proto +++ b/proto/cosmos/tx/config/v1/config.proto @@ -9,12 +9,4 @@ message Config { option (cosmos.app.v1alpha1.module) = { go_import: "github.com/cosmos/cosmos-sdk/x/auth/tx" }; - - // skip_ante_handler defines whether the ante handler registration should be skipped in case an app wants to override - // this functionality. - bool skip_ante_handler = 1; - - // skip_post_handler defines whether the post handler registration should be skipped in case an app wants to override - // this functionality. - bool skip_post_handler = 2; } diff --git a/proto/cosmos/validate/module/v1/module.proto b/proto/cosmos/validate/module/v1/module.proto new file mode 100644 index 000000000000..f65327573112 --- /dev/null +++ b/proto/cosmos/validate/module/v1/module.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +package cosmos.validate.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the x/validate module. +message Module { + option (cosmos.app.v1alpha1.module) = { + go_import: "github.com/cosmos/cosmos-sdk/x/validate" + }; +} diff --git a/simapp/app_config.go b/simapp/app_config.go index ca1971950628..33e11841e795 100644 --- a/simapp/app_config.go +++ b/simapp/app_config.go @@ -28,6 +28,7 @@ import ( stakingmodulev1 "cosmossdk.io/api/cosmos/staking/module/v1" txconfigv1 "cosmossdk.io/api/cosmos/tx/config/v1" upgrademodulev1 "cosmossdk.io/api/cosmos/upgrade/module/v1" + validatemodulev1 "cosmossdk.io/api/cosmos/validate/module/v1" vestingmodulev1 "cosmossdk.io/api/cosmos/vesting/module/v1" "cosmossdk.io/depinject/appconfig" "cosmossdk.io/x/accounts" @@ -69,11 +70,12 @@ import ( "github.com/cosmos/cosmos-sdk/runtime" _ "github.com/cosmos/cosmos-sdk/testutil/x/counter" // import for side-effects - _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side-effects + authtxconfig "github.com/cosmos/cosmos-sdk/x/auth/tx/config" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" _ "github.com/cosmos/cosmos-sdk/x/auth/vesting" // import for side-effects vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/cosmos/cosmos-sdk/x/validate" ) var ( @@ -181,10 +183,19 @@ var ( // SkipStoreKeys is an optional list of store keys to skip when constructing the // module's keeper. This is useful when a module does not have a store key. SkipStoreKeys: []string{ - "tx", + authtxconfig.DepinjectModuleName, + validate.ModuleName, }, }), }, + { + Name: authtxconfig.DepinjectModuleName, // x/auth/tx/config depinject module (not app module), use to provide tx configuration + Config: appconfig.WrapAny(&txconfigv1.Config{}), + }, + { + Name: validate.ModuleName, + Config: appconfig.WrapAny(&validatemodulev1.Module{}), + }, { Name: authtypes.ModuleName, Config: appconfig.WrapAny(&authmodulev1.Module{ @@ -218,12 +229,6 @@ var ( Name: slashingtypes.ModuleName, Config: appconfig.WrapAny(&slashingmodulev1.Module{}), }, - { - Name: "tx", - Config: appconfig.WrapAny(&txconfigv1.Config{ - SkipAnteHandler: true, // SimApp is using non default AnteHandler such as circuit and unorderedtx decorators - }), - }, { Name: genutiltypes.ModuleName, Config: appconfig.WrapAny(&genutilmodulev1.Module{}), diff --git a/simapp/v2/app_config.go b/simapp/v2/app_config.go index 99697b94af70..2f1337aec398 100644 --- a/simapp/v2/app_config.go +++ b/simapp/v2/app_config.go @@ -28,6 +28,7 @@ import ( stakingmodulev1 "cosmossdk.io/api/cosmos/staking/module/v1" txconfigv1 "cosmossdk.io/api/cosmos/tx/config/v1" upgrademodulev1 "cosmossdk.io/api/cosmos/upgrade/module/v1" + validatemodulev1 "cosmossdk.io/api/cosmos/validate/module/v1" vestingmodulev1 "cosmossdk.io/api/cosmos/vesting/module/v1" "cosmossdk.io/depinject/appconfig" "cosmossdk.io/x/accounts" @@ -68,12 +69,13 @@ import ( upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/cosmos/cosmos-sdk/runtime" - _ "github.com/cosmos/cosmos-sdk/x/auth" // import for side-effects - _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side-effects + _ "github.com/cosmos/cosmos-sdk/x/auth" // import for side-effects + authtxconfig "github.com/cosmos/cosmos-sdk/x/auth/tx/config" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" _ "github.com/cosmos/cosmos-sdk/x/auth/vesting" // import for side-effects vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/cosmos/cosmos-sdk/x/validate" ) var ( @@ -183,8 +185,22 @@ var ( QueryGasLimit: 100_000, SimulationGasLimit: 100_000, }, + // SkipStoreKeys is an optional list of store keys to skip when constructing the + // module's keeper. This is useful when a module does not have a store key. + SkipStoreKeys: []string{ + authtxconfig.DepinjectModuleName, + validate.ModuleName, + }, }), }, + { + Name: authtxconfig.DepinjectModuleName, // x/auth/tx/config depinject module (not app module), use to provide tx configuration + Config: appconfig.WrapAny(&txconfigv1.Config{}), + }, + { + Name: validate.ModuleName, + Config: appconfig.WrapAny(&validatemodulev1.Module{}), + }, { Name: authtypes.ModuleName, Config: appconfig.WrapAny(&authmodulev1.Module{ @@ -218,10 +234,6 @@ var ( Name: slashingtypes.ModuleName, Config: appconfig.WrapAny(&slashingmodulev1.Module{}), }, - { - Name: "tx", - Config: appconfig.WrapAny(&txconfigv1.Config{}), - }, { Name: genutiltypes.ModuleName, Config: appconfig.WrapAny(&genutilmodulev1.Module{}), diff --git a/x/README.md b/x/README.md index 44b1c6baa106..373527b6ef6e 100644 --- a/x/README.md +++ b/x/README.md @@ -26,6 +26,7 @@ Here are some production-grade modules that can be used in Cosmos SDK applicatio * [Staking](./staking/README.md) - Proof-of-Stake layer for public blockchains. * [Tx](./tx/README.md) - Tx utilities for the Cosmos SDK. * [Upgrade](./upgrade/README.md) - Software upgrades handling and coordination. +* [Validate](./validate/README.md) - Global ante/post handlers and tx validator setup. To learn more about the process of building modules, visit the [building modules reference documentation](https://docs.cosmos.network/main/building-modules/intro). diff --git a/x/auth/proto/buf.gen.gogo.yaml b/x/auth/proto/buf.gen.gogo.yaml deleted file mode 100644 index db36231d0c82..000000000000 --- a/x/auth/proto/buf.gen.gogo.yaml +++ /dev/null @@ -1,8 +0,0 @@ -version: v1 -plugins: - - name: gocosmos - out: .. - opt: plugins=grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/gogoproto/types/any - - name: grpc-gateway - out: .. - opt: logtostderr=true,allow_colon_final_segments=true diff --git a/x/auth/proto/buf.gen.pulsar.yaml b/x/auth/proto/buf.gen.pulsar.yaml deleted file mode 100644 index 88a5b0419d7f..000000000000 --- a/x/auth/proto/buf.gen.pulsar.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: v1 -managed: - enabled: true - go_package_prefix: - default: cosmossdk.io/api - except: - - buf.build/googleapis/googleapis - - buf.build/cosmos/gogo-proto - - buf.build/cosmos/cosmos-proto - override: - buf.build/cosmos/cosmos-sdk: cosmossdk.io/api -plugins: - - name: go-pulsar - out: .. - opt: paths=source_relative - - name: go-grpc - out: .. - opt: paths=source_relative diff --git a/x/auth/proto/buf.lock b/x/auth/proto/buf.lock deleted file mode 100644 index 28c135cc08bb..000000000000 --- a/x/auth/proto/buf.lock +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by buf. DO NOT EDIT. -version: v1 -deps: - - remote: buf.build - owner: cosmos - repository: cosmos-proto - commit: 04467658e59e44bbb22fe568206e1f70 - digest: shake256:73a640bd60e0c523b0f8237ff34eab67c45a38b64bbbde1d80224819d272dbf316ac183526bd245f994af6608b025f5130483d0133c5edd385531326b5990466 - - remote: buf.build - owner: cosmos - repository: cosmos-sdk - commit: cf13c7d232dd405180c2af616fa8a075 - digest: shake256:769a38e306a98339b549bc96991c97fae8bd3ceb1a7646c7bfe9a74e406ab068372970fbc5abda1891e2f3c36527cf2d3a25f631739d36900787226e564bb612 - - remote: buf.build - owner: cosmos - repository: gogo-proto - commit: 5e5b9fdd01804356895f8f79a6f1ddc1 - digest: shake256:0b85da49e2e5f9ebc4806eae058e2f56096ff3b1c59d1fb7c190413dd15f45dd456f0b69ced9059341c80795d2b6c943de15b120a9e0308b499e43e4b5fc2952 - - remote: buf.build - owner: googleapis - repository: googleapis - commit: 28151c0d0a1641bf938a7672c500e01d - digest: shake256:49215edf8ef57f7863004539deff8834cfb2195113f0b890dd1f67815d9353e28e668019165b9d872395871eeafcbab3ccfdb2b5f11734d3cca95be9e8d139de - - remote: buf.build - owner: protocolbuffers - repository: wellknowntypes - commit: 657250e6a39648cbb169d079a60bd9ba - digest: shake256:00de25001b8dd2e29d85fc4bcc3ede7aed886d76d67f5e0f7a9b320b90f871d3eb73507d50818d823a0512f3f8db77a11c043685528403e31ff3fef18323a9fb diff --git a/x/auth/proto/buf.yaml b/x/auth/proto/buf.yaml deleted file mode 100644 index e59a92092e2b..000000000000 --- a/x/auth/proto/buf.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: v1 -name: buf.build/mods/auth -deps: - - buf.build/cosmos/cosmos-sdk # pin the Cosmos SDK version - - buf.build/cosmos/cosmos-proto - - buf.build/cosmos/gogo-proto - - buf.build/googleapis/googleapis -lint: - use: - - DEFAULT - - COMMENTS - - FILE_LOWER_SNAKE_CASE - except: - - UNARY_RPC - - COMMENT_FIELD - - SERVICE_SUFFIX - - PACKAGE_VERSION_SUFFIX - - RPC_REQUEST_STANDARD_NAME diff --git a/x/auth/tx/README.md b/x/auth/tx/README.md index 981f375dc0de..48efb4d22ac4 100644 --- a/x/auth/tx/README.md +++ b/x/auth/tx/README.md @@ -21,14 +21,25 @@ It contains as well a depinject module and app module the registration of ante/p ## Contents -* [Transactions](#transactions) +* [`x/auth/tx`](#xauthtx) + * [Abstract](#abstract) + * [Contents](#contents) + * [Transactions](#transactions) * [`TxConfig`](#txconfig) * [`TxBuilder`](#txbuilder) * [`TxEncoder`/ `TxDecoder`](#txencoder-txdecoder) -* [Depinject \& App Module](#depinject--app-module) -* [Client](#client) + * [Depinject \& App Module](#depinject--app-module) + * [Client](#client) * [CLI](#cli) + * [Query](#query) + * [Transactions](#transactions-1) + * [`encode`](#encode) + * [`decode`](#decode) * [gRPC](#grpc) + * [`TxDecode`](#txdecode) + * [`TxEncode`](#txencode) + * [`TxDecodeAmino`](#txdecodeamino) + * [`TxEncodeAmino`](#txencodeamino) ## Transactions @@ -62,10 +73,8 @@ More information about `TxEncoder` and `TxDecoder` can be found [here](https://d ## Depinject & App Module -The `x/auth/tx/config` contains a depinject module and app module. -The depinject module is there to setup ante/post handlers on an runtime app (via baseapp options) and the tx validator on the runtime/v2 app (via app module). It as well outputs the `TxConfig` and `TxConfigOptions` for the app. - -The app module is purely there for registering tx validators, due to the design of tx validators (tx validator belong to modules). +The `x/auth/tx/config` contains a depinject module. +The depinject module is to outputs the `TxConfig` and `TxConfigOptions` for the app. ## Client diff --git a/x/auth/tx/config/depinject.go b/x/auth/tx/config/depinject.go index 9c753fbd4729..1b69b047d26b 100644 --- a/x/auth/tx/config/depinject.go +++ b/x/auth/tx/config/depinject.go @@ -2,8 +2,6 @@ package tx import ( "context" - "errors" - "fmt" gogoproto "github.com/cosmos/gogoproto/proto" "google.golang.org/grpc" @@ -15,8 +13,6 @@ import ( txconfigv1 "cosmossdk.io/api/cosmos/tx/config/v1" "cosmossdk.io/core/address" appmodulev2 "cosmossdk.io/core/appmodule/v2" - "cosmossdk.io/core/server" - "cosmossdk.io/core/transaction" "cosmossdk.io/depinject" "cosmossdk.io/depinject/appconfig" txsigning "cosmossdk.io/x/tx/signing" @@ -26,17 +22,11 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/runtime" - sdk "github.com/cosmos/cosmos-sdk/types" - signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/cosmos/cosmos-sdk/x/auth/ante/unorderedtx" - "github.com/cosmos/cosmos-sdk/x/auth/posthandler" "github.com/cosmos/cosmos-sdk/x/auth/tx" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) -// flagMinGasPricesV2 is the flag name for the minimum gas prices in the main server v2 component. -const flagMinGasPricesV2 = "server.minimum-gas-prices" +// DepinjectModuleName is the module name used for depinject. +const DepinjectModuleName = "tx" func init() { appconfig.RegisterModule(&txconfigv1.Config{}, @@ -48,32 +38,20 @@ func init() { type ModuleInputs struct { depinject.In - Config *txconfigv1.Config - AddressCodec address.Codec - ValidatorAddressCodec address.ValidatorAddressCodec - Codec codec.Codec - ProtoFileResolver txsigning.ProtoFileResolver - Environment appmodulev2.Environment - // BankKeeper is the expected bank keeper to be passed to AnteHandlers / Tx Validators - ConsensusKeeper ante.ConsensusKeeper - BankKeeper authtypes.BankKeeper `optional:"true"` - MetadataBankKeeper BankKeeper `optional:"true"` - AccountKeeper ante.AccountKeeper `optional:"true"` - FeeGrantKeeper ante.FeegrantKeeper `optional:"true"` - AccountAbstractionKeeper ante.AccountAbstractionKeeper `optional:"true"` - CustomSignModeHandlers func() []txsigning.SignModeHandler `optional:"true"` - CustomGetSigners []txsigning.CustomGetSigner `optional:"true"` - ExtraTxValidators []appmodulev2.TxValidator[transaction.Tx] `optional:"true"` - UnorderedTxManager *unorderedtx.Manager `optional:"true"` - TxFeeChecker ante.TxFeeChecker `optional:"true"` - DynamicConfig server.DynamicConfig `optional:"true"` + Config *txconfigv1.Config + AddressCodec address.Codec + ValidatorAddressCodec address.ValidatorAddressCodec + Codec codec.Codec + ProtoFileResolver txsigning.ProtoFileResolver + Environment appmodulev2.Environment + CustomSignModeHandlers func() []txsigning.SignModeHandler `optional:"true"` + CustomGetSigners []txsigning.CustomGetSigner `optional:"true"` } type ModuleOutputs struct { depinject.Out - Module appmodulev2.AppModule // This is only useful for chains using server/v2. It setup tx validators that don't belong to other modules. - BaseAppOption runtime.BaseAppOption // This is only useful for chains using baseapp. Server/v2 chains use TxValidator. + BaseAppOption runtime.BaseAppOption // This is only useful for chains using baseapp. TxConfig client.TxConfig TxConfigOptions tx.ConfigOptions } @@ -103,123 +81,22 @@ func ProvideModule(in ModuleInputs) ModuleOutputs { txConfigOptions.SigningOptions.CustomGetSigners[mode.MsgType] = mode.Fn } - // enable SIGN_MODE_TEXTUAL only if bank keeper is available - if in.MetadataBankKeeper != nil { - txConfigOptions.EnabledSignModes = append(txConfigOptions.EnabledSignModes, signingtypes.SignMode_SIGN_MODE_TEXTUAL) - txConfigOptions.TextualCoinMetadataQueryFn = NewBankKeeperCoinMetadataQueryFn(in.MetadataBankKeeper) - } - txConfig, err := tx.NewTxConfigWithOptions(in.Codec, txConfigOptions) if err != nil { panic(err) } - svd := ante.NewSigVerificationDecorator( - in.AccountKeeper, - txConfig.SignModeHandler(), - ante.DefaultSigVerificationGasConsumer, - in.AccountAbstractionKeeper, - ) - - var ( - minGasPrices sdk.DecCoins - feeTxValidator *ante.DeductFeeDecorator - unorderedTxValidator *ante.UnorderedTxDecorator - ) - if in.AccountKeeper != nil && in.BankKeeper != nil && in.DynamicConfig != nil { - minGasPricesStr := in.DynamicConfig.GetString(flagMinGasPricesV2) - minGasPrices, err = sdk.ParseDecCoins(minGasPricesStr) - if err != nil { - panic(fmt.Sprintf("invalid minimum gas prices: %v", err)) - } - - feeTxValidator = ante.NewDeductFeeDecorator(in.AccountKeeper, in.BankKeeper, in.FeeGrantKeeper, in.TxFeeChecker) - feeTxValidator.SetMinGasPrices(minGasPrices) // set min gas price in deduct fee decorator - } - - if in.UnorderedTxManager != nil { - unorderedTxValidator = ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxTimeoutDuration, in.UnorderedTxManager, in.Environment, ante.DefaultSha256Cost) - } - return ModuleOutputs{ - Module: NewAppModule(svd, feeTxValidator, unorderedTxValidator, in.ExtraTxValidators...), - BaseAppOption: newBaseAppOption(txConfig, in), + BaseAppOption: func(app *baseapp.BaseApp) { + app.SetTxDecoder(txConfig.TxDecoder()) + app.SetTxEncoder(txConfig.TxEncoder()) + }, TxConfig: txConfig, TxConfigOptions: txConfigOptions, } } -// newBaseAppOption returns baseapp option that sets the ante handler and post handler -// and set the tx encoder and decoder on baseapp. -func newBaseAppOption(txConfig client.TxConfig, in ModuleInputs) func(app *baseapp.BaseApp) { - return func(app *baseapp.BaseApp) { - // AnteHandlers - if !in.Config.SkipAnteHandler { - anteHandler, err := newAnteHandler(txConfig, in) - if err != nil { - panic(err) - } - app.SetAnteHandler(anteHandler) - } - - // PostHandlers - if !in.Config.SkipPostHandler { - // In v0.46, the SDK introduces _postHandlers_. PostHandlers are like - // antehandlers, but are run _after_ the `runMsgs` execution. They are also - // defined as a chain, and have the same signature as antehandlers. - // - // In baseapp, postHandlers are run in the same store branch as `runMsgs`, - // meaning that both `runMsgs` and `postHandler` state will be committed if - // both are successful, and both will be reverted if any of the two fails. - // - // The SDK exposes a default empty postHandlers chain. - // - // Please note that changing any of the anteHandler or postHandler chain is - // likely to be a state-machine breaking change, which needs a coordinated - // upgrade. - postHandler, err := posthandler.NewPostHandler( - posthandler.HandlerOptions{}, - ) - if err != nil { - panic(err) - } - app.SetPostHandler(postHandler) - } - - // TxDecoder/TxEncoder - app.SetTxDecoder(txConfig.TxDecoder()) - app.SetTxEncoder(txConfig.TxEncoder()) - } -} - -func newAnteHandler(txConfig client.TxConfig, in ModuleInputs) (sdk.AnteHandler, error) { - if in.BankKeeper == nil { - return nil, errors.New("both AccountKeeper and BankKeeper are required") - } - - anteHandler, err := ante.NewAnteHandler( - ante.HandlerOptions{ - Environment: in.Environment, - AccountKeeper: in.AccountKeeper, - ConsensusKeeper: in.ConsensusKeeper, - BankKeeper: in.BankKeeper, - SignModeHandler: txConfig.SignModeHandler(), - FeegrantKeeper: in.FeeGrantKeeper, - SigGasConsumer: ante.DefaultSigVerificationGasConsumer, - UnorderedTxManager: in.UnorderedTxManager, - }, - ) - if err != nil { - return nil, fmt.Errorf("failed to create ante handler: %w", err) - } - - return anteHandler, nil -} - -// NewBankKeeperCoinMetadataQueryFn creates a new Textual struct using the given -// BankKeeper to retrieve coin metadata. -// -// This function should be used in the server (app.go) and is already injected thanks to app wiring for app_di. +// NewBankKeeperCoinMetadataQueryFn creates a new Textual struct using the given BankKeeper to retrieve coin metadata. func NewBankKeeperCoinMetadataQueryFn(bk BankKeeper) textual.CoinMetadataQueryFn { return func(ctx context.Context, denom string) (*bankv1beta1.Metadata, error) { res, err := bk.DenomMetadataV2(ctx, &bankv1beta1.QueryDenomMetadataRequest{Denom: denom}) diff --git a/x/auth/types/accounts.pb.go b/x/auth/types/accounts.pb.go index 380a1e9195c9..58f078127712 100644 --- a/x/auth/types/accounts.pb.go +++ b/x/auth/types/accounts.pb.go @@ -71,9 +71,9 @@ type QueryLegacyAccountResponse struct { // sdk.AccountI interface. Account *any.Any `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // info represents the account as a BaseAccount, this can return - // nil if the account cannot be represented as a base account. + // nil if the account cannot be represented as a BaseAccount. // This is used in the gRPC QueryAccountInfo method. - Info *BaseAccount `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + Base *BaseAccount `protobuf:"bytes,2,opt,name=base,proto3" json:"base,omitempty"` } func (m *QueryLegacyAccountResponse) Reset() { *m = QueryLegacyAccountResponse{} } @@ -116,9 +116,9 @@ func (m *QueryLegacyAccountResponse) GetAccount() *any.Any { return nil } -func (m *QueryLegacyAccountResponse) GetInfo() *BaseAccount { +func (m *QueryLegacyAccountResponse) GetBase() *BaseAccount { if m != nil { - return m.Info + return m.Base } return nil } @@ -133,23 +133,23 @@ func init() { } var fileDescriptor_25696478f9b3e7f4 = []byte{ - // 247 bytes of a gzipped FileDescriptorProto + // 246 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0xcf, 0xb1, 0x4e, 0xc3, 0x30, 0x10, 0x06, 0xe0, 0x18, 0x21, 0x90, 0xcc, 0x16, 0x3a, 0x94, 0x0c, 0x56, 0x95, 0x09, 0x06, 0xce, - 0x2a, 0xf0, 0x02, 0x2d, 0x2b, 0x0b, 0x1d, 0xd9, 0x1c, 0xe3, 0xa6, 0x15, 0xd4, 0x17, 0xf5, 0x6c, - 0x84, 0x57, 0x9e, 0x80, 0xc7, 0x62, 0xec, 0xc8, 0x88, 0x92, 0x17, 0x41, 0xb5, 0x93, 0xa9, 0x9d, - 0x2c, 0xd9, 0x9f, 0xef, 0xfe, 0x9f, 0x97, 0x1a, 0x69, 0x83, 0x24, 0x95, 0x77, 0x2b, 0xf9, 0x31, - 0xad, 0x8c, 0x53, 0x53, 0xa9, 0xb4, 0x46, 0x6f, 0x1d, 0x41, 0xb3, 0x45, 0x87, 0xf9, 0x65, 0x32, - 0xb0, 0x37, 0xd0, 0x9b, 0xe2, 0xaa, 0x46, 0xac, 0xdf, 0x8d, 0x8c, 0xa4, 0xf2, 0x4b, 0xa9, 0x6c, - 0x48, 0xbe, 0x10, 0x47, 0x67, 0xee, 0x3f, 0xc7, 0xf7, 0x72, 0xc4, 0xf3, 0x67, 0x6f, 0xb6, 0xe1, - 0xc9, 0xd4, 0x4a, 0x87, 0x59, 0x5a, 0x56, 0x7e, 0x31, 0x5e, 0x1c, 0x5e, 0x2f, 0x0c, 0x35, 0x68, - 0xc9, 0xe4, 0xc0, 0xcf, 0xfb, 0x58, 0x63, 0x36, 0x61, 0xd7, 0x17, 0x77, 0x23, 0x48, 0x09, 0x60, - 0x48, 0x00, 0x33, 0x1b, 0x16, 0x03, 0xca, 0x1f, 0xf8, 0xe9, 0xda, 0x2e, 0x71, 0x7c, 0x12, 0xf1, - 0x04, 0x8e, 0x74, 0x80, 0xb9, 0x22, 0x33, 0xec, 0x89, 0x7a, 0xfe, 0xf8, 0xd3, 0x0a, 0xb6, 0x6b, - 0x05, 0xfb, 0x6b, 0x05, 0xfb, 0xee, 0x44, 0xb6, 0xeb, 0x44, 0xf6, 0xdb, 0x89, 0xec, 0xe5, 0xa6, - 0x5e, 0xbb, 0x95, 0xaf, 0x40, 0xe3, 0x46, 0xf6, 0xfd, 0xd2, 0x71, 0x4b, 0xaf, 0x6f, 0xf2, 0x33, - 0x95, 0x75, 0xa1, 0x31, 0x54, 0x9d, 0xc5, 0x44, 0xf7, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdf, - 0x0d, 0xc9, 0xcb, 0x5c, 0x01, 0x00, 0x00, + 0x2a, 0xf0, 0x02, 0x2d, 0x2b, 0x0b, 0x1d, 0xd9, 0x6c, 0x63, 0x52, 0x04, 0xcd, 0x45, 0x3d, 0x1b, + 0xe1, 0x95, 0x27, 0xe0, 0xb1, 0x18, 0x3b, 0x32, 0xa2, 0xe4, 0x45, 0x50, 0xed, 0x64, 0x6a, 0x26, + 0x4b, 0xf6, 0xe7, 0xbb, 0xff, 0xe7, 0xa5, 0x41, 0xda, 0x20, 0x49, 0xe5, 0xdd, 0x5a, 0x7e, 0xcc, + 0xb5, 0x75, 0x6a, 0x2e, 0x95, 0x31, 0xe8, 0x6b, 0x47, 0xd0, 0x6c, 0xd1, 0x61, 0x7e, 0x9e, 0x0c, + 0xec, 0x0d, 0xf4, 0xa6, 0xb8, 0xa8, 0x10, 0xab, 0x77, 0x2b, 0x23, 0xd1, 0xfe, 0x45, 0xaa, 0x3a, + 0x24, 0x5f, 0x88, 0xd1, 0x99, 0xfb, 0xcf, 0xf1, 0xbd, 0x9c, 0xf0, 0xfc, 0xd1, 0xdb, 0x6d, 0x78, + 0xb0, 0x95, 0x32, 0x61, 0x91, 0x96, 0x95, 0x5f, 0x8c, 0x17, 0x87, 0xd7, 0x2b, 0x4b, 0x0d, 0xd6, + 0x64, 0x73, 0xe0, 0xa7, 0x7d, 0xac, 0x29, 0x9b, 0xb1, 0xcb, 0xb3, 0x9b, 0x09, 0xa4, 0x04, 0x30, + 0x24, 0x80, 0x45, 0x1d, 0x56, 0x03, 0xca, 0xef, 0xf8, 0xb1, 0x56, 0x64, 0xa7, 0x47, 0x11, 0xcf, + 0x60, 0xa4, 0x03, 0x2c, 0x15, 0xd9, 0x61, 0x4f, 0xd4, 0xcb, 0xfb, 0x9f, 0x56, 0xb0, 0x5d, 0x2b, + 0xd8, 0x5f, 0x2b, 0xd8, 0x77, 0x27, 0xb2, 0x5d, 0x27, 0xb2, 0xdf, 0x4e, 0x64, 0x4f, 0x57, 0xd5, + 0xab, 0x5b, 0x7b, 0x0d, 0x06, 0x37, 0xb2, 0xef, 0x97, 0x8e, 0x6b, 0x7a, 0x7e, 0x93, 0x9f, 0xa9, + 0xac, 0x0b, 0x8d, 0x25, 0x7d, 0x12, 0x13, 0xdd, 0xfe, 0x07, 0x00, 0x00, 0xff, 0xff, 0x5c, 0xc3, + 0xec, 0xca, 0x5c, 0x01, 0x00, 0x00, } func (m *QueryLegacyAccount) Marshal() (dAtA []byte, err error) { @@ -195,9 +195,9 @@ func (m *QueryLegacyAccountResponse) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l - if m.Info != nil { + if m.Base != nil { { - size, err := m.Info.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Base.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -252,8 +252,8 @@ func (m *QueryLegacyAccountResponse) Size() (n int) { l = m.Account.Size() n += 1 + l + sovAccounts(uint64(l)) } - if m.Info != nil { - l = m.Info.Size() + if m.Base != nil { + l = m.Base.Size() n += 1 + l + sovAccounts(uint64(l)) } return n @@ -382,7 +382,7 @@ func (m *QueryLegacyAccountResponse) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Base", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -409,10 +409,10 @@ func (m *QueryLegacyAccountResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Info == nil { - m.Info = &BaseAccount{} + if m.Base == nil { + m.Base = &BaseAccount{} } - if err := m.Info.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Base.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/tx/README.md b/x/tx/README.md index 600981407ade..42d0be357c4b 100644 --- a/x/tx/README.md +++ b/x/tx/README.md @@ -19,18 +19,17 @@ custom signer definitions, allowing developers to tailor the signing process to ## Contents -- [x/tx](#xtx) - - [Abstract](#abstract) - - [Contents](#contents) - - [Signing](#signing) - - [Key Features](#key-features) - - [Decode](#decode) - - [Key Features](#key-features-1) - - [DecodedTx](#decodedtx) - - [Class Diagram](#class-diagram) - - [Decode Sequence Diagram](#decode-sequence-diagram) - - [Disambiguation Note](#disambiguation-note) - - [Disclaimer](#disclaimer) +* [x/tx](#xtx) + * [Abstract](#abstract) + * [Contents](#contents) + * [Signing](#signing) + * [Key Features](#key-features) + * [Decode](#decode) + * [Key Features](#key-features-1) + * [DecodedTx](#decodedtx) + * [Class Diagram](#class-diagram) + * [Decode Sequence Diagram](#decode-sequence-diagram) + * [Disclaimer](#disclaimer) ## Signing @@ -42,6 +41,7 @@ In summary, the signing package is responsible for preparing the data to be sign but doesn't handle the actual signing process (i.e., applying a cryptographic signature to these bytes). ### Key Features + 1. SignModeHandler Interface: this is the core interface that defines how different signing modes should be implemented. 2. SignModeHandler Implementations: * [aminojson](https://github.com/cosmos/cosmos-sdk/blob/v0.50.7/docs/architecture/adr-020-protobuf-transaction-encoding.md#sign_mode_legacy_amino) @@ -60,6 +60,7 @@ designed to work with transactions that follow the [ADR-027](https://github.com/ specification for application-defined raw transaction serialization. ### Key Features + 1. Transaction Decoding: Parses raw transaction bytes into a structured `DecodedTx` object. 2. ADR-027 Compatibility: Ensures compatibility with the ADR-027 specification. 3. Unknown Field Handling: Rejects unknown fields in TxRaw and AuthInfo, while allowing non-critical unknown fields in TxBody. @@ -72,6 +73,7 @@ specification for application-defined raw transaction serialization. components of a transaction after it has been parsed from its raw bytes. Here's a breakdown of its structure: The `DecodedTx` struct has the following fields: + 1. DynamicMessages: A slice of proto.Message interfaces, representing the transaction messages in a dynamic format. 2. Messages: A slice of gogoproto.Message interfaces, representing the transaction messages in the gogo protobuf format. 3. Tx: A pointer to a v1beta1.Tx struct, which represents the full transaction in the Cosmos SDK v1beta1 format. @@ -167,5 +169,5 @@ It's important to clarify that `x/tx` is distinct from `x/auth/tx`: * `x/auth/tx`: This is a separate package and is typically used in the context of building a complete tx is that is going to be broadcast in Cosmos SDK applications. When you see a "tx" module referenced in `app_config.go` or similar application configuration files, it refers to -`x/auth/tx`, not `x/tx` (as it's not an Appmodule). This naming similarity can be confusing, so it's crucial to pay -attention to the import paths and context when working with these packages. \ No newline at end of file +`x/auth/tx/config`, not `x/tx` (as it's not an Appmodule). This naming similarity can be confusing, so it's crucial to pay +attention to the import paths and context when working with these packages. diff --git a/x/validate/README.md b/x/validate/README.md new file mode 100644 index 000000000000..d1e4f702eac5 --- /dev/null +++ b/x/validate/README.md @@ -0,0 +1,5 @@ +# x/validate + +The `x/validate` is an app module solely there to setup ante/post handlers on an runtime app (via baseapp options) and the tx validator on the runtime/v2 app (via app module). + +Module specific tx validators should be registered on their own modules. diff --git a/x/validate/depinject.go b/x/validate/depinject.go new file mode 100644 index 000000000000..210779f1b6ae --- /dev/null +++ b/x/validate/depinject.go @@ -0,0 +1,153 @@ +package validate + +import ( + "errors" + "fmt" + + modulev1 "cosmossdk.io/api/cosmos/validate/module/v1" + appmodulev2 "cosmossdk.io/core/appmodule/v2" + "cosmossdk.io/core/server" + "cosmossdk.io/core/transaction" + "cosmossdk.io/depinject" + "cosmossdk.io/depinject/appconfig" + txsigning "cosmossdk.io/x/tx/signing" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/runtime" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/ante" + "github.com/cosmos/cosmos-sdk/x/auth/ante/unorderedtx" + "github.com/cosmos/cosmos-sdk/x/auth/posthandler" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +// flagMinGasPricesV2 is the flag name for the minimum gas prices in the main server v2 component. +const flagMinGasPricesV2 = "server.minimum-gas-prices" + +func init() { + appconfig.RegisterModule(&modulev1.Config{}, + appconfig.Provide(ProvideModule), + ) +} + +type ModuleInputs struct { + depinject.In + + Config *modulev1.Config + Codec codec.Codec + ProtoFileResolver txsigning.ProtoFileResolver + Environment appmodulev2.Environment + TxConfig client.TxConfig + DynamicConfig server.DynamicConfig `optional:"true"` + + ConsensusKeeper ante.ConsensusKeeper + BankKeeper authtypes.BankKeeper `optional:"true"` + AccountKeeper ante.AccountKeeper `optional:"true"` + FeeGrantKeeper ante.FeegrantKeeper `optional:"true"` + AccountAbstractionKeeper ante.AccountAbstractionKeeper `optional:"true"` + ExtraTxValidators []appmodulev2.TxValidator[transaction.Tx] `optional:"true"` + UnorderedTxManager *unorderedtx.Manager `optional:"true"` + TxFeeChecker ante.TxFeeChecker `optional:"true"` +} + +type ModuleOutputs struct { + depinject.Out + + Module appmodulev2.AppModule // This is only useful for chains using server/v2. It setup tx validators that don't belong to other modules. + BaseAppOption runtime.BaseAppOption // This is only useful for chains using baseapp. Server/v2 chains use TxValidator. +} + +func ProvideModule(in ModuleInputs) ModuleOutputs { + svd := ante.NewSigVerificationDecorator( + in.AccountKeeper, + in.TxConfig.SignModeHandler(), + ante.DefaultSigVerificationGasConsumer, + in.AccountAbstractionKeeper, + ) + + var ( + err error + minGasPrices sdk.DecCoins + feeTxValidator *ante.DeductFeeDecorator + unorderedTxValidator *ante.UnorderedTxDecorator + ) + if in.AccountKeeper != nil && in.BankKeeper != nil && in.DynamicConfig != nil { + minGasPricesStr := in.DynamicConfig.GetString(flagMinGasPricesV2) + minGasPrices, err = sdk.ParseDecCoins(minGasPricesStr) + if err != nil { + panic(fmt.Sprintf("invalid minimum gas prices: %v", err)) + } + + feeTxValidator = ante.NewDeductFeeDecorator(in.AccountKeeper, in.BankKeeper, in.FeeGrantKeeper, in.TxFeeChecker) + feeTxValidator.SetMinGasPrices(minGasPrices) // set min gas price in deduct fee decorator + } + + if in.UnorderedTxManager != nil { + unorderedTxValidator = ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxTimeoutDuration, in.UnorderedTxManager, in.Environment, ante.DefaultSha256Cost) + } + + return ModuleOutputs{ + Module: NewAppModule(svd, feeTxValidator, unorderedTxValidator, in.ExtraTxValidators...), + BaseAppOption: newBaseAppOption(in), + } +} + +// newBaseAppOption returns baseapp option that sets the ante handler and post handler +// and set the tx encoder and decoder on baseapp. +func newBaseAppOption(in ModuleInputs) func(app *baseapp.BaseApp) { + return func(app *baseapp.BaseApp) { + anteHandler, err := newAnteHandler(in) + if err != nil { + panic(err) + } + app.SetAnteHandler(anteHandler) + + // PostHandlers + // In v0.46, the SDK introduces _postHandlers_. PostHandlers are like + // antehandlers, but are run _after_ the `runMsgs` execution. They are also + // defined as a chain, and have the same signature as antehandlers. + // + // In baseapp, postHandlers are run in the same store branch as `runMsgs`, + // meaning that both `runMsgs` and `postHandler` state will be committed if + // both are successful, and both will be reverted if any of the two fails. + // + // The SDK exposes a default empty postHandlers chain. + // + // Please note that changing any of the anteHandler or postHandler chain is + // likely to be a state-machine breaking change, which needs a coordinated + // upgrade. + postHandler, err := posthandler.NewPostHandler( + posthandler.HandlerOptions{}, + ) + if err != nil { + panic(err) + } + app.SetPostHandler(postHandler) + } +} + +func newAnteHandler(in ModuleInputs) (sdk.AnteHandler, error) { + if in.BankKeeper == nil { + return nil, errors.New("both AccountKeeper and BankKeeper are required") + } + + anteHandler, err := ante.NewAnteHandler( + ante.HandlerOptions{ + Environment: in.Environment, + AccountKeeper: in.AccountKeeper, + ConsensusKeeper: in.ConsensusKeeper, + BankKeeper: in.BankKeeper, + SignModeHandler: in.TxConfig.SignModeHandler(), + FeegrantKeeper: in.FeeGrantKeeper, + SigGasConsumer: ante.DefaultSigVerificationGasConsumer, + UnorderedTxManager: in.UnorderedTxManager, + }, + ) + if err != nil { + return nil, fmt.Errorf("failed to create ante handler: %w", err) + } + + return anteHandler, nil +} diff --git a/x/validate/keys.go b/x/validate/keys.go new file mode 100644 index 000000000000..de6282ccd9de --- /dev/null +++ b/x/validate/keys.go @@ -0,0 +1,4 @@ +package validate + +// ModuleName is the name of the validate module. +const ModuleName = "validate" diff --git a/x/auth/tx/config/module.go b/x/validate/module.go similarity index 99% rename from x/auth/tx/config/module.go rename to x/validate/module.go index 2529f36bc8e3..f547e63fe085 100644 --- a/x/auth/tx/config/module.go +++ b/x/validate/module.go @@ -1,4 +1,4 @@ -package tx +package validate import ( "context" From e843c721ff740d6c339e2c45ebebd7c20b91d8ea Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 19 Sep 2024 18:19:29 +0200 Subject: [PATCH 2/7] fixes --- x/accounts/defaults/base/account.go | 2 +- x/auth/keeper/grpc_query.go | 4 ++-- x/validate/depinject.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x/accounts/defaults/base/account.go b/x/accounts/defaults/base/account.go index ba0f711150b1..edeed35c7a3a 100644 --- a/x/accounts/defaults/base/account.go +++ b/x/accounts/defaults/base/account.go @@ -296,7 +296,7 @@ func (a Account) AuthRetroCompatibility(ctx context.Context, _ *authtypes.QueryL return &authtypes.QueryLegacyAccountResponse{ Account: baseAccountAny, - Info: baseAccount, + Base: baseAccount, }, nil } diff --git a/x/auth/keeper/grpc_query.go b/x/auth/keeper/grpc_query.go index f64de8f0a20e..101c0755801a 100644 --- a/x/auth/keeper/grpc_query.go +++ b/x/auth/keeper/grpc_query.go @@ -231,10 +231,10 @@ func (s queryServer) AccountInfo(ctx context.Context, req *types.QueryAccountInf xAccount, err := s.getFromXAccounts(ctx, addr) // account info is nil it means that the account can be encapsulated into a // legacy account representation but not a base account one. - if err != nil || xAccount.Info == nil { + if err != nil || xAccount.Base == nil { return nil, status.Errorf(codes.NotFound, "account %s not found", req.Address) } - return &types.QueryAccountInfoResponse{Info: xAccount.Info}, nil + return &types.QueryAccountInfoResponse{Info: xAccount.Base}, nil } // if there is no public key, avoid serializing the nil value diff --git a/x/validate/depinject.go b/x/validate/depinject.go index 210779f1b6ae..3fa538fbada6 100644 --- a/x/validate/depinject.go +++ b/x/validate/depinject.go @@ -27,7 +27,7 @@ import ( const flagMinGasPricesV2 = "server.minimum-gas-prices" func init() { - appconfig.RegisterModule(&modulev1.Config{}, + appconfig.RegisterModule(&modulev1.Module{}, appconfig.Provide(ProvideModule), ) } @@ -35,7 +35,7 @@ func init() { type ModuleInputs struct { depinject.In - Config *modulev1.Config + ModuleConfig *modulev1.Module Codec codec.Codec ProtoFileResolver txsigning.ProtoFileResolver Environment appmodulev2.Environment From 87751ac1be293a26611ac8f4f95552be398c7b61 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 20 Sep 2024 00:58:20 +0200 Subject: [PATCH 3/7] updates --- .github/CODEOWNERS | 2 + CHANGELOG.md | 11 ++---- UPGRADING.md | 14 ++++++- simapp/simd/cmd/testnet_test.go | 1 + tests/e2e/auth/keeper/app_config.go | 1 + tests/e2e/baseapp/block_gas_test.go | 1 + tests/integration/bank/app_test.go | 1 + tests/integration/distribution/appconfig.go | 1 + tests/integration/evidence/app_config.go | 1 + tests/integration/mint/app_config.go | 1 + tests/integration/protocolpool/app_config.go | 1 + tests/integration/runtime/query_test.go | 1 + .../server/grpc/out_of_gas_test.go | 1 + tests/integration/server/grpc/server_test.go | 1 + tests/integration/slashing/app_config.go | 1 + tests/integration/slashing/slashing_test.go | 1 + tests/integration/staking/app_config.go | 1 + testutil/configurator/configurator.go | 18 ++++++++- testutil/types.go | 39 ++++++++++--------- x/auth/tx/README.md | 18 +++++++-- x/validate/README.md | 34 +++++++++++++++- x/validate/depinject.go | 16 +++----- 22 files changed, 120 insertions(+), 46 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9641613e4b9e..308c61887003 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -44,6 +44,7 @@ /x/accounts/ @testinginprod @sontrinh16 @cosmos/sdk-core-dev /x/auth/ @facundomedica @testinginprod @aaronc @cosmos/sdk-core-dev +/x/auth/tx/config @julienrbrt @akhilkumarpilli @kocubinski @cosmos/sdk-core-dev /x/authz/ @akhilkumarpilli @raynaudoe @cosmos/sdk-core-dev /x/bank/ @julienrbrt @sontrinh16 @cosmos/sdk-core-dev /x/bank/v2 @julienrbrt @hieuvubk @akhilkumarpilli @cosmos/sdk-core-dev @@ -65,6 +66,7 @@ /x/staking/ @facundomedica @testinginprod @JulianToledano @ziscky @cosmos/sdk-core-dev /x/tx/ @kocubinski @testinginprod @aaronc @cosmos/sdk-core-dev /x/upgrade/ @facundomedica @cool-develope @akhilkumarpilli @lucaslopezf @cosmos/sdk-core-dev +/x/validate @julienrbrt @akhilkumarpilli @kocubinski @cosmos/sdk-core-dev # go mods diff --git a/CHANGELOG.md b/CHANGELOG.md index c0471f22345a..ccb0d21a3121 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,8 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i * (cli) [#21372](https://github.com/cosmos/cosmos-sdk/pull/21372) Add a `bulk-add-genesis-account` genesis command to add many genesis accounts at once. * (crypto/keyring) [#21653](https://github.com/cosmos/cosmos-sdk/pull/21653) New Linux-only backend that adds Linux kernel's `keyctl` support. * (runtime) [#21704](https://github.com/cosmos/cosmos-sdk/pull/21704) Add StoreLoader in simappv2. +* (x/validate) [#21822](https://github.com/cosmos/cosmos-sdk/pull/21822) New module solely responsible for providing ante/post handlers and tx validators for v2. It can be extended by the app developer to provide extra tx validators. + * In comparison to x/auth/tx/config, there is no app config to skip ante/post handlers, as overwriting them is baseapp or not injecting the x/validate module has the same effect. ### Improvements @@ -61,16 +63,11 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i ### API Breaking Changes * (types/mempool) [#21744](https://github.com/cosmos/cosmos-sdk/pull/21744) Update types/mempool.Mempool interface to take decoded transactions. This avoid to decode the transaction twice. +* (x/auth/tx/config) [#21822](https://github.com/cosmos/cosmos-sdk/pull/21822) Sign mode textual is no more automatically added to tx config when using runtime. Should be added manually on the server side. +* (x/auth/tx/config) [#21822](https://github.com/cosmos/cosmos-sdk/pull/21822) This depinject module now only provide txconfig and tx config options. `x/validate` now handles the providing of ante/post handlers, alongside tx validators for v2. The corresponding app config options have been removed from the depinject module config. ### Deprecated -### TO SORT - -* (x/auth/tx/config) Sign mode textual not more automatically added to tx config when using runtime. Should be added manually on the server side. -* (x/auth/tx/config) This depinject module now only provide txconfig and tx config options. x/validate now handlers the providing of ante/post handlers, alongside tx validators for v2. The corresponding app config options have been removed -* (x/validate) New module solely responsible for providing ante/post handlers and tx validators for v2. It can be extended by the app developer to provide extra tx validators. - * In comparison to x/auth/tx/config, there is no app config to skip ante/post handlers, as overwriting them is baseapp or not injecting the x/validate module has the same effect. - ## [v0.52.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.52.0) - 2024-XX-XX Every module contains its own CHANGELOG.md. Please refer to the module you are interested in. diff --git a/UPGRADING.md b/UPGRADING.md index 5f1859af1b13..0eb853b31303 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -106,7 +106,7 @@ For non depinject users, simply call `RegisterLegacyAminoCodec` and `RegisterInt Additionally, thanks to the genesis simplification, as explained in [the genesis interface update](#genesis-interface), the module manager `InitGenesis` and `ExportGenesis` methods do not require the codec anymore. -##### GRPC WEB +##### gRPC Web Grpc-web embedded client has been removed from the server. If you would like to use grpc-web, you can use the [envoy proxy](https://www.envoyproxy.io/docs/envoy/latest/start/start). Here's how to set it up: @@ -319,6 +319,11 @@ used as a TTL for the transaction and is used to provide replay protection. See [ADR-070](https://github.com/cosmos/cosmos-sdk/blob/main/docs/architecture/adr-070-unordered-transactions.md) for more details. +#### Sign Mode Textual + +With the split of `x/auth/tx/config` in two (x/auth/tx/config as depinject module for txconfig and tx options) and `x/validate`, sign mode textual is no more automatically configured when using runtime (it was previously the case). +For the same instructions than for legacy app wiring to enable sign mode textual (see in v0.50 UPGRADING documentation). + ### Depinject `app_config.go` / `app.yml` With the introduction of [environment in modules](#core-api), depinject automatically creates the environment for all modules. @@ -459,7 +464,7 @@ if err != nil { } ``` -### `x/crisis` +#### `x/crisis` The `x/crisis` module was removed due to it not being supported or functional any longer. @@ -503,6 +508,11 @@ storetypes.StoreUpgrades{ } ``` +#### `x/validate` + +Introducing `x/validate` a module that is solely used for registering default ante/post handlers and global tx validators when using runtime and runtime/v2. If you wish to set your custom ante/post handlers, no need to use this module. +You can however always extend them by adding extra tx validators (see `x/validate` documentation). + ## [v0.50.x](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.50.0-alpha.0) ### Migration to CometBFT (Part 2) diff --git a/simapp/simd/cmd/testnet_test.go b/simapp/simd/cmd/testnet_test.go index f60a56596c27..f7bea40d28b3 100644 --- a/simapp/simd/cmd/testnet_test.go +++ b/simapp/simd/cmd/testnet_test.go @@ -34,6 +34,7 @@ func Test_TestnetCmd(t *testing.T) { configurator.StakingModule(), configurator.ConsensusModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.MintModule(), ) var moduleManager *module.Manager diff --git a/tests/e2e/auth/keeper/app_config.go b/tests/e2e/auth/keeper/app_config.go index 7d761d63129e..051fb5efeac7 100644 --- a/tests/e2e/auth/keeper/app_config.go +++ b/tests/e2e/auth/keeper/app_config.go @@ -20,6 +20,7 @@ var AppConfig = configurator.NewAppConfig( configurator.VestingModule(), configurator.StakingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.GenutilModule(), ) diff --git a/tests/e2e/baseapp/block_gas_test.go b/tests/e2e/baseapp/block_gas_test.go index 3ce100399438..8de527ec5bd5 100644 --- a/tests/e2e/baseapp/block_gas_test.go +++ b/tests/e2e/baseapp/block_gas_test.go @@ -88,6 +88,7 @@ func TestBaseApp_BlockGas(t *testing.T) { configurator.AccountsModule(), configurator.AuthModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.BankModule(), configurator.StakingModule(), diff --git a/tests/integration/bank/app_test.go b/tests/integration/bank/app_test.go index 6db4b4a0ff70..bc6cbf6d8a5c 100644 --- a/tests/integration/bank/app_test.go +++ b/tests/integration/bank/app_test.go @@ -97,6 +97,7 @@ func createTestSuite(t *testing.T, genesisAccounts []authtypes.GenesisAccount) s configurator.AuthModule(), configurator.StakingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.BankModule(), configurator.GovModule(), diff --git a/tests/integration/distribution/appconfig.go b/tests/integration/distribution/appconfig.go index 62cf1fc57b4b..1342dabef75f 100644 --- a/tests/integration/distribution/appconfig.go +++ b/tests/integration/distribution/appconfig.go @@ -21,6 +21,7 @@ var AppConfig = configurator.NewAppConfig( configurator.BankModule(), configurator.StakingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.GenutilModule(), configurator.DistributionModule(), diff --git a/tests/integration/evidence/app_config.go b/tests/integration/evidence/app_config.go index 02640cf9a0b1..f328a31b056a 100644 --- a/tests/integration/evidence/app_config.go +++ b/tests/integration/evidence/app_config.go @@ -21,6 +21,7 @@ var AppConfig = configurator.NewAppConfig( configurator.StakingModule(), configurator.SlashingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.EvidenceModule(), configurator.GenutilModule(), diff --git a/tests/integration/mint/app_config.go b/tests/integration/mint/app_config.go index 438b652f4ca5..b074d723d9cb 100644 --- a/tests/integration/mint/app_config.go +++ b/tests/integration/mint/app_config.go @@ -19,6 +19,7 @@ var AppConfig = configurator.NewAppConfig( configurator.BankModule(), configurator.StakingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.GenutilModule(), configurator.MintModule(), diff --git a/tests/integration/protocolpool/app_config.go b/tests/integration/protocolpool/app_config.go index 686a6b93dcd6..34f39a3111ac 100644 --- a/tests/integration/protocolpool/app_config.go +++ b/tests/integration/protocolpool/app_config.go @@ -21,6 +21,7 @@ var AppConfig = configurator.NewAppConfig( configurator.BankModule(), configurator.StakingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.GenutilModule(), configurator.MintModule(), diff --git a/tests/integration/runtime/query_test.go b/tests/integration/runtime/query_test.go index 22b261206c36..f1c2b82ab433 100644 --- a/tests/integration/runtime/query_test.go +++ b/tests/integration/runtime/query_test.go @@ -46,6 +46,7 @@ func initFixture(t assert.TestingT) *fixture { configurator.AccountsModule(), configurator.AuthModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.BankModule(), configurator.StakingModule(), diff --git a/tests/integration/server/grpc/out_of_gas_test.go b/tests/integration/server/grpc/out_of_gas_test.go index 3e26d54c4f1b..eabd41fc754d 100644 --- a/tests/integration/server/grpc/out_of_gas_test.go +++ b/tests/integration/server/grpc/out_of_gas_test.go @@ -45,6 +45,7 @@ func (s *IntegrationTestOutOfGasSuite) SetupSuite() { configurator.StakingModule(), configurator.ConsensusModule(), configurator.TxModule(), + configurator.ValidateModule(), ), baseapp.SetQueryGasLimit(10)) s.NoError(err) s.cfg.NumValidators = 1 diff --git a/tests/integration/server/grpc/server_test.go b/tests/integration/server/grpc/server_test.go index c0cc8748a6bd..e8d6d180b435 100644 --- a/tests/integration/server/grpc/server_test.go +++ b/tests/integration/server/grpc/server_test.go @@ -56,6 +56,7 @@ func (s *IntegrationTestSuite) SetupSuite() { configurator.StakingModule(), configurator.ConsensusModule(), configurator.TxModule(), + configurator.ValidateModule(), )) s.NoError(err) s.cfg.NumValidators = 1 diff --git a/tests/integration/slashing/app_config.go b/tests/integration/slashing/app_config.go index f649e196fb75..415bea47145d 100644 --- a/tests/integration/slashing/app_config.go +++ b/tests/integration/slashing/app_config.go @@ -23,6 +23,7 @@ var AppConfig = configurator.NewAppConfig( configurator.StakingModule(), configurator.SlashingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.GenutilModule(), configurator.MintModule(), diff --git a/tests/integration/slashing/slashing_test.go b/tests/integration/slashing/slashing_test.go index 035d013b369e..60fc4f1e5ac6 100644 --- a/tests/integration/slashing/slashing_test.go +++ b/tests/integration/slashing/slashing_test.go @@ -67,6 +67,7 @@ func TestSlashingMsgs(t *testing.T) { configurator.StakingModule(), configurator.SlashingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.BankModule(), ), diff --git a/tests/integration/staking/app_config.go b/tests/integration/staking/app_config.go index 9bfb400e6c09..4c08ff1faef6 100644 --- a/tests/integration/staking/app_config.go +++ b/tests/integration/staking/app_config.go @@ -22,6 +22,7 @@ var AppConfig = configurator.NewAppConfig( configurator.BankModule(), configurator.StakingModule(), configurator.TxModule(), + configurator.ValidateModule(), configurator.ConsensusModule(), configurator.GenutilModule(), configurator.MintModule(), diff --git a/testutil/configurator/configurator.go b/testutil/configurator/configurator.go index 91c93ba2d5b0..f6114e704f1f 100644 --- a/testutil/configurator/configurator.go +++ b/testutil/configurator/configurator.go @@ -24,11 +24,16 @@ import ( slashingmodulev1 "cosmossdk.io/api/cosmos/slashing/module/v1" stakingmodulev1 "cosmossdk.io/api/cosmos/staking/module/v1" txconfigv1 "cosmossdk.io/api/cosmos/tx/config/v1" + validatemodulev1 "cosmossdk.io/api/cosmos/validate/module/v1" vestingmodulev1 "cosmossdk.io/api/cosmos/vesting/module/v1" "cosmossdk.io/depinject" "cosmossdk.io/depinject/appconfig" "github.com/cosmos/cosmos-sdk/testutil" + _ "github.com/cosmos/cosmos-sdk/x/auth" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/genutil" // import as blank for app wiring + _ "github.com/cosmos/cosmos-sdk/x/validate" // import as blank for app wiring ) // Config should never need to be instantiated manually and is solely used for ModuleOption. @@ -183,13 +188,22 @@ func ParamsModule() ModuleOption { func TxModule() ModuleOption { return func(config *Config) { - config.ModuleConfigs[testutil.TxModuleName] = &appv1alpha1.ModuleConfig{ - Name: testutil.TxModuleName, + config.ModuleConfigs[testutil.AuthTxConfigDepinjectModuleName] = &appv1alpha1.ModuleConfig{ + Name: testutil.AuthTxConfigDepinjectModuleName, Config: appconfig.WrapAny(&txconfigv1.Config{}), } } } +func ValidateModule() ModuleOption { + return func(config *Config) { + config.ModuleConfigs[testutil.ValidateModuleName] = &appv1alpha1.ModuleConfig{ + Name: testutil.ValidateModuleName, + Config: appconfig.WrapAny(&validatemodulev1.Module{}), + } + } +} + func StakingModule() ModuleOption { return func(config *Config) { config.ModuleConfigs[testutil.StakingModuleName] = &appv1alpha1.ModuleConfig{ diff --git a/testutil/types.go b/testutil/types.go index d4db7fadcabd..3c3ff5c73cc4 100644 --- a/testutil/types.go +++ b/testutil/types.go @@ -4,23 +4,24 @@ package testutil // Those constants are defined here to be used in the SDK without importing those modules. const ( - AccountsModuleName = "accounts" - AuthModuleName = "auth" - AuthzModuleName = "authz" - BankModuleName = "bank" - CircuitModuleName = "circuit" - DistributionModuleName = "distribution" - EvidenceModuleName = "evidence" - FeegrantModuleName = "feegrant" - GovModuleName = "gov" - GroupModuleName = "group" - MintModuleName = "mint" - NFTModuleName = "nft" - ParamsModuleName = "params" - ProtocolPoolModuleName = "protocolpool" - SlashingModuleName = "slashing" - StakingModuleName = "staking" - TxModuleName = "tx" - UpgradeModuleName = "upgrade" - EpochsModuleName = "epochs" + AccountsModuleName = "accounts" + AuthModuleName = "auth" + AuthzModuleName = "authz" + BankModuleName = "bank" + CircuitModuleName = "circuit" + DistributionModuleName = "distribution" + EvidenceModuleName = "evidence" + FeegrantModuleName = "feegrant" + GovModuleName = "gov" + GroupModuleName = "group" + MintModuleName = "mint" + NFTModuleName = "nft" + ParamsModuleName = "params" + ProtocolPoolModuleName = "protocolpool" + SlashingModuleName = "slashing" + StakingModuleName = "staking" + AuthTxConfigDepinjectModuleName = "tx" + UpgradeModuleName = "upgrade" + EpochsModuleName = "epochs" + ValidateModuleName = "validate" ) diff --git a/x/auth/tx/README.md b/x/auth/tx/README.md index 48efb4d22ac4..07941952cdc5 100644 --- a/x/auth/tx/README.md +++ b/x/auth/tx/README.md @@ -17,8 +17,6 @@ This document specifies the `x/auth/tx` package of the Cosmos SDK. This package represents the Cosmos SDK implementation of the `client.TxConfig`, `client.TxBuilder`, `client.TxEncoder` and `client.TxDecoder` interfaces. -It contains as well a depinject module and app module the registration of ante/post handler via `runtime` and tx validator via `runtime/v2`. - ## Contents * [`x/auth/tx`](#xauthtx) @@ -28,7 +26,8 @@ It contains as well a depinject module and app module the registration of ante/p * [`TxConfig`](#txconfig) * [`TxBuilder`](#txbuilder) * [`TxEncoder`/ `TxDecoder`](#txencoder-txdecoder) - * [Depinject \& App Module](#depinject--app-module) + * [`x/auth/tx/config`](#xauthtxconfig) + * [Storage](#storage) * [Client](#client) * [CLI](#cli) * [Query](#query) @@ -71,11 +70,22 @@ A `client.TxBuilder` can be accessed with `TxConfig.NewTxBuilder()`. More information about `TxEncoder` and `TxDecoder` can be found [here](https://docs.cosmos.network/main/core/encoding#transaction-encoding). -## Depinject & App Module +## `x/auth/tx/config` The `x/auth/tx/config` contains a depinject module. The depinject module is to outputs the `TxConfig` and `TxConfigOptions` for the app. +### Storage + +This module has no store key. Do not forget to add the module name in the `SkipStoreKeys` runtime config present in the app config. + +```go +SkipStoreKeys: []string{ + authtxconfig.DepinjectModuleName, + validate.ModuleName, +}, +``` + ## Client ### CLI diff --git a/x/validate/README.md b/x/validate/README.md index d1e4f702eac5..f077102a06ef 100644 --- a/x/validate/README.md +++ b/x/validate/README.md @@ -1,5 +1,35 @@ # x/validate -The `x/validate` is an app module solely there to setup ante/post handlers on an runtime app (via baseapp options) and the tx validator on the runtime/v2 app (via app module). +:::tip +This module is only required when using runtime and runtime v2 and you want to make use of the pre-defined ante/poste handlers or tx validators. +::: -Module specific tx validators should be registered on their own modules. +The `x/validate` is an app module solely there to setup ante/post handlers on a runtime app (via baseapp options) and the global tx validators on a runtime/v2 app (via app module). Depinject will automatically inject the ante/post handlers and tx validators into the app. Module specific tx validators should be registered on their own modules. + +## Extra TxValidators + +It is possible to add extra tx validators to the app. This is useful when you want to add extra tx validators that do not belong to one specific module. For example, you can add a tx validator that checks if the tx is signed by a specific address. + +In your `app.go`, when using runtime/v2, supply the extra tx validators using `depinject`: + +```go +appConfig = depinject.Configs( + AppConfig(), + depinject.Supply( + []appmodulev2.TxValidator[transaction.Tx]{ + // Add extra tx validators here + } + ), +) +``` + +## Storage + +This module has no store key. Do not forget to add the module name in the `SkipStoreKeys` runtime config present in the app config. + +```go +SkipStoreKeys: []string{ + authtxconfig.DepinjectModuleName, + validate.ModuleName, +}, +``` diff --git a/x/validate/depinject.go b/x/validate/depinject.go index 3fa538fbada6..030974f588bd 100644 --- a/x/validate/depinject.go +++ b/x/validate/depinject.go @@ -10,11 +10,9 @@ import ( "cosmossdk.io/core/transaction" "cosmossdk.io/depinject" "cosmossdk.io/depinject/appconfig" - txsigning "cosmossdk.io/x/tx/signing" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/runtime" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/ante" @@ -35,12 +33,10 @@ func init() { type ModuleInputs struct { depinject.In - ModuleConfig *modulev1.Module - Codec codec.Codec - ProtoFileResolver txsigning.ProtoFileResolver - Environment appmodulev2.Environment - TxConfig client.TxConfig - DynamicConfig server.DynamicConfig `optional:"true"` + ModuleConfig *modulev1.Module + Environment appmodulev2.Environment + TxConfig client.TxConfig + DynamicConfig server.DynamicConfig `optional:"true"` ConsensusKeeper ante.ConsensusKeeper BankKeeper authtypes.BankKeeper `optional:"true"` @@ -55,8 +51,8 @@ type ModuleInputs struct { type ModuleOutputs struct { depinject.Out - Module appmodulev2.AppModule // This is only useful for chains using server/v2. It setup tx validators that don't belong to other modules. - BaseAppOption runtime.BaseAppOption // This is only useful for chains using baseapp. Server/v2 chains use TxValidator. + Module appmodulev2.AppModule // Only useful for chains using server/v2. It setup tx validators that don't belong to other modules. + BaseAppOption runtime.BaseAppOption // Only useful for chains using baseapp. Server/v2 chains use TxValidator. } func ProvideModule(in ModuleInputs) ModuleOutputs { From 1c89290ee41fbccc94e91420ab7e7efdead7afaa Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 20 Sep 2024 01:09:00 +0200 Subject: [PATCH 4/7] updates --- CHANGELOG.md | 2 +- .../auth/keeper/accounts_retro_compatibility_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccb0d21a3121..64487ff5c387 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,7 +47,7 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i * (crypto/keyring) [#21653](https://github.com/cosmos/cosmos-sdk/pull/21653) New Linux-only backend that adds Linux kernel's `keyctl` support. * (runtime) [#21704](https://github.com/cosmos/cosmos-sdk/pull/21704) Add StoreLoader in simappv2. * (x/validate) [#21822](https://github.com/cosmos/cosmos-sdk/pull/21822) New module solely responsible for providing ante/post handlers and tx validators for v2. It can be extended by the app developer to provide extra tx validators. - * In comparison to x/auth/tx/config, there is no app config to skip ante/post handlers, as overwriting them is baseapp or not injecting the x/validate module has the same effect. + * In comparison to x/auth/tx/config, there is no app config to skip ante/post handlers, as overwriting them in baseapp or not injecting the x/validate module has the same effect. ### Improvements diff --git a/tests/integration/auth/keeper/accounts_retro_compatibility_test.go b/tests/integration/auth/keeper/accounts_retro_compatibility_test.go index 361dab20c815..eb27f4ce36b9 100644 --- a/tests/integration/auth/keeper/accounts_retro_compatibility_test.go +++ b/tests/integration/auth/keeper/accounts_retro_compatibility_test.go @@ -46,7 +46,7 @@ func TestAuthToAccountsGRPCCompat(t *testing.T) { valid := &mockRetroCompatAccount{ retroCompat: &authtypes.QueryLegacyAccountResponse{ Account: &codectypes.Any{}, - Info: &authtypes.BaseAccount{ + Base: &authtypes.BaseAccount{ Address: "test", PubKey: nil, AccountNumber: 10, @@ -86,7 +86,7 @@ func TestAuthToAccountsGRPCCompat(t *testing.T) { Address: f.mustAddr(valid.address), }) require.NoError(t, err) - require.Equal(t, infoResp.Info, valid.retroCompat.Info) + require.Equal(t, infoResp.Info, valid.retroCompat.Base) accountResp, err := qs.Account(f.ctx, &authtypes.QueryAccountRequest{ Address: f.mustAddr(noInfo.address), From 105bfdf651de41ed3cc47cffaaa04aca354b09c2 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 20 Sep 2024 01:12:14 +0200 Subject: [PATCH 5/7] updates --- x/auth/tx/config/depinject.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/x/auth/tx/config/depinject.go b/x/auth/tx/config/depinject.go index 1b69b047d26b..bda9ca8735e7 100644 --- a/x/auth/tx/config/depinject.go +++ b/x/auth/tx/config/depinject.go @@ -12,7 +12,6 @@ import ( bankv1beta1 "cosmossdk.io/api/cosmos/bank/v1beta1" txconfigv1 "cosmossdk.io/api/cosmos/tx/config/v1" "cosmossdk.io/core/address" - appmodulev2 "cosmossdk.io/core/appmodule/v2" "cosmossdk.io/depinject" "cosmossdk.io/depinject/appconfig" txsigning "cosmossdk.io/x/tx/signing" @@ -43,7 +42,6 @@ type ModuleInputs struct { ValidatorAddressCodec address.ValidatorAddressCodec Codec codec.Codec ProtoFileResolver txsigning.ProtoFileResolver - Environment appmodulev2.Environment CustomSignModeHandlers func() []txsigning.SignModeHandler `optional:"true"` CustomGetSigners []txsigning.CustomGetSigner `optional:"true"` } From aa94f02c1f7c9ada612070c964f272baebf1d060 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 20 Sep 2024 01:28:25 +0200 Subject: [PATCH 6/7] updates --- x/validate/depinject.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/x/validate/depinject.go b/x/validate/depinject.go index 030974f588bd..9f508717f04f 100644 --- a/x/validate/depinject.go +++ b/x/validate/depinject.go @@ -1,7 +1,6 @@ package validate import ( - "errors" "fmt" modulev1 "cosmossdk.io/api/cosmos/validate/module/v1" @@ -38,9 +37,9 @@ type ModuleInputs struct { TxConfig client.TxConfig DynamicConfig server.DynamicConfig `optional:"true"` + AccountKeeper ante.AccountKeeper + BankKeeper authtypes.BankKeeper ConsensusKeeper ante.ConsensusKeeper - BankKeeper authtypes.BankKeeper `optional:"true"` - AccountKeeper ante.AccountKeeper `optional:"true"` FeeGrantKeeper ante.FeegrantKeeper `optional:"true"` AccountAbstractionKeeper ante.AccountAbstractionKeeper `optional:"true"` ExtraTxValidators []appmodulev2.TxValidator[transaction.Tx] `optional:"true"` @@ -60,7 +59,7 @@ func ProvideModule(in ModuleInputs) ModuleOutputs { in.AccountKeeper, in.TxConfig.SignModeHandler(), ante.DefaultSigVerificationGasConsumer, - in.AccountAbstractionKeeper, + in.AccountAbstractionKeeper, // can be nil ) var ( @@ -69,7 +68,8 @@ func ProvideModule(in ModuleInputs) ModuleOutputs { feeTxValidator *ante.DeductFeeDecorator unorderedTxValidator *ante.UnorderedTxDecorator ) - if in.AccountKeeper != nil && in.BankKeeper != nil && in.DynamicConfig != nil { + + if in.DynamicConfig != nil { minGasPricesStr := in.DynamicConfig.GetString(flagMinGasPricesV2) minGasPrices, err = sdk.ParseDecCoins(minGasPricesStr) if err != nil { @@ -125,10 +125,6 @@ func newBaseAppOption(in ModuleInputs) func(app *baseapp.BaseApp) { } func newAnteHandler(in ModuleInputs) (sdk.AnteHandler, error) { - if in.BankKeeper == nil { - return nil, errors.New("both AccountKeeper and BankKeeper are required") - } - anteHandler, err := ante.NewAnteHandler( ante.HandlerOptions{ Environment: in.Environment, From 04d06bdb45248eeffbbe6e6130ad04dc5331f271 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 20 Sep 2024 01:28:57 +0200 Subject: [PATCH 7/7] updates --- tests/e2e/accounts/base_account_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/e2e/accounts/base_account_test.go b/tests/e2e/accounts/base_account_test.go index 80c181e0bc6e..bfaee8bbb357 100644 --- a/tests/e2e/accounts/base_account_test.go +++ b/tests/e2e/accounts/base_account_test.go @@ -6,6 +6,7 @@ import ( "math/rand" "testing" + gogoproto "github.com/cosmos/gogoproto/proto" gogoany "github.com/cosmos/gogoproto/types/any" "cosmossdk.io/simapp"