diff --git a/coupons/couponresp.pb.go b/coupons/couponresp.pb.go
index bceaf08046a6f7d4d00d64d6e646a0a6a6715bb4..1dc908f00d7bddac5cacf6631a47fbeabbccf581 100644
--- a/coupons/couponresp.pb.go
+++ b/coupons/couponresp.pb.go
@@ -1,224 +1,343 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.19.1
 // source: couponresp.proto
 
 package coupons
 
 import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
 type CMIXText struct {
-	Text                 string              `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
-	Reply                *TextReply          `protobuf:"bytes,2,opt,name=reply,proto3" json:"reply,omitempty"`
-	Preview              *TextNetworkPreview `protobuf:"bytes,3,opt,name=preview,proto3" json:"preview,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *CMIXText) Reset()         { *m = CMIXText{} }
-func (m *CMIXText) String() string { return proto.CompactTextString(m) }
-func (*CMIXText) ProtoMessage()    {}
-func (*CMIXText) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0df6afd1dcee6c11, []int{0}
+	Text    string              `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	Reply   *TextReply          `protobuf:"bytes,2,opt,name=reply,proto3" json:"reply,omitempty"`
+	Preview *TextNetworkPreview `protobuf:"bytes,3,opt,name=preview,proto3" json:"preview,omitempty"`
 }
 
-func (m *CMIXText) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CMIXText.Unmarshal(m, b)
-}
-func (m *CMIXText) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CMIXText.Marshal(b, m, deterministic)
-}
-func (m *CMIXText) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CMIXText.Merge(m, src)
+func (x *CMIXText) Reset() {
+	*x = CMIXText{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_couponresp_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *CMIXText) XXX_Size() int {
-	return xxx_messageInfo_CMIXText.Size(m)
+
+func (x *CMIXText) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *CMIXText) XXX_DiscardUnknown() {
-	xxx_messageInfo_CMIXText.DiscardUnknown(m)
+
+func (*CMIXText) ProtoMessage() {}
+
+func (x *CMIXText) ProtoReflect() protoreflect.Message {
+	mi := &file_couponresp_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_CMIXText proto.InternalMessageInfo
+// Deprecated: Use CMIXText.ProtoReflect.Descriptor instead.
+func (*CMIXText) Descriptor() ([]byte, []int) {
+	return file_couponresp_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *CMIXText) GetText() string {
-	if m != nil {
-		return m.Text
+func (x *CMIXText) GetText() string {
+	if x != nil {
+		return x.Text
 	}
 	return ""
 }
 
-func (m *CMIXText) GetReply() *TextReply {
-	if m != nil {
-		return m.Reply
+func (x *CMIXText) GetReply() *TextReply {
+	if x != nil {
+		return x.Reply
 	}
 	return nil
 }
 
-func (m *CMIXText) GetPreview() *TextNetworkPreview {
-	if m != nil {
-		return m.Preview
+func (x *CMIXText) GetPreview() *TextNetworkPreview {
+	if x != nil {
+		return x.Preview
 	}
 	return nil
 }
 
 type TextNetworkPreview struct {
-	Url                  string   `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
-	Title                string   `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
-	Image                []byte   `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *TextNetworkPreview) Reset()         { *m = TextNetworkPreview{} }
-func (m *TextNetworkPreview) String() string { return proto.CompactTextString(m) }
-func (*TextNetworkPreview) ProtoMessage()    {}
-func (*TextNetworkPreview) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0df6afd1dcee6c11, []int{1}
+	Url   string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
+	Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
+	Image []byte `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
 }
 
-func (m *TextNetworkPreview) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TextNetworkPreview.Unmarshal(m, b)
-}
-func (m *TextNetworkPreview) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TextNetworkPreview.Marshal(b, m, deterministic)
-}
-func (m *TextNetworkPreview) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TextNetworkPreview.Merge(m, src)
+func (x *TextNetworkPreview) Reset() {
+	*x = TextNetworkPreview{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_couponresp_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *TextNetworkPreview) XXX_Size() int {
-	return xxx_messageInfo_TextNetworkPreview.Size(m)
+
+func (x *TextNetworkPreview) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *TextNetworkPreview) XXX_DiscardUnknown() {
-	xxx_messageInfo_TextNetworkPreview.DiscardUnknown(m)
+
+func (*TextNetworkPreview) ProtoMessage() {}
+
+func (x *TextNetworkPreview) ProtoReflect() protoreflect.Message {
+	mi := &file_couponresp_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_TextNetworkPreview proto.InternalMessageInfo
+// Deprecated: Use TextNetworkPreview.ProtoReflect.Descriptor instead.
+func (*TextNetworkPreview) Descriptor() ([]byte, []int) {
+	return file_couponresp_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *TextNetworkPreview) GetUrl() string {
-	if m != nil {
-		return m.Url
+func (x *TextNetworkPreview) GetUrl() string {
+	if x != nil {
+		return x.Url
 	}
 	return ""
 }
 
-func (m *TextNetworkPreview) GetTitle() string {
-	if m != nil {
-		return m.Title
+func (x *TextNetworkPreview) GetTitle() string {
+	if x != nil {
+		return x.Title
 	}
 	return ""
 }
 
-func (m *TextNetworkPreview) GetImage() []byte {
-	if m != nil {
-		return m.Image
+func (x *TextNetworkPreview) GetImage() []byte {
+	if x != nil {
+		return x.Image
 	}
 	return nil
 }
 
 type TextReply struct {
-	Message              string              `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
-	SenderId             []byte              `protobuf:"bytes,2,opt,name=senderId,proto3" json:"senderId,omitempty"`
-	UniqueId             []byte              `protobuf:"bytes,3,opt,name=uniqueId,proto3" json:"uniqueId,omitempty"`
-	Preview              *TextNetworkPreview `protobuf:"bytes,4,opt,name=preview,proto3" json:"preview,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
-
-func (m *TextReply) Reset()         { *m = TextReply{} }
-func (m *TextReply) String() string { return proto.CompactTextString(m) }
-func (*TextReply) ProtoMessage()    {}
-func (*TextReply) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0df6afd1dcee6c11, []int{2}
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *TextReply) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TextReply.Unmarshal(m, b)
+	Message  string              `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+	SenderId []byte              `protobuf:"bytes,2,opt,name=senderId,proto3" json:"senderId,omitempty"`
+	UniqueId []byte              `protobuf:"bytes,3,opt,name=uniqueId,proto3" json:"uniqueId,omitempty"`
+	Preview  *TextNetworkPreview `protobuf:"bytes,4,opt,name=preview,proto3" json:"preview,omitempty"`
 }
-func (m *TextReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TextReply.Marshal(b, m, deterministic)
-}
-func (m *TextReply) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TextReply.Merge(m, src)
+
+func (x *TextReply) Reset() {
+	*x = TextReply{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_couponresp_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *TextReply) XXX_Size() int {
-	return xxx_messageInfo_TextReply.Size(m)
+
+func (x *TextReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *TextReply) XXX_DiscardUnknown() {
-	xxx_messageInfo_TextReply.DiscardUnknown(m)
+
+func (*TextReply) ProtoMessage() {}
+
+func (x *TextReply) ProtoReflect() protoreflect.Message {
+	mi := &file_couponresp_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_TextReply proto.InternalMessageInfo
+// Deprecated: Use TextReply.ProtoReflect.Descriptor instead.
+func (*TextReply) Descriptor() ([]byte, []int) {
+	return file_couponresp_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *TextReply) GetMessage() string {
-	if m != nil {
-		return m.Message
+func (x *TextReply) GetMessage() string {
+	if x != nil {
+		return x.Message
 	}
 	return ""
 }
 
-func (m *TextReply) GetSenderId() []byte {
-	if m != nil {
-		return m.SenderId
+func (x *TextReply) GetSenderId() []byte {
+	if x != nil {
+		return x.SenderId
 	}
 	return nil
 }
 
-func (m *TextReply) GetUniqueId() []byte {
-	if m != nil {
-		return m.UniqueId
+func (x *TextReply) GetUniqueId() []byte {
+	if x != nil {
+		return x.UniqueId
 	}
 	return nil
 }
 
-func (m *TextReply) GetPreview() *TextNetworkPreview {
-	if m != nil {
-		return m.Preview
+func (x *TextReply) GetPreview() *TextNetworkPreview {
+	if x != nil {
+		return x.Preview
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterType((*CMIXText)(nil), "coupons.CMIXText")
-	proto.RegisterType((*TextNetworkPreview)(nil), "coupons.TextNetworkPreview")
-	proto.RegisterType((*TextReply)(nil), "coupons.TextReply")
-}
-
-func init() {
-	proto.RegisterFile("couponresp.proto", fileDescriptor_0df6afd1dcee6c11)
-}
-
-var fileDescriptor_0df6afd1dcee6c11 = []byte{
-	// 246 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0xbf, 0x4e, 0xc3, 0x30,
-	0x10, 0xc6, 0xe5, 0xfe, 0x21, 0xcd, 0xd1, 0xa1, 0x3a, 0x31, 0x44, 0xb0, 0x54, 0x99, 0x32, 0x65,
-	0x00, 0xf1, 0x02, 0x30, 0x65, 0x00, 0x55, 0x27, 0x06, 0x56, 0x20, 0x27, 0x64, 0x91, 0xc6, 0xc6,
-	0x7f, 0x68, 0x99, 0x78, 0x09, 0x1e, 0x18, 0xd9, 0x4e, 0x23, 0x10, 0x4b, 0xb7, 0xfb, 0xee, 0x7e,
-	0xf7, 0xf9, 0x3b, 0xc3, 0xea, 0x45, 0x79, 0xad, 0x7a, 0xc3, 0x56, 0xd7, 0xda, 0x28, 0xa7, 0x30,
-	0x4b, 0x1d, 0x5b, 0x7e, 0xc1, 0xe2, 0xf6, 0xae, 0x79, 0x7c, 0xe0, 0xbd, 0x43, 0x84, 0x99, 0xe3,
-	0xbd, 0x2b, 0xc4, 0x5a, 0x54, 0x39, 0xc5, 0x1a, 0x2b, 0x98, 0x1b, 0xd6, 0xdd, 0x67, 0x31, 0x59,
-	0x8b, 0xea, 0xf4, 0x12, 0xeb, 0x61, 0xb1, 0x0e, 0x1b, 0x14, 0x26, 0x94, 0x00, 0xbc, 0x86, 0x4c,
-	0x1b, 0xfe, 0x90, 0xbc, 0x2b, 0xa6, 0x91, 0xbd, 0xf8, 0xc3, 0xde, 0xb3, 0xdb, 0x29, 0xf3, 0xb6,
-	0x49, 0x08, 0x1d, 0xd8, 0x92, 0x00, 0xff, 0x8f, 0x71, 0x05, 0x53, 0x6f, 0xba, 0x21, 0x49, 0x28,
-	0xf1, 0x0c, 0xe6, 0x4e, 0xba, 0x8e, 0x63, 0x90, 0x9c, 0x92, 0x08, 0x5d, 0xb9, 0x7d, 0x7a, 0xe5,
-	0xf8, 0xe4, 0x92, 0x92, 0x28, 0xbf, 0x05, 0xe4, 0x63, 0x3e, 0x2c, 0x20, 0xdb, 0xb2, 0xb5, 0x81,
-	0x4a, 0x7e, 0x07, 0x89, 0xe7, 0xb0, 0xb0, 0xdc, 0xb7, 0x6c, 0x9a, 0x36, 0xda, 0x2e, 0x69, 0xd4,
-	0x61, 0xe6, 0x7b, 0xf9, 0xee, 0xb9, 0x69, 0x07, 0xf3, 0x51, 0xff, 0x3e, 0x75, 0x76, 0xfc, 0xa9,
-	0x37, 0x93, 0x8d, 0x78, 0x3e, 0x89, 0xff, 0x7f, 0xf5, 0x13, 0x00, 0x00, 0xff, 0xff, 0xf3, 0xac,
-	0x09, 0x0f, 0x93, 0x01, 0x00, 0x00,
+var File_couponresp_proto protoreflect.FileDescriptor
+
+var file_couponresp_proto_rawDesc = []byte{
+	0x0a, 0x10, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x22, 0x7f, 0x0a, 0x08, 0x43,
+	0x4d, 0x49, 0x58, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x28, 0x0a, 0x05, 0x72,
+	0x65, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x75,
+	0x70, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x05,
+	0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x35, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73,
+	0x2e, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x65, 0x76,
+	0x69, 0x65, 0x77, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x52, 0x0a, 0x12,
+	0x54, 0x65, 0x78, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x65, 0x76, 0x69,
+	0x65, 0x77, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x03, 0x75, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d,
+	0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65,
+	0x22, 0x94, 0x01, 0x0a, 0x09, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18,
+	0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6e, 0x64,
+	0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64,
+	0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64,
+	0x12, 0x35, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74,
+	0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x07,
+	0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x42, 0x29, 0x50, 0x01, 0x5a, 0x25, 0x67, 0x69, 0x74,
+	0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6c, 0x69, 0x78, 0x78, 0x69, 0x72, 0x2f,
+	0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x2f, 0x63, 0x6f, 0x75, 0x70, 0x6f,
+	0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_couponresp_proto_rawDescOnce sync.Once
+	file_couponresp_proto_rawDescData = file_couponresp_proto_rawDesc
+)
+
+func file_couponresp_proto_rawDescGZIP() []byte {
+	file_couponresp_proto_rawDescOnce.Do(func() {
+		file_couponresp_proto_rawDescData = protoimpl.X.CompressGZIP(file_couponresp_proto_rawDescData)
+	})
+	return file_couponresp_proto_rawDescData
+}
+
+var file_couponresp_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_couponresp_proto_goTypes = []interface{}{
+	(*CMIXText)(nil),           // 0: coupons.CMIXText
+	(*TextNetworkPreview)(nil), // 1: coupons.TextNetworkPreview
+	(*TextReply)(nil),          // 2: coupons.TextReply
+}
+var file_couponresp_proto_depIdxs = []int32{
+	2, // 0: coupons.CMIXText.reply:type_name -> coupons.TextReply
+	1, // 1: coupons.CMIXText.preview:type_name -> coupons.TextNetworkPreview
+	1, // 2: coupons.TextReply.preview:type_name -> coupons.TextNetworkPreview
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_couponresp_proto_init() }
+func file_couponresp_proto_init() {
+	if File_couponresp_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_couponresp_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CMIXText); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_couponresp_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TextNetworkPreview); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_couponresp_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TextReply); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_couponresp_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_couponresp_proto_goTypes,
+		DependencyIndexes: file_couponresp_proto_depIdxs,
+		MessageInfos:      file_couponresp_proto_msgTypes,
+	}.Build()
+	File_couponresp_proto = out.File
+	file_couponresp_proto_rawDesc = nil
+	file_couponresp_proto_goTypes = nil
+	file_couponresp_proto_depIdxs = nil
 }
diff --git a/coupons/couponresp.proto b/coupons/couponresp.proto
index 5437690084a5a310c02fc6ccdea105eb7a17b094..90d5ef099147d16cdda948c1677bb40be6cf1b63 100644
--- a/coupons/couponresp.proto
+++ b/coupons/couponresp.proto
@@ -1,4 +1,5 @@
 syntax = "proto3";
+option go_package = "gitlab.com/elixxir/coupon-bot/coupons";
 
 package coupons;
 
diff --git a/coupons/listener.go b/coupons/listener.go
index c710ec53fabb1f01f6e80f9dee768557b258af65..bcb932aa1fdde3df80134d29715ccaa616ee04e0 100644
--- a/coupons/listener.go
+++ b/coupons/listener.go
@@ -2,11 +2,11 @@ package coupons
 
 import (
 	"git.xx.network/elixxir/coupons/storage"
-	"github.com/golang/protobuf/proto"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/api"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/interfaces/params"
+	"google.golang.org/protobuf/proto"
 )
 
 type listener struct {
diff --git a/go.mod b/go.mod
index fe20eaeffc70b71d726816e6f00ffeb38e7397ee..8b08c54629d12feec5d9c575bd91f252235c2721 100644
--- a/go.mod
+++ b/go.mod
@@ -1,18 +1,66 @@
 module git.xx.network/elixxir/coupons
 
-go 1.16
+go 1.17
 
 require (
-	github.com/golang/protobuf v1.5.2
 	github.com/pkg/errors v0.9.1
 	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
 	github.com/spf13/cobra v1.2.1
 	github.com/spf13/jwalterweatherman v1.1.0
 	github.com/spf13/viper v1.9.0
-	gitlab.com/elixxir/client v1.5.1-0.20211108203412-047b81be6c67
-	gitlab.com/elixxir/crypto v0.0.7-0.20211022013957-3a7899285c4c
-	gitlab.com/elixxir/primitives v0.0.3-0.20211014164029-06022665b576
-	gitlab.com/xx_network/primitives v0.0.4-0.20211014163031-53405cf191fb
+	gitlab.com/elixxir/client v1.5.1-0.20220209211742-f4e17c72fafb
+	gitlab.com/elixxir/crypto v0.0.7-0.20220210173208-c88f852c79ca
+	gitlab.com/elixxir/primitives v0.0.3-0.20220209225643-ae03845af237
+	gitlab.com/xx_network/primitives v0.0.4-0.20220209215928-ebad9b1d4f04
+	google.golang.org/protobuf v1.27.1
 	gorm.io/driver/postgres v1.1.2
 	gorm.io/gorm v1.21.15
 )
+
+require (
+	github.com/badoux/checkmail v1.2.1 // indirect
+	github.com/cloudflare/circl v1.0.1-0.20211008185751-59b49bc148ce // indirect
+	github.com/elliotchance/orderedmap v1.4.0 // indirect
+	github.com/fsnotify/fsnotify v1.5.1 // indirect
+	github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 // indirect
+	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/inconshreveable/mousetrap v1.0.0 // indirect
+	github.com/jackc/chunkreader/v2 v2.0.1 // indirect
+	github.com/jackc/pgconn v1.10.0 // indirect
+	github.com/jackc/pgio v1.0.0 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgproto3/v2 v2.1.1 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
+	github.com/jackc/pgtype v1.8.1 // indirect
+	github.com/jackc/pgx/v4 v4.13.0 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.2 // indirect
+	github.com/magiconair/properties v1.8.5 // indirect
+	github.com/mitchellh/go-homedir v1.1.0 // indirect
+	github.com/mitchellh/mapstructure v1.4.2 // indirect
+	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
+	github.com/pelletier/go-toml v1.9.4 // indirect
+	github.com/spf13/afero v1.6.0 // indirect
+	github.com/spf13/cast v1.4.1 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	github.com/subosito/gotenv v1.2.0 // indirect
+	github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 // indirect
+	github.com/ttacon/libphonenumber v1.2.1 // indirect
+	github.com/tyler-smith/go-bip39 v1.1.0 // indirect
+	github.com/zeebo/blake3 v0.1.1 // indirect
+	gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f // indirect
+	gitlab.com/elixxir/comms v0.0.4-0.20220128193157-34178165415d // indirect
+	gitlab.com/elixxir/ekv v0.1.6 // indirect
+	gitlab.com/xx_network/comms v0.0.4-0.20220209231201-23683af01e4c // indirect
+	gitlab.com/xx_network/crypto v0.0.5-0.20220209220237-f1e27faab497 // indirect
+	gitlab.com/xx_network/ring v0.0.3-0.20210527191221-ce3f170aabd5 // indirect
+	golang.org/x/crypto v0.0.0-20220209195652-db638375bc3a // indirect
+	golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
+	golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect
+	golang.org/x/text v0.3.7 // indirect
+	google.golang.org/genproto v0.0.0-20220208230804-65c12eb4c068 // indirect
+	google.golang.org/grpc v1.44.0 // indirect
+	gopkg.in/ini.v1 v1.63.2 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+)
diff --git a/go.sum b/go.sum
index 94f82c9bbce1dfbadd5e0dab2960198322b01e56..93719169f172bb2978631ffbcecd12a3148abe40 100644
--- a/go.sum
+++ b/go.sum
@@ -62,16 +62,24 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
 github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
+github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/circl v1.0.1-0.20211008185751-59b49bc148ce h1:2s+cfEmFVdtV8Z85o6U0QxtNhCXDCMR2OLZKgL39ApI=
+github.com/cloudflare/circl v1.0.1-0.20211008185751-59b49bc148ce/go.mod h1:tnEeRn/onb0b4Ew40H00boTlcVMHveaTzi6m+/iMruw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
 github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
 github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
@@ -89,6 +97,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/elliotchance/orderedmap v1.4.0 h1:wZtfeEONCbx6in1CZyE6bELEt/vFayMvsxqI5SgsR+A=
+github.com/elliotchance/orderedmap v1.4.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -96,6 +106,7 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
@@ -351,6 +362,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
+github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
@@ -460,34 +473,57 @@ github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l
 github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 h1:Gi6rj4mAlK0BJIk1HIzBVMjWNjIUfstrsXC2VqLYPcA=
 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k=
+gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f h1:yXGvNBqzZwAhDYlSnxPRbgor6JWoOt1Z7s3z1O9JR40=
+gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k=
 gitlab.com/elixxir/client v1.5.1-0.20211108203412-047b81be6c67 h1:0eR95gzo2L5fJlWkRmasXmGb9155/Pr26GAoFEUzQI0=
 gitlab.com/elixxir/client v1.5.1-0.20211108203412-047b81be6c67/go.mod h1:YYGrpEby2kGV26hzfRciqyOvTSZBtMiGi8QLg4jMymo=
+gitlab.com/elixxir/client v1.5.1-0.20220209211742-f4e17c72fafb h1:nqIOaEp2h4qOzVQESTE3Di0lJGJPDoZaWSmW0Flf91U=
+gitlab.com/elixxir/client v1.5.1-0.20220209211742-f4e17c72fafb/go.mod h1:/sx5AN1SHkMv/xGFcE71MVl6cTsURYpDrYAhLgnpxgE=
 gitlab.com/elixxir/comms v0.0.4-0.20211029171408-dcd58978e446 h1:wmrdEN8H+nCLkZ09S41OyYI/Nj/9Gg6ra6p8iuJ6pjg=
 gitlab.com/elixxir/comms v0.0.4-0.20211029171408-dcd58978e446/go.mod h1:rQpTeFVSn08ocbQeEw5AbMhGWXHfXmQ0y1/ZprAIVVU=
+gitlab.com/elixxir/comms v0.0.4-0.20220128193157-34178165415d h1:207Okb8+amKnRzsKE/4ehl3eb6ZHkWXevq9TimOehzw=
+gitlab.com/elixxir/comms v0.0.4-0.20220128193157-34178165415d/go.mod h1:pj1TXrpHKytF68y53BtCBRYhaiMJWquuVBk4iEN7wkk=
 gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c=
 gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
 gitlab.com/elixxir/crypto v0.0.7-0.20211022013957-3a7899285c4c h1:HIr2HBhZqSAKdPRBdEY0/qravISL619O2yuTY/DQTdo=
 gitlab.com/elixxir/crypto v0.0.7-0.20211022013957-3a7899285c4c/go.mod h1:teuTEXyqsqo4N/J1sshcTg9xYOt+wNTurop7pkZOiCg=
+gitlab.com/elixxir/crypto v0.0.7-0.20220110170041-7e42f2e8b062/go.mod h1:qmW0OGPB21GcaGg1Jvt527/qUw7ke6W8DKCiYBfsx48=
+gitlab.com/elixxir/crypto v0.0.7-0.20220210173208-c88f852c79ca h1:joa8y5yLZqtqJdy33sgj96q0tl8fK1YGZgl2Boz7FVg=
+gitlab.com/elixxir/crypto v0.0.7-0.20220210173208-c88f852c79ca/go.mod h1:q+nNdd3S652c2OVUVa8fbz+pbc24dBazugigc88qdsg=
 gitlab.com/elixxir/ekv v0.1.5 h1:R8M1PA5zRU1HVnTyrtwybdABh7gUJSCvt1JZwUSeTzk=
 gitlab.com/elixxir/ekv v0.1.5/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
+gitlab.com/elixxir/ekv v0.1.6 h1:M2hUSNhH/ChxDd+s8xBqSEKgoPtmE6hOEBqQ73KbN6A=
+gitlab.com/elixxir/ekv v0.1.6/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
 gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg=
 gitlab.com/elixxir/primitives v0.0.0-20200804170709-a1896d262cd9/go.mod h1:p0VelQda72OzoUckr1O+vPW0AiFe0nyKQ6gYcmFSuF8=
 gitlab.com/elixxir/primitives v0.0.0-20200804182913-788f47bded40/go.mod h1:tzdFFvb1ESmuTCOl1z6+yf6oAICDxH2NPUemVgoNLxc=
 gitlab.com/elixxir/primitives v0.0.1/go.mod h1:kNp47yPqja2lHSiS4DddTvFpB/4D9dB2YKnw5c+LJCE=
 gitlab.com/elixxir/primitives v0.0.3-0.20211014164029-06022665b576 h1:sXX3/hewV4TQLxT2iKBfnfgW/A1eXoEfv5raJxTb79s=
 gitlab.com/elixxir/primitives v0.0.3-0.20211014164029-06022665b576/go.mod h1:zZy8AlOISFm5IG4G4sylypnz7xNBfZ5mpXiibqJT8+8=
+gitlab.com/elixxir/primitives v0.0.3-0.20220104173924-275cb9d7834f/go.mod h1:zA+1Lp9fGPo6pl1QxtMoNPLeZJ1O5m4kcH7HNxePQnQ=
+gitlab.com/elixxir/primitives v0.0.3-0.20220209225643-ae03845af237 h1:Ok1Eyje4sdTd0ffMHwL8z7pu/lfLBm3C6gw+AsZwCVA=
+gitlab.com/elixxir/primitives v0.0.3-0.20220209225643-ae03845af237/go.mod h1:BGKbQL4Iox2D+CHdknZTC46snQfTrOqP+EpCDQ3/GIA=
 gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw=
 gitlab.com/xx_network/comms v0.0.4-0.20211014163953-e774276b83ae h1:jmZWmSm8eH40SX5B5uOw2XaYoHYqVn8daTfa6B80AOs=
 gitlab.com/xx_network/comms v0.0.4-0.20211014163953-e774276b83ae/go.mod h1:wR9Vx0KZLrIs0g2Efcp0UwFPStjcDRWkg/DJLVQI2vw=
+gitlab.com/xx_network/comms v0.0.4-0.20220126231737-fe2338016cce/go.mod h1:5arueRMa2MNa6dALnfJwyZOhqhV53Gqc+tlHRz+Ycjw=
+gitlab.com/xx_network/comms v0.0.4-0.20220209231201-23683af01e4c h1:+jLHiRdZyGLhMvqpKUdoPeVvQzp15EDO8lsX633iHtQ=
+gitlab.com/xx_network/comms v0.0.4-0.20220209231201-23683af01e4c/go.mod h1:HZZkTaE64MHI2O2muxzjxjhWK7tCsE2RJhC0WgdZcCw=
 gitlab.com/xx_network/crypto v0.0.3/go.mod h1:DF2HYvvCw9wkBybXcXAgQMzX+MiGbFPjwt3t17VRqRE=
 gitlab.com/xx_network/crypto v0.0.4/go.mod h1:+lcQEy+Th4eswFgQDwT0EXKp4AXrlubxalwQFH5O0Mk=
 gitlab.com/xx_network/crypto v0.0.5-0.20211014163843-57b345890686 h1:mEjKISxi9LrguYgz6evroFwsfxH78/hYmr32yws+WV0=
 gitlab.com/xx_network/crypto v0.0.5-0.20211014163843-57b345890686/go.mod h1:GeUUB5eMlu7G1u7LXpClfOyUYsSDxAhiZBf+RZeGftc=
+gitlab.com/xx_network/crypto v0.0.5-0.20211227194420-f311e8920467/go.mod h1:c+x0w3Xk6QZe5w2Redn5SiaBpqAhgNSfwBr0JGa/yyo=
+gitlab.com/xx_network/crypto v0.0.5-0.20220209220237-f1e27faab497 h1:Bi4WmC1zEJ6FPPCV/gFywj+UOGxcG7Y8ghpW7J0nR40=
+gitlab.com/xx_network/crypto v0.0.5-0.20220209220237-f1e27faab497/go.mod h1:5AlR+1c8/h7M3slCgPLW3lEeEdkbBb3zgB3wbs/vnhM=
 gitlab.com/xx_network/primitives v0.0.0-20200803231956-9b192c57ea7c/go.mod h1:wtdCMr7DPePz9qwctNoAUzZtbOSHSedcK++3Df3psjA=
 gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da/go.mod h1:OK9xevzWCaPO7b1wiluVJGk7R5ZsuC7pHY5hteZFQug=
 gitlab.com/xx_network/primitives v0.0.2/go.mod h1:cs0QlFpdMDI6lAo61lDRH2JZz+3aVkHy+QogOB6F/qc=
 gitlab.com/xx_network/primitives v0.0.4-0.20211014163031-53405cf191fb h1:0K9dyxFpDYzH9jYLwzg3+bRj9a0uJjwjQkMeIdTxduQ=
 gitlab.com/xx_network/primitives v0.0.4-0.20211014163031-53405cf191fb/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
+gitlab.com/xx_network/primitives v0.0.4-0.20211222205802-03e9d7d835b0/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
+gitlab.com/xx_network/primitives v0.0.4-0.20220209215928-ebad9b1d4f04 h1:yv++r3+1W2GmLarXtZY+xxtn2yzplc/+furnWLSKBBA=
+gitlab.com/xx_network/primitives v0.0.4-0.20220209215928-ebad9b1d4f04/go.mod h1:qqZ9b4fmqXsbMnPBHA+KYm2Mvf8WQPV/nl4Ir+g0Y5s=
 gitlab.com/xx_network/ring v0.0.3-0.20210527191221-ce3f170aabd5 h1:FY+4Rh1Q2rgLyv10aKJjhWApuKRCR/054XhreudfAvw=
 gitlab.com/xx_network/ring v0.0.3-0.20210527191221-ce3f170aabd5/go.mod h1:aLzpP2TiZTQut/PVHR40EJAomzugDdHXetbieRClXIM=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
@@ -537,6 +573,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y
 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220209195652-db638375bc3a h1:atOEWVSedO4ksXBe/UrlbSLVxQQ9RxM/tT2Jy10IaHo=
+golang.org/x/crypto v0.0.0-20220209195652-db638375bc3a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -615,6 +653,9 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -709,6 +750,9 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k=
 golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c=
+golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -882,6 +926,8 @@ google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwy
 google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 h1:z+ErRPu0+KS02Td3fOAgdX+lnPDh/VyaABEJPD4JRQs=
 google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20220208230804-65c12eb4c068 h1:pwzFiZfBTH/GjBWz1BcDwMBaHBo8mZvpLa7eBKJpFAk=
+google.golang.org/genproto v0.0.0-20220208230804-65c12eb4c068/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -908,6 +954,8 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD
 google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
 google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
 google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=
+google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=