Setup integration tests and CI #11
							
								
								
									
										19
									
								
								.gitea/workflows/test-integration.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								.gitea/workflows/test-integration.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | name: Integration Tests | ||||||
|  | on: | ||||||
|  |   pull_request: | ||||||
|  |   push: | ||||||
|  |     branches: | ||||||
|  |       - main | ||||||
|  | 
 | ||||||
|  | jobs: | ||||||
|  |   test-integration: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/setup-go@v3 | ||||||
|  |         with: | ||||||
|  |           go-version: 1.21 | ||||||
|  |           check-latest: true | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |       - name: Test | ||||||
|  |         run: | | ||||||
|  |           make test-integration | ||||||
							
								
								
									
										7
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								Makefile
									
									
									
									
									
								
							| @ -81,3 +81,10 @@ lint-fix: | |||||||
| 	@$(golangci_lint_cmd) run ./... --fix --timeout 15m | 	@$(golangci_lint_cmd) run ./... --fix --timeout 15m | ||||||
| 
 | 
 | ||||||
| .PHONY: lint lint-fix | .PHONY: lint lint-fix | ||||||
|  | 
 | ||||||
|  | #################
 | ||||||
|  | ###  Tests  ###
 | ||||||
|  | #################
 | ||||||
|  | 
 | ||||||
|  | test-integration: | ||||||
|  | 	$(MAKE) -C tests test-integration | ||||||
|  | |||||||
| @ -12,3 +12,9 @@ Install and run `laconic2d`: | |||||||
|   # start the chain |   # start the chain | ||||||
|   laconic2d start |   laconic2d start | ||||||
|   ``` |   ``` | ||||||
|  | 
 | ||||||
|  | Run tests: | ||||||
|  | 
 | ||||||
|  |   ```bash | ||||||
|  |   make test-integration | ||||||
|  |   ``` | ||||||
|  | |||||||
| @ -6130,6 +6130,486 @@ func (x *fastReflection_ExpiryQueue) ProtoMethods() *protoiface.Methods { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | var _ protoreflect.List = (*_RecordsList_1_list)(nil) | ||||||
|  | 
 | ||||||
|  | type _RecordsList_1_list struct { | ||||||
|  | 	list *[]string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *_RecordsList_1_list) Len() int { | ||||||
|  | 	if x.list == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return len(*x.list) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *_RecordsList_1_list) Get(i int) protoreflect.Value { | ||||||
|  | 	return protoreflect.ValueOfString((*x.list)[i]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *_RecordsList_1_list) Set(i int, value protoreflect.Value) { | ||||||
|  | 	valueUnwrapped := value.String() | ||||||
|  | 	concreteValue := valueUnwrapped | ||||||
|  | 	(*x.list)[i] = concreteValue | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *_RecordsList_1_list) Append(value protoreflect.Value) { | ||||||
|  | 	valueUnwrapped := value.String() | ||||||
|  | 	concreteValue := valueUnwrapped | ||||||
|  | 	*x.list = append(*x.list, concreteValue) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *_RecordsList_1_list) AppendMutable() protoreflect.Value { | ||||||
|  | 	panic(fmt.Errorf("AppendMutable can not be called on message RecordsList at list field Value as it is not of Message kind")) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *_RecordsList_1_list) Truncate(n int) { | ||||||
|  | 	*x.list = (*x.list)[:n] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *_RecordsList_1_list) NewElement() protoreflect.Value { | ||||||
|  | 	v := "" | ||||||
|  | 	return protoreflect.ValueOfString(v) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *_RecordsList_1_list) IsValid() bool { | ||||||
|  | 	return x.list != nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	md_RecordsList       protoreflect.MessageDescriptor | ||||||
|  | 	fd_RecordsList_value protoreflect.FieldDescriptor | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	file_cerc_registry_v1_registry_proto_init() | ||||||
|  | 	md_RecordsList = File_cerc_registry_v1_registry_proto.Messages().ByName("RecordsList") | ||||||
|  | 	fd_RecordsList_value = md_RecordsList.Fields().ByName("value") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var _ protoreflect.Message = (*fastReflection_RecordsList)(nil) | ||||||
|  | 
 | ||||||
|  | type fastReflection_RecordsList RecordsList | ||||||
|  | 
 | ||||||
|  | func (x *RecordsList) ProtoReflect() protoreflect.Message { | ||||||
|  | 	return (*fastReflection_RecordsList)(x) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *RecordsList) slowProtoReflect() protoreflect.Message { | ||||||
|  | 	mi := &file_cerc_registry_v1_registry_proto_msgTypes[9] | ||||||
|  | 	if protoimpl.UnsafeEnabled && x != nil { | ||||||
|  | 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||||
|  | 		if ms.LoadMessageInfo() == nil { | ||||||
|  | 			ms.StoreMessageInfo(mi) | ||||||
|  | 		} | ||||||
|  | 		return ms | ||||||
|  | 	} | ||||||
|  | 	return mi.MessageOf(x) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var _fastReflection_RecordsList_messageType fastReflection_RecordsList_messageType | ||||||
|  | var _ protoreflect.MessageType = fastReflection_RecordsList_messageType{} | ||||||
|  | 
 | ||||||
|  | type fastReflection_RecordsList_messageType struct{} | ||||||
|  | 
 | ||||||
|  | func (x fastReflection_RecordsList_messageType) Zero() protoreflect.Message { | ||||||
|  | 	return (*fastReflection_RecordsList)(nil) | ||||||
|  | } | ||||||
|  | func (x fastReflection_RecordsList_messageType) New() protoreflect.Message { | ||||||
|  | 	return new(fastReflection_RecordsList) | ||||||
|  | } | ||||||
|  | func (x fastReflection_RecordsList_messageType) Descriptor() protoreflect.MessageDescriptor { | ||||||
|  | 	return md_RecordsList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Descriptor returns message descriptor, which contains only the protobuf
 | ||||||
|  | // type information for the message.
 | ||||||
|  | func (x *fastReflection_RecordsList) Descriptor() protoreflect.MessageDescriptor { | ||||||
|  | 	return md_RecordsList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Type returns the message type, which encapsulates both Go and protobuf
 | ||||||
|  | // type information. If the Go type information is not needed,
 | ||||||
|  | // it is recommended that the message descriptor be used instead.
 | ||||||
|  | func (x *fastReflection_RecordsList) Type() protoreflect.MessageType { | ||||||
|  | 	return _fastReflection_RecordsList_messageType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New returns a newly allocated and mutable empty message.
 | ||||||
|  | func (x *fastReflection_RecordsList) New() protoreflect.Message { | ||||||
|  | 	return new(fastReflection_RecordsList) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Interface unwraps the message reflection interface and
 | ||||||
|  | // returns the underlying ProtoMessage interface.
 | ||||||
|  | func (x *fastReflection_RecordsList) Interface() protoreflect.ProtoMessage { | ||||||
|  | 	return (*RecordsList)(x) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Range iterates over every populated field in an undefined order,
 | ||||||
|  | // calling f for each field descriptor and value encountered.
 | ||||||
|  | // Range returns immediately if f returns false.
 | ||||||
|  | // While iterating, mutating operations may only be performed
 | ||||||
|  | // on the current field descriptor.
 | ||||||
|  | func (x *fastReflection_RecordsList) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { | ||||||
|  | 	if len(x.Value) != 0 { | ||||||
|  | 		value := protoreflect.ValueOfList(&_RecordsList_1_list{list: &x.Value}) | ||||||
|  | 		if !f(fd_RecordsList_value, value) { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Has reports whether a field is populated.
 | ||||||
|  | //
 | ||||||
|  | // Some fields have the property of nullability where it is possible to
 | ||||||
|  | // distinguish between the default value of a field and whether the field
 | ||||||
|  | // was explicitly populated with the default value. Singular message fields,
 | ||||||
|  | // member fields of a oneof, and proto2 scalar fields are nullable. Such
 | ||||||
|  | // fields are populated only if explicitly set.
 | ||||||
|  | //
 | ||||||
|  | // In other cases (aside from the nullable cases above),
 | ||||||
|  | // a proto3 scalar field is populated if it contains a non-zero value, and
 | ||||||
|  | // a repeated field is populated if it is non-empty.
 | ||||||
|  | func (x *fastReflection_RecordsList) Has(fd protoreflect.FieldDescriptor) bool { | ||||||
|  | 	switch fd.FullName() { | ||||||
|  | 	case "cerc.registry.v1.RecordsList.value": | ||||||
|  | 		return len(x.Value) != 0 | ||||||
|  | 	default: | ||||||
|  | 		if fd.IsExtension() { | ||||||
|  | 			panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList")) | ||||||
|  | 		} | ||||||
|  | 		panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName())) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Clear clears the field such that a subsequent Has call reports false.
 | ||||||
|  | //
 | ||||||
|  | // Clearing an extension field clears both the extension type and value
 | ||||||
|  | // associated with the given field number.
 | ||||||
|  | //
 | ||||||
|  | // Clear is a mutating operation and unsafe for concurrent use.
 | ||||||
|  | func (x *fastReflection_RecordsList) Clear(fd protoreflect.FieldDescriptor) { | ||||||
|  | 	switch fd.FullName() { | ||||||
|  | 	case "cerc.registry.v1.RecordsList.value": | ||||||
|  | 		x.Value = nil | ||||||
|  | 	default: | ||||||
|  | 		if fd.IsExtension() { | ||||||
|  | 			panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList")) | ||||||
|  | 		} | ||||||
|  | 		panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName())) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Get retrieves the value for a field.
 | ||||||
|  | //
 | ||||||
|  | // For unpopulated scalars, it returns the default value, where
 | ||||||
|  | // the default value of a bytes scalar is guaranteed to be a copy.
 | ||||||
|  | // For unpopulated composite types, it returns an empty, read-only view
 | ||||||
|  | // of the value; to obtain a mutable reference, use Mutable.
 | ||||||
|  | func (x *fastReflection_RecordsList) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { | ||||||
|  | 	switch descriptor.FullName() { | ||||||
|  | 	case "cerc.registry.v1.RecordsList.value": | ||||||
|  | 		if len(x.Value) == 0 { | ||||||
|  | 			return protoreflect.ValueOfList(&_RecordsList_1_list{}) | ||||||
|  | 		} | ||||||
|  | 		listValue := &_RecordsList_1_list{list: &x.Value} | ||||||
|  | 		return protoreflect.ValueOfList(listValue) | ||||||
|  | 	default: | ||||||
|  | 		if descriptor.IsExtension() { | ||||||
|  | 			panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList")) | ||||||
|  | 		} | ||||||
|  | 		panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", descriptor.FullName())) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Set stores the value for a field.
 | ||||||
|  | //
 | ||||||
|  | // For a field belonging to a oneof, it implicitly clears any other field
 | ||||||
|  | // that may be currently set within the same oneof.
 | ||||||
|  | // For extension fields, it implicitly stores the provided ExtensionType.
 | ||||||
|  | // When setting a composite type, it is unspecified whether the stored value
 | ||||||
|  | // aliases the source's memory in any way. If the composite value is an
 | ||||||
|  | // empty, read-only value, then it panics.
 | ||||||
|  | //
 | ||||||
|  | // Set is a mutating operation and unsafe for concurrent use.
 | ||||||
|  | func (x *fastReflection_RecordsList) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { | ||||||
|  | 	switch fd.FullName() { | ||||||
|  | 	case "cerc.registry.v1.RecordsList.value": | ||||||
|  | 		lv := value.List() | ||||||
|  | 		clv := lv.(*_RecordsList_1_list) | ||||||
|  | 		x.Value = *clv.list | ||||||
|  | 	default: | ||||||
|  | 		if fd.IsExtension() { | ||||||
|  | 			panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList")) | ||||||
|  | 		} | ||||||
|  | 		panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName())) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Mutable returns a mutable reference to a composite type.
 | ||||||
|  | //
 | ||||||
|  | // If the field is unpopulated, it may allocate a composite value.
 | ||||||
|  | // For a field belonging to a oneof, it implicitly clears any other field
 | ||||||
|  | // that may be currently set within the same oneof.
 | ||||||
|  | // For extension fields, it implicitly stores the provided ExtensionType
 | ||||||
|  | // if not already stored.
 | ||||||
|  | // It panics if the field does not contain a composite type.
 | ||||||
|  | //
 | ||||||
|  | // Mutable is a mutating operation and unsafe for concurrent use.
 | ||||||
|  | func (x *fastReflection_RecordsList) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||||
|  | 	switch fd.FullName() { | ||||||
|  | 	case "cerc.registry.v1.RecordsList.value": | ||||||
|  | 		if x.Value == nil { | ||||||
|  | 			x.Value = []string{} | ||||||
|  | 		} | ||||||
|  | 		value := &_RecordsList_1_list{list: &x.Value} | ||||||
|  | 		return protoreflect.ValueOfList(value) | ||||||
|  | 	default: | ||||||
|  | 		if fd.IsExtension() { | ||||||
|  | 			panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList")) | ||||||
|  | 		} | ||||||
|  | 		panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName())) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewField returns a new value that is assignable to the field
 | ||||||
|  | // for the given descriptor. For scalars, this returns the default value.
 | ||||||
|  | // For lists, maps, and messages, this returns a new, empty, mutable value.
 | ||||||
|  | func (x *fastReflection_RecordsList) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||||
|  | 	switch fd.FullName() { | ||||||
|  | 	case "cerc.registry.v1.RecordsList.value": | ||||||
|  | 		list := []string{} | ||||||
|  | 		return protoreflect.ValueOfList(&_RecordsList_1_list{list: &list}) | ||||||
|  | 	default: | ||||||
|  | 		if fd.IsExtension() { | ||||||
|  | 			panic(fmt.Errorf("proto3 declared messages do not support extensions: cerc.registry.v1.RecordsList")) | ||||||
|  | 		} | ||||||
|  | 		panic(fmt.Errorf("message cerc.registry.v1.RecordsList does not contain field %s", fd.FullName())) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WhichOneof reports which field within the oneof is populated,
 | ||||||
|  | // returning nil if none are populated.
 | ||||||
|  | // It panics if the oneof descriptor does not belong to this message.
 | ||||||
|  | func (x *fastReflection_RecordsList) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { | ||||||
|  | 	switch d.FullName() { | ||||||
|  | 	default: | ||||||
|  | 		panic(fmt.Errorf("%s is not a oneof field in cerc.registry.v1.RecordsList", d.FullName())) | ||||||
|  | 	} | ||||||
|  | 	panic("unreachable") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetUnknown retrieves the entire list of unknown fields.
 | ||||||
|  | // The caller may only mutate the contents of the RawFields
 | ||||||
|  | // if the mutated bytes are stored back into the message with SetUnknown.
 | ||||||
|  | func (x *fastReflection_RecordsList) GetUnknown() protoreflect.RawFields { | ||||||
|  | 	return x.unknownFields | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetUnknown stores an entire list of unknown fields.
 | ||||||
|  | // The raw fields must be syntactically valid according to the wire format.
 | ||||||
|  | // An implementation may panic if this is not the case.
 | ||||||
|  | // Once stored, the caller must not mutate the content of the RawFields.
 | ||||||
|  | // An empty RawFields may be passed to clear the fields.
 | ||||||
|  | //
 | ||||||
|  | // SetUnknown is a mutating operation and unsafe for concurrent use.
 | ||||||
|  | func (x *fastReflection_RecordsList) SetUnknown(fields protoreflect.RawFields) { | ||||||
|  | 	x.unknownFields = fields | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsValid reports whether the message is valid.
 | ||||||
|  | //
 | ||||||
|  | // An invalid message is an empty, read-only value.
 | ||||||
|  | //
 | ||||||
|  | // An invalid message often corresponds to a nil pointer of the concrete
 | ||||||
|  | // message type, but the details are implementation dependent.
 | ||||||
|  | // Validity is not part of the protobuf data model, and may not
 | ||||||
|  | // be preserved in marshaling or other operations.
 | ||||||
|  | func (x *fastReflection_RecordsList) IsValid() bool { | ||||||
|  | 	return x != nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ProtoMethods returns optional fastReflectionFeature-path implementations of various operations.
 | ||||||
|  | // This method may return nil.
 | ||||||
|  | //
 | ||||||
|  | // The returned methods type is identical to
 | ||||||
|  | // "google.golang.org/protobuf/runtime/protoiface".Methods.
 | ||||||
|  | // Consult the protoiface package documentation for details.
 | ||||||
|  | func (x *fastReflection_RecordsList) ProtoMethods() *protoiface.Methods { | ||||||
|  | 	size := func(input protoiface.SizeInput) protoiface.SizeOutput { | ||||||
|  | 		x := input.Message.Interface().(*RecordsList) | ||||||
|  | 		if x == nil { | ||||||
|  | 			return protoiface.SizeOutput{ | ||||||
|  | 				NoUnkeyedLiterals: input.NoUnkeyedLiterals, | ||||||
|  | 				Size:              0, | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		options := runtime.SizeInputToOptions(input) | ||||||
|  | 		_ = options | ||||||
|  | 		var n int | ||||||
|  | 		var l int | ||||||
|  | 		_ = l | ||||||
|  | 		if len(x.Value) > 0 { | ||||||
|  | 			for _, s := range x.Value { | ||||||
|  | 				l = len(s) | ||||||
|  | 				n += 1 + l + runtime.Sov(uint64(l)) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if x.unknownFields != nil { | ||||||
|  | 			n += len(x.unknownFields) | ||||||
|  | 		} | ||||||
|  | 		return protoiface.SizeOutput{ | ||||||
|  | 			NoUnkeyedLiterals: input.NoUnkeyedLiterals, | ||||||
|  | 			Size:              n, | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { | ||||||
|  | 		x := input.Message.Interface().(*RecordsList) | ||||||
|  | 		if x == nil { | ||||||
|  | 			return protoiface.MarshalOutput{ | ||||||
|  | 				NoUnkeyedLiterals: input.NoUnkeyedLiterals, | ||||||
|  | 				Buf:               input.Buf, | ||||||
|  | 			}, nil | ||||||
|  | 		} | ||||||
|  | 		options := runtime.MarshalInputToOptions(input) | ||||||
|  | 		_ = options | ||||||
|  | 		size := options.Size(x) | ||||||
|  | 		dAtA := make([]byte, size) | ||||||
|  | 		i := len(dAtA) | ||||||
|  | 		_ = i | ||||||
|  | 		var l int | ||||||
|  | 		_ = l | ||||||
|  | 		if x.unknownFields != nil { | ||||||
|  | 			i -= len(x.unknownFields) | ||||||
|  | 			copy(dAtA[i:], x.unknownFields) | ||||||
|  | 		} | ||||||
|  | 		if len(x.Value) > 0 { | ||||||
|  | 			for iNdEx := len(x.Value) - 1; iNdEx >= 0; iNdEx-- { | ||||||
|  | 				i -= len(x.Value[iNdEx]) | ||||||
|  | 				copy(dAtA[i:], x.Value[iNdEx]) | ||||||
|  | 				i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Value[iNdEx]))) | ||||||
|  | 				i-- | ||||||
|  | 				dAtA[i] = 0xa | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if input.Buf != nil { | ||||||
|  | 			input.Buf = append(input.Buf, dAtA...) | ||||||
|  | 		} else { | ||||||
|  | 			input.Buf = dAtA | ||||||
|  | 		} | ||||||
|  | 		return protoiface.MarshalOutput{ | ||||||
|  | 			NoUnkeyedLiterals: input.NoUnkeyedLiterals, | ||||||
|  | 			Buf:               input.Buf, | ||||||
|  | 		}, nil | ||||||
|  | 	} | ||||||
|  | 	unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { | ||||||
|  | 		x := input.Message.Interface().(*RecordsList) | ||||||
|  | 		if x == nil { | ||||||
|  | 			return protoiface.UnmarshalOutput{ | ||||||
|  | 				NoUnkeyedLiterals: input.NoUnkeyedLiterals, | ||||||
|  | 				Flags:             input.Flags, | ||||||
|  | 			}, nil | ||||||
|  | 		} | ||||||
|  | 		options := runtime.UnmarshalInputToOptions(input) | ||||||
|  | 		_ = options | ||||||
|  | 		dAtA := input.Buf | ||||||
|  | 		l := len(dAtA) | ||||||
|  | 		iNdEx := 0 | ||||||
|  | 		for iNdEx < l { | ||||||
|  | 			preIndex := iNdEx | ||||||
|  | 			var wire uint64 | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				wire |= uint64(b&0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			fieldNum := int32(wire >> 3) | ||||||
|  | 			wireType := int(wire & 0x7) | ||||||
|  | 			if wireType == 4 { | ||||||
|  | 				return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: RecordsList: wiretype end group for non-group") | ||||||
|  | 			} | ||||||
|  | 			if fieldNum <= 0 { | ||||||
|  | 				return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: RecordsList: illegal tag %d (wire type %d)", fieldNum, wire) | ||||||
|  | 			} | ||||||
|  | 			switch fieldNum { | ||||||
|  | 			case 1: | ||||||
|  | 				if wireType != 2 { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) | ||||||
|  | 				} | ||||||
|  | 				var stringLen uint64 | ||||||
|  | 				for shift := uint(0); ; shift += 7 { | ||||||
|  | 					if shift >= 64 { | ||||||
|  | 						return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow | ||||||
|  | 					} | ||||||
|  | 					if iNdEx >= l { | ||||||
|  | 						return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF | ||||||
|  | 					} | ||||||
|  | 					b := dAtA[iNdEx] | ||||||
|  | 					iNdEx++ | ||||||
|  | 					stringLen |= uint64(b&0x7F) << shift | ||||||
|  | 					if b < 0x80 { | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				intStringLen := int(stringLen) | ||||||
|  | 				if intStringLen < 0 { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength | ||||||
|  | 				} | ||||||
|  | 				postIndex := iNdEx + intStringLen | ||||||
|  | 				if postIndex < 0 { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength | ||||||
|  | 				} | ||||||
|  | 				if postIndex > l { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				x.Value = append(x.Value, string(dAtA[iNdEx:postIndex])) | ||||||
|  | 				iNdEx = postIndex | ||||||
|  | 			default: | ||||||
|  | 				iNdEx = preIndex | ||||||
|  | 				skippy, err := runtime.Skip(dAtA[iNdEx:]) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err | ||||||
|  | 				} | ||||||
|  | 				if (skippy < 0) || (iNdEx+skippy) < 0 { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength | ||||||
|  | 				} | ||||||
|  | 				if (iNdEx + skippy) > l { | ||||||
|  | 					return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				if !options.DiscardUnknown { | ||||||
|  | 					x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) | ||||||
|  | 				} | ||||||
|  | 				iNdEx += skippy | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if iNdEx > l { | ||||||
|  | 			return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF | ||||||
|  | 		} | ||||||
|  | 		return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil | ||||||
|  | 	} | ||||||
|  | 	return &protoiface.Methods{ | ||||||
|  | 		NoUnkeyedLiterals: struct{}{}, | ||||||
|  | 		Flags:             protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, | ||||||
|  | 		Size:              size, | ||||||
|  | 		Marshal:           marshal, | ||||||
|  | 		Unmarshal:         unmarshal, | ||||||
|  | 		Merge:             nil, | ||||||
|  | 		CheckInitialized:  nil, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||||
| // versions:
 | // versions:
 | ||||||
| // 	protoc-gen-go v1.27.0
 | // 	protoc-gen-go v1.27.0
 | ||||||
| @ -6712,6 +7192,43 @@ func (x *ExpiryQueue) GetValue() []string { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // List of record ids
 | ||||||
|  | // Value type to be used in AttributesMap
 | ||||||
|  | type RecordsList struct { | ||||||
|  | 	state         protoimpl.MessageState | ||||||
|  | 	sizeCache     protoimpl.SizeCache | ||||||
|  | 	unknownFields protoimpl.UnknownFields | ||||||
|  | 
 | ||||||
|  | 	Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *RecordsList) Reset() { | ||||||
|  | 	*x = RecordsList{} | ||||||
|  | 	if protoimpl.UnsafeEnabled { | ||||||
|  | 		mi := &file_cerc_registry_v1_registry_proto_msgTypes[9] | ||||||
|  | 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||||
|  | 		ms.StoreMessageInfo(mi) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *RecordsList) String() string { | ||||||
|  | 	return protoimpl.X.MessageStringOf(x) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (*RecordsList) ProtoMessage() {} | ||||||
|  | 
 | ||||||
|  | // Deprecated: Use RecordsList.ProtoReflect.Descriptor instead.
 | ||||||
|  | func (*RecordsList) Descriptor() ([]byte, []int) { | ||||||
|  | 	return file_cerc_registry_v1_registry_proto_rawDescGZIP(), []int{9} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *RecordsList) GetValue() []string { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Value | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var File_cerc_registry_v1_registry_proto protoreflect.FileDescriptor | var File_cerc_registry_v1_registry_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_cerc_registry_v1_registry_proto_rawDesc = []byte{ | var file_cerc_registry_v1_registry_proto_rawDesc = []byte{ | ||||||
| @ -6932,20 +7449,23 @@ var file_cerc_registry_v1_registry_proto_rawDesc = []byte{ | |||||||
| 	0x22, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x33, 0x0a, 0x0b, 0x45, 0x78, 0x70, | 	0x22, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x33, 0x0a, 0x0b, 0x45, 0x78, 0x70, | ||||||
| 	0x69, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, | 	0x69, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, | ||||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, | 	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, | ||||||
| 	0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0xc5, | 	0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, | ||||||
| 	0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x65, 0x72, 0x63, 0x2e, 0x72, 0x65, 0x67, 0x69, | 	0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, | ||||||
| 	0x73, 0x74, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, | 	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, | ||||||
| 	0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x2e, 0x76, 0x64, | 	0x6c, 0x75, 0x65, 0x42, 0xc5, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x65, 0x72, 0x63, | ||||||
| 	0x62, 0x2e, 0x74, 0x6f, 0x2f, 0x63, 0x65, 0x72, 0x63, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x63, | 	0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x52, 0x65, | ||||||
| 	0x6f, 0x6e, 0x69, 0x63, 0x32, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x63, 0x2f, | 	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, | ||||||
| 	0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x65, 0x67, 0x69, | 	0x69, 0x74, 0x2e, 0x76, 0x64, 0x62, 0x2e, 0x74, 0x6f, 0x2f, 0x63, 0x65, 0x72, 0x63, 0x2d, 0x69, | ||||||
| 	0x73, 0x74, 0x72, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x52, 0x58, 0xaa, 0x02, 0x10, 0x43, | 	0x6f, 0x2f, 0x6c, 0x61, 0x63, 0x6f, 0x6e, 0x69, 0x63, 0x32, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, | ||||||
| 	0x65, 0x72, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x56, 0x31, 0xca, | 	0x63, 0x65, 0x72, 0x63, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x76, 0x31, | ||||||
| 	0x02, 0x10, 0x43, 0x65, 0x72, 0x63, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5c, | 	0x3b, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x52, | ||||||
| 	0x56, 0x31, 0xe2, 0x02, 0x1c, 0x43, 0x65, 0x72, 0x63, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, | 	0x58, 0xaa, 0x02, 0x10, 0x43, 0x65, 0x72, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, | ||||||
| 	0x72, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, | 	0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x43, 0x65, 0x72, 0x63, 0x5c, 0x52, 0x65, 0x67, 0x69, | ||||||
| 	0x61, 0xea, 0x02, 0x12, 0x43, 0x65, 0x72, 0x63, 0x3a, 0x3a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, | 	0x73, 0x74, 0x72, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x43, 0x65, 0x72, 0x63, 0x5c, 0x52, | ||||||
| 	0x72, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | 	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, | ||||||
|  | 	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x43, 0x65, 0x72, 0x63, 0x3a, 0x3a, 0x52, | ||||||
|  | 	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, | ||||||
|  | 	0x74, 0x6f, 0x33, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -6960,7 +7480,7 @@ func file_cerc_registry_v1_registry_proto_rawDescGZIP() []byte { | |||||||
| 	return file_cerc_registry_v1_registry_proto_rawDescData | 	return file_cerc_registry_v1_registry_proto_rawDescData | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var file_cerc_registry_v1_registry_proto_msgTypes = make([]protoimpl.MessageInfo, 9) | var file_cerc_registry_v1_registry_proto_msgTypes = make([]protoimpl.MessageInfo, 10) | ||||||
| var file_cerc_registry_v1_registry_proto_goTypes = []interface{}{ | var file_cerc_registry_v1_registry_proto_goTypes = []interface{}{ | ||||||
| 	(*Params)(nil),                // 0: cerc.registry.v1.Params
 | 	(*Params)(nil),                // 0: cerc.registry.v1.Params
 | ||||||
| 	(*Record)(nil),                // 1: cerc.registry.v1.Record
 | 	(*Record)(nil),                // 1: cerc.registry.v1.Record
 | ||||||
| @ -6971,23 +7491,24 @@ var file_cerc_registry_v1_registry_proto_goTypes = []interface{}{ | |||||||
| 	(*NameRecordEntry)(nil),       // 6: cerc.registry.v1.NameRecordEntry
 | 	(*NameRecordEntry)(nil),       // 6: cerc.registry.v1.NameRecordEntry
 | ||||||
| 	(*Signature)(nil),             // 7: cerc.registry.v1.Signature
 | 	(*Signature)(nil),             // 7: cerc.registry.v1.Signature
 | ||||||
| 	(*ExpiryQueue)(nil),           // 8: cerc.registry.v1.ExpiryQueue
 | 	(*ExpiryQueue)(nil),           // 8: cerc.registry.v1.ExpiryQueue
 | ||||||
| 	(*v1beta1.Coin)(nil),          // 9: cosmos.base.v1beta1.Coin
 | 	(*RecordsList)(nil),           // 9: cerc.registry.v1.RecordsList
 | ||||||
| 	(*durationpb.Duration)(nil),   // 10: google.protobuf.Duration
 | 	(*v1beta1.Coin)(nil),          // 10: cosmos.base.v1beta1.Coin
 | ||||||
| 	(*timestamppb.Timestamp)(nil), // 11: google.protobuf.Timestamp
 | 	(*durationpb.Duration)(nil),   // 11: google.protobuf.Duration
 | ||||||
|  | 	(*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp
 | ||||||
| } | } | ||||||
| var file_cerc_registry_v1_registry_proto_depIdxs = []int32{ | var file_cerc_registry_v1_registry_proto_depIdxs = []int32{ | ||||||
| 	9,  // 0: cerc.registry.v1.Params.record_rent:type_name -> cosmos.base.v1beta1.Coin
 | 	10, // 0: cerc.registry.v1.Params.record_rent:type_name -> cosmos.base.v1beta1.Coin
 | ||||||
| 	10, // 1: cerc.registry.v1.Params.record_rent_duration:type_name -> google.protobuf.Duration
 | 	11, // 1: cerc.registry.v1.Params.record_rent_duration:type_name -> google.protobuf.Duration
 | ||||||
| 	9,  // 2: cerc.registry.v1.Params.authority_rent:type_name -> cosmos.base.v1beta1.Coin
 | 	10, // 2: cerc.registry.v1.Params.authority_rent:type_name -> cosmos.base.v1beta1.Coin
 | ||||||
| 	10, // 3: cerc.registry.v1.Params.authority_rent_duration:type_name -> google.protobuf.Duration
 | 	11, // 3: cerc.registry.v1.Params.authority_rent_duration:type_name -> google.protobuf.Duration
 | ||||||
| 	10, // 4: cerc.registry.v1.Params.authority_grace_period:type_name -> google.protobuf.Duration
 | 	11, // 4: cerc.registry.v1.Params.authority_grace_period:type_name -> google.protobuf.Duration
 | ||||||
| 	10, // 5: cerc.registry.v1.Params.authority_auction_commits_duration:type_name -> google.protobuf.Duration
 | 	11, // 5: cerc.registry.v1.Params.authority_auction_commits_duration:type_name -> google.protobuf.Duration
 | ||||||
| 	10, // 6: cerc.registry.v1.Params.authority_auction_reveals_duration:type_name -> google.protobuf.Duration
 | 	11, // 6: cerc.registry.v1.Params.authority_auction_reveals_duration:type_name -> google.protobuf.Duration
 | ||||||
| 	9,  // 7: cerc.registry.v1.Params.authority_auction_commit_fee:type_name -> cosmos.base.v1beta1.Coin
 | 	10, // 7: cerc.registry.v1.Params.authority_auction_commit_fee:type_name -> cosmos.base.v1beta1.Coin
 | ||||||
| 	9,  // 8: cerc.registry.v1.Params.authority_auction_reveal_fee:type_name -> cosmos.base.v1beta1.Coin
 | 	10, // 8: cerc.registry.v1.Params.authority_auction_reveal_fee:type_name -> cosmos.base.v1beta1.Coin
 | ||||||
| 	9,  // 9: cerc.registry.v1.Params.authority_auction_minimum_bid:type_name -> cosmos.base.v1beta1.Coin
 | 	10, // 9: cerc.registry.v1.Params.authority_auction_minimum_bid:type_name -> cosmos.base.v1beta1.Coin
 | ||||||
| 	3,  // 10: cerc.registry.v1.AuthorityEntry.entry:type_name -> cerc.registry.v1.NameAuthority
 | 	3,  // 10: cerc.registry.v1.AuthorityEntry.entry:type_name -> cerc.registry.v1.NameAuthority
 | ||||||
| 	11, // 11: cerc.registry.v1.NameAuthority.expiry_time:type_name -> google.protobuf.Timestamp
 | 	12, // 11: cerc.registry.v1.NameAuthority.expiry_time:type_name -> google.protobuf.Timestamp
 | ||||||
| 	5,  // 12: cerc.registry.v1.NameEntry.entry:type_name -> cerc.registry.v1.NameRecord
 | 	5,  // 12: cerc.registry.v1.NameEntry.entry:type_name -> cerc.registry.v1.NameRecord
 | ||||||
| 	6,  // 13: cerc.registry.v1.NameRecord.latest:type_name -> cerc.registry.v1.NameRecordEntry
 | 	6,  // 13: cerc.registry.v1.NameRecord.latest:type_name -> cerc.registry.v1.NameRecordEntry
 | ||||||
| 	6,  // 14: cerc.registry.v1.NameRecord.history:type_name -> cerc.registry.v1.NameRecordEntry
 | 	6,  // 14: cerc.registry.v1.NameRecord.history:type_name -> cerc.registry.v1.NameRecordEntry
 | ||||||
| @ -7112,6 +7633,18 @@ func file_cerc_registry_v1_registry_proto_init() { | |||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 		file_cerc_registry_v1_registry_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { | ||||||
|  | 			switch v := v.(*RecordsList); i { | ||||||
|  | 			case 0: | ||||||
|  | 				return &v.state | ||||||
|  | 			case 1: | ||||||
|  | 				return &v.sizeCache | ||||||
|  | 			case 2: | ||||||
|  | 				return &v.unknownFields | ||||||
|  | 			default: | ||||||
|  | 				return nil | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	type x struct{} | 	type x struct{} | ||||||
| 	out := protoimpl.TypeBuilder{ | 	out := protoimpl.TypeBuilder{ | ||||||
| @ -7119,7 +7652,7 @@ func file_cerc_registry_v1_registry_proto_init() { | |||||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||||
| 			RawDescriptor: file_cerc_registry_v1_registry_proto_rawDesc, | 			RawDescriptor: file_cerc_registry_v1_registry_proto_rawDesc, | ||||||
| 			NumEnums:      0, | 			NumEnums:      0, | ||||||
| 			NumMessages:   9, | 			NumMessages:   10, | ||||||
| 			NumExtensions: 0, | 			NumExtensions: 0, | ||||||
| 			NumServices:   0, | 			NumServices:   0, | ||||||
| 		}, | 		}, | ||||||
|  | |||||||
| @ -79,7 +79,6 @@ type LaconicApp struct { | |||||||
| 	AuctionKeeper  *auctionkeeper.Keeper // (Use * as per ProvideModule implementation)
 | 	AuctionKeeper  *auctionkeeper.Keeper // (Use * as per ProvideModule implementation)
 | ||||||
| 	BondKeeper     *bondkeeper.Keeper | 	BondKeeper     *bondkeeper.Keeper | ||||||
| 	RegistryKeeper registrykeeper.Keeper | 	RegistryKeeper registrykeeper.Keeper | ||||||
| 	// RegistryRecordKeeper registrykeeper.RecordKeeper
 |  | ||||||
| 
 | 
 | ||||||
| 	// simulation manager
 | 	// simulation manager
 | ||||||
| 	sm *module.SimulationManager | 	sm *module.SimulationManager | ||||||
| @ -141,7 +140,6 @@ func NewLaconicApp( | |||||||
| 		&app.ConsensusParamsKeeper, | 		&app.ConsensusParamsKeeper, | ||||||
| 		&app.AuctionKeeper, | 		&app.AuctionKeeper, | ||||||
| 		&app.BondKeeper, | 		&app.BondKeeper, | ||||||
| 		// &app.RegistryRecordKeeper,
 |  | ||||||
| 		&app.RegistryKeeper, | 		&app.RegistryKeeper, | ||||||
| 	); err != nil { | 	); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | |||||||
| @ -106,7 +106,7 @@ func NewRootCmd() *cobra.Command { | |||||||
| 			// overwrite the block timeout
 | 			// overwrite the block timeout
 | ||||||
| 			cmtCfg := cmtcfg.DefaultConfig() | 			cmtCfg := cmtcfg.DefaultConfig() | ||||||
| 			cmtCfg.Consensus.TimeoutCommit = 3 * time.Second | 			cmtCfg.Consensus.TimeoutCommit = 3 * time.Second | ||||||
| 			cmtCfg.LogLevel = "*:error,p2p:info,state:info" // better default logging
 | 			cmtCfg.LogLevel = "*:error,p2p:info,state:info,auction:info,bond:info,registry:info" // better default logging
 | ||||||
| 
 | 
 | ||||||
| 			return server.InterceptConfigsPreRunHandler(cmd, serverconfig.DefaultConfigTemplate, srvCfg, cmtCfg) | 			return server.InterceptConfigsPreRunHandler(cmd, serverconfig.DefaultConfigTemplate, srvCfg, cmtCfg) | ||||||
| 		}, | 		}, | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -37,6 +37,7 @@ require ( | |||||||
| 	github.com/ipld/go-ipld-prime v0.21.0 | 	github.com/ipld/go-ipld-prime v0.21.0 | ||||||
| 	github.com/spf13/cobra v1.8.0 | 	github.com/spf13/cobra v1.8.0 | ||||||
| 	github.com/spf13/viper v1.17.0 | 	github.com/spf13/viper v1.17.0 | ||||||
|  | 	github.com/stretchr/testify v1.8.4 | ||||||
| 	golang.org/x/exp v0.0.0-20231006140011-7918f672742d | 	golang.org/x/exp v0.0.0-20231006140011-7918f672742d | ||||||
| 	google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f | 	google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f | ||||||
| 	google.golang.org/grpc v1.60.1 | 	google.golang.org/grpc v1.60.1 | ||||||
| @ -160,7 +161,6 @@ require ( | |||||||
| 	github.com/spf13/afero v1.10.0 // indirect | 	github.com/spf13/afero v1.10.0 // indirect | ||||||
| 	github.com/spf13/cast v1.5.1 // indirect | 	github.com/spf13/cast v1.5.1 // indirect | ||||||
| 	github.com/spf13/pflag v1.0.5 // indirect | 	github.com/spf13/pflag v1.0.5 // indirect | ||||||
| 	github.com/stretchr/testify v1.8.4 // indirect |  | ||||||
| 	github.com/subosito/gotenv v1.6.0 // indirect | 	github.com/subosito/gotenv v1.6.0 // indirect | ||||||
| 	github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect | 	github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect | ||||||
| 	github.com/tendermint/go-amino v0.16.0 // indirect | 	github.com/tendermint/go-amino v0.16.0 // indirect | ||||||
|  | |||||||
| @ -138,3 +138,9 @@ message ExpiryQueue { | |||||||
|   string          id    = 1; |   string          id    = 1; | ||||||
|   repeated string value = 2; |   repeated string value = 2; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // List of record ids | ||||||
|  | // Value type to be used in AttributesMap | ||||||
|  | message RecordsList { | ||||||
|  |   repeated string value = 1; | ||||||
|  | } | ||||||
|  | |||||||
| @ -3,7 +3,6 @@ | |||||||
| rm -r ~/.laconic2d || true | rm -r ~/.laconic2d || true | ||||||
| LACONIC2D_BIN=$(which laconic2d) | LACONIC2D_BIN=$(which laconic2d) | ||||||
| # configure laconic2d | # configure laconic2d | ||||||
| $LACONIC2D_BIN config set config log_level "*:error,p2p:info,state:info,auction:info,bond:info,registry:info" --skip-validate |  | ||||||
| $LACONIC2D_BIN config set client chain-id demo | $LACONIC2D_BIN config set client chain-id demo | ||||||
| $LACONIC2D_BIN config set client keyring-backend test | $LACONIC2D_BIN config set client keyring-backend test | ||||||
| $LACONIC2D_BIN keys add alice | $LACONIC2D_BIN keys add alice | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								tests/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								tests/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | test-integration: | ||||||
|  | 	go test -mod=readonly ./integration/... -test.v -timeout 10m | ||||||
							
								
								
									
										30
									
								
								tests/integration/auction/keeper/common_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								tests/integration/auction/keeper/common_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | package keeper_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"github.com/stretchr/testify/assert" | ||||||
|  | 	"github.com/stretchr/testify/suite" | ||||||
|  | 
 | ||||||
|  | 	integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration" | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/auction" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type KeeperTestSuite struct { | ||||||
|  | 	suite.Suite | ||||||
|  | 	integrationTest.TestFixture | ||||||
|  | 
 | ||||||
|  | 	queryClient types.QueryClient | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) SetupTest() { | ||||||
|  | 	err := kts.TestFixture.Setup() | ||||||
|  | 	assert.Nil(kts.T(), err) | ||||||
|  | 
 | ||||||
|  | 	qr := kts.App.QueryHelper() | ||||||
|  | 	kts.queryClient = types.NewQueryClient(qr) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestAuctionKeeperTestSuite(t *testing.T) { | ||||||
|  | 	suite.Run(t, new(KeeperTestSuite)) | ||||||
|  | } | ||||||
							
								
								
									
										349
									
								
								tests/integration/auction/keeper/query_server_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										349
									
								
								tests/integration/auction/keeper/query_server_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,349 @@ | |||||||
|  | package keeper_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 
 | ||||||
|  | 	"cosmossdk.io/math" | ||||||
|  | 	simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" | ||||||
|  | 
 | ||||||
|  | 	integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration" | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/auction" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const testCommitHash = "71D8CF34026E32A3A34C2C2D4ADF25ABC8D7943A4619761BE27F196603D91B9D" | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcQueryParams() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg string | ||||||
|  | 		req *types.QueryParamsRequest | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"fetch params", | ||||||
|  | 			&types.QueryParamsRequest{}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s", test.msg), func() { | ||||||
|  | 			resp, err := kts.queryClient.Params(context.Background(), test.req) | ||||||
|  | 			kts.Require().Nil(err) | ||||||
|  | 			kts.Require().Equal(*(resp.Params), types.DefaultParams()) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetAuction() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg           string | ||||||
|  | 		req           *types.QueryAuctionRequest | ||||||
|  | 		createAuction bool | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"fetch auction with empty auction ID", | ||||||
|  | 			&types.QueryAuctionRequest{}, | ||||||
|  | 			false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"fetch auction with valid auction ID", | ||||||
|  | 			&types.QueryAuctionRequest{}, | ||||||
|  | 			true, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s", test.msg), func() { | ||||||
|  | 			var expectedAuction types.Auction | ||||||
|  | 			if test.createAuction { | ||||||
|  | 				auction, _, err := kts.createAuctionAndCommitBid(false) | ||||||
|  | 				kts.Require().Nil(err) | ||||||
|  | 				test.req.Id = auction.Id | ||||||
|  | 				expectedAuction = *auction | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			resp, err := kts.queryClient.GetAuction(context.Background(), test.req) | ||||||
|  | 			if test.createAuction { | ||||||
|  | 				kts.Require().Nil(err) | ||||||
|  | 				kts.Require().NotNil(resp.GetAuction()) | ||||||
|  | 				kts.Require().EqualExportedValues(expectedAuction, *(resp.GetAuction())) | ||||||
|  | 			} else { | ||||||
|  | 				kts.Require().NotNil(err) | ||||||
|  | 				kts.Require().Error(err) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetAllAuctions() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg            string | ||||||
|  | 		req            *types.QueryAuctionsRequest | ||||||
|  | 		createAuctions bool | ||||||
|  | 		auctionCount   int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"fetch auctions when no auctions exist", | ||||||
|  | 			&types.QueryAuctionsRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 		{ | ||||||
|  | 			"fetch auctions with one auction created", | ||||||
|  | 			&types.QueryAuctionsRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s", test.msg), func() { | ||||||
|  | 			if test.createAuctions { | ||||||
|  | 				_, _, err := kts.createAuctionAndCommitBid(false) | ||||||
|  | 				kts.Require().Nil(err) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			resp, _ := kts.queryClient.Auctions(context.Background(), test.req) | ||||||
|  | 			kts.Require().Equal(test.auctionCount, len(resp.GetAuctions().Auctions)) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetBids() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg           string | ||||||
|  | 		req           *types.QueryBidsRequest | ||||||
|  | 		createAuction bool | ||||||
|  | 		commitBid     bool | ||||||
|  | 		bidCount      int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"fetch all bids when no auction exists", | ||||||
|  | 			&types.QueryBidsRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"fetch all bids for valid auction but no added bids", | ||||||
|  | 			&types.QueryBidsRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"fetch all bids for valid auction and valid bid", | ||||||
|  | 			&types.QueryBidsRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			true, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s", test.msg), func() { | ||||||
|  | 			if test.createAuction { | ||||||
|  | 				auction, _, err := kts.createAuctionAndCommitBid(test.commitBid) | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				test.req.AuctionId = auction.Id | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			resp, err := kts.queryClient.GetBids(context.Background(), test.req) | ||||||
|  | 			if test.createAuction { | ||||||
|  | 				kts.Require().Nil(err) | ||||||
|  | 				kts.Require().Equal(test.bidCount, len(resp.GetBids())) | ||||||
|  | 			} else { | ||||||
|  | 				kts.Require().NotNil(err) | ||||||
|  | 				kts.Require().Error(err) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetBid() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg                 string | ||||||
|  | 		req                 *types.QueryBidRequest | ||||||
|  | 		createAuctionAndBid bool | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"fetch bid when bid does not exist", | ||||||
|  | 			&types.QueryBidRequest{}, | ||||||
|  | 			false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"fetch bid when valid bid exists", | ||||||
|  | 			&types.QueryBidRequest{}, | ||||||
|  | 			true, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s", test.msg), func() { | ||||||
|  | 			if test.createAuctionAndBid { | ||||||
|  | 				auction, bid, err := kts.createAuctionAndCommitBid(test.createAuctionAndBid) | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				test.req.AuctionId = auction.Id | ||||||
|  | 				test.req.Bidder = bid.BidderAddress | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			resp, err := kts.queryClient.GetBid(context.Background(), test.req) | ||||||
|  | 			if test.createAuctionAndBid { | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				kts.Require().NotNil(resp.Bid) | ||||||
|  | 				kts.Require().Equal(test.req.Bidder, resp.Bid.BidderAddress) | ||||||
|  | 			} else { | ||||||
|  | 				kts.Require().NotNil(err) | ||||||
|  | 				kts.Require().Error(err) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetAuctionsByBidder() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg                       string | ||||||
|  | 		req                       *types.QueryAuctionsByBidderRequest | ||||||
|  | 		createAuctionAndCommitBid bool | ||||||
|  | 		auctionCount              int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"get auctions by bidder with invalid bidder address", | ||||||
|  | 			&types.QueryAuctionsByBidderRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"get auctions by bidder with valid auction and bid", | ||||||
|  | 			&types.QueryAuctionsByBidderRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s", test.msg), func() { | ||||||
|  | 			if test.createAuctionAndCommitBid { | ||||||
|  | 				_, bid, err := kts.createAuctionAndCommitBid(test.createAuctionAndCommitBid) | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				test.req.BidderAddress = bid.BidderAddress | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			resp, err := kts.queryClient.AuctionsByBidder(context.Background(), test.req) | ||||||
|  | 			if test.createAuctionAndCommitBid { | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				kts.Require().NotNil(resp.Auctions) | ||||||
|  | 				kts.Require().Equal(test.auctionCount, len(resp.Auctions.Auctions)) | ||||||
|  | 			} else { | ||||||
|  | 				kts.Require().NotNil(err) | ||||||
|  | 				kts.Require().Error(err) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetAuctionsByOwner() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg           string | ||||||
|  | 		req           *types.QueryAuctionsByOwnerRequest | ||||||
|  | 		createAuction bool | ||||||
|  | 		auctionCount  int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"get auctions by owner with invalid owner address", | ||||||
|  | 			&types.QueryAuctionsByOwnerRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"get auctions by owner with valid auction", | ||||||
|  | 			&types.QueryAuctionsByOwnerRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s", test.msg), func() { | ||||||
|  | 			if test.createAuction { | ||||||
|  | 				auction, _, err := kts.createAuctionAndCommitBid(false) | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				test.req.OwnerAddress = auction.OwnerAddress | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			resp, err := kts.queryClient.AuctionsByOwner(context.Background(), test.req) | ||||||
|  | 			if test.createAuction { | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				kts.Require().NotNil(resp.Auctions) | ||||||
|  | 				kts.Require().Equal(test.auctionCount, len(resp.Auctions.Auctions)) | ||||||
|  | 			} else { | ||||||
|  | 				kts.Require().NotNil(err) | ||||||
|  | 				kts.Require().Error(err) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcQueryBalance() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg           string | ||||||
|  | 		req           *types.QueryGetAuctionModuleBalanceRequest | ||||||
|  | 		createAuction bool | ||||||
|  | 		auctionCount  int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"get balance with no auctions created", | ||||||
|  | 			&types.QueryGetAuctionModuleBalanceRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"get balance with single auction created", | ||||||
|  | 			&types.QueryGetAuctionModuleBalanceRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		if test.createAuction { | ||||||
|  | 			_, _, err := kts.createAuctionAndCommitBid(true) | ||||||
|  | 			kts.Require().NoError(err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		resp, err := kts.queryClient.GetAuctionModuleBalance(context.Background(), test.req) | ||||||
|  | 		kts.Require().NoError(err) | ||||||
|  | 		kts.Require().Equal(test.auctionCount, len(resp.GetBalance())) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) createAuctionAndCommitBid(commitBid bool) (*types.Auction, *types.Bid, error) { | ||||||
|  | 	ctx, k := kts.SdkCtx, kts.AuctionKeeper | ||||||
|  | 	accCount := 1 | ||||||
|  | 	if commitBid { | ||||||
|  | 		accCount++ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Create funded account(s)
 | ||||||
|  | 	accounts := simtestutil.AddTestAddrs(kts.BankKeeper, integrationTest.BondDenomProvider{}, ctx, accCount, math.NewInt(100)) | ||||||
|  | 
 | ||||||
|  | 	params, err := k.GetParams(ctx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	auction, err := k.CreateAuction(ctx, types.NewMsgCreateAuction(*params, accounts[0])) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if commitBid { | ||||||
|  | 		bid, err := k.CommitBid(ctx, types.NewMsgCommitBid(auction.Id, testCommitHash, accounts[1])) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, nil, err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return auction, bid, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return auction, nil, nil | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								tests/integration/bond/keeper/common_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								tests/integration/bond/keeper/common_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | package keeper_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"github.com/stretchr/testify/assert" | ||||||
|  | 	"github.com/stretchr/testify/suite" | ||||||
|  | 
 | ||||||
|  | 	integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration" | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/bond" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type KeeperTestSuite struct { | ||||||
|  | 	suite.Suite | ||||||
|  | 	integrationTest.TestFixture | ||||||
|  | 
 | ||||||
|  | 	queryClient types.QueryClient | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) SetupTest() { | ||||||
|  | 	err := kts.TestFixture.Setup() | ||||||
|  | 	assert.Nil(kts.T(), err) | ||||||
|  | 
 | ||||||
|  | 	qr := kts.App.QueryHelper() | ||||||
|  | 	kts.queryClient = types.NewQueryClient(qr) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestBondKeeperTestSuite(t *testing.T) { | ||||||
|  | 	suite.Run(t, new(KeeperTestSuite)) | ||||||
|  | } | ||||||
							
								
								
									
										210
									
								
								tests/integration/bond/keeper/query_server_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								tests/integration/bond/keeper/query_server_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,210 @@ | |||||||
|  | package keeper_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 
 | ||||||
|  | 	"cosmossdk.io/math" | ||||||
|  | 	simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" | ||||||
|  | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
|  | 
 | ||||||
|  | 	integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration" | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/bond" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcQueryParams() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg string | ||||||
|  | 		req *types.QueryParamsRequest | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"fetch params", | ||||||
|  | 			&types.QueryParamsRequest{}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s", test.msg), func() { | ||||||
|  | 			resp, err := kts.queryClient.Params(context.Background(), test.req) | ||||||
|  | 			kts.Require().Nil(err) | ||||||
|  | 			kts.Require().Equal(*(resp.Params), types.DefaultParams()) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcQueryBondsList() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg         string | ||||||
|  | 		req         *types.QueryGetBondsRequest | ||||||
|  | 		resp        *types.QueryGetBondsResponse | ||||||
|  | 		noOfBonds   int | ||||||
|  | 		createBonds bool | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"empty request", | ||||||
|  | 			&types.QueryGetBondsRequest{}, | ||||||
|  | 			&types.QueryGetBondsResponse{}, | ||||||
|  | 			0, | ||||||
|  | 			false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"Get Bonds", | ||||||
|  | 			&types.QueryGetBondsRequest{}, | ||||||
|  | 			&types.QueryGetBondsResponse{}, | ||||||
|  | 			1, | ||||||
|  | 			true, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			if test.createBonds { | ||||||
|  | 				_, err := kts.createBond() | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 			} | ||||||
|  | 			resp, _ := kts.queryClient.Bonds(context.Background(), test.req) | ||||||
|  | 			kts.Require().Equal(test.noOfBonds, len(resp.GetBonds())) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcQueryBondByBondId() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg         string | ||||||
|  | 		req         *types.QueryGetBondByIdRequest | ||||||
|  | 		createBonds bool | ||||||
|  | 		errResponse bool | ||||||
|  | 		bondId      string | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"empty request", | ||||||
|  | 			&types.QueryGetBondByIdRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			true, | ||||||
|  | 			"", | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"Get Bond By ID", | ||||||
|  | 			&types.QueryGetBondByIdRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			"", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			if test.createBonds { | ||||||
|  | 				bond, err := kts.createBond() | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				test.req.Id = bond.Id | ||||||
|  | 			} | ||||||
|  | 			resp, err := kts.queryClient.GetBondById(context.Background(), test.req) | ||||||
|  | 			if !test.errResponse { | ||||||
|  | 				kts.Require().Nil(err) | ||||||
|  | 				kts.Require().NotNil(resp.GetBond()) | ||||||
|  | 				kts.Require().Equal(test.req.Id, resp.GetBond().GetId()) | ||||||
|  | 			} else { | ||||||
|  | 				kts.Require().NotNil(err) | ||||||
|  | 				kts.Require().Error(err) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetBondsByOwner() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg         string | ||||||
|  | 		req         *types.QueryGetBondsByOwnerRequest | ||||||
|  | 		noOfBonds   int | ||||||
|  | 		createBonds bool | ||||||
|  | 		errResponse bool | ||||||
|  | 		bondId      string | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"empty request", | ||||||
|  | 			&types.QueryGetBondsByOwnerRequest{}, | ||||||
|  | 			0, | ||||||
|  | 			false, | ||||||
|  | 			true, | ||||||
|  | 			"", | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"Get Bond By Owner", | ||||||
|  | 			&types.QueryGetBondsByOwnerRequest{}, | ||||||
|  | 			1, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			"", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			if test.createBonds { | ||||||
|  | 				bond, err := kts.createBond() | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 				test.req.Owner = bond.Owner | ||||||
|  | 			} | ||||||
|  | 			resp, err := kts.queryClient.GetBondsByOwner(context.Background(), test.req) | ||||||
|  | 			if !test.errResponse { | ||||||
|  | 				kts.Require().Nil(err) | ||||||
|  | 				kts.Require().NotNil(resp.GetBonds()) | ||||||
|  | 				kts.Require().Equal(test.noOfBonds, len(resp.GetBonds())) | ||||||
|  | 			} else { | ||||||
|  | 				kts.Require().NotNil(err) | ||||||
|  | 				kts.Require().Error(err) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetModuleBalance() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg         string | ||||||
|  | 		req         *types.QueryGetBondModuleBalanceRequest | ||||||
|  | 		noOfBonds   int | ||||||
|  | 		createBonds bool | ||||||
|  | 		errResponse bool | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"empty request", | ||||||
|  | 			&types.QueryGetBondModuleBalanceRequest{}, | ||||||
|  | 			0, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			if test.createBonds { | ||||||
|  | 				_, err := kts.createBond() | ||||||
|  | 				kts.Require().NoError(err) | ||||||
|  | 			} | ||||||
|  | 			resp, err := kts.queryClient.GetBondsModuleBalance(context.Background(), test.req) | ||||||
|  | 			if !test.errResponse { | ||||||
|  | 				kts.Require().Nil(err) | ||||||
|  | 				kts.Require().NotNil(resp.GetBalance()) | ||||||
|  | 				kts.Require().Equal(resp.GetBalance(), sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(10)))) | ||||||
|  | 			} else { | ||||||
|  | 				kts.Require().NotNil(err) | ||||||
|  | 				kts.Require().Error(err) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) createBond() (*types.Bond, error) { | ||||||
|  | 	ctx, k := kts.SdkCtx, kts.BondKeeper | ||||||
|  | 	accCount := 1 | ||||||
|  | 
 | ||||||
|  | 	// Create funded account(s)
 | ||||||
|  | 	accounts := simtestutil.AddTestAddrs(kts.BankKeeper, integrationTest.BondDenomProvider{}, ctx, accCount, math.NewInt(1000)) | ||||||
|  | 
 | ||||||
|  | 	bond, err := k.CreateBond(ctx, accounts[0], sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(10)))) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return bond, nil | ||||||
|  | } | ||||||
							
								
								
									
										157
									
								
								tests/integration/common.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								tests/integration/common.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,157 @@ | |||||||
|  | package integration_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 
 | ||||||
|  | 	"cosmossdk.io/core/appmodule" | ||||||
|  | 	"cosmossdk.io/log" | ||||||
|  | 	storetypes "cosmossdk.io/store/types" | ||||||
|  | 	cmtprototypes "github.com/cometbft/cometbft/proto/tendermint/types" | ||||||
|  | 
 | ||||||
|  | 	"github.com/cosmos/cosmos-sdk/codec" | ||||||
|  | 	addresscodec "github.com/cosmos/cosmos-sdk/codec/address" | ||||||
|  | 	"github.com/cosmos/cosmos-sdk/runtime" | ||||||
|  | 	"github.com/cosmos/cosmos-sdk/testutil/integration" | ||||||
|  | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
|  | 	moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" | ||||||
|  | 	"github.com/cosmos/cosmos-sdk/x/auth" | ||||||
|  | 	authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" | ||||||
|  | 	authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" | ||||||
|  | 	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" | ||||||
|  | 	"github.com/cosmos/cosmos-sdk/x/bank" | ||||||
|  | 	bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" | ||||||
|  | 	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" | ||||||
|  | 	minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" | ||||||
|  | 
 | ||||||
|  | 	auctionTypes "git.vdb.to/cerc-io/laconic2d/x/auction" | ||||||
|  | 	auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper" | ||||||
|  | 	auctionmodule "git.vdb.to/cerc-io/laconic2d/x/auction/module" | ||||||
|  | 	bondTypes "git.vdb.to/cerc-io/laconic2d/x/bond" | ||||||
|  | 	bondkeeper "git.vdb.to/cerc-io/laconic2d/x/bond/keeper" | ||||||
|  | 	bondmodule "git.vdb.to/cerc-io/laconic2d/x/bond/module" | ||||||
|  | 	registryTypes "git.vdb.to/cerc-io/laconic2d/x/registry" | ||||||
|  | 	registrykeeper "git.vdb.to/cerc-io/laconic2d/x/registry/keeper" | ||||||
|  | 	registrymodule "git.vdb.to/cerc-io/laconic2d/x/registry/module" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type TestFixture struct { | ||||||
|  | 	App *integration.App | ||||||
|  | 
 | ||||||
|  | 	SdkCtx sdk.Context | ||||||
|  | 	cdc    codec.Codec | ||||||
|  | 	keys   map[string]*storetypes.KVStoreKey | ||||||
|  | 
 | ||||||
|  | 	AccountKeeper authkeeper.AccountKeeper | ||||||
|  | 	BankKeeper    bankkeeper.Keeper | ||||||
|  | 
 | ||||||
|  | 	AuctionKeeper  *auctionkeeper.Keeper | ||||||
|  | 	BondKeeper     *bondkeeper.Keeper | ||||||
|  | 	RegistryKeeper registrykeeper.Keeper | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (tf *TestFixture) Setup() error { | ||||||
|  | 	keys := storetypes.NewKVStoreKeys( | ||||||
|  | 		authtypes.StoreKey, banktypes.StoreKey, auctionTypes.StoreKey, bondTypes.StoreKey, registryTypes.StoreKey, | ||||||
|  | 	) | ||||||
|  | 	cdc := moduletestutil.MakeTestEncodingConfig( | ||||||
|  | 		auth.AppModuleBasic{}, | ||||||
|  | 		auctionmodule.AppModule{}, | ||||||
|  | 		bondmodule.AppModule{}, | ||||||
|  | 		registrymodule.AppModule{}, | ||||||
|  | 	).Codec | ||||||
|  | 
 | ||||||
|  | 	logger := log.NewNopLogger() // Use log.NewTestLogger(kts.T()) for help with debugging
 | ||||||
|  | 	cms := integration.CreateMultiStore(keys, logger) | ||||||
|  | 
 | ||||||
|  | 	newCtx := sdk.NewContext(cms, cmtprototypes.Header{}, true, logger) | ||||||
|  | 
 | ||||||
|  | 	authority := authtypes.NewModuleAddress("gov") | ||||||
|  | 
 | ||||||
|  | 	maccPerms := map[string][]string{ | ||||||
|  | 		minttypes.ModuleName:                         {authtypes.Minter}, | ||||||
|  | 		auctionTypes.ModuleName:                      {}, | ||||||
|  | 		auctionTypes.AuctionBurnModuleAccountName:    {}, | ||||||
|  | 		bondTypes.ModuleName:                         {}, | ||||||
|  | 		registryTypes.ModuleName:                     {}, | ||||||
|  | 		registryTypes.RecordRentModuleAccountName:    {}, | ||||||
|  | 		registryTypes.AuthorityRentModuleAccountName: {}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	accountKeeper := authkeeper.NewAccountKeeper( | ||||||
|  | 		cdc, | ||||||
|  | 		runtime.NewKVStoreService(keys[authtypes.StoreKey]), | ||||||
|  | 		authtypes.ProtoBaseAccount, | ||||||
|  | 		maccPerms, | ||||||
|  | 		addresscodec.NewBech32Codec(sdk.Bech32MainPrefix), | ||||||
|  | 		sdk.Bech32MainPrefix, | ||||||
|  | 		authority.String(), | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	blockedAddresses := map[string]bool{ | ||||||
|  | 		accountKeeper.GetAuthority(): false, | ||||||
|  | 	} | ||||||
|  | 	bankKeeper := bankkeeper.NewBaseKeeper( | ||||||
|  | 		cdc, | ||||||
|  | 		runtime.NewKVStoreService(keys[banktypes.StoreKey]), | ||||||
|  | 		accountKeeper, | ||||||
|  | 		blockedAddresses, | ||||||
|  | 		authority.String(), | ||||||
|  | 		log.NewNopLogger(), | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	auctionKeeper := auctionkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[auctionTypes.StoreKey]), accountKeeper, bankKeeper) | ||||||
|  | 
 | ||||||
|  | 	bondKeeper := bondkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[bondTypes.StoreKey]), accountKeeper, bankKeeper) | ||||||
|  | 
 | ||||||
|  | 	registryKeeper := registrykeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[registryTypes.StoreKey]), accountKeeper, bankKeeper, bondKeeper, auctionKeeper) | ||||||
|  | 
 | ||||||
|  | 	authModule := auth.NewAppModule(cdc, accountKeeper, authsims.RandomGenesisAccounts, nil) | ||||||
|  | 	bankModule := bank.NewAppModule(cdc, bankKeeper, accountKeeper, nil) | ||||||
|  | 	auctionModule := auctionmodule.NewAppModule(cdc, auctionKeeper) | ||||||
|  | 	bondModule := bondmodule.NewAppModule(cdc, bondKeeper) | ||||||
|  | 	registryModule := registrymodule.NewAppModule(cdc, registryKeeper) | ||||||
|  | 
 | ||||||
|  | 	integrationApp := integration.NewIntegrationApp(newCtx, logger, keys, cdc, map[string]appmodule.AppModule{ | ||||||
|  | 		authtypes.ModuleName:     authModule, | ||||||
|  | 		banktypes.ModuleName:     bankModule, | ||||||
|  | 		auctionTypes.ModuleName:  auctionModule, | ||||||
|  | 		bondTypes.ModuleName:     bondModule, | ||||||
|  | 		registryTypes.ModuleName: registryModule, | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	sdkCtx := sdk.UnwrapSDKContext(integrationApp.Context()) | ||||||
|  | 
 | ||||||
|  | 	// Register MsgServer and QueryServer
 | ||||||
|  | 	auctionTypes.RegisterMsgServer(integrationApp.MsgServiceRouter(), auctionkeeper.NewMsgServerImpl(auctionKeeper)) | ||||||
|  | 	auctionTypes.RegisterQueryServer(integrationApp.QueryHelper(), auctionkeeper.NewQueryServerImpl(auctionKeeper)) | ||||||
|  | 
 | ||||||
|  | 	bondTypes.RegisterMsgServer(integrationApp.MsgServiceRouter(), bondkeeper.NewMsgServerImpl(bondKeeper)) | ||||||
|  | 	bondTypes.RegisterQueryServer(integrationApp.QueryHelper(), bondkeeper.NewQueryServerImpl(bondKeeper)) | ||||||
|  | 
 | ||||||
|  | 	registryTypes.RegisterMsgServer(integrationApp.MsgServiceRouter(), registrykeeper.NewMsgServerImpl(registryKeeper)) | ||||||
|  | 	registryTypes.RegisterQueryServer(integrationApp.QueryHelper(), registrykeeper.NewQueryServerImpl(registryKeeper)) | ||||||
|  | 
 | ||||||
|  | 	// set default params
 | ||||||
|  | 	if err := auctionKeeper.Params.Set(sdkCtx, auctionTypes.DefaultParams()); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if err := bondKeeper.Params.Set(sdkCtx, bondTypes.DefaultParams()); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if err := registryKeeper.Params.Set(sdkCtx, registryTypes.DefaultParams()); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	tf.App = integrationApp | ||||||
|  | 	tf.SdkCtx, tf.cdc, tf.keys = sdkCtx, cdc, keys | ||||||
|  | 	tf.AccountKeeper, tf.BankKeeper = accountKeeper, bankKeeper | ||||||
|  | 	tf.AuctionKeeper, tf.BondKeeper, tf.RegistryKeeper = auctionKeeper, bondKeeper, registryKeeper | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type BondDenomProvider struct{} | ||||||
|  | 
 | ||||||
|  | func (bdp BondDenomProvider) BondDenom(ctx context.Context) (string, error) { | ||||||
|  | 	return sdk.DefaultBondDenom, nil | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								tests/integration/data/examples/example1.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								tests/integration/data/examples/example1.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | record: | ||||||
|  |   attr1: value1 | ||||||
|  |   attr2: value2 | ||||||
|  |   link1: | ||||||
|  |     /: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D | ||||||
|  |   link2: | ||||||
|  |     /: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9 | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | record: | ||||||
|  |   type: GeneralRecord | ||||||
|  |   name: foo | ||||||
|  |   version: 1.0.0 | ||||||
|  |   tags: | ||||||
|  |     - tagA | ||||||
|  |     - tagB | ||||||
							
								
								
									
										13
									
								
								tests/integration/data/examples/service_provider_example.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tests/integration/data/examples/service_provider_example.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | 
 | ||||||
|  | record: | ||||||
|  |     type: ServiceProviderRegistration | ||||||
|  |     bond_id: madeUpBondID | ||||||
|  |     laconic_id: madeUpLaconicID | ||||||
|  |     version: 1.0.0 | ||||||
|  |     x500: | ||||||
|  |       common_name: cerc-io | ||||||
|  |       organization_unit: xyz | ||||||
|  |       organization_name: abc | ||||||
|  |       state_name: california | ||||||
|  |       country: US | ||||||
|  |       locality_name: local | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | record: | ||||||
|  |     type: WebsiteRegistrationRecord | ||||||
|  |     url: https://cerc.io | ||||||
|  |     repo_registration_record_cid: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D | ||||||
|  |     build_artifact_cid: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9 | ||||||
|  |     tls_cerc_cid: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR | ||||||
|  |     version: 1.0.0 | ||||||
							
								
								
									
										59
									
								
								tests/integration/registry/keeper/common_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								tests/integration/registry/keeper/common_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | |||||||
|  | package keeper_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"cosmossdk.io/math" | ||||||
|  | 	simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" | ||||||
|  | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
|  | 	"github.com/stretchr/testify/assert" | ||||||
|  | 	"github.com/stretchr/testify/suite" | ||||||
|  | 
 | ||||||
|  | 	integrationTest "git.vdb.to/cerc-io/laconic2d/tests/integration" | ||||||
|  | 	bondTypes "git.vdb.to/cerc-io/laconic2d/x/bond" | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/registry" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type KeeperTestSuite struct { | ||||||
|  | 	suite.Suite | ||||||
|  | 	integrationTest.TestFixture | ||||||
|  | 
 | ||||||
|  | 	queryClient types.QueryClient | ||||||
|  | 
 | ||||||
|  | 	accounts []sdk.AccAddress | ||||||
|  | 	bond     bondTypes.Bond | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) SetupTest() { | ||||||
|  | 	kts.TestFixture.Setup() | ||||||
|  | 
 | ||||||
|  | 	// set default params
 | ||||||
|  | 	err := kts.RegistryKeeper.Params.Set(kts.SdkCtx, types.DefaultParams()) | ||||||
|  | 	assert.Nil(kts.T(), err) | ||||||
|  | 
 | ||||||
|  | 	qr := kts.App.QueryHelper() | ||||||
|  | 	kts.queryClient = types.NewQueryClient(qr) | ||||||
|  | 
 | ||||||
|  | 	// Create a bond
 | ||||||
|  | 	bond, err := kts.createBond() | ||||||
|  | 	assert.Nil(kts.T(), err) | ||||||
|  | 	kts.bond = *bond | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestRegistryKeeperTestSuite(t *testing.T) { | ||||||
|  | 	suite.Run(t, new(KeeperTestSuite)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) createBond() (*bondTypes.Bond, error) { | ||||||
|  | 	ctx := kts.SdkCtx | ||||||
|  | 
 | ||||||
|  | 	// Create a funded account
 | ||||||
|  | 	kts.accounts = simtestutil.AddTestAddrs(kts.BankKeeper, integrationTest.BondDenomProvider{}, ctx, 1, math.NewInt(100000000000)) | ||||||
|  | 
 | ||||||
|  | 	bond, err := kts.BondKeeper.CreateBond(ctx, kts.accounts[0], sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1000000000)))) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return bond, nil | ||||||
|  | } | ||||||
							
								
								
									
										421
									
								
								tests/integration/registry/keeper/query_server_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										421
									
								
								tests/integration/registry/keeper/query_server_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,421 @@ | |||||||
|  | package keeper_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"reflect" | ||||||
|  | 
 | ||||||
|  | 	types "git.vdb.to/cerc-io/laconic2d/x/registry" | ||||||
|  | 	"git.vdb.to/cerc-io/laconic2d/x/registry/client/cli" | ||||||
|  | 	"git.vdb.to/cerc-io/laconic2d/x/registry/helpers" | ||||||
|  | 	registryKeeper "git.vdb.to/cerc-io/laconic2d/x/registry/keeper" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcQueryParams() { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg string | ||||||
|  | 		req *types.QueryParamsRequest | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"Get Params", | ||||||
|  | 			&types.QueryParamsRequest{}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			resp, _ := kts.queryClient.Params(context.Background(), test.req) | ||||||
|  | 			defaultParams := types.DefaultParams() | ||||||
|  | 			kts.Require().Equal(defaultParams.String(), resp.GetParams().String()) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcGetRecordLists() { | ||||||
|  | 	ctx, queryClient := kts.SdkCtx, kts.queryClient | ||||||
|  | 	sr := kts.Require() | ||||||
|  | 
 | ||||||
|  | 	var recordId string | ||||||
|  | 	examples := []string{ | ||||||
|  | 		"../../data/examples/service_provider_example.yml", | ||||||
|  | 		"../../data/examples/website_registration_example.yml", | ||||||
|  | 		"../../data/examples/general_record_example.yml", | ||||||
|  | 	} | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg           string | ||||||
|  | 		req           *types.QueryRecordsRequest | ||||||
|  | 		createRecords bool | ||||||
|  | 		expErr        bool | ||||||
|  | 		noOfRecords   int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"Empty Records", | ||||||
|  | 			&types.QueryRecordsRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"List Records", | ||||||
|  | 			&types.QueryRecordsRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			3, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"Filter with type", | ||||||
|  | 			&types.QueryRecordsRequest{ | ||||||
|  | 				Attributes: []*types.QueryRecordsRequest_KeyValueInput{ | ||||||
|  | 					{ | ||||||
|  | 						Key: "type", | ||||||
|  | 						Value: &types.QueryRecordsRequest_ValueInput{ | ||||||
|  | 							Value: &types.QueryRecordsRequest_ValueInput_String_{String_: "WebsiteRegistrationRecord"}, | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 				All: true, | ||||||
|  | 			}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 		// Skip the following test as querying with recursive values not supported (PR https://git.vdb.to/cerc-io/laconicd/pulls/112)
 | ||||||
|  | 		// See function RecordsFromAttributes (QueryValueToJSON call) in the registry keeper implementation (x/registry/keeper/keeper.go)
 | ||||||
|  | 		// {
 | ||||||
|  | 		// 	"Filter with tag (extant) (https://git.vdb.to/cerc-io/laconicd/issues/129)",
 | ||||||
|  | 		// 	&types.QueryRecordsRequest{
 | ||||||
|  | 		// 		Attributes: []*types.QueryRecordsRequest_KeyValueInput{
 | ||||||
|  | 		// 			{
 | ||||||
|  | 		// 				Key: "tags",
 | ||||||
|  | 		// 				// Value: &types.QueryRecordsRequest_ValueInput{
 | ||||||
|  | 		// 				// 	Value: &types.QueryRecordsRequest_ValueInput_String_{"tagA"},
 | ||||||
|  | 		// 				// },
 | ||||||
|  | 		// 				Value: &types.QueryRecordsRequest_ValueInput{
 | ||||||
|  | 		// 					Value: &types.QueryRecordsRequest_ValueInput_Array{Array: &types.QueryRecordsRequest_ArrayInput{
 | ||||||
|  | 		// 						Values: []*types.QueryRecordsRequest_ValueInput{
 | ||||||
|  | 		// 							{
 | ||||||
|  | 		// 								Value: &types.QueryRecordsRequest_ValueInput_String_{"tagA"},
 | ||||||
|  | 		// 							},
 | ||||||
|  | 		// 						},
 | ||||||
|  | 		// 					}},
 | ||||||
|  | 		// 				},
 | ||||||
|  | 		// 				// Throws: "Recursive query values are not supported"
 | ||||||
|  | 		// 			},
 | ||||||
|  | 		// 		},
 | ||||||
|  | 		// 		All: true,
 | ||||||
|  | 		// 	},
 | ||||||
|  | 		// 	true,
 | ||||||
|  | 		// 	false,
 | ||||||
|  | 		// 	1,
 | ||||||
|  | 		// },
 | ||||||
|  | 		{ | ||||||
|  | 			"Filter with tag (non-existent) (https://git.vdb.to/cerc-io/laconicd/issues/129)", | ||||||
|  | 			&types.QueryRecordsRequest{ | ||||||
|  | 				Attributes: []*types.QueryRecordsRequest_KeyValueInput{ | ||||||
|  | 					{ | ||||||
|  | 						Key: "tags", | ||||||
|  | 						Value: &types.QueryRecordsRequest_ValueInput{ | ||||||
|  | 							Value: &types.QueryRecordsRequest_ValueInput_String_{String_: "NOEXIST"}, | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 				All: true, | ||||||
|  | 			}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"Filter test for key collision (https://git.vdb.to/cerc-io/laconicd/issues/122)", | ||||||
|  | 			&types.QueryRecordsRequest{ | ||||||
|  | 				Attributes: []*types.QueryRecordsRequest_KeyValueInput{ | ||||||
|  | 					{ | ||||||
|  | 						Key: "typ", | ||||||
|  | 						Value: &types.QueryRecordsRequest_ValueInput{ | ||||||
|  | 							Value: &types.QueryRecordsRequest_ValueInput_String_{String_: "eWebsiteRegistrationRecord"}, | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 				All: true, | ||||||
|  | 			}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"Filter with attributes ServiceProviderRegistration", | ||||||
|  | 			&types.QueryRecordsRequest{ | ||||||
|  | 				Attributes: []*types.QueryRecordsRequest_KeyValueInput{ | ||||||
|  | 					{ | ||||||
|  | 						Key: "x500state_name", | ||||||
|  | 						Value: &types.QueryRecordsRequest_ValueInput{ | ||||||
|  | 							Value: &types.QueryRecordsRequest_ValueInput_String_{String_: "california"}, | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 				All: true, | ||||||
|  | 			}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			if test.createRecords { | ||||||
|  | 				for _, example := range examples { | ||||||
|  | 					filePath, err := filepath.Abs(example) | ||||||
|  | 					sr.NoError(err) | ||||||
|  | 					payloadType, err := cli.GetPayloadFromFile(filePath) | ||||||
|  | 					sr.NoError(err) | ||||||
|  | 					payload := payloadType.ToPayload() | ||||||
|  | 					record, err := kts.RegistryKeeper.SetRecord(ctx, types.MsgSetRecord{ | ||||||
|  | 						BondId:  kts.bond.GetId(), | ||||||
|  | 						Signer:  kts.accounts[0].String(), | ||||||
|  | 						Payload: payload, | ||||||
|  | 					}) | ||||||
|  | 					sr.NoError(err) | ||||||
|  | 					sr.NotNil(record.Id) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			resp, err := queryClient.Records(context.Background(), test.req) | ||||||
|  | 
 | ||||||
|  | 			if test.expErr { | ||||||
|  | 				kts.Error(err) | ||||||
|  | 			} else { | ||||||
|  | 				sr.NoError(err) | ||||||
|  | 				sr.Equal(test.noOfRecords, len(resp.GetRecords())) | ||||||
|  | 				if test.createRecords && test.noOfRecords > 0 { | ||||||
|  | 					recordId = resp.GetRecords()[0].GetId() | ||||||
|  | 					sr.NotZero(resp.GetRecords()) | ||||||
|  | 					sr.Equal(resp.GetRecords()[0].GetBondId(), kts.bond.GetId()) | ||||||
|  | 
 | ||||||
|  | 					for _, record := range resp.GetRecords() { | ||||||
|  | 						recAttr := helpers.MustUnmarshalJSON[types.AttributeMap](record.Attributes) | ||||||
|  | 
 | ||||||
|  | 						for _, attr := range test.req.GetAttributes() { | ||||||
|  | 							enc, err := registryKeeper.QueryValueToJSON(attr.Value) | ||||||
|  | 							sr.NoError(err) | ||||||
|  | 							av := helpers.MustUnmarshalJSON[any](enc) | ||||||
|  | 
 | ||||||
|  | 							if nil != av && nil != recAttr[attr.Key] && | ||||||
|  | 								reflect.Slice == reflect.TypeOf(recAttr[attr.Key]).Kind() && | ||||||
|  | 								reflect.Slice != reflect.TypeOf(av).Kind() { | ||||||
|  | 								found := false | ||||||
|  | 								allValues := recAttr[attr.Key].([]interface{}) | ||||||
|  | 								for i := range allValues { | ||||||
|  | 									if av == allValues[i] { | ||||||
|  | 										fmt.Printf("Found %s in %s", allValues[i], recAttr[attr.Key]) | ||||||
|  | 										found = true | ||||||
|  | 									} | ||||||
|  | 								} | ||||||
|  | 								sr.Equal(true, found, fmt.Sprintf("Unable to find %s in %s", av, recAttr[attr.Key])) | ||||||
|  | 							} else { | ||||||
|  | 								if attr.Key[:4] == "x500" { | ||||||
|  | 									sr.Equal(av, recAttr["x500"].(map[string]interface{})[attr.Key[4:]]) | ||||||
|  | 								} else { | ||||||
|  | 									sr.Equal(av, recAttr[attr.Key]) | ||||||
|  | 								} | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Get the records by record id
 | ||||||
|  | 	testCases1 := []struct { | ||||||
|  | 		msg          string | ||||||
|  | 		req          *types.QueryRecordByIdRequest | ||||||
|  | 		createRecord bool | ||||||
|  | 		expErr       bool | ||||||
|  | 		noOfRecords  int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"Invalid Request without record id", | ||||||
|  | 			&types.QueryRecordByIdRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			true, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"With Record ID", | ||||||
|  | 			&types.QueryRecordByIdRequest{ | ||||||
|  | 				Id: recordId, | ||||||
|  | 			}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range testCases1 { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			resp, err := queryClient.GetRecord(context.Background(), test.req) | ||||||
|  | 
 | ||||||
|  | 			if test.expErr { | ||||||
|  | 				kts.Error(err) | ||||||
|  | 			} else { | ||||||
|  | 				sr.NoError(err) | ||||||
|  | 				sr.NotNil(resp.GetRecord()) | ||||||
|  | 				if test.createRecord { | ||||||
|  | 					sr.Equal(resp.GetRecord().BondId, kts.bond.GetId()) | ||||||
|  | 					sr.Equal(resp.GetRecord().Id, recordId) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Get the records by record id
 | ||||||
|  | 	testCasesByBondID := []struct { | ||||||
|  | 		msg          string | ||||||
|  | 		req          *types.QueryRecordsByBondIdRequest | ||||||
|  | 		createRecord bool | ||||||
|  | 		expErr       bool | ||||||
|  | 		noOfRecords  int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"Invalid Request without bond id", | ||||||
|  | 			&types.QueryRecordsByBondIdRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			true, | ||||||
|  | 			0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"With Bond ID", | ||||||
|  | 			&types.QueryRecordsByBondIdRequest{ | ||||||
|  | 				Id: kts.bond.GetId(), | ||||||
|  | 			}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range testCasesByBondID { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			resp, err := queryClient.GetRecordsByBondId(context.Background(), test.req) | ||||||
|  | 
 | ||||||
|  | 			if test.expErr { | ||||||
|  | 				sr.Zero(resp.GetRecords()) | ||||||
|  | 			} else { | ||||||
|  | 				sr.NoError(err) | ||||||
|  | 				sr.NotNil(resp.GetRecords()) | ||||||
|  | 				if test.createRecord { | ||||||
|  | 					sr.NotZero(resp.GetRecords()) | ||||||
|  | 					sr.Equal(resp.GetRecords()[0].GetBondId(), kts.bond.GetId()) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcQueryRegistryModuleBalance() { | ||||||
|  | 	queryClient, ctx := kts.queryClient, kts.SdkCtx | ||||||
|  | 	sr := kts.Require() | ||||||
|  | 	examples := []string{ | ||||||
|  | 		"../../data/examples/service_provider_example.yml", | ||||||
|  | 		"../../data/examples/website_registration_example.yml", | ||||||
|  | 	} | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg           string | ||||||
|  | 		req           *types.QueryGetRegistryModuleBalanceRequest | ||||||
|  | 		createRecords bool | ||||||
|  | 		expErr        bool | ||||||
|  | 		noOfRecords   int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"Get Module Balance", | ||||||
|  | 			&types.QueryGetRegistryModuleBalanceRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			if test.createRecords { | ||||||
|  | 				for _, example := range examples { | ||||||
|  | 					filePath, err := filepath.Abs(example) | ||||||
|  | 					sr.NoError(err) | ||||||
|  | 					payloadType, err := cli.GetPayloadFromFile(filePath) | ||||||
|  | 					sr.NoError(err) | ||||||
|  | 					payload := payloadType.ToPayload() | ||||||
|  | 					record, err := kts.RegistryKeeper.SetRecord(ctx, types.MsgSetRecord{ | ||||||
|  | 						BondId:  kts.bond.GetId(), | ||||||
|  | 						Signer:  kts.accounts[0].String(), | ||||||
|  | 						Payload: payload, | ||||||
|  | 					}) | ||||||
|  | 					sr.NoError(err) | ||||||
|  | 					sr.NotNil(record.Id) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			resp, err := queryClient.GetRegistryModuleBalance(context.Background(), test.req) | ||||||
|  | 			if test.expErr { | ||||||
|  | 				kts.Error(err) | ||||||
|  | 			} else { | ||||||
|  | 				sr.NoError(err) | ||||||
|  | 				sr.Equal(test.noOfRecords, len(resp.GetBalances())) | ||||||
|  | 				if test.createRecords { | ||||||
|  | 					balance := resp.GetBalances()[0] | ||||||
|  | 					sr.Equal(balance.AccountName, types.RecordRentModuleAccountName) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (kts *KeeperTestSuite) TestGrpcQueryWhoIs() { | ||||||
|  | 	queryClient, ctx := kts.queryClient, kts.SdkCtx | ||||||
|  | 	sr := kts.Require() | ||||||
|  | 	authorityName := "TestGrpcQueryWhoIs" | ||||||
|  | 
 | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		msg         string | ||||||
|  | 		req         *types.QueryWhoisRequest | ||||||
|  | 		createName  bool | ||||||
|  | 		expErr      bool | ||||||
|  | 		noOfRecords int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"Invalid Request without name", | ||||||
|  | 			&types.QueryWhoisRequest{}, | ||||||
|  | 			false, | ||||||
|  | 			true, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"Success", | ||||||
|  | 			&types.QueryWhoisRequest{}, | ||||||
|  | 			true, | ||||||
|  | 			false, | ||||||
|  | 			1, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range testCases { | ||||||
|  | 		kts.Run(fmt.Sprintf("Case %s ", test.msg), func() { | ||||||
|  | 			if test.createName { | ||||||
|  | 				err := kts.RegistryKeeper.ReserveAuthority(ctx, types.MsgReserveAuthority{ | ||||||
|  | 					Name:   authorityName, | ||||||
|  | 					Signer: kts.accounts[0].String(), | ||||||
|  | 					Owner:  kts.accounts[0].String(), | ||||||
|  | 				}) | ||||||
|  | 				sr.NoError(err) | ||||||
|  | 				test.req = &types.QueryWhoisRequest{Name: authorityName} | ||||||
|  | 			} | ||||||
|  | 			resp, err := queryClient.Whois(context.Background(), test.req) | ||||||
|  | 			if test.expErr { | ||||||
|  | 				kts.Error(err) | ||||||
|  | 				sr.Nil(resp) | ||||||
|  | 			} else { | ||||||
|  | 				sr.NoError(err) | ||||||
|  | 				if test.createName { | ||||||
|  | 					nameAuth := resp.NameAuthority | ||||||
|  | 					sr.NotNil(nameAuth) | ||||||
|  | 					sr.Equal(nameAuth.OwnerAddress, kts.accounts[0].String()) | ||||||
|  | 					sr.Equal(types.AuthorityActive, nameAuth.Status) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -5,6 +5,9 @@ import "cosmossdk.io/collections" | |||||||
| const ( | const ( | ||||||
| 	ModuleName = "auction" | 	ModuleName = "auction" | ||||||
| 
 | 
 | ||||||
|  | 	// StoreKey defines the primary module store key
 | ||||||
|  | 	StoreKey = ModuleName | ||||||
|  | 
 | ||||||
| 	// AuctionBurnModuleAccountName is the name of the auction burn module account.
 | 	// AuctionBurnModuleAccountName is the name of the auction burn module account.
 | ||||||
| 	AuctionBurnModuleAccountName = "auction_burn" | 	AuctionBurnModuleAccountName = "auction_burn" | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -4,6 +4,9 @@ import "cosmossdk.io/collections" | |||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	ModuleName = "bond" | 	ModuleName = "bond" | ||||||
|  | 
 | ||||||
|  | 	// StoreKey defines the primary module store key
 | ||||||
|  | 	StoreKey = ModuleName | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Store prefixes
 | // Store prefixes
 | ||||||
|  | |||||||
| @ -19,8 +19,10 @@ import ( | |||||||
| 	auth "github.com/cosmos/cosmos-sdk/x/auth/keeper" | 	auth "github.com/cosmos/cosmos-sdk/x/auth/keeper" | ||||||
| 	bank "github.com/cosmos/cosmos-sdk/x/bank/keeper" | 	bank "github.com/cosmos/cosmos-sdk/x/bank/keeper" | ||||||
| 	"github.com/gibson042/canonicaljson-go" | 	"github.com/gibson042/canonicaljson-go" | ||||||
|  | 	cid "github.com/ipfs/go-cid" | ||||||
| 	"github.com/ipld/go-ipld-prime" | 	"github.com/ipld/go-ipld-prime" | ||||||
| 	"github.com/ipld/go-ipld-prime/codec/dagjson" | 	"github.com/ipld/go-ipld-prime/codec/dagjson" | ||||||
|  | 	cidlink "github.com/ipld/go-ipld-prime/linking/cid" | ||||||
| 	"github.com/ipld/go-ipld-prime/node/basicnode" | 	"github.com/ipld/go-ipld-prime/node/basicnode" | ||||||
| 
 | 
 | ||||||
| 	auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper" | 	auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper" | ||||||
| @ -105,6 +107,7 @@ type Keeper struct { | |||||||
| 	NameRecords          *collections.IndexedMap[string, registrytypes.NameRecord, NameRecordsIndexes] | 	NameRecords          *collections.IndexedMap[string, registrytypes.NameRecord, NameRecordsIndexes] | ||||||
| 	RecordExpiryQueue    collections.Map[time.Time, registrytypes.ExpiryQueue] | 	RecordExpiryQueue    collections.Map[time.Time, registrytypes.ExpiryQueue] | ||||||
| 	AuthorityExpiryQueue collections.Map[time.Time, registrytypes.ExpiryQueue] | 	AuthorityExpiryQueue collections.Map[time.Time, registrytypes.ExpiryQueue] | ||||||
|  | 	AttributesMap        collections.Map[collections.Pair[string, string], registrytypes.RecordsList] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewKeeper creates a new Keeper instance
 | // NewKeeper creates a new Keeper instance
 | ||||||
| @ -147,6 +150,10 @@ func NewKeeper( | |||||||
| 			sb, registrytypes.AuthorityExpiryQueuePrefix, "authority_expiry_queue", | 			sb, registrytypes.AuthorityExpiryQueuePrefix, "authority_expiry_queue", | ||||||
| 			sdk.TimeKey, codec.CollValue[registrytypes.ExpiryQueue](cdc), | 			sdk.TimeKey, codec.CollValue[registrytypes.ExpiryQueue](cdc), | ||||||
| 		), | 		), | ||||||
|  | 		AttributesMap: collections.NewMap( | ||||||
|  | 			sb, registrytypes.AttributesMapPrefix, "attributes_map", | ||||||
|  | 			collections.PairKeyCodec(collections.StringKey, collections.StringKey), codec.CollValue[registrytypes.RecordsList](cdc), | ||||||
|  | 		), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	schema, err := sb.Build() | 	schema, err := sb.Build() | ||||||
| @ -237,7 +244,90 @@ func (k Keeper) GetRecordsByBondId(ctx sdk.Context, bondId string) ([]registryty | |||||||
| 
 | 
 | ||||||
| // RecordsFromAttributes gets a list of records whose attributes match all provided values
 | // RecordsFromAttributes gets a list of records whose attributes match all provided values
 | ||||||
| func (k Keeper) RecordsFromAttributes(ctx sdk.Context, attributes []*registrytypes.QueryRecordsRequest_KeyValueInput, all bool) ([]registrytypes.Record, error) { | func (k Keeper) RecordsFromAttributes(ctx sdk.Context, attributes []*registrytypes.QueryRecordsRequest_KeyValueInput, all bool) ([]registrytypes.Record, error) { | ||||||
| 	panic("unimplemented") | 	resultRecordIds := []string{} | ||||||
|  | 	for i, attr := range attributes { | ||||||
|  | 		suffix, err := QueryValueToJSON(attr.Value) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		mapKey := collections.Join(attr.Key, string(suffix)) | ||||||
|  | 		recordIds, err := k.getAttributeMapping(ctx, mapKey) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if i == 0 { | ||||||
|  | 			resultRecordIds = recordIds | ||||||
|  | 		} else { | ||||||
|  | 			resultRecordIds = getIntersection(recordIds, resultRecordIds) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	records := []registrytypes.Record{} | ||||||
|  | 	for _, id := range resultRecordIds { | ||||||
|  | 		record, err := k.GetRecordById(ctx, id) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		if record.Deleted { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		if !all && len(record.Names) == 0 { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		records = append(records, record) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return records, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // TODO not recursive, and only should be if we want to support querying with whole sub-objects,
 | ||||||
|  | // which seems unnecessary.
 | ||||||
|  | func QueryValueToJSON(input *registrytypes.QueryRecordsRequest_ValueInput) ([]byte, error) { | ||||||
|  | 	np := basicnode.Prototype.Any | ||||||
|  | 	nb := np.NewBuilder() | ||||||
|  | 
 | ||||||
|  | 	switch value := input.GetValue().(type) { | ||||||
|  | 	case *registrytypes.QueryRecordsRequest_ValueInput_String_: | ||||||
|  | 		err := nb.AssignString(value.String_) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	case *registrytypes.QueryRecordsRequest_ValueInput_Int: | ||||||
|  | 		err := nb.AssignInt(value.Int) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	case *registrytypes.QueryRecordsRequest_ValueInput_Float: | ||||||
|  | 		err := nb.AssignFloat(value.Float) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	case *registrytypes.QueryRecordsRequest_ValueInput_Boolean: | ||||||
|  | 		err := nb.AssignBool(value.Boolean) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	case *registrytypes.QueryRecordsRequest_ValueInput_Link: | ||||||
|  | 		link := cidlink.Link{Cid: cid.MustParse(value.Link)} | ||||||
|  | 		err := nb.AssignLink(link) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	case *registrytypes.QueryRecordsRequest_ValueInput_Array: | ||||||
|  | 		return nil, fmt.Errorf("recursive query values are not supported") | ||||||
|  | 	case *registrytypes.QueryRecordsRequest_ValueInput_Map: | ||||||
|  | 		return nil, fmt.Errorf("recursive query values are not supported") | ||||||
|  | 	default: | ||||||
|  | 		return nil, fmt.Errorf("value has unexpected type %T", value) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	n := nb.Build() | ||||||
|  | 	var buf bytes.Buffer | ||||||
|  | 	if err := dagjson.Encode(n, &buf); err != nil { | ||||||
|  | 		return nil, fmt.Errorf("encoding value to JSON failed: %w", err) | ||||||
|  | 	} | ||||||
|  | 	return buf.Bytes(), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PutRecord - saves a record to the store.
 | // PutRecord - saves a record to the store.
 | ||||||
| @ -321,20 +411,14 @@ func (k Keeper) processRecord(ctx sdk.Context, record *registrytypes.ReadableRec | |||||||
| 
 | 
 | ||||||
| 	// TODO look up/validate record type here
 | 	// TODO look up/validate record type here
 | ||||||
| 
 | 
 | ||||||
| 	if err := k.processAttributes(ctx, record.Attributes, record.Id, ""); err != nil { | 	if err := k.processAttributes(ctx, record.Attributes, record.Id); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO
 |  | ||||||
| 	// expiryTimeKey := GetAttributesIndexKey(ExpiryTimeAttributeName, []byte(record.ExpiryTime))
 |  | ||||||
| 	// if err := k.SetAttributeMapping(ctx, expiryTimeKey, record.ID); err != nil {
 |  | ||||||
| 	// 	return err
 |  | ||||||
| 	// }
 |  | ||||||
| 
 |  | ||||||
| 	return k.insertRecordExpiryQueue(ctx, recordObj) | 	return k.insertRecordExpiryQueue(ctx, recordObj) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (k Keeper) processAttributes(ctx sdk.Context, attrs registrytypes.AttributeMap, id string, prefix string) error { | func (k Keeper) processAttributes(ctx sdk.Context, attrs registrytypes.AttributeMap, id string) error { | ||||||
| 	np := basicnode.Prototype.Map | 	np := basicnode.Prototype.Map | ||||||
| 	nb := np.NewBuilder() | 	nb := np.NewBuilder() | ||||||
| 	encAttrs, err := canonicaljson.Marshal(attrs) | 	encAttrs, err := canonicaljson.Marshal(attrs) | ||||||
| @ -353,7 +437,7 @@ func (k Keeper) processAttributes(ctx sdk.Context, attrs registrytypes.Attribute | |||||||
| 		return fmt.Errorf("record attributes must be a map, not %T", n.Kind()) | 		return fmt.Errorf("record attributes must be a map, not %T", n.Kind()) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return k.processAttributeMap(ctx, n, id, prefix) | 	return k.processAttributeMap(ctx, n, id, "") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (k Keeper) processAttributeMap(ctx sdk.Context, n ipld.Node, id string, prefix string) error { | func (k Keeper) processAttributeMap(ctx sdk.Context, n ipld.Node, id string, prefix string) error { | ||||||
| @ -378,17 +462,55 @@ func (k Keeper) processAttributeMap(ctx sdk.Context, n ipld.Node, id string, pre | |||||||
| 			if err := dagjson.Encode(valuenode, &buf); err != nil { | 			if err := dagjson.Encode(valuenode, &buf); err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 			// TODO
 | 
 | ||||||
| 			// value := buf.Bytes()
 | 			value := buf.Bytes() | ||||||
| 			// indexKey := GetAttributesIndexKey(prefix+key, value)
 | 			mapKey := collections.Join(prefix+key, string(value)) | ||||||
| 			// if err := k.SetAttributeMapping(ctx, indexKey, id); err != nil {
 | 			if err := k.setAttributeMapping(ctx, mapKey, id); err != nil { | ||||||
| 			// 	return err
 | 				return err | ||||||
| 			// }
 | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (k Keeper) setAttributeMapping(ctx sdk.Context, key collections.Pair[string, string], recordId string) error { | ||||||
|  | 	var recordIds []string | ||||||
|  | 
 | ||||||
|  | 	has, err := k.AttributesMap.Has(ctx, key) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if has { | ||||||
|  | 		value, err := k.AttributesMap.Get(ctx, key) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		recordIds = value.Value | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	recordIds = append(recordIds, recordId) | ||||||
|  | 
 | ||||||
|  | 	return k.AttributesMap.Set(ctx, key, registrytypes.RecordsList{Value: recordIds}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (k Keeper) getAttributeMapping(ctx sdk.Context, key collections.Pair[string, string]) ([]string, error) { | ||||||
|  | 	if has, err := k.AttributesMap.Has(ctx, key); !has { | ||||||
|  | 		if err != nil { | ||||||
|  | 			return []string{}, err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		k.Logger(ctx).Debug(fmt.Sprintf("store doesn't have key: %v", key)) | ||||||
|  | 		return []string{}, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	value, err := k.AttributesMap.Get(ctx, key) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return []string{}, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return value.Value, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (k Keeper) populateRecordNames(ctx sdk.Context, record *registrytypes.Record) error { | func (k Keeper) populateRecordNames(ctx sdk.Context, record *registrytypes.Record) error { | ||||||
| 	iter, err := k.NameRecords.Indexes.Cid.MatchExact(ctx, record.Id) | 	iter, err := k.NameRecords.Indexes.Cid.MatchExact(ctx, record.Id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -571,3 +693,30 @@ func (k Keeper) tryTakeRecordRent(ctx sdk.Context, record registrytypes.Record) | |||||||
| 	record.Deleted = false | 	record.Deleted = false | ||||||
| 	return k.SaveRecord(ctx, record) | 	return k.SaveRecord(ctx, record) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func getIntersection(a []string, b []string) []string { | ||||||
|  | 	result := []string{} | ||||||
|  | 	if len(a) < len(b) { | ||||||
|  | 		for _, str := range a { | ||||||
|  | 			if contains(b, str) { | ||||||
|  | 				result = append(result, str) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		for _, str := range b { | ||||||
|  | 			if contains(a, str) { | ||||||
|  | 				result = append(result, str) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return result | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func contains(arr []string, str string) bool { | ||||||
|  | 	for _, s := range arr { | ||||||
|  | 		if s == str { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | |||||||
| @ -6,6 +6,9 @@ const ( | |||||||
| 	// ModuleName is the name of the registry module
 | 	// ModuleName is the name of the registry module
 | ||||||
| 	ModuleName = "registry" | 	ModuleName = "registry" | ||||||
| 
 | 
 | ||||||
|  | 	// StoreKey defines the primary module store key
 | ||||||
|  | 	StoreKey = ModuleName | ||||||
|  | 
 | ||||||
| 	// RecordRentModuleAccountName is the name of the module account that keeps track of record rents paid.
 | 	// RecordRentModuleAccountName is the name of the module account that keeps track of record rents paid.
 | ||||||
| 	RecordRentModuleAccountName = "record_rent" | 	RecordRentModuleAccountName = "record_rent" | ||||||
| 
 | 
 | ||||||
| @ -30,4 +33,6 @@ var ( | |||||||
| 
 | 
 | ||||||
| 	RecordExpiryQueuePrefix    = collections.NewPrefix(8) | 	RecordExpiryQueuePrefix    = collections.NewPrefix(8) | ||||||
| 	AuthorityExpiryQueuePrefix = collections.NewPrefix(9) | 	AuthorityExpiryQueuePrefix = collections.NewPrefix(9) | ||||||
|  | 
 | ||||||
|  | 	AttributesMapPrefix = collections.NewPrefix(10) | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -679,6 +679,52 @@ func (m *ExpiryQueue) GetValue() []string { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // List of record ids
 | ||||||
|  | // Value type to be used in AttributesMap
 | ||||||
|  | type RecordsList struct { | ||||||
|  | 	Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *RecordsList) Reset()         { *m = RecordsList{} } | ||||||
|  | func (m *RecordsList) String() string { return proto.CompactTextString(m) } | ||||||
|  | func (*RecordsList) ProtoMessage()    {} | ||||||
|  | func (*RecordsList) Descriptor() ([]byte, []int) { | ||||||
|  | 	return fileDescriptor_d792f2373089b5b9, []int{9} | ||||||
|  | } | ||||||
|  | func (m *RecordsList) XXX_Unmarshal(b []byte) error { | ||||||
|  | 	return m.Unmarshal(b) | ||||||
|  | } | ||||||
|  | func (m *RecordsList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { | ||||||
|  | 	if deterministic { | ||||||
|  | 		return xxx_messageInfo_RecordsList.Marshal(b, m, deterministic) | ||||||
|  | 	} else { | ||||||
|  | 		b = b[:cap(b)] | ||||||
|  | 		n, err := m.MarshalToSizedBuffer(b) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		return b[:n], nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | func (m *RecordsList) XXX_Merge(src proto.Message) { | ||||||
|  | 	xxx_messageInfo_RecordsList.Merge(m, src) | ||||||
|  | } | ||||||
|  | func (m *RecordsList) XXX_Size() int { | ||||||
|  | 	return m.Size() | ||||||
|  | } | ||||||
|  | func (m *RecordsList) XXX_DiscardUnknown() { | ||||||
|  | 	xxx_messageInfo_RecordsList.DiscardUnknown(m) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var xxx_messageInfo_RecordsList proto.InternalMessageInfo | ||||||
|  | 
 | ||||||
|  | func (m *RecordsList) GetValue() []string { | ||||||
|  | 	if m != nil { | ||||||
|  | 		return m.Value | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func init() { | func init() { | ||||||
| 	proto.RegisterType((*Params)(nil), "cerc.registry.v1.Params") | 	proto.RegisterType((*Params)(nil), "cerc.registry.v1.Params") | ||||||
| 	proto.RegisterType((*Record)(nil), "cerc.registry.v1.Record") | 	proto.RegisterType((*Record)(nil), "cerc.registry.v1.Record") | ||||||
| @ -689,89 +735,91 @@ func init() { | |||||||
| 	proto.RegisterType((*NameRecordEntry)(nil), "cerc.registry.v1.NameRecordEntry") | 	proto.RegisterType((*NameRecordEntry)(nil), "cerc.registry.v1.NameRecordEntry") | ||||||
| 	proto.RegisterType((*Signature)(nil), "cerc.registry.v1.Signature") | 	proto.RegisterType((*Signature)(nil), "cerc.registry.v1.Signature") | ||||||
| 	proto.RegisterType((*ExpiryQueue)(nil), "cerc.registry.v1.ExpiryQueue") | 	proto.RegisterType((*ExpiryQueue)(nil), "cerc.registry.v1.ExpiryQueue") | ||||||
|  | 	proto.RegisterType((*RecordsList)(nil), "cerc.registry.v1.RecordsList") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func init() { proto.RegisterFile("cerc/registry/v1/registry.proto", fileDescriptor_d792f2373089b5b9) } | func init() { proto.RegisterFile("cerc/registry/v1/registry.proto", fileDescriptor_d792f2373089b5b9) } | ||||||
| 
 | 
 | ||||||
| var fileDescriptor_d792f2373089b5b9 = []byte{ | var fileDescriptor_d792f2373089b5b9 = []byte{ | ||||||
| 	// 1221 bytes of a gzipped FileDescriptorProto
 | 	// 1234 bytes of a gzipped FileDescriptorProto
 | ||||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcb, 0x6e, 0xdb, 0x46, | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcd, 0x6e, 0xdb, 0x46, | ||||||
| 	0x17, 0x36, 0x6d, 0x59, 0xb6, 0x8e, 0x63, 0xff, 0xc1, 0xfc, 0x4e, 0x22, 0xbb, 0xb1, 0xe8, 0xa8, | 	0x10, 0x36, 0x6d, 0x59, 0xb6, 0x46, 0xb1, 0x1b, 0x6c, 0x9d, 0x44, 0x76, 0x63, 0xd1, 0x51, 0x50, | ||||||
| 	0x28, 0xec, 0x20, 0x30, 0x09, 0xd9, 0x28, 0x82, 0x24, 0xe8, 0xc2, 0x72, 0x1d, 0xc3, 0x0d, 0xda, | 	0xd8, 0x41, 0x60, 0x12, 0xb2, 0x51, 0x04, 0x49, 0xd0, 0x83, 0xe5, 0x3a, 0x86, 0x9b, 0xfe, 0x38, | ||||||
| 	0x3a, 0xe3, 0xac, 0x5a, 0x14, 0x02, 0x2f, 0x13, 0x79, 0x5a, 0x91, 0x14, 0xc8, 0xa1, 0x1a, 0x2d, | 	0xeb, 0x9c, 0x5a, 0x14, 0x02, 0x7f, 0x36, 0xf2, 0xb6, 0x22, 0x29, 0x90, 0x4b, 0x35, 0x3a, 0x16, | ||||||
| 	0x0b, 0x74, 0xd3, 0x9d, 0x97, 0x59, 0xf4, 0x0d, 0xba, 0xe8, 0x63, 0x34, 0xcb, 0x2c, 0xbb, 0x29, | 	0xe8, 0xa5, 0x37, 0x1f, 0x73, 0xe8, 0x1b, 0xf4, 0xd0, 0xc7, 0x68, 0x8e, 0x39, 0xf6, 0x52, 0xb5, | ||||||
| 	0x5b, 0xd8, 0x40, 0x1f, 0x40, 0x4f, 0x50, 0x70, 0x66, 0x78, 0x95, 0x14, 0xb5, 0xc8, 0x8e, 0xe7, | 	0xb0, 0x81, 0x3e, 0x80, 0x9e, 0xa0, 0xe0, 0xee, 0xf2, 0x57, 0x52, 0xd4, 0x20, 0x37, 0xce, 0xdf, | ||||||
| 	0xf6, 0xcd, 0x37, 0xdf, 0x9c, 0xb9, 0x10, 0x54, 0x8b, 0xf8, 0x96, 0xee, 0x93, 0x2e, 0x0d, 0x98, | 	0xb7, 0xdf, 0xcc, 0xce, 0xec, 0x2e, 0x41, 0xb5, 0x88, 0x6f, 0xe9, 0x3e, 0xe9, 0xd0, 0x80, 0xf9, | ||||||
| 	0x3f, 0xd4, 0x07, 0xad, 0xf4, 0x5b, 0xeb, 0xfb, 0x1e, 0xf3, 0xd0, 0xcd, 0x38, 0x41, 0x4b, 0x9d, | 	0x03, 0xbd, 0xdf, 0x4c, 0xbe, 0xb5, 0x9e, 0xef, 0x31, 0x0f, 0x5d, 0x8f, 0x1c, 0xb4, 0x44, 0xd9, | ||||||
| 	0x83, 0xd6, 0x66, 0xa3, 0xeb, 0x79, 0xdd, 0x1e, 0xd1, 0x79, 0xdc, 0x0c, 0x5f, 0xea, 0x76, 0xe8, | 	0x6f, 0x6e, 0xd4, 0x3b, 0x9e, 0xd7, 0xe9, 0x12, 0x9d, 0xdb, 0xcd, 0xf0, 0x85, 0x6e, 0x87, 0xbe, | ||||||
| 	0x1b, 0x8c, 0x7a, 0xae, 0xa8, 0xd8, 0x54, 0xcb, 0x71, 0x46, 0x1d, 0x12, 0x30, 0xc3, 0xe9, 0xcb, | 	0xc1, 0xa8, 0xe7, 0x8a, 0x88, 0x0d, 0xb5, 0x68, 0x67, 0xd4, 0x21, 0x01, 0x33, 0x9c, 0x9e, 0x74, | ||||||
| 	0x84, 0xf5, 0xae, 0xd7, 0xf5, 0xf8, 0xa7, 0x1e, 0x7f, 0x49, 0x6f, 0xc3, 0xf2, 0x02, 0xc7, 0x0b, | 	0x58, 0xeb, 0x78, 0x1d, 0x8f, 0x7f, 0xea, 0xd1, 0x97, 0xd4, 0xd6, 0x2d, 0x2f, 0x70, 0xbc, 0x40, | ||||||
| 	0x74, 0xd3, 0x08, 0x88, 0x3e, 0x68, 0x99, 0x84, 0x19, 0x2d, 0xdd, 0xf2, 0xa8, 0x84, 0x6d, 0xfe, | 	0x37, 0x8d, 0x80, 0xe8, 0xfd, 0xa6, 0x49, 0x98, 0xd1, 0xd4, 0x2d, 0x8f, 0x4a, 0xd8, 0xc6, 0x5f, | ||||||
| 	0xb1, 0x0a, 0xd5, 0x33, 0xc3, 0x37, 0x9c, 0x00, 0x51, 0x58, 0xf1, 0x89, 0xe5, 0xf9, 0x76, 0xc7, | 	0x2b, 0x50, 0x3e, 0x35, 0x7c, 0xc3, 0x09, 0x10, 0x85, 0xaa, 0x4f, 0x2c, 0xcf, 0xb7, 0xdb, 0x3e, | ||||||
| 	0x27, 0x2e, 0xab, 0x2b, 0xdb, 0xca, 0xee, 0xca, 0xfe, 0x86, 0x26, 0x00, 0xb4, 0x18, 0x40, 0x93, | 	0x71, 0x59, 0x4d, 0xd9, 0x52, 0x76, 0xaa, 0x7b, 0xeb, 0x9a, 0x00, 0xd0, 0x22, 0x00, 0x4d, 0x02, | ||||||
| 	0x00, 0xda, 0x91, 0x47, 0xdd, 0xf6, 0xde, 0x9b, 0x48, 0x9d, 0x1b, 0x45, 0xea, 0x47, 0xdf, 0x06, | 	0x68, 0x87, 0x1e, 0x75, 0x5b, 0xbb, 0xaf, 0x87, 0xea, 0xdc, 0x68, 0xa8, 0x7e, 0xfc, 0x7d, 0xe0, | ||||||
| 	0x9e, 0xfb, 0xb8, 0x99, 0xab, 0x6d, 0x6e, 0x0f, 0x0d, 0xa7, 0x57, 0x74, 0x61, 0x10, 0x16, 0x26, | 	0xb9, 0x8f, 0x1a, 0x99, 0xd8, 0xc6, 0xd6, 0xc0, 0x70, 0xba, 0x79, 0x15, 0x06, 0x21, 0x61, 0xe2, | ||||||
| 	0x2e, 0x43, 0x97, 0x0a, 0xac, 0xe7, 0x82, 0x9d, 0x64, 0xae, 0xf5, 0x79, 0x39, 0xa8, 0x98, 0xac, | 	0x32, 0x74, 0xa1, 0xc0, 0x5a, 0xc6, 0xd8, 0x8e, 0x73, 0xad, 0xcd, 0xcb, 0x45, 0x45, 0xb2, 0x5a, | ||||||
| 	0x96, 0x4c, 0x56, 0xfb, 0x54, 0x26, 0xb4, 0x8f, 0xe4, 0xa0, 0x0f, 0xc7, 0x06, 0x4d, 0x41, 0x26, | 	0x9c, 0xac, 0xf6, 0x99, 0x74, 0x68, 0x1d, 0xca, 0x45, 0x1f, 0x8c, 0x2d, 0x9a, 0x80, 0x4c, 0x58, | ||||||
| 	0x8c, 0x9e, 0xc5, 0x5e, 0xff, 0xa9, 0x2a, 0x18, 0x65, 0x54, 0x12, 0x60, 0x14, 0xc2, 0x9a, 0x11, | 	0x3d, 0xb5, 0xbd, 0xfa, 0x5b, 0x55, 0x30, 0x4a, 0xa9, 0xc4, 0xc0, 0x28, 0x84, 0x55, 0x23, 0x64, | ||||||
| 	0xb2, 0x0b, 0xcf, 0xa7, 0x6c, 0x28, 0x04, 0x58, 0x98, 0x25, 0xc0, 0x81, 0xe4, 0xf2, 0x40, 0x70, | 	0xe7, 0x9e, 0x4f, 0xd9, 0x40, 0x14, 0x60, 0x61, 0x56, 0x01, 0xf6, 0x25, 0x97, 0xfb, 0x82, 0x4b, | ||||||
| 	0x29, 0x96, 0x27, 0x2c, 0x4a, 0x5e, 0xbc, 0x9a, 0x3a, 0xb8, 0x12, 0x3f, 0x2b, 0x70, 0xa7, 0x98, | 	0x3e, 0x3c, 0x66, 0x51, 0xd0, 0xe2, 0x95, 0x44, 0xc1, 0x2b, 0xf1, 0xab, 0x02, 0xb7, 0xf2, 0x2e, | ||||||
| 	0x92, 0x89, 0x51, 0x99, 0x25, 0xc6, 0xa9, 0x24, 0xf0, 0xc9, 0x24, 0x02, 0x63, 0x7a, 0x4c, 0x0b, | 	0x69, 0x31, 0x4a, 0xb3, 0x8a, 0x71, 0x22, 0x09, 0x7c, 0x3a, 0x89, 0xc0, 0x58, 0x3d, 0xa6, 0x99, | ||||||
| 	0x73, 0x49, 0x6e, 0x15, 0x68, 0xa5, 0xaa, 0xbc, 0x56, 0xe0, 0x76, 0x56, 0xd7, 0xf5, 0x0d, 0x8b, | 	0x79, 0x49, 0x6e, 0xe4, 0x68, 0x25, 0x55, 0x79, 0xa5, 0xc0, 0xcd, 0x34, 0xae, 0xe3, 0x1b, 0x16, | ||||||
| 	0x74, 0xfa, 0xc4, 0xa7, 0x9e, 0x5d, 0x5f, 0x9c, 0xc5, 0xee, 0x44, 0xb2, 0x7b, 0x52, 0x66, 0x97, | 	0x69, 0xf7, 0x88, 0x4f, 0x3d, 0xbb, 0xb6, 0x38, 0x8b, 0xdd, 0xb1, 0x64, 0xf7, 0xb8, 0xc8, 0x2e, | ||||||
| 	0x87, 0x19, 0x27, 0x57, 0x88, 0x72, 0x6e, 0xeb, 0x69, 0xf0, 0x24, 0x8e, 0x9d, 0xf1, 0x10, 0xfa, | 	0x0b, 0x33, 0x4e, 0x2e, 0x67, 0xe5, 0xdc, 0xd6, 0x12, 0xe3, 0x71, 0x64, 0x3b, 0xe5, 0x26, 0xf4, | ||||||
| 	0x41, 0x81, 0x8d, 0xac, 0xca, 0x08, 0xad, 0x78, 0xd0, 0x0e, 0x71, 0x0d, 0xb3, 0x47, 0xec, 0x7a, | 	0x93, 0x02, 0xeb, 0x69, 0x94, 0x11, 0x5a, 0xd1, 0xa2, 0x6d, 0xe2, 0x1a, 0x66, 0x97, 0xd8, 0xb5, | ||||||
| 	0x75, 0x5b, 0xd9, 0x5d, 0x6e, 0x1f, 0x8f, 0x22, 0xf5, 0xb0, 0x3c, 0x7c, 0x29, 0x75, 0x9c, 0x41, | 	0xf2, 0x96, 0xb2, 0xb3, 0xdc, 0x3a, 0x1a, 0x0d, 0xd5, 0x83, 0xe2, 0xf2, 0x05, 0xd7, 0x71, 0x06, | ||||||
| 	0x39, 0x01, 0x67, 0x2b, 0x74, 0x28, 0x42, 0xc7, 0x22, 0x82, 0x7e, 0x53, 0x60, 0x42, 0x9d, 0xe5, | 	0x45, 0x07, 0x9c, 0xee, 0xd0, 0x81, 0x30, 0x1d, 0x09, 0x0b, 0xfa, 0x43, 0x81, 0x09, 0x71, 0x96, | ||||||
| 	0x39, 0x0e, 0x65, 0x41, 0xb6, 0x90, 0x4b, 0xb3, 0xa4, 0xea, 0x48, 0xa9, 0xce, 0xa7, 0x71, 0x2d, | 	0xe7, 0x38, 0x94, 0x05, 0xe9, 0x46, 0x2e, 0xcd, 0x2a, 0x55, 0x5b, 0x96, 0xea, 0x6c, 0x1a, 0xd7, | ||||||
| 	0x43, 0x4e, 0x27, 0x3d, 0x96, 0xc9, 0x25, 0x54, 0xcb, 0x33, 0x38, 0x12, 0x69, 0xe9, 0x42, 0x4f, | 	0x22, 0xe4, 0x74, 0xd2, 0x63, 0x9e, 0xbc, 0x84, 0x6a, 0x31, 0x83, 0x43, 0xe1, 0x96, 0x6c, 0xf4, | ||||||
| 	0x9e, 0x89, 0x4f, 0x06, 0xc4, 0xe8, 0xe5, 0x66, 0xb2, 0xfc, 0xde, 0x33, 0x29, 0x43, 0x4e, 0x9f, | 	0xe4, 0x4c, 0x7c, 0xd2, 0x27, 0x46, 0x37, 0x93, 0xc9, 0xf2, 0x7b, 0x67, 0x52, 0x84, 0x9c, 0x9e, | ||||||
| 	0xc9, 0x58, 0xe6, 0xe4, 0x99, 0x60, 0x91, 0x96, 0xce, 0xe4, 0x17, 0x05, 0xee, 0x4e, 0x93, 0xa5, | 	0xc9, 0x98, 0xe7, 0xe4, 0x4c, 0xb0, 0x70, 0x4b, 0x32, 0xf9, 0x4d, 0x81, 0xdb, 0xd3, 0xca, 0xd2, | ||||||
| 	0xf3, 0x92, 0x90, 0x7a, 0x6d, 0xd6, 0xbe, 0xfe, 0x52, 0xce, 0xe1, 0xe4, 0xdd, 0xab, 0x11, 0x83, | 	0x7e, 0x41, 0x48, 0xad, 0x32, 0x6b, 0xae, 0xbf, 0x96, 0x39, 0x1c, 0xbf, 0x7d, 0x37, 0x22, 0xb0, | ||||||
| 	0xcd, 0x5a, 0x07, 0x9e, 0x83, 0x37, 0x26, 0xab, 0xff, 0x94, 0x90, 0x29, 0x6c, 0xc5, 0xd4, 0x39, | 	0x59, 0xfb, 0xc0, 0x7d, 0xf0, 0xfa, 0xe4, 0xea, 0x3f, 0x21, 0x64, 0x0a, 0x5b, 0x91, 0x3a, 0x67, | ||||||
| 	0x5b, 0x78, 0x6f, 0xb6, 0x19, 0xd8, 0x2c, 0xad, 0xa7, 0xb0, 0x15, 0x0a, 0xc7, 0x6c, 0x7f, 0x55, | 	0x0b, 0xef, 0xcd, 0x36, 0x05, 0x9b, 0x55, 0xeb, 0x29, 0x6c, 0x45, 0x85, 0x23, 0xb6, 0xbf, 0x2b, | ||||||
| 	0x60, 0x6b, 0xbc, 0xd8, 0xa1, 0x2e, 0x75, 0x42, 0xa7, 0x63, 0x52, 0xbb, 0xbe, 0x32, 0x8b, 0xee, | 	0xb0, 0x39, 0x1e, 0xec, 0x50, 0x97, 0x3a, 0xa1, 0xd3, 0x36, 0xa9, 0x5d, 0xab, 0xce, 0xa2, 0xfb, | ||||||
| 	0x73, 0x49, 0xf7, 0x74, 0x1a, 0xdd, 0x1c, 0xda, 0x74, 0xbe, 0xf9, 0x24, 0xbc, 0x59, 0x26, 0xfc, | 	0x4c, 0xd2, 0x3d, 0x99, 0x46, 0x37, 0x83, 0x36, 0x9d, 0x6f, 0xd6, 0x09, 0x6f, 0x14, 0x09, 0x7f, | ||||||
| 	0xb9, 0x88, 0xb6, 0xa9, 0xdd, 0xfc, 0xa9, 0x02, 0x55, 0xcc, 0x4f, 0x7b, 0xb4, 0x03, 0xf3, 0xd4, | 	0x29, 0xac, 0x2d, 0x6a, 0x37, 0x7e, 0x29, 0x41, 0x19, 0xf3, 0xd3, 0x1e, 0x6d, 0xc3, 0x3c, 0xb5, | ||||||
| 	0xe6, 0xd7, 0x5a, 0xad, 0x7d, 0x67, 0x14, 0xa9, 0xff, 0x17, 0x0c, 0xb2, 0x61, 0x62, 0xac, 0x79, | 	0xf9, 0xb5, 0x56, 0x69, 0xdd, 0x1a, 0x0d, 0xd5, 0x0f, 0x05, 0x83, 0x74, 0x99, 0x08, 0x6b, 0x9e, | ||||||
| 	0x6a, 0xa3, 0xc7, 0xb0, 0x64, 0x7a, 0xae, 0xdd, 0xa1, 0x36, 0xbf, 0x8f, 0x6a, 0xed, 0x7b, 0xa3, | 	0xda, 0xe8, 0x11, 0x2c, 0x99, 0x9e, 0x6b, 0xb7, 0xa9, 0xcd, 0xef, 0xa3, 0x4a, 0xeb, 0xce, 0x68, | ||||||
| 	0x48, 0xdd, 0x12, 0xd9, 0x32, 0x90, 0x94, 0x24, 0x26, 0xae, 0xc6, 0x5f, 0xa7, 0x36, 0xfa, 0x0c, | 	0xa8, 0x6e, 0x0a, 0x6f, 0x69, 0x88, 0x43, 0x62, 0x11, 0x97, 0xa3, 0xaf, 0x13, 0x1b, 0x7d, 0x0e, | ||||||
| 	0x56, 0x2c, 0x9f, 0x18, 0x8c, 0x74, 0xe2, 0xfb, 0x99, 0xdf, 0x21, 0xb5, 0xf6, 0xfd, 0xec, 0x96, | 	0x55, 0xcb, 0x27, 0x06, 0x23, 0xed, 0xe8, 0x7e, 0xe6, 0x77, 0x48, 0xa5, 0x75, 0x2f, 0xbd, 0x25, | ||||||
| 	0xcc, 0x05, 0x13, 0x8c, 0xbc, 0x0b, 0x83, 0xb0, 0x5e, 0x50, 0x87, 0xc4, 0x58, 0xe4, 0x55, 0x9f, | 	0x33, 0xc6, 0x18, 0x23, 0xab, 0xc2, 0x20, 0xa4, 0xe7, 0xd4, 0x21, 0x11, 0x16, 0x79, 0xd9, 0xa3, | ||||||
| 	0xfa, 0x43, 0x81, 0x55, 0x29, 0x63, 0xe5, 0x82, 0x09, 0x56, 0xde, 0x85, 0x41, 0x58, 0x1c, 0xab, | 	0xfe, 0x40, 0x60, 0x95, 0x8a, 0x58, 0x19, 0x63, 0x8c, 0x95, 0x55, 0x61, 0x10, 0x12, 0xc7, 0xaa, | ||||||
| 	0x0e, 0x4b, 0x36, 0xe9, 0x11, 0x46, 0xc4, 0xc1, 0xbd, 0x8c, 0x13, 0x13, 0x3d, 0x84, 0xaa, 0xf7, | 	0xc1, 0x92, 0x4d, 0xba, 0x84, 0x11, 0x71, 0x70, 0x2f, 0xe3, 0x58, 0x44, 0x0f, 0xa0, 0xec, 0xfd, | ||||||
| 	0xbd, 0x4b, 0xfc, 0xa0, 0x5e, 0xdd, 0x5e, 0xd8, 0xad, 0xb5, 0xd5, 0x51, 0xa4, 0x7e, 0x20, 0x06, | 	0xe8, 0x12, 0x3f, 0xa8, 0x95, 0xb7, 0x16, 0x76, 0x2a, 0x2d, 0x75, 0x34, 0x54, 0x3f, 0x12, 0x0b, | ||||||
| 	0x10, 0xfe, 0x04, 0x5b, 0x5a, 0x58, 0xa6, 0xa3, 0x13, 0x00, 0x83, 0x31, 0x9f, 0x9a, 0x21, 0x23, | 	0x08, 0x7d, 0x8c, 0x2d, 0x25, 0x2c, 0xdd, 0xd1, 0x31, 0x80, 0xc1, 0x98, 0x4f, 0xcd, 0x90, 0x91, | ||||||
| 	0x01, 0x3f, 0xe3, 0x6e, 0xb4, 0x77, 0x46, 0x91, 0xfa, 0xa1, 0x5c, 0xd9, 0x34, 0x96, 0x2e, 0x63, | 	0x80, 0x9f, 0x71, 0xd7, 0x5a, 0xdb, 0xa3, 0xa1, 0x7a, 0x57, 0xee, 0x6c, 0x62, 0x4b, 0xb6, 0x31, | ||||||
| 	0xe6, 0xc1, 0xb9, 0x52, 0x74, 0x00, 0x8b, 0xae, 0xe1, 0x90, 0xa0, 0xbe, 0xcc, 0x09, 0x6c, 0x8d, | 	0xd5, 0xe0, 0x4c, 0x28, 0xda, 0x87, 0x45, 0xd7, 0x70, 0x48, 0x50, 0x5b, 0xe6, 0x04, 0x36, 0x47, | ||||||
| 	0x22, 0x75, 0x43, 0x60, 0x70, 0x77, 0x52, 0x2e, 0x0c, 0x2c, 0x72, 0x51, 0x0b, 0x2a, 0x6c, 0xd8, | 	0x43, 0x75, 0x5d, 0x60, 0x70, 0x75, 0x1c, 0x2e, 0x04, 0x2c, 0x7c, 0x51, 0x13, 0x4a, 0x6c, 0xd0, | ||||||
| 	0x17, 0xbb, 0xb9, 0x50, 0x13, 0x7b, 0xd3, 0x1a, 0x61, 0x60, 0x9e, 0xda, 0xfc, 0x1a, 0xd6, 0x0e, | 	0x13, 0xd3, 0x9c, 0x8b, 0x89, 0xb4, 0x49, 0x8c, 0x10, 0x30, 0x77, 0x6d, 0x7c, 0x0b, 0xab, 0x07, | ||||||
| 	0x93, 0x4e, 0x39, 0x76, 0x99, 0x3f, 0x44, 0x08, 0x2a, 0x31, 0x9a, 0x68, 0x0a, 0xcc, 0xbf, 0xd1, | 	0x71, 0xa7, 0x1c, 0xb9, 0xcc, 0x1f, 0x20, 0x04, 0xa5, 0x08, 0x4d, 0x34, 0x05, 0xe6, 0xdf, 0xe8, | ||||||
| 	0xc7, 0xb0, 0x48, 0xe2, 0xa0, 0x7c, 0x8b, 0xa8, 0x5a, 0xf9, 0xa9, 0xa6, 0x7d, 0x61, 0x38, 0x24, | 	0x13, 0x58, 0x24, 0x91, 0x51, 0xbe, 0x45, 0x54, 0xad, 0xf8, 0x54, 0xd3, 0xbe, 0x32, 0x1c, 0x92, | ||||||
| 	0x05, 0xc2, 0x22, 0xbb, 0xf9, 0xf7, 0x02, 0xac, 0x16, 0x02, 0xe8, 0x1b, 0xb8, 0xc9, 0x95, 0xea, | 	0x00, 0x61, 0xe1, 0xdd, 0xf8, 0x77, 0x01, 0x56, 0x72, 0x06, 0xf4, 0x1d, 0x5c, 0xe7, 0x95, 0x6a, | ||||||
| 	0xf4, 0x43, 0xb3, 0x47, 0xad, 0xce, 0x77, 0x64, 0x28, 0xbb, 0xef, 0x60, 0x14, 0xa9, 0x7a, 0x4e, | 	0xf7, 0x42, 0xb3, 0x4b, 0xad, 0xf6, 0x0f, 0x64, 0x20, 0xbb, 0x6f, 0x7f, 0x34, 0x54, 0xf5, 0x4c, | ||||||
| 	0xe2, 0x5c, 0x46, 0x41, 0xec, 0xbc, 0x1f, 0xaf, 0x71, 0xd7, 0x19, 0xf7, 0x3c, 0x23, 0x43, 0x84, | 	0x89, 0x33, 0x1e, 0xb9, 0x62, 0x67, 0xf5, 0x78, 0x95, 0xab, 0x4e, 0xb9, 0xe6, 0x29, 0x19, 0x20, | ||||||
| 	0x61, 0x55, 0x24, 0x19, 0xb6, 0xed, 0x93, 0x20, 0x90, 0xbd, 0xba, 0x37, 0x8a, 0xd4, 0xfb, 0x79, | 	0x0c, 0x2b, 0xc2, 0xc9, 0xb0, 0x6d, 0x9f, 0x04, 0x81, 0xec, 0xd5, 0xdd, 0xd1, 0x50, 0xbd, 0x97, | ||||||
| 	0x6c, 0x19, 0x2e, 0x02, 0x27, 0x4e, 0x7c, 0x83, 0xdb, 0x87, 0xc2, 0x44, 0xb7, 0xa1, 0x7a, 0x41, | 	0xc5, 0x96, 0xe6, 0x3c, 0x70, 0xac, 0xc4, 0xd7, 0xb8, 0x7c, 0x20, 0x44, 0x74, 0x13, 0xca, 0xe7, | ||||||
| 	0x68, 0xf7, 0x42, 0x3c, 0x7e, 0x2a, 0x58, 0x5a, 0xb1, 0x3f, 0x60, 0x06, 0x0b, 0x03, 0xd1, 0x84, | 	0x84, 0x76, 0xce, 0xc5, 0xe3, 0xa7, 0x84, 0xa5, 0x14, 0xe9, 0x03, 0x66, 0xb0, 0x30, 0x10, 0x4d, | ||||||
| 	0x58, 0x5a, 0xe8, 0x29, 0x40, 0xb2, 0x23, 0xa9, 0x68, 0xac, 0x5a, 0xa1, 0x05, 0xd2, 0x58, 0xb6, | 	0x88, 0xa5, 0x84, 0x9e, 0x00, 0xc4, 0x13, 0x49, 0x45, 0x63, 0x55, 0x72, 0x2d, 0x90, 0xd8, 0xd2, | ||||||
| 	0x93, 0x53, 0x0f, 0xae, 0x49, 0xe3, 0xb4, 0xb0, 0xe3, 0xaa, 0xff, 0x75, 0xc7, 0xb9, 0xc5, 0x5d, | 	0x49, 0x4e, 0x34, 0xb8, 0x22, 0x85, 0x93, 0xdc, 0xc4, 0x95, 0xdf, 0x75, 0xe2, 0xdc, 0xfc, 0x94, | ||||||
| 	0x22, 0xee, 0xda, 0xcd, 0xb1, 0x1b, 0xea, 0x45, 0xf2, 0x5c, 0x6e, 0xb7, 0x8a, 0xef, 0xd6, 0x19, | 	0x88, 0xbb, 0x76, 0x63, 0xec, 0x86, 0x7a, 0x1e, 0x3f, 0x97, 0x5b, 0xcd, 0xfc, 0xbb, 0x75, 0xc6, | ||||||
| 	0xbb, 0xe8, 0x32, 0xbe, 0x74, 0x72, 0x3b, 0xa9, 0x79, 0x0e, 0xb5, 0x78, 0x9d, 0xa7, 0x37, 0xd0, | 	0x14, 0x5d, 0x44, 0x97, 0x4e, 0x66, 0x92, 0x1a, 0x67, 0x50, 0x89, 0xf6, 0x79, 0x7a, 0x03, 0xed, | ||||||
| 	0x7e, 0xb1, 0x81, 0xee, 0x4e, 0x6e, 0x20, 0x71, 0x28, 0x25, 0xdd, 0xf3, 0xa3, 0x02, 0x90, 0x79, | 	0xe5, 0x1b, 0xe8, 0xf6, 0xe4, 0x06, 0x12, 0x87, 0x52, 0xdc, 0x3d, 0x3f, 0x2b, 0x00, 0xa9, 0x16, | ||||||
| 	0xd1, 0x23, 0xa8, 0xf6, 0x0c, 0x46, 0x82, 0xe4, 0x15, 0x7e, 0xef, 0x5d, 0x18, 0x9c, 0x09, 0x96, | 	0x3d, 0x84, 0x72, 0xd7, 0x60, 0x24, 0x88, 0x5f, 0xe1, 0x77, 0xde, 0x86, 0xc1, 0x99, 0x60, 0x19, | ||||||
| 	0x05, 0xe8, 0x09, 0x2c, 0x5d, 0xd0, 0x80, 0x79, 0x7c, 0xfc, 0x85, 0x7f, 0x57, 0x9b, 0x54, 0x34, | 	0x80, 0x1e, 0xc3, 0xd2, 0x39, 0x0d, 0x98, 0xc7, 0xd7, 0x5f, 0xf8, 0x7f, 0xb1, 0x71, 0x44, 0xe3, | ||||||
| 	0x1f, 0xc1, 0xff, 0x4a, 0x31, 0xb4, 0x96, 0x9d, 0x9a, 0xfc, 0x70, 0xcc, 0x5a, 0x64, 0x3e, 0xdf, | 	0x21, 0x7c, 0x50, 0xb0, 0xa1, 0xd5, 0xf4, 0xd4, 0xe4, 0x87, 0x63, 0xda, 0x22, 0xf3, 0xd9, 0x16, | ||||||
| 	0x22, 0x4d, 0x06, 0xb5, 0x73, 0xda, 0x75, 0x0d, 0x16, 0xfa, 0x04, 0x3d, 0x80, 0x85, 0x80, 0x76, | 	0x69, 0x30, 0xa8, 0x9c, 0xd1, 0x8e, 0x6b, 0xb0, 0xd0, 0x27, 0xe8, 0x3e, 0x2c, 0x04, 0xb4, 0x23, | ||||||
| 	0x65, 0xb7, 0x6f, 0x8c, 0x22, 0xf5, 0x96, 0xd0, 0x3a, 0xa0, 0xdd, 0x44, 0xe3, 0xf8, 0x13, 0xc7, | 	0xbb, 0x7d, 0x7d, 0x34, 0x54, 0x6f, 0x88, 0x5a, 0x07, 0xb4, 0x13, 0xd7, 0x38, 0xfa, 0xc4, 0x91, | ||||||
| 	0x59, 0xf1, 0xe2, 0xf7, 0x43, 0x93, 0x6f, 0x8f, 0xb1, 0xe3, 0x56, 0x06, 0x92, 0xa2, 0xc4, 0xc4, | 	0x57, 0xb4, 0xf9, 0xbd, 0xd0, 0xe4, 0xe3, 0x31, 0x76, 0xdc, 0x4a, 0x43, 0x1c, 0x14, 0x8b, 0xb8, | ||||||
| 	0xd5, 0x7e, 0x68, 0x3e, 0x23, 0xc3, 0xe6, 0x01, 0xac, 0x1c, 0xf3, 0xa5, 0x79, 0x1e, 0x92, 0x90, | 	0xdc, 0x0b, 0xcd, 0xa7, 0x64, 0xd0, 0xd8, 0x87, 0xea, 0x11, 0xdf, 0x9a, 0x67, 0x21, 0x09, 0xc9, | ||||||
| 	0x8c, 0x91, 0x5d, 0x87, 0xc5, 0x81, 0xd1, 0x0b, 0x09, 0x97, 0xa2, 0x86, 0x85, 0xd1, 0x3e, 0x7c, | 	0x18, 0xd9, 0x35, 0x58, 0xec, 0x1b, 0xdd, 0x90, 0xf0, 0x52, 0x54, 0xb0, 0x10, 0x1a, 0x77, 0xa1, | ||||||
| 	0x73, 0xd5, 0x50, 0xde, 0x5e, 0x35, 0x94, 0xbf, 0xae, 0x1a, 0xca, 0xe5, 0x75, 0x63, 0xee, 0xed, | 	0x2a, 0x32, 0x0c, 0xbe, 0xa0, 0x01, 0x4b, 0x9d, 0x94, 0x8c, 0x53, 0xeb, 0xe0, 0xf5, 0x65, 0x5d, | ||||||
| 	0x75, 0x63, 0xee, 0xf7, 0xeb, 0xc6, 0xdc, 0x57, 0x3b, 0x5d, 0xca, 0xb4, 0x81, 0x6d, 0x6a, 0xcc, | 	0x79, 0x73, 0x59, 0x57, 0xfe, 0xb9, 0xac, 0x2b, 0x17, 0x57, 0xf5, 0xb9, 0x37, 0x57, 0xf5, 0xb9, | ||||||
| 	0xd3, 0x63, 0xd5, 0xf6, 0xa8, 0xa7, 0xf7, 0x0c, 0xcb, 0x73, 0xa9, 0xb5, 0x6f, 0xeb, 0xaf, 0xd2, | 	0x3f, 0xaf, 0xea, 0x73, 0xdf, 0x6c, 0x77, 0x28, 0xd3, 0xfa, 0xb6, 0xa9, 0x31, 0x4f, 0x8f, 0x4a, | ||||||
| 	0xbf, 0x38, 0xb3, 0xca, 0xfb, 0xea, 0xe0, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd2, 0xef, 0x57, | 	0xbb, 0x4b, 0x3d, 0xbd, 0x6b, 0x58, 0x9e, 0x4b, 0xad, 0x3d, 0x5b, 0x7f, 0x99, 0xfc, 0xea, 0x99, | ||||||
| 	0x0f, 0xe9, 0x0d, 0x00, 0x00, | 	0x65, 0xde, 0x7c, 0xfb, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x80, 0xc8, 0x98, 0x0e, 0x0e, | ||||||
|  | 	0x00, 0x00, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *Params) Marshal() (dAtA []byte, err error) { | func (m *Params) Marshal() (dAtA []byte, err error) { | ||||||
| @ -1305,6 +1353,38 @@ func (m *ExpiryQueue) MarshalToSizedBuffer(dAtA []byte) (int, error) { | |||||||
| 	return len(dAtA) - i, nil | 	return len(dAtA) - i, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (m *RecordsList) Marshal() (dAtA []byte, err error) { | ||||||
|  | 	size := m.Size() | ||||||
|  | 	dAtA = make([]byte, size) | ||||||
|  | 	n, err := m.MarshalToSizedBuffer(dAtA[:size]) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return dAtA[:n], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *RecordsList) MarshalTo(dAtA []byte) (int, error) { | ||||||
|  | 	size := m.Size() | ||||||
|  | 	return m.MarshalToSizedBuffer(dAtA[:size]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *RecordsList) MarshalToSizedBuffer(dAtA []byte) (int, error) { | ||||||
|  | 	i := len(dAtA) | ||||||
|  | 	_ = i | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if len(m.Value) > 0 { | ||||||
|  | 		for iNdEx := len(m.Value) - 1; iNdEx >= 0; iNdEx-- { | ||||||
|  | 			i -= len(m.Value[iNdEx]) | ||||||
|  | 			copy(dAtA[i:], m.Value[iNdEx]) | ||||||
|  | 			i = encodeVarintRegistry(dAtA, i, uint64(len(m.Value[iNdEx]))) | ||||||
|  | 			i-- | ||||||
|  | 			dAtA[i] = 0xa | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return len(dAtA) - i, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func encodeVarintRegistry(dAtA []byte, offset int, v uint64) int { | func encodeVarintRegistry(dAtA []byte, offset int, v uint64) int { | ||||||
| 	offset -= sovRegistry(v) | 	offset -= sovRegistry(v) | ||||||
| 	base := offset | 	base := offset | ||||||
| @ -1535,6 +1615,21 @@ func (m *ExpiryQueue) Size() (n int) { | |||||||
| 	return n | 	return n | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (m *RecordsList) Size() (n int) { | ||||||
|  | 	if m == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if len(m.Value) > 0 { | ||||||
|  | 		for _, s := range m.Value { | ||||||
|  | 			l = len(s) | ||||||
|  | 			n += 1 + l + sovRegistry(uint64(l)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func sovRegistry(x uint64) (n int) { | func sovRegistry(x uint64) (n int) { | ||||||
| 	return (math_bits.Len64(x|1) + 6) / 7 | 	return (math_bits.Len64(x|1) + 6) / 7 | ||||||
| } | } | ||||||
| @ -3216,6 +3311,88 @@ func (m *ExpiryQueue) Unmarshal(dAtA []byte) error { | |||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | func (m *RecordsList) Unmarshal(dAtA []byte) error { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		preIndex := iNdEx | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return ErrIntOverflowRegistry | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= uint64(b&0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		fieldNum := int32(wire >> 3) | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		if wireType == 4 { | ||||||
|  | 			return fmt.Errorf("proto: RecordsList: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: RecordsList: illegal tag %d (wire type %d)", fieldNum, wire) | ||||||
|  | 		} | ||||||
|  | 		switch fieldNum { | ||||||
|  | 		case 1: | ||||||
|  | 			if wireType != 2 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) | ||||||
|  | 			} | ||||||
|  | 			var stringLen uint64 | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowRegistry | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				stringLen |= uint64(b&0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			intStringLen := int(stringLen) | ||||||
|  | 			if intStringLen < 0 { | ||||||
|  | 				return ErrInvalidLengthRegistry | ||||||
|  | 			} | ||||||
|  | 			postIndex := iNdEx + intStringLen | ||||||
|  | 			if postIndex < 0 { | ||||||
|  | 				return ErrInvalidLengthRegistry | ||||||
|  | 			} | ||||||
|  | 			if postIndex > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			m.Value = append(m.Value, string(dAtA[iNdEx:postIndex])) | ||||||
|  | 			iNdEx = postIndex | ||||||
|  | 		default: | ||||||
|  | 			iNdEx = preIndex | ||||||
|  | 			skippy, err := skipRegistry(dAtA[iNdEx:]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if (skippy < 0) || (iNdEx+skippy) < 0 { | ||||||
|  | 				return ErrInvalidLengthRegistry | ||||||
|  | 			} | ||||||
|  | 			if (iNdEx + skippy) > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			iNdEx += skippy | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if iNdEx > l { | ||||||
|  | 		return io.ErrUnexpectedEOF | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
| func skipRegistry(dAtA []byte) (n int, err error) { | func skipRegistry(dAtA []byte) (n int, err error) { | ||||||
| 	l := len(dAtA) | 	l := len(dAtA) | ||||||
| 	iNdEx := 0 | 	iNdEx := 0 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user