diff --git a/api/v1/tx.pulsar.go b/api/v1/tx.pulsar.go index 18addd64..fc950b00 100644 --- a/api/v1/tx.pulsar.go +++ b/api/v1/tx.pulsar.go @@ -11,6 +11,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoiface "google.golang.org/protobuf/runtime/protoiface" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" io "io" reflect "reflect" sync "sync" @@ -3575,6 +3576,7 @@ var ( fd_MsgBurn_from protoreflect.FieldDescriptor fd_MsgBurn_amount protoreflect.FieldDescriptor fd_MsgBurn_signature protoreflect.FieldDescriptor + fd_MsgBurn_pub_key protoreflect.FieldDescriptor ) func init() { @@ -3585,6 +3587,7 @@ func init() { fd_MsgBurn_from = md_MsgBurn.Fields().ByName("from") fd_MsgBurn_amount = md_MsgBurn.Fields().ByName("amount") fd_MsgBurn_signature = md_MsgBurn.Fields().ByName("signature") + fd_MsgBurn_pub_key = md_MsgBurn.Fields().ByName("pub_key") } var _ protoreflect.Message = (*fastReflection_MsgBurn)(nil) @@ -3682,6 +3685,12 @@ func (x *fastReflection_MsgBurn) Range(f func(protoreflect.FieldDescriptor, prot return } } + if x.PubKey != nil { + value := protoreflect.ValueOfMessage(x.PubKey.ProtoReflect()) + if !f(fd_MsgBurn_pub_key, value) { + return + } + } } // Has reports whether a field is populated. @@ -3707,6 +3716,8 @@ func (x *fastReflection_MsgBurn) Has(fd protoreflect.FieldDescriptor) bool { return x.Amount != "" case "florin.v1.MsgBurn.signature": return len(x.Signature) != 0 + case "florin.v1.MsgBurn.pub_key": + return x.PubKey != nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgBurn")) @@ -3733,6 +3744,8 @@ func (x *fastReflection_MsgBurn) Clear(fd protoreflect.FieldDescriptor) { x.Amount = "" case "florin.v1.MsgBurn.signature": x.Signature = nil + case "florin.v1.MsgBurn.pub_key": + x.PubKey = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgBurn")) @@ -3764,6 +3777,9 @@ func (x *fastReflection_MsgBurn) Get(descriptor protoreflect.FieldDescriptor) pr case "florin.v1.MsgBurn.signature": value := x.Signature return protoreflect.ValueOfBytes(value) + case "florin.v1.MsgBurn.pub_key": + value := x.PubKey + return protoreflect.ValueOfMessage(value.ProtoReflect()) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgBurn")) @@ -3794,6 +3810,8 @@ func (x *fastReflection_MsgBurn) Set(fd protoreflect.FieldDescriptor, value prot x.Amount = value.Interface().(string) case "florin.v1.MsgBurn.signature": x.Signature = value.Bytes() + case "florin.v1.MsgBurn.pub_key": + x.PubKey = value.Message().Interface().(*anypb.Any) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgBurn")) @@ -3814,6 +3832,11 @@ func (x *fastReflection_MsgBurn) Set(fd protoreflect.FieldDescriptor, value prot // Mutable is a mutating operation and unsafe for concurrent use. func (x *fastReflection_MsgBurn) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { + case "florin.v1.MsgBurn.pub_key": + if x.PubKey == nil { + x.PubKey = new(anypb.Any) + } + return protoreflect.ValueOfMessage(x.PubKey.ProtoReflect()) case "florin.v1.MsgBurn.denom": panic(fmt.Errorf("field denom of message florin.v1.MsgBurn is not mutable")) case "florin.v1.MsgBurn.signer": @@ -3847,6 +3870,9 @@ func (x *fastReflection_MsgBurn) NewField(fd protoreflect.FieldDescriptor) proto return protoreflect.ValueOfString("") case "florin.v1.MsgBurn.signature": return protoreflect.ValueOfBytes(nil) + case "florin.v1.MsgBurn.pub_key": + m := new(anypb.Any) + return protoreflect.ValueOfMessage(m.ProtoReflect()) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgBurn")) @@ -3936,6 +3962,10 @@ func (x *fastReflection_MsgBurn) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.PubKey != nil { + l = options.Size(x.PubKey) + n += 1 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -3965,6 +3995,20 @@ func (x *fastReflection_MsgBurn) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.PubKey != nil { + encoded, err := options.Marshal(x.PubKey) + 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] = 0x32 + } if len(x.Signature) > 0 { i -= len(x.Signature) copy(dAtA[i:], x.Signature) @@ -4211,6 +4255,42 @@ func (x *fastReflection_MsgBurn) ProtoMethods() *protoiface.Methods { x.Signature = []byte{} } iNdEx = postIndex + case 6: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field PubKey", 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 + } + if x.PubKey == nil { + x.PubKey = &anypb.Any{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.PubKey); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -5577,6 +5657,7 @@ var ( fd_MsgRecover_from protoreflect.FieldDescriptor fd_MsgRecover_to protoreflect.FieldDescriptor fd_MsgRecover_signature protoreflect.FieldDescriptor + fd_MsgRecover_pub_key protoreflect.FieldDescriptor ) func init() { @@ -5587,6 +5668,7 @@ func init() { fd_MsgRecover_from = md_MsgRecover.Fields().ByName("from") fd_MsgRecover_to = md_MsgRecover.Fields().ByName("to") fd_MsgRecover_signature = md_MsgRecover.Fields().ByName("signature") + fd_MsgRecover_pub_key = md_MsgRecover.Fields().ByName("pub_key") } var _ protoreflect.Message = (*fastReflection_MsgRecover)(nil) @@ -5684,6 +5766,12 @@ func (x *fastReflection_MsgRecover) Range(f func(protoreflect.FieldDescriptor, p return } } + if x.PubKey != nil { + value := protoreflect.ValueOfMessage(x.PubKey.ProtoReflect()) + if !f(fd_MsgRecover_pub_key, value) { + return + } + } } // Has reports whether a field is populated. @@ -5709,6 +5797,8 @@ func (x *fastReflection_MsgRecover) Has(fd protoreflect.FieldDescriptor) bool { return x.To != "" case "florin.v1.MsgRecover.signature": return len(x.Signature) != 0 + case "florin.v1.MsgRecover.pub_key": + return x.PubKey != nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgRecover")) @@ -5735,6 +5825,8 @@ func (x *fastReflection_MsgRecover) Clear(fd protoreflect.FieldDescriptor) { x.To = "" case "florin.v1.MsgRecover.signature": x.Signature = nil + case "florin.v1.MsgRecover.pub_key": + x.PubKey = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgRecover")) @@ -5766,6 +5858,9 @@ func (x *fastReflection_MsgRecover) Get(descriptor protoreflect.FieldDescriptor) case "florin.v1.MsgRecover.signature": value := x.Signature return protoreflect.ValueOfBytes(value) + case "florin.v1.MsgRecover.pub_key": + value := x.PubKey + return protoreflect.ValueOfMessage(value.ProtoReflect()) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgRecover")) @@ -5796,6 +5891,8 @@ func (x *fastReflection_MsgRecover) Set(fd protoreflect.FieldDescriptor, value p x.To = value.Interface().(string) case "florin.v1.MsgRecover.signature": x.Signature = value.Bytes() + case "florin.v1.MsgRecover.pub_key": + x.PubKey = value.Message().Interface().(*anypb.Any) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgRecover")) @@ -5816,6 +5913,11 @@ func (x *fastReflection_MsgRecover) Set(fd protoreflect.FieldDescriptor, value p // Mutable is a mutating operation and unsafe for concurrent use. func (x *fastReflection_MsgRecover) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { + case "florin.v1.MsgRecover.pub_key": + if x.PubKey == nil { + x.PubKey = new(anypb.Any) + } + return protoreflect.ValueOfMessage(x.PubKey.ProtoReflect()) case "florin.v1.MsgRecover.denom": panic(fmt.Errorf("field denom of message florin.v1.MsgRecover is not mutable")) case "florin.v1.MsgRecover.signer": @@ -5849,6 +5951,9 @@ func (x *fastReflection_MsgRecover) NewField(fd protoreflect.FieldDescriptor) pr return protoreflect.ValueOfString("") case "florin.v1.MsgRecover.signature": return protoreflect.ValueOfBytes(nil) + case "florin.v1.MsgRecover.pub_key": + m := new(anypb.Any) + return protoreflect.ValueOfMessage(m.ProtoReflect()) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: florin.v1.MsgRecover")) @@ -5938,6 +6043,10 @@ func (x *fastReflection_MsgRecover) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.PubKey != nil { + l = options.Size(x.PubKey) + n += 1 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -5967,6 +6076,20 @@ func (x *fastReflection_MsgRecover) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.PubKey != nil { + encoded, err := options.Marshal(x.PubKey) + 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] = 0x32 + } if len(x.Signature) > 0 { i -= len(x.Signature) copy(dAtA[i:], x.Signature) @@ -6213,6 +6336,42 @@ func (x *fastReflection_MsgRecover) ProtoMethods() *protoiface.Methods { x.Signature = []byte{} } iNdEx = postIndex + case 6: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field PubKey", 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 + } + if x.PubKey == nil { + x.PubKey = &anypb.Any{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.PubKey); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -11515,11 +11674,12 @@ type MsgBurn struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` - Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"` - From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` - Amount string `protobuf:"bytes,4,opt,name=amount,proto3" json:"amount,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` + Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"` + From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` + Amount string `protobuf:"bytes,4,opt,name=amount,proto3" json:"amount,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + PubKey *anypb.Any `protobuf:"bytes,6,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` } func (x *MsgBurn) Reset() { @@ -11577,6 +11737,13 @@ func (x *MsgBurn) GetSignature() []byte { return nil } +func (x *MsgBurn) GetPubKey() *anypb.Any { + if x != nil { + return x.PubKey + } + return nil +} + // MsgBurnResponse is the response of the Burn action. type MsgBurnResponse struct { state protoimpl.MessageState @@ -11697,11 +11864,12 @@ type MsgRecover struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` - Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"` - From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` - To string `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` + Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"` + From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` + To string `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + PubKey *anypb.Any `protobuf:"bytes,6,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` } func (x *MsgRecover) Reset() { @@ -11759,6 +11927,13 @@ func (x *MsgRecover) GetSignature() []byte { return nil } +func (x *MsgRecover) GetPubKey() *anypb.Any { + if x != nil { + return x.PubKey + } + return nil +} + // MsgRecoverResponse is the response of the Recover action. type MsgRecoverResponse struct { state protoimpl.MessageState @@ -12199,157 +12374,21 @@ var file_florin_v1_tx_proto_rawDesc = []byte{ 0x31, 0x2f, 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8c, 0x01, 0x0a, - 0x12, 0x4d, 0x73, 0x67, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, - 0x68, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, - 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x3a, 0x2e, 0x88, 0xa0, 0x1f, - 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x41, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, 0x1c, 0x0a, 0x1a, 0x4d, - 0x73, 0x67, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, - 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x12, 0x4d, 0x73, - 0x67, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x2e, 0x88, 0xa0, - 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x41, 0x64, 0x64, - 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1c, 0x0a, 0x1a, - 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x13, 0x4d, - 0x73, 0x67, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, - 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x2f, - 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, - 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x17, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x41, - 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x1d, 0x0a, 0x1b, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb2, - 0x01, 0x0a, 0x0d, 0x4d, 0x73, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, 0x6f, 0x6d, - 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x3a, 0x29, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, - 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, - 0x2a, 0x11, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, - 0x6e, 0x6f, 0x6d, 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x73, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, - 0x65, 0x6e, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x02, 0x0a, - 0x07, 0x4d, 0x73, 0x67, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, - 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, - 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, - 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x12, 0x2c, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, - 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x48, - 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x30, - 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, - 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, - 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, - 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x23, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, - 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x0b, - 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x42, 0x75, 0x72, 0x6e, 0x22, 0x11, 0x0a, 0x0f, 0x4d, - 0x73, 0x67, 0x42, 0x75, 0x72, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xea, - 0x01, 0x0a, 0x07, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, - 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, - 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x12, 0x28, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, - 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x48, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x30, 0xc8, 0xde, - 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, - 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x23, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, - 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x0b, - 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x4d, 0x69, 0x6e, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x4d, - 0x73, 0x67, 0x4d, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf2, - 0x01, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, - 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x66, - 0x72, 0x6f, 0x6d, 0x12, 0x28, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x1c, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x26, 0x88, 0xa0, 0x1f, - 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x8a, 0xe7, 0xb0, 0x2a, 0x0e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x52, 0x65, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x22, 0x14, 0x0a, 0x12, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x15, 0x4d, 0x73, - 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, - 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, - 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, - 0x31, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x19, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x1f, 0x0a, 0x1d, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, - 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x16, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, + 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x4d, 0x73, 0x67, 0x41, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x32, 0x88, 0xa0, 0x1f, 0x00, - 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, - 0xe7, 0xb0, 0x2a, 0x1a, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, - 0x0a, 0x1e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xde, 0x01, 0x0a, 0x16, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, - 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, - 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, - 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, - 0x6e, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x30, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, - 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, - 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x32, 0x88, - 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x1a, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x53, 0x65, - 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, - 0x65, 0x22, 0x20, 0x0a, 0x1e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, - 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x13, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x69, - 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x3a, 0x2e, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, + 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, + 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, 0x1c, 0x0a, 0x1a, 0x4d, 0x73, 0x67, 0x41, 0x63, 0x63, + 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x12, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, @@ -12357,105 +12396,249 @@ var file_florin_v1_tx_proto_rawDesc = []byte{ 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x30, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, - 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, - 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x49, 0x6e, 0x74, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x3a, 0x2f, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x17, 0x66, 0x6c, 0x6f, 0x72, 0x69, - 0x6e, 0x2f, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, - 0x63, 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, - 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x14, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, - 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, - 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x2e, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, + 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, + 0x16, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1c, 0x0a, 0x1a, 0x4d, 0x73, 0x67, 0x41, 0x64, + 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x13, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, + 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x2f, 0x88, 0xa0, 0x1f, 0x00, 0xe8, + 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, + 0xb0, 0x2a, 0x17, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1d, 0x0a, 0x1b, 0x4d, 0x73, + 0x67, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x0d, 0x4d, 0x73, + 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, + 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, + 0x6e, 0x6f, 0x6d, 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x05, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x3a, 0x29, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, + 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x11, 0x66, 0x6c, 0x6f, + 0x72, 0x69, 0x6e, 0x2f, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x22, 0x17, + 0x0a, 0x15, 0x4d, 0x73, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbb, 0x02, 0x0a, 0x07, 0x4d, 0x73, 0x67, 0x42, + 0x75, 0x72, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x04, 0x66, + 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x30, 0xc8, 0xde, 0x1f, 0x00, 0xda, + 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, + 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x3a, 0x23, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x0b, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, + 0x2f, 0x42, 0x75, 0x72, 0x6e, 0x22, 0x11, 0x0a, 0x0f, 0x4d, 0x73, 0x67, 0x42, 0x75, 0x72, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xea, 0x01, 0x0a, 0x07, 0x4d, 0x73, 0x67, + 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x02, + 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x30, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, + 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x49, 0x6e, 0x74, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x3a, 0x23, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x0b, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, + 0x2f, 0x4d, 0x69, 0x6e, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa1, 0x02, 0x0a, 0x0a, 0x4d, 0x73, 0x67, + 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, + 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, + 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, + 0x2c, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, + 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x28, 0x0a, + 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x3a, 0x26, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, + 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x0e, 0x66, 0x6c, + 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x22, 0x14, 0x0a, 0x12, + 0x4d, 0x73, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x15, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, + 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x08, 0x6e, 0x65, 0x77, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x3a, 0x30, 0x88, 0xa0, 0x1f, 0x00, 0xe8, - 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, - 0xb0, 0x2a, 0x18, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, 0x1e, 0x0a, 0x1c, 0x4d, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x31, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, + 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, + 0x2a, 0x19, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1f, 0x0a, 0x1d, 0x4d, + 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc8, 0x01, 0x0a, + 0x16, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, + 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, + 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, + 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x3a, 0x32, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, + 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x1a, 0x66, 0x6c, 0x6f, + 0x72, 0x69, 0x6e, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x1e, 0x4d, 0x73, 0x67, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x16, 0x4d, 0x73, + 0x67, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x30, 0xc8, 0xde, + 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, + 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x32, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, + 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x1a, + 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, + 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x20, 0x0a, 0x1e, 0x4d, 0x73, + 0x67, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x02, 0x0a, + 0x13, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, + 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x30, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, + 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xa8, 0xe7, 0xb0, + 0x2a, 0x01, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x2f, 0x88, 0xa0, 0x1f, 0x00, + 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, + 0xe7, 0xb0, 0x2a, 0x17, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x53, 0x65, 0x74, 0x4d, 0x69, + 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x4d, + 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x14, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, - 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xfc, 0x07, 0x0a, 0x03, - 0x4d, 0x73, 0x67, 0x12, 0x57, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x1d, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x25, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, - 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0f, - 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x68, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x6e, + 0x65, 0x77, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, + 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x3a, 0x30, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, + 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x18, 0x66, 0x6c, 0x6f, 0x72, + 0x69, 0x6e, 0x2f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x22, 0x1e, 0x0a, 0x1c, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xfc, 0x07, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x57, 0x0a, 0x0f, + 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x1d, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, - 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x25, - 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x64, - 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x6c, 0x6f, 0x72, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x6c, 0x6f, 0x72, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, - 0x18, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, - 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x1a, 0x20, 0x2e, 0x66, 0x6c, 0x6f, 0x72, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, - 0x6e, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x42, - 0x75, 0x72, 0x6e, 0x12, 0x12, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x73, 0x67, 0x42, 0x75, 0x72, 0x6e, 0x1a, 0x1a, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x75, 0x72, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x2e, 0x66, 0x6c, - 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x6e, 0x74, 0x1a, - 0x1a, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4d, - 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x52, - 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x1a, 0x1d, 0x2e, - 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x12, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x28, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, - 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, - 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x66, 0x6c, 0x6f, - 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, - 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x29, 0x2e, - 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, - 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x4d, - 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x66, - 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, - 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x26, 0x2e, 0x66, - 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, - 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x1f, 0x2e, 0x66, 0x6c, 0x6f, 0x72, - 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x27, 0x2e, 0x66, 0x6c, 0x6f, - 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0x99, 0x01, 0x0a, 0x0d, 0x63, - 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x6f, 0x6e, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x66, 0x6c, 0x6f, 0x72, 0x69, - 0x6e, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x46, 0x58, 0x58, 0xaa, 0x02, 0x09, 0x46, 0x6c, 0x6f, 0x72, - 0x69, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x09, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x5c, 0x56, - 0x31, 0xe2, 0x02, 0x15, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x46, 0x6c, 0x6f, 0x72, - 0x69, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x25, + 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, + 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x25, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, + 0x0a, 0x10, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x73, 0x67, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x73, 0x67, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, + 0x6f, 0x6d, 0x1a, 0x20, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x73, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x2e, 0x66, + 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x75, 0x72, 0x6e, + 0x1a, 0x1a, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, + 0x42, 0x75, 0x72, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, + 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x6e, 0x74, 0x1a, 0x1a, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x4d, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, + 0x15, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, + 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x66, 0x6c, + 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x28, 0x2e, + 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, + 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x1a, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, + 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x13, + 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, + 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x69, 0x6e, 0x74, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5a, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x26, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, + 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x12, 0x1f, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x1a, 0x27, 0x2e, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, + 0xb0, 0x2a, 0x01, 0x42, 0x99, 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x6f, 0x72, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x6f, 0x6e, + 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x6f, 0x62, + 0x6c, 0x65, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, + 0x2f, 0x76, 0x31, 0x3b, 0x66, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x46, + 0x58, 0x58, 0xaa, 0x02, 0x09, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, + 0x09, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x15, 0x46, 0x6c, 0x6f, + 0x72, 0x69, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x0a, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -12496,37 +12679,40 @@ var file_florin_v1_tx_proto_goTypes = []interface{}{ (*MsgSetMintAllowanceResponse)(nil), // 21: florin.v1.MsgSetMintAllowanceResponse (*MsgTransferOwnership)(nil), // 22: florin.v1.MsgTransferOwnership (*MsgTransferOwnershipResponse)(nil), // 23: florin.v1.MsgTransferOwnershipResponse + (*anypb.Any)(nil), // 24: google.protobuf.Any } var file_florin_v1_tx_proto_depIdxs = []int32{ - 0, // 0: florin.v1.Msg.AcceptOwnership:input_type -> florin.v1.MsgAcceptOwnership - 2, // 1: florin.v1.Msg.AddAdminAccount:input_type -> florin.v1.MsgAddAdminAccount - 4, // 2: florin.v1.Msg.AddSystemAccount:input_type -> florin.v1.MsgAddSystemAccount - 6, // 3: florin.v1.Msg.AllowDenom:input_type -> florin.v1.MsgAllowDenom - 8, // 4: florin.v1.Msg.Burn:input_type -> florin.v1.MsgBurn - 10, // 5: florin.v1.Msg.Mint:input_type -> florin.v1.MsgMint - 12, // 6: florin.v1.Msg.Recover:input_type -> florin.v1.MsgRecover - 14, // 7: florin.v1.Msg.RemoveAdminAccount:input_type -> florin.v1.MsgRemoveAdminAccount - 16, // 8: florin.v1.Msg.RemoveSystemAccount:input_type -> florin.v1.MsgRemoveSystemAccount - 18, // 9: florin.v1.Msg.SetMaxMintAllowance:input_type -> florin.v1.MsgSetMaxMintAllowance - 20, // 10: florin.v1.Msg.SetMintAllowance:input_type -> florin.v1.MsgSetMintAllowance - 22, // 11: florin.v1.Msg.TransferOwnership:input_type -> florin.v1.MsgTransferOwnership - 1, // 12: florin.v1.Msg.AcceptOwnership:output_type -> florin.v1.MsgAcceptOwnershipResponse - 3, // 13: florin.v1.Msg.AddAdminAccount:output_type -> florin.v1.MsgAddAdminAccountResponse - 5, // 14: florin.v1.Msg.AddSystemAccount:output_type -> florin.v1.MsgAddSystemAccountResponse - 7, // 15: florin.v1.Msg.AllowDenom:output_type -> florin.v1.MsgAllowDenomResponse - 9, // 16: florin.v1.Msg.Burn:output_type -> florin.v1.MsgBurnResponse - 11, // 17: florin.v1.Msg.Mint:output_type -> florin.v1.MsgMintResponse - 13, // 18: florin.v1.Msg.Recover:output_type -> florin.v1.MsgRecoverResponse - 15, // 19: florin.v1.Msg.RemoveAdminAccount:output_type -> florin.v1.MsgRemoveAdminAccountResponse - 17, // 20: florin.v1.Msg.RemoveSystemAccount:output_type -> florin.v1.MsgRemoveSystemAccountResponse - 19, // 21: florin.v1.Msg.SetMaxMintAllowance:output_type -> florin.v1.MsgSetMaxMintAllowanceResponse - 21, // 22: florin.v1.Msg.SetMintAllowance:output_type -> florin.v1.MsgSetMintAllowanceResponse - 23, // 23: florin.v1.Msg.TransferOwnership:output_type -> florin.v1.MsgTransferOwnershipResponse - 12, // [12:24] is the sub-list for method output_type - 0, // [0:12] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 24, // 0: florin.v1.MsgBurn.pub_key:type_name -> google.protobuf.Any + 24, // 1: florin.v1.MsgRecover.pub_key:type_name -> google.protobuf.Any + 0, // 2: florin.v1.Msg.AcceptOwnership:input_type -> florin.v1.MsgAcceptOwnership + 2, // 3: florin.v1.Msg.AddAdminAccount:input_type -> florin.v1.MsgAddAdminAccount + 4, // 4: florin.v1.Msg.AddSystemAccount:input_type -> florin.v1.MsgAddSystemAccount + 6, // 5: florin.v1.Msg.AllowDenom:input_type -> florin.v1.MsgAllowDenom + 8, // 6: florin.v1.Msg.Burn:input_type -> florin.v1.MsgBurn + 10, // 7: florin.v1.Msg.Mint:input_type -> florin.v1.MsgMint + 12, // 8: florin.v1.Msg.Recover:input_type -> florin.v1.MsgRecover + 14, // 9: florin.v1.Msg.RemoveAdminAccount:input_type -> florin.v1.MsgRemoveAdminAccount + 16, // 10: florin.v1.Msg.RemoveSystemAccount:input_type -> florin.v1.MsgRemoveSystemAccount + 18, // 11: florin.v1.Msg.SetMaxMintAllowance:input_type -> florin.v1.MsgSetMaxMintAllowance + 20, // 12: florin.v1.Msg.SetMintAllowance:input_type -> florin.v1.MsgSetMintAllowance + 22, // 13: florin.v1.Msg.TransferOwnership:input_type -> florin.v1.MsgTransferOwnership + 1, // 14: florin.v1.Msg.AcceptOwnership:output_type -> florin.v1.MsgAcceptOwnershipResponse + 3, // 15: florin.v1.Msg.AddAdminAccount:output_type -> florin.v1.MsgAddAdminAccountResponse + 5, // 16: florin.v1.Msg.AddSystemAccount:output_type -> florin.v1.MsgAddSystemAccountResponse + 7, // 17: florin.v1.Msg.AllowDenom:output_type -> florin.v1.MsgAllowDenomResponse + 9, // 18: florin.v1.Msg.Burn:output_type -> florin.v1.MsgBurnResponse + 11, // 19: florin.v1.Msg.Mint:output_type -> florin.v1.MsgMintResponse + 13, // 20: florin.v1.Msg.Recover:output_type -> florin.v1.MsgRecoverResponse + 15, // 21: florin.v1.Msg.RemoveAdminAccount:output_type -> florin.v1.MsgRemoveAdminAccountResponse + 17, // 22: florin.v1.Msg.RemoveSystemAccount:output_type -> florin.v1.MsgRemoveSystemAccountResponse + 19, // 23: florin.v1.Msg.SetMaxMintAllowance:output_type -> florin.v1.MsgSetMaxMintAllowanceResponse + 21, // 24: florin.v1.Msg.SetMintAllowance:output_type -> florin.v1.MsgSetMintAllowanceResponse + 23, // 25: florin.v1.Msg.TransferOwnership:output_type -> florin.v1.MsgTransferOwnershipResponse + 14, // [14:26] is the sub-list for method output_type + 2, // [2:14] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_florin_v1_tx_proto_init() } diff --git a/keeper/keeper.go b/keeper/keeper.go index 4b7c65f3..421165d5 100644 --- a/keeper/keeper.go +++ b/keeper/keeper.go @@ -18,7 +18,9 @@ import ( "context" "fmt" + "cosmossdk.io/core/address" "cosmossdk.io/core/store" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/monerium/module-noble/v2/types" "github.com/monerium/module-noble/v2/types/blacklist" @@ -28,22 +30,25 @@ type Keeper struct { authority string storeService store.KVStoreService - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper + cdc codec.Codec + addressCodec address.Codec + bankKeeper types.BankKeeper } func NewKeeper( authority string, storeService store.KVStoreService, - accountKeeper types.AccountKeeper, + cdc codec.Codec, + addressCodec address.Codec, bankKeeper types.BankKeeper, ) *Keeper { return &Keeper{ authority: authority, storeService: storeService, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, + cdc: cdc, + addressCodec: addressCodec, + bankKeeper: bankKeeper, } } diff --git a/keeper/msg_server.go b/keeper/msg_server.go index bdff7c82..82ac09fa 100644 --- a/keeper/msg_server.go +++ b/keeper/msg_server.go @@ -15,11 +15,13 @@ package keeper import ( + "bytes" "context" "fmt" "adr36.dev" "cosmossdk.io/errors" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/monerium/module-noble/v2/types" ) @@ -128,14 +130,20 @@ func (k msgServer) Burn(goCtx context.Context, msg *types.MsgBurn) (*types.MsgBu return nil, types.ErrInvalidSystem } - address := sdk.MustAccAddressFromBech32(msg.From) - account := k.accountKeeper.GetAccount(ctx, address) - if account == nil || account.GetPubKey() == nil { - return nil, types.ErrNoPubKey + var pubKey cryptotypes.PubKey + if err := k.cdc.UnpackAny(msg.PubKey, &pubKey); err != nil { + return nil, errors.Wrap(err, "unable to unpack pubkey") + } + from, err := k.addressCodec.StringToBytes(msg.From) + if err != nil { + return nil, errors.Wrapf(err, "unable to decode user address %s", msg.From) + } + if !bytes.Equal(from, pubKey.Address()) { + return nil, types.ErrInvalidPubKey } if !adr36.VerifySignature( - account.GetPubKey(), + pubKey, []byte("I hereby declare that I am the address owner."), msg.Signature, ) { @@ -143,8 +151,7 @@ func (k msgServer) Burn(goCtx context.Context, msg *types.MsgBurn) (*types.MsgBu } coins := sdk.NewCoins(sdk.NewCoin(msg.Denom, msg.Amount)) - from := sdk.MustAccAddressFromBech32(msg.From) - err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, from, types.ModuleName, coins) + err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, from, types.ModuleName, coins) if err != nil { return nil, errors.Wrap(err, "unable to transfer from user to module") } @@ -175,8 +182,11 @@ func (k msgServer) Mint(goCtx context.Context, msg *types.MsgMint) (*types.MsgMi k.Keeper.SetMintAllowance(ctx, msg.Denom, msg.Signer, allowance) coins := sdk.NewCoins(sdk.NewCoin(msg.Denom, msg.Amount)) - to := sdk.MustAccAddressFromBech32(msg.To) - err := k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) + to, err := k.addressCodec.StringToBytes(msg.To) + if err != nil { + return nil, errors.Wrapf(err, "unable to decode user address %s", msg.To) + } + err = k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) if err != nil { return nil, errors.Wrap(err, "unable to mint to module") } @@ -202,14 +212,20 @@ func (k msgServer) Recover(goCtx context.Context, msg *types.MsgRecover) (*types return nil, types.ErrInvalidSystem } - from := sdk.MustAccAddressFromBech32(msg.From) - account := k.accountKeeper.GetAccount(ctx, from) - if account == nil || account.GetPubKey() == nil { - return nil, types.ErrNoPubKey + var pubKey cryptotypes.PubKey + if err := k.cdc.UnpackAny(msg.PubKey, &pubKey); err != nil { + return nil, errors.Wrap(err, "unable to unpack pubkey") + } + from, err := k.addressCodec.StringToBytes(msg.From) + if err != nil { + return nil, errors.Wrapf(err, "unable to decode user address %s", msg.From) + } + if !bytes.Equal(from, pubKey.Address()) { + return nil, types.ErrInvalidPubKey } if !adr36.VerifySignature( - account.GetPubKey(), + pubKey, []byte("I hereby declare that I am the address owner."), msg.Signature, ) { @@ -221,8 +237,11 @@ func (k msgServer) Recover(goCtx context.Context, msg *types.MsgRecover) (*types return &types.MsgRecoverResponse{}, nil } - to := sdk.MustAccAddressFromBech32(msg.To) - err := k.bankKeeper.SendCoins(ctx, from, to, sdk.NewCoins(balance)) + to, err := k.addressCodec.StringToBytes(msg.To) + if err != nil { + return nil, errors.Wrapf(err, "unable to decode user address %s", msg.To) + } + err = k.bankKeeper.SendCoins(ctx, from, to, sdk.NewCoins(balance)) if err != nil { return nil, errors.Wrap(err, "unable to transfer from user to user") } diff --git a/keeper/msg_server_test.go b/keeper/msg_server_test.go index acc60e69..a2ae3ef2 100644 --- a/keeper/msg_server_test.go +++ b/keeper/msg_server_test.go @@ -22,7 +22,6 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/monerium/module-noble/v2/keeper" "github.com/monerium/module-noble/v2/types" "github.com/monerium/module-noble/v2/utils" @@ -229,14 +228,11 @@ func TestBurn(t *testing.T) { bz, _ := base64.StdEncoding.DecodeString("AlE8CxHR19ID5lxrVtTxSgJFlK3T+eYtyDM/vBA3Fowr") pubkey, _ := codectypes.NewAnyWithValue(&secp256k1.PubKey{Key: bz}) - account := mocks.AccountKeeper{ - Accounts: make(map[string]sdk.AccountI), - } bank := mocks.BankKeeper{ Balances: make(map[string]sdk.Coins), Restriction: mocks.NoOpSendRestrictionFn, } - k, ctx := mocks.FlorinWithKeepers(account, bank) + k, ctx := mocks.FlorinWithKeepers(bank) goCtx := sdk.WrapSDKContext(ctx) server := keeper.NewMsgServer(k) @@ -257,34 +253,36 @@ func TestBurn(t *testing.T) { // ASSERT: The action should've failed due to invalid signer. require.ErrorIs(t, err, types.ErrInvalidSystem) - // ACT: Attempt to burn with no account in state. + // ACT: Attempt to burn with invalid any. + invalidPubKey, _ := codectypes.NewAnyWithValue(&types.MsgBurn{}) _, err = server.Burn(goCtx, &types.MsgBurn{ Denom: "ueure", Signer: system.Address, - From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", + PubKey: invalidPubKey, }) - // ASSERT: The action should've failed due to no account. - require.ErrorIs(t, err, types.ErrNoPubKey) + // ASSERT: The action should've failed due to invalid any. + require.ErrorContains(t, err, "unable to unpack pubkey") - // ARRANGE: Set account in state, without pubkey. - account.Accounts["noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2"] = &authtypes.BaseAccount{} + // ACT: Attempt to burn with invalid user address. + _, err = server.Burn(goCtx, &types.MsgBurn{ + Denom: "ueure", + Signer: system.Address, + From: utils.TestAccount().Invalid, + PubKey: pubkey, + }) + // ASSERT: The action should've failed due to invalid user address. + require.ErrorContains(t, err, "unable to decode user address") - // ACT: Attempt to burn with no pubkey in state. + // ACT: Attempt to burn with invalid public key. + invalidPubKey, _ = codectypes.NewAnyWithValue(secp256k1.GenPrivKey().PubKey()) _, err = server.Burn(goCtx, &types.MsgBurn{ Denom: "ueure", Signer: system.Address, From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", + PubKey: invalidPubKey, }) - // ASSERT: The action should've failed due to no pubkey. - require.ErrorIs(t, err, types.ErrNoPubKey) - - // ARRANGE: Set pubkey in state. - account.Accounts["noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2"] = &authtypes.BaseAccount{ - Address: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", - PubKey: pubkey, - AccountNumber: 0, - Sequence: 0, - } + // ASSERT: The action should've failed due to invalid public key. + require.ErrorIs(t, err, types.ErrInvalidPubKey) // ACT: Attempt to burn with invalid signature. signature, _ := base64.StdEncoding.DecodeString("QBrRfIqjdBvXx9zaBcuiE9P5SVesxFO/He3deyx2OE0NoSNqwmSb7b5iP2UhZRI1duiOeho3+NETUkCBv14zjQ==") @@ -293,6 +291,7 @@ func TestBurn(t *testing.T) { Signer: system.Address, From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", Signature: signature, + PubKey: pubkey, }) // ASSERT: The action should've failed due to invalid signature. require.ErrorIs(t, err, types.ErrInvalidSignature) @@ -305,6 +304,7 @@ func TestBurn(t *testing.T) { From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", Amount: One, Signature: signature, + PubKey: pubkey, }) // ASSERT: The action should've failed due to insufficient balance. require.ErrorContains(t, err, "unable to transfer from user to module") @@ -319,6 +319,7 @@ func TestBurn(t *testing.T) { From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", Amount: One, Signature: signature, + PubKey: pubkey, }) // ASSERT: The action should've succeeded. require.NoError(t, err) @@ -330,7 +331,7 @@ func TestMint(t *testing.T) { Balances: make(map[string]sdk.Coins), Restriction: mocks.NoOpSendRestrictionFn, } - k, ctx := mocks.FlorinWithKeepers(mocks.AccountKeeper{}, bank) + k, ctx := mocks.FlorinWithKeepers(bank) goCtx := sdk.WrapSDKContext(ctx) server := keeper.NewMsgServer(k) @@ -375,6 +376,16 @@ func TestMint(t *testing.T) { // ARRANGE: Generate a user account. user := utils.TestAccount() + // ACT: Attempt to mint with invalid user address. + _, err = server.Mint(goCtx, &types.MsgMint{ + Denom: "ueure", + Signer: system.Address, + To: user.Invalid, + Amount: math.ZeroInt(), + }) + // ASSERT: The action should've failed due to invalid user address. + require.ErrorContains(t, err, "unable to decode user address") + // ACT: Attempt to mint. _, err = server.Mint(goCtx, &types.MsgMint{ Denom: "ueure", @@ -406,14 +417,11 @@ func TestRecover(t *testing.T) { bz, _ := base64.StdEncoding.DecodeString("AlE8CxHR19ID5lxrVtTxSgJFlK3T+eYtyDM/vBA3Fowr") pubkey, _ := codectypes.NewAnyWithValue(&secp256k1.PubKey{Key: bz}) - account := mocks.AccountKeeper{ - Accounts: make(map[string]sdk.AccountI), - } bank := mocks.BankKeeper{ Balances: make(map[string]sdk.Coins), Restriction: mocks.NoOpSendRestrictionFn, } - k, ctx := mocks.FlorinWithKeepers(account, bank) + k, ctx := mocks.FlorinWithKeepers(bank) goCtx := sdk.WrapSDKContext(ctx) server := keeper.NewMsgServer(k) @@ -434,34 +442,36 @@ func TestRecover(t *testing.T) { // ASSERT: The action should've failed due to invalid signer. require.ErrorIs(t, err, types.ErrInvalidSystem) - // ACT: Attempt to recover with no account in state. + // ACT: Attempt to recover with invalid any. + invalidPubKey, _ := codectypes.NewAnyWithValue(&types.MsgRecover{}) _, err = server.Recover(goCtx, &types.MsgRecover{ Denom: "ueure", Signer: system.Address, - From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", + PubKey: invalidPubKey, }) - // ASSERT: The action should've failed due to no account. - require.ErrorIs(t, err, types.ErrNoPubKey) + // ASSERT: The action should've failed due to invalid any. + require.ErrorContains(t, err, "unable to unpack pubkey") - // ARRANGE: Set account in state, without pubkey. - account.Accounts["noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2"] = &authtypes.BaseAccount{} + // ACT: Attempt to recover with invalid user address. + _, err = server.Recover(goCtx, &types.MsgRecover{ + Denom: "ueure", + Signer: system.Address, + From: utils.TestAccount().Invalid, + PubKey: pubkey, + }) + // ASSERT: The action should've failed due to invalid user address. + require.ErrorContains(t, err, "unable to decode user address") - // ACT: Attempt to recover with no pubkey in state. + // ACT: Attempt to recover with invalid public key. + invalidPubKey, _ = codectypes.NewAnyWithValue(secp256k1.GenPrivKey().PubKey()) _, err = server.Recover(goCtx, &types.MsgRecover{ Denom: "ueure", Signer: system.Address, From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", + PubKey: invalidPubKey, }) - // ASSERT: The action should've failed due to no pubkey. - require.ErrorIs(t, err, types.ErrNoPubKey) - - // ARRANGE: Set pubkey in state. - account.Accounts["noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2"] = &authtypes.BaseAccount{ - Address: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", - PubKey: pubkey, - AccountNumber: 0, - Sequence: 0, - } + // ASSERT: The action should've failed due to invalid public key. + require.ErrorIs(t, err, types.ErrInvalidPubKey) // ACT: Attempt to recover with invalid signature. signature, _ := base64.StdEncoding.DecodeString("QBrRfIqjdBvXx9zaBcuiE9P5SVesxFO/He3deyx2OE0NoSNqwmSb7b5iP2UhZRI1duiOeho3+NETUkCBv14zjQ==") @@ -470,6 +480,7 @@ func TestRecover(t *testing.T) { Signer: system.Address, From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", Signature: signature, + PubKey: pubkey, }) // ASSERT: The action should've failed due to invalid signature. require.ErrorIs(t, err, types.ErrInvalidSignature) @@ -485,6 +496,7 @@ func TestRecover(t *testing.T) { From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", To: recipient.Address, Signature: signature, + PubKey: pubkey, }) // ASSERT: The action should've succeeded. require.NoError(t, err) @@ -492,6 +504,18 @@ func TestRecover(t *testing.T) { // ARRANGE: Give user 1 $EURe. bank.Balances["noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2"] = sdk.NewCoins(sdk.NewCoin("ueure", One)) + // ACT: Attempt to recover with invalid user address. + _, err = server.Recover(goCtx, &types.MsgRecover{ + Denom: "ueure", + Signer: system.Address, + From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", + To: recipient.Invalid, + Signature: signature, + PubKey: pubkey, + }) + // ASSERT: The action should've failed due to invalid user address. + require.ErrorContains(t, err, "unable to decode user address") + // ACT: Attempt to recover. _, err = server.Recover(goCtx, &types.MsgRecover{ Denom: "ueure", @@ -499,6 +523,7 @@ func TestRecover(t *testing.T) { From: "noble1rwvjzk28l38js7xx6mq23nrpghd8qqvxmj6ep2", To: recipient.Address, Signature: signature, + PubKey: pubkey, }) // ASSERT: The action should've succeeded. require.NoError(t, err) diff --git a/module.go b/module.go index 9371a606..25f8606e 100644 --- a/module.go +++ b/module.go @@ -19,6 +19,7 @@ import ( "encoding/json" "fmt" + "cosmossdk.io/core/address" "cosmossdk.io/core/appmodule" "cosmossdk.io/core/store" "cosmossdk.io/depinject" @@ -156,8 +157,9 @@ type ModuleInputs struct { Config *modulev1.Module StoreService store.KVStoreService - AccountKeeper types.AccountKeeper - BankKeeper types.BankKeeper + Cdc codec.Codec + AddressCodec address.Codec + BankKeeper types.BankKeeper } type ModuleOutputs struct { @@ -177,7 +179,8 @@ func ProvideModule(in ModuleInputs) ModuleOutputs { k := keeper.NewKeeper( authority.String(), in.StoreService, - in.AccountKeeper, + in.Cdc, + in.AddressCodec, in.BankKeeper, ) m := NewAppModule(k) diff --git a/proto/buf.gen.gogo.yaml b/proto/buf.gen.gogo.yaml index 9720d62c..99eff1ca 100644 --- a/proto/buf.gen.gogo.yaml +++ b/proto/buf.gen.gogo.yaml @@ -3,7 +3,7 @@ version: v1 plugins: - name: gocosmos out: .. - opt: plugins=grpc + opt: plugins=grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types - name: grpc-gateway out: .. opt: logtostderr=true,allow_colon_final_segments=true diff --git a/proto/florin/v1/tx.proto b/proto/florin/v1/tx.proto index 4cfa9a7a..bf5a2632 100644 --- a/proto/florin/v1/tx.proto +++ b/proto/florin/v1/tx.proto @@ -6,6 +6,7 @@ import "amino/amino.proto"; import "cosmos/msg/v1/msg.proto"; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; +import "google/protobuf/any.proto"; option go_package = "github.com/monerium/module-noble/v2/types"; @@ -107,6 +108,7 @@ message MsgBurn { (gogoproto.nullable) = false ]; bytes signature = 5; + google.protobuf.Any pub_key = 6; } // MsgBurnResponse is the response of the Burn action. @@ -147,6 +149,7 @@ message MsgRecover { string from = 3 [(cosmos_proto.scalar) = "cosmos.AddressString"]; string to = 4 [(cosmos_proto.scalar) = "cosmos.AddressString"]; bytes signature = 5; + google.protobuf.Any pub_key = 6; } // MsgRecoverResponse is the response of the Recover action. diff --git a/types/errors.go b/types/errors.go index 06ed73c6..fb466bd6 100644 --- a/types/errors.go +++ b/types/errors.go @@ -29,6 +29,6 @@ var ( ErrInvalidAdmin = errors.Register(ModuleName, 10, "signer is not an admin") ErrInvalidAllowance = errors.Register(ModuleName, 11, "allowance cannot be negative or greater than max") ErrInsufficientAllowance = errors.Register(ModuleName, 12, "insufficient allowance") - ErrNoPubKey = errors.Register(ModuleName, 13, "there is no public key") + ErrInvalidPubKey = errors.Register(ModuleName, 13, "invalid public key") ErrInvalidSignature = errors.Register(ModuleName, 14, "invalid signature") ) diff --git a/types/expected_keepers.go b/types/expected_keepers.go index 05c9c65d..1c9880f6 100644 --- a/types/expected_keepers.go +++ b/types/expected_keepers.go @@ -20,10 +20,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -type AccountKeeper interface { - GetAccount(ctx context.Context, addr sdk.AccAddress) sdk.AccountI -} - type BankKeeper interface { BurnCoins(ctx context.Context, moduleName string, amt sdk.Coins) error GetBalance(ctx context.Context, addr sdk.AccAddress, denom string) sdk.Coin diff --git a/types/tx.pb.go b/types/tx.pb.go index a98c074e..52569dbe 100644 --- a/types/tx.pb.go +++ b/types/tx.pb.go @@ -8,6 +8,7 @@ import ( cosmossdk_io_math "cosmossdk.io/math" fmt "fmt" _ "github.com/cosmos/cosmos-proto" + types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" _ "github.com/cosmos/gogoproto/gogoproto" @@ -346,6 +347,7 @@ type MsgBurn struct { From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` Amount cosmossdk_io_math.Int `protobuf:"bytes,4,opt,name=amount,proto3,customtype=cosmossdk.io/math.Int" json:"amount"` Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + PubKey *types.Any `protobuf:"bytes,6,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` } func (m *MsgBurn) Reset() { *m = MsgBurn{} } @@ -498,11 +500,12 @@ var xxx_messageInfo_MsgMintResponse proto.InternalMessageInfo // MsgRecover implements the recover (0x6eb4c609) method. type MsgRecover struct { - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` - Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"` - From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` - To string `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` + Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"` + From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` + To string `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` + Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` + PubKey *types.Any `protobuf:"bytes,6,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` } func (m *MsgRecover) Reset() { *m = MsgRecover{} } @@ -991,68 +994,72 @@ func init() { func init() { proto.RegisterFile("florin/v1/tx.proto", fileDescriptor_de2a06c2ec80785c) } var fileDescriptor_de2a06c2ec80785c = []byte{ - // 971 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x97, 0xcd, 0x6f, 0xe3, 0x44, - 0x14, 0xc0, 0x33, 0xe9, 0x17, 0x7d, 0x7c, 0x2c, 0x75, 0xd3, 0x6d, 0xd6, 0xb4, 0x4e, 0x30, 0xa2, - 0xb4, 0x15, 0xb5, 0xdb, 0x20, 0x38, 0xe4, 0x82, 0x52, 0x38, 0xec, 0x1e, 0x22, 0xa4, 0x14, 0x09, - 0x69, 0x25, 0xb4, 0xb8, 0xf6, 0xd4, 0xb5, 0x88, 0x67, 0x22, 0x8f, 0x93, 0xec, 0xde, 0x10, 0x27, - 0x84, 0xf6, 0xc0, 0x9f, 0xb0, 0x47, 0x8e, 0x15, 0xda, 0x3f, 0x00, 0x71, 0x80, 0x1e, 0x57, 0x7b, - 0x42, 0x1c, 0x2a, 0xd4, 0x1e, 0x8a, 0x38, 0x72, 0xe6, 0x80, 0x6c, 0x4f, 0xa6, 0xf1, 0x57, 0x5c, - 0x41, 0x58, 0xf5, 0x12, 0xd9, 0xef, 0x6b, 0xde, 0xef, 0xcd, 0xf8, 0xcd, 0x0b, 0x48, 0x47, 0x5d, - 0xea, 0x39, 0x44, 0x1f, 0xec, 0xe9, 0xfe, 0x43, 0xad, 0xe7, 0x51, 0x9f, 0x4a, 0x8b, 0x91, 0x4c, - 0x1b, 0xec, 0xc9, 0x4b, 0x86, 0xeb, 0x10, 0xaa, 0x87, 0xbf, 0x91, 0x56, 0x5e, 0x35, 0x29, 0x73, - 0x29, 0xd3, 0x5d, 0x66, 0x07, 0x5e, 0x2e, 0xb3, 0xb9, 0xe2, 0x4e, 0xa4, 0x78, 0x10, 0xbe, 0xe9, - 0xd1, 0x0b, 0x57, 0x55, 0x6c, 0x6a, 0xd3, 0x48, 0x1e, 0x3c, 0x45, 0x52, 0xf5, 0x31, 0x02, 0xa9, - 0xcd, 0xec, 0x96, 0x69, 0xe2, 0x9e, 0xff, 0xc9, 0x90, 0x60, 0x8f, 0x1d, 0x3b, 0x3d, 0xa9, 0x02, - 0x73, 0x16, 0x26, 0xd4, 0xad, 0xa2, 0x3a, 0xda, 0x5c, 0xec, 0x44, 0x2f, 0xd2, 0x2e, 0xcc, 0x33, - 0xc7, 0x26, 0xd8, 0xab, 0x96, 0x03, 0xf1, 0x7e, 0xf5, 0xf9, 0xd3, 0x9d, 0x0a, 0x5f, 0xa4, 0x65, - 0x59, 0x1e, 0x66, 0xec, 0xc0, 0xf7, 0x1c, 0x62, 0x77, 0xb8, 0x5d, 0x53, 0xfb, 0xe6, 0x49, 0xad, - 0xf4, 0xc7, 0x93, 0x5a, 0xe9, 0xeb, 0xcb, 0x93, 0x6d, 0x2e, 0xfc, 0xf6, 0xf2, 0x64, 0xfb, 0x36, - 0x47, 0x4e, 0xac, 0xab, 0xae, 0x81, 0x9c, 0xce, 0xa6, 0x83, 0x59, 0x8f, 0x12, 0x86, 0xd5, 0x1f, - 0x79, 0xb2, 0x96, 0xd5, 0xb2, 0x5c, 0x87, 0xb4, 0x4c, 0x93, 0xf6, 0x89, 0x3f, 0xad, 0x64, 0xa5, - 0x06, 0x2c, 0x18, 0x51, 0xc8, 0xea, 0x4c, 0x81, 0xcb, 0xc8, 0xb0, 0x18, 0x30, 0x9e, 0xeb, 0x08, - 0x30, 0x2e, 0x15, 0x80, 0x3f, 0x21, 0x58, 0x8e, 0xd4, 0x07, 0x8f, 0x98, 0x8f, 0xdd, 0x9b, 0x40, - 0xa8, 0xe7, 0x10, 0xae, 0x5e, 0x11, 0xc6, 0x92, 0x55, 0xd7, 0xe1, 0x8d, 0x0c, 0x06, 0xc1, 0xf8, - 0x03, 0x82, 0x57, 0x03, 0x7d, 0xb7, 0x4b, 0x87, 0x1f, 0x27, 0x38, 0xd0, 0x35, 0x39, 0x44, 0x3d, - 0xca, 0xe3, 0xf5, 0xd0, 0x60, 0x8e, 0x06, 0x67, 0xa6, 0x90, 0x2d, 0x32, 0x6b, 0x6e, 0xe5, 0x90, - 0x2d, 0x8d, 0xc8, 0x44, 0x8a, 0xea, 0x2a, 0xac, 0xc4, 0x72, 0x16, 0x34, 0x8f, 0xcb, 0xb0, 0xd0, - 0x66, 0xf6, 0x7e, 0xdf, 0x23, 0x53, 0xdb, 0xa5, 0x77, 0x61, 0xf6, 0xc8, 0xa3, 0x6e, 0x21, 0x46, - 0x68, 0x25, 0xdd, 0x85, 0x79, 0xc3, 0x0d, 0xb7, 0x74, 0x36, 0xb4, 0xdf, 0x3d, 0x3d, 0xab, 0x95, - 0x7e, 0x3b, 0xab, 0xad, 0x44, 0x3e, 0xcc, 0xfa, 0x52, 0x73, 0xa8, 0xee, 0x1a, 0xfe, 0xb1, 0x76, - 0x8f, 0xf8, 0xcf, 0x9f, 0xee, 0x00, 0x0f, 0x76, 0x8f, 0xf8, 0xdf, 0x5f, 0x9e, 0x6c, 0xa3, 0x0e, - 0xf7, 0x97, 0xd6, 0x60, 0x31, 0xc8, 0xc0, 0xf0, 0xfb, 0x1e, 0xae, 0xce, 0xd5, 0xd1, 0xe6, 0x2b, - 0x9d, 0x2b, 0x41, 0xf3, 0xad, 0x9c, 0x6a, 0xbd, 0xcc, 0xab, 0x15, 0x94, 0x40, 0x5d, 0x82, 0x5b, - 0xbc, 0x1a, 0xa2, 0x42, 0x7f, 0xa2, 0xb0, 0x42, 0x6d, 0x67, 0x8a, 0xe7, 0x78, 0x13, 0xca, 0x3e, - 0x2d, 0xac, 0x4f, 0xd9, 0xa7, 0xd3, 0xab, 0x4e, 0x21, 0x7f, 0x00, 0xc8, 0xf9, 0x83, 0x47, 0xc1, - 0xff, 0x17, 0x02, 0x68, 0x33, 0xbb, 0x83, 0x4d, 0x3a, 0x18, 0x3f, 0xba, 0x2f, 0xf4, 0x90, 0x44, - 0x05, 0x9b, 0xbd, 0x46, 0xc1, 0x26, 0x1f, 0x82, 0x8d, 0x9c, 0x22, 0xbc, 0xc6, 0x8b, 0xc0, 0x29, - 0xd5, 0x4a, 0xd8, 0xa8, 0xf9, 0x9b, 0x28, 0xc5, 0xcf, 0x28, 0xfc, 0x8c, 0x3a, 0xd8, 0xa5, 0x03, - 0x7c, 0x63, 0x5a, 0xf8, 0x5e, 0x0e, 0xd3, 0x1d, 0xc1, 0x94, 0x4c, 0x57, 0xad, 0xc1, 0x7a, 0x26, - 0x87, 0x20, 0x3d, 0x45, 0x70, 0x5b, 0x58, 0xdc, 0x9c, 0x5e, 0xde, 0xc8, 0x41, 0x95, 0x63, 0xa8, - 0xf1, 0x76, 0x5e, 0x07, 0x25, 0x9b, 0x44, 0xc0, 0x9e, 0x45, 0xb0, 0x07, 0xd8, 0x6f, 0x1b, 0x0f, - 0x83, 0xb3, 0x1f, 0xf6, 0x49, 0x83, 0x98, 0x78, 0x6a, 0xb0, 0x57, 0x9f, 0xf1, 0xcc, 0x7f, 0xfc, - 0x8c, 0x8b, 0x4a, 0x90, 0x41, 0xc1, 0x4b, 0x90, 0xa1, 0x19, 0xbf, 0x06, 0x96, 0xb9, 0xc9, 0xff, - 0xc2, 0xff, 0x2f, 0x36, 0x7b, 0x8a, 0xad, 0xaf, 0x68, 0x04, 0x48, 0x62, 0xf3, 0x11, 0x20, 0x29, - 0x16, 0xd5, 0xfa, 0x05, 0x41, 0xa5, 0xcd, 0xec, 0x4f, 0x3d, 0x83, 0xb0, 0x23, 0xec, 0x4d, 0x7d, - 0xec, 0x94, 0xde, 0x87, 0x45, 0x82, 0x87, 0x0f, 0xae, 0x37, 0x0d, 0xbc, 0x44, 0xf0, 0x30, 0x4c, - 0xa1, 0xb9, 0x9b, 0xc3, 0x59, 0xe5, 0x9c, 0xa9, 0x84, 0x55, 0x05, 0xd6, 0xb2, 0x40, 0x46, 0xa4, - 0x8d, 0xbf, 0x17, 0x60, 0xa6, 0xcd, 0x6c, 0xe9, 0x33, 0xb8, 0x95, 0x1c, 0xb1, 0xd7, 0x35, 0x31, - 0xe2, 0x6b, 0xe9, 0x99, 0x57, 0x7e, 0x7b, 0xa2, 0x7a, 0xb4, 0x40, 0x18, 0x38, 0x31, 0x0e, 0x27, - 0x03, 0xc7, 0xd5, 0xa9, 0xc0, 0xd9, 0xa3, 0xa8, 0x74, 0x1f, 0x5e, 0x4f, 0x8d, 0xa1, 0x4a, 0xca, - 0x35, 0xa6, 0x97, 0x37, 0x26, 0xeb, 0x45, 0xec, 0xbb, 0x00, 0x63, 0xe3, 0x5f, 0x35, 0xe1, 0x25, - 0x34, 0x72, 0x3d, 0x4f, 0x23, 0x22, 0x7d, 0x00, 0xb3, 0xe1, 0xe8, 0x25, 0xc5, 0x2d, 0x03, 0x99, - 0x2c, 0xa7, 0x65, 0xe3, 0x7e, 0xe1, 0x40, 0x92, 0xf0, 0x0b, 0x64, 0x49, 0xbf, 0xf1, 0xcb, 0x5c, - 0xfa, 0x10, 0x16, 0x46, 0x17, 0xf9, 0x4a, 0xdc, 0x8c, 0x8b, 0xe5, 0xf5, 0x4c, 0xb1, 0x08, 0xf0, - 0x05, 0x48, 0x19, 0xd7, 0x5f, 0x3d, 0xe9, 0x94, 0xb4, 0x90, 0x37, 0x8b, 0x2c, 0xc4, 0x0a, 0x26, - 0x2c, 0x67, 0x5d, 0x3b, 0x6f, 0x66, 0x05, 0x88, 0x6f, 0xdf, 0x56, 0xa1, 0xc9, 0xf8, 0x22, 0x59, - 0xed, 0x3e, 0xb1, 0x48, 0x86, 0x49, 0x72, 0x91, 0x09, 0x4d, 0x35, 0x38, 0x82, 0xa9, 0x86, 0xaa, - 0xa4, 0xdd, 0x63, 0xe1, 0x37, 0x26, 0xeb, 0x45, 0xec, 0xcf, 0x61, 0x29, 0xdd, 0x7e, 0x6a, 0x71, - 0xe7, 0x94, 0x81, 0xfc, 0x4e, 0x81, 0xc1, 0x28, 0xbc, 0x3c, 0xf7, 0x55, 0xd0, 0x40, 0xf7, 0x3f, - 0x3a, 0x3d, 0x57, 0xd0, 0xb3, 0x73, 0x05, 0xfd, 0x7e, 0xae, 0xa0, 0xef, 0x2e, 0x94, 0xd2, 0xb3, - 0x0b, 0xa5, 0xf4, 0xeb, 0x85, 0x52, 0xba, 0xbf, 0x65, 0x3b, 0xfe, 0x71, 0xff, 0x50, 0x33, 0xa9, - 0xab, 0xbb, 0x94, 0x60, 0xcf, 0xe9, 0x07, 0x0f, 0x56, 0xbf, 0x8b, 0x77, 0x08, 0x3d, 0xec, 0x62, - 0x7d, 0xd0, 0xd0, 0xfd, 0x47, 0x3d, 0xcc, 0x0e, 0xe7, 0xc3, 0x7f, 0xea, 0xef, 0xfd, 0x13, 0x00, - 0x00, 0xff, 0xff, 0x34, 0x71, 0x5f, 0x34, 0x27, 0x10, 0x00, 0x00, + // 1025 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x97, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0xc7, 0xe3, 0xb4, 0x4d, 0xe8, 0x5b, 0x60, 0xa9, 0x37, 0xdd, 0x66, 0x4d, 0xeb, 0x04, 0x23, + 0x4a, 0x5a, 0x51, 0xbb, 0x0d, 0x82, 0x43, 0x2f, 0x28, 0x85, 0xc3, 0xae, 0x50, 0x84, 0x94, 0x22, + 0x21, 0xad, 0x84, 0x8a, 0xe3, 0x4c, 0x5d, 0x6b, 0xe3, 0x99, 0xc8, 0x63, 0xa7, 0x9b, 0x1b, 0xe2, + 0x84, 0xd0, 0x1e, 0xf8, 0x13, 0x96, 0x1b, 0xc7, 0x0a, 0xed, 0x8d, 0x0b, 0xe2, 0x00, 0x3d, 0xae, + 0x7a, 0x42, 0x1c, 0x2a, 0xd4, 0x1e, 0x8a, 0xf8, 0x1b, 0x38, 0x20, 0xdb, 0xe3, 0x69, 0xfc, 0x23, + 0x75, 0x05, 0x61, 0xd5, 0x4b, 0x15, 0xbf, 0x5f, 0xf3, 0x3e, 0x5f, 0x8f, 0x67, 0x5e, 0x41, 0xdc, + 0xef, 0x13, 0xc7, 0xc2, 0xda, 0x70, 0x4b, 0x73, 0x1f, 0xab, 0x03, 0x87, 0xb8, 0x44, 0x9c, 0x0f, + 0x6d, 0xea, 0x70, 0x4b, 0x5a, 0xd0, 0x6d, 0x0b, 0x13, 0x2d, 0xf8, 0x1b, 0x7a, 0xa5, 0x25, 0x83, + 0x50, 0x9b, 0x50, 0xcd, 0xa6, 0xa6, 0x9f, 0x65, 0x53, 0x93, 0x39, 0xee, 0x85, 0x8e, 0xbd, 0xe0, + 0x49, 0x0b, 0x1f, 0x98, 0xab, 0x62, 0x12, 0x93, 0x84, 0x76, 0xff, 0x57, 0x94, 0x60, 0x12, 0x62, + 0xf6, 0x91, 0x16, 0x3c, 0x75, 0xbd, 0x7d, 0x4d, 0xc7, 0xa3, 0xd0, 0xa5, 0x3c, 0x11, 0x40, 0x6c, + 0x53, 0xb3, 0x65, 0x18, 0x68, 0xe0, 0x7e, 0x72, 0x88, 0x91, 0x43, 0x0f, 0xac, 0x81, 0x58, 0x81, + 0xb9, 0x1e, 0xc2, 0xc4, 0xae, 0x0a, 0x75, 0xa1, 0x31, 0xdf, 0x09, 0x1f, 0xc4, 0x4d, 0x28, 0x51, + 0xcb, 0xc4, 0xc8, 0xa9, 0x16, 0x7d, 0xf3, 0x4e, 0xf5, 0xe4, 0xd9, 0x46, 0x85, 0xad, 0xdf, 0xea, + 0xf5, 0x1c, 0x44, 0xe9, 0xae, 0xeb, 0x58, 0xd8, 0xec, 0xb0, 0xb8, 0x6d, 0xf5, 0xeb, 0xa7, 0xb5, + 0xc2, 0x9f, 0x4f, 0x6b, 0x85, 0xaf, 0x2e, 0x8e, 0xd6, 0x99, 0xf1, 0x9b, 0x8b, 0xa3, 0xf5, 0xbb, + 0x4c, 0x8d, 0xc4, 0xba, 0xca, 0x32, 0x48, 0xe9, 0x6e, 0x3a, 0x88, 0x0e, 0x08, 0xa6, 0x48, 0xf9, + 0x89, 0x35, 0xdb, 0xeb, 0xb5, 0x7a, 0xb6, 0x85, 0x5b, 0x86, 0x41, 0x3c, 0xec, 0x4e, 0xab, 0x59, + 0xb1, 0x09, 0x65, 0x3d, 0x2c, 0x59, 0x9d, 0xc9, 0x49, 0x89, 0x02, 0xf3, 0x01, 0xe3, 0xbd, 0x46, + 0x80, 0x71, 0x2b, 0x07, 0xfc, 0x59, 0x80, 0x3b, 0xa1, 0x7b, 0x77, 0x44, 0x5d, 0x64, 0xdf, 0x04, + 0x42, 0x6d, 0x02, 0xe1, 0xd2, 0x25, 0x61, 0xac, 0x59, 0x65, 0x05, 0x5e, 0xcf, 0x60, 0xe0, 0x8c, + 0x3f, 0x08, 0xf0, 0x8a, 0xef, 0xef, 0xf7, 0xc9, 0xe1, 0x47, 0x09, 0x0e, 0xe1, 0x9a, 0x1c, 0x5c, + 0x8f, 0xe2, 0xb8, 0x1e, 0x2a, 0xcc, 0x11, 0x7f, 0xcf, 0xe4, 0xb2, 0x85, 0x61, 0xdb, 0x6b, 0x13, + 0xc8, 0x16, 0x22, 0x32, 0xde, 0xa2, 0xb2, 0x04, 0x8b, 0xb1, 0x9e, 0x39, 0xcd, 0x8f, 0x45, 0x28, + 0xb7, 0xa9, 0xb9, 0xe3, 0x39, 0x78, 0x6a, 0x6f, 0xe9, 0x1d, 0x98, 0xdd, 0x77, 0x88, 0x9d, 0x8b, + 0x11, 0x44, 0x89, 0xf7, 0xa1, 0xa4, 0xdb, 0xc1, 0x2b, 0x9d, 0x0d, 0xe2, 0x37, 0x8f, 0x4f, 0x6b, + 0x85, 0xdf, 0x4f, 0x6b, 0x8b, 0x61, 0x0e, 0xed, 0x3d, 0x52, 0x2d, 0xa2, 0xd9, 0xba, 0x7b, 0xa0, + 0x3e, 0xc0, 0xee, 0xc9, 0xb3, 0x0d, 0x60, 0xc5, 0x1e, 0x60, 0xf7, 0xfb, 0x8b, 0xa3, 0x75, 0xa1, + 0xc3, 0xf2, 0xc5, 0x65, 0x98, 0xf7, 0x3b, 0xd0, 0x5d, 0xcf, 0x41, 0xd5, 0xb9, 0xba, 0xd0, 0x78, + 0xb9, 0x73, 0x69, 0x10, 0x37, 0xa0, 0x3c, 0xf0, 0xba, 0x7b, 0x8f, 0xd0, 0xa8, 0x5a, 0xaa, 0x0b, + 0x8d, 0x5b, 0xcd, 0x8a, 0x1a, 0x1e, 0x2b, 0x6a, 0x74, 0xac, 0xa8, 0x2d, 0x3c, 0xea, 0x94, 0x06, + 0x5e, 0xf7, 0x63, 0x34, 0xda, 0x7e, 0x73, 0x82, 0xb8, 0xb7, 0x98, 0xb8, 0xbe, 0x62, 0xca, 0x02, + 0xdc, 0x66, 0xe2, 0x71, 0x41, 0xff, 0x12, 0x02, 0x41, 0xdb, 0xd6, 0x14, 0xb7, 0x7d, 0x03, 0x8a, + 0x2e, 0xc9, 0x95, 0xb3, 0xe8, 0x92, 0xe9, 0x89, 0x99, 0xcb, 0xef, 0x03, 0x32, 0x7e, 0xff, 0x27, + 0xe7, 0xff, 0xae, 0x08, 0xd0, 0xa6, 0x66, 0x07, 0x19, 0x64, 0x38, 0xbe, 0xd3, 0x5f, 0xe8, 0x9e, + 0x0a, 0x05, 0x9b, 0xbd, 0x86, 0x60, 0x53, 0xdd, 0x33, 0xab, 0x13, 0x34, 0x7b, 0x95, 0x69, 0xc6, + 0x44, 0x51, 0x2a, 0xc1, 0x35, 0xc0, 0x9e, 0xb8, 0x72, 0xbf, 0x08, 0xc1, 0x47, 0xda, 0x41, 0x36, + 0x19, 0xa2, 0x1b, 0x73, 0x41, 0x6c, 0x4d, 0x60, 0xba, 0xc7, 0x99, 0x92, 0xed, 0x2a, 0x35, 0x58, + 0xc9, 0xe4, 0xe0, 0xa4, 0xc7, 0x02, 0xdc, 0xe5, 0x11, 0x37, 0xe7, 0xa6, 0x68, 0x4e, 0x40, 0x95, + 0x62, 0xa8, 0xf1, 0xcb, 0xa2, 0x0e, 0x72, 0x36, 0x09, 0x87, 0x3d, 0x0d, 0x61, 0x77, 0x91, 0xdb, + 0xd6, 0x1f, 0xfb, 0x9f, 0x4a, 0x70, 0x0a, 0xeb, 0xd8, 0x40, 0x53, 0x83, 0xbd, 0xfc, 0xea, 0x67, + 0xfe, 0xe3, 0x57, 0x9f, 0x27, 0x41, 0x06, 0x05, 0x93, 0x20, 0xc3, 0xc3, 0x25, 0x78, 0x52, 0x0c, + 0xc6, 0x02, 0x3f, 0xe4, 0x7f, 0xe1, 0xff, 0x17, 0x2f, 0x7b, 0x8a, 0x27, 0x65, 0xde, 0x80, 0x91, + 0xc4, 0x66, 0x03, 0x46, 0xd2, 0xcc, 0xd5, 0xfa, 0x55, 0x80, 0x4a, 0x9b, 0x9a, 0x9f, 0x3a, 0x3a, + 0xa6, 0xfb, 0xc8, 0x99, 0xfa, 0x50, 0x2b, 0xbe, 0x07, 0xf3, 0x18, 0x1d, 0xee, 0x5d, 0x6f, 0xd6, + 0x78, 0x09, 0xa3, 0xc3, 0xa0, 0x85, 0xed, 0xcd, 0x09, 0x9c, 0x55, 0xc6, 0x99, 0x6a, 0x58, 0x91, + 0x61, 0x39, 0x0b, 0x24, 0x22, 0x6d, 0xfe, 0x5d, 0x86, 0x99, 0x36, 0x35, 0xc5, 0xcf, 0xe0, 0x76, + 0x72, 0x80, 0x5f, 0x51, 0xf9, 0xff, 0x16, 0x6a, 0x7a, 0xa2, 0x96, 0xde, 0xba, 0xd2, 0x1d, 0x2d, + 0x10, 0x14, 0x4e, 0x0c, 0xdb, 0xc9, 0xc2, 0x71, 0x77, 0xaa, 0x70, 0xf6, 0xa0, 0x2b, 0x3e, 0x84, + 0xd7, 0x52, 0x43, 0xae, 0x9c, 0x4a, 0x8d, 0xf9, 0xa5, 0xd5, 0xab, 0xfd, 0xbc, 0xf6, 0x7d, 0x80, + 0xb1, 0xe1, 0xb2, 0x9a, 0xc8, 0xe2, 0x1e, 0xa9, 0x3e, 0xc9, 0xc3, 0x2b, 0xbd, 0x0f, 0xb3, 0xc1, + 0x60, 0x27, 0xc6, 0x23, 0x7d, 0x9b, 0x24, 0xa5, 0x6d, 0xe3, 0x79, 0xc1, 0xfc, 0x92, 0xc8, 0xf3, + 0x6d, 0xc9, 0xbc, 0xf1, 0xbb, 0x5f, 0xfc, 0x00, 0xca, 0xd1, 0xbd, 0xbf, 0x18, 0x0f, 0x63, 0x66, + 0x69, 0x25, 0xd3, 0xcc, 0x0b, 0x7c, 0x01, 0x62, 0xc6, 0xf5, 0x57, 0x4f, 0x26, 0x25, 0x23, 0xa4, + 0x46, 0x5e, 0x04, 0x5f, 0xc1, 0x80, 0x3b, 0x59, 0xd7, 0xce, 0x1b, 0x59, 0x05, 0xe2, 0xaf, 0x6f, + 0x2d, 0x37, 0x64, 0x7c, 0x91, 0xac, 0xe3, 0x3e, 0xb1, 0x48, 0x46, 0x48, 0x72, 0x91, 0x2b, 0x0e, + 0x55, 0x7f, 0x0b, 0xa6, 0x0e, 0x54, 0x39, 0x9d, 0x1e, 0x2b, 0xbf, 0x7a, 0xb5, 0x9f, 0xd7, 0xfe, + 0x1c, 0x16, 0xd2, 0xc7, 0x4f, 0x2d, 0x9e, 0x9c, 0x0a, 0x90, 0xde, 0xce, 0x09, 0x88, 0xca, 0x4b, + 0x73, 0x5f, 0xfa, 0x07, 0xe8, 0xce, 0x87, 0xc7, 0x67, 0xb2, 0xf0, 0xfc, 0x4c, 0x16, 0xfe, 0x38, + 0x93, 0x85, 0x6f, 0xcf, 0xe5, 0xc2, 0xf3, 0x73, 0xb9, 0xf0, 0xdb, 0xb9, 0x5c, 0x78, 0xb8, 0x66, + 0x5a, 0xee, 0x81, 0xd7, 0x55, 0x0d, 0x62, 0x6b, 0x36, 0xc1, 0xc8, 0xb1, 0x3c, 0xff, 0x47, 0xcf, + 0xeb, 0xa3, 0x0d, 0x4c, 0xba, 0x7d, 0xa4, 0x0d, 0x9b, 0x9a, 0x3b, 0x1a, 0x20, 0xda, 0x2d, 0x05, + 0x93, 0xd8, 0xbb, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xc9, 0xff, 0x68, 0xa5, 0xa0, 0x10, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1813,6 +1820,18 @@ func (m *MsgBurn) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PubKey != nil { + { + size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if len(m.Signature) > 0 { i -= len(m.Signature) copy(dAtA[i:], m.Signature) @@ -1974,6 +1993,18 @@ func (m *MsgRecover) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PubKey != nil { + { + size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if len(m.Signature) > 0 { i -= len(m.Signature) copy(dAtA[i:], m.Signature) @@ -2534,6 +2565,10 @@ func (m *MsgBurn) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } + if m.PubKey != nil { + l = m.PubKey.Size() + n += 1 + l + sovTx(uint64(l)) + } return n } @@ -2604,6 +2639,10 @@ func (m *MsgRecover) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } + if m.PubKey != nil { + l = m.PubKey.Size() + n += 1 + l + sovTx(uint64(l)) + } return n } @@ -3717,6 +3756,42 @@ func (m *MsgBurn) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PubKey", 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 + } + if m.PubKey == nil { + m.PubKey = &types.Any{} + } + if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) @@ -4209,6 +4284,42 @@ func (m *MsgRecover) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PubKey", 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 + } + if m.PubKey == nil { + m.PubKey = &types.Any{} + } + if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) diff --git a/utils/address.go b/utils/address.go index c23ae740..18abc343 100644 --- a/utils/address.go +++ b/utils/address.go @@ -21,15 +21,18 @@ import ( type Account struct { Address string + Invalid string Bytes []byte } func TestAccount() Account { bytes := secp256k1.GenPrivKey().PubKey().Address().Bytes() address, _ := sdk.Bech32ifyAddressBytes("noble", bytes) + invalid, _ := sdk.Bech32ifyAddressBytes("cosmos", bytes) return Account{ Address: address, + Invalid: invalid, Bytes: bytes, } } diff --git a/utils/mocks/account.go b/utils/mocks/account.go deleted file mode 100644 index 151bc525..00000000 --- a/utils/mocks/account.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2024 Monerium ehf. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mocks - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/monerium/module-noble/v2/types" -) - -var _ types.AccountKeeper = AccountKeeper{} - -type AccountKeeper struct { - Accounts map[string]sdk.AccountI -} - -func (k AccountKeeper) GetAccount(_ context.Context, addr sdk.AccAddress) sdk.AccountI { - // NOTE: The bech32 prefix is already set when mocking Florin. - return k.Accounts[addr.String()] -} diff --git a/utils/mocks/florin.go b/utils/mocks/florin.go index 2f96aa5b..cdc8020c 100644 --- a/utils/mocks/florin.go +++ b/utils/mocks/florin.go @@ -17,6 +17,7 @@ package mocks import ( storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/address" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/testutil" @@ -27,18 +28,18 @@ import ( ) func FlorinKeeper() (*keeper.Keeper, sdk.Context) { - return FlorinWithKeepers(AccountKeeper{}, BankKeeper{}) + return FlorinWithKeepers(BankKeeper{}) } -func FlorinWithKeepers(account types.AccountKeeper, bank BankKeeper) (*keeper.Keeper, sdk.Context) { +func FlorinWithKeepers(bank BankKeeper) (*keeper.Keeper, sdk.Context) { key := storetypes.NewKVStoreKey(types.ModuleName) tkey := storetypes.NewTransientStoreKey("transient_florin") reg := codectypes.NewInterfaceRegistry() types.RegisterInterfaces(reg) - _ = codec.NewProtoCodec(reg) + cdc := codec.NewProtoCodec(reg) - k := keeper.NewKeeper("authority", runtime.NewKVStoreService(key), account, bank) + k := keeper.NewKeeper("authority", runtime.NewKVStoreService(key), cdc, address.NewBech32Codec("noble"), bank) bank = bank.WithSendCoinsRestriction(k.SendRestrictionFn) k.SetBankKeeper(bank)