chore(group): State machine audit (#11559)

## Description

ref: #10968 

I would like to have some eyes to:

- Make sure the state machine vulnerabiities are indeed bugs that should be fixed:
  - [x] https://github.com/cosmos/cosmos-sdk/pull/11559#discussion_r846091449
  - [x] https://github.com/cosmos/cosmos-sdk/pull/11559#discussion_r846093388
  - [x] https://github.com/cosmos/cosmos-sdk/pull/11559#discussion_r846096172
  - [x] https://github.com/cosmos/cosmos-sdk/pull/11559#discussion_r849306060
- Some open questions:
  - [x] https://github.com/cosmos/cosmos-sdk/pull/11559#discussion_r846090420
  - [x] https://github.com/cosmos/cosmos-sdk/pull/11559#discussion_r846094966
  - [x] https://github.com/cosmos/cosmos-sdk/pull/11559#discussion_r851193426

Other code changes are small: some small refactors to make code clearer, less panics, better error messages...

depends on:
- [x] #11560 



---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
This commit is contained in:
Amaury 2022-04-15 12:35:45 +02:00 committed by GitHub
parent 9898ac5e9d
commit 53a6f199fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 969 additions and 658 deletions

View File

@ -1694,8 +1694,8 @@ type PackageReference struct {
// present in a previous version.
//
// A package should indicate its revision with a source code comment
// above the package declaration in one of its fields containing the
// test "Revision N" where N is an integer revision. All packages start
// above the package declaration in one of its files containing the
// text "Revision N" where N is an integer revision. All packages start
// at revision 0 the first time they are released in a module.
//
// When a new version of a module is released and items are added to existing

View File

@ -2877,6 +2877,7 @@ var (
md_EventExec protoreflect.MessageDescriptor
fd_EventExec_proposal_id protoreflect.FieldDescriptor
fd_EventExec_result protoreflect.FieldDescriptor
fd_EventExec_logs protoreflect.FieldDescriptor
)
func init() {
@ -2884,6 +2885,7 @@ func init() {
md_EventExec = File_cosmos_group_v1_events_proto.Messages().ByName("EventExec")
fd_EventExec_proposal_id = md_EventExec.Fields().ByName("proposal_id")
fd_EventExec_result = md_EventExec.Fields().ByName("result")
fd_EventExec_logs = md_EventExec.Fields().ByName("logs")
}
var _ protoreflect.Message = (*fastReflection_EventExec)(nil)
@ -2963,6 +2965,12 @@ func (x *fastReflection_EventExec) Range(f func(protoreflect.FieldDescriptor, pr
return
}
}
if x.Logs != "" {
value := protoreflect.ValueOfString(x.Logs)
if !f(fd_EventExec_logs, value) {
return
}
}
}
// Has reports whether a field is populated.
@ -2982,6 +2990,8 @@ func (x *fastReflection_EventExec) Has(fd protoreflect.FieldDescriptor) bool {
return x.ProposalId != uint64(0)
case "cosmos.group.v1.EventExec.result":
return x.Result != 0
case "cosmos.group.v1.EventExec.logs":
return x.Logs != ""
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventExec"))
@ -3002,6 +3012,8 @@ func (x *fastReflection_EventExec) Clear(fd protoreflect.FieldDescriptor) {
x.ProposalId = uint64(0)
case "cosmos.group.v1.EventExec.result":
x.Result = 0
case "cosmos.group.v1.EventExec.logs":
x.Logs = ""
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventExec"))
@ -3024,6 +3036,9 @@ func (x *fastReflection_EventExec) Get(descriptor protoreflect.FieldDescriptor)
case "cosmos.group.v1.EventExec.result":
value := x.Result
return protoreflect.ValueOfEnum((protoreflect.EnumNumber)(value))
case "cosmos.group.v1.EventExec.logs":
value := x.Logs
return protoreflect.ValueOfString(value)
default:
if descriptor.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventExec"))
@ -3048,6 +3063,8 @@ func (x *fastReflection_EventExec) Set(fd protoreflect.FieldDescriptor, value pr
x.ProposalId = value.Uint()
case "cosmos.group.v1.EventExec.result":
x.Result = (ProposalExecutorResult)(value.Enum())
case "cosmos.group.v1.EventExec.logs":
x.Logs = value.Interface().(string)
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventExec"))
@ -3072,6 +3089,8 @@ func (x *fastReflection_EventExec) Mutable(fd protoreflect.FieldDescriptor) prot
panic(fmt.Errorf("field proposal_id of message cosmos.group.v1.EventExec is not mutable"))
case "cosmos.group.v1.EventExec.result":
panic(fmt.Errorf("field result of message cosmos.group.v1.EventExec is not mutable"))
case "cosmos.group.v1.EventExec.logs":
panic(fmt.Errorf("field logs of message cosmos.group.v1.EventExec is not mutable"))
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventExec"))
@ -3089,6 +3108,8 @@ func (x *fastReflection_EventExec) NewField(fd protoreflect.FieldDescriptor) pro
return protoreflect.ValueOfUint64(uint64(0))
case "cosmos.group.v1.EventExec.result":
return protoreflect.ValueOfEnum(0)
case "cosmos.group.v1.EventExec.logs":
return protoreflect.ValueOfString("")
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.EventExec"))
@ -3164,6 +3185,10 @@ func (x *fastReflection_EventExec) ProtoMethods() *protoiface.Methods {
if x.Result != 0 {
n += 1 + runtime.Sov(uint64(x.Result))
}
l = len(x.Logs)
if l > 0 {
n += 1 + l + runtime.Sov(uint64(l))
}
if x.unknownFields != nil {
n += len(x.unknownFields)
}
@ -3193,6 +3218,13 @@ func (x *fastReflection_EventExec) ProtoMethods() *protoiface.Methods {
i -= len(x.unknownFields)
copy(dAtA[i:], x.unknownFields)
}
if len(x.Logs) > 0 {
i -= len(x.Logs)
copy(dAtA[i:], x.Logs)
i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Logs)))
i--
dAtA[i] = 0x1a
}
if x.Result != 0 {
i = runtime.EncodeVarint(dAtA, i, uint64(x.Result))
i--
@ -3290,6 +3322,38 @@ func (x *fastReflection_EventExec) ProtoMethods() *protoiface.Methods {
break
}
}
case 3:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Logs", wireType)
}
var stringLen 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++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
if postIndex > l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
x.Logs = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := runtime.Skip(dAtA[iNdEx:])
@ -4077,6 +4141,8 @@ type EventExec struct {
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id,omitempty"`
// result is the proposal execution result.
Result ProposalExecutorResult `protobuf:"varint,2,opt,name=result,proto3,enum=cosmos.group.v1.ProposalExecutorResult" json:"result,omitempty"`
// logs contains error logs in case the execution result is FAILURE.
Logs string `protobuf:"bytes,3,opt,name=logs,proto3" json:"logs,omitempty"`
}
func (x *EventExec) Reset() {
@ -4113,6 +4179,13 @@ func (x *EventExec) GetResult() ProposalExecutorResult {
return ProposalExecutorResult_PROPOSAL_EXECUTOR_RESULT_UNSPECIFIED
}
func (x *EventExec) GetLogs() string {
if x != nil {
return x.Logs
}
return ""
}
// EventLeaveGroup is an event emitted when group member leaves the group.
type EventLeaveGroup struct {
state protoimpl.MessageState
@ -4194,32 +4267,33 @@ var file_cosmos_group_v1_events_proto_rawDesc = []byte{
0x6c, 0x49, 0x64, 0x22, 0x2c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x74, 0x65,
0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18,
0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49,
0x64, 0x22, 0x6d, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1f,
0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x12,
0x3f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76,
0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74,
0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
0x22, 0x60, 0x0a, 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72,
0x6f, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18,
0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x32,
0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,
0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72,
0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
0x73, 0x73, 0x42, 0xba, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f,
0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x45, 0x76, 0x65, 0x6e,
0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x38, 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, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d,
0x6f, 0x73, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x72, 0x6f, 0x75,
0x70, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x47, 0x58, 0xaa, 0x02, 0x0f, 0x43, 0x6f, 0x73, 0x6d,
0x6f, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x43, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b,
0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56, 0x31, 0x5c,
0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x43, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0x3a, 0x56, 0x31, 0x62,
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x64, 0x22, 0x81, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x65, 0x63, 0x12,
0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01,
0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64,
0x12, 0x3f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e,
0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75,
0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c,
0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x60, 0x0a, 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x65,
0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75,
0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75,
0x70, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02,
0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73,
0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07,
0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0xba, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e,
0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x42,
0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x38,
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, 0x61, 0x70, 0x69,
0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x76, 0x31,
0x3b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x47, 0x58, 0xaa, 0x02,
0x0f, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x56, 0x31,
0xca, 0x02, 0x0f, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c,
0x56, 0x31, 0xe2, 0x02, 0x1b, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75,
0x70, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
0xea, 0x02, 0x11, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -12300,12 +12300,14 @@ func (x *fastReflection_MsgExec) ProtoMethods() *protoiface.Methods {
}
var (
md_MsgExecResponse protoreflect.MessageDescriptor
md_MsgExecResponse protoreflect.MessageDescriptor
fd_MsgExecResponse_result protoreflect.FieldDescriptor
)
func init() {
file_cosmos_group_v1_tx_proto_init()
md_MsgExecResponse = File_cosmos_group_v1_tx_proto.Messages().ByName("MsgExecResponse")
fd_MsgExecResponse_result = md_MsgExecResponse.Fields().ByName("result")
}
var _ protoreflect.Message = (*fastReflection_MsgExecResponse)(nil)
@ -12373,6 +12375,12 @@ func (x *fastReflection_MsgExecResponse) Interface() protoreflect.ProtoMessage {
// While iterating, mutating operations may only be performed
// on the current field descriptor.
func (x *fastReflection_MsgExecResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
if x.Result != 0 {
value := protoreflect.ValueOfEnum((protoreflect.EnumNumber)(x.Result))
if !f(fd_MsgExecResponse_result, value) {
return
}
}
}
// Has reports whether a field is populated.
@ -12388,6 +12396,8 @@ func (x *fastReflection_MsgExecResponse) Range(f func(protoreflect.FieldDescript
// a repeated field is populated if it is non-empty.
func (x *fastReflection_MsgExecResponse) Has(fd protoreflect.FieldDescriptor) bool {
switch fd.FullName() {
case "cosmos.group.v1.MsgExecResponse.result":
return x.Result != 0
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.MsgExecResponse"))
@ -12404,6 +12414,8 @@ func (x *fastReflection_MsgExecResponse) Has(fd protoreflect.FieldDescriptor) bo
// Clear is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgExecResponse) Clear(fd protoreflect.FieldDescriptor) {
switch fd.FullName() {
case "cosmos.group.v1.MsgExecResponse.result":
x.Result = 0
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.MsgExecResponse"))
@ -12420,6 +12432,9 @@ func (x *fastReflection_MsgExecResponse) Clear(fd protoreflect.FieldDescriptor)
// of the value; to obtain a mutable reference, use Mutable.
func (x *fastReflection_MsgExecResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
switch descriptor.FullName() {
case "cosmos.group.v1.MsgExecResponse.result":
value := x.Result
return protoreflect.ValueOfEnum((protoreflect.EnumNumber)(value))
default:
if descriptor.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.MsgExecResponse"))
@ -12440,6 +12455,8 @@ func (x *fastReflection_MsgExecResponse) Get(descriptor protoreflect.FieldDescri
// Set is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgExecResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) {
switch fd.FullName() {
case "cosmos.group.v1.MsgExecResponse.result":
x.Result = (ProposalExecutorResult)(value.Enum())
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.MsgExecResponse"))
@ -12460,6 +12477,8 @@ func (x *fastReflection_MsgExecResponse) Set(fd protoreflect.FieldDescriptor, va
// Mutable is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgExecResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
switch fd.FullName() {
case "cosmos.group.v1.MsgExecResponse.result":
panic(fmt.Errorf("field result of message cosmos.group.v1.MsgExecResponse is not mutable"))
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.MsgExecResponse"))
@ -12473,6 +12492,8 @@ func (x *fastReflection_MsgExecResponse) Mutable(fd protoreflect.FieldDescriptor
// For lists, maps, and messages, this returns a new, empty, mutable value.
func (x *fastReflection_MsgExecResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
switch fd.FullName() {
case "cosmos.group.v1.MsgExecResponse.result":
return protoreflect.ValueOfEnum(0)
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.group.v1.MsgExecResponse"))
@ -12542,6 +12563,9 @@ func (x *fastReflection_MsgExecResponse) ProtoMethods() *protoiface.Methods {
var n int
var l int
_ = l
if x.Result != 0 {
n += 1 + runtime.Sov(uint64(x.Result))
}
if x.unknownFields != nil {
n += len(x.unknownFields)
}
@ -12571,6 +12595,11 @@ func (x *fastReflection_MsgExecResponse) ProtoMethods() *protoiface.Methods {
i -= len(x.unknownFields)
copy(dAtA[i:], x.unknownFields)
}
if x.Result != 0 {
i = runtime.EncodeVarint(dAtA, i, uint64(x.Result))
i--
dAtA[i] = 0x10
}
if input.Buf != nil {
input.Buf = append(input.Buf, dAtA...)
} else {
@ -12620,6 +12649,25 @@ func (x *fastReflection_MsgExecResponse) ProtoMethods() *protoiface.Methods {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgExecResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 2:
if wireType != 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Result", wireType)
}
x.Result = 0
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++
x.Result |= ProposalExecutorResult(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := runtime.Skip(dAtA[iNdEx:])
@ -14700,6 +14748,9 @@ type MsgExecResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// result is the final result of the proposal execution.
Result ProposalExecutorResult `protobuf:"varint,2,opt,name=result,proto3,enum=cosmos.group.v1.ProposalExecutorResult" json:"result,omitempty"`
}
func (x *MsgExecResponse) Reset() {
@ -14722,6 +14773,13 @@ func (*MsgExecResponse) Descriptor() ([]byte, []int) {
return file_cosmos_group_v1_tx_proto_rawDescGZIP(), []int{25}
}
func (x *MsgExecResponse) GetResult() ProposalExecutorResult {
if x != nil {
return x.Result
}
return ProposalExecutorResult_PROPOSAL_EXECUTOR_RESULT_UNSPECIFIED
}
// MsgLeaveGroup is the Msg/LeaveGroup request type.
type MsgLeaveGroup struct {
state protoimpl.MessageState
@ -14859,7 +14917,7 @@ var file_cosmos_group_v1_tx_proto_rawDesc = []byte{
0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x0a, 0x82, 0xe7, 0xb0, 0x2a, 0x05, 0x61, 0x64, 0x6d, 0x69,
0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72,
0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x14, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74,
0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x14, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74,
0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x05,
0x61, 0x64, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d,
0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53,
@ -14867,10 +14925,11 @@ var file_cosmos_group_v1_tx_proto_rawDesc = []byte{
0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07,
0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
0x61, 0x74, 0x61, 0x12, 0x51, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
0x61, 0x74, 0x61, 0x12, 0x61, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 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, 0x42, 0x12, 0xca, 0xb4, 0x2d, 0x0e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e,
0x6e, 0x79, 0x42, 0x22, 0xca, 0xb4, 0x2d, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e,
0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e,
0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x0e, 0x88, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a,
0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x22, 0x52, 0x0a, 0x1c, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65,
@ -14892,7 +14951,7 @@ var file_cosmos_group_v1_tx_proto_rawDesc = []byte{
0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e,
0x67, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x3a, 0x0a, 0x82, 0xe7, 0xb0,
0x2a, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x22, 0xf4, 0x02, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x43,
0x2a, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x22, 0x84, 0x03, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x43,
0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6f,
0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e,
@ -14909,10 +14968,11 @@ var file_cosmos_group_v1_tx_proto_rawDesc = []byte{
0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x15, 0x67, 0x72, 0x6f, 0x75,
0x70, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x61, 0x73, 0x5f, 0x61, 0x64, 0x6d, 0x69,
0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f,
0x6c, 0x69, 0x63, 0x79, 0x41, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x51, 0x0a, 0x0f, 0x64,
0x6c, 0x69, 0x63, 0x79, 0x41, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x61, 0x0a, 0x0f, 0x64,
0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06,
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, 0x42, 0x12, 0xca, 0xb4, 0x2d, 0x0e,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x22, 0xca, 0xb4, 0x2d, 0x1e,
0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e,
0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0e,
0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x0e,
0x88, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x22, 0x89,
@ -14927,7 +14987,7 @@ var file_cosmos_group_v1_tx_proto_rawDesc = []byte{
0x69, 0x63, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x23, 0x0a, 0x21, 0x4d, 0x73,
0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69,
0x63, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x83, 0x02, 0x0a, 0x22, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f,
0x93, 0x02, 0x0a, 0x22, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f,
0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e,
0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f,
@ -14937,10 +14997,11 @@ var file_cosmos_group_v1_tx_proto_rawDesc = []byte{
0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73,
0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x12,
0x67, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65,
0x73, 0x73, 0x12, 0x51, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70,
0x73, 0x73, 0x12, 0x61, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70,
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 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, 0x42, 0x12, 0xca, 0xb4, 0x2d, 0x0e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50,
0x79, 0x42, 0x22, 0xca, 0xb4, 0x2d, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72,
0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50,
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50,
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x0e, 0x88, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x05,
0x61, 0x64, 0x6d, 0x69, 0x6e, 0x22, 0x2c, 0x0a, 0x2a, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61,
@ -15013,124 +15074,128 @@ var file_cosmos_group_v1_tx_proto_rawDesc = []byte{
0x75, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14,
0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74,
0x72, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x3a, 0x0b,
0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x22, 0x11, 0x0a, 0x0f, 0x4d,
0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c,
0x0a, 0x0d, 0x4d, 0x73, 0x67, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12,
0x32, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64,
0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72,
0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18,
0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x3a, 0x0c,
0x82, 0xe7, 0xb0, 0x2a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x17, 0x0a, 0x15,
0x4d, 0x73, 0x67, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x2a, 0x0a, 0x04, 0x45, 0x78, 0x65, 0x63, 0x12, 0x14, 0x0a,
0x10, 0x45, 0x58, 0x45, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x45, 0x43, 0x5f, 0x54, 0x52, 0x59, 0x10,
0x01, 0x32, 0xc3, 0x0b, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x57, 0x0a, 0x0b, 0x43, 0x72, 0x65,
0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f,
0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72,
0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d,
0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x22, 0x52, 0x0a, 0x0f, 0x4d,
0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f,
0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27,
0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31,
0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f,
0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22,
0x6c, 0x0a, 0x0d, 0x4d, 0x73, 0x67, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x12, 0x32, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64,
0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x61, 0x64, 0x64,
0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64,
0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x3a,
0x0c, 0x82, 0xe7, 0xb0, 0x2a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x17, 0x0a,
0x15, 0x4d, 0x73, 0x67, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x2a, 0x0a, 0x04, 0x45, 0x78, 0x65, 0x63, 0x12, 0x14,
0x0a, 0x10, 0x45, 0x58, 0x45, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x45, 0x43, 0x5f, 0x54, 0x52, 0x59,
0x10, 0x01, 0x32, 0xc3, 0x0b, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x57, 0x0a, 0x0b, 0x43, 0x72,
0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d,
0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43,
0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x12, 0x6c, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75,
0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f,
0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70,
0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73,
0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e,
0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75,
0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x12, 0x66, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41,
0x64, 0x6d, 0x69, 0x6e, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72,
0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x1a, 0x2c, 0x2e, 0x63, 0x6f, 0x73,
0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x6d, 0x69, 0x6e,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61,
0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12,
0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76,
0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f,
0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70,
0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x11, 0x43, 0x72, 0x65,
0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x25,
0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31,
0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50,
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74,
0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72,
0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x2e,
0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e,
0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69,
0x74, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x31, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f,
0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72,
0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6f, 0x6c,
0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x16, 0x55,
0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x2a, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74,
0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x64, 0x6d, 0x69,
0x6e, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70,
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f,
0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d,
0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55,
0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72,
0x73, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70,
0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f,
0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x63, 0x69, 0x73,
0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x6d,
0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x12, 0x66, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74,
0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x1a, 0x2c, 0x2e, 0x63, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73,
0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x6d, 0x69,
0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x64,
0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
0x12, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e,
0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75,
0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d,
0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55,
0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x3b,
0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x11, 0x43, 0x72,
0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12,
0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76,
0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e,
0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61,
0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47,
0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29,
0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31,
0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50,
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c,
0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x19,
0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57,
0x69, 0x74, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x31, 0x2e, 0x63, 0x6f, 0x73, 0x6d,
0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43,
0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6f,
0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x16,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63,
0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x6d,
0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x2a, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e,
0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61,
0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x64, 0x6d,
0x69, 0x6e, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75,
0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72,
0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74,
0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x63, 0x69,
0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63,
0x79, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a,
0x3b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76,
0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f,
0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a,
0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69,
0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63,
0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x73, 0x6d,
0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55,
0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f,
0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70,
0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d,
0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
0x60, 0x0a, 0x0e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61,
0x6c, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70,
0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x6f,
0x70, 0x6f, 0x73, 0x61, 0x6c, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69,
0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x12, 0x66, 0x0a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f,
0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x57, 0x69, 0x74, 0x68, 0x64,
0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x1a, 0x2c, 0x2e, 0x63, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73,
0x67, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61,
0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x56, 0x6f, 0x74,
0x65, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70,
0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x1a, 0x20, 0x2e, 0x63, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73,
0x67, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a,
0x04, 0x45, 0x78, 0x65, 0x63, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x1a,
0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76,
0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x12, 0x54, 0x0a, 0x0a, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12,
0x1e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76,
0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a,
0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76,
0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xb6, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e,
0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x42,
0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x38, 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, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x72, 0x6f,
0x75, 0x70, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x47, 0x58, 0xaa, 0x02, 0x0f, 0x43, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x43,
0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56, 0x31, 0xe2, 0x02,
0x1b, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56, 0x31,
0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x43,
0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0x3a, 0x56, 0x31,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x12, 0x60, 0x0a, 0x0e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73,
0x61, 0x6c, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75,
0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x72,
0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e,
0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d,
0x69, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x12, 0x66, 0x0a, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72,
0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e,
0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x57, 0x69, 0x74, 0x68,
0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x1a, 0x2c, 0x2e, 0x63,
0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d,
0x73, 0x67, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73,
0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x56, 0x6f,
0x74, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75,
0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x1a, 0x20, 0x2e, 0x63,
0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d,
0x73, 0x67, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42,
0x0a, 0x04, 0x45, 0x78, 0x65, 0x63, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e,
0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63,
0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e,
0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x12, 0x54, 0x0a, 0x0a, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e,
0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e,
0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xb6, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d,
0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31,
0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x38, 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, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x72,
0x6f, 0x75, 0x70, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x47, 0x58, 0xaa, 0x02, 0x0f, 0x43, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f,
0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56, 0x31, 0xe2,
0x02, 0x1b, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5c, 0x56,
0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11,
0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0x3a, 0x56,
0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@ -15180,6 +15245,7 @@ var file_cosmos_group_v1_tx_proto_goTypes = []interface{}{
(*Member)(nil), // 29: cosmos.group.v1.Member
(*anypb.Any)(nil), // 30: google.protobuf.Any
(VoteOption)(0), // 31: cosmos.group.v1.VoteOption
(ProposalExecutorResult)(0), // 32: cosmos.group.v1.ProposalExecutorResult
}
var file_cosmos_group_v1_tx_proto_depIdxs = []int32{
29, // 0: cosmos.group.v1.MsgCreateGroup.members:type_name -> cosmos.group.v1.Member
@ -15192,39 +15258,40 @@ var file_cosmos_group_v1_tx_proto_depIdxs = []int32{
0, // 7: cosmos.group.v1.MsgSubmitProposal.exec:type_name -> cosmos.group.v1.Exec
31, // 8: cosmos.group.v1.MsgVote.option:type_name -> cosmos.group.v1.VoteOption
0, // 9: cosmos.group.v1.MsgVote.exec:type_name -> cosmos.group.v1.Exec
1, // 10: cosmos.group.v1.Msg.CreateGroup:input_type -> cosmos.group.v1.MsgCreateGroup
3, // 11: cosmos.group.v1.Msg.UpdateGroupMembers:input_type -> cosmos.group.v1.MsgUpdateGroupMembers
5, // 12: cosmos.group.v1.Msg.UpdateGroupAdmin:input_type -> cosmos.group.v1.MsgUpdateGroupAdmin
7, // 13: cosmos.group.v1.Msg.UpdateGroupMetadata:input_type -> cosmos.group.v1.MsgUpdateGroupMetadata
9, // 14: cosmos.group.v1.Msg.CreateGroupPolicy:input_type -> cosmos.group.v1.MsgCreateGroupPolicy
12, // 15: cosmos.group.v1.Msg.CreateGroupWithPolicy:input_type -> cosmos.group.v1.MsgCreateGroupWithPolicy
11, // 16: cosmos.group.v1.Msg.UpdateGroupPolicyAdmin:input_type -> cosmos.group.v1.MsgUpdateGroupPolicyAdmin
15, // 17: cosmos.group.v1.Msg.UpdateGroupPolicyDecisionPolicy:input_type -> cosmos.group.v1.MsgUpdateGroupPolicyDecisionPolicy
17, // 18: cosmos.group.v1.Msg.UpdateGroupPolicyMetadata:input_type -> cosmos.group.v1.MsgUpdateGroupPolicyMetadata
19, // 19: cosmos.group.v1.Msg.SubmitProposal:input_type -> cosmos.group.v1.MsgSubmitProposal
21, // 20: cosmos.group.v1.Msg.WithdrawProposal:input_type -> cosmos.group.v1.MsgWithdrawProposal
23, // 21: cosmos.group.v1.Msg.Vote:input_type -> cosmos.group.v1.MsgVote
25, // 22: cosmos.group.v1.Msg.Exec:input_type -> cosmos.group.v1.MsgExec
27, // 23: cosmos.group.v1.Msg.LeaveGroup:input_type -> cosmos.group.v1.MsgLeaveGroup
2, // 24: cosmos.group.v1.Msg.CreateGroup:output_type -> cosmos.group.v1.MsgCreateGroupResponse
4, // 25: cosmos.group.v1.Msg.UpdateGroupMembers:output_type -> cosmos.group.v1.MsgUpdateGroupMembersResponse
6, // 26: cosmos.group.v1.Msg.UpdateGroupAdmin:output_type -> cosmos.group.v1.MsgUpdateGroupAdminResponse
8, // 27: cosmos.group.v1.Msg.UpdateGroupMetadata:output_type -> cosmos.group.v1.MsgUpdateGroupMetadataResponse
10, // 28: cosmos.group.v1.Msg.CreateGroupPolicy:output_type -> cosmos.group.v1.MsgCreateGroupPolicyResponse
13, // 29: cosmos.group.v1.Msg.CreateGroupWithPolicy:output_type -> cosmos.group.v1.MsgCreateGroupWithPolicyResponse
14, // 30: cosmos.group.v1.Msg.UpdateGroupPolicyAdmin:output_type -> cosmos.group.v1.MsgUpdateGroupPolicyAdminResponse
16, // 31: cosmos.group.v1.Msg.UpdateGroupPolicyDecisionPolicy:output_type -> cosmos.group.v1.MsgUpdateGroupPolicyDecisionPolicyResponse
18, // 32: cosmos.group.v1.Msg.UpdateGroupPolicyMetadata:output_type -> cosmos.group.v1.MsgUpdateGroupPolicyMetadataResponse
20, // 33: cosmos.group.v1.Msg.SubmitProposal:output_type -> cosmos.group.v1.MsgSubmitProposalResponse
22, // 34: cosmos.group.v1.Msg.WithdrawProposal:output_type -> cosmos.group.v1.MsgWithdrawProposalResponse
24, // 35: cosmos.group.v1.Msg.Vote:output_type -> cosmos.group.v1.MsgVoteResponse
26, // 36: cosmos.group.v1.Msg.Exec:output_type -> cosmos.group.v1.MsgExecResponse
28, // 37: cosmos.group.v1.Msg.LeaveGroup:output_type -> cosmos.group.v1.MsgLeaveGroupResponse
24, // [24:38] is the sub-list for method output_type
10, // [10:24] is the sub-list for method input_type
10, // [10:10] is the sub-list for extension type_name
10, // [10:10] is the sub-list for extension extendee
0, // [0:10] is the sub-list for field type_name
32, // 10: cosmos.group.v1.MsgExecResponse.result:type_name -> cosmos.group.v1.ProposalExecutorResult
1, // 11: cosmos.group.v1.Msg.CreateGroup:input_type -> cosmos.group.v1.MsgCreateGroup
3, // 12: cosmos.group.v1.Msg.UpdateGroupMembers:input_type -> cosmos.group.v1.MsgUpdateGroupMembers
5, // 13: cosmos.group.v1.Msg.UpdateGroupAdmin:input_type -> cosmos.group.v1.MsgUpdateGroupAdmin
7, // 14: cosmos.group.v1.Msg.UpdateGroupMetadata:input_type -> cosmos.group.v1.MsgUpdateGroupMetadata
9, // 15: cosmos.group.v1.Msg.CreateGroupPolicy:input_type -> cosmos.group.v1.MsgCreateGroupPolicy
12, // 16: cosmos.group.v1.Msg.CreateGroupWithPolicy:input_type -> cosmos.group.v1.MsgCreateGroupWithPolicy
11, // 17: cosmos.group.v1.Msg.UpdateGroupPolicyAdmin:input_type -> cosmos.group.v1.MsgUpdateGroupPolicyAdmin
15, // 18: cosmos.group.v1.Msg.UpdateGroupPolicyDecisionPolicy:input_type -> cosmos.group.v1.MsgUpdateGroupPolicyDecisionPolicy
17, // 19: cosmos.group.v1.Msg.UpdateGroupPolicyMetadata:input_type -> cosmos.group.v1.MsgUpdateGroupPolicyMetadata
19, // 20: cosmos.group.v1.Msg.SubmitProposal:input_type -> cosmos.group.v1.MsgSubmitProposal
21, // 21: cosmos.group.v1.Msg.WithdrawProposal:input_type -> cosmos.group.v1.MsgWithdrawProposal
23, // 22: cosmos.group.v1.Msg.Vote:input_type -> cosmos.group.v1.MsgVote
25, // 23: cosmos.group.v1.Msg.Exec:input_type -> cosmos.group.v1.MsgExec
27, // 24: cosmos.group.v1.Msg.LeaveGroup:input_type -> cosmos.group.v1.MsgLeaveGroup
2, // 25: cosmos.group.v1.Msg.CreateGroup:output_type -> cosmos.group.v1.MsgCreateGroupResponse
4, // 26: cosmos.group.v1.Msg.UpdateGroupMembers:output_type -> cosmos.group.v1.MsgUpdateGroupMembersResponse
6, // 27: cosmos.group.v1.Msg.UpdateGroupAdmin:output_type -> cosmos.group.v1.MsgUpdateGroupAdminResponse
8, // 28: cosmos.group.v1.Msg.UpdateGroupMetadata:output_type -> cosmos.group.v1.MsgUpdateGroupMetadataResponse
10, // 29: cosmos.group.v1.Msg.CreateGroupPolicy:output_type -> cosmos.group.v1.MsgCreateGroupPolicyResponse
13, // 30: cosmos.group.v1.Msg.CreateGroupWithPolicy:output_type -> cosmos.group.v1.MsgCreateGroupWithPolicyResponse
14, // 31: cosmos.group.v1.Msg.UpdateGroupPolicyAdmin:output_type -> cosmos.group.v1.MsgUpdateGroupPolicyAdminResponse
16, // 32: cosmos.group.v1.Msg.UpdateGroupPolicyDecisionPolicy:output_type -> cosmos.group.v1.MsgUpdateGroupPolicyDecisionPolicyResponse
18, // 33: cosmos.group.v1.Msg.UpdateGroupPolicyMetadata:output_type -> cosmos.group.v1.MsgUpdateGroupPolicyMetadataResponse
20, // 34: cosmos.group.v1.Msg.SubmitProposal:output_type -> cosmos.group.v1.MsgSubmitProposalResponse
22, // 35: cosmos.group.v1.Msg.WithdrawProposal:output_type -> cosmos.group.v1.MsgWithdrawProposalResponse
24, // 36: cosmos.group.v1.Msg.Vote:output_type -> cosmos.group.v1.MsgVoteResponse
26, // 37: cosmos.group.v1.Msg.Exec:output_type -> cosmos.group.v1.MsgExecResponse
28, // 38: cosmos.group.v1.Msg.LeaveGroup:output_type -> cosmos.group.v1.MsgLeaveGroupResponse
25, // [25:39] is the sub-list for method output_type
11, // [11:25] is the sub-list for method input_type
11, // [11:11] is the sub-list for extension type_name
11, // [11:11] is the sub-list for extension extendee
0, // [0:11] is the sub-list for field type_name
}
func init() { file_cosmos_group_v1_tx_proto_init() }

View File

@ -42,7 +42,7 @@ type MsgClient interface {
UpdateGroupPolicyMetadata(ctx context.Context, in *MsgUpdateGroupPolicyMetadata, opts ...grpc.CallOption) (*MsgUpdateGroupPolicyMetadataResponse, error)
// SubmitProposal submits a new proposal.
SubmitProposal(ctx context.Context, in *MsgSubmitProposal, opts ...grpc.CallOption) (*MsgSubmitProposalResponse, error)
// WithdrawProposal aborts a proposal.
// WithdrawProposal withdraws a proposal.
WithdrawProposal(ctx context.Context, in *MsgWithdrawProposal, opts ...grpc.CallOption) (*MsgWithdrawProposalResponse, error)
// Vote allows a voter to vote on a proposal.
Vote(ctx context.Context, in *MsgVote, opts ...grpc.CallOption) (*MsgVoteResponse, error)
@ -210,7 +210,7 @@ type MsgServer interface {
UpdateGroupPolicyMetadata(context.Context, *MsgUpdateGroupPolicyMetadata) (*MsgUpdateGroupPolicyMetadataResponse, error)
// SubmitProposal submits a new proposal.
SubmitProposal(context.Context, *MsgSubmitProposal) (*MsgSubmitProposalResponse, error)
// WithdrawProposal aborts a proposal.
// WithdrawProposal withdraws a proposal.
WithdrawProposal(context.Context, *MsgWithdrawProposal) (*MsgWithdrawProposalResponse, error)
// Vote allows a voter to vote on a proposal.
Vote(context.Context, *MsgVote) (*MsgVoteResponse, error)

View File

@ -7881,7 +7881,7 @@ type Proposal struct {
// at this point, and the `final_tally_result`and `status` fields will be
// accordingly updated.
VotingPeriodEnd *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=voting_period_end,json=votingPeriodEnd,proto3" json:"voting_period_end,omitempty"`
// executor_result is the final result based on the votes and election rule. Initial value is NotRun.
// executor_result is the final result of the proposal execution. Initial value is NotRun.
ExecutorResult ProposalExecutorResult `protobuf:"varint,11,opt,name=executor_result,json=executorResult,proto3,enum=cosmos.group.v1.ProposalExecutorResult" json:"executor_result,omitempty"`
// messages is a list of `sdk.Msg`s that will be executed if the proposal passes.
Messages []*anypb.Any `protobuf:"bytes,12,rep,name=messages,proto3" json:"messages,omitempty"`
@ -8208,7 +8208,7 @@ var file_cosmos_group_v1_types_proto_rawDesc = []byte{
0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65,
0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73,
0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72,
0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xe8, 0x02, 0x0a, 0x0f, 0x47, 0x72, 0x6f,
0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xf8, 0x02, 0x0a, 0x0f, 0x47, 0x72, 0x6f,
0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x32, 0x0a, 0x07,
0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2,
0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
@ -8221,10 +8221,11 @@ var file_cosmos_group_v1_types_proto_rawDesc = []byte{
0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d,
0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
0x6e, 0x12, 0x51, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f,
0x6e, 0x12, 0x61, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f,
0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 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,
0x42, 0x12, 0xca, 0xb4, 0x2d, 0x0e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f,
0x42, 0x22, 0xca, 0xb4, 0x2d, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x72, 0x6f,
0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f,
0x6c, 0x69, 0x63, 0x79, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f,
0x6c, 0x69, 0x63, 0x79, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,

View File

@ -65,6 +65,9 @@ message EventExec {
// result is the proposal execution result.
ProposalExecutorResult result = 2;
// logs contains error logs in case the execution result is FAILURE.
string logs = 3;
}
// EventLeaveGroup is an event emitted when group member leaves the group.

View File

@ -46,7 +46,7 @@ service Msg {
// SubmitProposal submits a new proposal.
rpc SubmitProposal(MsgSubmitProposal) returns (MsgSubmitProposalResponse);
// WithdrawProposal aborts a proposal.
// WithdrawProposal withdraws a proposal.
rpc WithdrawProposal(MsgWithdrawProposal) returns (MsgWithdrawProposalResponse);
// Vote allows a voter to vote on a proposal.
@ -156,7 +156,7 @@ message MsgCreateGroupPolicy {
string metadata = 3;
// decision_policy specifies the group policy's decision policy.
google.protobuf.Any decision_policy = 4 [(cosmos_proto.accepts_interface) = "DecisionPolicy"];
google.protobuf.Any decision_policy = 4 [(cosmos_proto.accepts_interface) = "cosmos.group.v1.DecisionPolicy"];
}
// MsgCreateGroupPolicyResponse is the Msg/CreateGroupPolicy response type.
@ -202,7 +202,7 @@ message MsgCreateGroupWithPolicy {
bool group_policy_as_admin = 5;
// decision_policy specifies the group policy's decision policy.
google.protobuf.Any decision_policy = 6 [(cosmos_proto.accepts_interface) = "DecisionPolicy"];
google.protobuf.Any decision_policy = 6 [(cosmos_proto.accepts_interface) = "cosmos.group.v1.DecisionPolicy"];
}
// MsgCreateGroupWithPolicyResponse is the Msg/CreateGroupWithPolicy response type.
@ -231,7 +231,7 @@ message MsgUpdateGroupPolicyDecisionPolicy {
string group_policy_address = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];
// decision_policy is the updated group policy's decision policy.
google.protobuf.Any decision_policy = 3 [(cosmos_proto.accepts_interface) = "DecisionPolicy"];
google.protobuf.Any decision_policy = 3 [(cosmos_proto.accepts_interface) = "cosmos.group.v1.DecisionPolicy"];
}
// MsgUpdateGroupPolicyDecisionPolicyResponse is the Msg/UpdateGroupPolicyDecisionPolicy response type.
@ -353,7 +353,10 @@ message MsgExec {
}
// MsgExecResponse is the Msg/Exec request type.
message MsgExecResponse {}
message MsgExecResponse {
// result is the final result of the proposal execution.
ProposalExecutorResult result = 2;
}
// MsgLeaveGroup is the Msg/LeaveGroup request type.
message MsgLeaveGroup {

View File

@ -167,7 +167,7 @@ message GroupPolicyInfo {
uint64 version = 5;
// decision_policy specifies the group policy's decision policy.
google.protobuf.Any decision_policy = 6 [(cosmos_proto.accepts_interface) = "DecisionPolicy"];
google.protobuf.Any decision_policy = 6 [(cosmos_proto.accepts_interface) = "cosmos.group.v1.DecisionPolicy"];
// created_at is a timestamp specifying when a group policy was created.
google.protobuf.Timestamp created_at = 7 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
@ -221,7 +221,7 @@ message Proposal {
// accordingly updated.
google.protobuf.Timestamp voting_period_end = 10 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
// executor_result is the final result based on the votes and election rule. Initial value is NotRun.
// executor_result is the final result of the proposal execution. Initial value is NotRun.
ProposalExecutorResult executor_result = 11;
// messages is a list of `sdk.Msg`s that will be executed if the proposal passes.

View File

@ -494,7 +494,7 @@ func MsgUpdateGroupPolicyDecisionPolicyCmd() *cobra.Command {
return err
}
msg, err := group.NewMsgUpdateGroupPolicyDecisionPolicyRequest(
msg, err := group.NewMsgUpdateGroupPolicyDecisionPolicy(
clientCtx.GetFromAddress(),
accountAddress,
policy,
@ -603,7 +603,7 @@ Example:
execStr, _ := cmd.Flags().GetString(FlagExec)
msg, err := group.NewMsgSubmitProposalRequest(
msg, err := group.NewMsgSubmitProposal(
prop.GroupPolicyAddress,
prop.Proposers,
msgs,

View File

@ -327,7 +327,11 @@ func (s *IntegrationTestSuite) TestQueryGroupPolicyInfo() {
s.Require().Equal(s.groupPolicies[0].Admin, g.Admin)
s.Require().Equal(s.groupPolicies[0].Metadata, g.Metadata)
s.Require().Equal(s.groupPolicies[0].Version, g.Version)
s.Require().Equal(s.groupPolicies[0].GetDecisionPolicy(), g.GetDecisionPolicy())
dp1, err := s.groupPolicies[0].GetDecisionPolicy()
s.Require().NoError(err)
dp2, err := g.GetDecisionPolicy()
s.Require().NoError(err)
s.Require().Equal(dp1, dp2)
}
})
}
@ -398,7 +402,11 @@ func (s *IntegrationTestSuite) TestQueryGroupPoliciesByGroup() {
s.Require().Equal(res.GroupPolicies[i].Metadata, tc.expectGroupPolicies[i].Metadata)
s.Require().Equal(res.GroupPolicies[i].Version, tc.expectGroupPolicies[i].Version)
s.Require().Equal(res.GroupPolicies[i].Admin, tc.expectGroupPolicies[i].Admin)
s.Require().Equal(res.GroupPolicies[i].GetDecisionPolicy(), tc.expectGroupPolicies[i].GetDecisionPolicy())
dp1, err := s.groupPolicies[i].GetDecisionPolicy()
s.Require().NoError(err)
dp2, err := tc.expectGroupPolicies[i].GetDecisionPolicy()
s.Require().NoError(err)
s.Require().Equal(dp1, dp2)
}
}
})
@ -470,7 +478,11 @@ func (s *IntegrationTestSuite) TestQueryGroupPoliciesByAdmin() {
s.Require().Equal(res.GroupPolicies[i].Metadata, tc.expectGroupPolicies[i].Metadata)
s.Require().Equal(res.GroupPolicies[i].Version, tc.expectGroupPolicies[i].Version)
s.Require().Equal(res.GroupPolicies[i].Admin, tc.expectGroupPolicies[i].Admin)
s.Require().Equal(res.GroupPolicies[i].GetDecisionPolicy(), tc.expectGroupPolicies[i].GetDecisionPolicy())
dp1, err := s.groupPolicies[i].GetDecisionPolicy()
s.Require().NoError(err)
dp2, err := tc.expectGroupPolicies[i].GetDecisionPolicy()
s.Require().NoError(err)
s.Require().Equal(dp1, dp2)
}
}
})

View File

@ -1582,7 +1582,7 @@ func (s *IntegrationTestSuite) TestTxSubmitProposal() {
commonFlags...,
),
true,
"msg does not have group policy authorization: unauthorized",
"msg does not have group policy authorization",
nil,
0,
},

View File

@ -351,6 +351,8 @@ type EventExec struct {
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id,omitempty"`
// result is the proposal execution result.
Result ProposalExecutorResult `protobuf:"varint,2,opt,name=result,proto3,enum=cosmos.group.v1.ProposalExecutorResult" json:"result,omitempty"`
// logs contains error logs in case the execution result is FAILURE.
Logs string `protobuf:"bytes,3,opt,name=logs,proto3" json:"logs,omitempty"`
}
func (m *EventExec) Reset() { *m = EventExec{} }
@ -400,6 +402,13 @@ func (m *EventExec) GetResult() ProposalExecutorResult {
return PROPOSAL_EXECUTOR_RESULT_UNSPECIFIED
}
func (m *EventExec) GetLogs() string {
if m != nil {
return m.Logs
}
return ""
}
// EventLeaveGroup is an event emitted when group member leaves the group.
type EventLeaveGroup struct {
// group_id is the unique ID of the group.
@ -470,7 +479,7 @@ func init() {
func init() { proto.RegisterFile("cosmos/group/v1/events.proto", fileDescriptor_e8d753981546f032) }
var fileDescriptor_e8d753981546f032 = []byte{
// 366 bytes of a gzipped FileDescriptorProto
// 382 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x49, 0xce, 0x2f, 0xce,
0xcd, 0x2f, 0xd6, 0x4f, 0x2f, 0xca, 0x2f, 0x2d, 0xd0, 0x2f, 0x33, 0xd4, 0x4f, 0x2d, 0x4b, 0xcd,
0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x87, 0xc8, 0xea, 0x81, 0x65, 0xf5,
@ -485,15 +494,16 @@ var fileDescriptor_e8d753981546f032 = []byte{
0x94, 0x9b, 0x59, 0x12, 0x50, 0x94, 0x5f, 0x90, 0x5f, 0x9c, 0x98, 0x23, 0x24, 0xcf, 0xc5, 0x5d,
0x00, 0x65, 0x23, 0x3c, 0xc4, 0x05, 0x13, 0xf2, 0x4c, 0x51, 0xb2, 0xe0, 0x12, 0x05, 0xeb, 0x0b,
0xcf, 0x2c, 0xc9, 0x48, 0x29, 0x4a, 0x2c, 0x27, 0x5e, 0xa7, 0x0e, 0x17, 0x27, 0x58, 0x67, 0x58,
0x7e, 0x49, 0x2a, 0x61, 0xd5, 0xb9, 0x50, 0xd5, 0xae, 0x15, 0xa9, 0xc9, 0x04, 0x55, 0x0b, 0xd9,
0x73, 0xb1, 0x15, 0xa5, 0x16, 0x97, 0xe6, 0x94, 0x48, 0x30, 0x29, 0x30, 0x6a, 0xf0, 0x19, 0xa9,
0xeb, 0xa1, 0xa5, 0x10, 0x3d, 0x98, 0x3b, 0x41, 0xe6, 0x95, 0x96, 0xe4, 0x17, 0x05, 0x81, 0x95,
0x07, 0x41, 0xb5, 0x29, 0x25, 0x70, 0xf1, 0x83, 0xad, 0xf3, 0x49, 0x4d, 0x2c, 0x23, 0x18, 0xb1,
0xc8, 0x01, 0xce, 0x44, 0x64, 0x80, 0x3b, 0xd9, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c,
0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1,
0x1c, 0x43, 0x94, 0x4a, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0x2e, 0x34, 0xe9,
0x42, 0x29, 0xdd, 0xe2, 0x94, 0x6c, 0xfd, 0x0a, 0x48, 0xca, 0x4d, 0x62, 0x03, 0xa7, 0x58, 0x63,
0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe6, 0x94, 0x89, 0xaf, 0x1a, 0x03, 0x00, 0x00,
0x7e, 0x49, 0x2a, 0x61, 0xd5, 0x8d, 0x8c, 0x50, 0xe5, 0xae, 0x15, 0xa9, 0xc9, 0x04, 0x95, 0x0b,
0xd9, 0x73, 0xb1, 0x15, 0xa5, 0x16, 0x97, 0xe6, 0x94, 0x48, 0x30, 0x29, 0x30, 0x6a, 0xf0, 0x19,
0xa9, 0xeb, 0xa1, 0x25, 0x11, 0x3d, 0x98, 0x43, 0x41, 0xe6, 0x95, 0x96, 0xe4, 0x17, 0x05, 0x81,
0x95, 0x07, 0x41, 0xb5, 0x09, 0x09, 0x71, 0xb1, 0xe4, 0xe4, 0xa7, 0x17, 0x4b, 0x30, 0x83, 0x02,
0x30, 0x08, 0xcc, 0x56, 0x4a, 0xe0, 0xe2, 0x07, 0x3b, 0xc1, 0x27, 0x35, 0xb1, 0x8c, 0x60, 0x6c,
0x23, 0xc7, 0x02, 0x13, 0x91, 0xb1, 0xe0, 0x64, 0x77, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72,
0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7,
0x72, 0x0c, 0x51, 0x2a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xd0, 0xf4,
0x0c, 0xa5, 0x74, 0x8b, 0x53, 0xb2, 0xf5, 0x2b, 0x20, 0xc9, 0x39, 0x89, 0x0d, 0x9c, 0x8c, 0x8d,
0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5b, 0xc0, 0x98, 0xf8, 0x2f, 0x03, 0x00, 0x00,
}
func (m *EventCreateGroup) Marshal() (dAtA []byte, err error) {
@ -716,6 +726,13 @@ func (m *EventExec) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Logs) > 0 {
i -= len(m.Logs)
copy(dAtA[i:], m.Logs)
i = encodeVarintEvents(dAtA, i, uint64(len(m.Logs)))
i--
dAtA[i] = 0x1a
}
if m.Result != 0 {
i = encodeVarintEvents(dAtA, i, uint64(m.Result))
i--
@ -873,6 +890,10 @@ func (m *EventExec) Size() (n int) {
if m.Result != 0 {
n += 1 + sovEvents(uint64(m.Result))
}
l = len(m.Logs)
if l > 0 {
n += 1 + l + sovEvents(uint64(l))
}
return n
}
@ -1474,6 +1495,38 @@ func (m *EventExec) Unmarshal(dAtA []byte) error {
break
}
}
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Logs", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowEvents
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthEvents
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthEvents
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Logs = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipEvents(dAtA[iNdEx:])

View File

@ -75,6 +75,9 @@ func TestDec(t *testing.T) {
require.NoError(t, err)
require.True(t, res.IsEqual(minusFivePointZero))
_, err = four.Quo(zero)
require.Error(t, err)
res, err = four.Quo(two)
require.NoError(t, err)
require.True(t, res.IsEqual(two))

View File

@ -202,7 +202,11 @@ func (s *GenesisTestSuite) assertGroupPoliciesEqual(g *group.GroupPolicyInfo, ot
require.Equal(g.Admin, other.Admin)
require.Equal(g.Metadata, other.Metadata)
require.Equal(g.Version, other.Version)
require.Equal(g.GetDecisionPolicy(), other.GetDecisionPolicy())
dp1, err := g.GetDecisionPolicy()
require.NoError(err)
dp2, err := other.GetDecisionPolicy()
require.NoError(err)
require.Equal(dp1, dp2)
}
func (s *GenesisTestSuite) assertProposalsEqual(g *group.Proposal, other *group.Proposal) {
@ -218,5 +222,9 @@ func (s *GenesisTestSuite) assertProposalsEqual(g *group.Proposal, other *group.
require.Equal(g.FinalTallyResult, other.FinalTallyResult)
require.Equal(g.VotingPeriodEnd, other.VotingPeriodEnd)
require.Equal(g.ExecutorResult, other.ExecutorResult)
require.Equal(g.GetMsgs(), other.GetMsgs())
msgs1, err := g.GetMsgs()
require.NoError(err)
msgs2, err := other.GetMsgs()
require.NoError(err)
require.Equal(msgs1, msgs2)
}

View File

@ -73,7 +73,7 @@ func GroupTotalWeightInvariantHelper(ctx sdk.Context, key storetypes.StoreKey, g
return msg, broken
}
curMemWeight, err := groupmath.NewNonNegativeDecFromString(groupMember.GetMember().GetWeight())
curMemWeight, err := groupmath.NewPositiveDecFromString(groupMember.GetMember().GetWeight())
if err != nil {
msg += fmt.Sprintf("error while parsing non-nengative decimal for group member %s\n%v\n", groupMember.Member.Address, err)
return msg, broken
@ -85,7 +85,7 @@ func GroupTotalWeightInvariantHelper(ctx sdk.Context, key storetypes.StoreKey, g
}
}
groupWeight, err := groupmath.NewNonNegativeDecFromString(groupInfo.GetTotalWeight())
groupWeight, err := groupmath.NewPositiveDecFromString(groupInfo.GetTotalWeight())
if err != nil {
msg += fmt.Sprintf("error while parsing non-nengative decimal for group with ID %d\n%v\n", groupInfo.Id, err)
return msg, broken

View File

@ -235,7 +235,7 @@ func (k Keeper) iterateProposalsByVPEnd(ctx sdk.Context, endTime time.Time, cb f
defer it.Close()
for {
// Important: this following line cannot outside the for loop.
// Important: this following line cannot be outside of the for loop.
// It seems that when one unmarshals into the same `group.Proposal`
// reference, then gogoproto somehow "adds" the new bytes to the old
// object for some fields. When running simulations, for proposals with
@ -278,8 +278,9 @@ func (k Keeper) pruneProposal(ctx sdk.Context, proposalID uint64) error {
return nil
}
// updateProposalStatus iterates through all proposals by group policy index and updates proposal status
func (k Keeper) updateProposalStatus(ctx sdk.Context, groupPolicyAddr sdk.AccAddress) error {
// abortProposals iterates through all proposals by group policy index
// and marks submitted proposals as aborted.
func (k Keeper) abortProposals(ctx sdk.Context, groupPolicyAddr sdk.AccAddress) error {
proposalIt, err := k.proposalByGroupPolicyIndex.Get(ctx.KVStore(k.key), groupPolicyAddr.Bytes())
if err != nil {
return err
@ -295,10 +296,14 @@ func (k Keeper) updateProposalStatus(ctx sdk.Context, groupPolicyAddr sdk.AccAdd
if err != nil {
return err
}
proposalInfo.Status = group.PROPOSAL_STATUS_ABORTED
if err := k.proposalTable.Update(ctx.KVStore(k.key), proposalInfo.Id, &proposalInfo); err != nil {
return err
// Mark all proposals still in the voting phase as aborted.
if proposalInfo.Status == group.PROPOSAL_STATUS_SUBMITTED {
proposalInfo.Status = group.PROPOSAL_STATUS_ABORTED
if err := k.proposalTable.Update(ctx.KVStore(k.key), proposalInfo.Id, &proposalInfo); err != nil {
return err
}
}
}
return nil
@ -374,7 +379,6 @@ func (k Keeper) TallyProposalsAtVPEnd(ctx sdk.Context) error {
if err := k.pruneVotes(ctx, proposalId); err != nil {
return true, err
}
} else {
err = k.doTallyAndUpdate(ctx, &proposal, electorate, policyInfo)
if err != nil {

View File

@ -850,7 +850,9 @@ func (s *TestSuite) TestCreateGroupWithPolicy() {
s.Assert().Equal(groupPolicyAddr, groupPolicy.Address)
s.Assert().Equal(id, groupPolicy.GroupId)
s.Assert().Equal(spec.req.GroupPolicyMetadata, groupPolicy.Metadata)
s.Assert().Equal(spec.policy.(*group.ThresholdDecisionPolicy), groupPolicy.GetDecisionPolicy())
dp, err := groupPolicy.GetDecisionPolicy()
s.Assert().NoError(err)
s.Assert().Equal(spec.policy.(*group.ThresholdDecisionPolicy), dp)
if spec.req.GroupPolicyAsAdmin {
s.Assert().NotEqual(spec.req.Admin, groupPolicy.Admin)
s.Assert().Equal(groupPolicyAddr, groupPolicy.Admin)
@ -1007,9 +1009,13 @@ func (s *TestSuite) TestCreateGroupPolicy() {
s.Assert().Equal(uint64(1), groupPolicy.Version)
percentageDecisionPolicy, ok := spec.policy.(*group.PercentageDecisionPolicy)
if ok {
s.Assert().Equal(percentageDecisionPolicy, groupPolicy.GetDecisionPolicy())
dp, err := groupPolicy.GetDecisionPolicy()
s.Assert().NoError(err)
s.Assert().Equal(percentageDecisionPolicy, dp)
} else {
s.Assert().Equal(spec.policy.(*group.ThresholdDecisionPolicy), groupPolicy.GetDecisionPolicy())
dp, err := groupPolicy.GetDecisionPolicy()
s.Assert().NoError(err)
s.Assert().Equal(spec.policy.(*group.ThresholdDecisionPolicy), dp)
}
})
}
@ -1370,7 +1376,11 @@ func (s *TestSuite) TestGroupPoliciesByAdminOrGroup() {
s.Assert().Equal(policyAccs[i].Metadata, expectAccs[i].Metadata)
s.Assert().Equal(policyAccs[i].Version, expectAccs[i].Version)
s.Assert().Equal(policyAccs[i].CreatedAt, expectAccs[i].CreatedAt)
s.Assert().Equal(policyAccs[i].GetDecisionPolicy(), expectAccs[i].GetDecisionPolicy())
dp1, err := policyAccs[i].GetDecisionPolicy()
s.Assert().NoError(err)
dp2, err := expectAccs[i].GetDecisionPolicy()
s.Assert().NoError(err)
s.Assert().Equal(dp1, dp2)
}
// query group policy by admin
@ -1389,7 +1399,11 @@ func (s *TestSuite) TestGroupPoliciesByAdminOrGroup() {
s.Assert().Equal(policyAccs[i].Metadata, expectAccs[i].Metadata)
s.Assert().Equal(policyAccs[i].Version, expectAccs[i].Version)
s.Assert().Equal(policyAccs[i].CreatedAt, expectAccs[i].CreatedAt)
s.Assert().Equal(policyAccs[i].GetDecisionPolicy(), expectAccs[i].GetDecisionPolicy())
dp1, err := policyAccs[i].GetDecisionPolicy()
s.Assert().NoError(err)
dp2, err := expectAccs[i].GetDecisionPolicy()
s.Assert().NoError(err)
s.Assert().Equal(dp1, dp2)
}
}
@ -1611,10 +1625,12 @@ func (s *TestSuite) TestSubmitProposal() {
s.Assert().Equal(spec.expProposal.ExecutorResult, proposal.ExecutorResult)
s.Assert().Equal(s.blockTime.Add(time.Second), proposal.VotingPeriodEnd)
msgs, err := proposal.GetMsgs()
s.Assert().NoError(err)
if spec.msgs == nil { // then empty list is ok
s.Assert().Len(proposal.GetMsgs(), 0)
s.Assert().Len(msgs, 0)
} else {
s.Assert().Equal(spec.msgs, proposal.GetMsgs())
s.Assert().Equal(spec.msgs, msgs)
}
}
@ -1627,7 +1643,6 @@ func (s *TestSuite) TestWithdrawProposal() {
addrs := s.addrs
addr2 := addrs[1]
addr5 := addrs[4]
groupPolicy := s.groupPolicyAddr
msgSend := &banktypes.MsgSend{
FromAddress: s.groupPolicyAddr.String(),
@ -1684,7 +1699,7 @@ func (s *TestSuite) TestWithdrawProposal() {
return submitProposal(s.ctx, s, []sdk.Msg{msgSend}, proposers)
},
proposalId: proposalID,
admin: groupPolicy.String(),
admin: proposers[0],
},
}
for msg, spec := range specs {
@ -2431,7 +2446,7 @@ func (s *TestSuite) TestExecPrunedProposalsAndVotes() {
return myProposalID
},
expErr: true, // since proposal status will be `aborted` when group policy is modified
expErrMsg: "not possible with proposal status",
expErrMsg: "not possible to exec with proposal status",
expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_NOT_RUN,
},
"proposal exists when rollback all msg updates on failure": {
@ -2504,7 +2519,6 @@ func (s *TestSuite) TestExecPrunedProposalsAndVotes() {
func (s *TestSuite) TestProposalsByVPEnd() {
addrs := s.addrs
addr2 := addrs[1]
groupPolicy := s.groupPolicyAddr
votingPeriod := s.policy.GetVotingPeriod()
ctx := s.sdkCtx
@ -2527,14 +2541,14 @@ func (s *TestSuite) TestProposalsByVPEnd() {
tallyRes group.TallyResult
expStatus group.ProposalStatus
}{
"tally updated after voting power end": {
"tally updated after voting period end": {
preRun: func(sdkCtx sdk.Context) uint64 {
return submitProposal(sdkCtx, s, []sdk.Msg{msgSend}, proposers)
},
admin: proposers[0],
newCtx: ctx.WithBlockTime(now.Add(votingPeriod).Add(time.Hour)),
tallyRes: group.DefaultTallyResult(),
expStatus: group.PROPOSAL_STATUS_SUBMITTED,
expStatus: group.PROPOSAL_STATUS_REJECTED,
},
"tally within voting period": {
preRun: func(sdkCtx sdk.Context) uint64 {
@ -2545,7 +2559,7 @@ func (s *TestSuite) TestProposalsByVPEnd() {
tallyRes: group.DefaultTallyResult(),
expStatus: group.PROPOSAL_STATUS_SUBMITTED,
},
"tally within voting period(with votes)": {
"tally within voting period (with votes)": {
preRun: func(sdkCtx sdk.Context) uint64 {
return submitProposalAndVote(s.ctx, s, []sdk.Msg{msgSend}, proposers, group.VOTE_OPTION_YES)
},
@ -2554,7 +2568,7 @@ func (s *TestSuite) TestProposalsByVPEnd() {
tallyRes: group.DefaultTallyResult(),
expStatus: group.PROPOSAL_STATUS_SUBMITTED,
},
"tally after voting period(with votes)": {
"tally after voting period (with votes)": {
preRun: func(sdkCtx sdk.Context) uint64 {
return submitProposalAndVote(s.ctx, s, []sdk.Msg{msgSend}, proposers, group.VOTE_OPTION_YES)
},
@ -2568,12 +2582,27 @@ func (s *TestSuite) TestProposalsByVPEnd() {
},
expStatus: group.PROPOSAL_STATUS_ACCEPTED,
},
"tally of closed proposal": {
"tally after voting period (not passing)": {
preRun: func(sdkCtx sdk.Context) uint64 {
// `s.addrs[4]` has weight 1
return submitProposalAndVote(s.ctx, s, []sdk.Msg{msgSend}, []string{s.addrs[4].String()}, group.VOTE_OPTION_YES)
},
admin: proposers[0],
newCtx: ctx.WithBlockTime(now.Add(votingPeriod).Add(time.Hour)),
tallyRes: group.TallyResult{
YesCount: "1",
NoCount: "0",
NoWithVetoCount: "0",
AbstainCount: "0",
},
expStatus: group.PROPOSAL_STATUS_REJECTED,
},
"tally of withdrawn proposal": {
preRun: func(sdkCtx sdk.Context) uint64 {
pId := submitProposal(s.ctx, s, []sdk.Msg{msgSend}, proposers)
_, err := s.keeper.WithdrawProposal(s.ctx, &group.MsgWithdrawProposal{
ProposalId: pId,
Address: groupPolicy.String(),
Address: proposers[0],
})
s.Require().NoError(err)
@ -2584,12 +2613,12 @@ func (s *TestSuite) TestProposalsByVPEnd() {
tallyRes: group.DefaultTallyResult(),
expStatus: group.PROPOSAL_STATUS_WITHDRAWN,
},
"tally of closed proposal (with votes)": {
"tally of withdrawn proposal (with votes)": {
preRun: func(sdkCtx sdk.Context) uint64 {
pId := submitProposalAndVote(s.ctx, s, []sdk.Msg{msgSend}, proposers, group.VOTE_OPTION_YES)
_, err := s.keeper.WithdrawProposal(s.ctx, &group.MsgWithdrawProposal{
ProposalId: pId,
Address: groupPolicy.String(),
Address: proposers[0],
})
s.Require().NoError(err)

View File

@ -4,9 +4,6 @@ import (
"context"
"encoding/binary"
"fmt"
"reflect"
gogotypes "github.com/gogo/protobuf/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/address"
@ -100,7 +97,7 @@ func (k Keeper) CreateGroup(goCtx context.Context, req *group.MsgCreateGroup) (*
func (k Keeper) UpdateGroupMembers(goCtx context.Context, req *group.MsgUpdateGroupMembers) (*group.MsgUpdateGroupMembersResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
action := func(g *group.GroupInfo) error {
totalWeight, err := math.NewNonNegativeDecFromString(g.TotalWeight)
totalWeight, err := math.NewPositiveDecFromString(g.TotalWeight)
if err != nil {
return err
}
@ -140,7 +137,7 @@ func (k Keeper) UpdateGroupMembers(goCtx context.Context, req *group.MsgUpdateGr
return sdkerrors.Wrap(sdkerrors.ErrNotFound, "unknown member")
}
previousMemberWeight, err := math.NewNonNegativeDecFromString(prevGroupMember.Member.Weight)
previousMemberWeight, err := math.NewPositiveDecFromString(prevGroupMember.Member.Weight)
if err != nil {
return err
}
@ -159,11 +156,11 @@ func (k Keeper) UpdateGroupMembers(goCtx context.Context, req *group.MsgUpdateGr
}
// If group member already exists, handle update
if found {
previousMemberWeight, err := math.NewNonNegativeDecFromString(prevGroupMember.Member.Weight)
previousMemberWeight, err := math.NewPositiveDecFromString(prevGroupMember.Member.Weight)
if err != nil {
return err
}
// Subtract previous weight from the group total weight.
// Substract previous weight from the group total weight.
totalWeight, err = math.SubNonNegative(totalWeight, previousMemberWeight)
if err != nil {
return err
@ -298,7 +295,10 @@ func (k Keeper) CreateGroupPolicy(goCtx context.Context, req *group.MsgCreateGro
if err != nil {
return nil, sdkerrors.Wrap(err, "request admin")
}
policy := req.GetDecisionPolicy()
policy, err := req.GetDecisionPolicy()
if err != nil {
return nil, sdkerrors.Wrap(err, "request decision policy")
}
groupID := req.GetGroupID()
metadata := req.GetMetadata()
@ -326,7 +326,8 @@ func (k Keeper) CreateGroupPolicy(goCtx context.Context, req *group.MsgCreateGro
// Generate account address of group policy.
var accountAddr sdk.AccAddress
// loop here in the rare case of a collision
// loop here in the rare case where a ADR-028-derived address creates a
// collision with an existing address.
for {
nextAccVal := k.groupPolicySeq.NextVal(ctx.KVStore(k.key))
var buf = make([]byte, 8)
@ -336,7 +337,8 @@ func (k Keeper) CreateGroupPolicy(goCtx context.Context, req *group.MsgCreateGro
accountAddr = address.Derive(parentAcc, buf)
if k.accKeeper.GetAccount(ctx, accountAddr) != nil {
// handle a rare collision
// handle a rare collision, in which case we just go on to the
// next sequence value and derive a new address.
continue
}
acc := k.accKeeper.NewAccount(ctx, &authtypes.ModuleAccount{
@ -393,7 +395,10 @@ func (k Keeper) UpdateGroupPolicyAdmin(goCtx context.Context, req *group.MsgUpda
func (k Keeper) UpdateGroupPolicyDecisionPolicy(goCtx context.Context, req *group.MsgUpdateGroupPolicyDecisionPolicy) (*group.MsgUpdateGroupPolicyDecisionPolicyResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
policy := req.GetDecisionPolicy()
policy, err := req.GetDecisionPolicy()
if err != nil {
return nil, err
}
action := func(groupPolicy *group.GroupPolicyInfo) error {
g, err := k.getGroupInfo(ctx, groupPolicy.GroupId)
@ -415,7 +420,7 @@ func (k Keeper) UpdateGroupPolicyDecisionPolicy(goCtx context.Context, req *grou
return k.groupPolicyTable.Update(ctx.KVStore(k.key), groupPolicy)
}
err := k.doUpdateGroupPolicy(ctx, req.GroupPolicyAddress, req.Admin, action, "group policy's decision policy updated")
err = k.doUpdateGroupPolicy(ctx, req.GroupPolicyAddress, req.Admin, action, "group policy's decision policy updated")
if err != nil {
return nil, err
}
@ -447,13 +452,16 @@ func (k Keeper) UpdateGroupPolicyMetadata(goCtx context.Context, req *group.MsgU
func (k Keeper) SubmitProposal(goCtx context.Context, req *group.MsgSubmitProposal) (*group.MsgSubmitProposalResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
accountAddress, err := sdk.AccAddressFromBech32(req.GroupPolicyAddress)
groupPolicyAddr, err := sdk.AccAddressFromBech32(req.GroupPolicyAddress)
if err != nil {
return nil, sdkerrors.Wrap(err, "request account address of group policy")
}
metadata := req.Metadata
proposers := req.Proposers
msgs := req.GetMsgs()
msgs, err := req.GetMsgs()
if err != nil {
return nil, sdkerrors.Wrap(err, "request msgs")
}
if err := k.assertMetadataLength(metadata, "metadata"); err != nil {
return nil, err
@ -477,13 +485,13 @@ func (k Keeper) SubmitProposal(goCtx context.Context, req *group.MsgSubmitPropos
}
// Check that if the messages require signers, they are all equal to the given account address of group policy.
if err := ensureMsgAuthZ(msgs, accountAddress); err != nil {
if err := ensureMsgAuthZ(msgs, groupPolicyAddr); err != nil {
return nil, err
}
policy := policyAcc.GetDecisionPolicy()
if policy == nil {
return nil, sdkerrors.Wrap(errors.ErrEmpty, "nil policy")
policy, err := policyAcc.GetDecisionPolicy()
if err != nil {
return nil, sdkerrors.Wrap(err, "proposal group policy decision policy")
}
// Prevent proposal that can not succeed.
@ -531,7 +539,7 @@ func (k Keeper) SubmitProposal(goCtx context.Context, req *group.MsgSubmitPropos
Option: group.VOTE_OPTION_YES,
})
if err != nil {
return &group.MsgSubmitProposalResponse{ProposalId: id}, sdkerrors.Wrap(err, "The proposal was created but failed on vote")
return &group.MsgSubmitProposalResponse{ProposalId: id}, sdkerrors.Wrapf(err, "the proposal was created but failed on vote for voter %s", proposers[i])
}
}
@ -543,7 +551,7 @@ func (k Keeper) SubmitProposal(goCtx context.Context, req *group.MsgSubmitPropos
Executor: proposers[0],
})
if err != nil {
return &group.MsgSubmitProposalResponse{ProposalId: id}, sdkerrors.Wrap(err, "The proposal was created but failed on exec")
return &group.MsgSubmitProposalResponse{ProposalId: id}, sdkerrors.Wrap(err, "the proposal was created but failed on exec")
}
}
@ -570,44 +578,22 @@ func (k Keeper) WithdrawProposal(goCtx context.Context, req *group.MsgWithdrawPr
return nil, sdkerrors.Wrap(err, "load group policy")
}
storeUpdates := func() (*group.MsgWithdrawProposalResponse, error) {
if err := k.proposalTable.Update(ctx.KVStore(k.key), id, &proposal); err != nil {
return nil, err
}
return &group.MsgWithdrawProposalResponse{}, nil
}
// check address is the group policy admin.
if address == policyInfo.Address {
err = ctx.EventManager().EmitTypedEvent(&group.EventWithdrawProposal{ProposalId: id})
if err != nil {
return nil, err
}
proposal.Status = group.PROPOSAL_STATUS_WITHDRAWN
return storeUpdates()
}
// if address is not group policy admin then check whether he is in proposers list.
validProposer := false
for _, proposer := range proposal.Proposers {
if proposer == address {
validProposer = true
break
}
}
if !validProposer {
// check address is the group policy admin he is in proposers list..
if address != policyInfo.Admin && !isProposer(proposal, address) {
return nil, sdkerrors.Wrapf(errors.ErrUnauthorized, "given address is neither group policy admin nor in proposers: %s", address)
}
proposal.Status = group.PROPOSAL_STATUS_WITHDRAWN
if err := k.proposalTable.Update(ctx.KVStore(k.key), id, &proposal); err != nil {
return nil, err
}
err = ctx.EventManager().EmitTypedEvent(&group.EventWithdrawProposal{ProposalId: id})
if err != nil {
return nil, err
}
proposal.Status = group.PROPOSAL_STATUS_WITHDRAWN
return storeUpdates()
return &group.MsgWithdrawProposalResponse{}, nil
}
func (k Keeper) Vote(goCtx context.Context, req *group.MsgVote) (*group.MsgVoteResponse, error) {
@ -632,9 +618,8 @@ func (k Keeper) Vote(goCtx context.Context, req *group.MsgVote) (*group.MsgVoteR
return nil, sdkerrors.Wrap(errors.ErrExpired, "voting period has ended already")
}
var policyInfo group.GroupPolicyInfo
if policyInfo, err = k.getGroupPolicyInfo(ctx, proposal.GroupPolicyAddress); err != nil {
policyInfo, err := k.getGroupPolicyInfo(ctx, proposal.GroupPolicyAddress)
if err != nil {
return nil, sdkerrors.Wrap(err, "load group policy")
}
@ -647,7 +632,7 @@ func (k Keeper) Vote(goCtx context.Context, req *group.MsgVote) (*group.MsgVoteR
voterAddr := req.Voter
voter := group.GroupMember{GroupId: electorate.Id, Member: &group.Member{Address: voterAddr}}
if err := k.groupMemberTable.GetOne(ctx.KVStore(k.key), orm.PrimaryKey(&voter), &voter); err != nil {
return nil, sdkerrors.Wrapf(err, "address: %s", voterAddr)
return nil, sdkerrors.Wrapf(err, "voter address: %s", voterAddr)
}
newVote := group.Vote{
ProposalId: id,
@ -682,15 +667,11 @@ func (k Keeper) Vote(goCtx context.Context, req *group.MsgVote) (*group.MsgVoteR
return &group.MsgVoteResponse{}, nil
}
// doTallyAndUpdate performs a tally, and updates the proposal's
// `FinalTallyResult` field only if the tally is final.
// doTallyAndUpdate performs a tally, and, if the tally result is final, then:
// - updates the proposal's `Status` and `FinalTallyResult` fields,
// - prune all the votes.
func (k Keeper) doTallyAndUpdate(ctx sdk.Context, p *group.Proposal, electorate group.GroupInfo, policyInfo group.GroupPolicyInfo) error {
policy := policyInfo.GetDecisionPolicy()
pSubmittedAt, err := gogotypes.TimestampProto(p.SubmitTime)
if err != nil {
return err
}
submittedAt, err := gogotypes.TimestampFromProto(pSubmittedAt)
policy, err := policyInfo.GetDecisionPolicy()
if err != nil {
return err
}
@ -700,11 +681,17 @@ func (k Keeper) doTallyAndUpdate(ctx sdk.Context, p *group.Proposal, electorate
return err
}
result, err := policy.Allow(tallyResult, electorate.TotalWeight, ctx.BlockTime().Sub(submittedAt))
sinceSubmission := ctx.BlockTime().Sub(p.SubmitTime) // duration passed since proposal submission.
result, err := policy.Allow(tallyResult, electorate.TotalWeight, sinceSubmission)
// If the result was final (i.e. enough votes to pass) or if the voting
// period ended, then we consider the proposal as final.
isFinal := result.Final || ctx.BlockTime().After(p.VotingPeriodEnd)
switch {
case err != nil:
return sdkerrors.Wrap(err, "policy allow")
case result.Final:
case isFinal:
if err := k.pruneVotes(ctx, p.Id); err != nil {
return err
}
@ -730,31 +717,17 @@ func (k Keeper) Exec(goCtx context.Context, req *group.MsgExec) (*group.MsgExecR
}
if proposal.Status != group.PROPOSAL_STATUS_SUBMITTED && proposal.Status != group.PROPOSAL_STATUS_ACCEPTED {
return nil, sdkerrors.Wrapf(errors.ErrInvalid, "not possible with proposal status %s", proposal.Status.String())
return nil, sdkerrors.Wrapf(errors.ErrInvalid, "not possible to exec with proposal status %s", proposal.Status.String())
}
var policyInfo group.GroupPolicyInfo
if policyInfo, err = k.getGroupPolicyInfo(ctx, proposal.GroupPolicyAddress); err != nil {
policyInfo, err := k.getGroupPolicyInfo(ctx, proposal.GroupPolicyAddress)
if err != nil {
return nil, sdkerrors.Wrap(err, "load group policy")
}
storeUpdates := func() (*group.MsgExecResponse, error) {
store := ctx.KVStore(k.key)
// If proposal has successfully run, delete it from state.
if proposal.ExecutorResult == group.PROPOSAL_EXECUTOR_RESULT_SUCCESS {
if err := k.pruneProposal(ctx, proposal.Id); err != nil {
return nil, err
}
} else {
if err := k.proposalTable.Update(store, id, &proposal); err != nil {
return nil, err
}
}
return &group.MsgExecResponse{}, nil
}
// If proposal is still in SUBMITTED phase, it means that the voting period
// didn't end yet, and tallying hasn't been done. In this case, we need to
// tally first.
if proposal.Status == group.PROPOSAL_STATUS_SUBMITTED {
electorate, err := k.getGroupInfo(ctx, policyInfo.GroupId)
if err != nil {
@ -767,8 +740,8 @@ func (k Keeper) Exec(goCtx context.Context, req *group.MsgExec) (*group.MsgExecR
}
// Execute proposal payload.
var logs string
if proposal.Status == group.PROPOSAL_STATUS_ACCEPTED && proposal.ExecutorResult != group.PROPOSAL_EXECUTOR_RESULT_SUCCESS {
logger := ctx.Logger().With("module", fmt.Sprintf("x/%s", group.ModuleName))
// Caching context so that we don't update the store in case of failure.
ctx, flush := ctx.CacheContext()
@ -779,8 +752,8 @@ func (k Keeper) Exec(goCtx context.Context, req *group.MsgExec) (*group.MsgExecR
_, err = k.doExecuteMsgs(ctx, k.router, proposal, addr)
if err != nil {
proposal.ExecutorResult = group.PROPOSAL_EXECUTOR_RESULT_FAILURE
proposalType := reflect.TypeOf(proposal).String()
logger.Info("proposal execution failed", "cause", err, "type", proposalType, "proposalID", id)
logs = fmt.Sprintf("proposal execution failed on proposal %d, because of error %+v", id, err)
k.Logger(ctx).Info("proposal execution failed", "cause", err, "proposalID", id)
} else {
proposal.ExecutorResult = group.PROPOSAL_EXECUTOR_RESULT_SUCCESS
flush()
@ -788,20 +761,30 @@ func (k Keeper) Exec(goCtx context.Context, req *group.MsgExec) (*group.MsgExecR
}
// Update proposal in proposalTable
res, err := storeUpdates()
if err != nil {
return nil, err
// If proposal has successfully run, delete it from state.
if proposal.ExecutorResult == group.PROPOSAL_EXECUTOR_RESULT_SUCCESS {
if err := k.pruneProposal(ctx, proposal.Id); err != nil {
return nil, err
}
} else {
store := ctx.KVStore(k.key)
if err := k.proposalTable.Update(store, id, &proposal); err != nil {
return nil, err
}
}
err = ctx.EventManager().EmitTypedEvent(&group.EventExec{
ProposalId: id,
Logs: logs,
Result: proposal.ExecutorResult,
})
if err != nil {
return nil, err
}
return res, nil
return &group.MsgExecResponse{
Result: proposal.ExecutorResult,
}, nil
}
// LeaveGroup implements the MsgServer/LeaveGroup method.
@ -817,7 +800,7 @@ func (k Keeper) LeaveGroup(goCtx context.Context, req *group.MsgLeaveGroup) (*gr
return nil, sdkerrors.Wrap(err, "group")
}
groupWeight, err := math.NewNonNegativeDecFromString(groupInfo.TotalWeight)
groupWeight, err := math.NewPositiveDecFromString(groupInfo.TotalWeight)
if err != nil {
return nil, err
}
@ -830,7 +813,7 @@ func (k Keeper) LeaveGroup(goCtx context.Context, req *group.MsgLeaveGroup) (*gr
return nil, err
}
memberWeight, err := math.NewNonNegativeDecFromString(gm.Member.Weight)
memberWeight, err := math.NewPositiveDecFromString(gm.Member.Weight)
if err != nil {
return nil, err
}
@ -847,11 +830,13 @@ func (k Keeper) LeaveGroup(goCtx context.Context, req *group.MsgLeaveGroup) (*gr
// update group weight
groupInfo.TotalWeight = updatedWeight.String()
if err := k.groupTable.Update(ctx.KVStore(k.key), groupInfo.Id, &groupInfo); err != nil {
groupInfo.Version++
if err := k.validateDecisionPolicies(ctx, groupInfo); err != nil {
return nil, err
}
if err := k.validateDecisionPolicies(ctx, groupInfo); err != nil {
if err := k.groupTable.Update(ctx.KVStore(k.key), groupInfo.Id, &groupInfo); err != nil {
return nil, err
}
@ -913,14 +898,15 @@ func (k Keeper) doUpdateGroupPolicy(ctx sdk.Context, groupPolicy string, admin s
return sdkerrors.Wrap(err, note)
}
if err = k.abortProposals(ctx, groupPolicyAddr); err != nil {
return err
}
err = ctx.EventManager().EmitTypedEvent(&group.EventUpdateGroupPolicy{Address: admin})
if err != nil {
return err
}
if err = k.updateProposalStatus(ctx, groupPolicyAddr); err != nil {
return err
}
return nil
}
@ -941,8 +927,8 @@ func (k Keeper) doUpdateGroup(ctx sdk.Context, req authNGroupReq, action actionF
}
// doAuthenticated makes sure that the group admin initiated the request,
// and perform the provided action on the
func (k Keeper) doAuthenticated(ctx sdk.Context, req authNGroupReq, action actionFn, note string) error {
// and perform the provided action on the group.
func (k Keeper) doAuthenticated(ctx sdk.Context, req authNGroupReq, action actionFn, errNote string) error {
group, err := k.getGroupInfo(ctx, req.GetGroupID())
if err != nil {
return err
@ -956,10 +942,10 @@ func (k Keeper) doAuthenticated(ctx sdk.Context, req authNGroupReq, action actio
return sdkerrors.Wrap(err, "request admin")
}
if !admin.Equals(reqAdmin) {
return sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "not group admin")
return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "not group admin; got %s, expected %s", req.GetAdmin(), group.Admin)
}
if err := action(&group); err != nil {
return sdkerrors.Wrap(err, note)
return sdkerrors.Wrap(err, errNote)
}
return nil
}
@ -1000,3 +986,14 @@ func (k Keeper) validateDecisionPolicies(ctx sdk.Context, g group.GroupInfo) err
return nil
}
// isProposer checks that an address is a proposer of a given proposal.
func isProposer(proposal group.Proposal, address string) bool {
for _, proposer := range proposal.Proposers {
if proposer == address {
return true
}
}
return false
}

View File

@ -1,6 +1,8 @@
package keeper
import (
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/errors"
authmiddleware "github.com/cosmos/cosmos-sdk/x/auth/middleware"
@ -21,7 +23,10 @@ func (s Keeper) doExecuteMsgs(ctx sdk.Context, router *authmiddleware.MsgService
return nil, grouperrors.ErrExpired.Wrapf("proposal expired on %s", expiryDate)
}
msgs := proposal.GetMsgs()
msgs, err := proposal.GetMsgs()
if err != nil {
return nil, err
}
results := make([]sdk.Result, len(msgs))
if err := ensureMsgAuthZ(msgs, groupPolicyAcc); err != nil {
@ -36,19 +41,27 @@ func (s Keeper) doExecuteMsgs(ctx sdk.Context, router *authmiddleware.MsgService
if err != nil {
return nil, errors.Wrapf(err, "message %q at position %d", msg, i)
}
if r != nil {
results[i] = *r
// Handler should always return non-nil sdk.Result.
if r == nil {
return nil, fmt.Errorf("got nil sdk.Result for message %q at position %d", msg, i)
}
results[i] = *r
}
return results, nil
}
// ensureMsgAuthZ checks that if a message requires signers that all of them are equal to the given account address of group policy.
// ensureMsgAuthZ checks that if a message requires signers that all of them
// are equal to the given account address of group policy.
func ensureMsgAuthZ(msgs []sdk.Msg, groupPolicyAcc sdk.AccAddress) error {
for i := range msgs {
// In practice, GetSigners() should return a non-empty array without
// duplicates, so the code below is equivalent to:
// `msgs[i].GetSigners()[0] == groupPolicyAcc`
// but we prefer to loop through all GetSigners just to be sure.
for _, acct := range msgs[i].GetSigners() {
if !groupPolicyAcc.Equals(acct) {
return errors.Wrap(errors.ErrUnauthorized, "msg does not have group policy authorization")
return errors.Wrapf(errors.ErrUnauthorized, "msg does not have group policy authorization; expected %s, got %s", groupPolicyAcc.String(), acct.String())
}
}
}

View File

@ -209,7 +209,7 @@ func TestEndBlockerPruning(t *testing.T) {
require.NoError(t, err)
_, err = app.GroupKeeper.WithdrawProposal(ctx, &group.MsgWithdrawProposal{
ProposalId: pId,
Address: groupPolicyAddr.String(),
Address: proposers[0],
})
require.NoError(t, err)
return pId
@ -224,7 +224,7 @@ func TestEndBlockerPruning(t *testing.T) {
require.NoError(t, err)
_, err = app.GroupKeeper.WithdrawProposal(ctx, &group.MsgWithdrawProposal{
ProposalId: pId,
Address: groupPolicyAddr.String(),
Address: proposers[0],
})
require.NoError(t, err)
return pId
@ -318,7 +318,7 @@ func TestEndBlockerPruning(t *testing.T) {
}
func TestEndBlocker(t *testing.T) {
func TestEndBlockerTallying(t *testing.T) {
app := simapp.Setup(t, false)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
@ -374,7 +374,7 @@ func TestEndBlocker(t *testing.T) {
tallyRes group.TallyResult
expStatus group.ProposalStatus
}{
"tally updated after voting power end": {
"tally updated after voting period end": {
preRun: func(sdkCtx sdk.Context) uint64 {
pId, err := submitProposal(app, sdkCtx, []sdk.Msg{msgSend}, proposers, groupPolicyAddr)
require.NoError(t, err)
@ -383,7 +383,7 @@ func TestEndBlocker(t *testing.T) {
admin: proposers[0],
newCtx: ctx.WithBlockTime(ctx.BlockTime().Add(votingPeriod).Add(time.Hour)),
tallyRes: group.DefaultTallyResult(),
expStatus: group.PROPOSAL_STATUS_SUBMITTED,
expStatus: group.PROPOSAL_STATUS_REJECTED,
},
"tally within voting period": {
preRun: func(sdkCtx sdk.Context) uint64 {
@ -409,6 +409,24 @@ func TestEndBlocker(t *testing.T) {
tallyRes: group.DefaultTallyResult(),
expStatus: group.PROPOSAL_STATUS_SUBMITTED,
},
"tally after voting period (not passing)": {
preRun: func(sdkCtx sdk.Context) uint64 {
// `addrs[1]` has weight 1
pId, err := submitProposalAndVote(app, ctx, []sdk.Msg{msgSend}, []string{addrs[1].String()}, groupPolicyAddr, group.VOTE_OPTION_YES)
require.NoError(t, err)
return pId
},
admin: proposers[0],
newCtx: ctx.WithBlockTime(ctx.BlockTime().Add(votingPeriod).Add(time.Hour)),
tallyRes: group.TallyResult{
YesCount: "1",
NoCount: "0",
NoWithVetoCount: "0",
AbstainCount: "0",
},
expStatus: group.PROPOSAL_STATUS_REJECTED,
},
"tally after voting period(with votes)": {
preRun: func(sdkCtx sdk.Context) uint64 {
pId, err := submitProposalAndVote(app, ctx, []sdk.Msg{msgSend}, proposers, groupPolicyAddr, group.VOTE_OPTION_YES)
@ -426,14 +444,14 @@ func TestEndBlocker(t *testing.T) {
},
expStatus: group.PROPOSAL_STATUS_ACCEPTED,
},
"tally of closed proposal": {
"tally of withdrawn proposal": {
preRun: func(sdkCtx sdk.Context) uint64 {
pId, err := submitProposal(app, sdkCtx, []sdk.Msg{msgSend}, proposers, groupPolicyAddr)
require.NoError(t, err)
_, err = app.GroupKeeper.WithdrawProposal(ctx, &group.MsgWithdrawProposal{
ProposalId: pId,
Address: groupPolicyAddr.String(),
Address: proposers[0],
})
require.NoError(t, err)
@ -444,14 +462,14 @@ func TestEndBlocker(t *testing.T) {
tallyRes: group.DefaultTallyResult(),
expStatus: group.PROPOSAL_STATUS_WITHDRAWN,
},
"tally of closed proposal (with votes)": {
"tally of withdrawn proposal (with votes)": {
preRun: func(sdkCtx sdk.Context) uint64 {
pId, err := submitProposalAndVote(app, ctx, []sdk.Msg{msgSend}, proposers, groupPolicyAddr, group.VOTE_OPTION_YES)
require.NoError(t, err)
_, err = app.GroupKeeper.WithdrawProposal(ctx, &group.MsgWithdrawProposal{
ProposalId: pId,
Address: groupPolicyAddr.String(),
Address: proposers[0],
})
require.NoError(t, err)

View File

@ -1,8 +1,6 @@
package group
import (
"fmt"
"github.com/cosmos/cosmos-sdk/codec/legacy"
proto "github.com/gogo/protobuf/proto"
@ -44,18 +42,14 @@ func (m MsgCreateGroup) ValidateBasic() error {
return sdkerrors.Wrap(err, "admin")
}
return m.validateMembers()
}
func (m MsgCreateGroup) validateMembers() error {
err := validateMembers(m.Members)
if err != nil {
return err
}
return nil
return strictValidateMembers(m.Members)
}
// ValidateBasic performs stateless validation on a group member, such as
// making sure the address is well-formed, and the weight is non-negative.
// Note: in state, a member's weight MUST be positive. However, in some Msgs,
// it's possible to set a zero member weight, for example in
// MsgUpdateGroupMembers to denote that we're removing a member.
func (m Member) ValidateBasic() error {
_, err := sdk.AccAddressFromBech32(m.Address)
if err != nil {
@ -216,12 +210,12 @@ var _ sdk.Msg = &MsgCreateGroupWithPolicy{}
var _ types.UnpackInterfacesMessage = MsgCreateGroupWithPolicy{}
// NewMsgCreateGroupWithPolicy creates a new MsgCreateGroupWithPolicy.
func NewMsgCreateGroupWithPolicy(admin string, members []Member, group_metadata string, group_policy_metadata string, groupPolicyAsAdmin bool, decisionPolicy DecisionPolicy) (*MsgCreateGroupWithPolicy, error) {
func NewMsgCreateGroupWithPolicy(admin string, members []Member, groupMetadata string, groupPolicyMetadata string, groupPolicyAsAdmin bool, decisionPolicy DecisionPolicy) (*MsgCreateGroupWithPolicy, error) {
m := &MsgCreateGroupWithPolicy{
Admin: admin,
Members: members,
GroupMetadata: group_metadata,
GroupPolicyMetadata: group_policy_metadata,
GroupMetadata: groupMetadata,
GroupPolicyMetadata: groupPolicyMetadata,
GroupPolicyAsAdmin: groupPolicyAsAdmin,
}
err := m.SetDecisionPolicy(decisionPolicy)
@ -231,20 +225,16 @@ func NewMsgCreateGroupWithPolicy(admin string, members []Member, group_metadata
return m, nil
}
func (m *MsgCreateGroupWithPolicy) GetDecisionPolicy() DecisionPolicy {
func (m *MsgCreateGroupWithPolicy) GetDecisionPolicy() (DecisionPolicy, error) {
decisionPolicy, ok := m.DecisionPolicy.GetCachedValue().(DecisionPolicy)
if !ok {
return nil
return nil, sdkerrors.ErrInvalidType.Wrapf("expected %T, got %T", (DecisionPolicy)(nil), m.DecisionPolicy.GetCachedValue())
}
return decisionPolicy
return decisionPolicy, nil
}
func (m *MsgCreateGroupWithPolicy) SetDecisionPolicy(decisionPolicy DecisionPolicy) error {
msg, ok := decisionPolicy.(proto.Message)
if !ok {
return sdkerrors.ErrInvalidType.Wrapf("can't proto marshal %T", msg)
}
any, err := types.NewAnyWithValue(msg)
any, err := types.NewAnyWithValue(decisionPolicy)
if err != nil {
return err
}
@ -288,24 +278,15 @@ func (m MsgCreateGroupWithPolicy) ValidateBasic() error {
if err != nil {
return sdkerrors.Wrap(err, "admin")
}
policy := m.GetDecisionPolicy()
if policy == nil {
return sdkerrors.Wrap(errors.ErrEmpty, "decision policy")
policy, err := m.GetDecisionPolicy()
if err != nil {
return sdkerrors.Wrap(err, "decision policy")
}
if err := policy.ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "decision policy")
}
return m.validateMembers()
}
func (m MsgCreateGroupWithPolicy) validateMembers() error {
err := validateMembers(m.Members)
if err != nil {
return err
}
return nil
return strictValidateMembers(m.Members)
}
var _ sdk.Msg = &MsgCreateGroupPolicy{}
@ -342,9 +323,9 @@ func (m MsgCreateGroupPolicy) ValidateBasic() error {
return sdkerrors.Wrap(errors.ErrEmpty, "group id")
}
policy := m.GetDecisionPolicy()
if policy == nil {
return sdkerrors.Wrap(errors.ErrEmpty, "decision policy")
policy, err := m.GetDecisionPolicy()
if err != nil {
return sdkerrors.Wrap(err, "decision policy")
}
if err := policy.ValidateBasic(); err != nil {
@ -403,7 +384,8 @@ func (m MsgUpdateGroupPolicyAdmin) ValidateBasic() error {
var _ sdk.Msg = &MsgUpdateGroupPolicyDecisionPolicy{}
var _ types.UnpackInterfacesMessage = MsgUpdateGroupPolicyDecisionPolicy{}
func NewMsgUpdateGroupPolicyDecisionPolicyRequest(admin sdk.AccAddress, address sdk.AccAddress, decisionPolicy DecisionPolicy) (*MsgUpdateGroupPolicyDecisionPolicy, error) {
// NewMsgUpdateGroupPolicyDecisionPolicy creates a new MsgUpdateGroupPolicyDecisionPolicy.
func NewMsgUpdateGroupPolicyDecisionPolicy(admin sdk.AccAddress, address sdk.AccAddress, decisionPolicy DecisionPolicy) (*MsgUpdateGroupPolicyDecisionPolicy, error) {
m := &MsgUpdateGroupPolicyDecisionPolicy{
Admin: admin.String(),
GroupPolicyAddress: address.String(),
@ -464,9 +446,9 @@ func (m MsgUpdateGroupPolicyDecisionPolicy) ValidateBasic() error {
return sdkerrors.Wrap(err, "group policy")
}
policy := m.GetDecisionPolicy()
if policy == nil {
return sdkerrors.Wrap(errors.ErrEmpty, "decision policy")
policy, err := m.GetDecisionPolicy()
if err != nil {
return sdkerrors.Wrap(err, "decision policy")
}
if err := policy.ValidateBasic(); err != nil {
@ -476,12 +458,13 @@ func (m MsgUpdateGroupPolicyDecisionPolicy) ValidateBasic() error {
return nil
}
func (m *MsgUpdateGroupPolicyDecisionPolicy) GetDecisionPolicy() DecisionPolicy {
func (m *MsgUpdateGroupPolicyDecisionPolicy) GetDecisionPolicy() (DecisionPolicy, error) {
decisionPolicy, ok := m.DecisionPolicy.GetCachedValue().(DecisionPolicy)
if !ok {
return nil
return nil, sdkerrors.ErrInvalidType.Wrapf("expected %T, got %T", (DecisionPolicy)(nil), m.DecisionPolicy.GetCachedValue())
}
return decisionPolicy
return decisionPolicy, nil
}
// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces
@ -558,20 +541,16 @@ func (m *MsgCreateGroupPolicy) GetMetadata() string {
return m.Metadata
}
func (m *MsgCreateGroupPolicy) GetDecisionPolicy() DecisionPolicy {
func (m *MsgCreateGroupPolicy) GetDecisionPolicy() (DecisionPolicy, error) {
decisionPolicy, ok := m.DecisionPolicy.GetCachedValue().(DecisionPolicy)
if !ok {
return nil
return nil, sdkerrors.ErrInvalidType.Wrapf("expected %T, got %T", (DecisionPolicy)(nil), m.DecisionPolicy.GetCachedValue())
}
return decisionPolicy
return decisionPolicy, nil
}
func (m *MsgCreateGroupPolicy) SetDecisionPolicy(decisionPolicy DecisionPolicy) error {
msg, ok := decisionPolicy.(proto.Message)
if !ok {
return fmt.Errorf("can't proto marshal %T", msg)
}
any, err := types.NewAnyWithValue(msg)
any, err := types.NewAnyWithValue(decisionPolicy)
if err != nil {
return err
}
@ -587,8 +566,8 @@ func (m MsgCreateGroupPolicy) UnpackInterfaces(unpacker types.AnyUnpacker) error
var _ sdk.Msg = &MsgSubmitProposal{}
// NewMsgSubmitProposalRequest creates a new MsgSubmitProposal.
func NewMsgSubmitProposalRequest(address string, proposers []string, msgs []sdk.Msg, metadata string, exec Exec) (*MsgSubmitProposal, error) {
// NewMsgSubmitProposal creates a new MsgSubmitProposal.
func NewMsgSubmitProposal(address string, proposers []string, msgs []sdk.Msg, metadata string, exec Exec) (*MsgSubmitProposal, error) {
m := &MsgSubmitProposal{
GroupPolicyAddress: address,
Proposers: proposers,
@ -617,18 +596,17 @@ func (m MsgSubmitProposal) GetSignBytes() []byte {
// GetSigners returns the expected signers for a MsgSubmitProposal.
func (m MsgSubmitProposal) GetSigners() []sdk.AccAddress {
addrs := make([]sdk.AccAddress, len(m.Proposers))
for i, proposer := range m.Proposers {
addr, err := sdk.AccAddressFromBech32(proposer)
if err != nil {
panic(err)
}
addrs[i] = addr
addrs, err := m.getProposerAccAddresses()
if err != nil {
panic(err)
}
return addrs
}
// ValidateBasic does a sanity check on the provided data
// ValidateBasic does a sanity check on the provided proposal, such as
// verifying proposer addresses, and performing ValidateBasic on each
// individual `sdk.Msg`.
func (m MsgSubmitProposal) ValidateBasic() error {
_, err := sdk.AccAddressFromBech32(m.GroupPolicyAddress)
if err != nil {
@ -638,19 +616,21 @@ func (m MsgSubmitProposal) ValidateBasic() error {
if len(m.Proposers) == 0 {
return sdkerrors.Wrap(errors.ErrEmpty, "proposers")
}
addrs := make([]sdk.AccAddress, len(m.Proposers))
for i, proposer := range m.Proposers {
addr, err := sdk.AccAddressFromBech32(proposer)
if err != nil {
return sdkerrors.Wrap(err, "proposers")
}
addrs[i] = addr
addrs, err := m.getProposerAccAddresses()
if err != nil {
return sdkerrors.Wrap(err, "group proposers")
}
if err := AccAddresses(addrs).ValidateBasic(); err != nil {
if err := accAddresses(addrs).ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "proposers")
}
msgs := m.GetMsgs()
msgs, err := m.GetMsgs()
if err != nil {
return err
}
for i, msg := range msgs {
if err := msg.ValidateBasic(); err != nil {
return sdkerrors.Wrapf(err, "msg %d", i)
@ -659,6 +639,20 @@ func (m MsgSubmitProposal) ValidateBasic() error {
return nil
}
// getProposerAccAddresses returns the proposers as `[]sdk.AccAddress`.
func (m *MsgSubmitProposal) getProposerAccAddresses() ([]sdk.AccAddress, error) {
addrs := make([]sdk.AccAddress, len(m.Proposers))
for i, proposer := range m.Proposers {
addr, err := sdk.AccAddressFromBech32(proposer)
if err != nil {
return nil, sdkerrors.Wrap(err, "proposers")
}
addrs[i] = addr
}
return addrs, nil
}
// SetMsgs packs msgs into Any's
func (m *MsgSubmitProposal) SetMsgs(msgs []sdk.Msg) error {
anys, err := tx.SetMsgs(msgs)
@ -670,12 +664,8 @@ func (m *MsgSubmitProposal) SetMsgs(msgs []sdk.Msg) error {
}
// GetMsgs unpacks m.Messages Any's into sdk.Msg's
func (m MsgSubmitProposal) GetMsgs() []sdk.Msg {
msgs, err := tx.GetMsgs(m.Messages, "proposal")
if err != nil {
panic(err)
}
return msgs
func (m MsgSubmitProposal) GetMsgs() ([]sdk.Msg, error) {
return tx.GetMsgs(m.Messages, "proposal")
}
// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces
@ -818,6 +808,7 @@ func (m MsgLeaveGroup) GetSigners() []sdk.AccAddress {
if err != nil {
panic(err)
}
return []sdk.AccAddress{signer}
}
@ -834,24 +825,19 @@ func (m MsgLeaveGroup) ValidateBasic() error {
return nil
}
func validateMembers(members []Member) error {
index := make(map[string]struct{}, len(members))
for i := range members {
member := members[i]
_, err := sdk.AccAddressFromBech32(member.Address)
if err != nil {
return sdkerrors.Wrap(err, "address")
}
// strictValidateMembers performs ValidateBasic on Members, but also checks
// that all members weights are positive (whereas `Members{members}.ValidateBasic()`
// only checks that they are non-negative.
func strictValidateMembers(members []Member) error {
err := Members{members}.ValidateBasic()
if err != nil {
return err
}
if _, err := math.NewPositiveDecFromString(member.Weight); err != nil {
for _, m := range members {
if _, err := math.NewPositiveDecFromString(m.Weight); err != nil {
return sdkerrors.Wrap(err, "weight")
}
addr := member.Address
if _, exists := index[addr]; exists {
return sdkerrors.Wrapf(errors.ErrDuplicate, "address: %s", addr)
}
index[addr] = struct{}{}
}
return nil

View File

@ -59,7 +59,7 @@ func TestMsgCreateGroup(t *testing.T) {
},
},
true,
"expected a positive decimal",
"expected a non-negative decimal",
},
{
"zero member's weight not allowed",
@ -416,7 +416,7 @@ func TestMsgCreateGroupWithPolicy(t *testing.T) {
return req
},
true,
"expected a positive decimal",
"expected a non-negative decimal",
},
{
"zero member's weight not allowed",
@ -692,23 +692,23 @@ func TestMsgCreateGroupPolicy(t *testing.T) {
func TestMsgUpdateGroupPolicyDecisionPolicy(t *testing.T) {
validPolicy := group.NewThresholdDecisionPolicy("1", time.Second, 0)
msg1, err := group.NewMsgUpdateGroupPolicyDecisionPolicyRequest(admin, member1, validPolicy)
msg1, err := group.NewMsgUpdateGroupPolicyDecisionPolicy(admin, member1, validPolicy)
require.NoError(t, err)
invalidPolicy := group.NewThresholdDecisionPolicy("-1", time.Second, 0)
msg2, err := group.NewMsgUpdateGroupPolicyDecisionPolicyRequest(admin, member2, invalidPolicy)
msg2, err := group.NewMsgUpdateGroupPolicyDecisionPolicy(admin, member2, invalidPolicy)
require.NoError(t, err)
validPercentagePolicy := group.NewPercentageDecisionPolicy("0.7", time.Second, 0)
msg3, err := group.NewMsgUpdateGroupPolicyDecisionPolicyRequest(admin, member3, validPercentagePolicy)
msg3, err := group.NewMsgUpdateGroupPolicyDecisionPolicy(admin, member3, validPercentagePolicy)
require.NoError(t, err)
invalidPercentagePolicy := group.NewPercentageDecisionPolicy("-0.1", time.Second, 0)
msg4, err := group.NewMsgUpdateGroupPolicyDecisionPolicyRequest(admin, member4, invalidPercentagePolicy)
msg4, err := group.NewMsgUpdateGroupPolicyDecisionPolicy(admin, member4, invalidPercentagePolicy)
require.NoError(t, err)
invalidPercentagePolicy2 := group.NewPercentageDecisionPolicy("2", time.Second, 0)
msg5, err := group.NewMsgUpdateGroupPolicyDecisionPolicyRequest(admin, member5, invalidPercentagePolicy2)
msg5, err := group.NewMsgUpdateGroupPolicyDecisionPolicy(admin, member5, invalidPercentagePolicy2)
require.NoError(t, err)
testCases := []struct {

View File

@ -6,12 +6,9 @@ import (
"github.com/cosmos/cosmos-sdk/types/tx"
)
func (p *Proposal) GetMsgs() []sdk.Msg {
msgs, err := tx.GetMsgs(p.Messages, "proposal")
if err != nil {
panic(err)
}
return msgs
func (p *Proposal) GetMsgs() ([]sdk.Msg, error) {
return tx.GetMsgs(p.Messages, "proposal")
}
func (p *Proposal) SetMsgs(msgs []sdk.Msg) error {

View File

@ -416,7 +416,10 @@ func SimulateMsgSubmitProposal(ak group.AccountKeeper, bk group.BankKeeper, k ke
groupPolicyAddr := groupPolicy.Address
// Return a no-op if we know the proposal cannot be created
policy := groupPolicy.GetDecisionPolicy()
policy, err := groupPolicy.GetDecisionPolicy()
if err != nil {
return simtypes.NoOpMsg(group.ModuleName, TypeMsgSubmitProposal, ""), nil, nil
}
err = policy.Validate(*g, group.DefaultConfig())
if err != nil {
return simtypes.NoOpMsg(group.ModuleName, TypeMsgSubmitProposal, ""), nil, nil
@ -710,7 +713,7 @@ func SimulateMsgUpdateGroupPolicyAdmin(ak group.AccountKeeper, bk group.BankKeep
}
}
// // SimulateMsgUpdateGroupPolicyDecisionPolicy generates a NewMsgUpdateGroupPolicyDecisionPolicyRequest with random values
// // SimulateMsgUpdateGroupPolicyDecisionPolicy generates a NewMsgUpdateGroupPolicyDecisionPolicy with random values
func SimulateMsgUpdateGroupPolicyDecisionPolicy(ak group.AccountKeeper,
bk group.BankKeeper, k keeper.Keeper) simtypes.Operation {
return func(
@ -735,7 +738,7 @@ func SimulateMsgUpdateGroupPolicyDecisionPolicy(ak group.AccountKeeper,
return simtypes.NoOpMsg(group.ModuleName, TypeMsgUpdateGroupPolicyDecisionPolicy, fmt.Sprintf("fail to decide bech32 address: %s", err.Error())), nil, nil
}
msg, err := group.NewMsgUpdateGroupPolicyDecisionPolicyRequest(acc.Address, groupPolicyBech32, &group.ThresholdDecisionPolicy{
msg, err := group.NewMsgUpdateGroupPolicyDecisionPolicy(acc.Address, groupPolicyBech32, &group.ThresholdDecisionPolicy{
Threshold: fmt.Sprintf("%d", simtypes.RandIntBetween(r, 1, 10)),
Windows: &group.DecisionPolicyWindows{
VotingPeriod: time.Second * time.Duration(simtypes.RandIntBetween(r, 100, 1000)),
@ -837,7 +840,10 @@ func SimulateMsgWithdrawProposal(ak group.AccountKeeper,
groupPolicyAddr := groupPolicy.Address
ctx := sdk.WrapSDKContext(sdkCtx)
policy := groupPolicy.GetDecisionPolicy()
policy, err := groupPolicy.GetDecisionPolicy()
if err != nil {
return simtypes.NoOpMsg(group.ModuleName, TypeMsgWithdrawProposal, err.Error()), nil, nil
}
err = policy.Validate(*g, group.DefaultConfig())
if err != nil {
return simtypes.NoOpMsg(group.ModuleName, TypeMsgWithdrawProposal, err.Error()), nil, nil

View File

@ -282,7 +282,7 @@ func (suite *SimTestSuite) TestWithdrawProposal() {
suite.Require().NoError(err)
// setup a proposal
proposalReq, err := group.NewMsgSubmitProposalRequest(groupPolicyRes.Address, []string{addr}, []sdk.Msg{
proposalReq, err := group.NewMsgSubmitProposal(groupPolicyRes.Address, []string{addr}, []sdk.Msg{
&banktypes.MsgSend{
FromAddress: groupPolicyRes.Address,
ToAddress: addr,
@ -349,7 +349,7 @@ func (suite *SimTestSuite) TestSimulateVote() {
suite.Require().NoError(err)
// setup a proposal
proposalReq, err := group.NewMsgSubmitProposalRequest(groupPolicyRes.Address, []string{addr}, []sdk.Msg{
proposalReq, err := group.NewMsgSubmitProposal(groupPolicyRes.Address, []string{addr}, []sdk.Msg{
&banktypes.MsgSend{
FromAddress: groupPolicyRes.Address,
ToAddress: addr,
@ -415,7 +415,7 @@ func (suite *SimTestSuite) TestSimulateExec() {
suite.Require().NoError(err)
// setup a proposal
proposalReq, err := group.NewMsgSubmitProposalRequest(groupPolicyRes.Address, []string{addr}, []sdk.Msg{
proposalReq, err := group.NewMsgSubmitProposal(groupPolicyRes.Address, []string{addr}, []sdk.Msg{
&banktypes.MsgSend{
FromAddress: groupPolicyRes.Address,
ToAddress: addr,

View File

@ -10,7 +10,8 @@ A group is simply an aggregation of accounts with associated weights. It is not
an account and doesn't have a balance. It doesn't in and of itself have any
sort of voting or decision weight. It does have an "administrator" which has
the ability to add, remove and update members in the group. Note that a
group policy account could be an administrator of a group.
group policy account could be an administrator of a group, and that the
administrator doesn't necessarily have to be a member of the group.
## Group Policy

View File

@ -1324,6 +1324,8 @@ func (m *MsgExec) GetExecutor() string {
// MsgExecResponse is the Msg/Exec request type.
type MsgExecResponse struct {
// result is the final result of the proposal execution.
Result ProposalExecutorResult `protobuf:"varint,2,opt,name=result,proto3,enum=cosmos.group.v1.ProposalExecutorResult" json:"result,omitempty"`
}
func (m *MsgExecResponse) Reset() { *m = MsgExecResponse{} }
@ -1359,6 +1361,13 @@ func (m *MsgExecResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_MsgExecResponse proto.InternalMessageInfo
func (m *MsgExecResponse) GetResult() ProposalExecutorResult {
if m != nil {
return m.Result
}
return PROPOSAL_EXECUTOR_RESULT_UNSPECIFIED
}
// MsgLeaveGroup is the Msg/LeaveGroup request type.
type MsgLeaveGroup struct {
// address is the account address of the group member.
@ -1486,85 +1495,87 @@ func init() {
func init() { proto.RegisterFile("cosmos/group/v1/tx.proto", fileDescriptor_6b8d3d629f136420) }
var fileDescriptor_6b8d3d629f136420 = []byte{
// 1241 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xcd, 0x6e, 0xe3, 0x54,
0x14, 0x8e, 0x93, 0x4c, 0x9b, 0x9e, 0xcc, 0xa4, 0xad, 0x9b, 0x4e, 0x53, 0x77, 0x26, 0x09, 0xa6,
0xd3, 0xe9, 0x44, 0x53, 0x87, 0xa6, 0x8c, 0x90, 0x0a, 0x42, 0xea, 0x1f, 0xa8, 0x88, 0x40, 0x71,
0x67, 0x18, 0x60, 0x13, 0xdc, 0xd8, 0xe3, 0xb1, 0x48, 0x72, 0xad, 0x5c, 0xa7, 0x4d, 0x97, 0xc0,
0x86, 0x9f, 0x0d, 0x12, 0x2f, 0x00, 0xe2, 0x05, 0x58, 0xf4, 0x09, 0x60, 0x33, 0x62, 0x35, 0x62,
0x85, 0x58, 0xa0, 0x51, 0xbb, 0xe0, 0x05, 0x78, 0x00, 0xe4, 0x7b, 0xed, 0x1b, 0x3b, 0x71, 0x6a,
0x37, 0x8a, 0x60, 0xd5, 0xda, 0xe7, 0x3b, 0xe7, 0x7c, 0xdf, 0xb9, 0xe7, 0xde, 0x73, 0x1d, 0xc8,
0xd5, 0x11, 0x6e, 0x22, 0x5c, 0xd6, 0xdb, 0xa8, 0x63, 0x96, 0x8f, 0xd7, 0xcb, 0x56, 0x57, 0x32,
0xdb, 0xc8, 0x42, 0xfc, 0x34, 0xb5, 0x48, 0xc4, 0x22, 0x1d, 0xaf, 0x0b, 0x59, 0x1d, 0xe9, 0x88,
0xd8, 0xca, 0xf6, 0x7f, 0x14, 0x26, 0x2c, 0x52, 0x58, 0x8d, 0x1a, 0x1c, 0x1f, 0xc7, 0xa4, 0x23,
0xa4, 0x37, 0xb4, 0x32, 0x79, 0x3a, 0xea, 0x3c, 0x29, 0x2b, 0xad, 0x53, 0xc7, 0xb4, 0x34, 0x90,
0xf6, 0xd4, 0xd4, 0x5c, 0xbf, 0x05, 0xc7, 0xd8, 0xc4, 0xba, 0x6d, 0x6a, 0x62, 0x9d, 0x1a, 0xc4,
0x1f, 0x39, 0xc8, 0x54, 0xb1, 0xbe, 0xd3, 0xd6, 0x14, 0x4b, 0x7b, 0xdb, 0x76, 0xe5, 0x25, 0xb8,
0xa6, 0xa8, 0x4d, 0xa3, 0x95, 0xe3, 0x8a, 0xdc, 0xea, 0xd4, 0x76, 0xee, 0xf7, 0xb3, 0xb5, 0xac,
0x43, 0x62, 0x4b, 0x55, 0xdb, 0x1a, 0xc6, 0x87, 0x56, 0xdb, 0x68, 0xe9, 0x32, 0x85, 0xf1, 0xaf,
0xc1, 0x64, 0x53, 0x6b, 0x1e, 0x69, 0x6d, 0x9c, 0x8b, 0x17, 0x13, 0xab, 0xe9, 0xca, 0x82, 0xd4,
0xa7, 0x53, 0xaa, 0x12, 0xfb, 0x76, 0xf2, 0xd9, 0x5f, 0x85, 0x98, 0xec, 0xa2, 0x79, 0x01, 0x52,
0x4d, 0xcd, 0x52, 0x54, 0xc5, 0x52, 0x72, 0x09, 0x3b, 0x97, 0xcc, 0x9e, 0x37, 0xe1, 0x8b, 0xbf,
0x7f, 0x2e, 0xd1, 0x04, 0xe2, 0x06, 0xdc, 0xf4, 0x53, 0x94, 0x35, 0x6c, 0xa2, 0x16, 0xd6, 0xf8,
0x45, 0x48, 0x91, 0x1c, 0x35, 0x43, 0x25, 0x6c, 0x93, 0xf2, 0x24, 0x79, 0xde, 0x57, 0xc5, 0x33,
0x0e, 0xe6, 0xab, 0x58, 0x7f, 0x64, 0xaa, 0xae, 0x57, 0xd5, 0x49, 0x7b, 0x55, 0x7d, 0xde, 0x24,
0x71, 0x5f, 0x12, 0x7e, 0x17, 0x32, 0x54, 0x4c, 0xad, 0x43, 0xf2, 0xe0, 0x5c, 0x22, 0x4a, 0x05,
0x6e, 0x50, 0x27, 0xca, 0x0d, 0xfb, 0xb4, 0x16, 0xe0, 0x76, 0x20, 0x6b, 0x57, 0xb2, 0xf8, 0x13,
0x07, 0x73, 0x7e, 0xc4, 0x16, 0x61, 0x39, 0x46, 0x55, 0x0f, 0x60, 0xaa, 0xa5, 0x9d, 0xd4, 0x68,
0xb8, 0x44, 0x48, 0xb8, 0x54, 0x4b, 0x3b, 0x21, 0x0c, 0x7c, 0x32, 0x6e, 0xc3, 0x52, 0x00, 0x49,
0x26, 0xe2, 0x5b, 0x8e, 0x2c, 0xa9, 0x4f, 0x26, 0x5d, 0xf8, 0x71, 0xea, 0x88, 0xda, 0x5f, 0x45,
0xc8, 0x07, 0x93, 0x61, 0x7c, 0x5f, 0x70, 0x90, 0xf5, 0xb7, 0xe0, 0x01, 0x6a, 0x18, 0xf5, 0xd3,
0xff, 0x88, 0x2d, 0xff, 0x01, 0x4c, 0xab, 0x5a, 0xdd, 0xc0, 0x06, 0x6a, 0xd5, 0x4c, 0x92, 0x39,
0x97, 0x2c, 0x72, 0xab, 0xe9, 0x4a, 0x56, 0xa2, 0x07, 0x82, 0xe4, 0x1e, 0x08, 0xd2, 0x56, 0xeb,
0x74, 0x9b, 0xff, 0xed, 0x6c, 0x2d, 0xb3, 0xeb, 0x38, 0x50, 0xa6, 0x72, 0x46, 0xf5, 0x3d, 0x6f,
0x66, 0xbe, 0xfa, 0xa1, 0x10, 0xf3, 0x14, 0x41, 0x86, 0x5b, 0x41, 0x0a, 0xd9, 0x56, 0xab, 0xc0,
0xa4, 0x42, 0x15, 0x85, 0x6a, 0x75, 0x81, 0xe2, 0x9f, 0x1c, 0x2c, 0xfa, 0x2b, 0x4b, 0x83, 0x8e,
0xd6, 0xb1, 0xef, 0x40, 0x96, 0xd6, 0x8e, 0x56, 0xa0, 0xe6, 0xd2, 0x89, 0x87, 0xb8, 0xf3, 0xba,
0x37, 0x33, 0xb1, 0x8c, 0xa3, 0xc5, 0xff, 0x89, 0x43, 0xce, 0x5f, 0xb1, 0xc7, 0x86, 0xf5, 0x74,
0xc4, 0xbe, 0x18, 0xf9, 0x0c, 0xbd, 0x03, 0x19, 0x5a, 0x94, 0xbe, 0xde, 0xb9, 0xa1, 0xfb, 0x76,
0x55, 0x05, 0xe6, 0x7d, 0xb5, 0x63, 0xe8, 0x24, 0x41, 0xcf, 0x79, 0x4a, 0xc4, 0x7c, 0xd6, 0xfb,
0x7c, 0x14, 0xec, 0xd4, 0xeb, 0x5a, 0x91, 0x5b, 0x4d, 0xf9, 0xcb, 0x8a, 0xe9, 0x92, 0x06, 0xf4,
0xe9, 0xc4, 0x98, 0xfb, 0xf4, 0x6b, 0x0e, 0x8a, 0xc3, 0xca, 0x1e, 0x61, 0x2e, 0x8c, 0xb3, 0x8b,
0xc4, 0x97, 0xe1, 0xa5, 0xa1, 0xed, 0xcd, 0xce, 0x8e, 0x2f, 0xe3, 0x20, 0x06, 0xa1, 0xfc, 0xba,
0xff, 0xd7, 0xdd, 0x10, 0xb0, 0x6c, 0x89, 0x31, 0x2f, 0xdb, 0x7d, 0x28, 0x85, 0x17, 0x81, 0xd5,
0xec, 0x17, 0x8e, 0x9c, 0x46, 0x03, 0xf0, 0x91, 0xa7, 0xc4, 0x38, 0xab, 0x15, 0x75, 0xac, 0xac,
0xc0, 0xf2, 0x65, 0x1a, 0x98, 0xd8, 0x6f, 0xe2, 0x30, 0x5b, 0xc5, 0xfa, 0x61, 0xe7, 0xa8, 0x69,
0x58, 0x07, 0x6d, 0x64, 0x22, 0xac, 0x34, 0x86, 0x32, 0xe6, 0x46, 0x60, 0x7c, 0x0b, 0xa6, 0x4c,
0x12, 0xd7, 0x3d, 0x5f, 0xa6, 0xe4, 0xde, 0x8b, 0x4b, 0x07, 0xcf, 0x2b, 0xb6, 0x0d, 0x63, 0x45,
0xd7, 0x70, 0x2e, 0x49, 0x0e, 0xa6, 0xc0, 0x96, 0x90, 0x19, 0x8a, 0xbf, 0x07, 0x49, 0xad, 0xab,
0xd5, 0xc9, 0x21, 0x91, 0xa9, 0xcc, 0x0f, 0x1c, 0x63, 0x7b, 0x5d, 0xad, 0x2e, 0x13, 0xc8, 0x26,
0xef, 0xf6, 0x48, 0x8f, 0x8c, 0xf8, 0x06, 0x99, 0x18, 0xfe, 0x5a, 0xb0, 0x6d, 0x5d, 0x80, 0xb4,
0xe9, 0xbc, 0xeb, 0xed, 0x6c, 0x70, 0x5f, 0xed, 0xab, 0x62, 0x97, 0xdc, 0x8d, 0xec, 0x03, 0x41,
0x6d, 0x2b, 0x27, 0xac, 0x96, 0x61, 0x7e, 0xde, 0xe1, 0x16, 0x8f, 0x38, 0xdc, 0x36, 0xaf, 0xdb,
0xcc, 0xd9, 0xa8, 0xa3, 0x17, 0x9e, 0xfe, 0xcc, 0x6c, 0x8d, 0xcf, 0x39, 0x98, 0xac, 0x62, 0xfd,
0x43, 0x64, 0x85, 0xab, 0xb0, 0x9b, 0xfb, 0x18, 0x59, 0x5a, 0x3b, 0x94, 0x0b, 0x85, 0xf1, 0x1b,
0x30, 0x81, 0x4c, 0xcb, 0x40, 0x74, 0x92, 0x65, 0x2a, 0x4b, 0x03, 0x45, 0xb7, 0xf3, 0xbe, 0x4f,
0x20, 0xb2, 0x03, 0xf5, 0xad, 0x7a, 0xb2, 0x6f, 0xd5, 0xaf, 0xb0, 0x86, 0xb4, 0xe1, 0x09, 0x0f,
0x71, 0x16, 0xa6, 0x1d, 0x8d, 0x4c, 0x77, 0x93, 0xc8, 0xb6, 0xf1, 0xe1, 0xb2, 0x5f, 0x85, 0x94,
0x1d, 0xb2, 0x63, 0xa1, 0x70, 0xe5, 0x0c, 0xb9, 0x99, 0xb6, 0x09, 0x4c, 0x60, 0x43, 0x6f, 0x31,
0x06, 0x84, 0x9e, 0xcb, 0xa0, 0x01, 0x37, 0xaa, 0x58, 0x7f, 0x57, 0x53, 0x8e, 0x9d, 0xcf, 0x9b,
0x11, 0x2e, 0x32, 0x97, 0x5c, 0xdb, 0xfa, 0xda, 0x60, 0x81, 0x7c, 0x74, 0xf4, 0xb2, 0xb9, 0x34,
0x4a, 0x25, 0x48, 0x92, 0x2a, 0x64, 0x61, 0x66, 0xef, 0xa3, 0xbd, 0x9d, 0xda, 0xa3, 0xf7, 0x0e,
0x0f, 0xf6, 0x76, 0xf6, 0xdf, 0xda, 0xdf, 0xdb, 0x9d, 0x89, 0xf1, 0xd7, 0x21, 0x45, 0xde, 0x3e,
0x94, 0x3f, 0x9e, 0xe1, 0x2a, 0xbf, 0xa6, 0x21, 0x51, 0xc5, 0x3a, 0xff, 0x18, 0xd2, 0xde, 0xef,
0xb2, 0xc2, 0xe0, 0x95, 0xc0, 0x37, 0x07, 0x85, 0xbb, 0x21, 0x00, 0xb6, 0x8f, 0x1a, 0xc0, 0x07,
0x7c, 0x17, 0xad, 0x04, 0xb9, 0x0f, 0xe2, 0x04, 0x29, 0x1a, 0x8e, 0x65, 0x7b, 0x02, 0x33, 0x03,
0x5f, 0x2b, 0xcb, 0x21, 0x31, 0x08, 0x4a, 0xb8, 0x1f, 0x05, 0xc5, 0xf2, 0x20, 0x98, 0x0b, 0xfa,
0xa0, 0xb8, 0x1b, 0x4a, 0x97, 0x02, 0x85, 0x72, 0x44, 0x20, 0x4b, 0x68, 0xc0, 0xec, 0xe0, 0x17,
0xc1, 0x9d, 0x90, 0x45, 0xa0, 0x30, 0x61, 0x2d, 0x12, 0x8c, 0xa5, 0xea, 0xc0, 0x7c, 0xf0, 0x45,
0xf3, 0x5e, 0x48, 0x9c, 0x1e, 0x54, 0x58, 0x8f, 0x0c, 0x65, 0x69, 0xbb, 0x70, 0x73, 0xc8, 0xe5,
0xbd, 0x14, 0x52, 0x2c, 0x0f, 0x56, 0xa8, 0x44, 0xc7, 0xb2, 0xcc, 0xdf, 0x73, 0x50, 0x08, 0xbb,
0x32, 0x6d, 0x44, 0x8a, 0xeb, 0x77, 0x12, 0x5e, 0x1f, 0xc1, 0x89, 0xb1, 0xfa, 0x9c, 0x83, 0xc5,
0xe1, 0x97, 0x92, 0xb5, 0x48, 0xa1, 0x59, 0xbf, 0x3d, 0xb8, 0x12, 0x9c, 0x71, 0xf8, 0x14, 0x32,
0x7d, 0x57, 0x05, 0x31, 0x28, 0x90, 0x1f, 0x23, 0x94, 0xc2, 0x31, 0xde, 0x0d, 0x3b, 0x30, 0x42,
0x03, 0x37, 0x6c, 0x3f, 0x2a, 0x78, 0xc3, 0x0e, 0x1b, 0x8a, 0xfc, 0x36, 0x24, 0xc9, 0x40, 0xcc,
0x05, 0x79, 0xd9, 0x16, 0xa1, 0x38, 0xcc, 0xe2, 0x8d, 0x41, 0xce, 0xd5, 0xc0, 0x18, 0xb6, 0x25,
0x38, 0x86, 0x77, 0x44, 0xf0, 0x0f, 0x01, 0x3c, 0xf3, 0x21, 0x1f, 0x84, 0xef, 0xd9, 0x85, 0x95,
0xcb, 0xed, 0x6e, 0xd4, 0xed, 0x37, 0x9f, 0x9d, 0xe7, 0xb9, 0xe7, 0xe7, 0x79, 0xee, 0xc5, 0x79,
0x9e, 0xfb, 0xee, 0x22, 0x1f, 0x7b, 0x7e, 0x91, 0x8f, 0xfd, 0x71, 0x91, 0x8f, 0x7d, 0xb2, 0xac,
0x1b, 0xd6, 0xd3, 0xce, 0x91, 0x54, 0x47, 0x4d, 0xe7, 0xd7, 0x3d, 0xe7, 0xcf, 0x1a, 0x56, 0x3f,
0x2b, 0x77, 0xe9, 0x2f, 0x78, 0x47, 0x13, 0xe4, 0x82, 0xb5, 0xf1, 0x6f, 0x00, 0x00, 0x00, 0xff,
0xff, 0x91, 0xea, 0x5a, 0x20, 0x4f, 0x14, 0x00, 0x00,
// 1271 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x4f, 0x6f, 0x1b, 0x45,
0x14, 0xf7, 0xda, 0x6e, 0xe2, 0x3c, 0xb7, 0x4e, 0xb2, 0x71, 0x1a, 0x67, 0xd3, 0xda, 0x66, 0x49,
0x93, 0xd4, 0x6a, 0xd6, 0xc4, 0xa1, 0x42, 0x0a, 0x08, 0x94, 0x3f, 0x06, 0x05, 0x61, 0x88, 0x36,
0x2d, 0x05, 0x2e, 0x66, 0xe3, 0xdd, 0x6e, 0x57, 0xd8, 0x1e, 0x6b, 0x67, 0x9d, 0x38, 0x47, 0x10,
0x07, 0xfe, 0x5c, 0x90, 0xfa, 0x05, 0x40, 0x7c, 0x01, 0x0e, 0xf9, 0x04, 0x70, 0xa9, 0x38, 0x55,
0x9c, 0x10, 0x07, 0x84, 0x92, 0x03, 0x57, 0x3e, 0x02, 0xda, 0x99, 0xdd, 0xb1, 0xd7, 0x5e, 0x67,
0x37, 0x96, 0x0b, 0xa7, 0xd6, 0xfb, 0x7e, 0xef, 0xbd, 0xdf, 0xef, 0xcd, 0x9b, 0x79, 0x33, 0x81,
0x4c, 0x0d, 0xe1, 0x06, 0xc2, 0x45, 0xdd, 0x44, 0xed, 0x56, 0xf1, 0x78, 0xa3, 0x68, 0x75, 0xa4,
0x96, 0x89, 0x2c, 0xc4, 0x4f, 0x53, 0x8b, 0x44, 0x2c, 0xd2, 0xf1, 0x86, 0x90, 0xd6, 0x91, 0x8e,
0x88, 0xad, 0x68, 0xff, 0x8f, 0xc2, 0x84, 0x45, 0x0a, 0xab, 0x52, 0x83, 0xe3, 0xe3, 0x98, 0x74,
0x84, 0xf4, 0xba, 0x56, 0x24, 0xbf, 0x8e, 0xda, 0x8f, 0x8b, 0x4a, 0xf3, 0xd4, 0x31, 0x2d, 0x0d,
0xa4, 0x3d, 0x6d, 0x69, 0xae, 0xdf, 0x82, 0x63, 0x6c, 0x60, 0xdd, 0x36, 0x35, 0xb0, 0x4e, 0x0d,
0xe2, 0x0f, 0x1c, 0xa4, 0x2a, 0x58, 0xdf, 0x35, 0x35, 0xc5, 0xd2, 0xde, 0xb1, 0x5d, 0x79, 0x09,
0xae, 0x29, 0x6a, 0xc3, 0x68, 0x66, 0xb8, 0x3c, 0xb7, 0x36, 0xb5, 0x93, 0xf9, 0xed, 0x6c, 0x3d,
0xed, 0x90, 0xd8, 0x56, 0x55, 0x53, 0xc3, 0xf8, 0xd0, 0x32, 0x8d, 0xa6, 0x2e, 0x53, 0x18, 0xff,
0x1a, 0x4c, 0x36, 0xb4, 0xc6, 0x91, 0x66, 0xe2, 0x4c, 0x34, 0x1f, 0x5b, 0x4b, 0x96, 0x16, 0xa4,
0x3e, 0x9d, 0x52, 0x85, 0xd8, 0x77, 0xe2, 0xcf, 0xfe, 0xcc, 0x45, 0x64, 0x17, 0xcd, 0x0b, 0x90,
0x68, 0x68, 0x96, 0xa2, 0x2a, 0x96, 0x92, 0x89, 0xd9, 0xb9, 0x64, 0xf6, 0x7b, 0x0b, 0xbe, 0xf8,
0xfb, 0xa7, 0x02, 0x4d, 0x20, 0x6e, 0xc2, 0x4d, 0x2f, 0x45, 0x59, 0xc3, 0x2d, 0xd4, 0xc4, 0x1a,
0xbf, 0x08, 0x09, 0x92, 0xa3, 0x6a, 0xa8, 0x84, 0x6d, 0x5c, 0x9e, 0x24, 0xbf, 0xf7, 0x55, 0xf1,
0x8c, 0x83, 0xf9, 0x0a, 0xd6, 0x1f, 0xb6, 0x54, 0xd7, 0xab, 0xe2, 0xa4, 0xbd, 0xaa, 0xbe, 0xde,
0x24, 0x51, 0x4f, 0x12, 0x7e, 0x0f, 0x52, 0x54, 0x4c, 0xb5, 0x4d, 0xf2, 0xe0, 0x4c, 0x2c, 0x4c,
0x05, 0x6e, 0x50, 0x27, 0xca, 0x0d, 0x7b, 0xb4, 0xe6, 0xe0, 0xb6, 0x2f, 0x6b, 0x57, 0xb2, 0xf8,
0x23, 0x07, 0x73, 0x5e, 0xc4, 0x36, 0x61, 0x39, 0x46, 0x55, 0xf7, 0x61, 0xaa, 0xa9, 0x9d, 0x54,
0x69, 0xb8, 0x58, 0x40, 0xb8, 0x44, 0x53, 0x3b, 0x21, 0x0c, 0x3c, 0x32, 0x6e, 0xc3, 0x92, 0x0f,
0x49, 0x26, 0xe2, 0x5b, 0x8e, 0x2c, 0xa9, 0x47, 0x26, 0x5d, 0xf8, 0x71, 0xea, 0x08, 0xdb, 0x5f,
0x79, 0xc8, 0xfa, 0x93, 0x61, 0x7c, 0xff, 0xe1, 0x20, 0xed, 0x6d, 0xc1, 0x03, 0x54, 0x37, 0x6a,
0xa7, 0xff, 0x11, 0x5b, 0x5e, 0x81, 0x69, 0x55, 0xab, 0x19, 0xd8, 0x40, 0xcd, 0x6a, 0x8b, 0x64,
0xce, 0xc4, 0xf3, 0xdc, 0x5a, 0xb2, 0x94, 0x96, 0xe8, 0x81, 0x20, 0xb9, 0x07, 0x82, 0xb4, 0xdd,
0x3c, 0xdd, 0x11, 0x7f, 0x3d, 0x5b, 0xcf, 0xf6, 0x77, 0xe0, 0x9e, 0x13, 0x80, 0x32, 0x97, 0x53,
0xaa, 0xe7, 0xf7, 0x56, 0xea, 0xab, 0xef, 0x73, 0x91, 0x9e, 0xa2, 0xc8, 0x70, 0xcb, 0x4f, 0x31,
0xdb, 0x7a, 0x25, 0x98, 0x54, 0xa8, 0xc2, 0x40, 0xed, 0x2e, 0x50, 0xfc, 0x83, 0x83, 0x45, 0x6f,
0xa5, 0x69, 0xd0, 0xd1, 0x3a, 0xf8, 0x5d, 0x48, 0xd3, 0x5a, 0xd2, 0x8a, 0x54, 0x5d, 0x3a, 0xd1,
0x00, 0x77, 0x5e, 0xef, 0xcd, 0x4c, 0x2c, 0xe3, 0x68, 0xf9, 0x2f, 0x63, 0x90, 0xf1, 0x56, 0xec,
0x91, 0x61, 0x3d, 0x19, 0xb1, 0x4f, 0x46, 0x3e, 0x53, 0xef, 0x40, 0x8a, 0x16, 0xa5, 0xaf, 0x97,
0x6e, 0xe8, 0x9e, 0x5d, 0x56, 0x82, 0x79, 0x4f, 0xed, 0x18, 0x3a, 0x4e, 0xd0, 0x73, 0x3d, 0x25,
0x62, 0x3e, 0x1b, 0x7d, 0x3e, 0x0a, 0x76, 0xea, 0x75, 0x2d, 0xcf, 0xad, 0x25, 0xbc, 0x65, 0xc5,
0x74, 0x49, 0x7d, 0xfa, 0x76, 0xe2, 0x05, 0xf7, 0xed, 0xd7, 0x1c, 0xe4, 0x87, 0x2d, 0x43, 0x88,
0xb9, 0x31, 0xce, 0xae, 0x12, 0x5f, 0x86, 0x97, 0x86, 0xb6, 0x3b, 0x3b, 0x5b, 0x9e, 0x46, 0x41,
0xf4, 0x43, 0x79, 0x75, 0xff, 0xaf, 0xbb, 0xc3, 0x67, 0x19, 0x63, 0x2f, 0x78, 0x19, 0xef, 0x41,
0x21, 0xb8, 0x28, 0xac, 0x86, 0x3f, 0x73, 0xe4, 0xb4, 0x1a, 0x80, 0x8f, 0x3c, 0x55, 0xc6, 0x59,
0xbd, 0xb0, 0x63, 0x68, 0x05, 0x96, 0x2f, 0xd3, 0xc0, 0xc4, 0x7e, 0x13, 0x85, 0xd9, 0x0a, 0xd6,
0x0f, 0xdb, 0x47, 0x0d, 0xc3, 0x3a, 0x30, 0x51, 0x0b, 0x61, 0xa5, 0x3e, 0x94, 0x31, 0x37, 0x02,
0xe3, 0x5b, 0x30, 0xd5, 0x22, 0x71, 0xdd, 0xf3, 0x67, 0x4a, 0xee, 0x7e, 0xb8, 0x74, 0x50, 0xbd,
0x62, 0xdb, 0x30, 0x56, 0x74, 0x0d, 0x67, 0xe2, 0xe4, 0xe0, 0xf2, 0x6d, 0x11, 0x99, 0xa1, 0xf8,
0xbb, 0x10, 0xd7, 0x3a, 0x5a, 0x8d, 0x1c, 0x22, 0xa9, 0xd2, 0xfc, 0xc0, 0x31, 0x57, 0xee, 0x68,
0x35, 0x99, 0x40, 0xb6, 0x78, 0xb7, 0x47, 0xba, 0x64, 0xc4, 0x37, 0xc8, 0x44, 0xf1, 0xd6, 0x82,
0x6d, 0xf3, 0x1c, 0x24, 0x5b, 0xce, 0xb7, 0xee, 0x4e, 0x07, 0xf7, 0xd3, 0xbe, 0x2a, 0x76, 0xc8,
0x5d, 0xca, 0x3e, 0x20, 0x54, 0x53, 0x39, 0x61, 0xb5, 0x0c, 0xf2, 0xeb, 0x1d, 0x7e, 0xd1, 0x90,
0xc3, 0x6f, 0xeb, 0xba, 0xcd, 0x9c, 0x8d, 0x42, 0x7a, 0x41, 0xea, 0xcf, 0xcc, 0xd6, 0xf8, 0x9c,
0x83, 0xc9, 0x0a, 0xd6, 0x3f, 0x44, 0x56, 0xb0, 0x0a, 0xbb, 0xb9, 0x8f, 0x91, 0xa5, 0x99, 0x81,
0x5c, 0x28, 0x8c, 0xdf, 0x84, 0x09, 0xd4, 0xb2, 0x0c, 0x44, 0x27, 0x5d, 0xaa, 0xb4, 0x34, 0x50,
0x74, 0x3b, 0xef, 0x07, 0x04, 0x22, 0x3b, 0x50, 0xcf, 0xaa, 0xc7, 0xfb, 0x56, 0xfd, 0x0a, 0x6b,
0x48, 0x1b, 0x9e, 0xf0, 0x10, 0x67, 0x61, 0xda, 0xd1, 0xc8, 0x74, 0x37, 0x88, 0x6c, 0x1b, 0x1f,
0x2c, 0xfb, 0x55, 0x48, 0xd8, 0x21, 0xdb, 0x16, 0x0a, 0x56, 0xce, 0x90, 0x5b, 0x49, 0x9b, 0xc0,
0x04, 0x36, 0xf4, 0xa6, 0x66, 0x8a, 0x32, 0x61, 0x40, 0xe8, 0xb9, 0x3d, 0xf3, 0x16, 0x4c, 0x98,
0x1a, 0x6e, 0xd7, 0x2d, 0x12, 0x33, 0x55, 0x5a, 0x1d, 0x50, 0xe3, 0x2e, 0x56, 0xd9, 0x09, 0x29,
0x13, 0xb8, 0xec, 0xb8, 0x89, 0x75, 0xb8, 0x51, 0xc1, 0xfa, 0x7b, 0x9a, 0x72, 0xec, 0xbc, 0xa7,
0x46, 0xb8, 0x29, 0x5d, 0x72, 0x4f, 0xec, 0xeb, 0xa3, 0x05, 0xf2, 0xca, 0xe9, 0x66, 0x73, 0x75,
0x14, 0x0a, 0x10, 0x27, 0x65, 0x4c, 0xc3, 0x4c, 0xf9, 0xa3, 0xf2, 0x6e, 0xf5, 0xe1, 0xfb, 0x87,
0x07, 0xe5, 0xdd, 0xfd, 0xb7, 0xf7, 0xcb, 0x7b, 0x33, 0x11, 0xfe, 0x3a, 0x24, 0xc8, 0xd7, 0x07,
0xf2, 0xc7, 0x33, 0x5c, 0xe9, 0x97, 0x24, 0xc4, 0x2a, 0x58, 0xe7, 0x1f, 0x41, 0xb2, 0xf7, 0x21,
0x98, 0x1b, 0xbc, 0x73, 0x78, 0x06, 0xab, 0xb0, 0x1a, 0x00, 0x60, 0x45, 0xad, 0x03, 0xef, 0xf3,
0x10, 0x5b, 0xf1, 0x73, 0x1f, 0xc4, 0x09, 0x52, 0x38, 0x1c, 0xcb, 0xf6, 0x18, 0x66, 0x06, 0x9e,
0x47, 0xcb, 0x01, 0x31, 0x08, 0x4a, 0xb8, 0x17, 0x06, 0xc5, 0xf2, 0x20, 0x98, 0xf3, 0x7b, 0xc1,
0xac, 0x06, 0xd2, 0xa5, 0x40, 0xa1, 0x18, 0x12, 0xc8, 0x12, 0x1a, 0x30, 0x3b, 0xf8, 0x04, 0xb9,
0x13, 0xb0, 0x08, 0x14, 0x26, 0xac, 0x87, 0x82, 0xb1, 0x54, 0x6d, 0x98, 0xf7, 0xbf, 0xc9, 0xde,
0x0d, 0x88, 0xd3, 0x85, 0x0a, 0x1b, 0xa1, 0xa1, 0x2c, 0x6d, 0x07, 0x6e, 0x0e, 0x79, 0x1d, 0x14,
0x02, 0x8a, 0xd5, 0x83, 0x15, 0x4a, 0xe1, 0xb1, 0x2c, 0xf3, 0x53, 0x0e, 0x72, 0x41, 0x77, 0xb0,
0xcd, 0x50, 0x71, 0xbd, 0x4e, 0xc2, 0xeb, 0x23, 0x38, 0x31, 0x56, 0x9f, 0x73, 0xb0, 0x38, 0xfc,
0x56, 0xb3, 0x1e, 0x2a, 0x34, 0xeb, 0xb7, 0xfb, 0x57, 0x82, 0x33, 0x0e, 0x9f, 0x42, 0xaa, 0xef,
0xae, 0x21, 0xfa, 0x05, 0xf2, 0x62, 0x84, 0x42, 0x30, 0xa6, 0x77, 0xc3, 0x0e, 0xcc, 0x60, 0xdf,
0x0d, 0xdb, 0x8f, 0xf2, 0xdf, 0xb0, 0xc3, 0xa6, 0x2a, 0xbf, 0x03, 0x71, 0x32, 0x51, 0x33, 0x7e,
0x5e, 0xb6, 0x45, 0xc8, 0x0f, 0xb3, 0xf4, 0xc6, 0x20, 0xe7, 0xaa, 0x6f, 0x0c, 0xdb, 0xe2, 0x1f,
0xc3, 0x33, 0x63, 0x1e, 0x00, 0xf4, 0xcc, 0x87, 0xac, 0x1f, 0xbe, 0x6b, 0x17, 0x56, 0x2e, 0xb7,
0xbb, 0x51, 0x77, 0xde, 0x7c, 0x76, 0x9e, 0xe5, 0x9e, 0x9f, 0x67, 0xb9, 0xbf, 0xce, 0xb3, 0xdc,
0x77, 0x17, 0xd9, 0xc8, 0xf3, 0x8b, 0x6c, 0xe4, 0xf7, 0x8b, 0x6c, 0xe4, 0x93, 0x65, 0xdd, 0xb0,
0x9e, 0xb4, 0x8f, 0xa4, 0x1a, 0x6a, 0x38, 0x7f, 0x4e, 0x74, 0xfe, 0x59, 0xc7, 0xea, 0x67, 0xc5,
0x0e, 0xfd, 0x93, 0xe1, 0xd1, 0x04, 0xb9, 0xa1, 0x6d, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xf1,
0xa7, 0x43, 0xdc, 0xc0, 0x14, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -1599,7 +1610,7 @@ type MsgClient interface {
UpdateGroupPolicyMetadata(ctx context.Context, in *MsgUpdateGroupPolicyMetadata, opts ...grpc.CallOption) (*MsgUpdateGroupPolicyMetadataResponse, error)
// SubmitProposal submits a new proposal.
SubmitProposal(ctx context.Context, in *MsgSubmitProposal, opts ...grpc.CallOption) (*MsgSubmitProposalResponse, error)
// WithdrawProposal aborts a proposal.
// WithdrawProposal withdraws a proposal.
WithdrawProposal(ctx context.Context, in *MsgWithdrawProposal, opts ...grpc.CallOption) (*MsgWithdrawProposalResponse, error)
// Vote allows a voter to vote on a proposal.
Vote(ctx context.Context, in *MsgVote, opts ...grpc.CallOption) (*MsgVoteResponse, error)
@ -1765,7 +1776,7 @@ type MsgServer interface {
UpdateGroupPolicyMetadata(context.Context, *MsgUpdateGroupPolicyMetadata) (*MsgUpdateGroupPolicyMetadataResponse, error)
// SubmitProposal submits a new proposal.
SubmitProposal(context.Context, *MsgSubmitProposal) (*MsgSubmitProposalResponse, error)
// WithdrawProposal aborts a proposal.
// WithdrawProposal withdraws a proposal.
WithdrawProposal(context.Context, *MsgWithdrawProposal) (*MsgWithdrawProposalResponse, error)
// Vote allows a voter to vote on a proposal.
Vote(context.Context, *MsgVote) (*MsgVoteResponse, error)
@ -3110,6 +3121,11 @@ func (m *MsgExecResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.Result != 0 {
i = encodeVarintTx(dAtA, i, uint64(m.Result))
i--
dAtA[i] = 0x10
}
return len(dAtA) - i, nil
}
@ -3609,6 +3625,9 @@ func (m *MsgExecResponse) Size() (n int) {
}
var l int
_ = l
if m.Result != 0 {
n += 1 + sovTx(uint64(m.Result))
}
return n
}
@ -6361,6 +6380,25 @@ func (m *MsgExecResponse) Unmarshal(dAtA []byte) error {
return fmt.Errorf("proto: MsgExecResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType)
}
m.Result = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTx
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Result |= ProposalExecutorResult(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipTx(dAtA[iNdEx:])

View File

@ -4,8 +4,6 @@ import (
"fmt"
"time"
proto "github.com/gogo/protobuf/proto"
"github.com/cosmos/cosmos-sdk/codec"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
@ -74,16 +72,16 @@ func (p ThresholdDecisionPolicy) Allow(tallyResult TallyResult, totalPower strin
threshold, err := math.NewPositiveDecFromString(p.Threshold)
if err != nil {
return DecisionPolicyResult{}, err
return DecisionPolicyResult{}, sdkerrors.Wrap(err, "threshold")
}
yesCount, err := math.NewNonNegativeDecFromString(tallyResult.YesCount)
if err != nil {
return DecisionPolicyResult{}, err
return DecisionPolicyResult{}, sdkerrors.Wrap(err, "yes count")
}
totalPowerDec, err := math.NewNonNegativeDecFromString(totalPower)
if err != nil {
return DecisionPolicyResult{}, err
return DecisionPolicyResult{}, sdkerrors.Wrap(err, "total power")
}
// the real threshold of the policy is `min(threshold,total_weight)`. If
@ -187,15 +185,15 @@ func (p PercentageDecisionPolicy) Allow(tally TallyResult, totalPower string, si
percentage, err := math.NewPositiveDecFromString(p.Percentage)
if err != nil {
return DecisionPolicyResult{}, err
return DecisionPolicyResult{}, sdkerrors.Wrap(err, "percentage")
}
yesCount, err := math.NewNonNegativeDecFromString(tally.YesCount)
if err != nil {
return DecisionPolicyResult{}, err
return DecisionPolicyResult{}, sdkerrors.Wrap(err, "yes count")
}
totalPowerDec, err := math.NewNonNegativeDecFromString(totalPower)
if err != nil {
return DecisionPolicyResult{}, err
return DecisionPolicyResult{}, sdkerrors.Wrap(err, "total power")
}
yesPercentage, err := yesCount.Quo(totalPowerDec)
@ -252,11 +250,7 @@ func NewGroupPolicyInfo(address sdk.AccAddress, group uint64, admin sdk.AccAddre
}
func (g *GroupPolicyInfo) SetDecisionPolicy(decisionPolicy DecisionPolicy) error {
msg, ok := decisionPolicy.(proto.Message)
if !ok {
return fmt.Errorf("can't proto marshal %T", msg)
}
any, err := codectypes.NewAnyWithValue(msg)
any, err := codectypes.NewAnyWithValue(decisionPolicy)
if err != nil {
return err
}
@ -264,12 +258,13 @@ func (g *GroupPolicyInfo) SetDecisionPolicy(decisionPolicy DecisionPolicy) error
return nil
}
func (g GroupPolicyInfo) GetDecisionPolicy() DecisionPolicy {
func (g GroupPolicyInfo) GetDecisionPolicy() (DecisionPolicy, error) {
decisionPolicy, ok := g.DecisionPolicy.GetCachedValue().(DecisionPolicy)
if !ok {
return nil
return nil, sdkerrors.ErrInvalidType.Wrapf("expected %T, got %T", (DecisionPolicy)(nil), g.DecisionPolicy.GetCachedValue())
}
return decisionPolicy
return decisionPolicy, nil
}
// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces
@ -329,11 +324,11 @@ func (g GroupPolicyInfo) ValidateBasic() error {
if g.Version == 0 {
return sdkerrors.Wrap(errors.ErrEmpty, "group policy version")
}
policy := g.GetDecisionPolicy()
if policy == nil {
return sdkerrors.Wrap(errors.ErrEmpty, "group policy's decision policy")
policy, err := g.GetDecisionPolicy()
if err != nil {
return sdkerrors.Wrap(err, "group policy decision policy")
}
if err := policy.ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "group policy's decision policy")
}

View File

@ -700,7 +700,7 @@ type Proposal struct {
// at this point, and the `final_tally_result`and `status` fields will be
// accordingly updated.
VotingPeriodEnd time.Time `protobuf:"bytes,10,opt,name=voting_period_end,json=votingPeriodEnd,proto3,stdtime" json:"voting_period_end"`
// executor_result is the final result based on the votes and election rule. Initial value is NotRun.
// executor_result is the final result of the proposal execution. Initial value is NotRun.
ExecutorResult ProposalExecutorResult `protobuf:"varint,11,opt,name=executor_result,json=executorResult,proto3,enum=cosmos.group.v1.ProposalExecutorResult" json:"executor_result,omitempty"`
// messages is a list of `sdk.Msg`s that will be executed if the proposal passes.
Messages []*types.Any `protobuf:"bytes,12,rep,name=messages,proto3" json:"messages,omitempty"`
@ -886,89 +886,89 @@ func init() {
func init() { proto.RegisterFile("cosmos/group/v1/types.proto", fileDescriptor_f5bddd15d7a54a9d) }
var fileDescriptor_f5bddd15d7a54a9d = []byte{
// 1306 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x4d, 0x6f, 0x1b, 0xc5,
0x1b, 0xf7, 0xda, 0x8e, 0x5f, 0x1e, 0xa7, 0xb6, 0xff, 0xd3, 0xfc, 0x9b, 0x4d, 0x52, 0xec, 0x60,
0x2a, 0x88, 0x8a, 0x6a, 0xb7, 0xae, 0x44, 0xa5, 0x1e, 0x00, 0xdb, 0xd9, 0x52, 0x57, 0xad, 0x6d,
0x76, 0xd7, 0x09, 0xe5, 0xb2, 0xda, 0x78, 0xa7, 0x9b, 0x15, 0xf6, 0x8e, 0xb5, 0x3b, 0x4e, 0xea,
0x6f, 0xd0, 0x0b, 0xa2, 0x47, 0x2e, 0x48, 0x95, 0xf8, 0x04, 0x48, 0x3d, 0x20, 0x2e, 0x5c, 0x2b,
0x0e, 0xa8, 0xe2, 0xc4, 0x09, 0x50, 0x7b, 0x29, 0x27, 0xbe, 0x02, 0xda, 0x99, 0xd9, 0xc4, 0x2f,
0x89, 0x69, 0x2a, 0x38, 0xc5, 0xf3, 0xfc, 0x7e, 0xcf, 0x33, 0xcf, 0xfb, 0x64, 0x61, 0xa3, 0x47,
0xfc, 0x01, 0xf1, 0x2b, 0xb6, 0x47, 0x46, 0xc3, 0xca, 0xc1, 0xb5, 0x0a, 0x1d, 0x0f, 0xb1, 0x5f,
0x1e, 0x7a, 0x84, 0x12, 0x94, 0xe3, 0x60, 0x99, 0x81, 0xe5, 0x83, 0x6b, 0xeb, 0x2b, 0x36, 0xb1,
0x09, 0xc3, 0x2a, 0xc1, 0x2f, 0x4e, 0x5b, 0x2f, 0xd8, 0x84, 0xd8, 0x7d, 0x5c, 0x61, 0xa7, 0xbd,
0xd1, 0x83, 0x8a, 0x35, 0xf2, 0x4c, 0xea, 0x10, 0x57, 0xe0, 0xc5, 0x59, 0x9c, 0x3a, 0x03, 0xec,
0x53, 0x73, 0x30, 0x14, 0x84, 0x35, 0x7e, 0x8f, 0xc1, 0x2d, 0x8b, 0x4b, 0x05, 0x34, 0xab, 0x6b,
0xba, 0x63, 0x0e, 0x95, 0xbe, 0x93, 0x20, 0x71, 0x0f, 0x0f, 0xf6, 0xb0, 0x87, 0xaa, 0x90, 0x34,
0x2d, 0xcb, 0xc3, 0xbe, 0x2f, 0x4b, 0x9b, 0xd2, 0x56, 0xba, 0x2e, 0xff, 0xf2, 0xf4, 0xca, 0x8a,
0x30, 0x54, 0xe3, 0x88, 0x46, 0x3d, 0xc7, 0xb5, 0xd5, 0x90, 0x88, 0x2e, 0x40, 0xe2, 0x10, 0x3b,
0xf6, 0x3e, 0x95, 0xa3, 0x81, 0x8a, 0x2a, 0x4e, 0x68, 0x1d, 0x52, 0x03, 0x4c, 0x4d, 0xcb, 0xa4,
0xa6, 0x1c, 0x63, 0xc8, 0xd1, 0x19, 0x7d, 0x04, 0x29, 0xd3, 0xb2, 0xb0, 0x65, 0x98, 0x54, 0x8e,
0x6f, 0x4a, 0x5b, 0x99, 0xea, 0x7a, 0x99, 0x3b, 0x58, 0x0e, 0x1d, 0x2c, 0xeb, 0x61, 0x70, 0xf5,
0xd4, 0xb3, 0xdf, 0x8a, 0x91, 0xc7, 0xbf, 0x17, 0x25, 0x76, 0x29, 0xb6, 0x6a, 0xb4, 0x54, 0x87,
0x24, 0x77, 0xd9, 0x47, 0x37, 0x20, 0x39, 0xe0, 0x3f, 0x65, 0x69, 0x33, 0xb6, 0x95, 0xa9, 0xae,
0x96, 0x67, 0xd2, 0x5d, 0xe6, 0xd4, 0x7a, 0x3c, 0xb0, 0xa3, 0x86, 0xec, 0xd2, 0x97, 0x12, 0xac,
0xea, 0xfb, 0x1e, 0xf6, 0xf7, 0x49, 0xdf, 0xda, 0xc6, 0x3d, 0xc7, 0x77, 0x88, 0xdb, 0x21, 0x7d,
0xa7, 0x37, 0x46, 0x17, 0x21, 0x4d, 0x43, 0x88, 0xa7, 0x42, 0x3d, 0x16, 0xa0, 0x8f, 0x21, 0x79,
0xe8, 0xb8, 0x16, 0x39, 0xf4, 0x59, 0xcc, 0x99, 0xea, 0xbb, 0x73, 0x57, 0x4e, 0xdb, 0xdb, 0xe5,
0x6c, 0x35, 0x54, 0xbb, 0x89, 0x7e, 0x7a, 0x7a, 0x25, 0x3b, 0xcd, 0x29, 0x3d, 0x96, 0x40, 0xee,
0x60, 0xaf, 0x87, 0x5d, 0x6a, 0xda, 0x78, 0xc6, 0xa1, 0x02, 0xc0, 0xf0, 0x08, 0x13, 0x1e, 0x4d,
0x48, 0xfe, 0x23, 0x97, 0xbe, 0x97, 0xe0, 0xff, 0x27, 0xaa, 0xa1, 0xdb, 0x70, 0xee, 0x80, 0x50,
0xc7, 0xb5, 0x8d, 0x21, 0xf6, 0x1c, 0xc2, 0x93, 0x94, 0xa9, 0xae, 0xcd, 0x95, 0x71, 0x5b, 0xf4,
0x30, 0xaf, 0xe2, 0xd7, 0x41, 0x15, 0x97, 0xb9, 0x66, 0x87, 0x29, 0xa2, 0x2e, 0xac, 0x0c, 0x1c,
0xd7, 0xc0, 0x0f, 0x71, 0x6f, 0x14, 0x10, 0x43, 0x83, 0xd1, 0xd7, 0x37, 0x88, 0x06, 0x8e, 0xab,
0x84, 0xfa, 0xdc, 0x6c, 0xe9, 0x4f, 0x09, 0xd2, 0x9f, 0x04, 0xa1, 0x37, 0xdd, 0x07, 0x04, 0x65,
0x21, 0xea, 0x70, 0x1f, 0xe3, 0x6a, 0xd4, 0xb1, 0x50, 0x19, 0x96, 0x4c, 0x6b, 0xe0, 0xb8, 0xbc,
0x67, 0x17, 0xb4, 0x39, 0xa7, 0x2d, 0x6c, 0x66, 0x19, 0x92, 0x07, 0xd8, 0x0b, 0x52, 0xc4, 0x7a,
0x39, 0xae, 0x86, 0x47, 0xf4, 0x36, 0x2c, 0x53, 0x42, 0xcd, 0xbe, 0x21, 0x06, 0x64, 0x89, 0x69,
0x66, 0x98, 0x6c, 0x97, 0x4f, 0x49, 0x03, 0xa0, 0xe7, 0x61, 0x93, 0xf2, 0x59, 0x48, 0x9c, 0x61,
0x16, 0xd2, 0x42, 0xaf, 0x46, 0x4b, 0xf7, 0x21, 0xc3, 0x42, 0x15, 0x53, 0xbc, 0x06, 0x29, 0x56,
0x74, 0xe3, 0x28, 0xe4, 0x24, 0x3b, 0x37, 0x2d, 0x54, 0x81, 0x04, 0x6f, 0x7f, 0x91, 0xde, 0xd3,
0x66, 0x45, 0x15, 0xb4, 0xd2, 0xab, 0x28, 0xe4, 0x98, 0x6d, 0x5e, 0x7e, 0x96, 0xcc, 0x37, 0xd9,
0x12, 0x93, 0x3e, 0x45, 0xa7, 0x7d, 0x3a, 0xaa, 0x45, 0xec, 0xec, 0xb5, 0x88, 0x9f, 0x5e, 0x8b,
0xa5, 0xe9, 0x5a, 0x7c, 0x0a, 0x39, 0x4b, 0x74, 0xb2, 0x31, 0x64, 0xb1, 0x88, 0x6c, 0xaf, 0xcc,
0x65, 0xbb, 0xe6, 0x8e, 0xeb, 0x27, 0x4c, 0x83, 0x9a, 0xb5, 0xa6, 0x67, 0x72, 0xba, 0x76, 0xc9,
0x37, 0xaa, 0xdd, 0xcd, 0xd4, 0xa3, 0x27, 0xc5, 0xc8, 0xab, 0x27, 0x45, 0xa9, 0xf4, 0xe3, 0x12,
0xa4, 0x3a, 0x1e, 0x19, 0x12, 0xdf, 0xec, 0xcf, 0x35, 0xec, 0x1d, 0x58, 0xe1, 0xf9, 0xe3, 0xbe,
0x1b, 0x61, 0x01, 0xfe, 0xa9, 0x7f, 0x91, 0x7d, 0x5c, 0x3c, 0x81, 0x2c, 0x6c, 0xe6, 0x0f, 0x20,
0x3d, 0x64, 0x3e, 0x04, 0xfb, 0x34, 0xbe, 0x19, 0x5b, 0x68, 0xfc, 0x98, 0x8a, 0x14, 0xc8, 0xf8,
0xa3, 0xbd, 0x81, 0x43, 0x8d, 0xe0, 0x51, 0x62, 0xc9, 0x7f, 0xdd, 0x64, 0x00, 0x57, 0x0c, 0x20,
0xf4, 0x0e, 0x9c, 0xe3, 0x61, 0x86, 0x55, 0x4c, 0xb0, 0x0c, 0x2c, 0x33, 0xe1, 0x8e, 0x28, 0xe5,
0xd5, 0x99, 0x5c, 0x84, 0xdc, 0x24, 0xe3, 0x4e, 0x46, 0x1c, 0x6a, 0xdc, 0x80, 0x84, 0x4f, 0x4d,
0x3a, 0xf2, 0xe5, 0xd4, 0xa6, 0xb4, 0x95, 0xad, 0x16, 0xe7, 0xda, 0x3e, 0x4c, 0xbc, 0xc6, 0x68,
0xaa, 0xa0, 0xa3, 0x0e, 0xa0, 0x07, 0x8e, 0x6b, 0xf6, 0x0d, 0x6a, 0xf6, 0xfb, 0x63, 0xc3, 0xc3,
0xfe, 0xa8, 0x4f, 0xe5, 0x34, 0x8b, 0xee, 0xe2, 0x9c, 0x11, 0x3d, 0x20, 0xa9, 0x8c, 0x23, 0x1e,
0x9b, 0x3c, 0xd3, 0x9e, 0x90, 0xa3, 0x0e, 0xfc, 0x6f, 0x6a, 0x71, 0x1a, 0xd8, 0xb5, 0x64, 0x38,
0x43, 0xba, 0x72, 0x93, 0xdb, 0x53, 0x71, 0x2d, 0xd4, 0x81, 0x1c, 0x5f, 0x9e, 0xc4, 0x0b, 0x1d,
0xcc, 0xb0, 0x28, 0xdf, 0x3b, 0x35, 0x4a, 0x45, 0xf0, 0xb9, 0x4f, 0x6a, 0x16, 0x4f, 0x9d, 0xd1,
0xd5, 0xa0, 0x41, 0x7c, 0xdf, 0xb4, 0xb1, 0x2f, 0x2f, 0xb3, 0x37, 0xf5, 0xc4, 0x21, 0x51, 0x8f,
0x58, 0x37, 0xe3, 0x41, 0x17, 0x97, 0xbe, 0x91, 0x20, 0x33, 0x19, 0xeb, 0x06, 0xa4, 0xc7, 0xd8,
0x37, 0x7a, 0x64, 0xe4, 0x52, 0xf1, 0x66, 0xa5, 0xc6, 0xd8, 0x6f, 0x04, 0xe7, 0xa0, 0xd4, 0xe6,
0x9e, 0x4f, 0x4d, 0xc7, 0x15, 0x04, 0xfe, 0xef, 0xc3, 0xb2, 0x10, 0x72, 0xd2, 0x1a, 0xa4, 0x5c,
0x22, 0x70, 0xde, 0xaa, 0x49, 0x97, 0x70, 0xe8, 0x7d, 0x40, 0x2e, 0x31, 0x0e, 0x1d, 0xba, 0x6f,
0x1c, 0x60, 0x1a, 0x92, 0xf8, 0x42, 0xc8, 0xb9, 0x64, 0xd7, 0xa1, 0xfb, 0x3b, 0x98, 0x72, 0xb2,
0xf0, 0xef, 0x2f, 0x09, 0xe2, 0x3b, 0x84, 0x62, 0x54, 0x84, 0xcc, 0x50, 0xa4, 0xe2, 0x78, 0x49,
0x42, 0x28, 0xe2, 0x3b, 0xe9, 0x80, 0x50, 0xb1, 0x26, 0x17, 0xee, 0x24, 0x46, 0x43, 0xd7, 0x21,
0x41, 0x86, 0xc1, 0xeb, 0xc3, 0xbc, 0xcc, 0x56, 0x37, 0xe6, 0x52, 0x1f, 0xdc, 0xdb, 0x66, 0x14,
0x55, 0x50, 0x17, 0x2e, 0xb2, 0x7f, 0x67, 0x9e, 0x2e, 0x7f, 0x25, 0x01, 0x1c, 0xdf, 0x8c, 0x36,
0x60, 0x75, 0xa7, 0xad, 0x2b, 0x46, 0xbb, 0xa3, 0x37, 0xdb, 0x2d, 0xa3, 0xdb, 0xd2, 0x3a, 0x4a,
0xa3, 0x79, 0xab, 0xa9, 0x6c, 0xe7, 0x23, 0xe8, 0x3c, 0xe4, 0x26, 0xc1, 0xfb, 0x8a, 0x96, 0x97,
0xd0, 0x2a, 0x9c, 0x9f, 0x14, 0xd6, 0xea, 0x9a, 0x5e, 0x6b, 0xb6, 0xf2, 0x51, 0x84, 0x20, 0x3b,
0x09, 0xb4, 0xda, 0xf9, 0x18, 0xba, 0x08, 0xf2, 0xb4, 0xcc, 0xd8, 0x6d, 0xea, 0xb7, 0x8d, 0x1d,
0x45, 0x6f, 0xe7, 0xe3, 0xeb, 0xf1, 0x47, 0xdf, 0x16, 0x22, 0x97, 0x7f, 0x96, 0x20, 0x3b, 0x3d,
0x6c, 0xa8, 0x08, 0x1b, 0x1d, 0xb5, 0xdd, 0x69, 0x6b, 0xb5, 0xbb, 0x86, 0xa6, 0xd7, 0xf4, 0xae,
0x36, 0xe3, 0xd9, 0x5b, 0xb0, 0x36, 0x4b, 0xd0, 0xba, 0xf5, 0x7b, 0x4d, 0x5d, 0x57, 0xb6, 0xf3,
0x52, 0x70, 0xed, 0x2c, 0x5c, 0x6b, 0x34, 0x94, 0x4e, 0x80, 0x46, 0x4f, 0x42, 0x55, 0xe5, 0x8e,
0xd2, 0x08, 0xd0, 0x58, 0x90, 0x91, 0x39, 0xdd, 0x7a, 0x5b, 0x0d, 0xc0, 0xf8, 0x49, 0xf7, 0x06,
0x01, 0x6d, 0xab, 0xb5, 0xdd, 0x56, 0x7e, 0x49, 0x04, 0xf4, 0x83, 0x04, 0x17, 0x4e, 0x9e, 0x2b,
0xb4, 0x05, 0x97, 0x8e, 0xf4, 0x95, 0xcf, 0x94, 0x46, 0x57, 0x6f, 0xab, 0x86, 0xaa, 0x68, 0xdd,
0xbb, 0xfa, 0x4c, 0x84, 0x97, 0x60, 0xf3, 0x54, 0x66, 0xab, 0xad, 0x1b, 0x6a, 0xb7, 0x95, 0x97,
0x16, 0xb2, 0xb4, 0x6e, 0xa3, 0xa1, 0x68, 0x5a, 0x3e, 0xba, 0x90, 0x75, 0xab, 0xd6, 0xbc, 0xdb,
0x55, 0x95, 0x7c, 0x8c, 0x3b, 0x5f, 0xff, 0xf0, 0xd9, 0x8b, 0x82, 0xf4, 0xfc, 0x45, 0x41, 0xfa,
0xe3, 0x45, 0x41, 0x7a, 0xfc, 0xb2, 0x10, 0x79, 0xfe, 0xb2, 0x10, 0xf9, 0xf5, 0x65, 0x21, 0xf2,
0xf9, 0x25, 0xdb, 0xa1, 0xfb, 0xa3, 0xbd, 0x72, 0x8f, 0x0c, 0xc4, 0x97, 0x84, 0xf8, 0x73, 0xc5,
0xb7, 0xbe, 0xa8, 0x3c, 0xe4, 0x1f, 0x3a, 0x7b, 0x09, 0xd6, 0x89, 0xd7, 0xff, 0x0e, 0x00, 0x00,
0xff, 0xff, 0x5b, 0x5c, 0x1c, 0x07, 0xff, 0x0c, 0x00, 0x00,
// 1311 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0xcf, 0x6f, 0x1b, 0xc5,
0x17, 0xf7, 0xda, 0x8e, 0x7f, 0x3c, 0xa7, 0xb6, 0xbf, 0xd3, 0x7c, 0x9b, 0x4d, 0x52, 0xec, 0x60,
0x2a, 0x88, 0x8a, 0x62, 0xb7, 0xae, 0x44, 0xa5, 0x1e, 0x00, 0xdb, 0xd9, 0x52, 0x57, 0xad, 0x6d,
0xed, 0xae, 0x13, 0xca, 0x65, 0xb5, 0xf1, 0x4e, 0x37, 0x2b, 0xec, 0x1d, 0x6b, 0x77, 0x9c, 0xd4,
0xff, 0x41, 0x2f, 0x88, 0x1e, 0xb9, 0x20, 0x55, 0xe2, 0x2f, 0x40, 0xea, 0x01, 0x71, 0xe1, 0x5a,
0xf5, 0x80, 0x2a, 0x4e, 0x9c, 0x00, 0xb5, 0x17, 0x38, 0x71, 0xe5, 0x88, 0x76, 0x66, 0x36, 0xf1,
0x8f, 0xc4, 0xb4, 0x15, 0x9c, 0xe2, 0x79, 0x9f, 0xcf, 0x7b, 0xf3, 0x7e, 0x4f, 0x16, 0x36, 0x7a,
0xc4, 0x1f, 0x10, 0xbf, 0x62, 0x7b, 0x64, 0x34, 0xac, 0x1c, 0x5e, 0xad, 0xd0, 0xf1, 0x10, 0xfb,
0xe5, 0xa1, 0x47, 0x28, 0x41, 0x39, 0x0e, 0x96, 0x19, 0x58, 0x3e, 0xbc, 0xba, 0xbe, 0x62, 0x13,
0x9b, 0x30, 0xac, 0x12, 0xfc, 0xe2, 0xb4, 0xf5, 0x82, 0x4d, 0x88, 0xdd, 0xc7, 0x15, 0x76, 0xda,
0x1f, 0xdd, 0xaf, 0x58, 0x23, 0xcf, 0xa4, 0x0e, 0x71, 0x05, 0x5e, 0x9c, 0xc5, 0xa9, 0x33, 0xc0,
0x3e, 0x35, 0x07, 0x43, 0x41, 0x58, 0xe3, 0xf7, 0x18, 0xdc, 0xb2, 0xb8, 0x54, 0x40, 0xb3, 0xba,
0xa6, 0x3b, 0xe6, 0x50, 0xe9, 0x5b, 0x09, 0x12, 0x77, 0xf1, 0x60, 0x1f, 0x7b, 0xa8, 0x0a, 0x49,
0xd3, 0xb2, 0x3c, 0xec, 0xfb, 0xb2, 0xb4, 0x29, 0x6d, 0xa5, 0xeb, 0xf2, 0x4f, 0x4f, 0xb6, 0x57,
0x84, 0xa1, 0x1a, 0x47, 0x34, 0xea, 0x39, 0xae, 0xad, 0x86, 0x44, 0x74, 0x01, 0x12, 0x47, 0xd8,
0xb1, 0x0f, 0xa8, 0x1c, 0x0d, 0x54, 0x54, 0x71, 0x42, 0xeb, 0x90, 0x1a, 0x60, 0x6a, 0x5a, 0x26,
0x35, 0xe5, 0x18, 0x43, 0x8e, 0xcf, 0xe8, 0x23, 0x48, 0x99, 0x96, 0x85, 0x2d, 0xc3, 0xa4, 0x72,
0x7c, 0x53, 0xda, 0xca, 0x54, 0xd7, 0xcb, 0xdc, 0xc1, 0x72, 0xe8, 0x60, 0x59, 0x0f, 0x83, 0xab,
0xa7, 0x9e, 0xfe, 0x52, 0x8c, 0x3c, 0xfa, 0xb5, 0x28, 0xb1, 0x4b, 0xb1, 0x55, 0xa3, 0xa5, 0x3a,
0x24, 0xb9, 0xcb, 0x3e, 0xba, 0x0e, 0xc9, 0x01, 0xff, 0x29, 0x4b, 0x9b, 0xb1, 0xad, 0x4c, 0x75,
0xb5, 0x3c, 0x93, 0xee, 0x32, 0xa7, 0xd6, 0xe3, 0x81, 0x1d, 0x35, 0x64, 0x97, 0xbe, 0x90, 0x60,
0x55, 0x3f, 0xf0, 0xb0, 0x7f, 0x40, 0xfa, 0xd6, 0x0e, 0xee, 0x39, 0xbe, 0x43, 0xdc, 0x0e, 0xe9,
0x3b, 0xbd, 0x31, 0xba, 0x08, 0x69, 0x1a, 0x42, 0x3c, 0x15, 0xea, 0x89, 0x00, 0x7d, 0x0c, 0xc9,
0x23, 0xc7, 0xb5, 0xc8, 0x91, 0xcf, 0x62, 0xce, 0x54, 0xdf, 0x9d, 0xbb, 0x72, 0xda, 0xde, 0x1e,
0x67, 0xab, 0xa1, 0xda, 0x0d, 0xf4, 0xec, 0xc9, 0x76, 0x76, 0x9a, 0x53, 0x7a, 0x24, 0x81, 0xdc,
0xc1, 0x5e, 0x0f, 0xbb, 0xd4, 0xb4, 0xf1, 0x8c, 0x43, 0x05, 0x80, 0xe1, 0x31, 0x26, 0x3c, 0x9a,
0x90, 0xfc, 0x47, 0x2e, 0x7d, 0x27, 0xc1, 0xff, 0x4f, 0x55, 0x43, 0xb7, 0xe0, 0xdc, 0x21, 0xa1,
0x8e, 0x6b, 0x1b, 0x43, 0xec, 0x39, 0x84, 0x27, 0x29, 0x53, 0x5d, 0x9b, 0x2b, 0xe3, 0x8e, 0xe8,
0x61, 0x5e, 0xc5, 0xaf, 0x82, 0x2a, 0x2e, 0x73, 0xcd, 0x0e, 0x53, 0x44, 0x5d, 0x58, 0x19, 0x38,
0xae, 0x81, 0x1f, 0xe0, 0xde, 0x28, 0x20, 0x86, 0x06, 0xa3, 0xaf, 0x6e, 0x10, 0x0d, 0x1c, 0x57,
0x09, 0xf5, 0xb9, 0xd9, 0xd2, 0x1f, 0x12, 0xa4, 0x3f, 0x09, 0x42, 0x6f, 0xba, 0xf7, 0x09, 0xca,
0x42, 0xd4, 0xe1, 0x3e, 0xc6, 0xd5, 0xa8, 0x63, 0xa1, 0x32, 0x2c, 0x99, 0xd6, 0xc0, 0x71, 0x79,
0xcf, 0x2e, 0x68, 0x73, 0x4e, 0x5b, 0xd8, 0xcc, 0x32, 0x24, 0x0f, 0xb1, 0x17, 0xa4, 0x88, 0xf5,
0x72, 0x5c, 0x0d, 0x8f, 0xe8, 0x6d, 0x58, 0xa6, 0x84, 0x9a, 0x7d, 0x43, 0x0c, 0xc8, 0x12, 0xd3,
0xcc, 0x30, 0xd9, 0x1e, 0x9f, 0x92, 0x06, 0x40, 0xcf, 0xc3, 0x26, 0xe5, 0xb3, 0x90, 0x78, 0x8d,
0x59, 0x48, 0x0b, 0xbd, 0x1a, 0x2d, 0xdd, 0x83, 0x0c, 0x0b, 0x55, 0x4c, 0xf1, 0x1a, 0xa4, 0x58,
0xd1, 0x8d, 0xe3, 0x90, 0x93, 0xec, 0xdc, 0xb4, 0x50, 0x05, 0x12, 0xbc, 0xfd, 0x45, 0x7a, 0xcf,
0x9a, 0x15, 0x55, 0xd0, 0x4a, 0x7f, 0x45, 0x21, 0xc7, 0x6c, 0xf3, 0xf2, 0xb3, 0x64, 0xbe, 0xc9,
0x96, 0x98, 0xf4, 0x29, 0x3a, 0xed, 0xd3, 0x71, 0x2d, 0x62, 0xaf, 0x5f, 0x8b, 0xf8, 0xd9, 0xb5,
0x58, 0x9a, 0xae, 0x85, 0x09, 0x39, 0x4b, 0x74, 0xb2, 0x31, 0x64, 0xb1, 0x88, 0x6c, 0xaf, 0xcc,
0x65, 0xbb, 0xe6, 0x8e, 0xeb, 0xa5, 0x67, 0x4f, 0xb6, 0x0b, 0x8b, 0x27, 0x48, 0xcd, 0x5a, 0xd3,
0x33, 0x3a, 0x5d, 0xcb, 0xe4, 0x1b, 0xd5, 0xf2, 0x46, 0xea, 0xe1, 0xe3, 0x62, 0xe4, 0xf7, 0xc7,
0x45, 0xa9, 0xf4, 0xc3, 0x12, 0xa4, 0x3a, 0x1e, 0x19, 0x12, 0xdf, 0xec, 0xcf, 0x35, 0xf0, 0x6d,
0x58, 0xe1, 0xf9, 0xe4, 0xb1, 0x18, 0x61, 0x41, 0xfe, 0xa9, 0x9f, 0x91, 0x7d, 0x52, 0x4c, 0x81,
0x2c, 0x6c, 0xee, 0x0f, 0x20, 0x3d, 0x64, 0x3e, 0x04, 0xfb, 0x35, 0xbe, 0x19, 0x5b, 0x68, 0xfc,
0x84, 0x8a, 0x14, 0xc8, 0xf8, 0xa3, 0xfd, 0x81, 0x43, 0x8d, 0xe0, 0x91, 0x62, 0xc5, 0x78, 0xd5,
0x64, 0x00, 0x57, 0x0c, 0x20, 0xf4, 0x0e, 0x9c, 0xe3, 0x61, 0x86, 0x55, 0x4d, 0xb0, 0x0c, 0x2c,
0x33, 0xe1, 0xae, 0x28, 0xed, 0x95, 0x99, 0x5c, 0x84, 0xdc, 0x24, 0xe3, 0x4e, 0x46, 0x1c, 0x6a,
0x5c, 0x87, 0x84, 0x4f, 0x4d, 0x3a, 0xf2, 0xe5, 0xd4, 0xa6, 0xb4, 0x95, 0xad, 0x16, 0xe7, 0xc6,
0x20, 0x4c, 0xbc, 0xc6, 0x68, 0xaa, 0xa0, 0xa3, 0x0e, 0xa0, 0xfb, 0x8e, 0x6b, 0xf6, 0x0d, 0x6a,
0xf6, 0xfb, 0x63, 0xc3, 0xc3, 0xfe, 0xa8, 0x4f, 0xe5, 0x34, 0x8b, 0xee, 0xe2, 0x9c, 0x11, 0x3d,
0x20, 0xa9, 0x8c, 0x23, 0x1e, 0x9f, 0x3c, 0xd3, 0x9e, 0x90, 0xa3, 0x0e, 0xfc, 0x6f, 0x6a, 0x91,
0x1a, 0xd8, 0xb5, 0x64, 0x78, 0x8d, 0x74, 0xe5, 0x26, 0xb7, 0xa9, 0xe2, 0x5a, 0xa8, 0x03, 0x39,
0xbe, 0x4c, 0x89, 0x17, 0x3a, 0x98, 0x61, 0x51, 0xbe, 0x77, 0x66, 0x94, 0x8a, 0xe0, 0x73, 0x9f,
0xd4, 0x2c, 0x9e, 0x3a, 0xa3, 0x2b, 0x41, 0x83, 0xf8, 0xbe, 0x69, 0x63, 0x5f, 0x5e, 0x66, 0x6f,
0xec, 0xa9, 0x43, 0xa3, 0x1e, 0xb3, 0x6e, 0xc4, 0x83, 0x2e, 0x2e, 0x7d, 0x2d, 0x41, 0x66, 0x32,
0xd6, 0x0d, 0x48, 0x8f, 0xb1, 0x6f, 0xf4, 0xc8, 0xc8, 0xa5, 0xe2, 0x0d, 0x4b, 0x8d, 0xb1, 0xdf,
0x08, 0xce, 0x41, 0xa9, 0xcd, 0x7d, 0x9f, 0x9a, 0x8e, 0x2b, 0x08, 0xfc, 0xdf, 0x89, 0x65, 0x21,
0xe4, 0xa4, 0x35, 0x48, 0xb9, 0x44, 0xe0, 0xbc, 0x55, 0x93, 0x2e, 0xe1, 0xd0, 0xfb, 0x80, 0x5c,
0x62, 0x1c, 0x39, 0xf4, 0xc0, 0x38, 0xc4, 0x34, 0x24, 0xf1, 0x05, 0x91, 0x73, 0xc9, 0x9e, 0x43,
0x0f, 0x76, 0x31, 0xe5, 0x64, 0xe1, 0xdf, 0x9f, 0x12, 0xc4, 0x77, 0x09, 0xc5, 0xa8, 0x08, 0x99,
0xa1, 0x48, 0xc5, 0xc9, 0xd2, 0x84, 0x50, 0xc4, 0x77, 0xd4, 0x21, 0xa1, 0x62, 0x6d, 0x2e, 0xdc,
0x51, 0x8c, 0x86, 0xae, 0x41, 0x82, 0x0c, 0x83, 0xd7, 0x88, 0x79, 0x99, 0xad, 0x6e, 0xcc, 0xa5,
0x3e, 0xb8, 0xb7, 0xcd, 0x28, 0xaa, 0xa0, 0x2e, 0x5c, 0x6c, 0xff, 0xce, 0x3c, 0x5d, 0xfe, 0x52,
0x02, 0x38, 0xb9, 0x19, 0x6d, 0xc0, 0xea, 0x6e, 0x5b, 0x57, 0x8c, 0x76, 0x47, 0x6f, 0xb6, 0x5b,
0x46, 0xb7, 0xa5, 0x75, 0x94, 0x46, 0xf3, 0x66, 0x53, 0xd9, 0xc9, 0x47, 0xd0, 0x79, 0xc8, 0x4d,
0x82, 0xf7, 0x14, 0x2d, 0x2f, 0xa1, 0x55, 0x38, 0x3f, 0x29, 0xac, 0xd5, 0x35, 0xbd, 0xd6, 0x6c,
0xe5, 0xa3, 0x08, 0x41, 0x76, 0x12, 0x68, 0xb5, 0xf3, 0x31, 0x74, 0x11, 0xe4, 0x69, 0x99, 0xb1,
0xd7, 0xd4, 0x6f, 0x19, 0xbb, 0x8a, 0xde, 0xce, 0xc7, 0xd7, 0xe3, 0x0f, 0xbf, 0x29, 0x44, 0x2e,
0xff, 0x28, 0x41, 0x76, 0x7a, 0xd8, 0x50, 0x11, 0x36, 0x3a, 0x6a, 0xbb, 0xd3, 0xd6, 0x6a, 0x77,
0x0c, 0x4d, 0xaf, 0xe9, 0x5d, 0x6d, 0xc6, 0xb3, 0xb7, 0x60, 0x6d, 0x96, 0xa0, 0x75, 0xeb, 0x77,
0x9b, 0xba, 0xae, 0xec, 0xe4, 0xa5, 0xe0, 0xda, 0x59, 0xb8, 0xd6, 0x68, 0x28, 0x9d, 0x00, 0x8d,
0x9e, 0x86, 0xaa, 0xca, 0x6d, 0xa5, 0x11, 0xa0, 0xb1, 0x20, 0x23, 0x73, 0xba, 0xf5, 0xb6, 0x1a,
0x80, 0xf1, 0xd3, 0xee, 0x0d, 0x02, 0xda, 0x51, 0x6b, 0x7b, 0xad, 0xfc, 0x92, 0x08, 0xe8, 0x7b,
0x09, 0x2e, 0x9c, 0x3e, 0x57, 0x68, 0x0b, 0x2e, 0x1d, 0xeb, 0x2b, 0x9f, 0x2a, 0x8d, 0xae, 0xde,
0x56, 0x0d, 0x55, 0xd1, 0xba, 0x77, 0xf4, 0x99, 0x08, 0x2f, 0xc1, 0xe6, 0x99, 0xcc, 0x56, 0x5b,
0x37, 0xd4, 0x6e, 0x2b, 0x2f, 0x2d, 0x64, 0x69, 0xdd, 0x46, 0x43, 0xd1, 0xb4, 0x7c, 0x74, 0x21,
0xeb, 0x66, 0xad, 0x79, 0xa7, 0xab, 0x2a, 0xf9, 0x18, 0x77, 0xbe, 0xfe, 0xe1, 0xd3, 0x17, 0x05,
0xe9, 0xf9, 0x8b, 0x82, 0xf4, 0xdb, 0x8b, 0x82, 0xf4, 0xe8, 0x65, 0x21, 0xf2, 0xfc, 0x65, 0x21,
0xf2, 0xf3, 0xcb, 0x42, 0xe4, 0xb3, 0x4b, 0xb6, 0x43, 0x0f, 0x46, 0xfb, 0xe5, 0x1e, 0x19, 0x88,
0x2f, 0x0b, 0xf1, 0x67, 0xdb, 0xb7, 0x3e, 0xaf, 0x3c, 0xe0, 0x1f, 0x3e, 0xfb, 0x09, 0xd6, 0x89,
0xd7, 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x45, 0xe0, 0x5b, 0x0f, 0x0d, 0x00, 0x00,
}
func (this *GroupPolicyInfo) Equal(that interface{}) bool {

View File

@ -6,6 +6,9 @@ import (
"github.com/cosmos/cosmos-sdk/x/group/errors"
)
// ValidateBasic performs stateless validation on an array of members. On top
// of validating each member individually, it also makes sure there are no
// duplicate addresses.
func (ms Members) ValidateBasic() error {
index := make(map[string]struct{}, len(ms.Members))
for i := range ms.Members {
@ -22,11 +25,11 @@ func (ms Members) ValidateBasic() error {
return nil
}
type AccAddresses []sdk.AccAddress
type accAddresses []sdk.AccAddress
// ValidateBasic verifies that there's no duplicate address.
// Individual account address validation has to be done separately.
func (a AccAddresses) ValidateBasic() error {
func (a accAddresses) ValidateBasic() error {
index := make(map[string]struct{}, len(a))
for i := range a {
accAddr := a[i]