From caa606ce839bc2ce8069499b5e15f0c7bb2ca3f3 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 29 Feb 2024 16:40:50 -0500 Subject: [PATCH] add MsgGovSendFromFeePool --- .../ecocredit/marketplace/v1/tx.pulsar.go | 1647 ++++++++++++++--- .../ecocredit/marketplace/v1/tx_grpc.pb.go | 45 + proto/regen/ecocredit/marketplace/v1/tx.proto | 25 + .../msg_gov_send_from_fee_pool.feature | 41 + .../features/msg_gov_set_fee_params.feature | 51 + .../keeper/msg_gov_send_from_fee_pool.go | 35 + .../keeper/msg_gov_send_from_fee_pool_test.go | 107 ++ .../keeper/msg_gov_set_fee_params_test.go | 68 + .../msg_gov_send_from_fee_pool.feature | 18 + .../features/msg_gov_set_fee_params.feature | 14 +- .../types/v1/msg_gov_send_from_fee_pool.go | 52 + .../v1/msg_gov_send_from_fee_pool_test.go | 55 + .../types/v1/msg_gov_set_fee_params_test.go | 12 +- x/ecocredit/marketplace/types/v1/tx.pb.go | 589 +++++- 14 files changed, 2411 insertions(+), 348 deletions(-) create mode 100644 x/ecocredit/marketplace/keeper/features/msg_gov_send_from_fee_pool.feature create mode 100644 x/ecocredit/marketplace/keeper/features/msg_gov_set_fee_params.feature create mode 100644 x/ecocredit/marketplace/keeper/msg_gov_send_from_fee_pool.go create mode 100644 x/ecocredit/marketplace/keeper/msg_gov_send_from_fee_pool_test.go create mode 100644 x/ecocredit/marketplace/keeper/msg_gov_set_fee_params_test.go create mode 100644 x/ecocredit/marketplace/types/v1/features/msg_gov_send_from_fee_pool.feature create mode 100644 x/ecocredit/marketplace/types/v1/msg_gov_send_from_fee_pool.go create mode 100644 x/ecocredit/marketplace/types/v1/msg_gov_send_from_fee_pool_test.go diff --git a/api/regen/ecocredit/marketplace/v1/tx.pulsar.go b/api/regen/ecocredit/marketplace/v1/tx.pulsar.go index 3dfb4393d6..fbd04916b2 100644 --- a/api/regen/ecocredit/marketplace/v1/tx.pulsar.go +++ b/api/regen/ecocredit/marketplace/v1/tx.pulsar.go @@ -602,7 +602,7 @@ func (x *MsgSell_Order) ProtoReflect() protoreflect.Message { } func (x *MsgSell_Order) slowProtoReflect() protoreflect.Message { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[14] + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2392,7 +2392,7 @@ func (x *MsgUpdateSellOrders_Update) ProtoReflect() protoreflect.Message { } func (x *MsgUpdateSellOrders_Update) slowProtoReflect() protoreflect.Message { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[15] + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4814,7 +4814,7 @@ func (x *MsgBuyDirect_Order) ProtoReflect() protoreflect.Message { } func (x *MsgBuyDirect_Order) slowProtoReflect() protoreflect.Message { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[16] + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8593,219 +8593,1197 @@ func (x *fastReflection_MsgGovSetFeeParamsResponse) ProtoMethods() *protoiface.M } } -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: regen/ecocredit/marketplace/v1/tx.proto - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// MsgSell is the Msg/Sell request type. -type MsgSell struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +var _ protoreflect.List = (*_MsgGovSendFromFeePool_3_list)(nil) - // seller is the address of the account that is selling credits. - Seller string `protobuf:"bytes,1,opt,name=seller,proto3" json:"seller,omitempty"` - // orders are the sell orders being created. - Orders []*MsgSell_Order `protobuf:"bytes,2,rep,name=orders,proto3" json:"orders,omitempty"` +type _MsgGovSendFromFeePool_3_list struct { + list *[]*v1beta1.Coin } -func (x *MsgSell) Reset() { - *x = MsgSell{} - if protoimpl.UnsafeEnabled { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *_MsgGovSendFromFeePool_3_list) Len() int { + if x.list == nil { + return 0 } + return len(*x.list) } -func (x *MsgSell) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *_MsgGovSendFromFeePool_3_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) } -func (*MsgSell) ProtoMessage() {} - -// Deprecated: Use MsgSell.ProtoReflect.Descriptor instead. -func (*MsgSell) Descriptor() ([]byte, []int) { - return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{0} +func (x *_MsgGovSendFromFeePool_3_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*v1beta1.Coin) + (*x.list)[i] = concreteValue } -func (x *MsgSell) GetSeller() string { - if x != nil { - return x.Seller - } - return "" +func (x *_MsgGovSendFromFeePool_3_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*v1beta1.Coin) + *x.list = append(*x.list, concreteValue) } -func (x *MsgSell) GetOrders() []*MsgSell_Order { - if x != nil { - return x.Orders - } - return nil +func (x *_MsgGovSendFromFeePool_3_list) AppendMutable() protoreflect.Value { + v := new(v1beta1.Coin) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) } -// MsgSellResponse is the Msg/Sell response type. -type MsgSellResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // sell_order_ids are the sell order IDs of the newly created sell orders. - SellOrderIds []uint64 `protobuf:"varint,1,rep,packed,name=sell_order_ids,json=sellOrderIds,proto3" json:"sell_order_ids,omitempty"` +func (x *_MsgGovSendFromFeePool_3_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] } -func (x *MsgSellResponse) Reset() { - *x = MsgSellResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +func (x *_MsgGovSendFromFeePool_3_list) NewElement() protoreflect.Value { + v := new(v1beta1.Coin) + return protoreflect.ValueOfMessage(v.ProtoReflect()) } -func (x *MsgSellResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *_MsgGovSendFromFeePool_3_list) IsValid() bool { + return x.list != nil } -func (*MsgSellResponse) ProtoMessage() {} +var ( + md_MsgGovSendFromFeePool protoreflect.MessageDescriptor + fd_MsgGovSendFromFeePool_authority protoreflect.FieldDescriptor + fd_MsgGovSendFromFeePool_recipient protoreflect.FieldDescriptor + fd_MsgGovSendFromFeePool_amount protoreflect.FieldDescriptor +) -// Deprecated: Use MsgSellResponse.ProtoReflect.Descriptor instead. -func (*MsgSellResponse) Descriptor() ([]byte, []int) { - return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{1} +func init() { + file_regen_ecocredit_marketplace_v1_tx_proto_init() + md_MsgGovSendFromFeePool = File_regen_ecocredit_marketplace_v1_tx_proto.Messages().ByName("MsgGovSendFromFeePool") + fd_MsgGovSendFromFeePool_authority = md_MsgGovSendFromFeePool.Fields().ByName("authority") + fd_MsgGovSendFromFeePool_recipient = md_MsgGovSendFromFeePool.Fields().ByName("recipient") + fd_MsgGovSendFromFeePool_amount = md_MsgGovSendFromFeePool.Fields().ByName("amount") } -func (x *MsgSellResponse) GetSellOrderIds() []uint64 { - if x != nil { - return x.SellOrderIds - } - return nil -} +var _ protoreflect.Message = (*fastReflection_MsgGovSendFromFeePool)(nil) -// MsgUpdateSellOrders is the Msg/UpdateSellOrders request type. -type MsgUpdateSellOrders struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +type fastReflection_MsgGovSendFromFeePool MsgGovSendFromFeePool - // seller is the address of the account that is selling credits. - Seller string `protobuf:"bytes,1,opt,name=seller,proto3" json:"seller,omitempty"` - // updates are updates to existing sell orders. - Updates []*MsgUpdateSellOrders_Update `protobuf:"bytes,2,rep,name=updates,proto3" json:"updates,omitempty"` +func (x *MsgGovSendFromFeePool) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgGovSendFromFeePool)(x) } -func (x *MsgUpdateSellOrders) Reset() { - *x = MsgUpdateSellOrders{} - if protoimpl.UnsafeEnabled { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[2] +func (x *MsgGovSendFromFeePool) slowProtoReflect() protoreflect.Message { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } + return mi.MessageOf(x) } -func (x *MsgUpdateSellOrders) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MsgUpdateSellOrders) ProtoMessage() {} +var _fastReflection_MsgGovSendFromFeePool_messageType fastReflection_MsgGovSendFromFeePool_messageType +var _ protoreflect.MessageType = fastReflection_MsgGovSendFromFeePool_messageType{} -// Deprecated: Use MsgUpdateSellOrders.ProtoReflect.Descriptor instead. -func (*MsgUpdateSellOrders) Descriptor() ([]byte, []int) { - return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{2} -} +type fastReflection_MsgGovSendFromFeePool_messageType struct{} -func (x *MsgUpdateSellOrders) GetSeller() string { - if x != nil { - return x.Seller - } - return "" +func (x fastReflection_MsgGovSendFromFeePool_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgGovSendFromFeePool)(nil) } - -func (x *MsgUpdateSellOrders) GetUpdates() []*MsgUpdateSellOrders_Update { - if x != nil { - return x.Updates - } - return nil +func (x fastReflection_MsgGovSendFromFeePool_messageType) New() protoreflect.Message { + return new(fastReflection_MsgGovSendFromFeePool) } - -// MsgUpdateSellOrdersResponse is the Msg/UpdateSellOrders response type. -type MsgUpdateSellOrdersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x fastReflection_MsgGovSendFromFeePool_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgGovSendFromFeePool } -func (x *MsgUpdateSellOrdersResponse) Reset() { - *x = MsgUpdateSellOrdersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgGovSendFromFeePool) Descriptor() protoreflect.MessageDescriptor { + return md_MsgGovSendFromFeePool } -func (x *MsgUpdateSellOrdersResponse) String() string { - return protoimpl.X.MessageStringOf(x) +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgGovSendFromFeePool) Type() protoreflect.MessageType { + return _fastReflection_MsgGovSendFromFeePool_messageType } -func (*MsgUpdateSellOrdersResponse) ProtoMessage() {} - -// Deprecated: Use MsgUpdateSellOrdersResponse.ProtoReflect.Descriptor instead. -func (*MsgUpdateSellOrdersResponse) Descriptor() ([]byte, []int) { - return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{3} +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgGovSendFromFeePool) New() protoreflect.Message { + return new(fastReflection_MsgGovSendFromFeePool) } -// MsgCancelSellOrder is the Msg/CancelSellOrder request type. -type MsgCancelSellOrder struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // seller is the address of the account that created the sell order and is - // therefore authorized to cancel the sell order. - Seller string `protobuf:"bytes,1,opt,name=seller,proto3" json:"seller,omitempty"` - // sell_order_id is the id of the seller order to cancel. - SellOrderId uint64 `protobuf:"varint,2,opt,name=sell_order_id,json=sellOrderId,proto3" json:"sell_order_id,omitempty"` +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgGovSendFromFeePool) Interface() protoreflect.ProtoMessage { + return (*MsgGovSendFromFeePool)(x) } -func (x *MsgCancelSellOrder) Reset() { - *x = MsgCancelSellOrder{} - if protoimpl.UnsafeEnabled { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgGovSendFromFeePool) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Authority != "" { + value := protoreflect.ValueOfString(x.Authority) + if !f(fd_MsgGovSendFromFeePool_authority, value) { + return + } + } + if x.Recipient != "" { + value := protoreflect.ValueOfString(x.Recipient) + if !f(fd_MsgGovSendFromFeePool_recipient, value) { + return + } + } + if len(x.Amount) != 0 { + value := protoreflect.ValueOfList(&_MsgGovSendFromFeePool_3_list{list: &x.Amount}) + if !f(fd_MsgGovSendFromFeePool_amount, value) { + return + } } } -func (x *MsgCancelSellOrder) String() string { - return protoimpl.X.MessageStringOf(x) +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgGovSendFromFeePool) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.authority": + return x.Authority != "" + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.recipient": + return x.Recipient != "" + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.amount": + return len(x.Amount) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool does not contain field %s", fd.FullName())) + } } -func (*MsgCancelSellOrder) ProtoMessage() {} - -// Deprecated: Use MsgCancelSellOrder.ProtoReflect.Descriptor instead. -func (*MsgCancelSellOrder) Descriptor() ([]byte, []int) { - return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{4} +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgGovSendFromFeePool) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.authority": + x.Authority = "" + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.recipient": + x.Recipient = "" + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.amount": + x.Amount = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool does not contain field %s", fd.FullName())) + } } -func (x *MsgCancelSellOrder) GetSeller() string { - if x != nil { - return x.Seller +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgGovSendFromFeePool) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.authority": + value := x.Authority + return protoreflect.ValueOfString(value) + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.recipient": + value := x.Recipient + return protoreflect.ValueOfString(value) + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.amount": + if len(x.Amount) == 0 { + return protoreflect.ValueOfList(&_MsgGovSendFromFeePool_3_list{}) + } + listValue := &_MsgGovSendFromFeePool_3_list{list: &x.Amount} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool does not contain field %s", descriptor.FullName())) } - return "" } -func (x *MsgCancelSellOrder) GetSellOrderId() uint64 { - if x != nil { - return x.SellOrderId - } +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgGovSendFromFeePool) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.authority": + x.Authority = value.Interface().(string) + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.recipient": + x.Recipient = value.Interface().(string) + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.amount": + lv := value.List() + clv := lv.(*_MsgGovSendFromFeePool_3_list) + x.Amount = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgGovSendFromFeePool) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.amount": + if x.Amount == nil { + x.Amount = []*v1beta1.Coin{} + } + value := &_MsgGovSendFromFeePool_3_list{list: &x.Amount} + return protoreflect.ValueOfList(value) + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.authority": + panic(fmt.Errorf("field authority of message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool is not mutable")) + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.recipient": + panic(fmt.Errorf("field recipient of message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgGovSendFromFeePool) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.authority": + return protoreflect.ValueOfString("") + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.recipient": + return protoreflect.ValueOfString("") + case "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.amount": + list := []*v1beta1.Coin{} + return protoreflect.ValueOfList(&_MsgGovSendFromFeePool_3_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgGovSendFromFeePool) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgGovSendFromFeePool) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgGovSendFromFeePool) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgGovSendFromFeePool) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgGovSendFromFeePool) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgGovSendFromFeePool) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Authority) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.Recipient) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if len(x.Amount) > 0 { + for _, e := range x.Amount { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgGovSendFromFeePool) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Amount) > 0 { + for iNdEx := len(x.Amount) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.Amount[iNdEx]) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x1a + } + } + if len(x.Recipient) > 0 { + i -= len(x.Recipient) + copy(dAtA[i:], x.Recipient) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Recipient))) + i-- + dAtA[i] = 0x12 + } + if len(x.Authority) > 0 { + i -= len(x.Authority) + copy(dAtA[i:], x.Authority) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Authority))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgGovSendFromFeePool) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgGovSendFromFeePool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgGovSendFromFeePool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Authority", 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.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Recipient", 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.Recipient = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + 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.Amount = append(x.Amount, &v1beta1.Coin{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Amount[len(x.Amount)-1]); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_MsgGovSendFromFeePoolResponse protoreflect.MessageDescriptor +) + +func init() { + file_regen_ecocredit_marketplace_v1_tx_proto_init() + md_MsgGovSendFromFeePoolResponse = File_regen_ecocredit_marketplace_v1_tx_proto.Messages().ByName("MsgGovSendFromFeePoolResponse") +} + +var _ protoreflect.Message = (*fastReflection_MsgGovSendFromFeePoolResponse)(nil) + +type fastReflection_MsgGovSendFromFeePoolResponse MsgGovSendFromFeePoolResponse + +func (x *MsgGovSendFromFeePoolResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgGovSendFromFeePoolResponse)(x) +} + +func (x *MsgGovSendFromFeePoolResponse) slowProtoReflect() protoreflect.Message { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgGovSendFromFeePoolResponse_messageType fastReflection_MsgGovSendFromFeePoolResponse_messageType +var _ protoreflect.MessageType = fastReflection_MsgGovSendFromFeePoolResponse_messageType{} + +type fastReflection_MsgGovSendFromFeePoolResponse_messageType struct{} + +func (x fastReflection_MsgGovSendFromFeePoolResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgGovSendFromFeePoolResponse)(nil) +} +func (x fastReflection_MsgGovSendFromFeePoolResponse_messageType) New() protoreflect.Message { + return new(fastReflection_MsgGovSendFromFeePoolResponse) +} +func (x fastReflection_MsgGovSendFromFeePoolResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgGovSendFromFeePoolResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Descriptor() protoreflect.MessageDescriptor { + return md_MsgGovSendFromFeePoolResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Type() protoreflect.MessageType { + return _fastReflection_MsgGovSendFromFeePoolResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) New() protoreflect.Message { + return new(fastReflection_MsgGovSendFromFeePoolResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Interface() protoreflect.ProtoMessage { + return (*MsgGovSendFromFeePoolResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse")) + } + panic(fmt.Errorf("message regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgGovSendFromFeePoolResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgGovSendFromFeePoolResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgGovSendFromFeePoolResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgGovSendFromFeePoolResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgGovSendFromFeePoolResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgGovSendFromFeePoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: regen/ecocredit/marketplace/v1/tx.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// MsgSell is the Msg/Sell request type. +type MsgSell struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // seller is the address of the account that is selling credits. + Seller string `protobuf:"bytes,1,opt,name=seller,proto3" json:"seller,omitempty"` + // orders are the sell orders being created. + Orders []*MsgSell_Order `protobuf:"bytes,2,rep,name=orders,proto3" json:"orders,omitempty"` +} + +func (x *MsgSell) Reset() { + *x = MsgSell{} + if protoimpl.UnsafeEnabled { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgSell) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgSell) ProtoMessage() {} + +// Deprecated: Use MsgSell.ProtoReflect.Descriptor instead. +func (*MsgSell) Descriptor() ([]byte, []int) { + return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{0} +} + +func (x *MsgSell) GetSeller() string { + if x != nil { + return x.Seller + } + return "" +} + +func (x *MsgSell) GetOrders() []*MsgSell_Order { + if x != nil { + return x.Orders + } + return nil +} + +// MsgSellResponse is the Msg/Sell response type. +type MsgSellResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // sell_order_ids are the sell order IDs of the newly created sell orders. + SellOrderIds []uint64 `protobuf:"varint,1,rep,packed,name=sell_order_ids,json=sellOrderIds,proto3" json:"sell_order_ids,omitempty"` +} + +func (x *MsgSellResponse) Reset() { + *x = MsgSellResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgSellResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgSellResponse) ProtoMessage() {} + +// Deprecated: Use MsgSellResponse.ProtoReflect.Descriptor instead. +func (*MsgSellResponse) Descriptor() ([]byte, []int) { + return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{1} +} + +func (x *MsgSellResponse) GetSellOrderIds() []uint64 { + if x != nil { + return x.SellOrderIds + } + return nil +} + +// MsgUpdateSellOrders is the Msg/UpdateSellOrders request type. +type MsgUpdateSellOrders struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // seller is the address of the account that is selling credits. + Seller string `protobuf:"bytes,1,opt,name=seller,proto3" json:"seller,omitempty"` + // updates are updates to existing sell orders. + Updates []*MsgUpdateSellOrders_Update `protobuf:"bytes,2,rep,name=updates,proto3" json:"updates,omitempty"` +} + +func (x *MsgUpdateSellOrders) Reset() { + *x = MsgUpdateSellOrders{} + if protoimpl.UnsafeEnabled { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgUpdateSellOrders) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgUpdateSellOrders) ProtoMessage() {} + +// Deprecated: Use MsgUpdateSellOrders.ProtoReflect.Descriptor instead. +func (*MsgUpdateSellOrders) Descriptor() ([]byte, []int) { + return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{2} +} + +func (x *MsgUpdateSellOrders) GetSeller() string { + if x != nil { + return x.Seller + } + return "" +} + +func (x *MsgUpdateSellOrders) GetUpdates() []*MsgUpdateSellOrders_Update { + if x != nil { + return x.Updates + } + return nil +} + +// MsgUpdateSellOrdersResponse is the Msg/UpdateSellOrders response type. +type MsgUpdateSellOrdersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MsgUpdateSellOrdersResponse) Reset() { + *x = MsgUpdateSellOrdersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgUpdateSellOrdersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgUpdateSellOrdersResponse) ProtoMessage() {} + +// Deprecated: Use MsgUpdateSellOrdersResponse.ProtoReflect.Descriptor instead. +func (*MsgUpdateSellOrdersResponse) Descriptor() ([]byte, []int) { + return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{3} +} + +// MsgCancelSellOrder is the Msg/CancelSellOrder request type. +type MsgCancelSellOrder struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // seller is the address of the account that created the sell order and is + // therefore authorized to cancel the sell order. + Seller string `protobuf:"bytes,1,opt,name=seller,proto3" json:"seller,omitempty"` + // sell_order_id is the id of the seller order to cancel. + SellOrderId uint64 `protobuf:"varint,2,opt,name=sell_order_id,json=sellOrderId,proto3" json:"sell_order_id,omitempty"` +} + +func (x *MsgCancelSellOrder) Reset() { + *x = MsgCancelSellOrder{} + if protoimpl.UnsafeEnabled { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgCancelSellOrder) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgCancelSellOrder) ProtoMessage() {} + +// Deprecated: Use MsgCancelSellOrder.ProtoReflect.Descriptor instead. +func (*MsgCancelSellOrder) Descriptor() ([]byte, []int) { + return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{4} +} + +func (x *MsgCancelSellOrder) GetSeller() string { + if x != nil { + return x.Seller + } + return "" +} + +func (x *MsgCancelSellOrder) GetSellOrderId() uint64 { + if x != nil { + return x.SellOrderId + } return 0 } @@ -9157,6 +10135,88 @@ func (*MsgGovSetFeeParamsResponse) Descriptor() ([]byte, []int) { return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{13} } +// MsgSendFromFeePool is the Msg/SendFromFeePool request type. +type MsgGovSendFromFeePool struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // authority is the address of the governance account. + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + // recipient is the address of the account that will receive the funds. + Recipient string `protobuf:"bytes,2,opt,name=recipient,proto3" json:"recipient,omitempty"` + // amount is the amount of coins to send from the fee pool. + Amount []*v1beta1.Coin `protobuf:"bytes,3,rep,name=amount,proto3" json:"amount,omitempty"` +} + +func (x *MsgGovSendFromFeePool) Reset() { + *x = MsgGovSendFromFeePool{} + if protoimpl.UnsafeEnabled { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgGovSendFromFeePool) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgGovSendFromFeePool) ProtoMessage() {} + +// Deprecated: Use MsgGovSendFromFeePool.ProtoReflect.Descriptor instead. +func (*MsgGovSendFromFeePool) Descriptor() ([]byte, []int) { + return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{14} +} + +func (x *MsgGovSendFromFeePool) GetAuthority() string { + if x != nil { + return x.Authority + } + return "" +} + +func (x *MsgGovSendFromFeePool) GetRecipient() string { + if x != nil { + return x.Recipient + } + return "" +} + +func (x *MsgGovSendFromFeePool) GetAmount() []*v1beta1.Coin { + if x != nil { + return x.Amount + } + return nil +} + +// MsgSendFromFeePoolResponse is the Msg/SendFromFeePool response type. +type MsgGovSendFromFeePoolResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MsgGovSendFromFeePoolResponse) Reset() { + *x = MsgGovSendFromFeePoolResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgGovSendFromFeePoolResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgGovSendFromFeePoolResponse) ProtoMessage() {} + +// Deprecated: Use MsgGovSendFromFeePoolResponse.ProtoReflect.Descriptor instead. +func (*MsgGovSendFromFeePoolResponse) Descriptor() ([]byte, []int) { + return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP(), []int{15} +} + // Order is the content of a new sell order. type MsgSell_Order struct { state protoimpl.MessageState @@ -9187,7 +10247,7 @@ type MsgSell_Order struct { func (x *MsgSell_Order) Reset() { *x = MsgSell_Order{} if protoimpl.UnsafeEnabled { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[14] + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9262,7 +10322,7 @@ type MsgUpdateSellOrders_Update struct { func (x *MsgUpdateSellOrders_Update) Reset() { *x = MsgUpdateSellOrders_Update{} if protoimpl.UnsafeEnabled { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[15] + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9353,7 +10413,7 @@ type MsgBuyDirect_Order struct { func (x *MsgBuyDirect_Order) Reset() { *x = MsgBuyDirect_Order{} if protoimpl.UnsafeEnabled { - mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[16] + mi := &file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9558,81 +10618,101 @@ var file_regen_ecocredit_marketplace_v1_tx_proto_rawDesc = []byte{ 0x04, 0x66, 0x65, 0x65, 0x73, 0x3a, 0x0e, 0x82, 0xe7, 0xb0, 0x2a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x1c, 0x0a, 0x1a, 0x4d, 0x73, 0x67, 0x47, 0x6f, 0x76, 0x53, 0x65, 0x74, 0x46, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x32, 0xf8, 0x06, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x60, 0x0a, 0x04, 0x53, - 0x65, 0x6c, 0x6c, 0x12, 0x27, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, - 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x6c, 0x6c, 0x1a, 0x2f, 0x2e, 0x72, + 0x6e, 0x73, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x15, 0x4d, 0x73, 0x67, 0x47, 0x6f, 0x76, 0x53, 0x65, + 0x6e, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x46, 0x65, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, + 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x03, 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, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x0e, 0x82, 0xe7, + 0xb0, 0x2a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x1f, 0x0a, 0x1d, + 0x4d, 0x73, 0x67, 0x47, 0x6f, 0x76, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x46, 0x65, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x85, 0x08, + 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x60, 0x0a, 0x04, 0x53, 0x65, 0x6c, 0x6c, 0x12, 0x27, 0x2e, + 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x73, 0x67, 0x53, 0x65, 0x6c, 0x6c, 0x1a, 0x2f, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, + 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x6c, 0x6c, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x84, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, - 0x67, 0x53, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x84, 0x01, - 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x33, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, + 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x1a, 0x3b, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, + 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x6c, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, + 0x01, 0x0a, 0x0f, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, - 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3b, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, - 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x0f, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, - 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, - 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x1a, 0x3a, 0x2e, 0x72, - 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, - 0x67, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x09, 0x42, 0x75, 0x79, 0x44, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, - 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x75, 0x79, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, - 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x75, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x0f, 0x41, 0x64, - 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x32, 0x2e, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x65, 0x6c, + 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x1a, 0x3a, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, + 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x09, 0x42, 0x75, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, + 0x2c, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, + 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x75, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x1a, 0x34, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x73, 0x67, 0x41, 0x64, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x6f, - 0x6d, 0x1a, 0x3a, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, - 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, - 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, - 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, - 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x1a, 0x3d, 0x2e, 0x72, 0x65, + 0x73, 0x67, 0x42, 0x75, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, + 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x1a, 0x3a, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x6e, - 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x0f, 0x47, - 0x6f, 0x76, 0x53, 0x65, 0x74, 0x46, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x32, + 0x41, 0x64, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x73, 0x67, 0x47, 0x6f, 0x76, 0x53, 0x65, 0x74, 0x46, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x1a, 0x3a, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, - 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x47, 0x6f, 0x76, 0x53, 0x65, 0x74, 0x46, 0x65, 0x65, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xa0, - 0x02, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, - 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x56, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x67, - 0x65, 0x6e, 0x2d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x72, 0x65, 0x67, 0x65, 0x6e, - 0x2d, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x67, 0x65, - 0x6e, 0x2f, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x45, 0x4d, 0xaa, 0x02, - 0x1e, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x45, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, - 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x1e, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x5c, 0x45, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, - 0x74, 0x5c, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5c, 0x56, 0x31, - 0xe2, 0x02, 0x2a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x5c, 0x45, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, - 0x69, 0x74, 0x5c, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5c, 0x56, - 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x21, - 0x52, 0x65, 0x67, 0x65, 0x6e, 0x3a, 0x3a, 0x45, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, - 0x3a, 0x3a, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x3a, 0x56, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x1a, 0x3d, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, + 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x0f, 0x47, 0x6f, 0x76, 0x53, 0x65, 0x74, 0x46, + 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x32, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, + 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x47, 0x6f, 0x76, + 0x53, 0x65, 0x74, 0x46, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x3a, 0x2e, 0x72, + 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, + 0x67, 0x47, 0x6f, 0x76, 0x53, 0x65, 0x74, 0x46, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x12, 0x47, 0x6f, 0x76, + 0x53, 0x65, 0x6e, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x46, 0x65, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, + 0x35, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, + 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x73, 0x67, 0x47, 0x6f, 0x76, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x46, + 0x65, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x1a, 0x3d, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x65, + 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x47, 0x6f, 0x76, 0x53, 0x65, + 0x6e, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x46, 0x65, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xa0, 0x02, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, + 0x67, 0x65, 0x6e, 0x2e, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x56, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2f, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2d, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, + 0x69, 0x74, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x76, + 0x31, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x76, 0x31, 0xa2, + 0x02, 0x03, 0x52, 0x45, 0x4d, 0xaa, 0x02, 0x1e, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x2e, 0x45, 0x63, + 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x1e, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x5c, 0x45, + 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5c, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x2a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x5c, + 0x45, 0x63, 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x5c, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x21, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x3a, 0x3a, 0x45, 0x63, + 0x6f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x3a, 0x3a, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -9647,7 +10727,7 @@ func file_regen_ecocredit_marketplace_v1_tx_proto_rawDescGZIP() []byte { return file_regen_ecocredit_marketplace_v1_tx_proto_rawDescData } -var file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 19) var file_regen_ecocredit_marketplace_v1_tx_proto_goTypes = []interface{}{ (*MsgSell)(nil), // 0: regen.ecocredit.marketplace.v1.MsgSell (*MsgSellResponse)(nil), // 1: regen.ecocredit.marketplace.v1.MsgSellResponse @@ -9663,43 +10743,48 @@ var file_regen_ecocredit_marketplace_v1_tx_proto_goTypes = []interface{}{ (*MsgRemoveAllowedDenomResponse)(nil), // 11: regen.ecocredit.marketplace.v1.MsgRemoveAllowedDenomResponse (*MsgGovSetFeeParams)(nil), // 12: regen.ecocredit.marketplace.v1.MsgGovSetFeeParams (*MsgGovSetFeeParamsResponse)(nil), // 13: regen.ecocredit.marketplace.v1.MsgGovSetFeeParamsResponse - (*MsgSell_Order)(nil), // 14: regen.ecocredit.marketplace.v1.MsgSell.Order - (*MsgUpdateSellOrders_Update)(nil), // 15: regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.Update - (*MsgBuyDirect_Order)(nil), // 16: regen.ecocredit.marketplace.v1.MsgBuyDirect.Order - (*FeeParams)(nil), // 17: regen.ecocredit.marketplace.v1.FeeParams - (*v1beta1.Coin)(nil), // 18: cosmos.base.v1beta1.Coin - (*timestamppb.Timestamp)(nil), // 19: google.protobuf.Timestamp + (*MsgGovSendFromFeePool)(nil), // 14: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool + (*MsgGovSendFromFeePoolResponse)(nil), // 15: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse + (*MsgSell_Order)(nil), // 16: regen.ecocredit.marketplace.v1.MsgSell.Order + (*MsgUpdateSellOrders_Update)(nil), // 17: regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.Update + (*MsgBuyDirect_Order)(nil), // 18: regen.ecocredit.marketplace.v1.MsgBuyDirect.Order + (*FeeParams)(nil), // 19: regen.ecocredit.marketplace.v1.FeeParams + (*v1beta1.Coin)(nil), // 20: cosmos.base.v1beta1.Coin + (*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp } var file_regen_ecocredit_marketplace_v1_tx_proto_depIdxs = []int32{ - 14, // 0: regen.ecocredit.marketplace.v1.MsgSell.orders:type_name -> regen.ecocredit.marketplace.v1.MsgSell.Order - 15, // 1: regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.updates:type_name -> regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.Update - 16, // 2: regen.ecocredit.marketplace.v1.MsgBuyDirect.orders:type_name -> regen.ecocredit.marketplace.v1.MsgBuyDirect.Order - 17, // 3: regen.ecocredit.marketplace.v1.MsgGovSetFeeParams.fees:type_name -> regen.ecocredit.marketplace.v1.FeeParams - 18, // 4: regen.ecocredit.marketplace.v1.MsgSell.Order.ask_price:type_name -> cosmos.base.v1beta1.Coin - 19, // 5: regen.ecocredit.marketplace.v1.MsgSell.Order.expiration:type_name -> google.protobuf.Timestamp - 18, // 6: regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.Update.new_ask_price:type_name -> cosmos.base.v1beta1.Coin - 19, // 7: regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.Update.new_expiration:type_name -> google.protobuf.Timestamp - 18, // 8: regen.ecocredit.marketplace.v1.MsgBuyDirect.Order.bid_price:type_name -> cosmos.base.v1beta1.Coin - 18, // 9: regen.ecocredit.marketplace.v1.MsgBuyDirect.Order.max_fee_amount:type_name -> cosmos.base.v1beta1.Coin - 0, // 10: regen.ecocredit.marketplace.v1.Msg.Sell:input_type -> regen.ecocredit.marketplace.v1.MsgSell - 2, // 11: regen.ecocredit.marketplace.v1.Msg.UpdateSellOrders:input_type -> regen.ecocredit.marketplace.v1.MsgUpdateSellOrders - 4, // 12: regen.ecocredit.marketplace.v1.Msg.CancelSellOrder:input_type -> regen.ecocredit.marketplace.v1.MsgCancelSellOrder - 6, // 13: regen.ecocredit.marketplace.v1.Msg.BuyDirect:input_type -> regen.ecocredit.marketplace.v1.MsgBuyDirect - 8, // 14: regen.ecocredit.marketplace.v1.Msg.AddAllowedDenom:input_type -> regen.ecocredit.marketplace.v1.MsgAddAllowedDenom - 10, // 15: regen.ecocredit.marketplace.v1.Msg.RemoveAllowedDenom:input_type -> regen.ecocredit.marketplace.v1.MsgRemoveAllowedDenom - 12, // 16: regen.ecocredit.marketplace.v1.Msg.GovSetFeeParams:input_type -> regen.ecocredit.marketplace.v1.MsgGovSetFeeParams - 1, // 17: regen.ecocredit.marketplace.v1.Msg.Sell:output_type -> regen.ecocredit.marketplace.v1.MsgSellResponse - 3, // 18: regen.ecocredit.marketplace.v1.Msg.UpdateSellOrders:output_type -> regen.ecocredit.marketplace.v1.MsgUpdateSellOrdersResponse - 5, // 19: regen.ecocredit.marketplace.v1.Msg.CancelSellOrder:output_type -> regen.ecocredit.marketplace.v1.MsgCancelSellOrderResponse - 7, // 20: regen.ecocredit.marketplace.v1.Msg.BuyDirect:output_type -> regen.ecocredit.marketplace.v1.MsgBuyDirectResponse - 9, // 21: regen.ecocredit.marketplace.v1.Msg.AddAllowedDenom:output_type -> regen.ecocredit.marketplace.v1.MsgAddAllowedDenomResponse - 11, // 22: regen.ecocredit.marketplace.v1.Msg.RemoveAllowedDenom:output_type -> regen.ecocredit.marketplace.v1.MsgRemoveAllowedDenomResponse - 13, // 23: regen.ecocredit.marketplace.v1.Msg.GovSetFeeParams:output_type -> regen.ecocredit.marketplace.v1.MsgGovSetFeeParamsResponse - 17, // [17:24] is the sub-list for method output_type - 10, // [10:17] 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 + 16, // 0: regen.ecocredit.marketplace.v1.MsgSell.orders:type_name -> regen.ecocredit.marketplace.v1.MsgSell.Order + 17, // 1: regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.updates:type_name -> regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.Update + 18, // 2: regen.ecocredit.marketplace.v1.MsgBuyDirect.orders:type_name -> regen.ecocredit.marketplace.v1.MsgBuyDirect.Order + 19, // 3: regen.ecocredit.marketplace.v1.MsgGovSetFeeParams.fees:type_name -> regen.ecocredit.marketplace.v1.FeeParams + 20, // 4: regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool.amount:type_name -> cosmos.base.v1beta1.Coin + 20, // 5: regen.ecocredit.marketplace.v1.MsgSell.Order.ask_price:type_name -> cosmos.base.v1beta1.Coin + 21, // 6: regen.ecocredit.marketplace.v1.MsgSell.Order.expiration:type_name -> google.protobuf.Timestamp + 20, // 7: regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.Update.new_ask_price:type_name -> cosmos.base.v1beta1.Coin + 21, // 8: regen.ecocredit.marketplace.v1.MsgUpdateSellOrders.Update.new_expiration:type_name -> google.protobuf.Timestamp + 20, // 9: regen.ecocredit.marketplace.v1.MsgBuyDirect.Order.bid_price:type_name -> cosmos.base.v1beta1.Coin + 20, // 10: regen.ecocredit.marketplace.v1.MsgBuyDirect.Order.max_fee_amount:type_name -> cosmos.base.v1beta1.Coin + 0, // 11: regen.ecocredit.marketplace.v1.Msg.Sell:input_type -> regen.ecocredit.marketplace.v1.MsgSell + 2, // 12: regen.ecocredit.marketplace.v1.Msg.UpdateSellOrders:input_type -> regen.ecocredit.marketplace.v1.MsgUpdateSellOrders + 4, // 13: regen.ecocredit.marketplace.v1.Msg.CancelSellOrder:input_type -> regen.ecocredit.marketplace.v1.MsgCancelSellOrder + 6, // 14: regen.ecocredit.marketplace.v1.Msg.BuyDirect:input_type -> regen.ecocredit.marketplace.v1.MsgBuyDirect + 8, // 15: regen.ecocredit.marketplace.v1.Msg.AddAllowedDenom:input_type -> regen.ecocredit.marketplace.v1.MsgAddAllowedDenom + 10, // 16: regen.ecocredit.marketplace.v1.Msg.RemoveAllowedDenom:input_type -> regen.ecocredit.marketplace.v1.MsgRemoveAllowedDenom + 12, // 17: regen.ecocredit.marketplace.v1.Msg.GovSetFeeParams:input_type -> regen.ecocredit.marketplace.v1.MsgGovSetFeeParams + 14, // 18: regen.ecocredit.marketplace.v1.Msg.GovSendFromFeePool:input_type -> regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool + 1, // 19: regen.ecocredit.marketplace.v1.Msg.Sell:output_type -> regen.ecocredit.marketplace.v1.MsgSellResponse + 3, // 20: regen.ecocredit.marketplace.v1.Msg.UpdateSellOrders:output_type -> regen.ecocredit.marketplace.v1.MsgUpdateSellOrdersResponse + 5, // 21: regen.ecocredit.marketplace.v1.Msg.CancelSellOrder:output_type -> regen.ecocredit.marketplace.v1.MsgCancelSellOrderResponse + 7, // 22: regen.ecocredit.marketplace.v1.Msg.BuyDirect:output_type -> regen.ecocredit.marketplace.v1.MsgBuyDirectResponse + 9, // 23: regen.ecocredit.marketplace.v1.Msg.AddAllowedDenom:output_type -> regen.ecocredit.marketplace.v1.MsgAddAllowedDenomResponse + 11, // 24: regen.ecocredit.marketplace.v1.Msg.RemoveAllowedDenom:output_type -> regen.ecocredit.marketplace.v1.MsgRemoveAllowedDenomResponse + 13, // 25: regen.ecocredit.marketplace.v1.Msg.GovSetFeeParams:output_type -> regen.ecocredit.marketplace.v1.MsgGovSetFeeParamsResponse + 15, // 26: regen.ecocredit.marketplace.v1.Msg.GovSendFromFeePool:output_type -> regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse + 19, // [19:27] is the sub-list for method output_type + 11, // [11:19] 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_regen_ecocredit_marketplace_v1_tx_proto_init() } @@ -9878,7 +10963,7 @@ func file_regen_ecocredit_marketplace_v1_tx_proto_init() { } } file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsgSell_Order); i { + switch v := v.(*MsgGovSendFromFeePool); i { case 0: return &v.state case 1: @@ -9890,7 +10975,7 @@ func file_regen_ecocredit_marketplace_v1_tx_proto_init() { } } file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsgUpdateSellOrders_Update); i { + switch v := v.(*MsgGovSendFromFeePoolResponse); i { case 0: return &v.state case 1: @@ -9902,6 +10987,30 @@ func file_regen_ecocredit_marketplace_v1_tx_proto_init() { } } file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgSell_Order); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgUpdateSellOrders_Update); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_regen_ecocredit_marketplace_v1_tx_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MsgBuyDirect_Order); i { case 0: return &v.state @@ -9920,7 +11029,7 @@ func file_regen_ecocredit_marketplace_v1_tx_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_regen_ecocredit_marketplace_v1_tx_proto_rawDesc, NumEnums: 0, - NumMessages: 17, + NumMessages: 19, NumExtensions: 0, NumServices: 1, }, diff --git a/api/regen/ecocredit/marketplace/v1/tx_grpc.pb.go b/api/regen/ecocredit/marketplace/v1/tx_grpc.pb.go index 627959b2c0..e1c1512e4a 100644 --- a/api/regen/ecocredit/marketplace/v1/tx_grpc.pb.go +++ b/api/regen/ecocredit/marketplace/v1/tx_grpc.pb.go @@ -26,6 +26,7 @@ const ( Msg_AddAllowedDenom_FullMethodName = "/regen.ecocredit.marketplace.v1.Msg/AddAllowedDenom" Msg_RemoveAllowedDenom_FullMethodName = "/regen.ecocredit.marketplace.v1.Msg/RemoveAllowedDenom" Msg_GovSetFeeParams_FullMethodName = "/regen.ecocredit.marketplace.v1.Msg/GovSetFeeParams" + Msg_GovSendFromFeePool_FullMethodName = "/regen.ecocredit.marketplace.v1.Msg/GovSendFromFeePool" ) // MsgClient is the client API for Msg service. @@ -53,6 +54,11 @@ type MsgClient interface { // // Since Revision 3 GovSetFeeParams(ctx context.Context, in *MsgGovSetFeeParams, opts ...grpc.CallOption) (*MsgGovSetFeeParamsResponse, error) + // GovSendFromFeePool is a governance method that allows the sending of the + // marketplace fees. + // + // Since Revision 3 + GovSendFromFeePool(ctx context.Context, in *MsgGovSendFromFeePool, opts ...grpc.CallOption) (*MsgGovSendFromFeePoolResponse, error) } type msgClient struct { @@ -126,6 +132,15 @@ func (c *msgClient) GovSetFeeParams(ctx context.Context, in *MsgGovSetFeeParams, return out, nil } +func (c *msgClient) GovSendFromFeePool(ctx context.Context, in *MsgGovSendFromFeePool, opts ...grpc.CallOption) (*MsgGovSendFromFeePoolResponse, error) { + out := new(MsgGovSendFromFeePoolResponse) + err := c.cc.Invoke(ctx, Msg_GovSendFromFeePool_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. // All implementations must embed UnimplementedMsgServer // for forward compatibility @@ -151,6 +166,11 @@ type MsgServer interface { // // Since Revision 3 GovSetFeeParams(context.Context, *MsgGovSetFeeParams) (*MsgGovSetFeeParamsResponse, error) + // GovSendFromFeePool is a governance method that allows the sending of the + // marketplace fees. + // + // Since Revision 3 + GovSendFromFeePool(context.Context, *MsgGovSendFromFeePool) (*MsgGovSendFromFeePoolResponse, error) mustEmbedUnimplementedMsgServer() } @@ -179,6 +199,9 @@ func (UnimplementedMsgServer) RemoveAllowedDenom(context.Context, *MsgRemoveAllo func (UnimplementedMsgServer) GovSetFeeParams(context.Context, *MsgGovSetFeeParams) (*MsgGovSetFeeParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GovSetFeeParams not implemented") } +func (UnimplementedMsgServer) GovSendFromFeePool(context.Context, *MsgGovSendFromFeePool) (*MsgGovSendFromFeePoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GovSendFromFeePool not implemented") +} func (UnimplementedMsgServer) mustEmbedUnimplementedMsgServer() {} // UnsafeMsgServer may be embedded to opt out of forward compatibility for this service. @@ -318,6 +341,24 @@ func _Msg_GovSetFeeParams_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Msg_GovSendFromFeePool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgGovSendFromFeePool) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).GovSendFromFeePool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Msg_GovSendFromFeePool_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).GovSendFromFeePool(ctx, req.(*MsgGovSendFromFeePool)) + } + return interceptor(ctx, in, info, handler) +} + // Msg_ServiceDesc is the grpc.ServiceDesc for Msg service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -353,6 +394,10 @@ var Msg_ServiceDesc = grpc.ServiceDesc{ MethodName: "GovSetFeeParams", Handler: _Msg_GovSetFeeParams_Handler, }, + { + MethodName: "GovSendFromFeePool", + Handler: _Msg_GovSendFromFeePool_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "regen/ecocredit/marketplace/v1/tx.proto", diff --git a/proto/regen/ecocredit/marketplace/v1/tx.proto b/proto/regen/ecocredit/marketplace/v1/tx.proto index cb5cfcdfb3..efcc3ed067 100644 --- a/proto/regen/ecocredit/marketplace/v1/tx.proto +++ b/proto/regen/ecocredit/marketplace/v1/tx.proto @@ -43,6 +43,14 @@ service Msg { // Since Revision 3 rpc GovSetFeeParams(MsgGovSetFeeParams) returns (MsgGovSetFeeParamsResponse); + + // GovSendFromFeePool is a governance method that allows the sending of the + // marketplace fees. + // + // Since Revision 3 + rpc GovSendFromFeePool(MsgGovSendFromFeePool) + returns (MsgGovSendFromFeePoolResponse); + } // MsgSell is the Msg/Sell request type. @@ -251,3 +259,20 @@ message MsgGovSetFeeParams { // MsgSetFeeParamsResponse is the Msg/SetFeeParams response type. message MsgGovSetFeeParamsResponse {} + +// MsgSendFromFeePool is the Msg/SendFromFeePool request type. +message MsgGovSendFromFeePool { + option (cosmos.msg.v1.signer) = "authority"; + + // authority is the address of the governance account. + string authority = 1; + + // recipient is the address of the account that will receive the funds. + string recipient = 2; + + // amount is the amount of coins to send from the fee pool. + repeated cosmos.base.v1beta1.Coin amount = 3; +} + +// MsgSendFromFeePoolResponse is the Msg/SendFromFeePool response type. +message MsgGovSendFromFeePoolResponse {} \ No newline at end of file diff --git a/x/ecocredit/marketplace/keeper/features/msg_gov_send_from_fee_pool.feature b/x/ecocredit/marketplace/keeper/features/msg_gov_send_from_fee_pool.feature new file mode 100644 index 0000000000..928b533900 --- /dev/null +++ b/x/ecocredit/marketplace/keeper/features/msg_gov_send_from_fee_pool.feature @@ -0,0 +1,41 @@ +Feature: Msg/SendFromFeePool + + Background: + Given recipient "regen1nzh226hxrsvf4k69sa8v0nfuzx5vgwkczk8j68" + + Rule: gov authority must be authorized + Scenario: gov authority is not authorized + Given authority is set to "regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw" + When funds are sent + Then expect error contains "unauthorized" + + Scenario: gov authority is authorized + Given authority is set to the keeper authority + When funds are sent + Then expect no error + + Rule: the fee pool must have enough funds to cover the fee + Background: + Given authority is set to the keeper authority + + Scenario: fee pool is underfunded + Given fee pool balance "100foo" + And send amount "200foo" + When funds are sent + Then expect error contains "insufficient funds" + + Scenario: fee pool is well funded + Given fee pool balance "1000foo" + And send amount "200foo" + When funds are sent + Then expect no error + + Rule: funds are transferred from the fee pool to the recipient + Scenario: funds are transferred + Given authority is set to the keeper authority + Given fee pool balance "1000foo" + And send amount "200foo" + When funds are sent + Then expect no error + And fee pool balance "800foo" + And recipient balance "200foo" diff --git a/x/ecocredit/marketplace/keeper/features/msg_gov_set_fee_params.feature b/x/ecocredit/marketplace/keeper/features/msg_gov_set_fee_params.feature new file mode 100644 index 0000000000..69fa442615 --- /dev/null +++ b/x/ecocredit/marketplace/keeper/features/msg_gov_set_fee_params.feature @@ -0,0 +1,51 @@ +Feature: Msg/SetFeeParams + + Rule: gov authority must be authorized + Background: + Given fee params + """ + {} + """ + + Scenario: gov authority is not authorized + Given authority is set to "regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw" + When fee params are set + Then expect error contains "unauthorized" + + Scenario: gov authority is authorized + Given authority is set to the keeper authority + When fee params are set + Then expect no error + + Rule: fee params get saved + Scenario: non-empty fee params + Given authority is set to the keeper authority + And fee params + """ + { + "buyer_percentage_fee": "0.01", + "seller_percentage_fee": "0.01" + } + """ + When fee params are set + Then expect no error + And expect fee params + """ + { + "buyer_percentage_fee": "0.01", + "seller_percentage_fee": "0.01" + } + """ + + Scenario: empty fee params + Given authority is set to the keeper authority + And fee params + """ + {} + """ + When fee params are set + Then expect no error + And expect fee params + """ + {} + """ diff --git a/x/ecocredit/marketplace/keeper/msg_gov_send_from_fee_pool.go b/x/ecocredit/marketplace/keeper/msg_gov_send_from_fee_pool.go new file mode 100644 index 0000000000..40329069a3 --- /dev/null +++ b/x/ecocredit/marketplace/keeper/msg_gov_send_from_fee_pool.go @@ -0,0 +1,35 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + types "github.com/regen-network/regen-ledger/x/ecocredit/v3/marketplace/types/v1" +) + +func (k Keeper) GovSendFromFeePool(ctx context.Context, msg *types.MsgGovSendFromFeePool) (*types.MsgGovSendFromFeePoolResponse, error) { + authority, err := sdk.AccAddressFromBech32(msg.Authority) + if err != nil { + return nil, err + } + + if !authority.Equals(k.authority) { + return nil, sdkerrors.ErrUnauthorized + } + + recipient, err := sdk.AccAddressFromBech32(msg.Recipient) + if err != nil { + return nil, err + } + + amount := types.ToSDKCoins(msg.Amount) + + err = k.bankKeeper.SendCoinsFromModuleToAccount(sdk.UnwrapSDKContext(ctx), k.feePoolName, recipient, amount) + if err != nil { + return nil, err + } + + return &types.MsgGovSendFromFeePoolResponse{}, nil +} diff --git a/x/ecocredit/marketplace/keeper/msg_gov_send_from_fee_pool_test.go b/x/ecocredit/marketplace/keeper/msg_gov_send_from_fee_pool_test.go new file mode 100644 index 0000000000..6c73a6a6c7 --- /dev/null +++ b/x/ecocredit/marketplace/keeper/msg_gov_send_from_fee_pool_test.go @@ -0,0 +1,107 @@ +package keeper + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/golang/mock/gomock" + "github.com/regen-network/gocuke" + "github.com/stretchr/testify/require" + + types "github.com/regen-network/regen-ledger/x/ecocredit/v3/marketplace/types/v1" +) + +type govSendFromFeePool struct { + *baseSuite + err error + msg *types.MsgGovSendFromFeePool + moduleBalances map[string]sdk.Coins + accountBalances map[string]sdk.Coins +} + +func TestGovSendFromFeePool(t *testing.T) { + gocuke.NewRunner(t, &govSendFromFeePool{}).Path("./features/msg_gov_send_from_fee_pool.feature").Run() +} + +func (s *govSendFromFeePool) Before(t gocuke.TestingT) { + s.baseSuite = setupBase(t, 2) + s.msg = &types.MsgGovSendFromFeePool{} + s.moduleBalances = make(map[string]sdk.Coins) + s.accountBalances = make(map[string]sdk.Coins) + s.bankKeeper.EXPECT(). + SendCoinsFromModuleToAccount(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + AnyTimes(). + DoAndReturn(func(_ sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amount sdk.Coins) error { + newModBalance, neg := s.moduleBalances[senderModule].SafeSub(amount...) + if neg { + return sdkerrors.ErrInsufficientFunds + } + + s.moduleBalances[senderModule] = newModBalance + s.accountBalances[recipientAddr.String()] = s.accountBalances[recipientAddr.String()].Add(amount...) + return nil + }) +} + +func (s *govSendFromFeePool) AuthorityIsSetToTheKeeperAuthority() { + s.msg.Authority = s.k.authority.String() +} + +func (s *govSendFromFeePool) AuthorityIsSetTo(a string) { + s.msg.Authority = a +} + +func (s *govSendFromFeePool) Recipient(a string) { + s.msg.Recipient = a +} + +func (s *govSendFromFeePool) SendAmount(a string) { + coins, err := sdk.ParseCoinsNormalized(a) + require.NoError(s.t, err) + var ptrCoins []*sdk.Coin + for _, coin := range coins { + ptrCoins = append(ptrCoins, &coin) + } + s.msg.Amount = ptrCoins +} + +func (s *govSendFromFeePool) FeePoolBalance(a string) { + coins, err := sdk.ParseCoinsNormalized(a) + require.NoError(s.t, err) + s.moduleBalances[s.k.feePoolName] = coins +} + +func (s *govSendFromFeePool) RecipientBalance(a string) { + coins, err := sdk.ParseCoinsNormalized(a) + require.NoError(s.t, err) + s.accountBalances[s.msg.Recipient] = coins +} + +func (s *govSendFromFeePool) FundsAreSent() { + _, s.err = s.k.GovSendFromFeePool(s.ctx, s.msg) +} + +func (s *govSendFromFeePool) ExpectErrorContains(a string) { + if s.err != nil { + require.ErrorContains(s.t, s.err, a) + } else { + require.NoError(s.t, s.err) + } +} + +func (s *govSendFromFeePool) ExpectNoError() { + require.NoError(s.t, s.err) +} + +func (s *govSendFromFeePool) ExpectFeePoolBalance(a string) { + coins, err := sdk.ParseCoinsNormalized(a) + require.NoError(s.t, err) + require.True(s.t, coins.IsEqual(s.moduleBalances[s.k.feePoolName])) +} + +func (s *govSendFromFeePool) ExpectRecipientBalance(a string) { + coins, err := sdk.ParseCoinsNormalized(a) + require.NoError(s.t, err) + require.True(s.t, coins.IsEqual(s.accountBalances[s.msg.Recipient])) +} diff --git a/x/ecocredit/marketplace/keeper/msg_gov_set_fee_params_test.go b/x/ecocredit/marketplace/keeper/msg_gov_set_fee_params_test.go new file mode 100644 index 0000000000..4b1e4f8b8b --- /dev/null +++ b/x/ecocredit/marketplace/keeper/msg_gov_set_fee_params_test.go @@ -0,0 +1,68 @@ +package keeper + +import ( + "testing" + + "github.com/gogo/protobuf/jsonpb" + "github.com/google/go-cmp/cmp" + "github.com/regen-network/gocuke" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/testing/protocmp" + + marketplacev1 "github.com/regen-network/regen-ledger/api/v2/regen/ecocredit/marketplace/v1" + types "github.com/regen-network/regen-ledger/x/ecocredit/v3/marketplace/types/v1" +) + +type govSetFeeParams struct { + *baseSuite + err error + msg *types.MsgGovSetFeeParams +} + +func TestGovSetFeeParams(t *testing.T) { + gocuke.NewRunner(t, &govSetFeeParams{}).Path("./features/msg_gov_set_fee_params.feature").Run() +} + +func (s *govSetFeeParams) Before(t gocuke.TestingT) { + s.baseSuite = setupBase(t, 2) + s.msg = &types.MsgGovSetFeeParams{} +} + +func (s *govSetFeeParams) AuthorityIsSetToTheKeeperAuthority() { + s.msg.Authority = s.k.authority.String() +} + +func (s *govSetFeeParams) AuthorityIsSetTo(a string) { + s.msg.Authority = a +} + +func (s *govSetFeeParams) FeeParams(a gocuke.DocString) { + s.msg.Fees = &types.FeeParams{} + require.NoError(s.t, jsonpb.UnmarshalString(a.Content, s.msg.Fees)) +} + +func (s *govSetFeeParams) FeeParamsAreSet() { + _, s.err = s.k.GovSetFeeParams(s.ctx, s.msg) +} + +func (s *govSetFeeParams) ExpectErrorContains(a string) { + if s.err != nil { + require.ErrorContains(s.t, s.err, a) + } else { + require.NoError(s.t, s.err) + } +} + +func (s *govSetFeeParams) ExpectNoError() { + require.NoError(s.t, s.err) +} + +func (s *govSetFeeParams) ExpectFeeParams(a gocuke.DocString) { + var expected marketplacev1.FeeParams + require.NoError(s.t, jsonpb.UnmarshalString(a.Content, &expected)) + actual, err := s.k.stateStore.FeeParamsTable().Get(s.ctx) + require.NoError(s.t, err) + if diff := cmp.Diff(&expected, actual, protocmp.Transform()); diff != "" { + require.Fail(s.t, "unexpected fee params", diff) + } +} diff --git a/x/ecocredit/marketplace/types/v1/features/msg_gov_send_from_fee_pool.feature b/x/ecocredit/marketplace/types/v1/features/msg_gov_send_from_fee_pool.feature new file mode 100644 index 0000000000..a98172a78f --- /dev/null +++ b/x/ecocredit/marketplace/types/v1/features/msg_gov_send_from_fee_pool.feature @@ -0,0 +1,18 @@ +Feature: MsgGovSetFeeParams + + Scenario Outline: validate message + Given authority "" + * recipient "" + * amount "" + When the message is validated + Then expect error contains "" + + Examples: + | authority | recipient | amount | error | + | | | | empty address | + | foobar | | | bech32 | + | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | | | empty address | + | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | foobar | | bech32 | + | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | regen1nzh226hxrsvf4k69sa8v0nfuzx5vgwkczk8j68 | | amount | + | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | regen1nzh226hxrsvf4k69sa8v0nfuzx5vgwkczk8j68 | 100foo | | + diff --git a/x/ecocredit/marketplace/types/v1/features/msg_gov_set_fee_params.feature b/x/ecocredit/marketplace/types/v1/features/msg_gov_set_fee_params.feature index 812e2f0c81..39bc040aac 100644 --- a/x/ecocredit/marketplace/types/v1/features/msg_gov_set_fee_params.feature +++ b/x/ecocredit/marketplace/types/v1/features/msg_gov_set_fee_params.feature @@ -4,12 +4,14 @@ Feature: MsgGovSetFeeParams Given authority "" And fee params `` When the message is validated - Then expect error + Then expect error contains "" Examples: - | authority | fee_params | error | - | | {} | true | - | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | {} | false | - | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | {"buyer_percentage_fee":"-0.1"} | true | - | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | {"buyer_percentage_fee":"0.1"} | false | + | authority | fee_params | error | + | | {} | address | + | foobar | {} | bech32 | + | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | | fees cannot be nil | + | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | {} | | + | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | {"buyer_percentage_fee":"-0.1"} | non-negative decimal | + | regen1elq7ys34gpkj3jyvqee0h6yk4h9wsfxmgqelsw | {"buyer_percentage_fee":"0.1"} | | diff --git a/x/ecocredit/marketplace/types/v1/msg_gov_send_from_fee_pool.go b/x/ecocredit/marketplace/types/v1/msg_gov_send_from_fee_pool.go new file mode 100644 index 0000000000..373495bf76 --- /dev/null +++ b/x/ecocredit/marketplace/types/v1/msg_gov_send_from_fee_pool.go @@ -0,0 +1,52 @@ +package v1 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" +) + +var _ legacytx.LegacyMsg = &MsgGovSendFromFeePool{} + +// ValidateBasic does a sanity check on the provided data. +func (m *MsgGovSendFromFeePool) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(m.Authority) + if err != nil { + return err + } + + _, err = sdk.AccAddressFromBech32(m.Recipient) + if err != nil { + return err + } + + if m.Amount == nil { + return sdkerrors.ErrInvalidRequest.Wrap("amount cannot be nil") + } + + amount := ToSDKCoins(m.Amount) + return amount.Validate() +} + +// GetSigners implements the LegacyMsg interface. +func (m *MsgGovSendFromFeePool) GetSigners() []sdk.AccAddress { + return []sdk.AccAddress{sdk.MustAccAddressFromBech32(m.Authority)} +} + +// Route implements the LegacyMsg interface. +func (m *MsgGovSendFromFeePool) Route() string { return sdk.MsgTypeURL(m) } + +// Type implements the LegacyMsg interface. +func (m *MsgGovSendFromFeePool) Type() string { return sdk.MsgTypeURL(m) } + +// GetSignBytes implements the LegacyMsg interface. +func (m *MsgGovSendFromFeePool) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(m)) +} + +func ToSDKCoins(collection []*sdk.Coin) (coins sdk.Coins) { + for _, coin := range collection { + coins = append(coins, *coin) + } + return +} diff --git a/x/ecocredit/marketplace/types/v1/msg_gov_send_from_fee_pool_test.go b/x/ecocredit/marketplace/types/v1/msg_gov_send_from_fee_pool_test.go new file mode 100644 index 0000000000..4d4555f593 --- /dev/null +++ b/x/ecocredit/marketplace/types/v1/msg_gov_send_from_fee_pool_test.go @@ -0,0 +1,55 @@ +package v1 + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/regen-network/gocuke" + "github.com/stretchr/testify/require" +) + +type govSendFromFeePool struct { + gocuke.TestingT + msg *MsgGovSendFromFeePool + err error +} + +func TestGovSendFromFeePool(t *testing.T) { + gocuke.NewRunner(t, &govSendFromFeePool{}). + Path("./features/msg_gov_send_from_fee_pool.feature"). + Run() +} + +func (s *govSendFromFeePool) Before() { + s.msg = &MsgGovSendFromFeePool{} +} + +func (s *govSendFromFeePool) Authority(a string) { + s.msg.Authority = a +} + +func (s *govSendFromFeePool) Recipient(a string) { + s.msg.Recipient = a +} + +func (s *govSendFromFeePool) Amount(a string) { + coins, err := sdk.ParseCoinsNormalized(a) + require.NoError(s, err) + var ptrCoins []*sdk.Coin + for _, coin := range coins { + ptrCoins = append(ptrCoins, &coin) + } + s.msg.Amount = ptrCoins +} + +func (s *govSendFromFeePool) TheMessageIsValidated() { + s.err = s.msg.ValidateBasic() +} + +func (s *govSendFromFeePool) ExpectErrorContains(a string) { + if a != "" { + require.ErrorContains(s, s.err, a) + } else { + require.NoError(s, s.err) + } +} diff --git a/x/ecocredit/marketplace/types/v1/msg_gov_set_fee_params_test.go b/x/ecocredit/marketplace/types/v1/msg_gov_set_fee_params_test.go index 6fc9ff090c..d5c488a300 100644 --- a/x/ecocredit/marketplace/types/v1/msg_gov_set_fee_params_test.go +++ b/x/ecocredit/marketplace/types/v1/msg_gov_set_fee_params_test.go @@ -40,10 +40,10 @@ func (s *govSetFeeParams) TheMessageIsValidated() { s.err = s.msg.ValidateBasic() } -func (s *govSetFeeParams) ExpectErrorTrue() { - require.Error(s, s.err) -} - -func (s *govSetFeeParams) ExpectErrorFalse() { - require.NoError(s, s.err) +func (s *govSetFeeParams) ExpectErrorContains(a string) { + if a != "" { + require.ErrorContains(s, s.err, a) + } else { + require.NoError(s, s.err) + } } diff --git a/x/ecocredit/marketplace/types/v1/tx.pb.go b/x/ecocredit/marketplace/types/v1/tx.pb.go index 56f768dbe7..4c3398442b 100644 --- a/x/ecocredit/marketplace/types/v1/tx.pb.go +++ b/x/ecocredit/marketplace/types/v1/tx.pb.go @@ -1006,6 +1006,107 @@ func (m *MsgGovSetFeeParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgGovSetFeeParamsResponse proto.InternalMessageInfo +// MsgSendFromFeePool is the Msg/SendFromFeePool request type. +type MsgGovSendFromFeePool struct { + // authority is the address of the governance account. + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + // recipient is the address of the account that will receive the funds. + Recipient string `protobuf:"bytes,2,opt,name=recipient,proto3" json:"recipient,omitempty"` + // amount is the amount of coins to send from the fee pool. + Amount []*types.Coin `protobuf:"bytes,3,rep,name=amount,proto3" json:"amount,omitempty"` +} + +func (m *MsgGovSendFromFeePool) Reset() { *m = MsgGovSendFromFeePool{} } +func (m *MsgGovSendFromFeePool) String() string { return proto.CompactTextString(m) } +func (*MsgGovSendFromFeePool) ProtoMessage() {} +func (*MsgGovSendFromFeePool) Descriptor() ([]byte, []int) { + return fileDescriptor_68c9b4e4b7fcb584, []int{14} +} +func (m *MsgGovSendFromFeePool) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgGovSendFromFeePool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgGovSendFromFeePool.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgGovSendFromFeePool) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgGovSendFromFeePool.Merge(m, src) +} +func (m *MsgGovSendFromFeePool) XXX_Size() int { + return m.Size() +} +func (m *MsgGovSendFromFeePool) XXX_DiscardUnknown() { + xxx_messageInfo_MsgGovSendFromFeePool.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgGovSendFromFeePool proto.InternalMessageInfo + +func (m *MsgGovSendFromFeePool) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *MsgGovSendFromFeePool) GetRecipient() string { + if m != nil { + return m.Recipient + } + return "" +} + +func (m *MsgGovSendFromFeePool) GetAmount() []*types.Coin { + if m != nil { + return m.Amount + } + return nil +} + +// MsgSendFromFeePoolResponse is the Msg/SendFromFeePool response type. +type MsgGovSendFromFeePoolResponse struct { +} + +func (m *MsgGovSendFromFeePoolResponse) Reset() { *m = MsgGovSendFromFeePoolResponse{} } +func (m *MsgGovSendFromFeePoolResponse) String() string { return proto.CompactTextString(m) } +func (*MsgGovSendFromFeePoolResponse) ProtoMessage() {} +func (*MsgGovSendFromFeePoolResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_68c9b4e4b7fcb584, []int{15} +} +func (m *MsgGovSendFromFeePoolResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgGovSendFromFeePoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgGovSendFromFeePoolResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgGovSendFromFeePoolResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgGovSendFromFeePoolResponse.Merge(m, src) +} +func (m *MsgGovSendFromFeePoolResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgGovSendFromFeePoolResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgGovSendFromFeePoolResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgGovSendFromFeePoolResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgSell)(nil), "regen.ecocredit.marketplace.v1.MsgSell") proto.RegisterType((*MsgSell_Order)(nil), "regen.ecocredit.marketplace.v1.MsgSell.Order") @@ -1024,6 +1125,8 @@ func init() { proto.RegisterType((*MsgRemoveAllowedDenomResponse)(nil), "regen.ecocredit.marketplace.v1.MsgRemoveAllowedDenomResponse") proto.RegisterType((*MsgGovSetFeeParams)(nil), "regen.ecocredit.marketplace.v1.MsgGovSetFeeParams") proto.RegisterType((*MsgGovSetFeeParamsResponse)(nil), "regen.ecocredit.marketplace.v1.MsgGovSetFeeParamsResponse") + proto.RegisterType((*MsgGovSendFromFeePool)(nil), "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePool") + proto.RegisterType((*MsgGovSendFromFeePoolResponse)(nil), "regen.ecocredit.marketplace.v1.MsgGovSendFromFeePoolResponse") } func init() { @@ -1031,74 +1134,78 @@ func init() { } var fileDescriptor_68c9b4e4b7fcb584 = []byte{ - // 1058 bytes of a gzipped FileDescriptorProto + // 1126 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x41, 0x6f, 0xdc, 0x44, - 0x14, 0x8e, 0x77, 0x37, 0x9b, 0xe4, 0x6d, 0x92, 0xb6, 0xd3, 0x90, 0x2e, 0xa6, 0xd9, 0x84, 0x05, - 0xa9, 0xa1, 0x50, 0x5b, 0x49, 0x81, 0x4a, 0x41, 0x11, 0x24, 0x6d, 0x53, 0x51, 0xb4, 0xa2, 0x38, - 0xe5, 0x82, 0x84, 0xb6, 0x63, 0xfb, 0xc5, 0x31, 0xb1, 0x3d, 0xc6, 0x33, 0x4e, 0x36, 0xc7, 0x22, - 0x24, 0x24, 0x4e, 0x3d, 0x73, 0xe4, 0x17, 0xf0, 0x33, 0x38, 0xf6, 0x02, 0xe2, 0x06, 0x4a, 0x24, - 0xb8, 0x71, 0xe6, 0x88, 0x3c, 0xf6, 0x3a, 0x1b, 0x6f, 0xb6, 0x71, 0x72, 0xdb, 0x79, 0xef, 0x7d, - 0xef, 0xbd, 0xf9, 0xbe, 0x79, 0x33, 0x5e, 0xb8, 0x15, 0xa1, 0x83, 0x81, 0x8e, 0x16, 0xb3, 0x22, - 0xb4, 0x5d, 0xa1, 0xfb, 0x34, 0xda, 0x43, 0x11, 0x7a, 0xd4, 0x42, 0x7d, 0x7f, 0x45, 0x17, 0x3d, - 0x2d, 0x8c, 0x98, 0x60, 0xa4, 0x25, 0x03, 0xb5, 0x3c, 0x50, 0x1b, 0x08, 0xd4, 0xf6, 0x57, 0xd4, - 0x96, 0xc5, 0xb8, 0xcf, 0xb8, 0x6e, 0x52, 0x9e, 0x00, 0x4d, 0x14, 0x74, 0x45, 0xb7, 0x98, 0x1b, - 0xa4, 0x78, 0xf5, 0x46, 0xe6, 0xf7, 0xb9, 0x93, 0xe4, 0xf5, 0xb9, 0x93, 0x39, 0xe6, 0x1c, 0xe6, - 0x30, 0xf9, 0x53, 0x4f, 0x7e, 0x65, 0xd6, 0x45, 0x87, 0x31, 0xc7, 0x43, 0x5d, 0xae, 0xcc, 0x78, - 0x47, 0x17, 0xae, 0x8f, 0x5c, 0x50, 0x3f, 0xcc, 0x02, 0x6e, 0x9f, 0xd3, 0x38, 0x17, 0x54, 0x60, - 0x1a, 0xdb, 0xfe, 0xbb, 0x02, 0x13, 0x1d, 0xee, 0x6c, 0xa3, 0xe7, 0x91, 0x79, 0xa8, 0x73, 0xf4, - 0x3c, 0x8c, 0x9a, 0xca, 0x92, 0xb2, 0x3c, 0x65, 0x64, 0x2b, 0xf2, 0x10, 0xea, 0x2c, 0xb2, 0x31, - 0xe2, 0xcd, 0xca, 0x52, 0x75, 0xb9, 0xb1, 0x7a, 0x47, 0x7b, 0xf5, 0x86, 0xb5, 0x2c, 0xa1, 0xf6, - 0x79, 0x82, 0x32, 0x32, 0xb0, 0xfa, 0xaf, 0x02, 0xe3, 0xd2, 0x42, 0x16, 0xa1, 0x61, 0x52, 0x61, - 0xed, 0x76, 0x6d, 0x0c, 0x98, 0x9f, 0x55, 0x03, 0x69, 0x7a, 0x90, 0x58, 0x88, 0x0a, 0x93, 0xdf, - 0xc6, 0x34, 0x10, 0xae, 0x38, 0x6c, 0x56, 0xa4, 0x37, 0x5f, 0x93, 0x0f, 0x61, 0x8a, 0xf2, 0xbd, - 0x6e, 0x18, 0xb9, 0x16, 0x36, 0xab, 0x4b, 0xca, 0x72, 0x63, 0xf5, 0x75, 0x2d, 0x65, 0x50, 0x4b, - 0x18, 0xd6, 0x32, 0x86, 0xb5, 0xfb, 0xcc, 0x0d, 0x8c, 0x49, 0xca, 0xf7, 0x9e, 0x24, 0xa1, 0x44, - 0x83, 0xeb, 0xb6, 0xcb, 0xa9, 0xe9, 0x61, 0x97, 0xc6, 0x82, 0x75, 0x23, 0x14, 0x6e, 0x84, 0xcd, - 0xda, 0x92, 0xb2, 0x3c, 0x69, 0x5c, 0xcb, 0x5c, 0x1b, 0xb1, 0x60, 0x86, 0x74, 0x90, 0x4f, 0x00, - 0xb0, 0x17, 0xba, 0x11, 0x15, 0x2e, 0x0b, 0x9a, 0xe3, 0xb2, 0x90, 0xaa, 0xa5, 0xdc, 0x6b, 0x7d, - 0xee, 0xb5, 0xa7, 0x7d, 0xee, 0x37, 0x6b, 0x2f, 0xfe, 0x5c, 0x54, 0x8c, 0x01, 0xcc, 0x5a, 0xe3, - 0xbb, 0x7f, 0x7e, 0xb9, 0x9d, 0x91, 0xd8, 0xbe, 0x07, 0x57, 0x32, 0x5a, 0x0c, 0xe4, 0x21, 0x0b, - 0x38, 0x92, 0xb7, 0x61, 0x36, 0x71, 0x76, 0x25, 0x3f, 0x5d, 0xd7, 0xe6, 0x4d, 0x65, 0xa9, 0xba, - 0x5c, 0x33, 0xa6, 0x13, 0xab, 0x64, 0xea, 0x53, 0x9b, 0xb7, 0x7f, 0xaa, 0xc2, 0xf5, 0x0e, 0x77, - 0xbe, 0x0c, 0x6d, 0x2a, 0x70, 0xbb, 0xef, 0xe1, 0x23, 0xd5, 0x7a, 0x0a, 0x13, 0xb1, 0x8c, 0xed, - 0xcb, 0xb5, 0x56, 0x42, 0xae, 0x62, 0x76, 0x2d, 0x35, 0x18, 0xfd, 0x54, 0xea, 0x0f, 0x15, 0xa8, - 0xa7, 0x36, 0xd2, 0x86, 0x99, 0x53, 0x6d, 0xcb, 0xfa, 0x35, 0xa3, 0x31, 0xd0, 0x35, 0x79, 0x13, - 0xa6, 0x03, 0x3c, 0xe8, 0x16, 0x44, 0x6c, 0x04, 0x78, 0xf0, 0x45, 0x5f, 0xc7, 0x75, 0x98, 0x49, - 0x42, 0x2e, 0xa0, 0x65, 0x02, 0xdf, 0xb8, 0xac, 0x9c, 0x8f, 0x60, 0x36, 0x29, 0x77, 0x09, 0x49, - 0x93, 0x36, 0x1f, 0x8e, 0x50, 0x75, 0x01, 0xde, 0x38, 0x83, 0xbd, 0xbe, 0xc2, 0xed, 0xaf, 0x81, - 0x74, 0xb8, 0x73, 0x9f, 0x06, 0x16, 0x7a, 0xb9, 0x7b, 0xa4, 0x72, 0x43, 0xc4, 0x56, 0x86, 0x88, - 0x3d, 0x5d, 0xfd, 0x26, 0xa8, 0xc3, 0xe9, 0xf3, 0xe2, 0xbf, 0x55, 0x61, 0xba, 0xc3, 0x9d, 0xcd, - 0xf8, 0xf0, 0x81, 0x1b, 0xa1, 0x25, 0xc8, 0x1c, 0x8c, 0x9b, 0xf1, 0x61, 0x5e, 0x36, 0x5d, 0x90, - 0xc7, 0x85, 0xe9, 0x5e, 0x2d, 0x71, 0x5c, 0xf2, 0x9c, 0x85, 0x11, 0xff, 0xbd, 0xd2, 0x1f, 0xf1, - 0x12, 0x7b, 0x39, 0x35, 0xe5, 0xd5, 0xe1, 0x29, 0x37, 0x5d, 0x3b, 0x3b, 0x19, 0xb5, 0x73, 0xa7, - 0xdc, 0x74, 0xed, 0x57, 0x1e, 0x8b, 0xf1, 0x51, 0xc7, 0xe2, 0x1e, 0xdc, 0x48, 0x43, 0x7c, 0x0c, - 0x44, 0xf7, 0x9b, 0x38, 0x72, 0xb9, 0xed, 0x5a, 0xf2, 0x7c, 0xd4, 0x65, 0x4b, 0xf3, 0x27, 0xee, - 0xc7, 0x03, 0x5e, 0xf2, 0x2e, 0x5c, 0x1b, 0x00, 0x46, 0x48, 0x39, 0x0b, 0x9a, 0x13, 0x12, 0x72, - 0xf5, 0xc4, 0x61, 0x48, 0x3b, 0xf9, 0x18, 0x66, 0x7d, 0xda, 0xeb, 0xee, 0x20, 0x76, 0xa9, 0xcf, - 0xe2, 0x40, 0x34, 0x27, 0xcf, 0xdb, 0xd2, 0xb4, 0x4f, 0x7b, 0x5b, 0x88, 0x1b, 0x32, 0x7c, 0x0d, - 0x12, 0xd9, 0x53, 0xc1, 0xda, 0xf3, 0x30, 0x37, 0x28, 0x41, 0xae, 0xf7, 0xcf, 0x8a, 0x3c, 0x6d, - 0x1b, 0xb6, 0xbd, 0xe1, 0x79, 0xec, 0x00, 0xed, 0xf4, 0x2e, 0xbd, 0x09, 0x53, 0x34, 0x16, 0xbb, - 0x2c, 0x4a, 0x68, 0x4e, 0x95, 0x3f, 0x31, 0x90, 0x05, 0x00, 0x93, 0x06, 0x7b, 0xd9, 0x4d, 0x9c, - 0x8e, 0xe9, 0x54, 0x62, 0x49, 0xc1, 0x6f, 0xc1, 0x8c, 0xed, 0xf2, 0xd0, 0xa3, 0x87, 0x59, 0x44, - 0xaa, 0xd3, 0x74, 0x66, 0xcc, 0x6f, 0x6b, 0xec, 0x85, 0x2c, 0xc0, 0x40, 0x48, 0xa9, 0x66, 0x8c, - 0x7c, 0xbd, 0x36, 0x9b, 0x34, 0x7e, 0x52, 0x2f, 0x3b, 0xb2, 0x85, 0x1e, 0xf3, 0x2d, 0x7c, 0x06, - 0xaf, 0x75, 0xb8, 0x63, 0xa0, 0xcf, 0xf6, 0xf1, 0x02, 0x9b, 0x98, 0x83, 0xf1, 0xc1, 0xfe, 0xd3, - 0x45, 0x7b, 0x11, 0x16, 0xce, 0x4c, 0x96, 0x57, 0x7b, 0x9e, 0x12, 0xf6, 0x88, 0xed, 0x6f, 0xa3, - 0xd8, 0x42, 0x7c, 0x42, 0x23, 0xea, 0xf3, 0x73, 0x6a, 0xad, 0x43, 0x6d, 0x07, 0xe5, 0xdd, 0x9a, - 0x08, 0xf8, 0xce, 0x79, 0xc3, 0x92, 0xa7, 0x35, 0x24, 0x6c, 0x04, 0x1f, 0x85, 0x16, 0xfa, 0x1d, - 0xae, 0xfe, 0x57, 0x87, 0x6a, 0x87, 0x3b, 0xe4, 0x19, 0xd4, 0xe4, 0x0b, 0x7d, 0xab, 0xe4, 0xcb, - 0xab, 0xea, 0x25, 0x03, 0xf3, 0xb7, 0xe8, 0x7b, 0x05, 0xae, 0x0e, 0x3d, 0x31, 0x77, 0x2f, 0xf1, - 0x72, 0xa8, 0x1f, 0x5d, 0x02, 0x94, 0xb7, 0xf1, 0x5c, 0x81, 0x2b, 0xc5, 0xeb, 0xb2, 0xcc, 0x85, - 0x54, 0xc0, 0xa8, 0x6b, 0x17, 0xc7, 0xe4, 0x3d, 0x30, 0x98, 0x3a, 0xb9, 0x33, 0xdf, 0xbb, 0xc8, - 0x6d, 0xa8, 0xbe, 0x7f, 0x91, 0xe8, 0x53, 0x9b, 0x2e, 0x4e, 0x6d, 0x99, 0x4d, 0x17, 0x30, 0xa5, - 0x36, 0x3d, 0x62, 0xf2, 0xc8, 0x8f, 0x0a, 0x90, 0x33, 0xe6, 0xee, 0x83, 0x12, 0x29, 0x87, 0x61, - 0xea, 0xfa, 0xa5, 0x60, 0xa7, 0x08, 0x29, 0x4e, 0x65, 0x19, 0x42, 0x0a, 0x98, 0x52, 0x84, 0x8c, - 0x18, 0xbd, 0xcd, 0x67, 0xbf, 0x1e, 0xb5, 0x94, 0x97, 0x47, 0x2d, 0xe5, 0xaf, 0xa3, 0x96, 0xf2, - 0xe2, 0xb8, 0x35, 0xf6, 0xf2, 0xb8, 0x35, 0xf6, 0xc7, 0x71, 0x6b, 0xec, 0xab, 0x2d, 0xc7, 0x15, - 0xbb, 0xb1, 0xa9, 0x59, 0xcc, 0xd7, 0x65, 0xfe, 0x3b, 0x01, 0x8a, 0x03, 0x16, 0xed, 0x65, 0x2b, - 0x0f, 0x6d, 0x07, 0x23, 0xbd, 0x37, 0xe2, 0x03, 0x5c, 0x1c, 0x86, 0xc8, 0x93, 0xbf, 0x01, 0x75, - 0xf9, 0xc5, 0x71, 0xf7, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x41, 0x41, 0x22, 0xc9, 0x68, 0x0c, - 0x00, 0x00, + 0x14, 0xae, 0x77, 0x37, 0x9b, 0xec, 0xdb, 0x24, 0x6d, 0xdd, 0x90, 0x2e, 0x26, 0xd9, 0x84, 0x05, + 0xa9, 0xa1, 0x50, 0x5b, 0x49, 0x29, 0x95, 0x82, 0x22, 0x48, 0xda, 0xa6, 0xa2, 0x68, 0x45, 0x71, + 0xca, 0x05, 0x09, 0x6d, 0x67, 0xed, 0x17, 0xc7, 0xc4, 0xf6, 0x2c, 0x9e, 0x71, 0xb2, 0x39, 0x16, + 0x81, 0x90, 0x38, 0xf5, 0xc4, 0x81, 0x23, 0xbf, 0x80, 0x9f, 0xc1, 0xb1, 0x17, 0x10, 0x37, 0x50, + 0x22, 0xc1, 0x8d, 0xdf, 0x80, 0x3c, 0x9e, 0x75, 0x76, 0xbd, 0xd9, 0xac, 0x93, 0x9b, 0xe7, 0xbd, + 0xf7, 0xbd, 0xf7, 0xe6, 0xfb, 0x66, 0x9e, 0x6d, 0xb8, 0x15, 0xa2, 0x83, 0x81, 0x81, 0x16, 0xb5, + 0x42, 0xb4, 0x5d, 0x6e, 0xf8, 0x24, 0xdc, 0x47, 0xde, 0xf1, 0x88, 0x85, 0xc6, 0xc1, 0xaa, 0xc1, + 0xbb, 0x7a, 0x27, 0xa4, 0x9c, 0xaa, 0x75, 0x11, 0xa8, 0xa7, 0x81, 0x7a, 0x5f, 0xa0, 0x7e, 0xb0, + 0xaa, 0xd5, 0x2d, 0xca, 0x7c, 0xca, 0x8c, 0x36, 0x61, 0x31, 0xb0, 0x8d, 0x9c, 0xac, 0x1a, 0x16, + 0x75, 0x83, 0x04, 0xaf, 0xdd, 0x94, 0x7e, 0x9f, 0x39, 0x71, 0x5e, 0x9f, 0x39, 0xd2, 0x31, 0xe7, + 0x50, 0x87, 0x8a, 0x47, 0x23, 0x7e, 0x92, 0xd6, 0x25, 0x87, 0x52, 0xc7, 0x43, 0x43, 0xac, 0xda, + 0xd1, 0xae, 0xc1, 0x5d, 0x1f, 0x19, 0x27, 0x7e, 0x47, 0x06, 0xdc, 0x1e, 0xd3, 0x38, 0xe3, 0x84, + 0x63, 0x12, 0xdb, 0xf8, 0xa7, 0x00, 0x93, 0x4d, 0xe6, 0xec, 0xa0, 0xe7, 0xa9, 0xf3, 0x50, 0x66, + 0xe8, 0x79, 0x18, 0xd6, 0x94, 0x65, 0x65, 0xa5, 0x62, 0xca, 0x95, 0xfa, 0x08, 0xca, 0x34, 0xb4, + 0x31, 0x64, 0xb5, 0xc2, 0x72, 0x71, 0xa5, 0xba, 0x76, 0x47, 0x3f, 0x7f, 0xc3, 0xba, 0x4c, 0xa8, + 0x7f, 0x16, 0xa3, 0x4c, 0x09, 0xd6, 0xfe, 0x53, 0x60, 0x42, 0x58, 0xd4, 0x25, 0xa8, 0xb6, 0x09, + 0xb7, 0xf6, 0x5a, 0x36, 0x06, 0xd4, 0x97, 0xd5, 0x40, 0x98, 0x1e, 0xc6, 0x16, 0x55, 0x83, 0xa9, + 0x6f, 0x22, 0x12, 0x70, 0x97, 0x1f, 0xd5, 0x0a, 0xc2, 0x9b, 0xae, 0xd5, 0x0f, 0xa0, 0x42, 0xd8, + 0x7e, 0xab, 0x13, 0xba, 0x16, 0xd6, 0x8a, 0xcb, 0xca, 0x4a, 0x75, 0xed, 0x75, 0x3d, 0x61, 0x50, + 0x8f, 0x19, 0xd6, 0x25, 0xc3, 0xfa, 0x03, 0xea, 0x06, 0xe6, 0x14, 0x61, 0xfb, 0x4f, 0xe3, 0x50, + 0x55, 0x87, 0x1b, 0xb6, 0xcb, 0x48, 0xdb, 0xc3, 0x16, 0x89, 0x38, 0x6d, 0x85, 0xc8, 0xdd, 0x10, + 0x6b, 0xa5, 0x65, 0x65, 0x65, 0xca, 0xbc, 0x2e, 0x5d, 0x9b, 0x11, 0xa7, 0xa6, 0x70, 0xa8, 0x1f, + 0x03, 0x60, 0xb7, 0xe3, 0x86, 0x84, 0xbb, 0x34, 0xa8, 0x4d, 0x88, 0x42, 0x9a, 0x9e, 0x70, 0xaf, + 0xf7, 0xb8, 0xd7, 0x9f, 0xf5, 0xb8, 0xdf, 0x2a, 0xbd, 0xfc, 0x6b, 0x49, 0x31, 0xfb, 0x30, 0xeb, + 0xd5, 0x6f, 0xff, 0xfd, 0xf5, 0xb6, 0x24, 0xb1, 0x71, 0x1f, 0xae, 0x4a, 0x5a, 0x4c, 0x64, 0x1d, + 0x1a, 0x30, 0x54, 0xdf, 0x86, 0xd9, 0xd8, 0xd9, 0x12, 0xfc, 0xb4, 0x5c, 0x9b, 0xd5, 0x94, 0xe5, + 0xe2, 0x4a, 0xc9, 0x9c, 0x8e, 0xad, 0x82, 0xa9, 0x4f, 0x6c, 0xd6, 0xf8, 0xb9, 0x08, 0x37, 0x9a, + 0xcc, 0xf9, 0xa2, 0x63, 0x13, 0x8e, 0x3b, 0x3d, 0x0f, 0x1b, 0xa9, 0xd6, 0x33, 0x98, 0x8c, 0x44, + 0x6c, 0x4f, 0xae, 0xf5, 0x1c, 0x72, 0x65, 0xb3, 0xeb, 0x89, 0xc1, 0xec, 0xa5, 0xd2, 0x7e, 0x28, + 0x40, 0x39, 0xb1, 0xa9, 0x0d, 0x98, 0x19, 0x68, 0x5b, 0xd4, 0x2f, 0x99, 0xd5, 0xbe, 0xae, 0xd5, + 0x37, 0x61, 0x3a, 0xc0, 0xc3, 0x56, 0x46, 0xc4, 0x6a, 0x80, 0x87, 0x9f, 0xf7, 0x74, 0xdc, 0x80, + 0x99, 0x38, 0xe4, 0x02, 0x5a, 0xc6, 0xf0, 0xcd, 0xcb, 0xca, 0xf9, 0x18, 0x66, 0xe3, 0x72, 0x97, + 0x90, 0x34, 0x6e, 0xf3, 0xd1, 0x08, 0x55, 0x17, 0xe1, 0x8d, 0x33, 0xd8, 0xeb, 0x29, 0xdc, 0xf8, + 0x0a, 0xd4, 0x26, 0x73, 0x1e, 0x90, 0xc0, 0x42, 0x2f, 0x75, 0x8f, 0x54, 0x6e, 0x88, 0xd8, 0xc2, + 0x10, 0xb1, 0x83, 0xd5, 0x17, 0x40, 0x1b, 0x4e, 0x9f, 0x16, 0xff, 0xbd, 0x08, 0xd3, 0x4d, 0xe6, + 0x6c, 0x45, 0x47, 0x0f, 0xdd, 0x10, 0x2d, 0xae, 0xce, 0xc1, 0x44, 0x3b, 0x3a, 0x4a, 0xcb, 0x26, + 0x0b, 0xf5, 0x49, 0xe6, 0x76, 0xaf, 0xe5, 0x38, 0x2e, 0x69, 0xce, 0xcc, 0x15, 0xff, 0xa3, 0xd0, + 0xbb, 0xe2, 0x39, 0xf6, 0x32, 0x70, 0xcb, 0x8b, 0xc3, 0xb7, 0xbc, 0xed, 0xda, 0xf2, 0x64, 0x94, + 0xc6, 0xde, 0xf2, 0xb6, 0x6b, 0x9f, 0x7b, 0x2c, 0x26, 0x46, 0x1d, 0x8b, 0xfb, 0x70, 0x33, 0x09, + 0xf1, 0x31, 0xe0, 0xad, 0xaf, 0xa3, 0xd0, 0x65, 0xb6, 0x6b, 0x89, 0xf3, 0x51, 0x16, 0x2d, 0xcd, + 0x9f, 0xba, 0x9f, 0xf4, 0x79, 0xd5, 0x77, 0xe1, 0x7a, 0x1f, 0x30, 0x44, 0xc2, 0x68, 0x50, 0x9b, + 0x14, 0x90, 0x6b, 0xa7, 0x0e, 0x53, 0xd8, 0xd5, 0x8f, 0x60, 0xd6, 0x27, 0xdd, 0xd6, 0x2e, 0x62, + 0x8b, 0xf8, 0x34, 0x0a, 0x78, 0x6d, 0x6a, 0xdc, 0x96, 0xa6, 0x7d, 0xd2, 0xdd, 0x46, 0xdc, 0x14, + 0xe1, 0xeb, 0x10, 0xcb, 0x9e, 0x08, 0xd6, 0x98, 0x87, 0xb9, 0x7e, 0x09, 0x52, 0xbd, 0x7f, 0x51, + 0xc4, 0x69, 0xdb, 0xb4, 0xed, 0x4d, 0xcf, 0xa3, 0x87, 0x68, 0x27, 0xb3, 0x74, 0x01, 0x2a, 0x24, + 0xe2, 0x7b, 0x34, 0x8c, 0x69, 0x4e, 0x94, 0x3f, 0x35, 0xa8, 0x8b, 0x00, 0x6d, 0x12, 0xec, 0xcb, + 0x49, 0x9c, 0x5c, 0xd3, 0x4a, 0x6c, 0x49, 0xc0, 0x6f, 0xc1, 0x8c, 0xed, 0xb2, 0x8e, 0x47, 0x8e, + 0x64, 0x44, 0xa2, 0xd3, 0xb4, 0x34, 0xa6, 0xd3, 0x1a, 0xbb, 0x1d, 0x1a, 0x60, 0xc0, 0x85, 0x54, + 0x33, 0x66, 0xba, 0x5e, 0x9f, 0x8d, 0x1b, 0x3f, 0xad, 0x27, 0x8f, 0x6c, 0xa6, 0xc7, 0x74, 0x0b, + 0x9f, 0xc2, 0x6b, 0x4d, 0xe6, 0x98, 0xe8, 0xd3, 0x03, 0xbc, 0xc0, 0x26, 0xe6, 0x60, 0xa2, 0xbf, + 0xff, 0x64, 0xd1, 0x58, 0x82, 0xc5, 0x33, 0x93, 0xa5, 0xd5, 0x5e, 0x24, 0x84, 0x3d, 0xa6, 0x07, + 0x3b, 0xc8, 0xb7, 0x11, 0x9f, 0x92, 0x90, 0xf8, 0x6c, 0x4c, 0xad, 0x0d, 0x28, 0xed, 0xa2, 0x98, + 0xad, 0xb1, 0x80, 0xef, 0x8c, 0xbb, 0x2c, 0x69, 0x5a, 0x53, 0xc0, 0x46, 0xf0, 0x91, 0x69, 0x21, + 0xed, 0xf0, 0x27, 0x45, 0x10, 0x22, 0xdc, 0x81, 0xbd, 0x1d, 0x52, 0x3f, 0x8e, 0xa1, 0xd4, 0x1b, + 0xd3, 0xe4, 0x02, 0x54, 0x42, 0xb4, 0xdc, 0x8e, 0x1b, 0x4b, 0x22, 0x45, 0x4d, 0x0d, 0xea, 0x2a, + 0x94, 0xe5, 0x29, 0x2c, 0x8a, 0x1b, 0x7f, 0xce, 0x29, 0x94, 0x81, 0x43, 0x6d, 0x27, 0xdc, 0x0e, + 0xf7, 0xd5, 0xeb, 0x7c, 0xed, 0xfb, 0x29, 0x28, 0x36, 0x99, 0xa3, 0x3e, 0x87, 0x92, 0xf8, 0xb6, + 0xb8, 0x95, 0xf3, 0x9b, 0x41, 0x33, 0x72, 0x06, 0xa6, 0x6f, 0xd1, 0xef, 0x14, 0xb8, 0x36, 0xf4, + 0x72, 0xbc, 0x7b, 0x89, 0x77, 0x9e, 0xf6, 0xe1, 0x25, 0x40, 0x69, 0x1b, 0x2f, 0x14, 0xb8, 0x9a, + 0x1d, 0xf4, 0x79, 0x46, 0x69, 0x06, 0xa3, 0xad, 0x5f, 0x1c, 0x93, 0xf6, 0x40, 0xa1, 0x72, 0x3a, + 0xed, 0xdf, 0xbb, 0xc8, 0x1c, 0xd7, 0xde, 0xbf, 0x48, 0xf4, 0xc0, 0xa6, 0xb3, 0xf3, 0x26, 0xcf, + 0xa6, 0x33, 0x98, 0x5c, 0x9b, 0x1e, 0x31, 0x33, 0xd4, 0x1f, 0x15, 0x50, 0xcf, 0x98, 0x18, 0xf7, + 0x72, 0xa4, 0x1c, 0x86, 0x69, 0x1b, 0x97, 0x82, 0x0d, 0x10, 0x92, 0x9d, 0x27, 0x79, 0x08, 0xc9, + 0x60, 0x72, 0x11, 0x32, 0x62, 0x68, 0x08, 0x42, 0xce, 0x98, 0x18, 0xf7, 0xf2, 0xa6, 0x1c, 0x80, + 0xe5, 0x22, 0x64, 0xf4, 0x1c, 0xd8, 0x7a, 0xfe, 0xdb, 0x71, 0x5d, 0x79, 0x75, 0x5c, 0x57, 0xfe, + 0x3e, 0xae, 0x2b, 0x2f, 0x4f, 0xea, 0x57, 0x5e, 0x9d, 0xd4, 0xaf, 0xfc, 0x79, 0x52, 0xbf, 0xf2, + 0xe5, 0xb6, 0xe3, 0xf2, 0xbd, 0xa8, 0xad, 0x5b, 0xd4, 0x37, 0x44, 0x89, 0x3b, 0x01, 0xf2, 0x43, + 0x1a, 0xee, 0xcb, 0x95, 0x87, 0xb6, 0x83, 0xa1, 0xd1, 0x1d, 0xf1, 0x1f, 0xc3, 0x8f, 0x3a, 0xc8, + 0xe2, 0xbf, 0xa9, 0xb2, 0xf8, 0x70, 0xbb, 0xfb, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xed, 0x37, + 0x86, 0x18, 0xaf, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1134,6 +1241,11 @@ type MsgClient interface { // // Since Revision 3 GovSetFeeParams(ctx context.Context, in *MsgGovSetFeeParams, opts ...grpc.CallOption) (*MsgGovSetFeeParamsResponse, error) + // GovSendFromFeePool is a governance method that allows the sending of the + // marketplace fees. + // + // Since Revision 3 + GovSendFromFeePool(ctx context.Context, in *MsgGovSendFromFeePool, opts ...grpc.CallOption) (*MsgGovSendFromFeePoolResponse, error) } type msgClient struct { @@ -1207,6 +1319,15 @@ func (c *msgClient) GovSetFeeParams(ctx context.Context, in *MsgGovSetFeeParams, return out, nil } +func (c *msgClient) GovSendFromFeePool(ctx context.Context, in *MsgGovSendFromFeePool, opts ...grpc.CallOption) (*MsgGovSendFromFeePoolResponse, error) { + out := new(MsgGovSendFromFeePoolResponse) + err := c.cc.Invoke(ctx, "/regen.ecocredit.marketplace.v1.Msg/GovSendFromFeePool", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // Sell creates new sell orders. @@ -1230,6 +1351,11 @@ type MsgServer interface { // // Since Revision 3 GovSetFeeParams(context.Context, *MsgGovSetFeeParams) (*MsgGovSetFeeParamsResponse, error) + // GovSendFromFeePool is a governance method that allows the sending of the + // marketplace fees. + // + // Since Revision 3 + GovSendFromFeePool(context.Context, *MsgGovSendFromFeePool) (*MsgGovSendFromFeePoolResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -1257,6 +1383,9 @@ func (*UnimplementedMsgServer) RemoveAllowedDenom(ctx context.Context, req *MsgR func (*UnimplementedMsgServer) GovSetFeeParams(ctx context.Context, req *MsgGovSetFeeParams) (*MsgGovSetFeeParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GovSetFeeParams not implemented") } +func (*UnimplementedMsgServer) GovSendFromFeePool(ctx context.Context, req *MsgGovSendFromFeePool) (*MsgGovSendFromFeePoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GovSendFromFeePool not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -1388,6 +1517,24 @@ func _Msg_GovSetFeeParams_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Msg_GovSendFromFeePool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgGovSendFromFeePool) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).GovSendFromFeePool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/regen.ecocredit.marketplace.v1.Msg/GovSendFromFeePool", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).GovSendFromFeePool(ctx, req.(*MsgGovSendFromFeePool)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "regen.ecocredit.marketplace.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -1420,6 +1567,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "GovSetFeeParams", Handler: _Msg_GovSetFeeParams_Handler, }, + { + MethodName: "GovSendFromFeePool", + Handler: _Msg_GovSendFromFeePool_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "regen/ecocredit/marketplace/v1/tx.proto", @@ -2118,6 +2269,80 @@ func (m *MsgGovSetFeeParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *MsgGovSendFromFeePool) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgGovSendFromFeePool) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgGovSendFromFeePool) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Amount) > 0 { + for iNdEx := len(m.Amount) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Amount[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Recipient) > 0 { + i -= len(m.Recipient) + copy(dAtA[i:], m.Recipient) + i = encodeVarintTx(dAtA, i, uint64(len(m.Recipient))) + i-- + dAtA[i] = 0x12 + } + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgGovSendFromFeePoolResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgGovSendFromFeePoolResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgGovSendFromFeePoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -2420,6 +2645,38 @@ func (m *MsgGovSetFeeParamsResponse) Size() (n int) { return n } +func (m *MsgGovSendFromFeePool) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Recipient) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Amount) > 0 { + for _, e := range m.Amount { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgGovSendFromFeePoolResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4354,6 +4611,204 @@ func (m *MsgGovSetFeeParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgGovSendFromFeePool) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgGovSendFromFeePool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgGovSendFromFeePool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Recipient", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Recipient = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Amount = append(m.Amount, &types.Coin{}) + if err := m.Amount[len(m.Amount)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgGovSendFromFeePoolResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgGovSendFromFeePoolResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgGovSendFromFeePoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0