feat(x/gov): implement a minimum amount per deposit (#18146)

Co-authored-by: Aleksandr Bezobchuk <alexanderbez@users.noreply.github.com>
Co-authored-by: Julien Robert <julien@rbrt.fr>
This commit is contained in:
Facundo Medica 2023-11-02 11:51:19 +01:00 committed by GitHub
parent bd274b8c9a
commit 177e7f4595
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 462 additions and 210 deletions

View File

@ -196,6 +196,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### State Machine Breaking
* (x/gov) [#18146](https://github.com/cosmos/cosmos-sdk/pull/18146) Add denom check to reject denoms outside of those listed in `MinDeposit`. A new `MinDepositRatio` param is added (with a default value of `0.001`) and now deposits are required to be at least `MinDepositRatio*MinDeposit` to be accepted.
* (x/distribution) [#17657](https://github.com/cosmos/cosmos-sdk/pull/17657) Migrate community pool funds from x/distribution to x/protocolpool.
* (x/distribution) [#17115](https://github.com/cosmos/cosmos-sdk/pull/17115) Migrate `PreviousProposer` to collections.
* (x/upgrade) [#16244](https://github.com/cosmos/cosmos-sdk/pull/16244) upgrade module no longer stores the app version but gets and sets the app version stored in the `ParamStore` of baseapp.

View File

@ -5547,6 +5547,7 @@ var (
fd_Params_burn_vote_quorum protoreflect.FieldDescriptor
fd_Params_burn_proposal_deposit_prevote protoreflect.FieldDescriptor
fd_Params_burn_vote_veto protoreflect.FieldDescriptor
fd_Params_min_deposit_ratio protoreflect.FieldDescriptor
)
func init() {
@ -5567,6 +5568,7 @@ func init() {
fd_Params_burn_vote_quorum = md_Params.Fields().ByName("burn_vote_quorum")
fd_Params_burn_proposal_deposit_prevote = md_Params.Fields().ByName("burn_proposal_deposit_prevote")
fd_Params_burn_vote_veto = md_Params.Fields().ByName("burn_vote_veto")
fd_Params_min_deposit_ratio = md_Params.Fields().ByName("min_deposit_ratio")
}
var _ protoreflect.Message = (*fastReflection_Params)(nil)
@ -5724,6 +5726,12 @@ func (x *fastReflection_Params) Range(f func(protoreflect.FieldDescriptor, proto
return
}
}
if x.MinDepositRatio != "" {
value := protoreflect.ValueOfString(x.MinDepositRatio)
if !f(fd_Params_min_deposit_ratio, value) {
return
}
}
}
// Has reports whether a field is populated.
@ -5769,6 +5777,8 @@ func (x *fastReflection_Params) Has(fd protoreflect.FieldDescriptor) bool {
return x.BurnProposalDepositPrevote != false
case "cosmos.gov.v1.Params.burn_vote_veto":
return x.BurnVoteVeto != false
case "cosmos.gov.v1.Params.min_deposit_ratio":
return x.MinDepositRatio != ""
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.gov.v1.Params"))
@ -5815,6 +5825,8 @@ func (x *fastReflection_Params) Clear(fd protoreflect.FieldDescriptor) {
x.BurnProposalDepositPrevote = false
case "cosmos.gov.v1.Params.burn_vote_veto":
x.BurnVoteVeto = false
case "cosmos.gov.v1.Params.min_deposit_ratio":
x.MinDepositRatio = ""
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.gov.v1.Params"))
@ -5882,6 +5894,9 @@ func (x *fastReflection_Params) Get(descriptor protoreflect.FieldDescriptor) pro
case "cosmos.gov.v1.Params.burn_vote_veto":
value := x.BurnVoteVeto
return protoreflect.ValueOfBool(value)
case "cosmos.gov.v1.Params.min_deposit_ratio":
value := x.MinDepositRatio
return protoreflect.ValueOfString(value)
default:
if descriptor.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.gov.v1.Params"))
@ -5936,6 +5951,8 @@ func (x *fastReflection_Params) Set(fd protoreflect.FieldDescriptor, value proto
x.BurnProposalDepositPrevote = value.Bool()
case "cosmos.gov.v1.Params.burn_vote_veto":
x.BurnVoteVeto = value.Bool()
case "cosmos.gov.v1.Params.min_deposit_ratio":
x.MinDepositRatio = value.Interface().(string)
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.gov.v1.Params"))
@ -6003,6 +6020,8 @@ func (x *fastReflection_Params) Mutable(fd protoreflect.FieldDescriptor) protore
panic(fmt.Errorf("field burn_proposal_deposit_prevote of message cosmos.gov.v1.Params is not mutable"))
case "cosmos.gov.v1.Params.burn_vote_veto":
panic(fmt.Errorf("field burn_vote_veto of message cosmos.gov.v1.Params is not mutable"))
case "cosmos.gov.v1.Params.min_deposit_ratio":
panic(fmt.Errorf("field min_deposit_ratio of message cosmos.gov.v1.Params is not mutable"))
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.gov.v1.Params"))
@ -6051,6 +6070,8 @@ func (x *fastReflection_Params) NewField(fd protoreflect.FieldDescriptor) protor
return protoreflect.ValueOfBool(false)
case "cosmos.gov.v1.Params.burn_vote_veto":
return protoreflect.ValueOfBool(false)
case "cosmos.gov.v1.Params.min_deposit_ratio":
return protoreflect.ValueOfString("")
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.gov.v1.Params"))
@ -6181,6 +6202,10 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods {
if x.BurnVoteVeto {
n += 2
}
l = len(x.MinDepositRatio)
if l > 0 {
n += 2 + l + runtime.Sov(uint64(l))
}
if x.unknownFields != nil {
n += len(x.unknownFields)
}
@ -6210,6 +6235,15 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods {
i -= len(x.unknownFields)
copy(dAtA[i:], x.unknownFields)
}
if len(x.MinDepositRatio) > 0 {
i -= len(x.MinDepositRatio)
copy(dAtA[i:], x.MinDepositRatio)
i = runtime.EncodeVarint(dAtA, i, uint64(len(x.MinDepositRatio)))
i--
dAtA[i] = 0x1
i--
dAtA[i] = 0x82
}
if x.BurnVoteVeto {
i--
if x.BurnVoteVeto {
@ -6872,6 +6906,38 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods {
}
}
x.BurnVoteVeto = bool(v != 0)
case 16:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field MinDepositRatio", 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.MinDepositRatio = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := runtime.Skip(dAtA[iNdEx:])
@ -7659,6 +7725,12 @@ type Params struct {
BurnProposalDepositPrevote bool `protobuf:"varint,14,opt,name=burn_proposal_deposit_prevote,json=burnProposalDepositPrevote,proto3" json:"burn_proposal_deposit_prevote,omitempty"`
// burn deposits if quorum with vote type no_veto is met
BurnVoteVeto bool `protobuf:"varint,15,opt,name=burn_vote_veto,json=burnVoteVeto,proto3" json:"burn_vote_veto,omitempty"`
// The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.
// Default value: 0.01. Meaning that for a chain with a min_deposit of 1000stake, a deposit of 1stake would be
// required.
//
// Since: cosmos-sdk 0.50
MinDepositRatio string `protobuf:"bytes,16,opt,name=min_deposit_ratio,json=minDepositRatio,proto3" json:"min_deposit_ratio,omitempty"`
}
func (x *Params) Reset() {
@ -7786,6 +7858,13 @@ func (x *Params) GetBurnVoteVeto() bool {
return false
}
func (x *Params) GetMinDepositRatio() string {
if x != nil {
return x.MinDepositRatio
}
return ""
}
var File_cosmos_gov_v1_gov_proto protoreflect.FileDescriptor
var file_cosmos_gov_v1_gov_proto_rawDesc = []byte{
@ -7924,7 +8003,7 @@ var file_cosmos_gov_v1_gov_proto_rawDesc = []byte{
0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e,
0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x0d,
0x76, 0x65, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, 0x02, 0x18,
0x01, 0x22, 0xd3, 0x07, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x45, 0x0a, 0x0b,
0x01, 0x22, 0x8f, 0x08, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x45, 0x0a, 0x0b,
0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28,
0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e,
0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x69, 0x6e, 0x42, 0x09, 0xc8, 0xde,
@ -7985,39 +8064,43 @@ var file_cosmos_gov_v1_gov_proto_rawDesc = []byte{
0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x50, 0x72, 0x65, 0x76, 0x6f, 0x74,
0x65, 0x12, 0x24, 0x0a, 0x0e, 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x5f, 0x76,
0x65, 0x74, 0x6f, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x56,
0x6f, 0x74, 0x65, 0x56, 0x65, 0x74, 0x6f, 0x2a, 0x89, 0x01, 0x0a, 0x0a, 0x56, 0x6f, 0x74, 0x65,
0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f,
0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x54, 0x49,
0x4f, 0x4e, 0x5f, 0x59, 0x45, 0x53, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x56, 0x4f, 0x54, 0x45,
0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x42, 0x53, 0x54, 0x41, 0x49, 0x4e, 0x10,
0x02, 0x12, 0x12, 0x0a, 0x0e, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e,
0x5f, 0x4e, 0x4f, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f, 0x50,
0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x56, 0x45, 0x54,
0x4f, 0x10, 0x04, 0x2a, 0xce, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53,
0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x50, 0x4f,
0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53,
0x49, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x50,
0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56,
0x4f, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x1a,
0x0a, 0x16, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55,
0x53, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52,
0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45,
0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x4f, 0x50,
0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c,
0x45, 0x44, 0x10, 0x05, 0x42, 0x99, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x2e, 0x67, 0x6f, 0x76, 0x2e, 0x76, 0x31, 0x42, 0x08, 0x47, 0x6f, 0x76, 0x50,
0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64,
0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f,
0x67, 0x6f, 0x76, 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x6f, 0x76, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43,
0x47, 0x58, 0xaa, 0x02, 0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x47, 0x6f, 0x76, 0x2e,
0x56, 0x31, 0xca, 0x02, 0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x6f, 0x76, 0x5c,
0x56, 0x31, 0xe2, 0x02, 0x19, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x6f, 0x76, 0x5c,
0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02,
0x0f, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x47, 0x6f, 0x76, 0x3a, 0x3a, 0x56, 0x31,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x6f, 0x74, 0x65, 0x56, 0x65, 0x74, 0x6f, 0x12, 0x3a, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x64,
0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x10, 0x20, 0x01,
0x28, 0x09, 0x42, 0x0e, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44,
0x65, 0x63, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x61,
0x74, 0x69, 0x6f, 0x2a, 0x89, 0x01, 0x0a, 0x0a, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69,
0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f,
0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
0x13, 0x0a, 0x0f, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x59,
0x45, 0x53, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x54,
0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x42, 0x53, 0x54, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x12, 0x0a,
0x0e, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x10,
0x03, 0x12, 0x1c, 0x0a, 0x18, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e,
0x5f, 0x4e, 0x4f, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x56, 0x45, 0x54, 0x4f, 0x10, 0x04, 0x2a,
0xce, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74,
0x75, 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53,
0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f,
0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x5f, 0x50,
0x45, 0x52, 0x49, 0x4f, 0x44, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x50, 0x4f,
0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56, 0x4f, 0x54, 0x49, 0x4e,
0x47, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52,
0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x41,
0x53, 0x53, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53,
0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54,
0x45, 0x44, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c,
0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05,
0x42, 0x99, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e,
0x67, 0x6f, 0x76, 0x2e, 0x76, 0x31, 0x42, 0x08, 0x47, 0x6f, 0x76, 0x50, 0x72, 0x6f, 0x74, 0x6f,
0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f,
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x67, 0x6f, 0x76, 0x2f,
0x76, 0x31, 0x3b, 0x67, 0x6f, 0x76, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x47, 0x58, 0xaa, 0x02,
0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x47, 0x6f, 0x76, 0x2e, 0x56, 0x31, 0xca, 0x02,
0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x6f, 0x76, 0x5c, 0x56, 0x31, 0xe2, 0x02,
0x19, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x47, 0x6f, 0x76, 0x5c, 0x56, 0x31, 0x5c, 0x47,
0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x43, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x47, 0x6f, 0x76, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -261,4 +261,11 @@ message Params {
// burn deposits if quorum with vote type no_veto is met
bool burn_vote_veto = 15;
// The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.
// Default value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be
// required.
//
// Since: cosmos-sdk 0.50
string min_deposit_ratio = 16 [(cosmos_proto.scalar) = "cosmos.Dec"];
}

View File

@ -14,7 +14,6 @@ import (
"cosmossdk.io/x/gov/types/v1beta1"
"github.com/cosmos/cosmos-sdk/testutil"
clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli"
"github.com/cosmos/cosmos-sdk/testutil/network"
sdk "github.com/cosmos/cosmos-sdk/types"
)
@ -72,33 +71,6 @@ func (s *DepositTestSuite) TearDownSuite() {
s.network.Cleanup()
}
func (s *DepositTestSuite) TestQueryDepositsWithoutInitialDeposit() {
val := s.network.Validators[0]
// submit proposal without initial deposit
id := s.submitProposal(val, sdk.NewCoin(s.cfg.BondDenom, math.NewInt(0)), "TestQueryDepositsWithoutInitialDeposit")
// deposit amount
depositAmount := sdk.NewCoin(s.cfg.BondDenom, v1.DefaultMinDepositTokens.Add(math.NewInt(50)))
msg := v1.NewMsgDeposit(val.Address, id, sdk.NewCoins(depositAmount))
_, err := clitestutil.SubmitTestTx(val.ClientCtx, msg, val.Address, clitestutil.TestTxConfig{})
s.Require().NoError(err)
s.Require().NoError(s.network.WaitForNextBlock())
// query deposit
proposalID := strconv.FormatUint(id, 10)
deposit := s.queryDeposit(val, proposalID, false, "")
s.Require().NotNil(deposit)
s.Require().Equal(depositAmount.String(), sdk.Coins(deposit.Deposit.Amount).String())
// query deposits
deposits := s.queryDeposits(val, proposalID, false, "")
s.Require().NotNil(deposits)
s.Require().Len(deposits.Deposits, 1)
// verify initial deposit
s.Require().Equal(depositAmount.String(), sdk.Coins(deposits.Deposits[0].Amount).String())
}
func (s *DepositTestSuite) TestQueryDepositsWithInitialDeposit() {
val := s.network.Validators[0]
depositAmount := sdk.NewCoin(s.cfg.BondDenom, v1.DefaultMinDepositTokens)

View File

@ -59,9 +59,12 @@ func (s *E2ETestSuite) SetupSuite() {
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &resp), out.String())
s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, resp.TxHash, 0))
// create a proposal without deposit
// create a proposal with a small deposit
minimumAcceptedDep := v1.DefaultMinDepositTokens.ToLegacyDec().Mul(v1.DefaultMinDepositRatio).Ceil().TruncateInt()
out, err = govclitestutil.MsgSubmitLegacyProposal(val.ClientCtx, val.Address.String(),
"Text Proposal 2", "Where is the title!?", v1beta1.ProposalTypeText)
"Text Proposal 2", "Where is the title!?", v1beta1.ProposalTypeText,
fmt.Sprintf("--%s=%s", cli.FlagDeposit, sdk.NewCoin(s.cfg.BondDenom, minimumAcceptedDep).String()))
s.Require().NoError(err)
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &resp), out.String())
s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, resp.TxHash, 0))
@ -127,7 +130,7 @@ func (s *E2ETestSuite) TestNewCmdSubmitProposal() {
"summary": "My awesome description",
"metadata": "%s",
"deposit": "%s"
}`, authtypes.NewModuleAddress(types.ModuleName), base64.StdEncoding.EncodeToString(propMetadata), sdk.NewCoin(s.cfg.BondDenom, math.NewInt(5431)))
}`, authtypes.NewModuleAddress(types.ModuleName), base64.StdEncoding.EncodeToString(propMetadata), sdk.NewCoin(s.cfg.BondDenom, math.NewInt(100000)))
validPropFile := testutil.WriteToNewTempFile(s.T(), validProp)
defer validPropFile.Close()
@ -195,7 +198,7 @@ func (s *E2ETestSuite) TestNewCmdSubmitLegacyProposal() {
"description": "Hello, World!",
"type": "Text",
"deposit": "%s"
}`, sdk.NewCoin(s.cfg.BondDenom, math.NewInt(5431)))
}`, sdk.NewCoin(s.cfg.BondDenom, math.NewInt(154310)))
validPropFile := testutil.WriteToNewTempFile(s.T(), validProp)
defer validPropFile.Close()
@ -221,7 +224,7 @@ func (s *E2ETestSuite) TestNewCmdSubmitLegacyProposal() {
[]string{
fmt.Sprintf("--%s='Where is the title!?'", cli.FlagDescription), //nolint:staticcheck // we are intentionally using a deprecated flag here.
fmt.Sprintf("--%s=%s", cli.FlagProposalType, v1beta1.ProposalTypeText), //nolint:staticcheck // we are intentionally using a deprecated flag here.
fmt.Sprintf("--%s=%s", cli.FlagDeposit, sdk.NewCoin(s.cfg.BondDenom, math.NewInt(5431)).String()),
fmt.Sprintf("--%s=%s", cli.FlagDeposit, sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10000)).String()),
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()),
@ -246,7 +249,7 @@ func (s *E2ETestSuite) TestNewCmdSubmitLegacyProposal() {
fmt.Sprintf("--%s='Text Proposal'", cli.FlagTitle),
fmt.Sprintf("--%s='Where is the title!?'", cli.FlagDescription), //nolint:staticcheck // we are intentionally using a deprecated flag here.
fmt.Sprintf("--%s=%s", cli.FlagProposalType, v1beta1.ProposalTypeText), //nolint:staticcheck // we are intentionally using a deprecated flag here.
fmt.Sprintf("--%s=%s", cli.FlagDeposit, sdk.NewCoin(s.cfg.BondDenom, math.NewInt(5431)).String()),
fmt.Sprintf("--%s=%s", cli.FlagDeposit, sdk.NewCoin(s.cfg.BondDenom, math.NewInt(100000)).String()),
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),

View File

@ -373,14 +373,15 @@ func TestMsgSetSendEnabled(t *testing.T) {
s := createTestSuite(t, genAccs)
ctx := s.App.BaseApp.NewContext(false)
require.NoError(t, testutil.FundAccount(ctx, s.BankKeeper, addr1, sdk.NewCoins(sdk.NewInt64Coin("stake", 101))))
require.NoError(t, testutil.FundAccount(ctx, s.BankKeeper, addr1, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 101))))
require.NoError(t, testutil.FundAccount(ctx, s.BankKeeper, addr1, sdk.NewCoins(sdk.NewInt64Coin("stake", 100000))))
addr1Str := addr1.String()
govAddr := s.BankKeeper.GetAuthority()
goodGovProp, err := govv1.NewMsgSubmitProposal(
[]sdk.Msg{
types.NewMsgSetSendEnabled(govAddr, nil, nil),
},
sdk.Coins{{Denom: "stake", Amount: sdkmath.NewInt(5)}},
sdk.Coins{{Denom: "stake", Amount: sdkmath.NewInt(100000)}},
addr1Str,
"set default send enabled to true",
"Change send enabled",

View File

@ -92,7 +92,7 @@ func TestTickExpiredDepositPeriod(t *testing.T) {
newProposalMsg, err := v1.NewMsgSubmitProposal(
[]sdk.Msg{mkTestLegacyContent(t)},
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 5)},
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 100000)},
addrs[0].String(),
"",
"Proposal",
@ -137,7 +137,7 @@ func TestTickMultipleExpiredDepositPeriod(t *testing.T) {
newProposalMsg, err := v1.NewMsgSubmitProposal(
[]sdk.Msg{mkTestLegacyContent(t)},
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 5)},
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 100000)},
addrs[0].String(),
"",
"Proposal",
@ -160,7 +160,7 @@ func TestTickMultipleExpiredDepositPeriod(t *testing.T) {
newProposalMsg2, err := v1.NewMsgSubmitProposal(
[]sdk.Msg{mkTestLegacyContent(t)},
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 5)},
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 100000)},
addrs[0].String(),
"",
"Proposal",
@ -200,7 +200,7 @@ func TestTickPassedDepositPeriod(t *testing.T) {
newProposalMsg, err := v1.NewMsgSubmitProposal(
[]sdk.Msg{mkTestLegacyContent(t)},
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 5)},
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 100000)},
addrs[0].String(),
"",
"Proposal",
@ -223,7 +223,7 @@ func TestTickPassedDepositPeriod(t *testing.T) {
checkInactiveProposalsQueue(t, ctx, suite.GovKeeper)
newDepositMsg := v1.NewMsgDeposit(addrs[1], proposalID, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 5)})
newDepositMsg := v1.NewMsgDeposit(addrs[1], proposalID, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 100000)})
res1, err := govMsgSvr.Deposit(ctx, newDepositMsg)
require.NoError(t, err)

View File

@ -3,6 +3,7 @@ package keeper
import (
"context"
"fmt"
"strings"
"cosmossdk.io/collections"
"cosmossdk.io/errors"
@ -12,6 +13,7 @@ import (
pooltypes "cosmossdk.io/x/protocolpool/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
// SetDeposit sets a Deposit to the gov store
@ -76,10 +78,48 @@ func (keeper Keeper) AddDeposit(ctx context.Context, proposalID uint64, deposito
return false, err
}
minDepositAmount := proposal.GetMinDepositFromParams(params)
minDepositRatio, err := sdkmath.LegacyNewDecFromStr(params.GetMinDepositRatio())
if err != nil {
return false, err
}
// the deposit must only contain valid denoms (listed in the min deposit param)
if err := keeper.validateDepositDenom(ctx, params, depositAmount); err != nil {
return false, err
}
// If minDepositRatio is set, the deposit must be equal or greater than minDepositAmount*minDepositRatio
// for at least one denom. If minDepositRatio is zero we skip this check.
if !minDepositRatio.IsZero() {
var (
depositThresholdMet bool
thresholds []string
)
for _, minDep := range minDepositAmount {
// calculate the threshold for this denom, and hold a list to later return a useful error message
threshold := sdk.NewCoin(minDep.GetDenom(), minDep.Amount.ToLegacyDec().Mul(minDepositRatio).TruncateInt())
thresholds = append(thresholds, threshold.String())
found, deposit := depositAmount.Find(minDep.Denom)
if !found { // if not found, continue, as we know the deposit contains at least 1 valid denom
continue
}
// Once we know at least one threshold has been met, we can break. The deposit
// might contain other denoms but we don't care.
if deposit.IsGTE(threshold) {
depositThresholdMet = true
break
}
}
// the threshold must be met with at least one denom, if not, return the list of minimum deposits
if !depositThresholdMet {
return false, errors.Wrapf(types.ErrMinDepositTooSmall, "received %s but need at least one of the following: %s", depositAmount, strings.Join(thresholds, ","))
}
}
// update the governance module's account coins pool
err = keeper.bankKeeper.SendCoinsFromAccountToModule(ctx, depositorAddr, types.ModuleName, depositAmount)
if err != nil {
@ -94,8 +134,6 @@ func (keeper Keeper) AddDeposit(ctx context.Context, proposalID uint64, deposito
}
// Check if deposit has provided sufficient total funds to transition the proposal into the voting period
minDepositAmount := proposal.GetMinDepositFromParams(params)
activatedVotingPeriod := false
if proposal.Status == v1.StatusDepositPeriod && sdk.NewCoins(proposal.TotalDeposit...).IsAllGTE(minDepositAmount) {
err = keeper.ActivateVotingPeriod(ctx, proposal)
@ -244,6 +282,10 @@ func (keeper Keeper) RefundAndDeleteDeposits(ctx context.Context, proposalID uin
// required at the time of proposal submission. This threshold amount is determined by
// the deposit parameters. Returns nil on success, error otherwise.
func (keeper Keeper) validateInitialDeposit(ctx context.Context, params v1.Params, initialDeposit sdk.Coins, expedited bool) error {
if !initialDeposit.IsValid() || initialDeposit.IsAnyNegative() {
return errors.Wrap(sdkerrors.ErrInvalidCoins, initialDeposit.String())
}
minInitialDepositRatio, err := sdkmath.LegacyNewDecFromStr(params.MinInitialDepositRatio)
if err != nil {
return err
@ -279,7 +321,7 @@ func (keeper Keeper) validateDepositDenom(ctx context.Context, params v1.Params,
for _, coin := range depositAmount {
if _, ok := acceptedDenoms[coin.Denom]; !ok {
return errors.Wrapf(types.ErrInvalidDepositDenom, "deposited %s, but gov accepts only the following denom(s): %v", coin, denoms)
return errors.Wrapf(types.ErrInvalidDepositDenom, "deposited %s, but gov accepts only the following denom(s): %v", depositAmount, denoms)
}
}

View File

@ -161,6 +161,86 @@ func TestDeposits(t *testing.T) {
}
}
func TestDepositAmount(t *testing.T) {
testcases := []struct {
name string
deposit sdk.Coins
minDepositRatio string
err string
}{
{
name: "good amount and denoms",
deposit: sdk.NewCoins(sdk.NewInt64Coin("stake", 10000)),
minDepositRatio: "0.001",
},
{
name: "good amount and denoms but not enough balance for zcoin",
deposit: sdk.NewCoins(sdk.NewInt64Coin("stake", 10000), sdk.NewInt64Coin("zcoin", 1)),
minDepositRatio: "0.001",
err: "not enough balance",
},
{
name: "too small amount",
deposit: sdk.NewCoins(sdk.NewInt64Coin("stake", 10)),
minDepositRatio: "0.001",
err: "received 10stake but need at least one of the following: 10000stake,10zcoin: minimum deposit is too small",
},
{
name: "too small amount with another coin",
deposit: sdk.NewCoins(sdk.NewInt64Coin("zcoin", 1)),
minDepositRatio: "0.001",
err: "received 1zcoin but need at least one of the following: 10000stake,10zcoin: minimum deposit is too small",
},
{
name: "bad denom",
deposit: sdk.NewCoins(sdk.NewInt64Coin("euro", 10000)),
minDepositRatio: "0.001",
err: "deposited 10000euro, but gov accepts only the following denom(s): [stake zcoin]: invalid deposit denom",
},
{
name: "mix containing bad and good denom",
deposit: sdk.NewCoins(sdk.NewInt64Coin("stake", 10000), sdk.NewInt64Coin("euro", 10000)),
minDepositRatio: "0.001",
err: "deposited 10000euro,10000stake, but gov accepts only the following denom(s): [stake zcoin]: invalid deposit denom",
},
{
name: "minDepositRatio is zero",
deposit: sdk.NewCoins(sdk.NewInt64Coin("stake", 10)),
minDepositRatio: "0.0",
},
}
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
govKeeper, mocks, _, ctx := setupGovKeeper(t)
authKeeper, bankKeeper, stakingKeeper := mocks.acctKeeper, mocks.bankKeeper, mocks.stakingKeeper
trackMockBalances(bankKeeper)
testAddrs := simtestutil.AddTestAddrsIncremental(bankKeeper, stakingKeeper, ctx, 2, sdkmath.NewInt(1000000000000000))
authKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes()
params, _ := govKeeper.Params.Get(ctx)
params.MinDepositRatio = tc.minDepositRatio
params.MinDeposit = sdk.NewCoins(params.MinDeposit...).Add(sdk.NewCoin("zcoin", sdkmath.NewInt(10000))) // coins must be sorted by denom
err := govKeeper.Params.Set(ctx, params)
require.NoError(t, err)
tp := TestProposal
proposal, err := govKeeper.SubmitProposal(ctx, tp, "", "title", "summary", testAddrs[0], false)
require.NoError(t, err)
proposalID := proposal.Id
_, err = govKeeper.AddDeposit(ctx, proposalID, testAddrs[0], tc.deposit)
if tc.err != "" {
require.Error(t, err)
require.Equal(t, tc.err, err.Error())
} else {
require.NoError(t, err)
}
})
}
}
func TestValidateInitialDeposit(t *testing.T) {
testcases := map[string]struct {
minDeposit sdk.Coins

View File

@ -41,10 +41,6 @@ func (k msgServer) SubmitProposal(goCtx context.Context, msg *v1.MsgSubmitPropos
return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid proposer address: %s", err)
}
if err := validateDeposit(sdk.NewCoins(msg.InitialDeposit...)); err != nil {
return nil, err
}
// check that either metadata or Msgs length is non nil.
if len(msg.Messages) == 0 && len(msg.Metadata) == 0 {
return nil, errors.Wrap(govtypes.ErrNoProposalMsgs, "either metadata or Msgs length must be non-nil")
@ -249,7 +245,7 @@ func (k msgServer) Deposit(goCtx context.Context, msg *v1.MsgDeposit) (*v1.MsgDe
return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid depositor address: %s", err)
}
if err := validateAmount(sdk.NewCoins(msg.Amount...)); err != nil {
if err := validateDeposit(msg.Amount); err != nil {
return nil, err
}
@ -383,26 +379,11 @@ func (k legacyMsgServer) Deposit(goCtx context.Context, msg *v1beta1.MsgDeposit)
return &v1beta1.MsgDepositResponse{}, nil
}
func validateAmount(amount sdk.Coins) error {
if !amount.IsValid() {
return sdkerrors.ErrInvalidCoins.Wrap(amount.String())
}
if !amount.IsAllPositive() {
// validateDeposit validates the deposit amount, do not use for initial deposit.
func validateDeposit(amount sdk.Coins) error {
if !amount.IsValid() || !amount.IsAllPositive() {
return sdkerrors.ErrInvalidCoins.Wrap(amount.String())
}
return nil
}
func validateDeposit(deposit sdk.Coins) error {
if !deposit.IsValid() {
return errors.Wrap(sdkerrors.ErrInvalidCoins, deposit.String())
}
if deposit.IsAnyNegative() {
return errors.Wrap(sdkerrors.ErrInvalidCoins, deposit.String())
}
return nil
}

View File

@ -27,7 +27,7 @@ func (suite *KeeperTestSuite) TestMsgSubmitProposal() {
addrs := suite.addrs
proposer := addrs[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
initialDeposit := coins
params, _ := suite.govKeeper.Params.Get(suite.ctx)
minDeposit := params.MinDeposit
@ -226,7 +226,7 @@ func (suite *KeeperTestSuite) TestMsgSubmitProposal() {
preRun: func() (*v1.MsgSubmitProposal, error) {
return v1.NewMsgSubmitProposal(
[]sdk.Msg{bankMsg},
append(initialDeposit, sdk.NewCoin("invalid", sdkmath.NewInt(100))),
initialDeposit.Add(sdk.NewCoin("invalid", sdkmath.NewInt(100))),
proposer.String(),
"",
"Proposal",
@ -235,7 +235,7 @@ func (suite *KeeperTestSuite) TestMsgSubmitProposal() {
)
},
expErr: true,
expErrMsg: "deposited 100invalid, but gov accepts only the following denom(s): [stake]: invalid deposit denom",
expErrMsg: "deposited 100invalid,100000stake, but gov accepts only the following denom(s): [stake]: invalid deposit denom",
},
"all good": {
preRun: func() (*v1.MsgSubmitProposal, error) {
@ -288,7 +288,7 @@ func (suite *KeeperTestSuite) TestMsgCancelProposal() {
addrs := suite.addrs
proposer := addrs[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
bankMsg := &banktypes.MsgSend{
FromAddress: govAcct.String(),
ToAddress: proposer.String(),
@ -384,7 +384,7 @@ func (suite *KeeperTestSuite) TestMsgVote() {
addrs := suite.addrs
proposer := addrs[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
params, _ := suite.govKeeper.Params.Get(suite.ctx)
minDeposit := params.MinDeposit
bankMsg := &banktypes.MsgSend{
@ -527,7 +527,7 @@ func (suite *KeeperTestSuite) TestMsgVoteWeighted() {
proposer := simtestutil.AddTestAddrsIncremental(suite.bankKeeper, suite.stakingKeeper, suite.ctx, 1, sdkmath.NewInt(50000000))[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
params, _ := suite.govKeeper.Params.Get(suite.ctx)
minDeposit := params.MinDeposit
bankMsg := &banktypes.MsgSend{
@ -771,9 +771,9 @@ func (suite *KeeperTestSuite) TestMsgDeposit() {
addrs := suite.addrs
proposer := addrs[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
params, _ := suite.govKeeper.Params.Get(suite.ctx)
minDeposit := params.MinDeposit
minDeposit := sdk.Coins(params.MinDeposit)
bankMsg := &banktypes.MsgSend{
FromAddress: govAcct.String(),
ToAddress: proposer.String(),
@ -836,9 +836,9 @@ func (suite *KeeperTestSuite) TestMsgDeposit() {
return pID
},
depositor: proposer,
deposit: append(minDeposit, sdk.NewCoin("ibc/badcoin", sdkmath.NewInt(1000))),
deposit: minDeposit.Add(sdk.NewCoin("ibc/badcoin", sdkmath.NewInt(1000))),
expErr: true,
expErrMsg: "deposited 1000ibc/badcoin, but gov accepts only the following denom(s): [stake]",
expErrMsg: "deposited 1000ibc/badcoin,10000000stake, but gov accepts only the following denom(s): [stake]: invalid deposit denom",
},
"all good": {
preRun: func() uint64 {
@ -868,7 +868,7 @@ func (suite *KeeperTestSuite) TestMsgDeposit() {
// legacy msg server tests
func (suite *KeeperTestSuite) TestLegacyMsgSubmitProposal() {
proposer := simtestutil.AddTestAddrsIncremental(suite.bankKeeper, suite.stakingKeeper, suite.ctx, 1, sdkmath.NewInt(50000000))[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
initialDeposit := coins
params, _ := suite.govKeeper.Params.Get(suite.ctx)
minDeposit := params.MinDeposit
@ -981,7 +981,7 @@ func (suite *KeeperTestSuite) TestLegacyMsgVote() {
addrs := suite.addrs
proposer := addrs[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
params, _ := suite.govKeeper.Params.Get(suite.ctx)
minDeposit := params.MinDeposit
bankMsg := &banktypes.MsgSend{
@ -1114,7 +1114,7 @@ func (suite *KeeperTestSuite) TestLegacyVoteWeighted() {
addrs := suite.addrs
proposer := addrs[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
params, _ := suite.govKeeper.Params.Get(suite.ctx)
minDeposit := params.MinDeposit
bankMsg := &banktypes.MsgSend{
@ -1365,7 +1365,7 @@ func (suite *KeeperTestSuite) TestLegacyMsgDeposit() {
addrs := suite.addrs
proposer := addrs[0]
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100)))
coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(100000)))
params, _ := suite.govKeeper.Params.Get(suite.ctx)
minDeposit := params.MinDeposit
bankMsg := &banktypes.MsgSend{

View File

@ -40,6 +40,7 @@ func MigrateStore(ctx sdk.Context, storeService corestoretypes.KVStoreService, c
params.ExpeditedThreshold = defaultParams.ExpeditedThreshold
params.ProposalCancelRatio = defaultParams.ProposalCancelRatio
params.ProposalCancelDest = defaultParams.ProposalCancelDest
params.MinDepositRatio = defaultParams.MinDepositRatio
bz, err := cdc.Marshal(&params)
if err != nil {

View File

@ -45,6 +45,7 @@ func TestMigrateStore(t *testing.T) {
require.Equal(t, v1.DefaultParams().ExpeditedMinDeposit, params.ExpeditedMinDeposit)
require.Equal(t, v1.DefaultParams().ExpeditedThreshold, params.ExpeditedThreshold)
require.Equal(t, v1.DefaultParams().ExpeditedVotingPeriod, params.ExpeditedVotingPeriod)
require.Equal(t, v1.DefaultParams().MinDepositRatio, params.MinDepositRatio)
// Check constitution
result, err := constitutionCollection.Get(ctx)

View File

@ -28,6 +28,7 @@ const (
ExpeditedThreshold = "expedited_threshold"
Veto = "veto"
ProposalCancelRate = "proposal_cancel_rate"
MinDepositRatio = "min_deposit_ratio"
// ExpeditedThreshold must be at least as large as the regular Threshold
// Therefore, we use this break out point in randomization.
@ -94,6 +95,11 @@ func GenVeto(r *rand.Rand) sdkmath.LegacyDec {
return sdkmath.LegacyNewDecWithPrec(int64(simulation.RandIntBetween(r, 250, 334)), 3)
}
// GenMinDepositRatio returns randomized DepositMinRatio
func GenMinDepositRatio(r *rand.Rand) sdkmath.LegacyDec {
return sdkmath.LegacyMustNewDecFromStr("0.01")
}
// RandomizedGenState generates a random GenesisState for gov
func RandomizedGenState(simState *module.SimulationState) {
startingProposalID := uint64(simState.Rand.Intn(100))
@ -131,9 +137,12 @@ func RandomizedGenState(simState *module.SimulationState) {
var veto sdkmath.LegacyDec
simState.AppParams.GetOrGenerate(Veto, &veto, simState.Rand, func(r *rand.Rand) { veto = GenVeto(r) })
var minDepositRatio sdkmath.LegacyDec
simState.AppParams.GetOrGenerate(MinDepositRatio, &minDepositRatio, simState.Rand, func(r *rand.Rand) { minDepositRatio = GenMinDepositRatio(r) })
govGenesis := v1.NewGenesisState(
startingProposalID,
v1.NewParams(minDeposit, expeditedMinDeposit, depositPeriod, votingPeriod, expeditedVotingPeriod, quorum.String(), threshold.String(), expitedVotingThreshold.String(), veto.String(), minInitialDepositRatio.String(), proposalCancelRate.String(), "", simState.Rand.Intn(2) == 0, simState.Rand.Intn(2) == 0, simState.Rand.Intn(2) == 0),
v1.NewParams(minDeposit, expeditedMinDeposit, depositPeriod, votingPeriod, expeditedVotingPeriod, quorum.String(), threshold.String(), expitedVotingThreshold.String(), veto.String(), minInitialDepositRatio.String(), proposalCancelRate.String(), "", simState.Rand.Intn(2) == 0, simState.Rand.Intn(2) == 0, simState.Rand.Intn(2) == 0, minDepositRatio.String()),
)
bz, err := json.MarshalIndent(&govGenesis, "", " ")

View File

@ -570,6 +570,13 @@ func randomDeposit(
minDepositAmount := minDeposit[denomIndex].Amount
minDepositRatio, err := sdkmath.LegacyNewDecFromStr(params.GetMinDepositRatio())
if err != nil {
return nil, false, err
}
threshold := minDepositAmount.ToLegacyDec().Mul(minDepositRatio).TruncateInt()
minAmount := sdkmath.ZeroInt()
if useMinAmount {
minDepositPercent, err := sdkmath.LegacyNewDecFromStr(params.MinInitialDepositRatio)
@ -585,8 +592,9 @@ func randomDeposit(
return nil, false, err
}
amount = amount.Add(minAmount)
amount = amount.MulRaw(3) // 3x what's required // TODO: this is a hack, we need to be able to calculate the correct amount using params
if amount.GT(spendableBalance) {
if amount.GT(spendableBalance) || amount.LT(threshold) {
return nil, true, nil
}

View File

@ -152,7 +152,7 @@ func TestSimulateMsgSubmitProposal(t *testing.T) {
require.True(t, operationMsg.OK)
require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.Proposer)
require.NotEqual(t, len(msg.InitialDeposit), 0)
require.Equal(t, "47841094stake", msg.InitialDeposit[0].String())
require.Equal(t, "143523282stake", msg.InitialDeposit[0].String())
require.Equal(t, simulation.TypeMsgSubmitProposal, sdk.MsgTypeURL(&msg))
}
@ -185,7 +185,7 @@ func TestSimulateMsgSubmitLegacyProposal(t *testing.T) {
require.True(t, operationMsg.OK)
require.Equal(t, "cosmos1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7u4x9a0", msg.Proposer)
require.NotEqual(t, len(msg.InitialDeposit), 0)
require.Equal(t, "25166256stake", msg.InitialDeposit[0].String())
require.Equal(t, "75498768stake", msg.InitialDeposit[0].String())
require.Equal(t, "title-3: ZBSpYuLyYggwexjxusrBqDOTtGTOWeLrQKjLxzIivHSlcxgdXhhuTSkuxKGLwQvuyNhYFmBZHeAerqyNEUzXPFGkqEGqiQWIXnku",
textProposal.GetTitle())
require.Equal(t, "description-3: NJWzHdBNpAXKJPHWQdrGYcAHSctgVlqwqHoLfHsXUdStwfefwzqLuKEhmMyYLdbZrcPgYqjNHxPexsruwEGStAneKbWkQDDIlCWBLSiAASNhZqNFlPtfqPJoxKsgMdzjWqLWdqKQuJqWPMvwPQWZUtVMOTMYKJbfdlZsjdsomuScvDmbDkgRualsxDvRJuCAmPOXitIbcyWsKGSdrEunFAOdmXnsuyFVgJqEjbklvmwrUlsxjRSfKZxGcpayDdgoFcnVSutxjRgOSFzPwidAjubMncNweqpbxhXGchpZUxuFDOtpnhNUycJICRYqsPhPSCjPTWZFLkstHWJxvdPEAyEIxXgLwbNOjrgzmaujiBABBIXvcXpLrbcEWNNQsbjvgJFgJkflpRohHUutvnaUqoopuKjTDaemDeSdqbnOzcfJpcTuAQtZoiLZOoAIlboFDAeGmSNwkvObPRvRWQgWkGkxwtPauYgdkmypLjbqhlHJIQTntgWjXwZdOyYEdQRRLfMSdnxqppqUofqLbLQDUjwKVKfZJUJQPsWIPwIVaSTrmKskoAhvmZyJgeRpkaTfGgrJzAigcxtfshmiDCFkuiluqtMOkidknnTBtumyJYlIsWLnCQclqdVmikUoMOPdPWwYbJxXyqUVicNxFxyqJTenNblyyKSdlCbiXxUiYUiMwXZASYfvMDPFgxniSjWaZTjHkqlJvtBsXqwPpyVxnJVGFWhfSxgOcduoxkiopJvFjMmFabrGYeVtTXLhxVUEiGwYUvndjFGzDVntUvibiyZhfMQdMhgsiuysLMiePBNXifRLMsSmXPkwlPloUbJveCvUlaalhZHuvdkCnkSHbMbmOnrfEGPwQiACiPlnihiaOdbjPqPiTXaHDoJXjSlZmltGqNHHNrcKdlFSCdmVOuvDcBLdSklyGJmcLTbSFtALdGlPkqqecJrpLCXNPWefoTJNgEJlyMEPneVaxxduAAEqQpHWZodWyRkDAxzyMnFMcjSVqeRXLqsNyNtQBbuRvunZflWSbbvXXdkyLikYqutQhLPONXbvhcQZJPSWnOulqQaXmbfFxAkqfYeseSHOQidHwbcsOaMnSrrmGjjRmEMQNuknupMxJiIeVjmgZvbmjPIQTEhQFULQLBMPrxcFPvBinaOPYWGvYGRKxLZdwamfRQQFngcdSlvwjfaPbURasIsGJVHtcEAxnIIrhSriiXLOlbEBLXFElXJFGxHJczRBIxAuPKtBisjKBwfzZFagdNmjdwIRvwzLkFKWRTDPxJCmpzHUcrPiiXXHnOIlqNVoGSXZewdnCRhuxeYGPVTfrNTQNOxZmxInOazUYNTNDgzsxlgiVEHPKMfbesvPHUqpNkUqbzeuzfdrsuLDpKHMUbBMKczKKWOdYoIXoPYtEjfOnlQLoGnbQUCuERdEFaptwnsHzTJDsuZkKtzMpFaZobynZdzNydEeJJHDYaQcwUxcqvwfWwNUsCiLvkZQiSfzAHftYgAmVsXgtmcYgTqJIawstRYJrZdSxlfRiqTufgEQVambeZZmaAyRQbcmdjVUZZCgqDrSeltJGXPMgZnGDZqISrGDOClxXCxMjmKqEPwKHoOfOeyGmqWqihqjINXLqnyTesZePQRqaWDQNqpLgNrAUKulklmckTijUltQKuWQDwpLmDyxLppPVMwsmBIpOwQttYFMjgJQZLYFPmxWFLIeZihkRNnkzoypBICIxgEuYsVWGIGRbbxqVasYnstWomJnHwmtOhAFSpttRYYzBmyEtZXiCthvKvWszTXDbiJbGXMcrYpKAgvUVFtdKUfvdMfhAryctklUCEdjetjuGNfJjajZtvzdYaqInKtFPPLYmRaXPdQzxdSQfmZDEVHlHGEGNSPRFJuIfKLLfUmnHxHnRjmzQPNlqrXgifUdzAGKVabYqvcDeYoTYgPsBUqehrBhmQUgTvDnsdpuhUoxskDdppTsYMcnDIPSwKIqhXDCIxOuXrywahvVavvHkPuaenjLmEbMgrkrQLHEAwrhHkPRNvonNQKqprqOFVZKAtpRSpvQUxMoXCMZLSSbnLEFsjVfANdQNQVwTmGxqVjVqRuxREAhuaDrFgEZpYKhwWPEKBevBfsOIcaZKyykQafzmGPLRAKDtTcJxJVgiiuUkmyMYuDUNEUhBEdoBLJnamtLmMJQgmLiUELIhLpiEvpOXOvXCPUeldLFqkKOwfacqIaRcnnZvERKRMCKUkMABbDHytQqQblrvoxOZkwzosQfDKGtIdfcXRJNqlBNwOCWoQBcEWyqrMlYZIAXYJmLfnjoJepgSFvrgajaBAIksoyeHqgqbGvpAstMIGmIhRYGGNPRIfOQKsGoKgxtsidhTaAePRCBFqZgPDWCIkqOJezGVkjfYUCZTlInbxBXwUAVRsxHTQtJFnnpmMvXDYCVlEmnZBKhmmxQOIQzxFWpJQkQoSAYzTEiDWEOsVLNrbfzeHFRyeYATakQQWmFDLPbVMCJcWjFGJjfqCoVzlbNNEsqxdSmNPjTjHYOkuEMFLkXYGaoJlraLqayMeCsTjWNRDPBywBJLAPVkGQqTwApVVwYAetlwSbzsdHWsTwSIcctkyKDuRWYDQikRqsKTMJchrliONJeaZIzwPQrNbTwxsGdwuduvibtYndRwpdsvyCktRHFalvUuEKMqXbItfGcNGWsGzubdPMYayOUOINjpcFBeESdwpdlTYmrPsLsVDhpTzoMegKrytNVZkfJRPuDCUXxSlSthOohmsuxmIZUedzxKmowKOdXTMcEtdpHaPWgIsIjrViKrQOCONlSuazmLuCUjLltOGXeNgJKedTVrrVCpWYWHyVrdXpKgNaMJVjbXxnVMSChdWKuZdqpisvrkBJPoURDYxWOtpjzZoOpWzyUuYNhCzRoHsMjmmWDcXzQiHIyjwdhPNwiPqFxeUfMVFQGImhykFgMIlQEoZCaRoqSBXTSWAeDumdbsOGtATwEdZlLfoBKiTvodQBGOEcuATWXfiinSjPmJKcWgQrTVYVrwlyMWhxqNbCMpIQNoSMGTiWfPTCezUjYcdWppnsYJihLQCqbNLRGgqrwHuIvsazapTpoPZIyZyeeSueJuTIhpHMEJfJpScshJubJGfkusuVBgfTWQoywSSliQQSfbvaHKiLnyjdSbpMkdBgXepoSsHnCQaYuHQqZsoEOmJCiuQUpJkmfyfbIShzlZpHFmLCsbknEAkKXKfRTRnuwdBeuOGgFbJLbDksHVapaRayWzwoYBEpmrlAxrUxYMUekKbpjPNfjUCjhbdMAnJmYQVZBQZkFVweHDAlaqJjRqoQPoOMLhyvYCzqEuQsAFoxWrzRnTVjStPadhsESlERnKhpEPsfDxNvxqcOyIulaCkmPdambLHvGhTZzysvqFauEgkFRItPfvisehFmoBhQqmkfbHVsgfHXDPJVyhwPllQpuYLRYvGodxKjkarnSNgsXoKEMlaSKxKdcVgvOkuLcfLFfdtXGTclqfPOfeoVLbqcjcXCUEBgAGplrkgsmIEhWRZLlGPGCwKWRaCKMkBHTAcypUrYjWwCLtOPVygMwMANGoQwFnCqFrUGMCRZUGJKTZIGPyldsifauoMnJPLTcDHmilcmahlqOELaAUYDBuzsVywnDQfwRLGIWozYaOAilMBcObErwgTDNGWnwQMUgFFSKtPDMEoEQCTKVREqrXZSGLqwTMcxHfWotDllNkIJPMbXzjDVjPOOjCFuIvTyhXKLyhUScOXvYthRXpPfKwMhptXaxIxgqBoUqzrWbaoLTVpQoottZyPFfNOoMioXHRuFwMRYUiKvcWPkrayyTLOCFJlAyslDameIuqVAuxErqFPEWIScKpBORIuZqoXlZuTvAjEdlEWDODFRregDTqGNoFBIHxvimmIZwLfFyKUfEWAnNBdtdzDmTPXtpHRGdIbuucfTjOygZsTxPjfweXhSUkMhPjMaxKlMIJMOXcnQfyzeOcbWwNbeH",
@ -276,7 +276,7 @@ func TestSimulateMsgDeposit(t *testing.T) {
require.Equal(t, uint64(1), msg.ProposalId)
require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.Depositor)
require.NotEqual(t, len(msg.Amount), 0)
require.Equal(t, "560969stake", msg.Amount[0].String())
require.Equal(t, "1682907stake", msg.Amount[0].String())
require.Equal(t, simulation.TypeMsgDeposit, sdk.MsgTypeURL(&msg))
}

View File

@ -795,6 +795,12 @@ type Params struct {
BurnProposalDepositPrevote bool `protobuf:"varint,14,opt,name=burn_proposal_deposit_prevote,json=burnProposalDepositPrevote,proto3" json:"burn_proposal_deposit_prevote,omitempty"`
// burn deposits if quorum with vote type no_veto is met
BurnVoteVeto bool `protobuf:"varint,15,opt,name=burn_vote_veto,json=burnVoteVeto,proto3" json:"burn_vote_veto,omitempty"`
// The ratio representing the proportion of the deposit value minimum that must be met when making a deposit.
// Default value: 0.01. Meaning that for a chain with a min_deposit of 1000stake, a deposit of 1stake would be
// required.
//
// Since: cosmos-sdk 0.50
MinDepositRatio string `protobuf:"bytes,16,opt,name=min_deposit_ratio,json=minDepositRatio,proto3" json:"min_deposit_ratio,omitempty"`
}
func (m *Params) Reset() { *m = Params{} }
@ -935,6 +941,13 @@ func (m *Params) GetBurnVoteVeto() bool {
return false
}
func (m *Params) GetMinDepositRatio() string {
if m != nil {
return m.MinDepositRatio
}
return ""
}
func init() {
proto.RegisterEnum("cosmos.gov.v1.VoteOption", VoteOption_name, VoteOption_value)
proto.RegisterEnum("cosmos.gov.v1.ProposalStatus", ProposalStatus_name, ProposalStatus_value)
@ -952,95 +965,96 @@ func init() {
func init() { proto.RegisterFile("cosmos/gov/v1/gov.proto", fileDescriptor_e05cb1c0d030febb) }
var fileDescriptor_e05cb1c0d030febb = []byte{
// 1405 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xcf, 0x73, 0xd3, 0xc6,
0x17, 0x8f, 0x6c, 0xc7, 0x71, 0x9e, 0x7f, 0xc4, 0x6c, 0x02, 0x51, 0x02, 0x71, 0x82, 0xbf, 0x0c,
0x93, 0x2f, 0x05, 0xbb, 0x81, 0xd2, 0x43, 0xe9, 0x4c, 0xc7, 0x89, 0x4d, 0x51, 0x06, 0x62, 0x57,
0x36, 0x09, 0xf4, 0xa2, 0x51, 0xa2, 0xc5, 0xd9, 0xa9, 0xa5, 0x75, 0xb5, 0xeb, 0x10, 0xdf, 0x7b,
0xe9, 0x8d, 0x63, 0x4f, 0x9d, 0x1e, 0x7b, 0xec, 0x81, 0xe9, 0xdf, 0xc0, 0xa9, 0xc3, 0xd0, 0x43,
0x7b, 0x29, 0xed, 0xc0, 0xa1, 0x33, 0xfc, 0x15, 0x1d, 0xed, 0xae, 0x2c, 0xc7, 0x71, 0x9b, 0x84,
0x4b, 0x22, 0xbd, 0xf7, 0xf9, 0x7c, 0xf6, 0xed, 0xfb, 0xb1, 0x2b, 0xc3, 0xfc, 0x1e, 0x65, 0x2e,
0x65, 0xe5, 0x36, 0x3d, 0x28, 0x1f, 0xac, 0x05, 0xff, 0x4a, 0x5d, 0x9f, 0x72, 0x8a, 0xb2, 0xd2,
0x51, 0x0a, 0x2c, 0x07, 0x6b, 0x8b, 0x05, 0x85, 0xdb, 0xb5, 0x19, 0x2e, 0x1f, 0xac, 0xed, 0x62,
0x6e, 0xaf, 0x95, 0xf7, 0x28, 0xf1, 0x24, 0x7c, 0x71, 0xae, 0x4d, 0xdb, 0x54, 0x3c, 0x96, 0x83,
0x27, 0x65, 0x5d, 0x6e, 0x53, 0xda, 0xee, 0xe0, 0xb2, 0x78, 0xdb, 0xed, 0x3d, 0x29, 0x73, 0xe2,
0x62, 0xc6, 0x6d, 0xb7, 0xab, 0x00, 0x0b, 0xa3, 0x00, 0xdb, 0xeb, 0x2b, 0x57, 0x61, 0xd4, 0xe5,
0xf4, 0x7c, 0x9b, 0x13, 0x1a, 0xae, 0xb8, 0x20, 0x23, 0xb2, 0xe4, 0xa2, 0x2a, 0x5a, 0xe9, 0x3a,
0x67, 0xbb, 0xc4, 0xa3, 0x65, 0xf1, 0x57, 0x9a, 0x8a, 0x14, 0xd0, 0x0e, 0x26, 0xed, 0x7d, 0x8e,
0x9d, 0x6d, 0xca, 0x71, 0xbd, 0x1b, 0x28, 0xa1, 0x35, 0x48, 0x52, 0xf1, 0xa4, 0x6b, 0x2b, 0xda,
0x6a, 0xee, 0xe6, 0x42, 0xe9, 0xc8, 0xae, 0x4b, 0x11, 0xd4, 0x54, 0x40, 0x74, 0x15, 0x92, 0x4f,
0x85, 0x90, 0x1e, 0x5b, 0xd1, 0x56, 0xa7, 0xd7, 0x73, 0xaf, 0x9e, 0xdf, 0x00, 0xc5, 0xaa, 0xe2,
0x3d, 0x53, 0x79, 0x8b, 0x3f, 0x68, 0x30, 0x55, 0xc5, 0x5d, 0xca, 0x08, 0x47, 0xcb, 0x90, 0xee,
0xfa, 0xb4, 0x4b, 0x99, 0xdd, 0xb1, 0x88, 0x23, 0xd6, 0x4a, 0x98, 0x10, 0x9a, 0x0c, 0x07, 0x7d,
0x0c, 0xd3, 0x8e, 0xc4, 0x52, 0x5f, 0xe9, 0xea, 0xaf, 0x9e, 0xdf, 0x98, 0x53, 0xba, 0x15, 0xc7,
0xf1, 0x31, 0x63, 0x4d, 0xee, 0x13, 0xaf, 0x6d, 0x46, 0x50, 0xf4, 0x29, 0x24, 0x6d, 0x97, 0xf6,
0x3c, 0xae, 0xc7, 0x57, 0xe2, 0xab, 0xe9, 0x28, 0xfe, 0xa0, 0x4c, 0x25, 0x55, 0xa6, 0xd2, 0x06,
0x25, 0xde, 0xfa, 0xf4, 0x8b, 0xd7, 0xcb, 0x13, 0x3f, 0xfe, 0xfd, 0xd3, 0x35, 0xcd, 0x54, 0x9c,
0xe2, 0x37, 0x49, 0x48, 0x35, 0x54, 0x10, 0x28, 0x07, 0xb1, 0x41, 0x68, 0x31, 0xe2, 0xa0, 0x0f,
0x21, 0xe5, 0x62, 0xc6, 0xec, 0x36, 0x66, 0x7a, 0x4c, 0x88, 0xcf, 0x95, 0x64, 0x45, 0x4a, 0x61,
0x45, 0x4a, 0x15, 0xaf, 0x6f, 0x0e, 0x50, 0xe8, 0x36, 0x24, 0x19, 0xb7, 0x79, 0x8f, 0xe9, 0x71,
0x91, 0xcc, 0xa5, 0x91, 0x64, 0x86, 0x4b, 0x35, 0x05, 0xc8, 0x54, 0x60, 0x74, 0x0f, 0xd0, 0x13,
0xe2, 0xd9, 0x1d, 0x8b, 0xdb, 0x9d, 0x4e, 0xdf, 0xf2, 0x31, 0xeb, 0x75, 0xb8, 0x9e, 0x58, 0xd1,
0x56, 0xd3, 0x37, 0x17, 0x47, 0x24, 0x5a, 0x01, 0xc4, 0x14, 0x08, 0x33, 0x2f, 0x58, 0x43, 0x16,
0x54, 0x81, 0x34, 0xeb, 0xed, 0xba, 0x84, 0x5b, 0x41, 0x9b, 0xe9, 0x93, 0x4a, 0x62, 0x34, 0xea,
0x56, 0xd8, 0x83, 0xeb, 0x89, 0x67, 0x7f, 0x2e, 0x6b, 0x26, 0x48, 0x52, 0x60, 0x46, 0x9b, 0x90,
0x57, 0xd9, 0xb5, 0xb0, 0xe7, 0x48, 0x9d, 0xe4, 0x29, 0x75, 0x72, 0x8a, 0x59, 0xf3, 0x1c, 0xa1,
0x65, 0x40, 0x96, 0x53, 0x6e, 0x77, 0x2c, 0x65, 0xd7, 0xa7, 0xce, 0x50, 0xa3, 0x8c, 0xa0, 0x86,
0x0d, 0x74, 0x1f, 0xce, 0x1d, 0x50, 0x4e, 0xbc, 0xb6, 0xc5, 0xb8, 0xed, 0xab, 0xfd, 0xa5, 0x4e,
0x19, 0xd7, 0x8c, 0xa4, 0x36, 0x03, 0xa6, 0x08, 0xec, 0x1e, 0x28, 0x53, 0xb4, 0xc7, 0xe9, 0x53,
0x6a, 0x65, 0x25, 0x31, 0xdc, 0xe2, 0x62, 0xd0, 0x24, 0xdc, 0x76, 0x6c, 0x6e, 0xeb, 0x10, 0xb4,
0xad, 0x39, 0x78, 0x47, 0x73, 0x30, 0xc9, 0x09, 0xef, 0x60, 0x3d, 0x2d, 0x1c, 0xf2, 0x05, 0xe9,
0x30, 0xc5, 0x7a, 0xae, 0x6b, 0xfb, 0x7d, 0x3d, 0x23, 0xec, 0xe1, 0x2b, 0xfa, 0x08, 0x52, 0x72,
0x22, 0xb0, 0xaf, 0x67, 0x4f, 0x18, 0x81, 0x01, 0x12, 0x5d, 0x82, 0x69, 0x7c, 0xd8, 0xc5, 0x0e,
0xe1, 0xd8, 0xd1, 0x73, 0x2b, 0xda, 0x6a, 0xca, 0x8c, 0x0c, 0xe8, 0x7f, 0x90, 0x7d, 0x62, 0x93,
0x0e, 0x76, 0x2c, 0x1f, 0xdb, 0x8c, 0x7a, 0xfa, 0x8c, 0x58, 0x33, 0x23, 0x8d, 0xa6, 0xb0, 0x15,
0x7f, 0xd3, 0x20, 0x3d, 0xdc, 0x46, 0x1f, 0xc0, 0x74, 0x1f, 0x33, 0x6b, 0x4f, 0xcc, 0x95, 0x76,
0x6c, 0xc8, 0x0d, 0x8f, 0x9b, 0xa9, 0x3e, 0x66, 0x1b, 0x81, 0x1f, 0xdd, 0x82, 0xac, 0xbd, 0xcb,
0xb8, 0x4d, 0x3c, 0x45, 0x88, 0x8d, 0x25, 0x64, 0x14, 0x48, 0x92, 0xfe, 0x0f, 0x29, 0x8f, 0x2a,
0x7c, 0x7c, 0x2c, 0x7e, 0xca, 0xa3, 0x12, 0x7a, 0x07, 0x90, 0x47, 0xad, 0xa7, 0x84, 0xef, 0x5b,
0x07, 0x98, 0x87, 0xa4, 0xc4, 0x58, 0xd2, 0x8c, 0x47, 0x77, 0x08, 0xdf, 0xdf, 0xc6, 0x5c, 0x92,
0x8b, 0x3f, 0x6b, 0x90, 0x08, 0x8e, 0xb0, 0x93, 0x0f, 0xa0, 0x12, 0x4c, 0x1e, 0x50, 0x8e, 0x4f,
0x3e, 0x7c, 0x24, 0x0c, 0xdd, 0x81, 0x29, 0x79, 0x1e, 0x32, 0x3d, 0x21, 0xba, 0xfa, 0xf2, 0xc8,
0xa4, 0x1e, 0x3f, 0x6c, 0xcd, 0x90, 0x71, 0xa4, 0x6b, 0x26, 0x8f, 0x76, 0xcd, 0x66, 0x22, 0x15,
0xcf, 0x27, 0x8a, 0x7f, 0x68, 0x90, 0x55, 0xbd, 0xdf, 0xb0, 0x7d, 0xdb, 0x65, 0xe8, 0x31, 0xa4,
0x5d, 0xe2, 0x0d, 0x46, 0x49, 0x3b, 0x69, 0x94, 0x96, 0x82, 0x51, 0x7a, 0xf7, 0x7a, 0xf9, 0xfc,
0x10, 0xeb, 0x3a, 0x75, 0x09, 0xc7, 0x6e, 0x97, 0xf7, 0x4d, 0x70, 0x89, 0x17, 0x0e, 0x97, 0x0b,
0xc8, 0xb5, 0x0f, 0x43, 0x90, 0xd5, 0xc5, 0x3e, 0xa1, 0x8e, 0x48, 0x44, 0xb0, 0xc2, 0xe8, 0x44,
0x54, 0xd5, 0x2d, 0xb4, 0x7e, 0xe5, 0xdd, 0xeb, 0xe5, 0x4b, 0xc7, 0x89, 0xd1, 0x22, 0xdf, 0x05,
0x03, 0x93, 0x77, 0xed, 0xc3, 0x70, 0x27, 0xc2, 0xff, 0x49, 0x4c, 0xd7, 0x8a, 0x8f, 0x20, 0xb3,
0x2d, 0x06, 0x49, 0xed, 0xae, 0x0a, 0x6a, 0xb0, 0xc2, 0xd5, 0xb5, 0x93, 0x56, 0x4f, 0x08, 0xf5,
0x8c, 0x64, 0x0d, 0x29, 0x7f, 0x1f, 0x36, 0xb3, 0x52, 0xbe, 0x0a, 0xc9, 0xaf, 0x7b, 0xd4, 0xef,
0xb9, 0x63, 0x3a, 0x59, 0x5c, 0x57, 0xd2, 0x8b, 0xae, 0xc3, 0x34, 0xdf, 0xf7, 0x31, 0xdb, 0xa7,
0x1d, 0xe7, 0x5f, 0x6e, 0xb6, 0x08, 0x80, 0x6e, 0x43, 0x4e, 0x74, 0x63, 0x44, 0x89, 0x8f, 0xa5,
0x64, 0x03, 0x54, 0x2b, 0x04, 0x89, 0x00, 0x7f, 0x9d, 0x82, 0xa4, 0x8a, 0xad, 0x76, 0xc6, 0x9a,
0x0e, 0x1d, 0x8f, 0xc3, 0xf5, 0x7b, 0xf0, 0x7e, 0xf5, 0x4b, 0x8c, 0xaf, 0xcf, 0xf1, 0x5a, 0xc4,
0xdf, 0xa3, 0x16, 0x43, 0x79, 0x4f, 0x9c, 0x3e, 0xef, 0x93, 0x67, 0xcf, 0x7b, 0xf2, 0x14, 0x79,
0x47, 0x06, 0x2c, 0x04, 0x89, 0x26, 0x1e, 0xe1, 0x24, 0xba, 0x8f, 0x2c, 0x11, 0xbe, 0x3e, 0x35,
0x56, 0xe1, 0x82, 0x4b, 0x3c, 0x43, 0xe2, 0x55, 0x7a, 0xcc, 0x00, 0x8d, 0xd6, 0xe1, 0xfc, 0xe0,
0x24, 0xd9, 0xb3, 0xbd, 0x3d, 0xdc, 0x51, 0x32, 0xa9, 0xb1, 0x32, 0xb3, 0x21, 0x78, 0x43, 0x60,
0xa5, 0xc6, 0x26, 0xcc, 0x8d, 0x6a, 0x38, 0x98, 0x71, 0x71, 0x09, 0xfd, 0xd7, 0xd9, 0x83, 0x8e,
0x8a, 0x55, 0x31, 0xe3, 0x68, 0x07, 0xe6, 0x07, 0xc7, 0xbd, 0x75, 0xb4, 0x6e, 0x70, 0xba, 0xba,
0x9d, 0x1f, 0xf0, 0xb7, 0x87, 0x0b, 0xf8, 0x19, 0xcc, 0x46, 0xc2, 0x51, 0xbe, 0xd3, 0x63, 0xb7,
0x89, 0x06, 0xd0, 0x28, 0xe9, 0x8f, 0x20, 0x52, 0xb6, 0x86, 0xfb, 0x3c, 0x73, 0x86, 0x3e, 0x8f,
0x62, 0x78, 0x10, 0x35, 0xfc, 0x2a, 0xe4, 0x77, 0x7b, 0xbe, 0x17, 0x6c, 0x17, 0x5b, 0xaa, 0xcb,
0xb2, 0xe2, 0xea, 0xcb, 0x05, 0xf6, 0xe0, 0xc8, 0xfd, 0x42, 0x76, 0x57, 0x05, 0x96, 0x04, 0x72,
0x90, 0xee, 0xc1, 0x90, 0xf8, 0x38, 0x60, 0xab, 0x1b, 0x73, 0x31, 0x00, 0x85, 0x9f, 0x67, 0xe1,
0x34, 0x48, 0x04, 0xba, 0x02, 0xb9, 0x68, 0xb1, 0xa0, 0xad, 0xc4, 0x1d, 0x9a, 0x32, 0x33, 0xe1,
0x52, 0xc1, 0x75, 0x73, 0xed, 0x5b, 0x0d, 0x60, 0xe8, 0xbb, 0xfa, 0x22, 0xcc, 0x6f, 0xd7, 0x5b,
0x35, 0xab, 0xde, 0x68, 0x19, 0xf5, 0x2d, 0xeb, 0xe1, 0x56, 0xb3, 0x51, 0xdb, 0x30, 0xee, 0x1a,
0xb5, 0x6a, 0x7e, 0x02, 0xcd, 0xc2, 0xcc, 0xb0, 0xf3, 0x71, 0xad, 0x99, 0xd7, 0xd0, 0x3c, 0xcc,
0x0e, 0x1b, 0x2b, 0xeb, 0xcd, 0x56, 0xc5, 0xd8, 0xca, 0xc7, 0x10, 0x82, 0xdc, 0xb0, 0x63, 0xab,
0x9e, 0x8f, 0xa3, 0x4b, 0xa0, 0x1f, 0xb5, 0x59, 0x3b, 0x46, 0xeb, 0x9e, 0xb5, 0x5d, 0x6b, 0xd5,
0xf3, 0x89, 0x6b, 0xbf, 0x68, 0x90, 0x3b, 0xfa, 0xad, 0x89, 0x96, 0xe1, 0x62, 0xc3, 0xac, 0x37,
0xea, 0xcd, 0xca, 0x7d, 0xab, 0xd9, 0xaa, 0xb4, 0x1e, 0x36, 0x47, 0x62, 0x2a, 0x42, 0x61, 0x14,
0x50, 0xad, 0x35, 0xea, 0x4d, 0xa3, 0x65, 0x35, 0x6a, 0xa6, 0x51, 0xaf, 0xe6, 0x35, 0x74, 0x19,
0x96, 0x46, 0x31, 0xdb, 0xf5, 0x96, 0xb1, 0xf5, 0x79, 0x08, 0x89, 0xa1, 0x45, 0xb8, 0x30, 0x0a,
0x69, 0x54, 0x9a, 0xcd, 0x5a, 0x55, 0x06, 0x3d, 0xea, 0x33, 0x6b, 0x9b, 0xb5, 0x8d, 0x56, 0xad,
0x9a, 0x4f, 0x8c, 0x63, 0xde, 0xad, 0x18, 0xf7, 0x6b, 0xd5, 0xfc, 0xe4, 0xfa, 0xed, 0x17, 0x6f,
0x0a, 0xda, 0xcb, 0x37, 0x05, 0xed, 0xaf, 0x37, 0x05, 0xed, 0xd9, 0xdb, 0xc2, 0xc4, 0xcb, 0xb7,
0x85, 0x89, 0xdf, 0xdf, 0x16, 0x26, 0xbe, 0xbc, 0x28, 0x7b, 0x88, 0x39, 0x5f, 0x95, 0x08, 0x2d,
0x1f, 0x8a, 0x5f, 0x71, 0xbc, 0xdf, 0xc5, 0x2c, 0xf8, 0x89, 0x96, 0x14, 0x1d, 0x7f, 0xeb, 0x9f,
0x00, 0x00, 0x00, 0xff, 0xff, 0xe5, 0x98, 0x2e, 0xa7, 0xe3, 0x0d, 0x00, 0x00,
// 1422 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xcf, 0x73, 0xd3, 0x46,
0x1b, 0x8e, 0x6c, 0xc7, 0x71, 0x5e, 0xff, 0x88, 0xd9, 0x04, 0xa2, 0x04, 0xe2, 0x04, 0x7f, 0x0c,
0x93, 0x8f, 0x0f, 0xec, 0x2f, 0x50, 0x7a, 0x80, 0xce, 0x74, 0x9c, 0xd8, 0x14, 0x67, 0x20, 0x76,
0x65, 0x93, 0x40, 0x2f, 0x1a, 0x25, 0x5a, 0x9c, 0x9d, 0x5a, 0x5a, 0x57, 0xbb, 0x0e, 0xf1, 0xbd,
0x97, 0x9e, 0xca, 0xb1, 0xa7, 0x4e, 0x8f, 0x3d, 0xf6, 0xc0, 0xf4, 0x6f, 0xe0, 0xd4, 0x61, 0xb8,
0xb4, 0x97, 0xd2, 0x0e, 0x1c, 0x3a, 0xc3, 0x5f, 0xd1, 0xd1, 0xee, 0xca, 0x52, 0x1c, 0xb7, 0x49,
0xb8, 0x24, 0xd2, 0xfb, 0x3e, 0xcf, 0xb3, 0xef, 0xbe, 0x3f, 0x76, 0x65, 0x98, 0xdf, 0xa3, 0xcc,
0xa1, 0xac, 0xdc, 0xa1, 0x07, 0xe5, 0x83, 0x35, 0xff, 0x5f, 0xa9, 0xe7, 0x51, 0x4e, 0x51, 0x56,
0x3a, 0x4a, 0xbe, 0xe5, 0x60, 0x6d, 0xb1, 0xa0, 0x70, 0xbb, 0x16, 0xc3, 0xe5, 0x83, 0xb5, 0x5d,
0xcc, 0xad, 0xb5, 0xf2, 0x1e, 0x25, 0xae, 0x84, 0x2f, 0xce, 0x75, 0x68, 0x87, 0x8a, 0xc7, 0xb2,
0xff, 0xa4, 0xac, 0xcb, 0x1d, 0x4a, 0x3b, 0x5d, 0x5c, 0x16, 0x6f, 0xbb, 0xfd, 0xa7, 0x65, 0x4e,
0x1c, 0xcc, 0xb8, 0xe5, 0xf4, 0x14, 0x60, 0x61, 0x14, 0x60, 0xb9, 0x03, 0xe5, 0x2a, 0x8c, 0xba,
0xec, 0xbe, 0x67, 0x71, 0x42, 0x83, 0x15, 0x17, 0x64, 0x44, 0xa6, 0x5c, 0x54, 0x45, 0x2b, 0x5d,
0xe7, 0x2c, 0x87, 0xb8, 0xb4, 0x2c, 0xfe, 0x4a, 0x53, 0x91, 0x02, 0xda, 0xc1, 0xa4, 0xb3, 0xcf,
0xb1, 0xbd, 0x4d, 0x39, 0x6e, 0xf4, 0x7c, 0x25, 0xb4, 0x06, 0x49, 0x2a, 0x9e, 0x74, 0x6d, 0x45,
0x5b, 0xcd, 0xdd, 0x5c, 0x28, 0x1d, 0xd9, 0x75, 0x29, 0x84, 0x1a, 0x0a, 0x88, 0xae, 0x42, 0xf2,
0x99, 0x10, 0xd2, 0x63, 0x2b, 0xda, 0xea, 0xf4, 0x7a, 0xee, 0xf5, 0x8b, 0x1b, 0xa0, 0x58, 0x55,
0xbc, 0x67, 0x28, 0x6f, 0xf1, 0x07, 0x0d, 0xa6, 0xaa, 0xb8, 0x47, 0x19, 0xe1, 0x68, 0x19, 0xd2,
0x3d, 0x8f, 0xf6, 0x28, 0xb3, 0xba, 0x26, 0xb1, 0xc5, 0x5a, 0x09, 0x03, 0x02, 0x53, 0xdd, 0x46,
0x1f, 0xc3, 0xb4, 0x2d, 0xb1, 0xd4, 0x53, 0xba, 0xfa, 0xeb, 0x17, 0x37, 0xe6, 0x94, 0x6e, 0xc5,
0xb6, 0x3d, 0xcc, 0x58, 0x8b, 0x7b, 0xc4, 0xed, 0x18, 0x21, 0x14, 0x7d, 0x02, 0x49, 0xcb, 0xa1,
0x7d, 0x97, 0xeb, 0xf1, 0x95, 0xf8, 0x6a, 0x3a, 0x8c, 0xdf, 0x2f, 0x53, 0x49, 0x95, 0xa9, 0xb4,
0x41, 0x89, 0xbb, 0x3e, 0xfd, 0xf2, 0xcd, 0xf2, 0xc4, 0x8f, 0x7f, 0xfd, 0x74, 0x4d, 0x33, 0x14,
0xa7, 0xf8, 0x75, 0x12, 0x52, 0x4d, 0x15, 0x04, 0xca, 0x41, 0x6c, 0x18, 0x5a, 0x8c, 0xd8, 0xe8,
0xff, 0x90, 0x72, 0x30, 0x63, 0x56, 0x07, 0x33, 0x3d, 0x26, 0xc4, 0xe7, 0x4a, 0xb2, 0x22, 0xa5,
0xa0, 0x22, 0xa5, 0x8a, 0x3b, 0x30, 0x86, 0x28, 0x74, 0x1b, 0x92, 0x8c, 0x5b, 0xbc, 0xcf, 0xf4,
0xb8, 0x48, 0xe6, 0xd2, 0x48, 0x32, 0x83, 0xa5, 0x5a, 0x02, 0x64, 0x28, 0x30, 0xba, 0x0f, 0xe8,
0x29, 0x71, 0xad, 0xae, 0xc9, 0xad, 0x6e, 0x77, 0x60, 0x7a, 0x98, 0xf5, 0xbb, 0x5c, 0x4f, 0xac,
0x68, 0xab, 0xe9, 0x9b, 0x8b, 0x23, 0x12, 0x6d, 0x1f, 0x62, 0x08, 0x84, 0x91, 0x17, 0xac, 0x88,
0x05, 0x55, 0x20, 0xcd, 0xfa, 0xbb, 0x0e, 0xe1, 0xa6, 0xdf, 0x66, 0xfa, 0xa4, 0x92, 0x18, 0x8d,
0xba, 0x1d, 0xf4, 0xe0, 0x7a, 0xe2, 0xf9, 0x1f, 0xcb, 0x9a, 0x01, 0x92, 0xe4, 0x9b, 0xd1, 0x26,
0xe4, 0x55, 0x76, 0x4d, 0xec, 0xda, 0x52, 0x27, 0x79, 0x4a, 0x9d, 0x9c, 0x62, 0xd6, 0x5c, 0x5b,
0x68, 0xd5, 0x21, 0xcb, 0x29, 0xb7, 0xba, 0xa6, 0xb2, 0xeb, 0x53, 0x67, 0xa8, 0x51, 0x46, 0x50,
0x83, 0x06, 0x7a, 0x00, 0xe7, 0x0e, 0x28, 0x27, 0x6e, 0xc7, 0x64, 0xdc, 0xf2, 0xd4, 0xfe, 0x52,
0xa7, 0x8c, 0x6b, 0x46, 0x52, 0x5b, 0x3e, 0x53, 0x04, 0x76, 0x1f, 0x94, 0x29, 0xdc, 0xe3, 0xf4,
0x29, 0xb5, 0xb2, 0x92, 0x18, 0x6c, 0x71, 0xd1, 0x6f, 0x12, 0x6e, 0xd9, 0x16, 0xb7, 0x74, 0xf0,
0xdb, 0xd6, 0x18, 0xbe, 0xa3, 0x39, 0x98, 0xe4, 0x84, 0x77, 0xb1, 0x9e, 0x16, 0x0e, 0xf9, 0x82,
0x74, 0x98, 0x62, 0x7d, 0xc7, 0xb1, 0xbc, 0x81, 0x9e, 0x11, 0xf6, 0xe0, 0x15, 0x7d, 0x04, 0x29,
0x39, 0x11, 0xd8, 0xd3, 0xb3, 0x27, 0x8c, 0xc0, 0x10, 0x89, 0x2e, 0xc1, 0x34, 0x3e, 0xec, 0x61,
0x9b, 0x70, 0x6c, 0xeb, 0xb9, 0x15, 0x6d, 0x35, 0x65, 0x84, 0x06, 0xf4, 0x1f, 0xc8, 0x3e, 0xb5,
0x48, 0x17, 0xdb, 0xa6, 0x87, 0x2d, 0x46, 0x5d, 0x7d, 0x46, 0xac, 0x99, 0x91, 0x46, 0x43, 0xd8,
0x8a, 0xbf, 0x6a, 0x90, 0x8e, 0xb6, 0xd1, 0xff, 0x60, 0x7a, 0x80, 0x99, 0xb9, 0x27, 0xe6, 0x4a,
0x3b, 0x36, 0xe4, 0x75, 0x97, 0x1b, 0xa9, 0x01, 0x66, 0x1b, 0xbe, 0x1f, 0xdd, 0x82, 0xac, 0xb5,
0xcb, 0xb8, 0x45, 0x5c, 0x45, 0x88, 0x8d, 0x25, 0x64, 0x14, 0x48, 0x92, 0xfe, 0x0b, 0x29, 0x97,
0x2a, 0x7c, 0x7c, 0x2c, 0x7e, 0xca, 0xa5, 0x12, 0x7a, 0x17, 0x90, 0x4b, 0xcd, 0x67, 0x84, 0xef,
0x9b, 0x07, 0x98, 0x07, 0xa4, 0xc4, 0x58, 0xd2, 0x8c, 0x4b, 0x77, 0x08, 0xdf, 0xdf, 0xc6, 0x5c,
0x92, 0x8b, 0x3f, 0x6b, 0x90, 0xf0, 0x8f, 0xb0, 0x93, 0x0f, 0xa0, 0x12, 0x4c, 0x1e, 0x50, 0x8e,
0x4f, 0x3e, 0x7c, 0x24, 0x0c, 0xdd, 0x85, 0x29, 0x79, 0x1e, 0x32, 0x3d, 0x21, 0xba, 0xfa, 0xf2,
0xc8, 0xa4, 0x1e, 0x3f, 0x6c, 0x8d, 0x80, 0x71, 0xa4, 0x6b, 0x26, 0x8f, 0x76, 0xcd, 0x66, 0x22,
0x15, 0xcf, 0x27, 0x8a, 0xbf, 0x6b, 0x90, 0x55, 0xbd, 0xdf, 0xb4, 0x3c, 0xcb, 0x61, 0xe8, 0x09,
0xa4, 0x1d, 0xe2, 0x0e, 0x47, 0x49, 0x3b, 0x69, 0x94, 0x96, 0xfc, 0x51, 0x7a, 0xff, 0x66, 0xf9,
0x7c, 0x84, 0x75, 0x9d, 0x3a, 0x84, 0x63, 0xa7, 0xc7, 0x07, 0x06, 0x38, 0xc4, 0x0d, 0x86, 0xcb,
0x01, 0xe4, 0x58, 0x87, 0x01, 0xc8, 0xec, 0x61, 0x8f, 0x50, 0x5b, 0x24, 0xc2, 0x5f, 0x61, 0x74,
0x22, 0xaa, 0xea, 0x16, 0x5a, 0xbf, 0xf2, 0xfe, 0xcd, 0xf2, 0xa5, 0xe3, 0xc4, 0x70, 0x91, 0xef,
0xfc, 0x81, 0xc9, 0x3b, 0xd6, 0x61, 0xb0, 0x13, 0xe1, 0xbf, 0x13, 0xd3, 0xb5, 0xe2, 0x63, 0xc8,
0x6c, 0x8b, 0x41, 0x52, 0xbb, 0xab, 0x82, 0x1a, 0xac, 0x60, 0x75, 0xed, 0xa4, 0xd5, 0x13, 0x42,
0x3d, 0x23, 0x59, 0x11, 0xe5, 0xef, 0x83, 0x66, 0x56, 0xca, 0x57, 0x21, 0xf9, 0x55, 0x9f, 0x7a,
0x7d, 0x67, 0x4c, 0x27, 0x8b, 0xeb, 0x4a, 0x7a, 0xd1, 0x75, 0x98, 0xe6, 0xfb, 0x1e, 0x66, 0xfb,
0xb4, 0x6b, 0xff, 0xc3, 0xcd, 0x16, 0x02, 0xd0, 0x6d, 0xc8, 0x89, 0x6e, 0x0c, 0x29, 0xf1, 0xb1,
0x94, 0xac, 0x8f, 0x6a, 0x07, 0x20, 0x11, 0xe0, 0xb7, 0x29, 0x48, 0xaa, 0xd8, 0x6a, 0x67, 0xac,
0x69, 0xe4, 0x78, 0x8c, 0xd6, 0xef, 0xe1, 0x87, 0xd5, 0x2f, 0x31, 0xbe, 0x3e, 0xc7, 0x6b, 0x11,
0xff, 0x80, 0x5a, 0x44, 0xf2, 0x9e, 0x38, 0x7d, 0xde, 0x27, 0xcf, 0x9e, 0xf7, 0xe4, 0x29, 0xf2,
0x8e, 0xea, 0xb0, 0xe0, 0x27, 0x9a, 0xb8, 0x84, 0x93, 0xf0, 0x3e, 0x32, 0x45, 0xf8, 0xfa, 0xd4,
0x58, 0x85, 0x0b, 0x0e, 0x71, 0xeb, 0x12, 0xaf, 0xd2, 0x63, 0xf8, 0x68, 0xb4, 0x0e, 0xe7, 0x87,
0x27, 0xc9, 0x9e, 0xe5, 0xee, 0xe1, 0xae, 0x92, 0x49, 0x8d, 0x95, 0x99, 0x0d, 0xc0, 0x1b, 0x02,
0x2b, 0x35, 0x36, 0x61, 0x6e, 0x54, 0xc3, 0xc6, 0x8c, 0x8b, 0x4b, 0xe8, 0xdf, 0xce, 0x1e, 0x74,
0x54, 0xac, 0x8a, 0x19, 0x47, 0x3b, 0x30, 0x3f, 0x3c, 0xee, 0xcd, 0xa3, 0x75, 0x83, 0xd3, 0xd5,
0xed, 0xfc, 0x90, 0xbf, 0x1d, 0x2d, 0xe0, 0xa7, 0x30, 0x1b, 0x0a, 0x87, 0xf9, 0x4e, 0x8f, 0xdd,
0x26, 0x1a, 0x42, 0xc3, 0xa4, 0x3f, 0x86, 0x50, 0xd9, 0x8c, 0xf6, 0x79, 0xe6, 0x0c, 0x7d, 0x1e,
0xc6, 0xf0, 0x30, 0x6c, 0xf8, 0x55, 0xc8, 0xef, 0xf6, 0x3d, 0xd7, 0xdf, 0x2e, 0x36, 0x55, 0x97,
0x65, 0xc5, 0xd5, 0x97, 0xf3, 0xed, 0xfe, 0x91, 0xfb, 0xb9, 0xec, 0xae, 0x0a, 0x2c, 0x09, 0xe4,
0x30, 0xdd, 0xc3, 0x21, 0xf1, 0xb0, 0xcf, 0x56, 0x37, 0xe6, 0xa2, 0x0f, 0x0a, 0x3e, 0xcf, 0x82,
0x69, 0x90, 0x08, 0x74, 0x05, 0x72, 0xe1, 0x62, 0x7e, 0x5b, 0x89, 0x3b, 0x34, 0x65, 0x64, 0x82,
0xa5, 0xfc, 0xeb, 0x06, 0xdd, 0x81, 0x73, 0x91, 0x2d, 0xaa, 0x96, 0xc8, 0x8f, 0xcd, 0xd5, 0x4c,
0x38, 0xba, 0xa2, 0x1d, 0xae, 0x7d, 0xa3, 0x01, 0x44, 0xbe, 0xc9, 0x2f, 0xc2, 0xfc, 0x76, 0xa3,
0x5d, 0x33, 0x1b, 0xcd, 0x76, 0xbd, 0xb1, 0x65, 0x3e, 0xda, 0x6a, 0x35, 0x6b, 0x1b, 0xf5, 0x7b,
0xf5, 0x5a, 0x35, 0x3f, 0x81, 0x66, 0x61, 0x26, 0xea, 0x7c, 0x52, 0x6b, 0xe5, 0x35, 0x34, 0x0f,
0xb3, 0x51, 0x63, 0x65, 0xbd, 0xd5, 0xae, 0xd4, 0xb7, 0xf2, 0x31, 0x84, 0x20, 0x17, 0x75, 0x6c,
0x35, 0xf2, 0x71, 0x74, 0x09, 0xf4, 0xa3, 0x36, 0x73, 0xa7, 0xde, 0xbe, 0x6f, 0x6e, 0xd7, 0xda,
0x8d, 0x7c, 0xe2, 0xda, 0x2f, 0x1a, 0xe4, 0x8e, 0x7e, 0xa7, 0xa2, 0x65, 0xb8, 0xd8, 0x34, 0x1a,
0xcd, 0x46, 0xab, 0xf2, 0xc0, 0x6c, 0xb5, 0x2b, 0xed, 0x47, 0xad, 0x91, 0x98, 0x8a, 0x50, 0x18,
0x05, 0x54, 0x6b, 0xcd, 0x46, 0xab, 0xde, 0x36, 0x9b, 0x35, 0xa3, 0xde, 0xa8, 0xe6, 0x35, 0x74,
0x19, 0x96, 0x46, 0x31, 0xdb, 0x8d, 0x76, 0x7d, 0xeb, 0xb3, 0x00, 0x12, 0x43, 0x8b, 0x70, 0x61,
0x14, 0xd2, 0xac, 0xb4, 0x5a, 0xb5, 0xaa, 0x0c, 0x7a, 0xd4, 0x67, 0xd4, 0x36, 0x6b, 0x1b, 0xed,
0x5a, 0x35, 0x9f, 0x18, 0xc7, 0xbc, 0x57, 0xa9, 0x3f, 0xa8, 0x55, 0xf3, 0x93, 0xeb, 0xb7, 0x5f,
0xbe, 0x2d, 0x68, 0xaf, 0xde, 0x16, 0xb4, 0x3f, 0xdf, 0x16, 0xb4, 0xe7, 0xef, 0x0a, 0x13, 0xaf,
0xde, 0x15, 0x26, 0x7e, 0x7b, 0x57, 0x98, 0xf8, 0xe2, 0xa2, 0xac, 0x09, 0xb3, 0xbf, 0x2c, 0x11,
0x5a, 0x3e, 0x14, 0xbf, 0x00, 0xf9, 0xa0, 0x87, 0x99, 0xff, 0xf3, 0x2e, 0x29, 0xa6, 0xe5, 0xd6,
0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xb5, 0x41, 0x36, 0x1f, 0x0e, 0x00, 0x00,
}
func (m *WeightedVoteOption) Marshal() (dAtA []byte, err error) {
@ -1536,6 +1550,15 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.MinDepositRatio) > 0 {
i -= len(m.MinDepositRatio)
copy(dAtA[i:], m.MinDepositRatio)
i = encodeVarintGov(dAtA, i, uint64(len(m.MinDepositRatio)))
i--
dAtA[i] = 0x1
i--
dAtA[i] = 0x82
}
if m.BurnVoteVeto {
i--
if m.BurnVoteVeto {
@ -1966,6 +1989,10 @@ func (m *Params) Size() (n int) {
if m.BurnVoteVeto {
n += 2
}
l = len(m.MinDepositRatio)
if l > 0 {
n += 2 + l + sovGov(uint64(l))
}
return n
}
@ -3913,6 +3940,38 @@ func (m *Params) Unmarshal(dAtA []byte) error {
}
}
m.BurnVoteVeto = bool(v != 0)
case 16:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field MinDepositRatio", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGov
}
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 ErrInvalidLengthGov
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthGov
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.MinDepositRatio = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGov(dAtA[iNdEx:])

View File

@ -30,6 +30,7 @@ var (
DefaultBurnProposalPrevote = false // set to false to replicate behavior of when this change was made (0.47)
DefaultBurnVoteQuorom = false // set to false to replicate behavior of when this change was made (0.47)
DefaultBurnVoteVeto = true // set to true to replicate behavior of when this change was made (0.47)
DefaultMinDepositRatio = sdkmath.LegacyMustNewDecFromStr("0.01")
)
// Deprecated: NewDepositParams creates a new DepositParams object
@ -59,7 +60,8 @@ func NewVotingParams(votingPeriod *time.Duration) VotingParams {
// NewParams creates a new Params instance with given values.
func NewParams(
minDeposit, expeditedminDeposit sdk.Coins, maxDepositPeriod, votingPeriod, expeditedVotingPeriod time.Duration,
quorum, threshold, expeditedThreshold, vetoThreshold, minInitialDepositRatio, proposalCancelRatio, proposalCancelDest string, burnProposalDeposit, burnVoteQuorum, burnVoteVeto bool,
quorum, threshold, expeditedThreshold, vetoThreshold, minInitialDepositRatio, proposalCancelRatio, proposalCancelDest string,
burnProposalDeposit, burnVoteQuorum, burnVoteVeto bool, minDepositRatio string,
) Params {
return Params{
MinDeposit: minDeposit,
@ -77,6 +79,7 @@ func NewParams(
BurnProposalDepositPrevote: burnProposalDeposit,
BurnVoteQuorum: burnVoteQuorum,
BurnVoteVeto: burnVoteVeto,
MinDepositRatio: minDepositRatio,
}
}
@ -98,6 +101,7 @@ func DefaultParams() Params {
DefaultBurnProposalPrevote,
DefaultBurnVoteQuorom,
DefaultBurnVoteVeto,
DefaultMinDepositRatio.String(),
)
}